ZGlmZiAtLWdpdCBhL3NjcmlwdHMvTGluZGVudCBiL3NjcmlwdHMvTGluZGVudApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNGVkNzg1Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9MaW5kZW50CkBAIC0wLDAgKzEsMiBAQAorIyEvYmluL3NoCitpbmRlbnQgLWtyIC1pOCAtdHM4IC1zb2IgLWw4MCAtc3MgLW5jcyAiJEAiCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlIGIvc2NyaXB0cy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Nzc2M2VlCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9NYWtlZmlsZQpAQCAtMCwwICsxLDIyIEBACisjIyMKKyMgc2NyaXB0cyBjb250YWlucyBzb3VyY2VzIGZvciB2YXJpb3VzIGhlbHBlciBwcm9ncmFtcyB1c2VkIHRocm91Z2hvdXQKKyMgdGhlIGtlcm5lbCBmb3IgdGhlIGJ1aWxkIHByb2Nlc3MuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBrYWxsc3ltczogICAgICBGaW5kIGFsbCBzeW1ib2xzIGluIHZtbGludXgKKyMgcG5tdHRvbG9nbzogICAgQ29udmVydCBwbm0gZmlsZXMgdG8gbG9nbyBmaWxlcworIyBjb25tYWtlaGFzaDogICBDcmVhdGUgY2hhcnRhYmxlCisjIGNvbm1ha2VoYXNoOgkgQ3JlYXRlIGFycmF5cyBmb3IgaW5pdGlhbGl6aW5nIHRoZSBrZXJuZWwgY29uc29sZSB0YWJsZXMKKworaG9zdHByb2dzLSQoQ09ORklHX0tBTExTWU1TKSAgICAgKz0ga2FsbHN5bXMKK2hvc3Rwcm9ncy0kKENPTkZJR19MT0dPKSAgICAgICAgICs9IHBubXRvbG9nbworaG9zdHByb2dzLSQoQ09ORklHX1ZUKSAgICAgICAgICAgKz0gY29ubWFrZWhhc2gKK2hvc3Rwcm9ncy0kKENPTkZJR19QUk9NX0NPTlNPTEUpICs9IGNvbm1ha2VoYXNoCitob3N0cHJvZ3MtJChDT05GSUdfSUtDT05GSUcpICAgICArPSBiaW4yYworCithbHdheXMJCTo9ICQoaG9zdHByb2dzLXkpCisKK3N1YmRpci0kKENPTkZJR19NT0RWRVJTSU9OUykgKz0gZ2Vua3N5bXMKK3N1YmRpci0kKENPTkZJR19NT0RVTEVTKSAgICAgKz0gbW9kCisKKyMgTGV0IGNsZWFuIGRlc2NlbmQgaW50byBzdWJkaXJzCitzdWJkaXItCSs9IGJhc2ljIGx4ZGlhbG9nIGtjb25maWcgcGFja2FnZQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9NYWtlZmlsZS5idWlsZCBiL3NjcmlwdHMvTWFrZWZpbGUuYnVpbGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyZDUzMQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvTWFrZWZpbGUuYnVpbGQKQEAgLTAsMCArMSwzMzAgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgQnVpbGRpbmcKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3JjIDo9ICQob2JqKQorCisuUEhPTlk6IF9fYnVpbGQKK19fYnVpbGQ6CisKKyMgUmVhZCAuY29uZmlnIGlmIGl0IGV4aXN0LCBvdGhlcndpc2UgaWdub3JlCistaW5jbHVkZSAuY29uZmlnCisKK2luY2x1ZGUgJChpZiAkKHdpbGRjYXJkICQob2JqKS9LYnVpbGQpLCAkKG9iaikvS2J1aWxkLCAkKG9iaikvTWFrZWZpbGUpCisKK2luY2x1ZGUgc2NyaXB0cy9NYWtlZmlsZS5saWIKKworaWZkZWYgaG9zdC1wcm9ncworaWZuZXEgKCQoaG9zdHByb2dzLXkpLCQoaG9zdC1wcm9ncykpCiskKHdhcm5pbmcga2J1aWxkOiAkKG9iaikvTWFrZWZpbGUgLSBVc2FnZSBvZiBob3N0LXByb2dzIGlzIGRlcHJlY2F0ZWQuIFBsZWFzZSByZXBsYWNlIHdpdGggaG9zdHByb2dzLXkhKQoraG9zdHByb2dzLXkgKz0gJChob3N0LXByb2dzKQorZW5kaWYKK2VuZGlmCisKKyMgRG8gbm90IGluY2x1ZGUgaG9zdCBydWxlcyB1bmxlcyBuZWVkZWQKK2lmbmVxICgkKGhvc3Rwcm9ncy15KSQoaG9zdHByb2dzLW0pLCkKK2luY2x1ZGUgc2NyaXB0cy9NYWtlZmlsZS5ob3N0CitlbmRpZgorCitpZm5lcSAoJChLQlVJTERfU1JDKSwpCisjIENyZWF0ZSBvdXRwdXQgZGlyZWN0b3J5IGlmIG5vdCBhbHJlYWR5IHByZXNlbnQKK19kdW1teSA6PSAkKHNoZWxsIFsgLWQgJChvYmopIF0gfHwgbWtkaXIgLXAgJChvYmopKQorCisjIENyZWF0ZSBkaXJlY3RvcmllcyBmb3Igb2JqZWN0IGZpbGVzIGlmIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdAorIyBOZWVkZWQgd2hlbiBvYmoteSA6PSBkaXIvZmlsZS5vIHN5bnRheCBpcyB1c2VkCitfZHVtbXkgOj0gJChmb3JlYWNoIGQsJChvYmotZGlycyksICQoc2hlbGwgWyAtZCAkKGQpIF0gfHwgbWtkaXIgLXAgJChkKSkpCitlbmRpZgorCisKK2lmZGVmIEVYVFJBX1RBUkdFVFMKKyQod2FybmluZyBrYnVpbGQ6ICQob2JqKS9NYWtlZmlsZSAtIFVzYWdlIG9mIEVYVFJBX1RBUkdFVFMgaXMgb2Jzb2xldGUgaW4gMi42LiBQbGVhc2UgZml4ISkKK2VuZGlmCisKK2lmZGVmIGJ1aWxkLXRhcmdldHMKKyQod2FybmluZyBrYnVpbGQ6ICQob2JqKS9NYWtlZmlsZSAtIFVzYWdlIG9mIGJ1aWxkLXRhcmdldHMgaXMgb2Jzb2xldGUgaW4gMi42LiBQbGVhc2UgZml4ISkKK2VuZGlmCisKK2lmZGVmIGV4cG9ydC1vYmpzCiskKHdhcm5pbmcga2J1aWxkOiAkKG9iaikvTWFrZWZpbGUgLSBVc2FnZSBvZiBleHBvcnQtb2JqcyBpcyBvYnNvbGV0ZSBpbiAyLjYuIFBsZWFzZSBmaXghKQorZW5kaWYKKworaWZkZWYgT19UQVJHRVQKKyQod2FybmluZyBrYnVpbGQ6ICQob2JqKS9NYWtlZmlsZSAtIFVzYWdlIG9mIE9fVEFSR0VUIDo9ICQoT19UQVJHRVQpIGlzIG9ic29sZXRlIGluIDIuNi4gUGxlYXNlIGZpeCEpCitlbmRpZgorCitpZmRlZiBMX1RBUkdFVAorJChlcnJvciBrYnVpbGQ6ICQob2JqKS9NYWtlZmlsZSAtIFVzZSBvZiBMX1RBUkdFVCBpcyByZXBsYWNlZCBieSBsaWIteSBpbiAyLjYuIFBsZWFzZSBmaXghKQorZW5kaWYKKworaWZkZWYgbGlzdC1tdWx0aQorJCh3YXJuaW5nIGtidWlsZDogJChvYmopL01ha2VmaWxlIC0gbGlzdC1tdWx0aSA6PSAkKGxpc3QtbXVsdGkpIGlzIG9ic29sZXRlIGluIDIuNi4gUGxlYXNlIGZpeCEpCitlbmRpZgorCitpZm5kZWYgb2JqCiskKHdhcm5pbmcga2J1aWxkOiBNYWtlZmlsZS5idWlsZCBpcyBpbmNsdWRlZCBpbXByb3Blcmx5KQorZW5kaWYKKworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworaWZuZXEgKCQoc3RyaXAgJChsaWIteSkgJChsaWItbSkgJChsaWItbikgJChsaWItKSksKQorbGliLXRhcmdldCA6PSAkKG9iaikvbGliLmEKK2VuZGlmCisKK2lmbmVxICgkKHN0cmlwICQob2JqLXkpICQob2JqLW0pICQob2JqLW4pICQob2JqLSkgJChsaWItdGFyZ2V0KSksKQorYnVpbHRpbi10YXJnZXQgOj0gJChvYmopL2J1aWx0LWluLm8KK2VuZGlmCisKKyMgV2Uga2VlcCBhIGxpc3Qgb2YgYWxsIG1vZHVsZXMgaW4gJChNT0RWRVJESVIpCisKK19fYnVpbGQ6ICQoaWYgJChLQlVJTERfQlVJTFRJTiksJChidWlsdGluLXRhcmdldCkgJChsaWItdGFyZ2V0KSAkKGV4dHJhLXkpKSBcCisJICQoaWYgJChLQlVJTERfTU9EVUxFUyksJChvYmotbSkpIFwKKwkgJChzdWJkaXIteW0pICQoYWx3YXlzKQorCUA6CisKKyMgTGludXMnIGtlcm5lbCBzYW5pdHkgY2hlY2tpbmcgdG9vbAoraWZuZXEgKCQoS0JVSUxEX0NIRUNLU1JDKSwwKQorICBpZmVxICgkKEtCVUlMRF9DSEVDS1NSQyksMikKKyAgICBxdWlldF9jbWRfZm9yY2VfY2hlY2tzcmMgPSBDSEVDSyAgICQ8CisgICAgICAgICAgY21kX2ZvcmNlX2NoZWNrc3JjID0gJChDSEVDSykgJChDSEVDS0ZMQUdTKSAkKGNfZmxhZ3MpICQ8IDsKKyAgZWxzZQorICAgICAgcXVpZXRfY21kX2NoZWNrc3JjICAgICA9IENIRUNLICAgJDwKKyAgICAgICAgICAgIGNtZF9jaGVja3NyYyAgICAgPSAkKENIRUNLKSAkKENIRUNLRkxBR1MpICQoY19mbGFncykgJDwgOworICBlbmRpZgorZW5kaWYKKworCisjIENvbXBpbGUgQyBzb3VyY2VzICguYykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgRGVmYXVsdCBpcyBidWlsdC1pbiwgdW5sZXNzIHdlIGtub3cgb3RoZXJ3aXNlCittb2RrZXJuX2NmbGFncyA6PSAkKENGTEFHU19LRVJORUwpCitxdWlldF9tb2R0YWcgOj0gJChlbXB0eSkgICAkKGVtcHR5KQorCiskKHJlYWwtb2Jqcy1tKSAgICAgICAgOiBtb2RrZXJuX2NmbGFncyA6PSAkKENGTEFHU19NT0RVTEUpCiskKHJlYWwtb2Jqcy1tOi5vPS5pKSAgOiBtb2RrZXJuX2NmbGFncyA6PSAkKENGTEFHU19NT0RVTEUpCiskKHJlYWwtb2Jqcy1tOi5vPS5zKSAgOiBtb2RrZXJuX2NmbGFncyA6PSAkKENGTEFHU19NT0RVTEUpCiskKHJlYWwtb2Jqcy1tOi5vPS5sc3QpOiBtb2RrZXJuX2NmbGFncyA6PSAkKENGTEFHU19NT0RVTEUpCisKKyQocmVhbC1vYmpzLW0pICAgICAgICA6IHF1aWV0X21vZHRhZyA6PSBbTV0KKyQocmVhbC1vYmpzLW06Lm89LmkpICA6IHF1aWV0X21vZHRhZyA6PSBbTV0KKyQocmVhbC1vYmpzLW06Lm89LnMpICA6IHF1aWV0X21vZHRhZyA6PSBbTV0KKyQocmVhbC1vYmpzLW06Lm89LmxzdCk6IHF1aWV0X21vZHRhZyA6PSBbTV0KKworJChvYmotbSkgICAgICAgICAgICAgIDogcXVpZXRfbW9kdGFnIDo9IFtNXQorCisjIERlZmF1bHQgZm9yIG5vdCBtdWx0aS1wYXJ0IG1vZHVsZXMKK21vZG5hbWUgPSAkKCpGKQorCiskKG11bHRpLW9ianMtbSkgICAgICAgICA6IG1vZG5hbWUgPSAkKG1vZG5hbWUtbXVsdGkpCiskKG11bHRpLW9ianMtbToubz0uaSkgICA6IG1vZG5hbWUgPSAkKG1vZG5hbWUtbXVsdGkpCiskKG11bHRpLW9ianMtbToubz0ucykgICA6IG1vZG5hbWUgPSAkKG1vZG5hbWUtbXVsdGkpCiskKG11bHRpLW9ianMtbToubz0ubHN0KSA6IG1vZG5hbWUgPSAkKG1vZG5hbWUtbXVsdGkpCiskKG11bHRpLW9ianMteSkgICAgICAgICA6IG1vZG5hbWUgPSAkKG1vZG5hbWUtbXVsdGkpCiskKG11bHRpLW9ianMteToubz0uaSkgICA6IG1vZG5hbWUgPSAkKG1vZG5hbWUtbXVsdGkpCiskKG11bHRpLW9ianMteToubz0ucykgICA6IG1vZG5hbWUgPSAkKG1vZG5hbWUtbXVsdGkpCiskKG11bHRpLW9ianMteToubz0ubHN0KSA6IG1vZG5hbWUgPSAkKG1vZG5hbWUtbXVsdGkpCisKK3F1aWV0X2NtZF9jY19zX2MgPSBDQyAkKHF1aWV0X21vZHRhZykgICRACitjbWRfY2Nfc19jICAgICAgID0gJChDQykgJChjX2ZsYWdzKSAtUyAtbyAkQCAkPCAKKworJS5zOiAlLmMgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsY2Nfc19jKQorCitxdWlldF9jbWRfY2NfaV9jID0gQ1BQICQocXVpZXRfbW9kdGFnKSAkQAorY21kX2NjX2lfYyAgICAgICA9ICQoQ1BQKSAkKGNfZmxhZ3MpICAgLW8gJEAgJDwKKworJS5pOiAlLmMgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsY2NfaV9jKQorCisjIEMgKC5jKSBmaWxlcworIyBUaGUgQyBmaWxlIGlzIGNvbXBpbGVkIGFuZCB1cGRhdGVkIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gaXMgZ2VuZXJhdGVkLgorIyAoU2VlIGNtZF9jY19vX2MgKyByZWxldmFudCBwYXJ0IG9mIHJ1bGVfY2Nfb19jKQorCitxdWlldF9jbWRfY2Nfb19jID0gQ0MgJChxdWlldF9tb2R0YWcpICAkQAorCitpZm5kZWYgQ09ORklHX01PRFZFUlNJT05TCitjbWRfY2Nfb19jID0gJChDQykgJChjX2ZsYWdzKSAtYyAtbyAkQCAkPAorCitlbHNlCisjIFdoZW4gbW9kdWxlIHZlcnNpb25pbmcgaXMgZW5hYmxlZCB0aGUgZm9sbG93aW5nIHN0ZXBzIGFyZSBleGVjdXRlZDoKKyMgbyBjb21waWxlIGEgLnRtcF88ZmlsZT4ubyBmcm9tIDxmaWxlPi5jCisjIG8gaWYgLnRtcF88ZmlsZT4ubyBkb2Vzbid0IGNvbnRhaW4gYSBfX2tzeW10YWIgdmVyc2lvbiwgaS5lLiBkb2VzCisjICAgbm90IGV4cG9ydCBzeW1ib2xzLCB3ZSBqdXN0IHJlbmFtZSAudG1wXzxmaWxlPi5vIHRvIDxmaWxlPi5vIGFuZAorIyAgIGFyZSBkb25lLgorIyBvIG90aGVyd2lzZSwgd2UgY2FsY3VsYXRlIHN5bWJvbCB2ZXJzaW9ucyB1c2luZyB0aGUgZ29vZCBvbGQKKyMgICBnZW5rc3ltcyBvbiB0aGUgcHJlcHJvY2Vzc2VkIHNvdXJjZSBhbmQgcG9zdHByb2Nlc3MgdGhlbSBpbiBhIHdheQorIyAgIHRoYXQgdGhleSBhcmUgdXNhYmxlIGFzIGEgbGlua2VyIHNjcmlwdAorIyBvIGdlbmVyYXRlIDxmaWxlPi5vIGZyb20gLnRtcF88ZmlsZT4ubyB1c2luZyB0aGUgbGlua2VyIHRvCisjICAgcmVwbGFjZSB0aGUgdW5yZXNvbHZlZCBzeW1ib2xzIF9fY3JjX2V4cG9ydGVkX3N5bWJvbCB3aXRoCisjICAgdGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgY2hlY2tzdW0gZ2VuZXJhdGVkIGJ5IGdlbmtzeW1zCisKK2NtZF9jY19vX2MgPSAkKENDKSAkKGNfZmxhZ3MpIC1jIC1vICQoQEQpLy50bXBfJChARikgJDwKK2NtZF9tb2R2ZXJzaW9ucyA9CQkJCQkJCVwKKwlpZiAkKE9CSkRVTVApIC1oICQoQEQpLy50bXBfJChARikgfCBncmVwIC1xIF9fa3N5bXRhYjsgdGhlbglcCisJCSQoQ1BQKSAtRF9fR0VOS1NZTVNfXyAkKGNfZmxhZ3MpICQ8CQkJXAorCQl8ICQoR0VOS1NZTVMpCQkJCQkJXAorCQk+ICQoQEQpLy50bXBfJChARjoubz0udmVyKTsJCQkJXAorCQkJCQkJCQkJXAorCQkkKExEKSAkKExERkxBR1MpIC1yIC1vICRAICQoQEQpLy50bXBfJChARikgCQlcCisJCQktVCAkKEBEKS8udG1wXyQoQEY6Lm89LnZlcik7CQkJXAorCQlybSAtZiAkKEBEKS8udG1wXyQoQEYpICQoQEQpLy50bXBfJChARjoubz0udmVyKTsJXAorCWVsc2UJCQkJCQkJCVwKKwkJbXYgJChARCkvLnRtcF8kKEBGKSAkQDsJCQkJCVwKKwlmaTsKK2VuZGlmCisKK2RlZmluZSBydWxlX2NjX29fYworCSQoaWYgJCgkKHF1aWV0KWNtZF9jaGVja3NyYyksZWNobyAnICAkKCQocXVpZXQpY21kX2NoZWNrc3JjKSc7KSAgIFwKKwkkKGNtZF9jaGVja3NyYykJCQkJCQkJICBcCisJJChpZiAkKCQocXVpZXQpY21kX2NjX29fYyksZWNobyAnICAkKCQocXVpZXQpY21kX2NjX29fYyknOykJICBcCisJJChjbWRfY2Nfb19jKTsJCQkJCQkJICBcCisJJChjbWRfbW9kdmVyc2lvbnMpCQkJCQkJICBcCisJc2NyaXB0cy9iYXNpYy9maXhkZXAgJChkZXBmaWxlKSAkQCAnJChjbWRfY2Nfb19jKScgPiAkKEBEKS8uJChARikudG1wOyAgXAorCXJtIC1mICQoZGVwZmlsZSk7CQkJCQkJICBcCisJbXYgLWYgJChARCkvLiQoQEYpLnRtcCAkKEBEKS8uJChARikuY21kCitlbmRlZgorCisjIEJ1aWx0LWluIGFuZCBjb21wb3NpdGUgbW9kdWxlIHBhcnRzCisKKyUubzogJS5jIEZPUkNFCisJJChjYWxsIGNtZCxmb3JjZV9jaGVja3NyYykKKwkkKGNhbGwgaWZfY2hhbmdlZF9ydWxlLGNjX29fYykKKworIyBTaW5nbGUtcGFydCBtb2R1bGVzIGFyZSBzcGVjaWFsIHNpbmNlIHdlIG5lZWQgdG8gbWFyayB0aGVtIGluICQoTU9EVkVSRElSKQorCiskKHNpbmdsZS11c2VkLW0pOiAlLm86ICUuYyBGT1JDRQorCSQoY2FsbCBjbWQsZm9yY2VfY2hlY2tzcmMpCisJJChjYWxsIGlmX2NoYW5nZWRfcnVsZSxjY19vX2MpCisJQHsgZWNobyAkKEA6Lm89LmtvKTsgZWNobyAkQDsgfSA+ICQoTU9EVkVSRElSKS8kKEBGOi5vPS5tb2QpCisKK3F1aWV0X2NtZF9jY19sc3RfYyA9IE1LTFNUICAgJEAKKyAgICAgIGNtZF9jY19sc3RfYyA9ICQoQ0MpICQoY19mbGFncykgLWcgLWMgLW8gJCoubyAkPCAmJiBcCisJCSAgICAgJChDT05GSUdfU0hFTEwpICQoc3JjdHJlZSkvc2NyaXB0cy9tYWtlbHN0ICQqLm8gXAorCQkJCSAgICAgU3lzdGVtLm1hcCAkKE9CSkRVTVApID4gJEAKKworJS5sc3Q6ICUuYyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxjY19sc3RfYykKKworIyBDb21waWxlIGFzc2VtYmxlciBzb3VyY2VzICguUykKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK21vZGtlcm5fYWZsYWdzIDo9ICQoQUZMQUdTX0tFUk5FTCkKKworJChyZWFsLW9ianMtbSkgICAgICA6IG1vZGtlcm5fYWZsYWdzIDo9ICQoQUZMQUdTX01PRFVMRSkKKyQocmVhbC1vYmpzLW06Lm89LnMpOiBtb2RrZXJuX2FmbGFncyA6PSAkKEFGTEFHU19NT0RVTEUpCisKK3F1aWV0X2NtZF9hc19zX1MgPSBDUFAgJChxdWlldF9tb2R0YWcpICRACitjbWRfYXNfc19TICAgICAgID0gJChDUFApICQoYV9mbGFncykgICAtbyAkQCAkPCAKKworJS5zOiAlLlMgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsYXNfc19TKQorCitxdWlldF9jbWRfYXNfb19TID0gQVMgJChxdWlldF9tb2R0YWcpICAkQAorY21kX2FzX29fUyAgICAgICA9ICQoQ0MpICQoYV9mbGFncykgLWMgLW8gJEAgJDwKKworJS5vOiAlLlMgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsYXNfb19TKQorCit0YXJnZXRzICs9ICQocmVhbC1vYmpzLXkpICQocmVhbC1vYmpzLW0pICQobGliLXkpCit0YXJnZXRzICs9ICQoZXh0cmEteSkgJChNQUtFQ01ER09BTFMpICQoYWx3YXlzKQorCisjIExpbmtlciBzY3JpcHRzIHByZXByb2Nlc3NvciAoLmxkcy5TIC0+IC5sZHMpCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorcXVpZXRfY21kX2NwcF9sZHNfUyA9IExEUyAgICAgJEAKKyAgICAgIGNtZF9jcHBfbGRzX1MgPSAkKENQUCkgJChjcHBfZmxhZ3MpIC1EX19BU1NFTUJMWV9fIC1vICRAICQ8CisKKyUubGRzOiAlLmxkcy5TIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWRfZGVwLGNwcF9sZHNfUykKKworIyBCdWlsZCB0aGUgY29tcGlsZWQtaW4gdGFyZ2V0cworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUbyBidWlsZCBvYmplY3RzIGluIHN1YmRpcnMsIHdlIG5lZWQgdG8gZGVzY2VuZCBpbnRvIHRoZSBkaXJlY3RvcmllcworJChzb3J0ICQoc3ViZGlyLW9iai15KSk6ICQoc3ViZGlyLXltKSA7CisKKyMKKyMgUnVsZSB0byBjb21waWxlIGEgc2V0IG9mIC5vIGZpbGVzIGludG8gb25lIC5vIGZpbGUKKyMKK2lmZGVmIGJ1aWx0aW4tdGFyZ2V0CitxdWlldF9jbWRfbGlua19vX3RhcmdldCA9IExEICAgICAgJEAKKyMgSWYgdGhlIGxpc3Qgb2Ygb2JqZWN0cyB0byBsaW5rIGlzIGVtcHR5LCBqdXN0IGNyZWF0ZSBhbiBlbXB0eSBidWlsdC1pbi5vCitjbWRfbGlua19vX3RhcmdldCA9ICQoaWYgJChzdHJpcCAkKG9iai15KSksXAorCQkgICAgICAkKExEKSAkKGxkX2ZsYWdzKSAtciAtbyAkQCAkKGZpbHRlciAkKG9iai15KSwgJF4pLFwKKwkJICAgICAgcm0gLWYgJEA7ICQoQVIpIHJjcyAkQCkKKworJChidWlsdGluLXRhcmdldCk6ICQob2JqLXkpIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsbGlua19vX3RhcmdldCkKKwordGFyZ2V0cyArPSAkKGJ1aWx0aW4tdGFyZ2V0KQorZW5kaWYgIyBidWlsdGluLXRhcmdldAorCisjCisjIFJ1bGUgdG8gY29tcGlsZSBhIHNldCBvZiAubyBmaWxlcyBpbnRvIG9uZSAuYSBmaWxlCisjCitpZmRlZiBsaWItdGFyZ2V0CitxdWlldF9jbWRfbGlua19sX3RhcmdldCA9IEFSICAgICAgJEAKK2NtZF9saW5rX2xfdGFyZ2V0ID0gcm0gLWYgJEA7ICQoQVIpICQoRVhUUkFfQVJGTEFHUykgcmNzICRAICQobGliLXkpCisKKyQobGliLXRhcmdldCk6ICQobGliLXkpIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsbGlua19sX3RhcmdldCkKKwordGFyZ2V0cyArPSAkKGxpYi10YXJnZXQpCitlbmRpZgorCisjCisjIFJ1bGUgdG8gbGluayBjb21wb3NpdGUgb2JqZWN0cworIworIyAgQ29tcG9zaXRlIG9iamVjdHMgYXJlIHNwZWNpZmllZCBpbiBrYnVpbGQgbWFrZWZpbGUgYXMgZm9sbG93czoKKyMgICAgPGNvbXBvc2l0ZS1vYmplY3Q+LW9ianMgOj0gPGxpc3Qgb2YgLm8gZmlsZXM+CisjICBvcgorIyAgICA8Y29tcG9zaXRlLW9iamVjdD4teSAgICA6PSA8bGlzdCBvZiAubyBmaWxlcz4KK2xpbmtfbXVsdGlfZGVwcyA9ICAgICAgICAgICAgICAgICAgICAgXAorJChmaWx0ZXIgJChhZGRwcmVmaXggJChvYmopLywgICAgICAgICBcCiskKCQoc3Vic3QgJChvYmopLywsJChAOi5vPS1vYmpzKSkpICAgIFwKKyQoJChzdWJzdCAkKG9iaikvLCwkKEA6Lm89LXkpKSkpLCAkXikKKyAKK3F1aWV0X2NtZF9saW5rX211bHRpLXkgPSBMRCAgICAgICRACitjbWRfbGlua19tdWx0aS15ID0gJChMRCkgJChsZF9mbGFncykgLXIgLW8gJEAgJChsaW5rX211bHRpX2RlcHMpCisKK3F1aWV0X2NtZF9saW5rX211bHRpLW0gPSBMRCBbTV0gICRACitjbWRfbGlua19tdWx0aS1tID0gJChMRCkgJChsZF9mbGFncykgJChMREZMQUdTX01PRFVMRSkgLW8gJEAgJChsaW5rX211bHRpX2RlcHMpCisKKyMgV2Ugd291bGQgcmF0aGVyIGhhdmUgYSBsaXN0IG9mIHJ1bGVzIGxpa2UKKyMgCWZvby5vOiAkKGZvby1vYmpzKQorIyBidXQgdGhhdCdzIG5vdCBzbyBlYXN5LCBzbyB3ZSByYXRoZXIgbWFrZSBhbGwgY29tcG9zaXRlIG9iamVjdHMgZGVwZW5kCisjIG9uIHRoZSBzZXQgb2YgYWxsIHRoZWlyIHBhcnRzCiskKG11bHRpLXVzZWQteSkgOiAlLm86ICQobXVsdGktb2Jqcy15KSBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGxpbmtfbXVsdGkteSkKKworJChtdWx0aS11c2VkLW0pIDogJS5vOiAkKG11bHRpLW9ianMtbSkgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxsaW5rX211bHRpLW0pCisJQHsgZWNobyAkKEA6Lm89LmtvKTsgZWNobyAkKGxpbmtfbXVsdGlfZGVwcyk7IH0gPiAkKE1PRFZFUkRJUikvJChARjoubz0ubW9kKQorCit0YXJnZXRzICs9ICQobXVsdGktdXNlZC15KSAkKG11bHRpLXVzZWQtbSkKKworCisjIERlc2NlbmRpbmcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy5QSE9OWTogJChzdWJkaXIteW0pCiskKHN1YmRpci15bSk6CisJJChRKSQoTUFLRSkgJChidWlsZCk9JEAKKworIyBBZGQgRk9SQ0UgdG8gdGhlIHByZXF1aXNpdGVzIG9mIGEgdGFyZ2V0IHRvIGZvcmNlIGl0IHRvIGJlIGFsd2F5cyByZWJ1aWx0LgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLlBIT05ZOiBGT1JDRQorCitGT1JDRToKKworIyBSZWFkIGFsbCBzYXZlZCBjb21tYW5kIGxpbmVzIGFuZCBkZXBlbmRlbmNpZXMgZm9yIHRoZSAkKHRhcmdldHMpIHdlCisjIG1heSBiZSBidWlsZGluZyBhYm92ZSwgdXNpbmcgJChpZl9jaGFuZ2VkeyxfZGVwfSkuIEFzIGFuCisjIG9wdGltaXphdGlvbiwgd2UgZG9uJ3QgbmVlZCB0byByZWFkIHRoZW0gaWYgdGhlIHRhcmdldCBkb2VzIG5vdAorIyBleGlzdCwgd2Ugd2lsbCByZWJ1aWxkIGFueXdheSBpbiB0aGF0IGNhc2UuCisKK3RhcmdldHMgOj0gJCh3aWxkY2FyZCAkKHNvcnQgJCh0YXJnZXRzKSkpCitjbWRfZmlsZXMgOj0gJCh3aWxkY2FyZCAkKGZvcmVhY2ggZiwkKHRhcmdldHMpLCQoZGlyICQoZikpLiQobm90ZGlyICQoZikpLmNtZCkpCisKK2lmbmVxICgkKGNtZF9maWxlcyksKQorICBpbmNsdWRlICQoY21kX2ZpbGVzKQorZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvTWFrZWZpbGUuY2xlYW4gYi9zY3JpcHRzL01ha2VmaWxlLmNsZWFuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmM2U4N2QKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL01ha2VmaWxlLmNsZWFuCkBAIC0wLDAgKzEsOTQgQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgQ2xlYW5pbmcgdXAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworc3JjIDo9ICQob2JqKQorCisuUEhPTlk6IF9fY2xlYW4KK19fY2xlYW46CisKK2luY2x1ZGUgJChpZiAkKHdpbGRjYXJkICQob2JqKS9LYnVpbGQpLCAkKG9iaikvS2J1aWxkLCAkKG9iaikvTWFrZWZpbGUpCisKKyMgRmlndXJlIG91dCB3aGF0IHdlIG5lZWQgdG8gYnVpbGQgZnJvbSB0aGUgdmFyaW91cyB2YXJpYWJsZXMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworX19zdWJkaXIteQk6PSAkKHBhdHN1YnN0ICUvLCUsJChmaWx0ZXIgJS8sICQob2JqLXkpKSkKK3N1YmRpci15CSs9ICQoX19zdWJkaXIteSkKK19fc3ViZGlyLW0JOj0gJChwYXRzdWJzdCAlLywlLCQoZmlsdGVyICUvLCAkKG9iai1tKSkpCitzdWJkaXItbQkrPSAkKF9fc3ViZGlyLW0pCitfX3N1YmRpci1uCTo9ICQocGF0c3Vic3QgJS8sJSwkKGZpbHRlciAlLywgJChvYmotbikpKQorc3ViZGlyLW4JKz0gJChfX3N1YmRpci1uKQorX19zdWJkaXItCTo9ICQocGF0c3Vic3QgJS8sJSwkKGZpbHRlciAlLywgJChvYmotKSkpCitzdWJkaXItCQkrPSAkKF9fc3ViZGlyLSkKKworIyBTdWJkaXJlY3RvcmllcyB3ZSBuZWVkIHRvIGRlc2NlbmQgaW50bworCitzdWJkaXIteW0JOj0gJChzb3J0ICQoc3ViZGlyLXkpICQoc3ViZGlyLW0pKQorc3ViZGlyLXltbiAgICAgIDo9ICQoc29ydCAkKHN1YmRpci15bSkgJChzdWJkaXItbikgJChzdWJkaXItKSkKKworIyBBZGQgc3ViZGlyIHBhdGgKKworc3ViZGlyLXltbgk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoc3ViZGlyLXltbikpCisKKyMgYnVpbGQgYSBsaXN0IG9mIGZpbGVzIHRvIHJlbW92ZSwgdXN1YWxseSByZWxlYXRpdmUgdG8gdGhlIGN1cnJlbnQKKyMgZGlyZWN0b3J5CisKK19fY2xlYW4tZmlsZXMJOj0gJChleHRyYS15KSAkKEVYVFJBX1RBUkdFVFMpICQoYWx3YXlzKSBcCisJCSAgICQodGFyZ2V0cykgJChjbGVhbi1maWxlcykgICAgICAgICAgICAgXAorCQkgICAkKGhvc3QtcHJvZ3MpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkJICAgJChob3N0cHJvZ3MteSkgJChob3N0cHJvZ3MtbSkgJChob3N0cHJvZ3MtKQorCisjIGFzIGNsZWFuLWZpbGVzIGlzIGdpdmVuIHJlbGF0aXZlIHRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeSwgdGhpcyBhZGRzCisjIGEgJChvYmopIHByZWZpeCwgZXhjZXB0IGZvciBhYnNvbHV0ZSBwYXRocworCitfX2NsZWFuLWZpbGVzICAgOj0gJCh3aWxkY2FyZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICQoYWRkcHJlZml4ICQob2JqKS8sICQoZmlsdGVyLW91dCAvJSwgJChfX2NsZWFuLWZpbGVzKSkpIFwKKwkJICAgJChmaWx0ZXIgLyUsICQoX19jbGVhbi1maWxlcykpKQorCisjIGFzIGNsZWFuLWRpcnMgaXMgZ2l2ZW4gcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCB0aGlzIGFkZHMKKyMgYSAkKG9iaikgcHJlZml4LCBleGNlcHQgZm9yIGFic29sdXRlIHBhdGhzCisKK19fY2xlYW4tZGlycyAgICA6PSAkKHdpbGRjYXJkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgJChhZGRwcmVmaXggJChvYmopLywgJChmaWx0ZXItb3V0IC8lLCAkKGNsZWFuLWRpcnMpKSkgICAgXAorCQkgICAkKGZpbHRlciAvJSwgJChjbGVhbi1kaXJzKSkpCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworcXVpZXRfY21kX2NsZWFuICAgID0gQ0xFQU4gICAkKG9iaikKKyAgICAgIGNtZF9jbGVhbiAgICA9IHJtIC1mICQoX19jbGVhbi1maWxlcykKK3F1aWV0X2NtZF9jbGVhbmRpciA9IENMRUFOICAgJChfX2NsZWFuLWRpcnMpCisgICAgICBjbWRfY2xlYW5kaXIgPSBybSAtcmYgJChfX2NsZWFuLWRpcnMpCisKKworX19jbGVhbjogJChzdWJkaXIteW1uKQoraWZuZXEgKCQoc3RyaXAgJChfX2NsZWFuLWZpbGVzKSksKQorCSskKGNhbGwgY21kLGNsZWFuKQorZW5kaWYKK2lmbmVxICgkKHN0cmlwICQoX19jbGVhbi1kaXJzKSksKQorCSskKGNhbGwgY21kLGNsZWFuZGlyKQorZW5kaWYKK2lmbmVxICgkKHN0cmlwICQoY2xlYW4tcnVsZSkpLCkKKwkrJChjbGVhbi1ydWxlKQorZW5kaWYKKwlAOgorCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEdlbmVyaWMgc3R1ZmYKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyMgRGVzY2VuZGluZworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLlBIT05ZOiAkKHN1YmRpci15bW4pCiskKHN1YmRpci15bW4pOgorCSQoUSkkKE1BS0UpICQoY2xlYW4pPSRACisKKyMgSWYgcXVpZXQgaXMgc2V0LCBvbmx5IHByaW50IHNob3J0IHZlcnNpb24gb2YgY29tbWFuZAorCitjbWQgPSBAJChpZiAkKCQocXVpZXQpY21kXyQoMSkpLGVjaG8gJyAgJCgkKHF1aWV0KWNtZF8kKDEpKScgJiYpICQoY21kXyQoMSkpCisKKyMgU2hvcnRoYW5kIGZvciAkKFEpJChNQUtFKSBzY3JpcHRzL01ha2VmaWxlLmNsZWFuIG9iaj1kaXIKKyMgVXNhZ2U6CisjICQoUSkkKE1BS0UpICQoY2xlYW4pPWRpcgorY2xlYW4gOj0gLWYgJChpZiAkKEtCVUlMRF9TUkMpLCQoc3JjdHJlZSkvKXNjcmlwdHMvTWFrZWZpbGUuY2xlYW4gb2JqCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLmhvc3QgYi9zY3JpcHRzL01ha2VmaWxlLmhvc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgyMWEyYgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvTWFrZWZpbGUuaG9zdApAQCAtMCwwICsxLDE1NSBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBCdWlsZGluZyBiaW5hcmllcyBvbiB0aGUgaG9zdCBzeXN0ZW0KKyMgQmluYXJpZXMgYXJlIHVzZWQgZHVyaW5nIHRoZSBjb21waWxhdGlvbiBvZiB0aGUga2VybmVsLCBmb3IgZXhhbXBsZQorIyB0byBwcmVwcm9jZXNzIGEgZGF0YSBmaWxlLgorIworIyBCb3RoIEMgYW5kIEMrKyBpcyBzdXBwb3J0ZWQsIGJ1dCBwcmVmZXJyZWQgbGFuZ3VhZ2UgaXMgQyBmb3Igc3VjaCB1dGlsaXRpZXMuCisjCisjIFNhbWxlIHN5bnRheCAoc2VlIERvY3VtZW50YXRpb24va2J1aWxkL21ha2VmaWxlLnR4dCBmb3IgcmVmZXJlbmNlKQorIyBob3N0cHJvZ3MteSA6PSBiaW4yaGV4CisjIFdpbGwgY29tcGlsZSBiaW4yaGV4LmMgYW5kIGNyZWF0ZSBhbiBleGVjdXRhYmxlIG5hbWVkIGJpbjJoZXgKKyMKKyMgaG9zdHByb2dzLXkgICAgOj0gbHhkaWFsb2cKKyMgbHhkaWFsb2ctb2JqcyA6PSBjaGVja2xpc3QubyBseGRpYWxvZy5vCisjIFdpbGwgY29tcGlsZSBseGRpYWxvZy5jIGFuZCBjaGVja2xpc3QuYywgYW5kIHRoZW4gbGluayB0aGUgZXhlY3V0YWJsZQorIyBseGRpYWxvZywgYmFzZWQgb24gY2hlY2tsaXN0Lm8gYW5kIGx4ZGlhbG9nLm8KKyMKKyMgaG9zdHByb2dzLXkgICAgICA6PSBxY29uZgorIyBxY29uZi1jeHhvYmpzICAgOj0gcWNvbmYubworIyBxY29uZi1vYmpzICAgICAgOj0gbWVudS5vCisjIFdpbGwgY29tcGlsZSBxY29uZiBhcyBhIEMrKyBwcm9ncmFtLCBhbmQgbWVudSBhcyBhIEMgcHJvZ3JhbS4KKyMgVGhleSBhcmUgbGlua2VkIGFzIEMrKyBjb2RlIHRvIHRoZSBleGVjdXRhYmxlIHFjb25mCisKKyMgaG9zdHByb2dzLXkgOj0gY29uZgorIyBjb25mLW9ianMgIDo9IGNvbmYubyBsaWJrY29uZmlnLnNvCisjIGxpYmtjb25maWctb2JqcyA6PSBleHByLm8gdHlwZS5vCisjIFdpbGwgY3JlYXRlIGEgc2hhcmVkIGxpYnJhcnkgbmFtZWQgbGlia2NvbmZpZy5zbyB0aGF0IGNvbnNpc3Qgb2YKKyMgZXhwci5vIGFuZCB0eXBlLm8gKHRoZXkgYXJlIGJvdGggY29tcGlsZWQgYXMgQyBjb2RlIGFuZCB0aGUgb2JqZWN0IGZpbGUKKyMgYXJlIG1hZGUgYXMgcG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZSkuCisjIGNvbmYuYyBpcyBjb21waWxlZCBhcyBhIGMgcHJvZ3JhbSwgYW5kIGNvbmYubyBpcyBsaW5rZWQgdG9nZXRoZXIgd2l0aAorIyBsaWJrY29uZmlnLnNvIGFzIHRoZSBleGVjdXRhYmxlIGNvbmYuCisjIE5vdGU6IFNoYXJlZCBsaWJyYXJpZXMgY29uc2lzdGluZyBvZiBDKysgZmlsZXMgYXJlIG5vdCBzdXBwb3J0ZWQKKworX19ob3N0cHJvZ3MgOj0gJChzb3J0ICQoaG9zdHByb2dzLXkpJChob3N0cHJvZ3MtbSkpCisKKyMgaG9zdHByb2dzLXkgOj0gdG9vbHMvYnVpbGQgbWF5IGhhdmUgYmVlbiBzcGVjaWZpZWQuIFJldHJlaXZlIGRpcmVjdG9yeQorb2JqLWRpcnMgKz0gJChmb3JlYWNoIGYsJChfX2hvc3Rwcm9ncyksICQoaWYgJChkaXIgJChmKSksJChkaXIgJChmKSkpKQorb2JqLWRpcnMgOj0gJChzdHJpcCAkKHNvcnQgJChmaWx0ZXItb3V0IC4vLCQob2JqLWRpcnMpKSkpCisKKworIyBDIGNvZGUKKyMgRXhlY3V0YWJsZXMgY29tcGlsZWQgZnJvbSBhIHNpbmdsZSAuYyBmaWxlCitob3N0LWNzaW5nbGUJOj0gJChmb3JlYWNoIG0sJChfX2hvc3Rwcm9ncyksJChpZiAkKCQobSktb2JqcyksLCQobSkpKQorCisjIEMgZXhlY3V0YWJsZXMgbGlua2VkIGJhc2VkIG9uIHNldmVyYWwgLm8gZmlsZXMKK2hvc3QtY211bHRpCTo9ICQoZm9yZWFjaCBtLCQoX19ob3N0cHJvZ3MpLFwKKwkJICAgJChpZiAkKCQobSktY3h4b2JqcyksLCQoaWYgJCgkKG0pLW9ianMpLCQobSkpKSkKKworIyBPYmplY3QgKC5vKSBmaWxlcyBjb21waWxlZCBmcm9tIC5jIGZpbGVzCitob3N0LWNvYmpzCTo9ICQoc29ydCAkKGZvcmVhY2ggbSwkKF9faG9zdHByb2dzKSwkKCQobSktb2JqcykpKQorCisjIEMrKyBjb2RlCisjIEMrKyBleGVjdXRhYmxlcyBjb21waWxlZCBmcm9tIGF0IGxlYXN0IG9uIC5jYyBmaWxlCisjIGFuZCB6ZXJvIG9yIG1vcmUgLmMgZmlsZXMKK2hvc3QtY3h4bXVsdGkJOj0gJChmb3JlYWNoIG0sJChfX2hvc3Rwcm9ncyksJChpZiAkKCQobSktY3h4b2JqcyksJChtKSkpCisKKyMgQysrIE9iamVjdCAoLm8pIGZpbGVzIGNvbXBpbGVkIGZyb20gLmNjIGZpbGVzCitob3N0LWN4eG9ianMJOj0gJChzb3J0ICQoZm9yZWFjaCBtLCQoaG9zdC1jeHhtdWx0aSksJCgkKG0pLWN4eG9ianMpKSkKKworIyBTaGFyZWQgbGliYXJpZXMgKG9ubHkgLmMgc3VwcG9ydGVkKQorIyBTaGFyZWQgbGlicmFyaWVzICguc28pIC0gYWxsIC5zbyBmaWxlcyByZWZlcmVuY2VkIGluICJ4eHgtb2JqcyIKK2hvc3QtY3NobGliCTo9ICQoc29ydCAkKGZpbHRlciAlLnNvLCAkKGhvc3QtY29ianMpKSkKKyMgUmVtb3ZlIC5zbyBmaWxlcyBmcm9tICJ4eHgtb2JqcyIKK2hvc3QtY29ianMJOj0gJChmaWx0ZXItb3V0ICUuc28sJChob3N0LWNvYmpzKSkKKworI09iamVjdCAoLm8pIGZpbGVzIHVzZWQgYnkgdGhlIHNoYXJlZCBsaWJhcmllcworaG9zdC1jc2hvYmpzCTo9ICQoc29ydCAkKGZvcmVhY2ggbSwkKGhvc3QtY3NobGliKSwkKCQobTouc289LW9ianMpKSkpCisKK19faG9zdHByb2dzICAgICA6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoX19ob3N0cHJvZ3MpKQoraG9zdC1jc2luZ2xlCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChob3N0LWNzaW5nbGUpKQoraG9zdC1jbXVsdGkJOj0gJChhZGRwcmVmaXggJChvYmopLywkKGhvc3QtY211bHRpKSkKK2hvc3QtY29ianMJOj0gJChhZGRwcmVmaXggJChvYmopLywkKGhvc3QtY29ianMpKQoraG9zdC1jeHhtdWx0aQk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoaG9zdC1jeHhtdWx0aSkpCitob3N0LWN4eG9ianMJOj0gJChhZGRwcmVmaXggJChvYmopLywkKGhvc3QtY3h4b2JqcykpCitob3N0LWNzaGxpYgk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQoaG9zdC1jc2hsaWIpKQoraG9zdC1jc2hvYmpzCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChob3N0LWNzaG9ianMpKQorb2JqLWRpcnMgICAgICAgIDo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChvYmotZGlycykpCisKKyMjIyMjCisjIEhhbmRsZSBvcHRpb25zIHRvIGdjYy4gU3VwcG9ydCBidWlsZGluZyB3aXRoIHNlcGFyYXRlIG91dHB1dCBkaXJlY3RvcnkKKworX2hvc3RjX2ZsYWdzICAgPSAkKEhPU1RDRkxBR1MpICAgJChIT1NUX0VYVFJBQ0ZMQUdTKSAgICQoSE9TVENGTEFHU18kKCpGKS5vKQorX2hvc3RjeHhfZmxhZ3MgPSAkKEhPU1RDWFhGTEFHUykgJChIT1NUX0VYVFJBQ1hYRkxBR1MpICQoSE9TVENYWEZMQUdTXyQoKkYpLm8pCisKK2lmZXEgKCQoS0JVSUxEX1NSQyksKQorX19ob3N0Y19mbGFncwk9ICQoX2hvc3RjX2ZsYWdzKQorX19ob3N0Y3h4X2ZsYWdzCT0gJChfaG9zdGN4eF9mbGFncykKK2Vsc2UKK19faG9zdGNfZmxhZ3MJPSAtSSQob2JqKSAkKGNhbGwgZmxhZ3MsX2hvc3RjX2ZsYWdzKQorX19ob3N0Y3h4X2ZsYWdzCT0gLUkkKG9iaikgJChjYWxsIGZsYWdzLF9ob3N0Y3h4X2ZsYWdzKQorZW5kaWYKKworaG9zdGNfZmxhZ3MgICAgPSAtV3AsLU1ELCQoZGVwZmlsZSkgJChfX2hvc3RjX2ZsYWdzKQoraG9zdGN4eF9mbGFncyAgPSAtV3AsLU1ELCQoZGVwZmlsZSkgJChfX2hvc3RjeHhfZmxhZ3MpCisKKyMjIyMjCisjIENvbXBpbGUgcHJvZ3JhbXMgb24gdGhlIGhvc3QKKworIyBDcmVhdGUgZXhlY3V0YWJsZSBmcm9tIGEgc2luZ2xlIC5jIGZpbGUKKyMgaG9zdC1jc2luZ2xlIC0+IEV4ZWN1dGFibGUKK3F1aWV0X2NtZF9ob3N0LWNzaW5nbGUgCT0gSE9TVENDICAkQAorICAgICAgY21kX2hvc3QtY3NpbmdsZQk9ICQoSE9TVENDKSAkKGhvc3RjX2ZsYWdzKSAkKEhPU1RfTE9BRExJQkVTKSAtbyAkQCAkPAorJChob3N0LWNzaW5nbGUpOiAlOiAlLmMgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsaG9zdC1jc2luZ2xlKQorCisjIExpbmsgYW4gZXhlY3V0YWJsZSBiYXNlZCBvbiBsaXN0IG9mIC5vIGZpbGVzLCBhbGwgcGxhaW4gYworIyBob3N0LWNtdWx0aSAtPiBleGVjdXRhYmxlCitxdWlldF9jbWRfaG9zdC1jbXVsdGkJPSBIT1NUTEQgICRACisgICAgICBjbWRfaG9zdC1jbXVsdGkJPSAkKEhPU1RDQykgJChIT1NUTERGTEFHUykgLW8gJEAgXAorCQkJICAkKGFkZHByZWZpeCAkKG9iaikvLCQoJChARiktb2JqcykpIFwKKwkJCSAgJChIT1NUX0xPQURMSUJFUykgJChIT1NUTE9BRExJQkVTXyQoQEYpKQorJChob3N0LWNtdWx0aSk6ICU6ICQoaG9zdC1jb2JqcykgJChob3N0LWNzaGxpYikgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxob3N0LWNtdWx0aSkKKworIyBDcmVhdGUgLm8gZmlsZSBmcm9tIGEgc2luZ2xlIC5jIGZpbGUKKyMgaG9zdC1jb2JqcyAtPiAubworcXVpZXRfY21kX2hvc3QtY29ianMJPSBIT1NUQ0MgICRACisgICAgICBjbWRfaG9zdC1jb2Jqcwk9ICQoSE9TVENDKSAkKGhvc3RjX2ZsYWdzKSAtYyAtbyAkQCAkPAorJChob3N0LWNvYmpzKTogJS5vOiAlLmMgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsaG9zdC1jb2JqcykKKworIyBMaW5rIGFuIGV4ZWN1dGFibGUgYmFzZWQgb24gbGlzdCBvZiAubyBmaWxlcywgYSBtaXh0dXJlIG9mIC5jIGFuZCAuY2MKKyMgaG9zdC1jeHhtdWx0aSAtPiBleGVjdXRhYmxlCitxdWlldF9jbWRfaG9zdC1jeHhtdWx0aQk9IEhPU1RMRCAgJEAKKyAgICAgIGNtZF9ob3N0LWN4eG11bHRpCT0gJChIT1NUQ1hYKSAkKEhPU1RMREZMQUdTKSAtbyAkQCBcCisJCQkgICQoZm9yZWFjaCBvLG9ianMgY3h4b2JqcyxcCisJCQkgICQoYWRkcHJlZml4ICQob2JqKS8sJCgkKEBGKS0kKG8pKSkpIFwKKwkJCSAgJChIT1NUX0xPQURMSUJFUykgJChIT1NUTE9BRExJQkVTXyQoQEYpKQorJChob3N0LWN4eG11bHRpKTogJTogJChob3N0LWNvYmpzKSAkKGhvc3QtY3h4b2JqcykgJChob3N0LWNzaGxpYikgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxob3N0LWN4eG11bHRpKQorCisjIENyZWF0ZSAubyBmaWxlIGZyb20gYSBzaW5nbGUgLmNjIChDKyspIGZpbGUKK3F1aWV0X2NtZF9ob3N0LWN4eG9ianMJPSBIT1NUQ1hYICRACisgICAgICBjbWRfaG9zdC1jeHhvYmpzCT0gJChIT1NUQ1hYKSAkKGhvc3RjeHhfZmxhZ3MpIC1jIC1vICRAICQ8CiskKGhvc3QtY3h4b2Jqcyk6ICUubzogJS5jYyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkX2RlcCxob3N0LWN4eG9ianMpCisKKyMgQ29tcGlsZSAuYyBmaWxlLCBjcmVhdGUgcG9zaXRpb24gaW5kZXBlbmRlbnQgLm8gZmlsZQorIyBob3N0LWNzaG9ianMgLT4gLm8KK3F1aWV0X2NtZF9ob3N0LWNzaG9ianMJPSBIT1NUQ0MgIC1mUElDICRACisgICAgICBjbWRfaG9zdC1jc2hvYmpzCT0gJChIT1NUQ0MpICQoaG9zdGNfZmxhZ3MpIC1mUElDIC1jIC1vICRAICQ8CiskKGhvc3QtY3Nob2Jqcyk6ICUubzogJS5jIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWRfZGVwLGhvc3QtY3Nob2JqcykKKworIyBMaW5rIGEgc2hhcmVkIGxpYnJhcnksIGJhc2VkIG9uIHBvc2l0aW9uIGluZGVwZW5kZW50IC5vIGZpbGVzCisjICoubyAtPiAuc28gc2hhcmVkIGxpYnJhcnkgKGhvc3QtY3NobGliKQorcXVpZXRfY21kX2hvc3QtY3NobGliCT0gSE9TVExMRCAtc2hhcmVkICRACisgICAgICBjbWRfaG9zdC1jc2hsaWIJPSAkKEhPU1RDQykgJChIT1NUTERGTEFHUykgLXNoYXJlZCAtbyAkQCBcCisJCQkgICQoYWRkcHJlZml4ICQob2JqKS8sJCgkKEBGOi5zbz0tb2JqcykpKSBcCisJCQkgICQoSE9TVF9MT0FETElCRVMpICQoSE9TVExPQURMSUJFU18kKEBGKSkKKyQoaG9zdC1jc2hsaWIpOiAlOiAkKGhvc3QtY3Nob2JqcykgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxob3N0LWNzaGxpYikKKwordGFyZ2V0cyArPSAkKGhvc3QtY3NpbmdsZSkgICQoaG9zdC1jbXVsdGkpICQoaG9zdC1jb2JqcylcCisJICAgJChob3N0LWN4eG11bHRpKSAkKGhvc3QtY3h4b2JqcykgJChob3N0LWNzaGxpYikgJChob3N0LWNzaG9ianMpIAorCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLmxpYiBiL3NjcmlwdHMvTWFrZWZpbGUubGliCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjZjc1Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL01ha2VmaWxlLmxpYgpAQCAtMCwwICsxLDI2NyBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMga2J1aWxkOiBHZW5lcmljIGRlZmluaXRpb25zCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjIFN0YW5kYXJkIHZhcnMKKworY29tbWEgICA6PSAsCitlbXB0eSAgIDo9CitzcGFjZSAgIDo9ICQoZW1wdHkpICQoZW1wdHkpCisKKyMgQmFja3dhcmQgY29tcGF0aWJpbGl0eSAtIHRvIGJlIHJlbW92ZWQuLi4KK2V4dHJhLXkJKz0gJChFWFRSQV9UQVJHRVRTKQorIyBGaWd1cmUgb3V0IHdoYXQgd2UgbmVlZCB0byBidWlsZCBmcm9tIHRoZSB2YXJpb3VzIHZhcmlhYmxlcworIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworIyBXaGVuIGFuIG9iamVjdCBpcyBsaXN0ZWQgdG8gYmUgYnVpbHQgY29tcGlsZWQtaW4gYW5kIG1vZHVsYXIsCisjIG9ubHkgYnVpbGQgdGhlIGNvbXBpbGVkLWluIHZlcnNpb24KKworb2JqLW0gOj0gJChmaWx0ZXItb3V0ICQob2JqLXkpLCQob2JqLW0pKQorCisjIExpYnJhcmllcyBhcmUgYWx3YXlzIGNvbGxlY3RlZCBpbiBvbmUgbGliIGZpbGUuCisjIEZpbHRlciBvdXQgb2JqZWN0cyBhbHJlYWR5IGJ1aWx0LWluCisKK2xpYi15IDo9ICQoZmlsdGVyLW91dCAkKG9iai15KSwgJChzb3J0ICQobGliLXkpICQobGliLW0pKSkKKworCisjIEhhbmRsZSBvYmplY3RzIGluIHN1YmRpcnMKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIG8gaWYgd2UgZW5jb3VudGVyIGZvby8gaW4gJChvYmoteSksIHJlcGxhY2UgaXQgYnkgZm9vL2J1aWx0LWluLm8KKyMgICBhbmQgYWRkIHRoZSBkaXJlY3RvcnkgdG8gdGhlIGxpc3Qgb2YgZGlycyB0byBkZXNjZW5kIGludG86ICQoc3ViZGlyLXkpCisjIG8gaWYgd2UgZW5jb3VudGVyIGZvby8gaW4gJChvYmotbSksIHJlbW92ZSBpdCBmcm9tICQob2JqLW0pIAorIyAgIGFuZCBhZGQgdGhlIGRpcmVjdG9yeSB0byB0aGUgbGlzdCBvZiBkaXJzIHRvIGRlc2NlbmQgaW50bzogJChzdWJkaXItbSkKKworX19zdWJkaXIteQk6PSAkKHBhdHN1YnN0ICUvLCUsJChmaWx0ZXIgJS8sICQob2JqLXkpKSkKK3N1YmRpci15CSs9ICQoX19zdWJkaXIteSkKK19fc3ViZGlyLW0JOj0gJChwYXRzdWJzdCAlLywlLCQoZmlsdGVyICUvLCAkKG9iai1tKSkpCitzdWJkaXItbQkrPSAkKF9fc3ViZGlyLW0pCitvYmoteQkJOj0gJChwYXRzdWJzdCAlLywgJS9idWlsdC1pbi5vLCAkKG9iai15KSkKK29iai1tCQk6PSAkKGZpbHRlci1vdXQgJS8sICQob2JqLW0pKQorCisjIFN1YmRpcmVjdG9yaWVzIHdlIG5lZWQgdG8gZGVzY2VuZCBpbnRvCisKK3N1YmRpci15bQk6PSAkKHNvcnQgJChzdWJkaXIteSkgJChzdWJkaXItbSkpCisKKyMgaWYgJChmb28tb2JqcykgZXhpc3RzLCBmb28ubyBpcyBhIGNvbXBvc2l0ZSBvYmplY3QgCittdWx0aS11c2VkLXkgOj0gJChzb3J0ICQoZm9yZWFjaCBtLCQob2JqLXkpLCAkKGlmICQoc3RyaXAgJCgkKG06Lm89LW9ianMpKSAkKCQobToubz0teSkpKSwgJChtKSkpKQorbXVsdGktdXNlZC1tIDo9ICQoc29ydCAkKGZvcmVhY2ggbSwkKG9iai1tKSwgJChpZiAkKHN0cmlwICQoJChtOi5vPS1vYmpzKSkgJCgkKG06Lm89LXkpKSksICQobSkpKSkKK211bHRpLXVzZWQgICA6PSAkKG11bHRpLXVzZWQteSkgJChtdWx0aS11c2VkLW0pCitzaW5nbGUtdXNlZC1tIDo9ICQoc29ydCAkKGZpbHRlci1vdXQgJChtdWx0aS11c2VkLW0pLCQob2JqLW0pKSkKKworIyBCdWlsZCBsaXN0IG9mIHRoZSBwYXJ0cyBvZiBvdXIgY29tcG9zaXRlIG9iamVjdHMsIG91ciBjb21wb3NpdGUKKyMgb2JqZWN0cyBkZXBlbmQgb24gdGhvc2UgKG9idmlvdXNseSkKK211bHRpLW9ianMteSA6PSAkKGZvcmVhY2ggbSwgJChtdWx0aS11c2VkLXkpLCAkKCQobToubz0tb2JqcykpICQoJChtOi5vPS15KSkpCittdWx0aS1vYmpzLW0gOj0gJChmb3JlYWNoIG0sICQobXVsdGktdXNlZC1tKSwgJCgkKG06Lm89LW9ianMpKSAkKCQobToubz0teSkpKQorbXVsdGktb2JqcyAgIDo9ICQobXVsdGktb2Jqcy15KSAkKG11bHRpLW9ianMtbSkKKworIyAkKHN1YmRpci1vYmoteSkgaXMgdGhlIGxpc3Qgb2Ygb2JqZWN0cyBpbiAkKG9iai15KSB3aGljaCBkbyBub3QgbGl2ZQorIyBpbiB0aGUgbG9jYWwgZGlyZWN0b3J5CitzdWJkaXItb2JqLXkgOj0gJChmb3JlYWNoIG8sJChvYmoteSksJChpZiAkKGZpbHRlci1vdXQgJChvKSwkKG5vdGRpciAkKG8pKSksJChvKSkpCisKKyMgJChvYmotZGlycykgaXMgYSBsaXN0IG9mIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbiBvYmplY3QgZmlsZXMKK29iai1kaXJzIDo9ICQoZGlyICQobXVsdGktb2JqcykgJChzdWJkaXItb2JqLXkpKQorCisjIFJlcGxhY2UgbXVsdGktcGFydCBvYmplY3RzIGJ5IHRoZWlyIGluZGl2aWR1YWwgcGFydHMsIGxvb2sgYXQgbG9jYWwgZGlyIG9ubHkKK3JlYWwtb2Jqcy15IDo9ICQoZm9yZWFjaCBtLCAkKGZpbHRlci1vdXQgJChzdWJkaXItb2JqLXkpLCAkKG9iai15KSksICQoaWYgJChzdHJpcCAkKCQobToubz0tb2JqcykpICQoJChtOi5vPS15KSkpLCQoJChtOi5vPS1vYmpzKSkgJCgkKG06Lm89LXkpKSwkKG0pKSkgJChleHRyYS15KQorcmVhbC1vYmpzLW0gOj0gJChmb3JlYWNoIG0sICQob2JqLW0pLCAkKGlmICQoc3RyaXAgJCgkKG06Lm89LW9ianMpKSAkKCQobToubz0teSkpKSwkKCQobToubz0tb2JqcykpICQoJChtOi5vPS15KSksJChtKSkpCisKKyMgQWRkIHN1YmRpciBwYXRoCisKK2V4dHJhLXkJCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChleHRyYS15KSkKK2Fsd2F5cwkJOj0gJChhZGRwcmVmaXggJChvYmopLywkKGFsd2F5cykpCit0YXJnZXRzCQk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQodGFyZ2V0cykpCitvYmoteQkJOj0gJChhZGRwcmVmaXggJChvYmopLywkKG9iai15KSkKK29iai1tCQk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQob2JqLW0pKQorbGliLXkJCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChsaWIteSkpCitzdWJkaXItb2JqLXkJOj0gJChhZGRwcmVmaXggJChvYmopLywkKHN1YmRpci1vYmoteSkpCityZWFsLW9ianMteQk6PSAkKGFkZHByZWZpeCAkKG9iaikvLCQocmVhbC1vYmpzLXkpKQorcmVhbC1vYmpzLW0JOj0gJChhZGRwcmVmaXggJChvYmopLywkKHJlYWwtb2Jqcy1tKSkKK3NpbmdsZS11c2VkLW0JOj0gJChhZGRwcmVmaXggJChvYmopLywkKHNpbmdsZS11c2VkLW0pKQorbXVsdGktdXNlZC15CTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChtdWx0aS11c2VkLXkpKQorbXVsdGktdXNlZC1tCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChtdWx0aS11c2VkLW0pKQorbXVsdGktb2Jqcy15CTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChtdWx0aS1vYmpzLXkpKQorbXVsdGktb2Jqcy1tCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChtdWx0aS1vYmpzLW0pKQorc3ViZGlyLXltCTo9ICQoYWRkcHJlZml4ICQob2JqKS8sJChzdWJkaXIteW0pKQorb2JqLWRpcnMJOj0gJChhZGRwcmVmaXggJChvYmopLywkKG9iai1kaXJzKSkKKworIyBUaGUgdGVtcG9yYXJ5IGZpbGUgdG8gc2F2ZSBnY2MgLU1EIGdlbmVyYXRlZCBkZXBlbmRlbmNpZXMgbXVzdCBub3QKKyMgY29udGFpbiBhIGNvbW1hCitkZXBmaWxlID0gJChzdWJzdCAkKGNvbW1hKSxfLCQoQEQpLy4kKEBGKS5kKQorCisjIFRoZXNlIGZsYWdzIGFyZSBuZWVkZWQgZm9yIG1vZHZlcnNpb25zIGFuZCBjb21waWxpbmcsIHNvIHdlIGRlZmluZSB0aGVtIGhlcmUKKyMgYWxyZWFkeQorIyAkKG1vZG5hbWVfZmxhZ3MpICNkZWZpbmVzIEtCVUlMRF9NT0ROQU1FIGFzIHRoZSBuYW1lIG9mIHRoZSBtb2R1bGUgaXQgd2lsbCAKKyMgZW5kIHVwIGluIChvciB3b3VsZCwgaWYgaXQgZ2V0cyBjb21waWxlZCBpbikKKyMgTm90ZTogSXQncyBwb3NzaWJsZSB0aGF0IG9uZSBvYmplY3QgZ2V0cyBwb3RlbnRpYWxseSBsaW5rZWQgaW50byBtb3JlCisjICAgICAgIHRoYW4gb25lIG1vZHVsZS4gSW4gdGhhdCBjYXNlIEtCVUlMRF9NT0ROQU1FIHdpbGwgYmUgc2V0IHRvIGZvb19iYXIsCisjICAgICAgIHdoZXJlIGZvbyBhbmQgYmFyIGFyZSB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlcy4KK2Jhc2VuYW1lX2ZsYWdzID0gLURLQlVJTERfQkFTRU5BTUU9JChzdWJzdCAkKGNvbW1hKSxfLCQoc3Vic3QgLSxfLCQoKkYpKSkKK21vZG5hbWVfZmxhZ3MgID0gJChpZiAkKGZpbHRlciAxLCQod29yZHMgJChtb2RuYW1lKSkpLC1ES0JVSUxEX01PRE5BTUU9JChzdWJzdCAkKGNvbW1hKSxfLCQoc3Vic3QgLSxfLCQobW9kbmFtZSkpKSkKKworX2NfZmxhZ3MgICAgICAgPSAkKENGTEFHUykgJChFWFRSQV9DRkxBR1MpICQoQ0ZMQUdTXyQoKkYpLm8pCitfYV9mbGFncyAgICAgICA9ICQoQUZMQUdTKSAkKEVYVFJBX0FGTEFHUykgJChBRkxBR1NfJCgqRikubykKK19jcHBfZmxhZ3MgICAgID0gJChDUFBGTEFHUykgJChFWFRSQV9DUFBGTEFHUykgJChDUFBGTEFHU18kKEBGKSkKKworIyBJZiBidWlsZGluZyB0aGUga2VybmVsIGluIGEgc2VwYXJhdGUgb2JqdHJlZSBleHBhbmQgYWxsIG9jY3VycmVuY2VzCisjIG9mIC1JZGlyIHRvIC1JJChzcmN0cmVlKS9kaXIgZXhjZXB0IGZvciBhYnNvbHV0ZSBwYXRocyAoc3RhcnRpbmcgd2l0aCAnLycpLgorCitpZmVxICgkKEtCVUlMRF9TUkMpLCkKK19fY19mbGFncwk9ICQoX2NfZmxhZ3MpCitfX2FfZmxhZ3MJPSAkKF9hX2ZsYWdzKQorX19jcHBfZmxhZ3MgICAgID0gJChfY3BwX2ZsYWdzKQorZWxzZQorCisjIFByZWZpeCAtSSB3aXRoICQoc3JjdHJlZSkgaWYgaXQgaXMgbm90IGFuIGFic29sdXRlIHBhdGgKK2FkZHRyZWUgPSAkKGlmICQoZmlsdGVyLW91dCAtSS8lLCQoMSkpLCQocGF0c3Vic3QgLUklLC1JJChzcmN0cmVlKS8lLCQoMSkpKSAkKDEpCisjIEZpbmQgYWxsIC1JIG9wdGlvbnMgYW5kIGNhbGwgYWRkdHJlZQorZmxhZ3MgPSAkKGZvcmVhY2ggbywkKCQoMSkpLCQoaWYgJChmaWx0ZXIgLUklLCQobykpLCQoY2FsbCBhZGR0cmVlLCQobykpLCQobykpKQorCisjIC1JJChvYmopIGxvY2F0ZXMgZ2VuZXJhdGVkIC5oIGZpbGVzCisjICQoY2FsbCBhZGR0cmVlLC1JJChvYmopKSBsb2NhdGVzIC5oIGZpbGVzIGluIHNyY3RyZWUsIGZyb20gZ2VuZXJhdGVkIC5jIGZpbGVzCisjICAgYW5kIGxvY2F0ZXMgZ2VuZXJhdGVkIC5oIGZpbGVzCisjIEZJWE1FOiBSZXBsYWNlIGJvdGggd2l0aCBzcGVjaWZpYyBDRkxBR1MqIHN0YXRlbWVudHMgaW4gdGhlIG1ha2VmaWxlcworX19jX2ZsYWdzCT0gJChjYWxsIGFkZHRyZWUsLUkkKG9iaikpICQoY2FsbCBmbGFncyxfY19mbGFncykKK19fYV9mbGFncwk9ICAgICAgICAgICAgICAgICAgICAgICAgICAkKGNhbGwgZmxhZ3MsX2FfZmxhZ3MpCitfX2NwcF9mbGFncyAgICAgPSAgICAgICAgICAgICAgICAgICAgICAgICAgJChjYWxsIGZsYWdzLF9jcHBfZmxhZ3MpCitlbmRpZgorCitjX2ZsYWdzICAgICAgICA9IC1XcCwtTUQsJChkZXBmaWxlKSAkKE5PU1RESU5DX0ZMQUdTKSAkKENQUEZMQUdTKSBcCisJCSAkKF9fY19mbGFncykgJChtb2RrZXJuX2NmbGFncykgXAorCQkgJChiYXNlbmFtZV9mbGFncykgJChtb2RuYW1lX2ZsYWdzKQorCithX2ZsYWdzICAgICAgICA9IC1XcCwtTUQsJChkZXBmaWxlKSAkKE5PU1RESU5DX0ZMQUdTKSAkKENQUEZMQUdTKSBcCisJCSAkKF9fYV9mbGFncykgJChtb2RrZXJuX2FmbGFncykKKworY3BwX2ZsYWdzICAgICAgPSAtV3AsLU1ELCQoZGVwZmlsZSkgJChOT1NURElOQ19GTEFHUykgJChfX2NwcF9mbGFncykKKworbGRfZmxhZ3MgICAgICAgPSAkKExERkxBR1MpICQoRVhUUkFfTERGTEFHUykKKworIyBGaW5kcyB0aGUgbXVsdGktcGFydCBvYmplY3QgdGhlIGN1cnJlbnQgb2JqZWN0IHdpbGwgYmUgbGlua2VkIGludG8KK21vZG5hbWUtbXVsdGkgPSAkKHNvcnQgJChmb3JlYWNoIG0sJChtdWx0aS11c2VkKSxcCisJCSQoaWYgJChmaWx0ZXIgJChzdWJzdCAkKG9iaikvLCwkKi5vKSwgJCgkKG06Lm89LW9ianMpKSAkKCQobToubz0teSkpKSwkKG06Lm89KSkpKQorCisjIFNoaXBwZWQgZmlsZXMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3F1aWV0X2NtZF9zaGlwcGVkID0gU0hJUFBFRCAkQAorY21kX3NoaXBwZWQgPSBjYXQgJDwgPiAkQAorCiskKG9iaikvJTo6ICQoc3JjKS8lX3NoaXBwZWQKKwkkKGNhbGwgY21kLHNoaXBwZWQpCisKKyMgQ29tbWFuZHMgdXNlZnVsIGZvciBidWlsZGluZyBhIGJvb3QgaW1hZ2UKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIAorIwlVc2UgYXMgZm9sbG93aW5nOgorIworIwl0YXJnZXQ6IHNvdXJjZShzKSBGT1JDRQorIwkJJChpZl9jaGFuZ2VkLGxkL29iamNvcHkvZ3ppcCkKKyMKKyMJYW5kIGFkZCB0YXJnZXQgdG8gRVhUUkFfVEFSR0VUUyBzbyB0aGF0IHdlIGtub3cgd2UgaGF2ZSB0bworIwlyZWFkIGluIHRoZSBzYXZlZCBjb21tYW5kIGxpbmUKKworIyBMaW5raW5nCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitxdWlldF9jbWRfbGQgPSBMRCAgICAgICRACitjbWRfbGQgPSAkKExEKSAkKExERkxBR1MpICQoRVhUUkFfTERGTEFHUykgJChMREZMQUdTXyQoQEYpKSBcCisJICAgICAgICQoZmlsdGVyLW91dCBGT1JDRSwkXikgLW8gJEAgCisKKyMgT2JqY29weQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworcXVpZXRfY21kX29iamNvcHkgPSBPQkpDT1BZICRACitjbWRfb2JqY29weSA9ICQoT0JKQ09QWSkgJChPQkpDT1BZRkxBR1MpICQoT0JKQ09QWUZMQUdTXyQoQEYpKSAkPCAkQAorCisjIEd6aXAKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3F1aWV0X2NtZF9nemlwID0gR1pJUCAgICAkQAorY21kX2d6aXAgPSBnemlwIC1mIC05IDwgJDwgPiAkQAorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBHZW5lcmljIHN0dWZmCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitpZm5lcSAoJChLQlVJTERfTk9DTURERVApLDEpCisjIENoZWNrIGlmIGJvdGggYXJndW1lbnRzIGhhcyBzYW1lIGFyZ3VtZW50cy4gUmVzdWx0IGluIGVtcHR5IHN0cmluZyBpZiBlcXVhbAorIyBVc2VyIG1heSBvdmVycmlkZSB0aGlzIGNoZWNrIHVzaW5nIG1ha2UgS0JVSUxEX05PQ01EREVQPTEKK2FyZy1jaGVjayA9ICQoc3RyaXAgJChmaWx0ZXItb3V0ICQoMSksICQoMikpICQoZmlsdGVyLW91dCAkKDIpLCAkKDEpKSApCisKK2VuZGlmCisKKyMgZWNobyBjb21tYW5kLiBTaG9ydCB2ZXJzaW9uIGlzICQocXVpZXQpIGVxdWFscyBxdWlldCwgb3RoZXJ3aXNlIGZ1bGwgY29tbWFuZAorZWNoby1jbWQgPSAkKGlmICQoJChxdWlldCljbWRfJCgxKSksIFwKKwllY2hvICcgICQoc3Vic3QgJywnXCcnLCQoJChxdWlldCljbWRfJCgxKSkpJzspCisKKyMgZnVuY3Rpb24gdG8gb25seSBleGVjdXRlIHRoZSBwYXNzZWQgY29tbWFuZCBpZiBuZWNlc3NhcnkKKyMgPic8IHN1YnN0aXR1dGlvbiBpcyBmb3IgZWNobyB0byB3b3JrLCA+JDwgc3Vic3RpdHV0aW9uIHRvIHByZXNlcnZlICQgd2hlbiByZWxvYWRpbmcgLmNtZCBmaWxlCisjIG5vdGU6IHdoZW4gdXNpbmcgaW5saW5lIHBlcmwgc2NyaXB0cyBbcGVybCAtZSAnLi4uJCR0PTE7Li4uJ10gaW4gJChjbWRfeHh4KSBkb3VibGUgJCQgeW91ciBwZXJsIHZhcnMKKyMgCitpZl9jaGFuZ2VkID0gJChpZiAkKHN0cmlwICQ/ICQoY2FsbCBhcmctY2hlY2ssICQoY21kXyQoMSkpLCAkKGNtZF8kQCkpICksIFwKKwlAc2V0IC1lOyBcCisJJChlY2hvLWNtZCkgXAorCSQoY21kXyQoMSkpOyBcCisJZWNobyAnY21kXyRAIDo9ICQoc3Vic3QgJCQsJCQkJCwkKHN1YnN0ICcsJ1wnJywkKGNtZF8kKDEpKSkpJyA+ICQoQEQpLy4kKEBGKS5jbWQpCisKKworIyBleGVjdXRlIHRoZSBjb21tYW5kIGFuZCBhbHNvIHBvc3Rwcm9jZXNzIGdlbmVyYXRlZCAuZCBkZXBlbmRlbmNpZXMKKyMgZmlsZQorCitpZl9jaGFuZ2VkX2RlcCA9ICQoaWYgJChzdHJpcCAkPyAkKGZpbHRlci1vdXQgRk9SQ0UgJCh3aWxkY2FyZCAkXiksJF4pXAorCSQoY2FsbCBhcmctY2hlY2ssICQoY21kXyQoMSkpLCAkKGNtZF8kQCkpICksICAgICAgICAgICAgICAgICAgXAorCUBzZXQgLWU7IFwKKwkkKGVjaG8tY21kKSBcCisJJChjbWRfJCgxKSk7IFwKKwlzY3JpcHRzL2Jhc2ljL2ZpeGRlcCAkKGRlcGZpbGUpICRAICckKHN1YnN0ICQkLCQkJCQsJChzdWJzdCAnLCdcJycsJChjbWRfJCgxKSkpKScgPiAkKEBEKS8uJChARikudG1wOyBcCisJcm0gLWYgJChkZXBmaWxlKTsgXAorCW12IC1mICQoQEQpLy4kKEBGKS50bXAgJChARCkvLiQoQEYpLmNtZCkKKworIyBVc2FnZTogJChjYWxsIGlmX2NoYW5nZWRfcnVsZSxmb28pCisjIHdpbGwgY2hlY2sgaWYgJChjbWRfZm9vKSBjaGFuZ2VkLCBvciBhbnkgb2YgdGhlIHByZXF1aXNpdGVzIGNoYW5nZWQsCisjIGFuZCBpZiBzbyB3aWxsIGV4ZWN1dGUgJChydWxlX2ZvbykKKworaWZfY2hhbmdlZF9ydWxlID0gJChpZiAkKHN0cmlwICQ/ICQoY2FsbCBhcmctY2hlY2ssICQoY21kXyQoMSkpLCAkKGNtZF8kQCkpICksXAorCQkJQHNldCAtZTsgXAorCQkJJChydWxlXyQoMSkpKQorCisjIElmIHF1aWV0IGlzIHNldCwgb25seSBwcmludCBzaG9ydCB2ZXJzaW9uIG9mIGNvbW1hbmQKKworY21kID0gQCQoaWYgJCgkKHF1aWV0KWNtZF8kKDEpKSxlY2hvICcgICQoc3Vic3QgJywnXCcnLCQoJChxdWlldCljbWRfJCgxKSkpJyAmJikgJChjbWRfJCgxKSkKKworIwkkKGNhbGwgZGVzY2VuZCw8ZGlyPiw8dGFyZ2V0PikKKyMJUmVjdXJzaXZlbHkgY2FsbCBhIHN1Yi1tYWtlIGluIDxkaXI+IHdpdGggdGFyZ2V0IDx0YXJnZXQ+IAorIyBVc2FnZSBpcyBkZXByZWNhdGVkLCBiZWNhdXNlIG1ha2UgZG8gbm90IHNlZSB0aGlzIGFzIGFuIGludm9jYXRpb24gb2YgbWFrZS4KK2Rlc2NlbmQgPSQoUSkkKE1BS0UpIC1mICQoaWYgJChLQlVJTERfU1JDKSwkKHNyY3RyZWUpLylzY3JpcHRzL01ha2VmaWxlLmJ1aWxkIG9iaj0kKDEpICQoMikKKworIyBTaG9ydGhhbmQgZm9yICQoUSkkKE1BS0UpIC1mIHNjcmlwdHMvTWFrZWZpbGUuYnVpbGQgb2JqPQorIyBVc2FnZToKKyMgJChRKSQoTUFLRSkgJChidWlsZCk9ZGlyCitidWlsZCA6PSAtZiAkKGlmICQoS0JVSUxEX1NSQyksJChzcmN0cmVlKS8pc2NyaXB0cy9NYWtlZmlsZS5idWlsZCBvYmoKKworIyBmaWxlY2hrIGlzIHVzZWQgdG8gY2hlY2sgaWYgdGhlIGNvbnRlbnQgb2YgYSBnZW5lcmF0ZWQgZmlsZSBpcyB1cGRhdGVkLgorIyBTYW1wbGUgdXNhZ2U6CisjIGRlZmluZSBmaWxlY2hrX3NhbXBsZQorIwllY2hvICRLRVJORUxSRUxFQVNFCisjIGVuZGVmCisjIHZlcnNpb24uaCA6IE1ha2VmaWxlCisjCSQoY2FsbCBmaWxlY2hrLHNhbXBsZSkKKyMgVGhlIHJ1bGUgZGVmaW5lZCBzaGFsbCB3cml0ZSB0byBzdGRvdXQgdGhlIGNvbnRlbnQgb2YgdGhlIG5ldyBmaWxlLgorIyBUaGUgZXhpc3RpbmcgZmlsZSB3aWxsIGJlIGNvbXBhcmVkIHdpdGggdGhlIG5ldyBvbmUuCisjIC0gSWYgbm8gZmlsZSBleGlzdCBpdCBpcyBjcmVhdGVkCisjIC0gSWYgdGhlIGNvbnRlbnQgZGlmZmVyIHRoZSBuZXcgZmlsZSBpcyB1c2VkCisjIC0gSWYgdGhleSBhcmUgZXF1YWwgbm8gY2hhbmdlLCBhbmQgbm8gdGltZXN0YW1wIHVwZGF0ZQorCitkZWZpbmUgZmlsZWNoaworCSQoUSlzZXQgLWU7CQkJCVwKKwllY2hvICcgIENISyAgICAgJEAnOwkJCVwKKwlta2RpciAtcCAkKGRpciAkQCk7CQkJXAorCSQoZmlsZWNoa18kKDEpKSAkKDIpID4gJEAudG1wOwkJXAorCWlmIFsgLXIgJEAgXSAmJiBjbXAgLXMgJEAgJEAudG1wOyB0aGVuCVwKKwkJcm0gLWYgJEAudG1wOwkJCVwKKwllbHNlCQkJCQlcCisJCWVjaG8gJyAgVVBEICAgICAkQCc7CQlcCisJCW12IC1mICRALnRtcCAkQDsJCVwKKwlmaQorZW5kZWYKKwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9NYWtlZmlsZS5tb2RpbnN0IGIvc2NyaXB0cy9NYWtlZmlsZS5tb2RpbnN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZDY0OTQKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL01ha2VmaWxlLm1vZGluc3QKQEAgLTAsMCArMSwyOSBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBJbnN0YWxsaW5nIG1vZHVsZXMKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLlBIT05ZOiBfX21vZGluc3QKK19fbW9kaW5zdDoKKworaW5jbHVkZSBzY3JpcHRzL01ha2VmaWxlLmxpYgorCisjCisKK19fbW9kdWxlcyA6PSAkKHNvcnQgJChzaGVsbCBncmVwIC1oICdcLmtvJyAvZGV2L251bGwgJCh3aWxkY2FyZCAkKE1PRFZFUkRJUikvKi5tb2QpKSkKK21vZHVsZXMgOj0gJChwYXRzdWJzdCAlLm8sJS5rbywkKHdpbGRjYXJkICQoX19tb2R1bGVzOi5rbz0ubykpKQorCisuUEhPTlk6ICQobW9kdWxlcykKK19fbW9kaW5zdDogJChtb2R1bGVzKQorCUA6CisKK3F1aWV0X2NtZF9tb2R1bGVzX2luc3RhbGwgPSBJTlNUQUxMICRACisgICAgICBjbWRfbW9kdWxlc19pbnN0YWxsID0gbWtkaXIgLXAgJCgyKTsgY3AgJEAgJCgyKQorCisjIE1vZHVsZXMgYnVpbHQgb3V0c2lkZSB0aGUga2VybmVsIHNvdXJjZSB0cmVlIGdvIGludG8gZXh0cmEgYnkgZGVmYXVsdAorSU5TVEFMTF9NT0RfRElSID89IGV4dHJhCitleHQtbW9kLWRpciA9ICQoSU5TVEFMTF9NT0RfRElSKSQoc3Vic3QgJChLQlVJTERfRVhUTU9EKSwsJChARCkpCisKK21vZGluc3RfZGlyID0gJChpZiAkKEtCVUlMRF9FWFRNT0QpLCQoZXh0LW1vZC1kaXIpLGtlcm5lbC8kKEBEKSkKKworJChtb2R1bGVzKToKKwkkKGNhbGwgY21kLG1vZHVsZXNfaW5zdGFsbCwkKE1PRExJQikvJChtb2RpbnN0X2RpcikpCmRpZmYgLS1naXQgYS9zY3JpcHRzL01ha2VmaWxlLm1vZHBvc3QgYi9zY3JpcHRzL01ha2VmaWxlLm1vZHBvc3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRiNTUwZQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvTWFrZWZpbGUubW9kcG9zdApAQCAtMCwwICsxLDExMCBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgTW9kdWxlIHZlcnNpb25zCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIworIyBTdGFnZSBvbmUgb2YgbW9kdWxlIGJ1aWxkaW5nIGNyZWF0ZWQgdGhlIGZvbGxvd2luZzoKKyMgYSkgVGhlIGluZGl2aWR1YWwgLm8gZmlsZXMgdXNlZCBmb3IgdGhlIG1vZHVsZQorIyBiKSBBIDxtb2R1bGU+Lm8gZmlsZSB3aWNoIGlzIHRoZSAubyBmaWxlcyBhYm92ZSBsaW5rZWQgdG9nZXRoZXIKKyMgYykgQSA8bW9kdWxlPi5tb2QgZmlsZSBpbiAkKE1PRFZFUkRJUikvLCBsaXN0aW5nIHRoZSBuYW1lIG9mIHRoZQorIyAgICB0aGUgcHJlbGltaW5hcnkgPG1vZHVsZT4ubyBmaWxlLCBwbHVzIGFsbCAubyBmaWxlcworCisjIFN0YWdlIDIgaXMgaGFuZGxlZCBieSB0aGlzIGZpbGUgYW5kIGRvZXMgdGhlIGZvbGxvd2luZworIyAxKSBGaW5kIGFsbCBtb2R1bGVzIGZyb20gdGhlIGZpbGVzIGxpc3RlZCBpbiAkKE1PRFZFUkRJUikvCisjIDIpIG1vZHBvc3QgaXMgdGhlbiB1c2VkIHRvCisjIDMpICBjcmVhdGUgb25lIDxtb2R1bGU+Lm1vZC5jIGZpbGUgcHIuIG1vZHVsZQorIyA0KSAgY3JlYXRlIG9uZSBNb2R1bGUuc3ltdmVycyBmaWxlIHdpdGggQ1JDIGZvciBhbGwgZXhwb3J0ZWQgc3ltYm9scworIyA1KSBjb21waWxlIGFsbCA8bW9kdWxlPi5tb2QuYyBmaWxlcworIyA2KSBmaW5hbCBsaW5rIG9mIHRoZSBtb2R1bGUgdG8gYSA8bW9kdWxlLmtvPiBmaWxlCisKKyMgU3RlcCAzIGlzIHVzZWQgdG8gcGxhY2UgY2VydGFpbiBpbmZvcm1hdGlvbiBpbiB0aGUgbW9kdWxlJ3MgRUxGCisjIHNlY3Rpb24sIGluY2x1ZGluZyBpbmZvcm1hdGlvbiBzdWNoIGFzOgorIyAgIFZlcnNpb24gbWFnaWMgKHNlZSBpbmNsdWRlL3Zlcm1hZ2ljLmggZm9yIGZ1bGwgZGV0YWlscykKKyMgICAgIC0gS2VybmVsIHJlbGVhc2UKKyMgICAgIC0gU01QIGlzIENPTkZJR19TTVAKKyMgICAgIC0gUFJFRU1QVCBpcyBDT05GSUdfUFJFRU1QVAorIyAgICAgLSBHQ0MgVmVyc2lvbgorIyAgIE1vZHVsZSBpbmZvCisjICAgICAtIE1vZHVsZSB2ZXJzaW9uIChNT0RVTEVfVkVSU0lPTikKKyMgICAgIC0gTW9kdWxlIGFsaWFzJ2VzIChNT0RVTEVfQUxJQVMpCisjICAgICAtIE1vZHVsZSBsaWNlbnNlIChNT0RVTEVfTElDRU5TRSkKKyMgICAgIC0gU2VlIGluY2x1ZGUvbGludXgvbW9kdWxlLmggZm9yIG1vcmUgZGV0YWlscworCisjIFN0ZXAgNCBpcyBzb2xlbHkgdXNlZCB0byBhbGxvdyBtb2R1bGUgdmVyc2lvbmluZyBpbiBleHRlcm5hbCBtb2R1bGVzLAorIyB3aGVyZSB0aGUgQ1JDIG9mIGVhY2ggbW9kdWxlIGlzIHJldHJlaXZlZCBmcm9tIHRoZSBNb2R1bGUuc3ltZXJzIGZpbGUuCisKKy5QSE9OWTogX21vZHBvc3QKK19tb2Rwb3N0OiBfX21vZHBvc3QKKworaW5jbHVkZSAuY29uZmlnCitpbmNsdWRlIHNjcmlwdHMvTWFrZWZpbGUubGliCisKK3N5bXZlcmZpbGUgOj0gJChvYmp0cmVlKS9Nb2R1bGUuc3ltdmVycworCisjIFN0ZXAgMSksIGZpbmQgYWxsIG1vZHVsZXMgbGlzdGVkIGluICQoTU9EVkVSRElSKS8KK19fbW9kdWxlcyA6PSAkKHNvcnQgJChzaGVsbCBncmVwIC1oICdcLmtvJyAvZGV2L251bGwgJCh3aWxkY2FyZCAkKE1PRFZFUkRJUikvKi5tb2QpKSkKK21vZHVsZXMgICA6PSAkKHBhdHN1YnN0ICUubywlLmtvLCAkKHdpbGRjYXJkICQoX19tb2R1bGVzOi5rbz0ubykpKQorCitfbW9kcG9zdDogJChtb2R1bGVzKQorCisKKyMgU3RlcCAyKSwgaW52b2tlIG1vZHBvc3QKKyMgIEluY2x1ZGVzIHN0ZXAgMyw0CitxdWlldF9jbWRfbW9kcG9zdCA9IE1PRFBPU1QKKyAgICAgIGNtZF9tb2Rwb3N0ID0gc2NyaXB0cy9tb2QvbW9kcG9zdCAgICAgICAgICAgIFwKKyAgICAgICAgJChpZiAkKENPTkZJR19NT0RWRVJTSU9OUyksLW0pICAgICAgICAgICAgIFwKKwkkKGlmICQoQ09ORklHX01PRFVMRV9TUkNWRVJTSU9OX0FMTCksLWEsKSAgXAorCSQoaWYgJChLQlVJTERfRVhUTU9EKSwtaSwtbykgJChzeW12ZXJmaWxlKSBcCisJJChmaWx0ZXItb3V0IEZPUkNFLCReKQorCisuUEhPTlk6IF9fbW9kcG9zdAorX19tb2Rwb3N0OiAkKHdpbGRjYXJkIHZtbGludXgpICQobW9kdWxlczoua289Lm8pIEZPUkNFCisJJChjYWxsIGNtZCxtb2Rwb3N0KQorCisjIERlY2xhcmUgZ2VuZXJhdGVkIGZpbGVzIGFzIHRhcmdldHMgZm9yIG1vZHBvc3QKKyQoc3ltdmVyZmlsZSk6ICAgICAgICAgX19tb2Rwb3N0IDsKKyQobW9kdWxlczoua289Lm1vZC5jKTogX19tb2Rwb3N0IDsKKworCisjIFN0ZXAgNSksIGNvbXBpbGUgYWxsICoubW9kLmMgZmlsZXMKKworIyBtb2RuYW1lIGlzIHNldCB0byBtYWtlIGNfZmxhZ3MgZGVmaW5lIEtCVUlMRF9NT0ROQU1FCittb2RuYW1lID0gJCgqRikKKworcXVpZXRfY21kX2NjX29fYyA9IENDICAgICAgJEAKKyAgICAgIGNtZF9jY19vX2MgPSAkKENDKSAkKGNfZmxhZ3MpICQoQ0ZMQUdTX01PRFVMRSkJXAorCQkgICAtYyAtbyAkQCAkPAorCiskKG1vZHVsZXM6LmtvPS5tb2Qubyk6ICUubW9kLm86ICUubW9kLmMgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZF9kZXAsY2Nfb19jKQorCit0YXJnZXRzICs9ICQobW9kdWxlczoua289Lm1vZC5vKQorCisjIFN0ZXAgNiksIGZpbmFsIGxpbmsgb2YgdGhlIG1vZHVsZXMKK3F1aWV0X2NtZF9sZF9rb19vID0gTEQgW01dICAkQAorICAgICAgY21kX2xkX2tvX28gPSAkKExEKSAkKExERkxBR1MpICQoTERGTEFHU19NT0RVTEUpIC1vICRAIAkJXAorCQkJICAkKGZpbHRlci1vdXQgRk9SQ0UsJF4pCisKKyQobW9kdWxlcyk6ICUua28gOiUubyAlLm1vZC5vIEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQsbGRfa29fbykKKwordGFyZ2V0cyArPSAkKG1vZHVsZXMpCisKKworIyBBZGQgRk9SQ0UgdG8gdGhlIHByZXF1aXNpdGVzIG9mIGEgdGFyZ2V0IHRvIGZvcmNlIGl0IHRvIGJlIGFsd2F5cyByZWJ1aWx0LgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLlBIT05ZOiBGT1JDRQorCitGT1JDRToKKworIyBSZWFkIGFsbCBzYXZlZCBjb21tYW5kIGxpbmVzIGFuZCBkZXBlbmRlbmNpZXMgZm9yIHRoZSAkKHRhcmdldHMpIHdlCisjIG1heSBiZSBidWlsZGluZyBhYm92ZSwgdXNpbmcgJChpZl9jaGFuZ2VkeyxfZGVwfSkuIEFzIGFuCisjIG9wdGltaXphdGlvbiwgd2UgZG9uJ3QgbmVlZCB0byByZWFkIHRoZW0gaWYgdGhlIHRhcmdldCBkb2VzIG5vdAorIyBleGlzdCwgd2Ugd2lsbCByZWJ1aWxkIGFueXdheSBpbiB0aGF0IGNhc2UuCisKK3RhcmdldHMgOj0gJCh3aWxkY2FyZCAkKHNvcnQgJCh0YXJnZXRzKSkpCitjbWRfZmlsZXMgOj0gJCh3aWxkY2FyZCAkKGZvcmVhY2ggZiwkKHRhcmdldHMpLCQoZGlyICQoZikpLiQobm90ZGlyICQoZikpLmNtZCkpCisKK2lmbmVxICgkKGNtZF9maWxlcyksKQorICBpbmNsdWRlICQoY21kX2ZpbGVzKQorZW5kaWYKZGlmZiAtLWdpdCBhL3NjcmlwdHMvYmFzaWMvTWFrZWZpbGUgYi9zY3JpcHRzL2Jhc2ljL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyMmU5NGMKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2Jhc2ljL01ha2VmaWxlCkBAIC0wLDAgKzEsMTggQEAKKyMjIworIyBNYWtlZmlsZS5iYXNpYyBsaXN0IHRoZSBtb3N0IGJhc2ljIHByb2dyYW1zIHVzZWQgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzLgorIyBUaGUgcHJvZ3JhbXMgbGlzdGVkIGhlcmVpbiBpcyB3aGF0IGlzIG5lZWRlZCB0byBkbyB0aGUgYmFzaWMgc3R1ZmYsCisjIHN1Y2ggYXMgc3BsaXR0aW5nIC5jb25maWcgYW5kIGZpeCBkZXBlbmRlbmN5IGZpbGUuCisjIFRoaXMgaW5pdGlhbCBzdGVwIGlzIG5lZWRlZCB0byBhdm9pZCBmaWxlcyB0byBiZSByZWNvbXBpbGVkCisjIHdoZW4ga2VybmVsIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyAod2hpY2ggaXMgd2hhdCBoYXBwZW5zIHdoZW4KKyMgLmNvbmZpZyBpcyBpbmNsdWRlZCBieSBtYWluIE1ha2VmaWxlLgorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgZml4ZGVwOiAJIFVzZWQgdG8gZ2VuZXJhdGUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiBkdXJpbmcgYnVpbGQgcHJvY2VzcworIyBzcGxpdC1pbmNsdWRlOiBEaXZpZGUgYWxsIGNvbmZpZyBzeW1ib2xzIHVwIGluIGEgbnVtYmVyIG9mIGZpbGVzIGluCisjICAgICAgICAgICAgICAgIGluY2x1ZGUvY29uZmlnLy4uLgorIyBkb2Nwcm9jOgkgVXNlZCBpbiBEb2N1bWVudGF0aW9uL2RvY2Jvb2sKKworaG9zdHByb2dzLXkJOj0gZml4ZGVwIHNwbGl0LWluY2x1ZGUgZG9jcHJvYworYWx3YXlzCQk6PSAkKGhvc3Rwcm9ncy15KQorCisjIGZpeGRlcCBpcyBuZWVkZWQgdG8gY29tcGlsZSBvdGhlciBob3N0IHByb2dyYW1zCiskKGFkZHByZWZpeCAkKG9iaikvLCQoZmlsdGVyLW91dCBmaXhkZXAsJChhbHdheXMpKSk6ICQob2JqKS9maXhkZXAKZGlmZiAtLWdpdCBhL3NjcmlwdHMvYmFzaWMvZG9jcHJvYy5jIGIvc2NyaXB0cy9iYXNpYy9kb2Nwcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNhN2VjZAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvYmFzaWMvZG9jcHJvYy5jCkBAIC0wLDAgKzEsMzk4IEBACisvKgorICoJZG9jcHJvYyBpcyBhIHNpbXBsZSBwcmVwcm9jZXNzb3IgZm9yIHRoZSB0ZW1wbGF0ZSBmaWxlcworICogICAgICB1c2VkIGFzIHBsYWNlaG9sZGVycyBmb3IgdGhlIGtlcm5lbCBpbnRlcm5hbCBkb2N1bWVudGF0aW9uLgorICoJZG9jcHJvYyBpcyB1c2VkIGZvciBkb2N1bWVudGF0aW9uLWZyb250ZW5kIGFuZAorICogICAgICBkZXBlbmRlbmN5LWdlbmVyYXRvci4KKyAqCVRoZSB0d28gdXNhZ2VzIGhhdmUgaW4gY29tbW9uIHRoYXQgdGhleSByZXF1aXJlCisgKglzb21lIGtub3dsZWRnZSBvZiB0aGUgLnRtcGwgc3ludGF4LCB0aGVyZWZvcmUgdGhleQorICoJYXJlIGtlcHQgdG9nZXRoZXIuCisgKgorICoJZG9jdW1lbnRhdGlvbi1mcm9udGVuZAorICoJCVNjYW5zIHRoZSB0ZW1wbGF0ZSBmaWxlIGFuZCBjYWxsIGtlcm5lbC1kb2MgZm9yCisgKgkJYWxsIG9jY3VycmVuY2VzIG9mICFbRUlGXWZpbGUKKyAqCQlCZWZvcmVoYW5kIGVhY2ggcmVmZXJlbmNlZCBmaWxlIGFyZSBzY2FubmVkIGZvcgorICoJCWFueSBleHBvcnRlZCBzeW1wb2xzICJFWFBPUlRfU1lNQk9MKCkiIHN0YXRlbWVudHMuCisgKgkJVGhpcyBpcyB1c2VkIHRvIGNyZWF0ZSBwcm9wZXIgLWZ1bmN0aW9uIGFuZAorICoJCS1ub2Z1bmN0aW9uIGFyZ3VtZW50cyBpbiBjYWxscyB0byBrZXJuZWwtZG9jLgorICoJCVVzYWdlOiBkb2Nwcm9jIGRvYyBmaWxlLnRtcGwKKyAqCisgKglkZXBlbmRlbmN5LWdlbmVyYXRvcjoKKyAqCQlTY2FucyB0aGUgdGVtcGxhdGUgZmlsZSBhbmQgbGlzdCBhbGwgZmlsZXMKKyAqCQlyZWZlcmVuY2VkIGluIGEgZm9ybWF0IHJlY29nbml6ZWQgYnkgbWFrZS4KKyAqCQlVc2FnZToJZG9jcHJvYyBkZXBlbmQgZmlsZS50bXBsCisgKgkJV3JpdGVzIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gdG8gc3Rkb3V0CisgKgkJaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6CisgKgkJZmlsZS50bXBsIHNyYy5jCXNyYzIuYworICoJCVRoZSBmaWxlbmFtZXMgYXJlIG9idGFpbmVkIGZyb20gdGhlIGZvbGxvd2luZyBjb25zdHJ1Y3RzOgorICoJCSFFZmlsZW5hbWUKKyAqCQkhSWZpbGVuYW1lCisgKgkJIURmaWxlbmFtZQorICoJCSFGZmlsZW5hbWUKKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorCisvKiBleGl0c3RhdHVzIGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBhbnkgZmFpbGluZyBjYWxscyB0byBrZXJuZWwtZG9jLAorICogYnV0IGV4ZWN1dGlvbiBjb250aW51ZXMuICovCitpbnQgZXhpdHN0YXR1cyA9IDA7CisKK3R5cGVkZWYgdm9pZCBERkwoY2hhciAqKTsKK0RGTCAqZGVmYXVsdGxpbmU7CisKK3R5cGVkZWYgdm9pZCBGSUxFT05MWShjaGFyICogZmlsZSk7CitGSUxFT05MWSAqaW50ZXJuYWxmdW5jdGlvbnM7CitGSUxFT05MWSAqZXh0ZXJuYWxmdW5jdGlvbnM7CitGSUxFT05MWSAqc3ltYm9sc29ubHk7CisKK3R5cGVkZWYgdm9pZCBGSUxFTElORShjaGFyICogZmlsZSwgc2lnbmVkIGNoYXIgKiBsaW5lKTsKK0ZJTEVMSU5FICogc2luZ2xlZnVuY3Rpb25zOworRklMRUxJTkUgKiBlbnRpdHlfc3lzdGVtOworCisjZGVmaW5lIE1BWExJTkVTWiAgICAgMjA0OAorI2RlZmluZSBNQVhGSUxFUyAgICAgIDI1MAorI2RlZmluZSBLRVJORUxET0NQQVRIICJzY3JpcHRzLyIKKyNkZWZpbmUgS0VSTkVMRE9DICAgICAia2VybmVsLWRvYyIKKyNkZWZpbmUgRE9DQk9PSyAgICAgICAiLWRvY2Jvb2siCisjZGVmaW5lIEZVTkNUSU9OICAgICAgIi1mdW5jdGlvbiIKKyNkZWZpbmUgTk9GVU5DVElPTiAgICAiLW5vZnVuY3Rpb24iCisKK3ZvaWQgdXNhZ2UgKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogZG9jcHJvYyB7ZG9jfGRlcGVuZH0gZmlsZVxuIik7CisJZnByaW50ZihzdGRlcnIsICJJbnB1dCBpcyByZWFkIGZyb20gZmlsZS50bXBsLiBPdXRwdXQgaXMgc2VudCB0byBzdGRvdXRcbiIpOworCWZwcmludGYoc3RkZXJyLCAiZG9jOiBmcm9udGVuZCB3aGVuIGdlbmVyYXRpbmcga2VybmVsIGRvY3VtZW50YXRpb25cbiIpOworCWZwcmludGYoc3RkZXJyLCAiZGVwZW5kOiBnZW5lcmF0ZSBsaXN0IG9mIGZpbGVzIHJlZmVyZW5jZWQgd2l0aGluIGZpbGVcbiIpOworfQorCisvKgorICogRXhlY3V0ZSBrZXJuZWwtZG9jIHdpdGggcGFyYW1ldGVycyBnaXZpbiBpbiBzdmVjCisgKi8KK3ZvaWQgZXhlY19rZXJuZWxfZG9jKGNoYXIgKipzdmVjKQoreworCXBpZF90IHBpZDsKKwlpbnQgcmV0OworCWNoYXIgcmVhbF9maWxlbmFtZVtQQVRIX01BWCArIDFdOworCS8qIE1ha2Ugc3VyZSBvdXRwdXQgZ2VuZXJhdGVkIHNvIGZhciBhcmUgZmx1c2hlZCAqLworCWZmbHVzaChzdGRvdXQpOworCXN3aXRjaChwaWQ9Zm9yaygpKSB7CisJCWNhc2UgLTE6CisJCQlwZXJyb3IoImZvcmsiKTsKKwkJCWV4aXQoMSk7CisJCWNhc2UgIDA6CisJCQltZW1zZXQocmVhbF9maWxlbmFtZSwgMCwgc2l6ZW9mKHJlYWxfZmlsZW5hbWUpKTsKKwkJCXN0cm5jYXQocmVhbF9maWxlbmFtZSwgZ2V0ZW52KCJTUkNUUkVFIiksIFBBVEhfTUFYKTsKKwkJCXN0cm5jYXQocmVhbF9maWxlbmFtZSwgS0VSTkVMRE9DUEFUSCBLRVJORUxET0MsCisJCQkJCVBBVEhfTUFYIC0gc3RybGVuKHJlYWxfZmlsZW5hbWUpKTsKKwkJCWV4ZWN2cChyZWFsX2ZpbGVuYW1lLCBzdmVjKTsKKwkJCWZwcmludGYoc3RkZXJyLCAiZXhlYyAiKTsKKwkJCXBlcnJvcihyZWFsX2ZpbGVuYW1lKTsKKwkJCWV4aXQoMSk7CisJCWRlZmF1bHQ6CisJCQl3YWl0cGlkKHBpZCwgJnJldCAsMCk7CisJfQorCWlmIChXSUZFWElURUQocmV0KSkKKwkJZXhpdHN0YXR1cyB8PSBXRVhJVFNUQVRVUyhyZXQpOworCWVsc2UKKwkJZXhpdHN0YXR1cyA9IDB4ZmY7Cit9CisKKy8qIFR5cGVzIHVzZWQgdG8gY3JlYXRlIGxpc3Qgb2YgYWxsIGV4cG9ydGVkIHN5bWJvbHMgaW4gYSBudW1iZXIgb2YgZmlsZXMgKi8KK3N0cnVjdCBzeW1ib2xzCit7CisJY2hhciAqbmFtZTsKK307CisKK3N0cnVjdCBzeW1maWxlCit7CisJY2hhciAqZmlsZW5hbWU7CisJc3RydWN0IHN5bWJvbHMgKnN5bWJvbGxpc3Q7CisJaW50IHN5bWJvbGNudDsKK307CisKK3N0cnVjdCBzeW1maWxlIHN5bWZpbGVsaXN0W01BWEZJTEVTXTsKK2ludCBzeW1maWxlY250ID0gMDsKKwordm9pZCBhZGRfbmV3X3N5bWJvbChzdHJ1Y3Qgc3ltZmlsZSAqc3ltLCBjaGFyICogc3ltbmFtZSkKK3sKKwlzeW0tPnN5bWJvbGxpc3QgPQorICAgICAgICAgIHJlYWxsb2Moc3ltLT5zeW1ib2xsaXN0LCAoc3ltLT5zeW1ib2xjbnQgKyAxKSAqIHNpemVvZihjaGFyICopKTsKKwlzeW0tPnN5bWJvbGxpc3Rbc3ltLT5zeW1ib2xjbnQrK10ubmFtZSA9IHN0cmR1cChzeW1uYW1lKTsKK30KKworLyogQWRkIGEgZmlsZW5hbWUgdG8gdGhlIGxpc3QgKi8KK3N0cnVjdCBzeW1maWxlICogYWRkX25ld19maWxlKGNoYXIgKiBmaWxlbmFtZSkKK3sKKwlzeW1maWxlbGlzdFtzeW1maWxlY250KytdLmZpbGVuYW1lID0gc3RyZHVwKGZpbGVuYW1lKTsKKwlyZXR1cm4gJnN5bWZpbGVsaXN0W3N5bWZpbGVjbnQgLSAxXTsKK30KKy8qIENoZWNrIGlmIGZpbGUgYWxyZWFkeSBhcmUgcHJlc2VudCBpbiB0aGUgbGlzdCAqLworc3RydWN0IHN5bWZpbGUgKiBmaWxlbmFtZV9leGlzdChjaGFyICogZmlsZW5hbWUpCit7CisJaW50IGk7CisJZm9yIChpPTA7IGkgPCBzeW1maWxlY250OyBpKyspCisJCWlmIChzdHJjbXAoc3ltZmlsZWxpc3RbaV0uZmlsZW5hbWUsIGZpbGVuYW1lKSA9PSAwKQorCQkJcmV0dXJuICZzeW1maWxlbGlzdFtpXTsKKwlyZXR1cm4gTlVMTDsKK30KKworLyoKKyAqIExpc3QgYWxsIGZpbGVzIHJlZmVyZW5jZWQgd2l0aGluIHRoZSB0ZW1wbGF0ZSBmaWxlLgorICogRmlsZXMgYXJlIHNlcGFyYXRlZCBieSB0YWJzLgorICovCit2b2lkIGFkZGRlcChjaGFyICogZmlsZSkJCSAgIHsgcHJpbnRmKCJcdCVzIiwgZmlsZSk7IH0KK3ZvaWQgYWRkZGVwMihjaGFyICogZmlsZSwgc2lnbmVkIGNoYXIgKiBsaW5lKSAgICAgeyBsaW5lID0gbGluZTsgYWRkZGVwKGZpbGUpOyB9Cit2b2lkIG5vYWN0aW9uKGNoYXIgKiBsaW5lKQkJICAgeyBsaW5lID0gbGluZTsgfQordm9pZCBub2FjdGlvbjIoY2hhciAqIGZpbGUsIHNpZ25lZCBjaGFyICogbGluZSkgICB7IGZpbGUgPSBmaWxlOyBsaW5lID0gbGluZTsgfQorCisvKiBFY2hvIHRoZSBsaW5lIHdpdGhvdXQgZnVydGhlciBhY3Rpb24gKi8KK3ZvaWQgcHJpbnRsaW5lKGNoYXIgKiBsaW5lKSAgICAgICAgICAgICAgIHsgcHJpbnRmKCIlcyIsIGxpbmUpOyB9CisKKy8qCisgKiBGaW5kIGFsbCBzeW1ib2xzIGV4cG9ydGVkIHdpdGggRVhQT1JUX1NZTUJPTCBhbmQgRVhQT1JUX1NZTUJPTF9HUEwKKyAqIGluIGZpbGVuYW1lLgorICogQWxsIHN5bWJvbHMgbG9jYXRlZCBhcmUgc3RvcmVkIGluIHN5bWZpbGVsaXN0LgorICovCit2b2lkIGZpbmRfZXhwb3J0X3N5bWJvbHMoY2hhciAqIGZpbGVuYW1lKQoreworCUZJTEUgKiBmcDsKKwlzdHJ1Y3Qgc3ltZmlsZSAqc3ltOworCWNoYXIgbGluZVtNQVhMSU5FU1pdOworCWlmIChmaWxlbmFtZV9leGlzdChmaWxlbmFtZSkgPT0gTlVMTCkgeworCQljaGFyIHJlYWxfZmlsZW5hbWVbUEFUSF9NQVggKyAxXTsKKwkJbWVtc2V0KHJlYWxfZmlsZW5hbWUsIDAsIHNpemVvZihyZWFsX2ZpbGVuYW1lKSk7CisJCXN0cm5jYXQocmVhbF9maWxlbmFtZSwgZ2V0ZW52KCJTUkNUUkVFIiksIFBBVEhfTUFYKTsKKwkJc3RybmNhdChyZWFsX2ZpbGVuYW1lLCBmaWxlbmFtZSwKKwkJCQlQQVRIX01BWCAtIHN0cmxlbihyZWFsX2ZpbGVuYW1lKSk7CisJCXN5bSA9IGFkZF9uZXdfZmlsZShmaWxlbmFtZSk7CisJCWZwID0gZm9wZW4ocmVhbF9maWxlbmFtZSwgInIiKTsKKwkJaWYgKGZwID09IE5VTEwpCisJCXsKKwkJCWZwcmludGYoc3RkZXJyLCAiZG9jcHJvYzogIik7CisJCQlwZXJyb3IocmVhbF9maWxlbmFtZSk7CisJCX0KKwkJd2hpbGUoZmdldHMobGluZSwgTUFYTElORVNaLCBmcCkpIHsKKwkJCXNpZ25lZCBjaGFyICpwOworCQkJc2lnbmVkIGNoYXIgKmU7CisJCQlpZiAoKChwID0gc3Ryc3RyKGxpbmUsICJFWFBPUlRfU1lNQk9MX0dQTCIpKSAhPSAwKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgocCA9IHN0cnN0cihsaW5lLCAiRVhQT1JUX1NZTUJPTCIpKSAhPSAwKSkgeworCQkJCS8qIFNraXAgRVhQT1JUX1NZTUJPTHtfR1BMfSAqLworCQkJCXdoaWxlIChpc2FsbnVtKCpwKSB8fCAqcCA9PSAnXycpCisJCQkJCXArKzsKKwkJCQkvKiBSZW1vdmUgcGFyYW50ZXNlcyBhbmQgYWRkaXRpb25hbCB3cyAqLworCQkJCXdoaWxlIChpc3NwYWNlKCpwKSkKKwkJCQkJcCsrOworCQkJCWlmICgqcCAhPSAnKCcpCisJCQkJCWNvbnRpbnVlOyAvKiBTeW50YXggZXJyb3I/ICovCisJCQkJZWxzZQorCQkJCQlwKys7CisJCQkJd2hpbGUgKGlzc3BhY2UoKnApKQorCQkJCQlwKys7CisJCQkJZSA9IHA7CisJCQkJd2hpbGUgKGlzYWxudW0oKmUpIHx8ICplID09ICdfJykKKwkJCQkJZSsrOworCQkJCSplID0gJ1wwJzsKKwkJCQlhZGRfbmV3X3N5bWJvbChzeW0sIHApOworCQkJfQorCQl9CisJCWZjbG9zZShmcCk7CisJfQorfQorCisvKgorICogRG9jdW1lbnQgYWxsIGV4dGVybmFsIG9yIGludGVybmFsIGZ1bmN0aW9ucyBpbiBhIGZpbGUuCisgKiBDYWxsIGtlcm5lbC1kb2Mgd2l0aCBmb2xsb3dpbmcgcGFyYW1ldGVyczoKKyAqIGtlcm5lbC1kb2MgLWRvY2Jvb2sgLW5vZnVuY3Rpb24gZnVuY3Rpb25fbmFtZTEgZmlsZW5hbWUKKyAqIGZ1bmN0aW9uIG5hbWVzIGFyZSBvYnRhaW5lZCBmcm9tIGFsbCB0aGUgdGhlIHNyYyBmaWxlcworICogYnkgZmluZF9leHBvcnRfc3ltYm9scy4KKyAqIGludGZ1bmMgdXNlcyAtbm9mdW5jdGlvbgorICogZXh0ZnVuYyB1c2VzIC1mdW5jdGlvbgorICovCit2b2lkIGRvY2Z1bmN0aW9ucyhjaGFyICogZmlsZW5hbWUsIGNoYXIgKiB0eXBlKQoreworCWludCBpLGo7CisJaW50IHN5bWNudCA9IDA7CisJaW50IGlkeCA9IDA7CisJY2hhciAqKnZlYzsKKworCWZvciAoaT0wOyBpIDw9IHN5bWZpbGVjbnQ7IGkrKykKKwkJc3ltY250ICs9IHN5bWZpbGVsaXN0W2ldLnN5bWJvbGNudDsKKwl2ZWMgPSBtYWxsb2MoKDIgKyAyICogc3ltY250ICsgMikgKiBzaXplb2YoY2hhciopKTsKKwlpZiAodmVjID09IE5VTEwpIHsKKwkJcGVycm9yKCJkb2Nwcm9jOiAiKTsKKwkJZXhpdCgxKTsKKwl9CisJdmVjW2lkeCsrXSA9IEtFUk5FTERPQzsKKwl2ZWNbaWR4KytdID0gRE9DQk9PSzsKKwlmb3IgKGk9MDsgaSA8IHN5bWZpbGVjbnQ7IGkrKykgeworCQlzdHJ1Y3Qgc3ltZmlsZSAqIHN5bSA9ICZzeW1maWxlbGlzdFtpXTsKKwkJZm9yIChqPTA7IGogPCBzeW0tPnN5bWJvbGNudDsgaisrKSB7CisJCQl2ZWNbaWR4KytdICAgICA9IHR5cGU7CisJCQl2ZWNbaWR4KytdID0gc3ltLT5zeW1ib2xsaXN0W2pdLm5hbWU7CisJCX0KKwl9CisJdmVjW2lkeCsrXSAgICAgPSBmaWxlbmFtZTsKKwl2ZWNbaWR4XSA9IE5VTEw7CisJcHJpbnRmKCI8IS0tICVzIC0tPlxuIiwgZmlsZW5hbWUpOworCWV4ZWNfa2VybmVsX2RvYyh2ZWMpOworCWZmbHVzaChzdGRvdXQpOworCWZyZWUodmVjKTsKK30KK3ZvaWQgaW50ZnVuYyhjaGFyICogZmlsZW5hbWUpIHsJZG9jZnVuY3Rpb25zKGZpbGVuYW1lLCBOT0ZVTkNUSU9OKTsgfQordm9pZCBleHRmdW5jKGNoYXIgKiBmaWxlbmFtZSkgeyBkb2NmdW5jdGlvbnMoZmlsZW5hbWUsIEZVTkNUSU9OKTsgICB9CisKKy8qCisgKiBEb2N1bWVudCBzcOVlY2lmaWMgZnVuY3Rpb24ocykgaW4gYSBmaWxlLgorICogQ2FsbCBrZXJuZWwtZG9jIHdpdGggdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgorICoga2VybmVsLWRvYyAtZG9jYm9vayAtZnVuY3Rpb24gZnVuY3Rpb24xIFstZnVuY3Rpb24gZnVuY3Rpb24yXQorICovCit2b2lkIHNpbmdmdW5jKGNoYXIgKiBmaWxlbmFtZSwgc2lnbmVkIGNoYXIgKiBsaW5lKQoreworCWNoYXIgKnZlY1syMDBdOyAvKiBFbm91Z2ggZm9yIHNwZWNpZmljIGZ1bmN0aW9ucyAqLworICAgICAgICBpbnQgaSwgaWR4ID0gMDsKKyAgICAgICAgaW50IHN0YXJ0b2ZzeW0gPSAxOworCXZlY1tpZHgrK10gPSBLRVJORUxET0M7CisJdmVjW2lkeCsrXSA9IERPQ0JPT0s7CisKKyAgICAgICAgLyogU3BsaXQgbGluZSB1cCBpbiBpbmRpdmlkdWFsIHBhcmFtZXRlcnMgcHJlY2VlZGVkIGJ5IEZVTkNUSU9OICovCisgICAgICAgIGZvciAoaT0wOyBsaW5lW2ldOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNzcGFjZShsaW5lW2ldKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbGluZVtpXSA9ICdcMCc7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydG9mc3ltID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3RhcnRvZnN5bSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRvZnN5bSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB2ZWNbaWR4KytdID0gRlVOQ1RJT047CisgICAgICAgICAgICAgICAgICAgICAgICB2ZWNbaWR4KytdID0gJmxpbmVbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisJdmVjW2lkeCsrXSA9IGZpbGVuYW1lOworCXZlY1tpZHhdID0gTlVMTDsKKwlleGVjX2tlcm5lbF9kb2ModmVjKTsKK30KKworLyoKKyAqIFBhcnNlIGZpbGUsIGNhbGxpbmcgYWN0aW9uIHNwZWNpZmljIGZ1bmN0aW9ucyBmb3I6CisgKiAxKSBMaW5lcyBjb250YWluaW5nICFFCisgKiAyKSBMaW5lcyBjb250YWluaW5nICFJCisgKiAzKSBMaW5lcyBjb250YWluaW5nICFECisgKiA0KSBMaW5lcyBjb250YWluaW5nICFGCisgKiA1KSBEZWZhdWx0IGxpbmVzIC0gbGluZXMgbm90IG1hdGNoaW5nIHRoZSBhYm92ZQorICovCit2b2lkIHBhcnNlX2ZpbGUoRklMRSAqaW5maWxlKQoreworCWNoYXIgbGluZVtNQVhMSU5FU1pdOworCXNpZ25lZCBjaGFyICogczsKKwl3aGlsZShmZ2V0cyhsaW5lLCBNQVhMSU5FU1osIGluZmlsZSkpIHsKKwkJaWYgKGxpbmVbMF0gPT0gJyEnKSB7CisJCQlzID0gbGluZSArIDI7CisJCQlzd2l0Y2ggKGxpbmVbMV0pIHsKKwkJCQljYXNlICdFJzoKKwkJCQkJd2hpbGUgKCpzICYmICFpc3NwYWNlKCpzKSkgcysrOworCQkJCQkqcyA9ICdcMCc7CisJCQkJCWV4dGVybmFsZnVuY3Rpb25zKGxpbmUrMik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgJ0knOgorCQkJCQl3aGlsZSAoKnMgJiYgIWlzc3BhY2UoKnMpKSBzKys7CisJCQkJCSpzID0gJ1wwJzsKKwkJCQkJaW50ZXJuYWxmdW5jdGlvbnMobGluZSsyKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnRCc6CisJCQkJCXdoaWxlICgqcyAmJiAhaXNzcGFjZSgqcykpIHMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcyA9ICdcMCc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sc29ubHkobGluZSsyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKwkJCQljYXNlICdGJzoKKwkJCQkJLyogZmlsZW5hbWUgKi8KKwkJCQkJd2hpbGUgKCpzICYmICFpc3NwYWNlKCpzKSkgcysrOworCQkJCQkqcysrID0gJ1wwJzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmdW5jdGlvbiBuYW1lcyAqLworCQkJCQl3aGlsZSAoaXNzcGFjZSgqcykpCisJCQkJCQlzKys7CisJCQkJCXNpbmdsZWZ1bmN0aW9ucyhsaW5lICsyLCBzKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJZGVmYXVsdGxpbmUobGluZSk7CisJCQl9CisJCX0KKwkJZWxzZSB7CisJCQlkZWZhdWx0bGluZShsaW5lKTsKKwkJfQorCX0KKwlmZmx1c2goc3Rkb3V0KTsKK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqYXJndltdKQoreworCUZJTEUgKiBpbmZpbGU7CisJaWYgKGFyZ2MgIT0gMykgeworCQl1c2FnZSgpOworCQlleGl0KDEpOworCX0KKwkvKiBPcGVuIGZpbGUsIGV4aXQgb24gZXJyb3IgKi8KKwlpbmZpbGUgPSBmb3Blbihhcmd2WzJdLCAiciIpOworICAgICAgICBpZiAoaW5maWxlID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImRvY3Byb2M6ICIpOworICAgICAgICAgICAgICAgIHBlcnJvcihhcmd2WzJdKTsKKyAgICAgICAgICAgICAgICBleGl0KDIpOworICAgICAgICB9CisKKwlpZiAoc3RyY21wKCJkb2MiLCBhcmd2WzFdKSA9PSAwKQorCXsKKwkJLyogTmVlZCB0byBkbyB0aGlzIGluIHR3byBwYXNzZXMuCisJCSAqIEZpcnN0IHBhc3MgaXMgdXNlZCB0byBjb2xsZWN0IGFsbCBzeW1ib2xzIGV4cG9ydGVkCisJCSAqIGluIHRoZSB2YXJpb3VzIGZpbGVzLgorCQkgKiBTZWNvbmQgcGFzcyBnZW5lcmF0ZSB0aGUgZG9jdW1lbnRhdGlvbi4KKwkJICogVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIGZ1bmN0aW9uIGFyZSBkZWNsYXJlZAorCQkgKiBhbmQgZXhwb3J0ZWQgaW4gZGlmZmVyZW50IGZpbGVzIDotKCgKKwkJICovCisJCS8qIENvbGxlY3Qgc3ltYm9scyAqLworCQlkZWZhdWx0bGluZSAgICAgICA9IG5vYWN0aW9uOworCQlpbnRlcm5hbGZ1bmN0aW9ucyA9IGZpbmRfZXhwb3J0X3N5bWJvbHM7CisJCWV4dGVybmFsZnVuY3Rpb25zID0gZmluZF9leHBvcnRfc3ltYm9sczsKKwkJc3ltYm9sc29ubHkgICAgICAgPSBmaW5kX2V4cG9ydF9zeW1ib2xzOworCQlzaW5nbGVmdW5jdGlvbnMgICA9IG5vYWN0aW9uMjsKKwkJcGFyc2VfZmlsZShpbmZpbGUpOworCisJCS8qIFJld2luZCB0byBzdGFydCBmcm9tIGJlZ2lubmluZyBvZiBmaWxlIGFnYWluICovCisJCWZzZWVrKGluZmlsZSwgMCwgU0VFS19TRVQpOworCQlkZWZhdWx0bGluZSAgICAgICA9IHByaW50bGluZTsKKwkJaW50ZXJuYWxmdW5jdGlvbnMgPSBpbnRmdW5jOworCQlleHRlcm5hbGZ1bmN0aW9ucyA9IGV4dGZ1bmM7CisJCXN5bWJvbHNvbmx5ICAgICAgID0gcHJpbnRsaW5lOworCQlzaW5nbGVmdW5jdGlvbnMgICA9IHNpbmdmdW5jOworCisJCXBhcnNlX2ZpbGUoaW5maWxlKTsKKwl9CisJZWxzZSBpZiAoc3RyY21wKCJkZXBlbmQiLCBhcmd2WzFdKSA9PSAwKQorCXsKKwkJLyogQ3JlYXRlIGZpcnN0IHBhcnQgb2YgZGVwZW5kZW5jeSBjaGFpbgorCQkgKiBmaWxlLnRtcGwgKi8KKwkJcHJpbnRmKCIlc1x0IiwgYXJndlsyXSk7CisJCWRlZmF1bHRsaW5lICAgICAgID0gbm9hY3Rpb247CisJCWludGVybmFsZnVuY3Rpb25zID0gYWRkZGVwOworCQlleHRlcm5hbGZ1bmN0aW9ucyA9IGFkZGRlcDsKKwkJc3ltYm9sc29ubHkgICAgICAgPSBhZGRkZXA7CisJCXNpbmdsZWZ1bmN0aW9ucyAgID0gYWRkZGVwMjsKKwkJcGFyc2VfZmlsZShpbmZpbGUpOworCQlwcmludGYoIlxuIik7CisJfQorCWVsc2UKKwl7CisJCWZwcmludGYoc3RkZXJyLCAiVW5rbm93biBvcHRpb246ICVzXG4iLCBhcmd2WzFdKTsKKwkJZXhpdCgxKTsKKwl9CisJZmNsb3NlKGluZmlsZSk7CisJZmZsdXNoKHN0ZG91dCk7CisJcmV0dXJuIGV4aXRzdGF0dXM7Cit9CisKZGlmZiAtLWdpdCBhL3NjcmlwdHMvYmFzaWMvZml4ZGVwLmMgYi9zY3JpcHRzL2Jhc2ljL2ZpeGRlcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmNDJjNWQKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2Jhc2ljL2ZpeGRlcC5jCkBAIC0wLDAgKzEsMzkwIEBACisvKgorICogIk9wdGltaXplIiBhIGxpc3Qgb2YgZGVwZW5kZW5jaWVzIGFzIHNwaXQgb3V0IGJ5IGdjYyAtTUQKKyAqIGZvciB0aGUga2VybmVsIGJ1aWxkCisgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAqCisgKiBBdXRob3IgICAgICAgS2FpIEdlcm1hc2NoZXdza2kKKyAqIENvcHlyaWdodCAgICAyMDAyIGJ5IEthaSBHZXJtYXNjaGV3c2tpICA8a2FpLmdlcm1hc2NoZXdza2lAZ214LmRlPgorICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKgorICoKKyAqIEludHJvZHVjdGlvbjoKKyAqCisgKiBnY2MgcHJvZHVjZXMgYSB2ZXJ5IG5pY2UgYW5kIGNvcnJlY3QgbGlzdCBvZiBkZXBlbmRlbmNpZXMgd2hpY2gKKyAqIHRlbGxzIG1ha2Ugd2hlbiB0byByZW1ha2UgYSBmaWxlLgorICoKKyAqIFRvIHVzZSB0aGlzIGxpc3QgYXMtaXMgaG93ZXZlciBoYXMgdGhlIGRyYXdiYWNrIHRoYXQgdmlydHVhbGx5CisgKiBldmVyeSBmaWxlIGluIHRoZSBrZXJuZWwgaW5jbHVkZXMgPGxpbnV4L2NvbmZpZy5oPiB3aGljaCB0aGVuIGFnYWluCisgKiBpbmNsdWRlcyA8bGludXgvYXV0b2NvbmYuaD4KKyAqCisgKiBJZiB0aGUgdXNlciByZS1ydW5zIG1ha2UgKmNvbmZpZywgbGludXgvYXV0b2NvbmYuaCB3aWxsIGJlCisgKiByZWdlbmVyYXRlZC4gIG1ha2Ugbm90aWNlcyB0aGF0IGFuZCB3aWxsIHJlYnVpbGQgZXZlcnkgZmlsZSB3aGljaAorICogaW5jbHVkZXMgYXV0b2NvbmYuaCwgaS5lLiBiYXNpY2FsbHkgYWxsIGZpbGVzLiBUaGlzIGlzIGV4dHJlbWVseQorICogYW5ub3lpbmcgaWYgdGhlIHVzZXIganVzdCBjaGFuZ2VkIENPTkZJR19ISVNfRFJJVkVSIGZyb20gbiB0byBtLgorICoKKyAqIFNvIHdlIHBsYXkgdGhlIHNhbWUgdHJpY2sgdGhhdCAibWtkZXAiIHBsYXllZCBiZWZvcmUuIFdlIHJlcGxhY2UKKyAqIHRoZSBkZXBlbmRlbmN5IG9uIGxpbnV4L2F1dG9jb25mLmggYnkgYSBkZXBlbmRlbmN5IG9uIGV2ZXJ5IGNvbmZpZworICogb3B0aW9uIHdoaWNoIGlzIG1lbnRpb25lZCBpbiBhbnkgb2YgdGhlIGxpc3RlZCBwcmVxdWlzaXRlcy4KKyAqCisgKiBUbyBiZSBleGFjdCwgc3BsaXQtaW5jbHVkZSBwb3B1bGF0ZXMgYSB0cmVlIGluIGluY2x1ZGUvY29uZmlnLywKKyAqIGUuZy4gaW5jbHVkZS9jb25maWcvaGlzL2RyaXZlci5oLCB3aGljaCBjb250YWlucyB0aGUgI2RlZmluZS8jdW5kZWYKKyAqIGZvciB0aGUgQ09ORklHX0hJU19EUklWRVIgb3B0aW9uLgorICoKKyAqIFNvIGlmIHRoZSB1c2VyIGNoYW5nZXMgaGlzIENPTkZJR19ISVNfRFJJVkVSIG9wdGlvbiwgb25seSB0aGUgb2JqZWN0cworICogd2hpY2ggZGVwZW5kIG9uICJpbmNsdWRlL2xpbnV4L2NvbmZpZy9oaXMvZHJpdmVyLmgiIHdpbGwgYmUgcmVidWlsdCwKKyAqIHNvIG1vc3QgbGlrZWx5IG9ubHkgaGlzIGRyaXZlciA7LSkKKyAqCisgKiBUaGUgaWRlYSBhYm92ZSBkYXRlcywgYnkgdGhlIHdheSwgYmFjayB0byBNaWNoYWVsIEUgQ2hhc3RhaW4sIEFGQUlLLgorICoKKyAqIFNvIHRvIGdldCBkZXBlbmRlbmNpZXMgcmlnaHQsIHRoZXJlIGFyZSB0d28gaXNzdWVzOgorICogbyBpZiBhbnkgb2YgdGhlIGZpbGVzIHRoZSBjb21waWxlciByZWFkIGNoYW5nZWQsIHdlIG5lZWQgdG8gcmVidWlsZAorICogbyBpZiB0aGUgY29tbWFuZCBsaW5lIGdpdmVuIHRvIHRoZSBjb21waWxlIHRoZSBmaWxlIGNoYW5nZWQsIHdlCisgKiAgIGJldHRlciByZWJ1aWxkIGFzIHdlbGwuCisgKgorICogVGhlIGZvcm1lciBpcyBoYW5kbGVkIGJ5IHVzaW5nIHRoZSAtTUQgb3V0cHV0LCB0aGUgbGF0ZXIgYnkgc2F2aW5nCisgKiB0aGUgY29tbWFuZCBsaW5lIHVzZWQgdG8gY29tcGlsZSB0aGUgb2xkIG9iamVjdCBhbmQgY29tcGFyaW5nIGl0CisgKiB0byB0aGUgb25lIHdlIHdvdWxkIG5vdyB1c2UuCisgKgorICogQWdhaW4sIGFsc28gdGhpcyBpZGVhIGlzIHByZXR0eSBvbGQgYW5kIGhhcyBiZWVuIGRpc2N1c3NlZCBvbgorICoga2J1aWxkLWRldmVsIGEgbG9uZyB0aW1lIGFnby4gSSBkb24ndCBoYXZlIGEgc2Vuc2libHkgd29ya2luZworICogaW50ZXJuZXQgY29ubmVjdGlvbiByaWdodCBub3csIHNvIEkgcmF0aGVyIGRvbid0IG1lbnRpb24gbmFtZXMKKyAqIHdpdGhvdXQgZG91YmxlIGNoZWNraW5nLgorICoKKyAqIFRoaXMgY29kZSBoZXJlIGhhcyBiZWVuIGJhc2VkIHBhcnRpYWxseSBiYXNlZCBvbiBta2RlcC5jLCB3aGljaAorICogc2F5cyB0aGUgZm9sbG93aW5nIGFib3V0IGl0cyBoaXN0b3J5OgorICoKKyAqICAgQ29weXJpZ2h0IGFiYW5kb25lZCwgTWljaGFlbCBDaGFzdGFpbiwgPG1haWx0bzptZWNAc2hvdXQubmV0Pi4KKyAqICAgVGhpcyBpcyBhIEMgdmVyc2lvbiBvZiBzeW5jZGVwLnBsIGJ5IFdlcm5lciBBbG1lc2Jlcmdlci4KKyAqCisgKgorICogSXQgaXMgaW52b2tlZCBhcworICoKKyAqICAgZml4ZGVwIDxkZXBmaWxlPiA8dGFyZ2V0PiA8Y21kbGluZT4KKyAqCisgKiBhbmQgd2lsbCByZWFkIHRoZSBkZXBlbmRlbmN5IGZpbGUgPGRlcGZpbGU+CisgKgorICogVGhlIHRyYW5zZm9ybWVkIGRlcGVuZGVuY3kgc25pcHBlZCBpcyB3cml0dGVuIHRvIHN0ZG91dC4KKyAqCisgKiBJdCBmaXJzdCBnZW5lcmF0ZXMgYSBsaW5lCisgKgorICogICBjbWRfPHRhcmdldD4gPSA8Y21kbGluZT4KKyAqCisgKiBhbmQgdGhlbiBiYXNpY2FsbHkgY29waWVzIHRoZSAuPHRhcmdldD4uZCBmaWxlIHRvIHN0ZG91dCwgaW4gdGhlCisgKiBwcm9jZXNzIGZpbHRlcmluZyBvdXQgdGhlIGRlcGVuZGVuY3kgb24gbGludXgvYXV0b2NvbmYuaCBhbmQgYWRkaW5nCisgKiBkZXBlbmRlbmNpZXMgb24gaW5jbHVkZS9jb25maWcvbXkvb3B0aW9uLmggZm9yIGV2ZXJ5CisgKiBDT05GSUdfTVlfT1BUSU9OIGVuY291bnRlcmVkIGluIGFueSBvZiB0aGUgcHJlcXVpc2l0ZXMuCisgKgorICogSXQgd2lsbCBhbHNvIGZpbHRlciBvdXQgYWxsIHRoZSBkZXBlbmRlbmNpZXMgb24gKi52ZXIuIFdlIG5lZWQKKyAqIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBnZW5lcmF0ZWQgdmVyc2lvbiBjaGVja3N1bSBhcmUgZ2xvYmFsbHkgdXAKKyAqIHRvIGRhdGUgYmVmb3JlIGV2ZW4gc3RhcnRpbmcgdGhlIHJlY3Vyc2l2ZSBidWlsZCwgc28gaXQncyB0b28gbGF0ZQorICogYXQgdGhpcyBwb2ludCBhbnl3YXkuCisgKgorICogVGhlIGFsZ29yaXRobSB0byBncmVwIGZvciAiQ09ORklHXy4uLiIgaXMgYml0IHVudXN1YWwsIGJ1dCBzaG91bGQKKyAqIGJlIGZhc3QgOy0pIFdlIGRvbid0IGV2ZW4gdHJ5IHRvIHJlYWxseSBwYXJzZSB0aGUgaGVhZGVyIGZpbGVzLCBidXQKKyAqIG1lcmVseSBncmVwLCBpLmUuIGlmIENPTkZJR19GT08gaXMgbWVudGlvbmVkIGluIGEgY29tbWVudCwgaXQgd2lsbAorICogYmUgcGlja2VkIHVwIGFzIHdlbGwuIEl0J3Mgbm90IGEgcHJvYmxlbSB3aXRoIHJlc3BlY3QgdG8KKyAqIGNvcnJlY3RuZXNzLCBzaW5jZSB0aGF0IGNhbiBvbmx5IGdpdmUgdG9vIG1hbnkgZGVwZW5kZW5jaWVzLCB0aHVzCisgKiB3ZSBjYW5ub3QgbWlzcyBhIHJlYnVpbGQuIFNpbmNlIHBlb3BsZSB0ZW5kIHRvIG5vdCBtZW50aW9uIHRvdGFsbHkKKyAqIHVucmVsYXRlZCBDT05GSUdfIG9wdGlvbnMgYWxsIG92ZXIgdGhlIHBsYWNlLCBpdCdzIG5vdCBhbgorICogZWZmaWNpZW5jeSBwcm9ibGVtIGVpdGhlci4KKyAqCisgKiAoTm90ZTogaXQnZCBiZSBlYXN5IHRvIHBvcnQgb3ZlciB0aGUgY29tcGxldGUgbWtkZXAgc3RhdGUgbWFjaGluZSwKKyAqICBidXQgSSBkb24ndCB0aGluayB0aGUgYWRkZWQgY29tcGxleGl0eSBpcyB3b3J0aCBpdCkKKyAqLworLyoKKyAqIE5vdGUgMjogaWYgc29tZWJvZHkgd3JpdGVzIEhFTExPX0NPTkZJR19CT09NIGluIGEgZmlsZSwgaXQgd2lsbCBkZXBlbmQgb250bworICogQ09ORklHX0JPT00uIFRoaXMgY291bGQgc2VlbSBhIGJ1ZyAobm90IHRvbyBoYXJkIHRvIGZpeCksIGJ1dCBwbGVhc2UgZG8gbm90CisgKiBmaXggaXQhIFNvbWUgVXNlck1vZGVMaW51eCBmaWxlcyAobG9vayBhdCBhcmNoL3VtLykgY2FsbCBDT05GSUdfQk9PTSBhcworICogVU1MX0NPTkZJR19CT09NLCB0byBhdm9pZCBjb25mbGljdHMgd2l0aCAvdXNyL2luY2x1ZGUvbGludXgvYXV0b2NvbmYuaCwKKyAqIHRocm91Z2ggYXJjaC91bS9pbmNsdWRlL3VtbC1jb25maWcuaDsgdGhpcyBmaXhkZXAgImJ1ZyIgbWFrZXMgc3VyZSB0aGF0CisgKiB0aG9zZSBmaWxlcyB3aWxsIGhhdmUgY29ycmVjdCBkZXBlbmRlbmNpZXMuCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2RlZmluZSBJTlRfQ09ORiBudG9obCgweDQzNGY0ZTQ2KQorI2RlZmluZSBJTlRfT05GSSBudG9obCgweDRmNGU0NjQ5KQorI2RlZmluZSBJTlRfTkZJRyBudG9obCgweDRlNDY0OTQ3KQorI2RlZmluZSBJTlRfRklHXyBudG9obCgweDQ2NDk0NzVmKQorCitjaGFyICp0YXJnZXQ7CitjaGFyICpkZXBmaWxlOworY2hhciAqY21kbGluZTsKKwordm9pZCB1c2FnZSh2b2lkKQorCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZTogZml4ZGVwIDxkZXBmaWxlPiA8dGFyZ2V0PiA8Y21kbGluZT5cbiIpOworCWV4aXQoMSk7Cit9CisKK3ZvaWQgcHJpbnRfY21kbGluZSh2b2lkKQoreworCXByaW50ZigiY21kXyVzIDo9ICVzXG5cbiIsIHRhcmdldCwgY21kbGluZSk7Cit9CisKK2NoYXIgKiBzdHJfY29uZmlnICA9IE5VTEw7CitpbnQgICAgc2l6ZV9jb25maWcgPSAwOworaW50ICAgIGxlbl9jb25maWcgID0gMDsKKworLyoKKyAqIEdyb3cgdGhlIGNvbmZpZ3VyYXRpb24gc3RyaW5nIHRvIGEgZGVzaXJlZCBsZW5ndGguCisgKiBVc3VhbGx5IHRoZSBmaXJzdCBncm93dGggaXMgcGxlbnR5LgorICovCit2b2lkIGdyb3dfY29uZmlnKGludCBsZW4pCit7CisJd2hpbGUgKGxlbl9jb25maWcgKyBsZW4gPiBzaXplX2NvbmZpZykgeworCQlpZiAoc2l6ZV9jb25maWcgPT0gMCkKKwkJCXNpemVfY29uZmlnID0gMjA0ODsKKwkJc3RyX2NvbmZpZyA9IHJlYWxsb2Moc3RyX2NvbmZpZywgc2l6ZV9jb25maWcgKj0gMik7CisJCWlmIChzdHJfY29uZmlnID09IE5VTEwpCisJCQl7IHBlcnJvcigiZml4ZGVwOm1hbGxvYyIpOyBleGl0KDEpOyB9CisJfQorfQorCisKKworLyoKKyAqIExvb2t1cCBhIHZhbHVlIGluIHRoZSBjb25maWd1cmF0aW9uIHN0cmluZy4KKyAqLworaW50IGlzX2RlZmluZWRfY29uZmlnKGNvbnN0IGNoYXIgKiBuYW1lLCBpbnQgbGVuKQoreworCWNvbnN0IGNoYXIgKiBwY29uZmlnOworCWNvbnN0IGNoYXIgKiBwbGFzdCA9IHN0cl9jb25maWcgKyBsZW5fY29uZmlnIC0gbGVuOworCWZvciAoIHBjb25maWcgPSBzdHJfY29uZmlnICsgMTsgcGNvbmZpZyA8IHBsYXN0OyBwY29uZmlnKysgKSB7CisJCWlmIChwY29uZmlnWyAtMV0gPT0gJ1xuJworCQkmJiAgcGNvbmZpZ1tsZW5dID09ICdcbicKKwkJJiYgICFtZW1jbXAocGNvbmZpZywgbmFtZSwgbGVuKSkKKwkJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KKworLyoKKyAqIEFkZCBhIG5ldyB2YWx1ZSB0byB0aGUgY29uZmlndXJhdGlvbiBzdHJpbmcuCisgKi8KK3ZvaWQgZGVmaW5lX2NvbmZpZyhjb25zdCBjaGFyICogbmFtZSwgaW50IGxlbikKK3sKKwlncm93X2NvbmZpZyhsZW4gKyAxKTsKKworCW1lbWNweShzdHJfY29uZmlnK2xlbl9jb25maWcsIG5hbWUsIGxlbik7CisJbGVuX2NvbmZpZyArPSBsZW47CisJc3RyX2NvbmZpZ1tsZW5fY29uZmlnKytdID0gJ1xuJzsKK30KKworLyoKKyAqIENsZWFyIHRoZSBzZXQgb2YgY29uZmlndXJhdGlvbiBzdHJpbmdzLgorICovCit2b2lkIGNsZWFyX2NvbmZpZyh2b2lkKQoreworCWxlbl9jb25maWcgPSAwOworCWRlZmluZV9jb25maWcoIiIsIDApOworfQorCisvKgorICogUmVjb3JkIHRoZSB1c2Ugb2YgYSBDT05GSUdfKiB3b3JkLgorICovCit2b2lkIHVzZV9jb25maWcoY2hhciAqbSwgaW50IHNsZW4pCit7CisJY2hhciBzW1BBVEhfTUFYXTsKKwljaGFyICpwOworCisJaWYgKGlzX2RlZmluZWRfY29uZmlnKG0sIHNsZW4pKQorCSAgICByZXR1cm47CisKKwlkZWZpbmVfY29uZmlnKG0sIHNsZW4pOworCisJbWVtY3B5KHMsIG0sIHNsZW4pOyBzW3NsZW5dID0gMDsKKworCWZvciAocCA9IHM7IHAgPCBzICsgc2xlbjsgcCsrKSB7CisJCWlmICgqcCA9PSAnXycpCisJCQkqcCA9ICcvJzsKKwkJZWxzZQorCQkJKnAgPSB0b2xvd2VyKCh1bnNpZ25lZCBjaGFyKSpwKTsKKwl9CisJcHJpbnRmKCIgICAgJCh3aWxkY2FyZCBpbmNsdWRlL2NvbmZpZy8lcy5oKSBcXFxuIiwgcyk7Cit9CisKK3ZvaWQgcGFyc2VfY29uZmlnX2ZpbGUoc2lnbmVkIGNoYXIgKm1hcCwgc2l6ZV90IGxlbikKK3sKKwlpbnQgKmVuZCA9IChpbnQgKikgKG1hcCArIGxlbik7CisJLyogc3RhcnQgYXQgKzEsIHNvIHRoYXQgcCBjYW4gbmV2ZXIgYmUgPCBtYXAgKi8KKwlpbnQgKm0gICA9IChpbnQgKikgbWFwICsgMTsKKwlzaWduZWQgY2hhciAqcCwgKnE7CisKKwlmb3IgKDsgbSA8IGVuZDsgbSsrKSB7CisJCWlmICgqbSA9PSBJTlRfQ09ORikgeyBwID0gKHNpZ25lZCBjaGFyICopIG0gIDsgZ290byBjb25mOyB9CisJCWlmICgqbSA9PSBJTlRfT05GSSkgeyBwID0gKHNpZ25lZCBjaGFyICopIG0tMTsgZ290byBjb25mOyB9CisJCWlmICgqbSA9PSBJTlRfTkZJRykgeyBwID0gKHNpZ25lZCBjaGFyICopIG0tMjsgZ290byBjb25mOyB9CisJCWlmICgqbSA9PSBJTlRfRklHXykgeyBwID0gKHNpZ25lZCBjaGFyICopIG0tMzsgZ290byBjb25mOyB9CisJCWNvbnRpbnVlOworCWNvbmY6CisJCWlmIChwID4gbWFwICsgbGVuIC0gNykKKwkJCWNvbnRpbnVlOworCQlpZiAobWVtY21wKHAsICJDT05GSUdfIiwgNykpCisJCQljb250aW51ZTsKKwkJZm9yIChxID0gcCArIDc7IHEgPCBtYXAgKyBsZW47IHErKykgeworCQkJaWYgKCEoaXNhbG51bSgqcSkgfHwgKnEgPT0gJ18nKSkKKwkJCQlnb3RvIGZvdW5kOworCQl9CisJCWNvbnRpbnVlOworCisJZm91bmQ6CisJCXVzZV9jb25maWcocCs3LCBxLXAtNyk7CisJfQorfQorCisvKiB0ZXN0IGlzIHMgZW5kcyBpbiBzdWIgKi8KK2ludCBzdHJyY21wKGNoYXIgKnMsIGNoYXIgKnN1YikKK3sKKwlpbnQgc2xlbiA9IHN0cmxlbihzKTsKKwlpbnQgc3VibGVuID0gc3RybGVuKHN1Yik7CisKKwlpZiAoc3VibGVuID4gc2xlbikKKwkJcmV0dXJuIDE7CisKKwlyZXR1cm4gbWVtY21wKHMgKyBzbGVuIC0gc3VibGVuLCBzdWIsIHN1Ymxlbik7Cit9CisKK3ZvaWQgZG9fY29uZmlnX2ZpbGUoY2hhciAqZmlsZW5hbWUpCit7CisJc3RydWN0IHN0YXQgc3Q7CisJaW50IGZkOworCXZvaWQgKm1hcDsKKworCWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworCWlmIChmZCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJmaXhkZXA6ICIpOworCQlwZXJyb3IoZmlsZW5hbWUpOworCQlleGl0KDIpOworCX0KKwlmc3RhdChmZCwgJnN0KTsKKwlpZiAoc3Quc3Rfc2l6ZSA9PSAwKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuOworCX0KKwltYXAgPSBtbWFwKE5VTEwsIHN0LnN0X3NpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKKwlpZiAoKGxvbmcpIG1hcCA9PSAtMSkgeworCQlwZXJyb3IoImZpeGRlcDogbW1hcCIpOworCQljbG9zZShmZCk7CisJCXJldHVybjsKKwl9CisKKwlwYXJzZV9jb25maWdfZmlsZShtYXAsIHN0LnN0X3NpemUpOworCisJbXVubWFwKG1hcCwgc3Quc3Rfc2l6ZSk7CisKKwljbG9zZShmZCk7Cit9CisKK3ZvaWQgcGFyc2VfZGVwX2ZpbGUodm9pZCAqbWFwLCBzaXplX3QgbGVuKQoreworCXNpZ25lZCBjaGFyICptID0gbWFwOworCXNpZ25lZCBjaGFyICplbmQgPSBtICsgbGVuOworCXNpZ25lZCBjaGFyICpwOworCWNoYXIgc1tQQVRIX01BWF07CisKKwlwID0gc3RyY2hyKG0sICc6Jyk7CisJaWYgKCFwKSB7CisJCWZwcmludGYoc3RkZXJyLCAiZml4ZGVwOiBwYXJzZSBlcnJvclxuIik7CisJCWV4aXQoMSk7CisJfQorCW1lbWNweShzLCBtLCBwLW0pOyBzW3AtbV0gPSAwOworCXByaW50ZigiZGVwc18lcyA6PSBcXFxuIiwgdGFyZ2V0KTsKKwltID0gcCsxOworCisJY2xlYXJfY29uZmlnKCk7CisKKwl3aGlsZSAobSA8IGVuZCkgeworCQl3aGlsZSAobSA8IGVuZCAmJiAoKm0gPT0gJyAnIHx8ICptID09ICdcXCcgfHwgKm0gPT0gJ1xuJykpCisJCQltKys7CisJCXAgPSBtOworCQl3aGlsZSAocCA8IGVuZCAmJiAqcCAhPSAnICcpIHArKzsKKwkJaWYgKHAgPT0gZW5kKSB7CisJCQlkbyBwLS07IHdoaWxlICghaXNhbG51bSgqcCkpOworCQkJcCsrOworCQl9CisJCW1lbWNweShzLCBtLCBwLW0pOyBzW3AtbV0gPSAwOworCQlpZiAoc3RycmNtcChzLCAiaW5jbHVkZS9saW51eC9hdXRvY29uZi5oIikgJiYKKwkJICAgIHN0cnJjbXAocywgImFyY2gvdW0vaW5jbHVkZS91bWwtY29uZmlnLmgiKSAmJgorCQkgICAgc3RycmNtcChzLCAiLnZlciIpKSB7CisJCQlwcmludGYoIiAgJXMgXFxcbiIsIHMpOworCQkJZG9fY29uZmlnX2ZpbGUocyk7CisJCX0KKwkJbSA9IHAgKyAxOworCX0KKwlwcmludGYoIlxuJXM6ICQoZGVwc18lcylcblxuIiwgdGFyZ2V0LCB0YXJnZXQpOworCXByaW50ZigiJChkZXBzXyVzKTpcbiIsIHRhcmdldCk7Cit9CisKK3ZvaWQgcHJpbnRfZGVwcyh2b2lkKQoreworCXN0cnVjdCBzdGF0IHN0OworCWludCBmZDsKKwl2b2lkICptYXA7CisKKwlmZCA9IG9wZW4oZGVwZmlsZSwgT19SRE9OTFkpOworCWlmIChmZCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJmaXhkZXA6ICIpOworCQlwZXJyb3IoZGVwZmlsZSk7CisJCWV4aXQoMik7CisJfQorCWZzdGF0KGZkLCAmc3QpOworCWlmIChzdC5zdF9zaXplID09IDApIHsKKwkJZnByaW50ZihzdGRlcnIsImZpeGRlcDogJXMgaXMgZW1wdHlcbiIsZGVwZmlsZSk7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuOworCX0KKwltYXAgPSBtbWFwKE5VTEwsIHN0LnN0X3NpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKKwlpZiAoKGxvbmcpIG1hcCA9PSAtMSkgeworCQlwZXJyb3IoImZpeGRlcDogbW1hcCIpOworCQljbG9zZShmZCk7CisJCXJldHVybjsKKwl9CisKKwlwYXJzZV9kZXBfZmlsZShtYXAsIHN0LnN0X3NpemUpOworCisJbXVubWFwKG1hcCwgc3Quc3Rfc2l6ZSk7CisKKwljbG9zZShmZCk7Cit9CisKK3ZvaWQgdHJhcHModm9pZCkKK3sKKwlzdGF0aWMgY2hhciB0ZXN0W10gX19hdHRyaWJ1dGVfXygoYWxpZ25lZChzaXplb2YoaW50KSkpKSA9ICJDT05GIjsKKworCWlmICgqKGludCAqKXRlc3QgIT0gSU5UX0NPTkYpIHsKKwkJZnByaW50ZihzdGRlcnIsICJmaXhkZXA6IHNpemVvZihpbnQpICE9IDQgb3Igd3JvbmcgZW5kaWFuZXNzPyAlI3hcbiIsCisJCQkqKGludCAqKXRlc3QpOworCQlleGl0KDIpOworCX0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwl0cmFwcygpOworCisJaWYgKGFyZ2MgIT0gNCkKKwkJdXNhZ2UoKTsKKworCWRlcGZpbGUgPSBhcmd2WzFdOworCXRhcmdldCA9IGFyZ3ZbMl07CisJY21kbGluZSA9IGFyZ3ZbM107CisKKwlwcmludF9jbWRsaW5lKCk7CisJcHJpbnRfZGVwcygpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2Jhc2ljL3NwbGl0LWluY2x1ZGUuYyBiL3NjcmlwdHMvYmFzaWMvc3BsaXQtaW5jbHVkZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwZmM0ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2Jhc2ljL3NwbGl0LWluY2x1ZGUuYwpAQCAtMCwwICsxLDIyNiBAQAorLyoKKyAqIHNwbGl0LWluY2x1ZGUuYworICoKKyAqIENvcHlyaWdodCBhYmFuZG9uZWQsIE1pY2hhZWwgQ2hhc3RhaW4sIDxtYWlsdG86bWVjQHNob3V0Lm5ldD4uCisgKiBUaGlzIGlzIGEgQyB2ZXJzaW9uIG9mIHN5bmNkZXAucGwgYnkgV2VybmVyIEFsbWVzYmVyZ2VyLgorICoKKyAqIFRoaXMgcHJvZ3JhbSB0YWtlcyBhdXRvY29uZi5oIGFzIGlucHV0IGFuZCBvdXRwdXRzIGEgZGlyZWN0b3J5IGZ1bGwKKyAqIG9mIG9uZS1saW5lIGluY2x1ZGUgZmlsZXMsIG1lcmdpbmcgb250byB0aGUgb2xkIHZhbHVlcy4KKyAqCisgKiBUaGluayBvZiB0aGUgY29uZmlndXJhdGlvbiBvcHRpb25zIGFzIGtleS12YWx1ZSBwYWlycy4gIFRoZW4gdGhlcmUKKyAqIGFyZSBmaXZlIGNhc2VzOgorICoKKyAqICAgIGtleSAgICAgIG9sZCB2YWx1ZSAgIG5ldyB2YWx1ZSAgIGFjdGlvbgorICoKKyAqICAgIEtFWS0xICAgIFZBTFVFLTEgICAgIFZBTFVFLTEgICAgIGxlYXZlIGZpbGUgYWxvbmUKKyAqICAgIEtFWS0yICAgIFZBTFVFLTJBICAgIFZBTFVFLTJCICAgIHdyaXRlIFZBTFVFLTJCIGludG8gZmlsZQorICogICAgS0VZLTMgICAgLSAgICAgICAgICAgVkFMVUUtMyAgICAgd3JpdGUgVkFMVUUtMyAgaW50byBmaWxlCisgKiAgICBLRVktNCAgICBWQUxVRS00ICAgICAtICAgICAgICAgICB3cml0ZSBhbiBlbXB0eSBmaWxlCisgKiAgICBLRVktNSAgICAoZW1wdHkpICAgICAtICAgICAgICAgICBsZWF2ZSBvbGQgZW1wdHkgZmlsZSBhbG9uZQorICovCisKKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2RlZmluZSBFUlJPUl9FWElUKHN0ckV4aXQpCQkJCQkJXAorICAgIHsJCQkJCQkJCQlcCisJY29uc3QgaW50IGVycm5vU2F2ZSA9IGVycm5vOwkJCQkJXAorCWZwcmludGYoc3RkZXJyLCAiJXM6ICIsIHN0cl9teV9uYW1lKTsJCQkJXAorCWVycm5vID0gZXJybm9TYXZlOwkJCQkJCVwKKwlwZXJyb3IoKHN0ckV4aXQpKTsJCQkJCQlcCisJZXhpdCgxKTsJCQkJCQkJXAorICAgIH0KKworCisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICogYXJndiBbXSkKK3sKKyAgICBjb25zdCBjaGFyICogc3RyX215X25hbWU7CisgICAgY29uc3QgY2hhciAqIHN0cl9maWxlX2F1dG9jb25mOworICAgIGNvbnN0IGNoYXIgKiBzdHJfZGlyX2NvbmZpZzsKKworICAgIEZJTEUgKiBmcF9jb25maWc7CisgICAgRklMRSAqIGZwX3RhcmdldDsKKyAgICBGSUxFICogZnBfZmluZDsKKworICAgIGludCBidWZmZXJfc2l6ZTsKKworICAgIGNoYXIgKiBsaW5lOworICAgIGNoYXIgKiBvbGRfbGluZTsKKyAgICBjaGFyICogbGlzdF90YXJnZXQ7CisgICAgY2hhciAqIHB0YXJnZXQ7CisKKyAgICBzdHJ1Y3Qgc3RhdCBzdGF0X2J1ZjsKKworICAgIC8qIENoZWNrIGFyZyBjb3VudC4gKi8KKyAgICBpZiAoYXJnYyAhPSAzKQorICAgIHsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiB3cm9uZyBudW1iZXIgb2YgYXJndW1lbnRzLlxuIiwgYXJndlswXSk7CisJZXhpdCgxKTsKKyAgICB9CisKKyAgICBzdHJfbXlfbmFtZSAgICAgICA9IGFyZ3ZbMF07CisgICAgc3RyX2ZpbGVfYXV0b2NvbmYgPSBhcmd2WzFdOworICAgIHN0cl9kaXJfY29uZmlnICAgID0gYXJndlsyXTsKKworICAgIC8qIEZpbmQgYSBidWZmZXIgc2l6ZS4gKi8KKyAgICBpZiAoc3RhdChzdHJfZmlsZV9hdXRvY29uZiwgJnN0YXRfYnVmKSAhPSAwKQorCUVSUk9SX0VYSVQoc3RyX2ZpbGVfYXV0b2NvbmYpOworICAgIGJ1ZmZlcl9zaXplID0gMiAqIHN0YXRfYnVmLnN0X3NpemUgKyA0MDk2OworCisgICAgLyogQWxsb2NhdGUgYnVmZmVycy4gKi8KKyAgICBpZiAoIChsaW5lICAgICAgICA9IG1hbGxvYyhidWZmZXJfc2l6ZSkpID09IE5VTEwKKyAgICB8fCAgIChvbGRfbGluZSAgICA9IG1hbGxvYyhidWZmZXJfc2l6ZSkpID09IE5VTEwKKyAgICB8fCAgIChsaXN0X3RhcmdldCA9IG1hbGxvYyhidWZmZXJfc2l6ZSkpID09IE5VTEwgKQorCUVSUk9SX0VYSVQoc3RyX2ZpbGVfYXV0b2NvbmYpOworCisgICAgLyogT3BlbiBhdXRvY29uZmlnIGZpbGUuICovCisgICAgaWYgKChmcF9jb25maWcgPSBmb3BlbihzdHJfZmlsZV9hdXRvY29uZiwgInIiKSkgPT0gTlVMTCkKKwlFUlJPUl9FWElUKHN0cl9maWxlX2F1dG9jb25mKTsKKworICAgIC8qIE1ha2Ugb3V0cHV0IGRpcmVjdG9yeSBpZiBuZWVkZWQuICovCisgICAgaWYgKHN0YXQoc3RyX2Rpcl9jb25maWcsICZzdGF0X2J1ZikgIT0gMCkKKyAgICB7CisJaWYgKG1rZGlyKHN0cl9kaXJfY29uZmlnLCAwNzU1KSAhPSAwKQorCSAgICBFUlJPUl9FWElUKHN0cl9kaXJfY29uZmlnKTsKKyAgICB9CisKKyAgICAvKiBDaGFuZ2UgdG8gb3V0cHV0IGRpcmVjdG9yeS4gKi8KKyAgICBpZiAoY2hkaXIoc3RyX2Rpcl9jb25maWcpICE9IDApCisJRVJST1JfRVhJVChzdHJfZGlyX2NvbmZpZyk7CisKKyAgICAvKiBQdXQgaW5pdGlhbCBzZXBhcmF0b3IgaW50byB0YXJnZXQgbGlzdC4gKi8KKyAgICBwdGFyZ2V0ID0gbGlzdF90YXJnZXQ7CisgICAgKnB0YXJnZXQrKyA9ICdcbic7CisKKyAgICAvKiBSZWFkIGNvbmZpZyBsaW5lcy4gKi8KKyAgICB3aGlsZSAoZmdldHMobGluZSwgYnVmZmVyX3NpemUsIGZwX2NvbmZpZykpCisgICAgeworCWNvbnN0IHNpZ25lZCBjaGFyICogc3RyX2NvbmZpZzsKKwlpbnQgaXNfc2FtZTsKKwlpbnQgaXRhcmdldDsKKworCWlmIChsaW5lWzBdICE9ICcjJykKKwkgICAgY29udGludWU7CisJaWYgKChzdHJfY29uZmlnID0gc3Ryc3RyKGxpbmUsICJDT05GSUdfIikpID09IE5VTEwpCisJICAgIGNvbnRpbnVlOworCisJLyogTWFrZSB0aGUgb3V0cHV0IGZpbGUgbmFtZS4gKi8KKwlzdHJfY29uZmlnICs9IHNpemVvZigiQ09ORklHXyIpIC0gMTsKKwlmb3IgKGl0YXJnZXQgPSAwOyAhaXNzcGFjZShzdHJfY29uZmlnW2l0YXJnZXRdKTsgaXRhcmdldCsrKQorCXsKKwkgICAgaW50IGMgPSAodW5zaWduZWQgY2hhcikgc3RyX2NvbmZpZ1tpdGFyZ2V0XTsKKwkgICAgaWYgKGlzdXBwZXIoYykpIGMgPSB0b2xvd2VyKGMpOworCSAgICBpZiAoYyA9PSAnXycpICAgYyA9ICcvJzsKKwkgICAgcHRhcmdldFtpdGFyZ2V0XSA9IGM7CisJfQorCXB0YXJnZXRbaXRhcmdldCsrXSA9ICcuJzsKKwlwdGFyZ2V0W2l0YXJnZXQrK10gPSAnaCc7CisJcHRhcmdldFtpdGFyZ2V0KytdID0gJ1wwJzsKKworCS8qIENoZWNrIGZvciBleGlzdGluZyBmaWxlLiAqLworCWlzX3NhbWUgPSAwOworCWlmICgoZnBfdGFyZ2V0ID0gZm9wZW4ocHRhcmdldCwgInIiKSkgIT0gTlVMTCkKKwl7CisJICAgIGZnZXRzKG9sZF9saW5lLCBidWZmZXJfc2l6ZSwgZnBfdGFyZ2V0KTsKKwkgICAgaWYgKGZjbG9zZShmcF90YXJnZXQpICE9IDApCisJCUVSUk9SX0VYSVQocHRhcmdldCk7CisJICAgIGlmICghc3RyY21wKGxpbmUsIG9sZF9saW5lKSkKKwkJaXNfc2FtZSA9IDE7CisJfQorCisJaWYgKCFpc19zYW1lKQorCXsKKwkgICAgLyogQXV0by1jcmVhdGUgZGlyZWN0b3JpZXMuICovCisJICAgIGludCBpc2xhc2g7CisJICAgIGZvciAoaXNsYXNoID0gMDsgaXNsYXNoIDwgaXRhcmdldDsgaXNsYXNoKyspCisJICAgIHsKKwkJaWYgKHB0YXJnZXRbaXNsYXNoXSA9PSAnLycpCisJCXsKKwkJICAgIHB0YXJnZXRbaXNsYXNoXSA9ICdcMCc7CisJCSAgICBpZiAoc3RhdChwdGFyZ2V0LCAmc3RhdF9idWYpICE9IDAKKwkJICAgICYmICBta2RpcihwdGFyZ2V0LCAwNzU1KSAgICAgIT0gMCkKKwkJCUVSUk9SX0VYSVQoIHB0YXJnZXQgKTsKKwkJICAgIHB0YXJnZXRbaXNsYXNoXSA9ICcvJzsKKwkJfQorCSAgICB9CisKKwkgICAgLyogV3JpdGUgdGhlIGZpbGUuICovCisJICAgIGlmICgoZnBfdGFyZ2V0ID0gZm9wZW4ocHRhcmdldCwgInciICkpID09IE5VTEwpCisJCUVSUk9SX0VYSVQocHRhcmdldCk7CisJICAgIGZwdXRzKGxpbmUsIGZwX3RhcmdldCk7CisJICAgIGlmIChmZXJyb3IoZnBfdGFyZ2V0KSB8fCBmY2xvc2UoZnBfdGFyZ2V0KSAhPSAwKQorCQlFUlJPUl9FWElUKHB0YXJnZXQpOworCX0KKworCS8qIFVwZGF0ZSB0YXJnZXQgbGlzdCAqLworCXB0YXJnZXQgKz0gaXRhcmdldDsKKwkqKHB0YXJnZXQtMSkgPSAnXG4nOworICAgIH0KKworICAgIC8qCisgICAgICogQ2xvc2UgYXV0b2NvbmZpZyBmaWxlLgorICAgICAqIFRlcm1pbmF0ZSB0aGUgdGFyZ2V0IGxpc3QuCisgICAgICovCisgICAgaWYgKGZjbG9zZShmcF9jb25maWcpICE9IDApCisJRVJST1JfRVhJVChzdHJfZmlsZV9hdXRvY29uZik7CisgICAgKnB0YXJnZXQgPSAnXDAnOworCisgICAgLyoKKyAgICAgKiBGaXggdXAgZXhpc3RpbmcgZmlsZXMgd2hpY2ggaGF2ZSBubyBuZXcgdmFsdWUuCisgICAgICogVGhpcyBpcyBDYXNlIDQgYW5kIENhc2UgNS4KKyAgICAgKgorICAgICAqIEkgcmUtcmVhZCB0aGUgdHJlZSBhbmQgZmlsdGVyIGl0IGFnYWluc3QgbGlzdF90YXJnZXQuCisgICAgICogVGhpcyBpcyBjcnVkZS4gIEJ1dCBpdCBhdm9pZHMgZGF0YSBjb3BpZXMuICBBbHNvLCBsaXN0X3RhcmdldAorICAgICAqIGlzIGNvbXBhY3QgYW5kIGNvbnRpZ3VvdXMsIHNvIGl0IGVhc2lseSBmaXRzIGludG8gY2FjaGUuCisgICAgICoKKyAgICAgKiBOb3RpY2UgdGhhdCBsaXN0X3RhcmdldCBjb250YWlucyBzdHJpbmdzIHNlcGFyYXRlZCBieSBcbiwKKyAgICAgKiB3aXRoIGEgXG4gYmVmb3JlIHRoZSBmaXJzdCBzdHJpbmcgYW5kIGFmdGVyIHRoZSBsYXN0LgorICAgICAqIGZnZXRzIGdpdmVzIHRoZSBpbmNvbWluZyBuYW1lcyBhIHRlcm1pbmF0aW5nIFxuLgorICAgICAqIFNvIGJ5IGhhdmluZyBhbiBpbml0aWFsIFxuLCBzdHJzdHIgd2lsbCBmaW5kIGV4YWN0IG1hdGNoZXMuCisgICAgICovCisKKyAgICBmcF9maW5kID0gcG9wZW4oImZpbmQgKiAtdHlwZSBmIC1uYW1lIFwiKi5oXCIgLXByaW50IiwgInIiKTsKKyAgICBpZiAoZnBfZmluZCA9PSAwKQorCUVSUk9SX0VYSVQoICJmaW5kIiApOworCisgICAgbGluZVswXSA9ICdcbic7CisgICAgd2hpbGUgKGZnZXRzKGxpbmUrMSwgYnVmZmVyX3NpemUsIGZwX2ZpbmQpKQorICAgIHsKKwlpZiAoc3Ryc3RyKGxpc3RfdGFyZ2V0LCBsaW5lKSA9PSBOVUxMKQorCXsKKwkgICAgLyoKKwkgICAgICogVGhpcyBpcyBhbiBvbGQgZmlsZSB3aXRoIG5vIENPTkZJR18qIGZsYWcgaW4gYXV0b2NvbmYuaC4KKwkgICAgICovCisKKwkgICAgLyogRmlyc3Qgc3RyaXAgdGhlIFxuLiAqLworCSAgICBsaW5lW3N0cmxlbihsaW5lKS0xXSA9ICdcMCc7CisKKwkgICAgLyogR3JhYiBzaXplLiAqLworCSAgICBpZiAoc3RhdChsaW5lKzEsICZzdGF0X2J1ZikgIT0gMCkKKwkJRVJST1JfRVhJVChsaW5lKTsKKworCSAgICAvKiBJZiBmaWxlIGlzIG5vdCBlbXB0eSwgbWFrZSBpdCBlbXB0eSBhbmQgZ2l2ZSBpdCBhIGZyZXNoIGRhdGUuICovCisJICAgIGlmIChzdGF0X2J1Zi5zdF9zaXplICE9IDApCisJICAgIHsKKwkJaWYgKChmcF90YXJnZXQgPSBmb3BlbihsaW5lKzEsICJ3IikpID09IE5VTEwpCisJCSAgICBFUlJPUl9FWElUKGxpbmUpOworCQlpZiAoZmNsb3NlKGZwX3RhcmdldCkgIT0gMCkKKwkJICAgIEVSUk9SX0VYSVQobGluZSk7CisJICAgIH0KKwl9CisgICAgfQorCisgICAgaWYgKHBjbG9zZShmcF9maW5kKSAhPSAwKQorCUVSUk9SX0VYSVQoImZpbmQiKTsKKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9iaW4yYy5jIGIvc2NyaXB0cy9iaW4yYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2ZGQyYmMKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2JpbjJjLmMKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIFVubG92ZWQgcHJvZ3JhbSB0byBjb252ZXJ0IGEgYmluYXJ5IG9uIHN0ZGluIHRvIGEgQyBpbmNsdWRlIG9uIHN0ZG91dAorICoKKyAqIEphbiAxOTk5IE1hdHQgTWFja2FsbCA8bXBtQHNlbGVuaWMuY29tPgorICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IGNoLCB0b3RhbD0wOworCisJaWYgKGFyZ2MgPiAxKQorCQlwcmludGYoImNvbnN0IGNoYXIgJXNbXSAlcz1cbiIsCisJCQlhcmd2WzFdLCBhcmdjID4gMiA/IGFyZ3ZbMl0gOiAiIik7CisKKwlkbyB7CisJCXByaW50ZigiXHRcIiIpOworCQl3aGlsZSAoKGNoID0gZ2V0Y2hhcigpKSAhPSBFT0YpCisJCXsKKwkJCXRvdGFsKys7CisJCQlwcmludGYoIlxceCUwMngiLGNoKTsKKwkJCWlmICh0b3RhbCAlIDE2ID09IDApCisJCQkJYnJlYWs7CisJCX0KKwkJcHJpbnRmKCJcIlxuIik7CisJfSB3aGlsZSAoY2ggIT0gRU9GKTsKKworCWlmIChhcmdjID4gMSkKKwkJcHJpbnRmKCJcdDtcblxuY29uc3QgaW50ICVzX3NpemUgPSAlZDtcbiIsIGFyZ3ZbMV0sIHRvdGFsKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9iaW5vZmZzZXQuYyBiL3NjcmlwdHMvYmlub2Zmc2V0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxMzA5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvYmlub2Zmc2V0LmMKQEAgLTAsMCArMSwxNjMgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGJpbm9mZnNldC5jCisgKiAoQykgMjAwMiBSYW5keSBEdW5sYXAgPHJkZHVubGFwQG9zZGwub3JnPgorCisjICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyMgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorIyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisjICAgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyMKKyMgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyMgICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorIyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyMgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorIworIyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisjICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyMgICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKworIyBiaW5vZmZzZXQuYzoKKyMgLSBzZWFyY2hlcyBhIChiaW5hcnkpIGZpbGUgZm9yIGEgc3BlY2lmaWVkIChiaW5hcnkpIHBhdHRlcm4KKyMgLSByZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIGxvY2F0ZWQgcGF0dGVybiBvciB+MCBpZiBub3QgZm91bmQKKyMgLSBleGl0cyB3aXRoIGV4aXQgc3RhdHVzIDAgbm9ybWFsbHkgb3Igbm9uLTAgaWYgcGF0dGVybiBpcyBub3QgZm91bmQKKyMgICBvciBhbnkgb3RoZXIgZXJyb3Igb2NjdXJzLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorCisjZGVmaW5lIFZFUlNJT04JCSIwLjEiCisjZGVmaW5lIEJVRl9TSVpFCSgxNiAqIDEwMjQpCisjZGVmaW5lIFBBVF9TSVpFCTEwMAorCitjaGFyCQkqcHJvZ25hbWU7CitjaGFyCQkqaW5wdXRuYW1lOworaW50CQlpbnB1dGZkOwordW5zaWduZWQgaW50CWJpeDsJCQkvKiBidWYgaW5kZXggKi8KK3Vuc2lnbmVkIGNoYXIJcGF0dGVybnMgW1BBVF9TSVpFXSA9IHswfTsgLyogYnl0ZS1zaXplZCBwYXR0ZXJuIGFycmF5ICovCitpbnQJCXBhdF9sZW47CQkvKiBhY3R1YWwgbnVtYmVyIG9mIHBhdHRlcm4gYnl0ZXMgKi8KK3Vuc2lnbmVkIGNoYXIJKm1hZHI7CQkJLyogbW1hcCBhZGRyZXNzICovCitzaXplX3QJCWZpbGVzaXplOworaW50CQludW1fbWF0Y2hlcyA9IDA7CitvZmZfdAkJZmlyc3Rsb2MgPSAwOworCit2b2lkIHVzYWdlICh2b2lkKQoreworCWZwcmludGYgKHN0ZGVyciwgIiVzIHZlci4gJXNcbiIsIHByb2duYW1lLCBWRVJTSU9OKTsKKwlmcHJpbnRmIChzdGRlcnIsICJ1c2FnZTogICVzIGZpbGVuYW1lIHBhdHRlcm5fYnl0ZXNcbiIsCisJCQlwcm9nbmFtZSk7CisJZnByaW50ZiAoc3RkZXJyLCAiICAgICAgICBbcHJpbnRzIGxvY2F0aW9uIG9mIHBhdHRlcm5fYnl0ZXMgaW4gZmlsZV1cbiIpOworCWV4aXQgKDEpOworfQorCit2b2lkIGdldF9wYXR0ZXJuIChpbnQgcGF0X2NvdW50LCBjaGFyICpwYXRzIFtdKQoreworCWludCBpeCwgZXJyLCB0bXA7CisKKyNpZmRlZiBERUJVRworCWZwcmludGYgKHN0ZGVyciwiZ2V0X3BhdHRlcm46IGNvdW50ID0gJWRcbiIsIHBhdF9jb3VudCk7CisJZm9yIChpeCA9IDA7IGl4IDwgcGF0X2NvdW50OyBpeCsrKQorCQlmcHJpbnRmIChzdGRlcnIsICIgIHBhdCAjICVkOiAgWyVzXVxuIiwgaXgsIHBhdHNbaXhdKTsKKyNlbmRpZgorCisJZm9yIChpeCA9IDA7IGl4IDwgcGF0X2NvdW50OyBpeCsrKSB7CisJCXRtcCA9IDA7CisJCWVyciA9IHNzY2FuZiAocGF0c1tpeF0sICIlNWkiLCAmdG1wKTsKKwkJaWYgKGVyciAhPSAxIHx8IHRtcCA+IDB4ZmYpIHsKKwkJCWZwcmludGYgKHN0ZGVyciwgInBhdHRlcm4gb3IgdmFsdWUgZXJyb3IgaW4gcGF0dGVybiAjICVkIFslc11cbiIsCisJCQkJCWl4LCBwYXRzW2l4XSk7CisJCQl1c2FnZSAoKTsKKwkJfQorCQlwYXR0ZXJucyBbaXhdID0gdG1wOworCX0KKwlwYXRfbGVuID0gcGF0X2NvdW50OworfQorCit2b2lkIHNlYXJjaF9wYXR0ZXJuICh2b2lkKQoreworCWZvciAoYml4ID0gMDsgYml4IDwgZmlsZXNpemU7IGJpeCsrKSB7CisJCWlmIChtYWRyW2JpeF0gPT0gcGF0dGVybnNbMF0pIHsKKwkJCWlmIChtZW1jbXAgKCZtYWRyW2JpeF0sIHBhdHRlcm5zLCBwYXRfbGVuKSA9PSAwKSB7CisJCQkJaWYgKG51bV9tYXRjaGVzID09IDApCisJCQkJCWZpcnN0bG9jID0gYml4OworCQkJCW51bV9tYXRjaGVzKys7CisJCQl9CisJCX0KKwl9Cit9CisKKyNpZmRlZiBOT1RERUYKK3NpemVfdCBnZXRfZmlsZXNpemUgKGludCBmZCkKK3sKKwlvZmZfdCBlbmRfb2ZmID0gbHNlZWsgKGZkLCAwLCBTRUVLX0VORCk7CisJbHNlZWsgKGZkLCAwLCBTRUVLX1NFVCk7CisJcmV0dXJuIChzaXplX3QpIGVuZF9vZmY7Cit9CisjZW5kaWYKKworc2l6ZV90IGdldF9maWxlc2l6ZSAoaW50IGZkKQoreworCWludCBlcnI7CisJc3RydWN0IHN0YXQgc3RhdDsKKworCWVyciA9IGZzdGF0IChmZCwgJnN0YXQpOworCWZwcmludGYgKHN0ZGVyciwgImZpbGVzaXplOiAlbGRcbiIsIGVyciA8IDAgPyAobG9uZyllcnIgOiBzdGF0LnN0X3NpemUpOworCWlmIChlcnIgPCAwKQorCQlyZXR1cm4gZXJyOworCXJldHVybiAoc2l6ZV90KSBzdGF0LnN0X3NpemU7Cit9CisKK2ludCBtYWluIChpbnQgYXJnYywgY2hhciAqYXJndiBbXSkKK3sKKwlwcm9nbmFtZSA9IGFyZ3ZbMF07CisKKwlpZiAoYXJnYyA8IDMpCisJCXVzYWdlICgpOworCisJZ2V0X3BhdHRlcm4gKGFyZ2MgLSAyLCBhcmd2ICsgMik7CisKKwlpbnB1dG5hbWUgPSBhcmd2WzFdOworCisJaW5wdXRmZCA9IG9wZW4gKGlucHV0bmFtZSwgT19SRE9OTFkpOworCWlmIChpbnB1dGZkID09IC0xKSB7CisJCWZwcmludGYgKHN0ZGVyciwgIiVzOiBjYW5ub3Qgb3BlbiAnJXMnXG4iLAorCQkJCXByb2duYW1lLCBpbnB1dG5hbWUpOworCQlleGl0ICgzKTsKKwl9CisKKwlmaWxlc2l6ZSA9IGdldF9maWxlc2l6ZSAoaW5wdXRmZCk7CisKKwltYWRyID0gbW1hcCAoMCwgZmlsZXNpemUsIFBST1RfUkVBRCwgTUFQX1BSSVZBVEUsIGlucHV0ZmQsIDApOworCWlmIChtYWRyID09IE1BUF9GQUlMRUQpIHsKKwkJZnByaW50ZiAoc3RkZXJyLCAibW1hcCBlcnJvciA9ICVkXG4iLCBlcnJubyk7CisJCWNsb3NlIChpbnB1dGZkKTsKKwkJZXhpdCAoNCk7CisJfQorCisJc2VhcmNoX3BhdHRlcm4gKCk7CisKKwlpZiAobXVubWFwIChtYWRyLCBmaWxlc2l6ZSkpCisJCWZwcmludGYgKHN0ZGVyciwgIm11bm1hcCBlcnJvciA9ICVkXG4iLCBlcnJubyk7CisKKwlpZiAoY2xvc2UgKGlucHV0ZmQpKQorCQlmcHJpbnRmIChzdGRlcnIsICIlczogZXJyb3IgJWQgY2xvc2luZyAnJXMnXG4iLAorCQkJCXByb2duYW1lLCBlcnJubywgaW5wdXRuYW1lKTsKKworCWZwcmludGYgKHN0ZGVyciwgIm51bWJlciBvZiBwYXR0ZXJuIG1hdGNoZXMgPSAlZFxuIiwgbnVtX21hdGNoZXMpOworCWlmIChudW1fbWF0Y2hlcyA9PSAwKQorCQlmaXJzdGxvYyA9IH4wOworCXByaW50ZiAoIiVsZFxuIiwgZmlyc3Rsb2MpOworCWZwcmludGYgKHN0ZGVyciwgIiVsZFxuIiwgZmlyc3Rsb2MpOworCisJZXhpdCAobnVtX21hdGNoZXMgPyAwIDogMik7Cit9CisKKy8qIGVuZCBiaW5vZmZzZXQuYyAqLwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jaGVja2NvbmZpZy5wbCBiL3NjcmlwdHMvY2hlY2tjb25maWcucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2ExZjIzMQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvY2hlY2tjb25maWcucGwKQEAgLTAsMCArMSw2NSBAQAorIyEgL3Vzci9iaW4vcGVybAorIworIyBjaGVja2NvbmZpZzogZmluZCB1c2VzIG9mIENPTkZJR18qIG5hbWVzIHdpdGhvdXQgbWF0Y2hpbmcgZGVmaW5pdGlvbnMuCisjIENvcHlyaWdodCBhYmFuZG9uZWQsIDE5OTgsIE1pY2hhZWwgRWxpemFiZXRoIENoYXN0YWluIDxtYWlsdG86bWVjQHNob3V0Lm5ldD4uCisKK3VzZSBpbnRlZ2VyOworCiskfCA9IDE7CisKK2ZvcmVhY2ggJGZpbGUgKEBBUkdWKQoreworICAgICMgT3BlbiB0aGlzIGZpbGUuCisgICAgb3BlbihGSUxFLCAkZmlsZSkgfHwgZGllICJDYW4ndCBvcGVuICRmaWxlOiAkIVxuIjsKKworICAgICMgSW5pdGlhbGl6ZSB2YXJpYWJsZXMuCisgICAgbXkgJGZJbkNvbW1lbnQgICA9IDA7CisgICAgbXkgJGZJblN0cmluZyAgICA9IDA7CisgICAgbXkgJGZVc2VDb25maWcgICA9IDA7CisgICAgbXkgJGlMaW51eENvbmZpZyA9IDA7CisgICAgbXkgJWNvbmZpZ0xpc3QgICA9ICgpOworCisgICAgTElORTogd2hpbGUgKCA8RklMRT4gKQorICAgIHsKKwkjIFN0cmlwIGNvbW1lbnRzLgorCSRmSW5Db21tZW50ICYmIChzK14uKj9cKi8rICtvID8gKCRmSW5Db21tZW50ID0gMCkgOiBuZXh0KTsKKwltKy9cKitvICYmIChzKy9cKi4qP1wqLysgK2dvLCAocysvXCouKiQrICtvICYmICgkZkluQ29tbWVudCA9IDEpKSk7CisKKwkjIFBpY2sgdXAgZGVmaW5pdGlvbnMuCisJaWYgKCBtL15ccyojL28gKQorCXsKKwkgICAgJGlMaW51eENvbmZpZyAgICAgID0gJC4gaWYgbS9eXHMqI1xzKmluY2x1ZGVccyoibGludXhcL2NvbmZpZ1wuaCIvbzsKKwkgICAgJGNvbmZpZ0xpc3R7dWMgJDF9ID0gMSAgaWYgbS9eXHMqI1xzKmluY2x1ZGVccyoiY29uZmlnXC8oXFMqKVwuaCIvbzsKKwl9CisKKwkjIFN0cmlwIHN0cmluZ3MuCisJJGZJblN0cmluZyAmJiAocyteLio/IisgK28gPyAoJGZJblN0cmluZyA9IDApIDogbmV4dCk7CisJbSsiK28gJiYgKHMrIi4qPyIrICtnbywgKHMrIi4qJCsgK28gJiYgKCRmSW5TdHJpbmcgPSAxKSkpOworCisJIyBQaWNrIHVwIGRlZmluaXRpb25zLgorCWlmICggbS9eXHMqIy9vICkKKwl7CisJICAgICRpTGludXhDb25maWcgICAgICA9ICQuIGlmIG0vXlxzKiNccyppbmNsdWRlXHMqPGxpbnV4XC9jb25maWdcLmg+L287CisJICAgICRjb25maWdMaXN0e3VjICQxfSA9IDEgIGlmIG0vXlxzKiNccyppbmNsdWRlXHMqPGNvbmZpZ1wvKFxTKilcLmg+L287CisJICAgICRjb25maWdMaXN0eyQxfSAgICA9IDEgIGlmIG0vXlxzKiNccypkZWZpbmVccytDT05GSUdfKFx3KikvbzsKKwkgICAgJGNvbmZpZ0xpc3R7JDF9ICAgID0gMSAgaWYgbS9eXHMqI1xzKnVuZGVmXHMrQ09ORklHXyhcdyopL287CisJfQorCisJIyBMb29rIGZvciB1c2FnZXMuCisJbmV4dCB1bmxlc3MgbS9DT05GSUdfL287CisJV09SRDogd2hpbGUgKCBtL1xiQ09ORklHXyhcdyspL29nICkKKwl7CisJICAgICRmVXNlQ29uZmlnID0gMTsKKwkgICAgbGFzdCBMSU5FIGlmICRpTGludXhDb25maWc7CisJICAgIG5leHQgV09SRCBpZiBleGlzdHMgJGNvbmZpZ0xpc3R7JDF9OworCSAgICBwcmludCAiJGZpbGU6ICQuOiBuZWVkIENPTkZJR18kMS5cbiI7CisJICAgICRjb25maWdMaXN0eyQxfSA9IDA7CisJfQorICAgIH0KKworICAgICMgUmVwb3J0IHN1cGVyZmx1b3VzIGluY2x1ZGVzLgorICAgIGlmICggJGlMaW51eENvbmZpZyAmJiAhICRmVXNlQ29uZmlnICkKKwl7IHByaW50ICIkZmlsZTogJGlMaW51eENvbmZpZzogbGludXgvY29uZmlnLmggbm90IG5lZWRlZC5cbiI7IH0KKworICAgIGNsb3NlKEZJTEUpOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jaGVja2luY2x1ZGVzLnBsIGIvc2NyaXB0cy9jaGVja2luY2x1ZGVzLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhlNmI3MTYKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2NoZWNraW5jbHVkZXMucGwKQEAgLTAsMCArMSwyNCBAQAorIyEvdXNyL2Jpbi9wZXJsCisjCisjIGNoZWNraW5jbHVkZXM6IEZpbmQgZmlsZXMgaW5jbHVkZWQgbW9yZSB0aGFuIG9uY2UgaW4gKG90aGVyKSBmaWxlcy4KKyMgQ29weXJpZ2h0IGFiYW5kb25lZCwgMjAwMCwgTmllbHMgS3Jpc3RpYW4gQmVjaCBKZW5zZW4gPG5rYmpAaW1hZ2UuZGs+LgorCitmb3JlYWNoICRmaWxlIChAQVJHVikgeworCW9wZW4oRklMRSwgJGZpbGUpIG9yIGRpZSAiQ2Fubm90IG9wZW4gJGZpbGU6ICQhLlxuIjsKKworCW15ICVpbmNsdWRlZGZpbGVzID0gKCk7CisKKwl3aGlsZSAoPEZJTEU+KSB7CisJCWlmIChtL15ccyojXHMqaW5jbHVkZVxzKls8Il0oXFMqKVs+Il0vbykgeworCQkJKyskaW5jbHVkZWRmaWxlc3skMX07CisJCX0KKwl9CisJCisJZm9yZWFjaCAkZmlsZW5hbWUgKGtleXMgJWluY2x1ZGVkZmlsZXMpIHsKKwkJaWYgKCRpbmNsdWRlZGZpbGVzeyRmaWxlbmFtZX0gPiAxKSB7CisJCQlwcmludCAiJGZpbGU6ICRmaWxlbmFtZSBpcyBpbmNsdWRlZCBtb3JlIHRoYW4gb25jZS5cbiI7CisJCX0KKwl9CisKKwljbG9zZShGSUxFKTsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMvY2hlY2tzdGFjay5wbCBiL3NjcmlwdHMvY2hlY2tzdGFjay5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWRmYTIwCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9jaGVja3N0YWNrLnBsCkBAIC0wLDAgKzEsMTIzIEBACisjIS91c3IvYmluL3BlcmwKKworIwlDaGVjayB0aGUgc3RhY2sgdXNhZ2Ugb2YgZnVuY3Rpb25zCisjCisjCUNvcHlyaWdodCBKb2VybiBFbmdlbCA8am9lcm5Ad2guZmgtd2VkZWwuZGU+CisjCUluc3BpcmVkIGJ5IExpbnVzIFRvcnZhbGRzCisjCU9yaWdpbmFsIGlkZWEgbWF5YmUgZnJvbSBLZWl0aCBPd2VucworIwlzMzkwIHBvcnQgYW5kIGJpZyBzcGVlZHVwIGJ5IEFybmQgQmVyZ21hbm4gPGFybmRAYmVyZ21hbm4tZGFsbGRvcmYuZGU+CisjCU1pcHMgcG9ydCBieSBKdWFuIFF1aW50ZWxhIDxxdWludGVsYUBtYW5kcmFrZXNvZnQuY29tPgorIwlJQTY0IHBvcnQgdmlhIEFuZHJlYXMgRGlsZ2VyCisjCUFybSBwb3J0IGJ5IEhvbGdlciBTY2h1cmlnCisjCXNoNjQgcG9ydCBieSBQYXVsIE11bmR0CisjCVJhbmRvbSBiaXRzIGJ5IE1hdHQgTWFja2FsbCA8bXBtQHNlbGVuaWMuY29tPgorIwlNNjhrIHBvcnQgYnkgR2VlcnQgVXl0dGVyaG9ldmVuIGFuZCBBbmRyZWFzIFNjaHdhYgorIworIwlVc2FnZToKKyMJb2JqZHVtcCAtZCB2bWxpbnV4IHwgc3RhY2tjaGVjay5wbCBbYXJjaF0KKyMKKyMJVE9ETyA6CVBvcnQgdG8gYWxsIGFyY2hpdGVjdHVyZXMgKG9uZSByZWdleCBwZXIgYXJjaCkKKworIyBjaGVjayBmb3IgYXJjaAorIworIyAkcmUgaXMgdXNlZCBmb3IgdHdvIG1hdGNoZXM6CisjICQmICh3aG9sZSByZSkgbWF0Y2hlcyB0aGUgY29tcGxldGUgb2JqZHVtcCBsaW5lIHdpdGggdGhlIHN0YWNrIGdyb3d0aAorIyAkMSAoZmlyc3QgYnJhY2tldCkgbWF0Y2hlcyB0aGUgc2l6ZSBvZiB0aGUgc3RhY2sgZ3Jvd3RoCisjCisjIHVzZSBhbnl0aGluZyBlbHNlIGFuZCBmZWVsIHRoZSBwYWluIDspCitteSAoQHN0YWNrLCAkcmUsICR4LCAkeHMpOworeworCW15ICRhcmNoID0gc2hpZnQ7CisJaWYgKCRhcmNoIGVxICIiKSB7CisJCSRhcmNoID0gYHVuYW1lIC1tYDsKKwl9CisKKwkkeAk9ICJbMC05YS1mXSI7CSMgaGV4IGNoYXJhY3RlcgorCSR4cwk9ICJbMC05YS1mIF0iOwkjIGhleCBjaGFyYWN0ZXIgb3Igc3BhY2UKKwlpZiAoJGFyY2ggZXEgJ2FybScpIHsKKwkJI2MwMDA4ZmZjOgllMjRkZDA2NAlzdWIJc3AsIHNwLCAjMTAwCTsgMHg2NAorCQkkcmUgPSBxci8uKnN1Yi4qc3AsIHNwLCAjKChbMC05XXsyfXxbMy05XSlbMC05XXsyfSkvbzsKKwl9IGVsc2lmICgkYXJjaCA9fiAvXmlbMzQ1Nl04NiQvKSB7CisJCSNjMDEwNTIzNDogICAgICAgODEgZWMgYWMgMDUgMDAgMDAgICAgICAgc3ViICAgICQweDVhYywlZXNwCisJCSRyZSA9IHFyL14uKlthc11bZHVdW2RiXSAgICBcJCgweCR4ezEsOH0pLFwlZXNwJC9vOworCX0gZWxzaWYgKCRhcmNoIGVxICd4ODZfNjQnKSB7CisJCSMgICAgMmY2MDoJNDggODEgZWMgZTggMDUgMDAgMDAgCXN1YiAgICAkMHg1ZTgsJXJzcAorCQkkcmUgPSBxci9eLipbYXNdW2R1XVtkYl0gICAgXCQoMHgkeHsxLDh9KSxcJXJzcCQvbzsKKwl9IGVsc2lmICgkYXJjaCBlcSAnaWE2NCcpIHsKKwkJI2UwMDAwMDAwMDQ0MDExZmM6ICAgICAgIDAxIDBmIGZjIDhjICAgICBhZGRzIHIxMj0tMzg0LHIxMgorCQkkcmUgPSBxci8uKmFkZHMuKnIxMj0tKChbMC05XXsyfXxbMy05XSlbMC05XXsyfSkscjEyL287CisJfSBlbHNpZiAoJGFyY2ggZXEgJ202OGsnKSB7CisJCSMgICAgMmI2YzogICAgICAgNGU1NiBmYjcwICAgICAgIGxpbmt3ICVmcCwjLTExNjgKKwkJIyAgMWRmNzcwOiAgICAgICBkZWZjIGZmZTQgICAgICAgYWRkYXcgIy0yOCwlc3AKKwkJJHJlID0gcXIvLiooPzpsaW5rdyAlZnAsfGFkZGF3ICkjLShbMC05XXsxLDR9KSg/Oiwlc3ApPyQvbzsKKwl9IGVsc2lmICgkYXJjaCBlcSAnbWlwczY0JykgeworCQkjODgwMDQwMmM6ICAgICAgIDY3YmRmZmYwICAgICAgICBkYWRkaXUgIHNwLHNwLC0xNgorCQkkcmUgPSBxci8uKmRhZGRpdS4qc3Asc3AsLSgoWzAtOV17Mn18WzMtOV0pWzAtOV17Mn0pL287CisJfSBlbHNpZiAoJGFyY2ggZXEgJ21pcHMnKSB7CisJCSM4ODAwMzI1NDogICAgICAgMjdiZGZmZTAgICAgICAgIGFkZGl1ICAgc3Asc3AsLTMyCisJCSRyZSA9IHFyLy4qYWRkaXUuKnNwLHNwLC0oKFswLTldezJ9fFszLTldKVswLTldezJ9KS9vOworCX0gZWxzaWYgKCRhcmNoIGVxICdwcGMnKSB7CisJCSNjMDAwMjlmNDogICAgICAgOTQgMjEgZmYgMzAgICAgIHN0d3UgICAgcjEsLTIwOChyMSkKKwkJJHJlID0gcXIvLipzdHd1LipyMSwtKCR4ezEsOH0pXChyMVwpL287CisJfSBlbHNpZiAoJGFyY2ggZXEgJ3BwYzY0JykgeworCQkjWFhYCisJCSRyZSA9IHFyLy4qc3RkdS4qcjEsLSgkeHsxLDh9KVwocjFcKS9vOworCX0gZWxzaWYgKCRhcmNoID1+IC9eczM5MHg/JC8pIHsKKwkJIyAgIDExMTYwOiAgICAgICBhNyBmYiBmZiA2MCAgICAgICAgICAgICBhZ2hpICAgJXIxNSwtMTYwCisJCSRyZSA9IHFyLy4qYWc/aGkuKlwlcjE1LC0oKFswLTldezJ9fFszLTldKVswLTldezJ9KS9vOworCX0gZWxzaWYgKCRhcmNoID1+IC9ec2g2NCQvKSB7CisJCSNYWFg6IHdlIG9ubHkgY2hlY2sgZm9yIHRoZSBpbW1lZGlhdGUgY2FzZSBwcmVzZW50bHksCisJCSMgICAgIHRob3VnaCB3ZSB3aWxsIHdhbnQgdG8gY2hlY2sgZm9yIHRoZSBtb3ZpL3N1YgorCQkjICAgICBwYWlyIGZvciBsYXJnZXIgdXNlcnMuIC0tIFBGTS4KKwkJI2EwMDA0OGUwOiAgICAgICBkNGZjNDBmMCAgICAgICAgYWRkaS5sICByMTUsLTI0MCxyMTUKKwkJJHJlID0gcXIvLiphZGRpXC5sLipyMTUsLSgoWzAtOV17Mn18WzMtOV0pWzAtOV17Mn0pLHIxNS9vOworCX0gZWxzZSB7CisJCXByaW50KCJ3cm9uZyBvciB1bmtub3duIGFyY2hpdGVjdHVyZVxuIik7CisJCWV4aXQKKwl9Cit9CisKK3N1YiBieXNpemUoJCkgeworCW15ICgkYXNpemUsICRic2l6ZSk7CisJKCRhc2l6ZSA9ICRhKSA9fiBzLy4qOgkqKC4qKSQvJDEvOworCSgkYnNpemUgPSAkYikgPX4gcy8uKjoJKiguKikkLyQxLzsKKwkkYnNpemUgPD0+ICRhc2l6ZQorfQorCisjCisjIG1haW4oKQorIworbXkgJGZ1bmNyZSA9IHFyL14keCogPCguKik+OiQvOworbXkgJGZ1bmM7Cit3aGlsZSAobXkgJGxpbmUgPSA8U1RESU4+KSB7CisJaWYgKCRsaW5lID1+IG0vJGZ1bmNyZS8pIHsKKwkJJGZ1bmMgPSAkMTsKKwl9CisJaWYgKCRsaW5lID1+IG0vJHJlLykgeworCQlteSAkc2l6ZSA9ICQxOworCQkkc2l6ZSA9IGhleCgkc2l6ZSkgaWYgKCRzaXplID1+IC9eMHgvKTsKKworCQlpZiAoJHNpemUgPiAweGYwMDAwMDAwKSB7CisJCQkkc2l6ZSA9IC0gJHNpemU7CisJCQkkc2l6ZSArPSAweDgwMDAwMDAwOworCQkJJHNpemUgKz0gMHg4MDAwMDAwMDsKKwkJfQorCQluZXh0IGlmICgkc2l6ZSA+IDB4MTAwMDAwMDApOworCisJCW5leHQgaWYgJGxpbmUgIX4gbS9eKCR4cyopLzsKKwkJbXkgJGFkZHIgPSAkMTsKKwkJJGFkZHIgPX4gcy8gLzAvZzsKKwkJJGFkZHIgPSAiMHgkYWRkciI7CisKKwkJbXkgJGludHJvID0gIiRhZGRyICRmdW5jOiI7CisJCW15ICRwYWRsZW4gPSA1NiAtIGxlbmd0aCgkaW50cm8pOworCQl3aGlsZSAoJHBhZGxlbiA+IDApIHsKKwkJCSRpbnRybyAuPSAnCSc7CisJCQkkcGFkbGVuIC09IDg7CisJCX0KKwkJbmV4dCBpZiAoJHNpemUgPCAxMDApOworCQlwdXNoIEBzdGFjaywgIiRpbnRybyRzaXplXG4iOworCX0KK30KKworcHJpbnQgc29ydCBieXNpemUgQHN0YWNrOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jaGVja3ZlcnNpb24ucGwgYi9zY3JpcHRzL2NoZWNrdmVyc2lvbi5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kZjEwZGI2Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9jaGVja3ZlcnNpb24ucGwKQEAgLTAsMCArMSw3MiBAQAorIyEgL3Vzci9iaW4vcGVybAorIworIyBjaGVja3ZlcnNpb24gZmluZCB1c2VzIG9mIExJTlVYX1ZFUlNJT05fQ09ERSwgS0VSTkVMX1ZFUlNJT04sIG9yCisjIFVUU19SRUxFQVNFIHdpdGhvdXQgaW5jbHVkaW5nIDxsaW51eC92ZXJzaW9uLmg+LCBvciBjYXNlcyBvZgorIyBpbmNsdWRpbmcgPGxpbnV4L3ZlcnNpb24uaD4gdGhhdCBkb24ndCBuZWVkIGl0LgorIyBDb3B5cmlnaHQgKEMpIDIwMDMsIFJhbmR5IER1bmxhcCA8cmRkdW5sYXBAb3NkbC5vcmc+CisKKyR8ID0gMTsKKworbXkgJGRlYnVnZ2luZyA9IDA7CisKK2ZvcmVhY2ggJGZpbGUgKEBBUkdWKQoreworICAgICMgT3BlbiB0aGlzIGZpbGUuCisgICAgb3BlbihGSUxFLCAkZmlsZSkgfHwgZGllICJDYW4ndCBvcGVuICRmaWxlOiAkIVxuIjsKKworICAgICMgSW5pdGlhbGl6ZSB2YXJpYWJsZXMuCisgICAgbXkgJGZJbkNvbW1lbnQgICA9IDA7CisgICAgbXkgJGZJblN0cmluZyAgICA9IDA7CisgICAgbXkgJGZVc2VWZXJzaW9uICAgPSAwOworICAgIG15ICRpTGludXhWZXJzaW9uID0gMDsKKworICAgIExJTkU6IHdoaWxlICggPEZJTEU+ICkKKyAgICB7CisJIyBTdHJpcCBjb21tZW50cy4KKwkkZkluQ29tbWVudCAmJiAocyteLio/XCovKyArbyA/ICgkZkluQ29tbWVudCA9IDApIDogbmV4dCk7CisJbSsvXCorbyAmJiAocysvXCouKj9cKi8rICtnbywgKHMrL1wqLiokKyArbyAmJiAoJGZJbkNvbW1lbnQgPSAxKSkpOworCisJIyBQaWNrIHVwIGRlZmluaXRpb25zLgorCWlmICggbS9eXHMqIy9vICkgeworCSAgICAkaUxpbnV4VmVyc2lvbiAgICAgID0gJC4gaWYgbS9eXHMqI1xzKmluY2x1ZGVccyoibGludXhcL3ZlcnNpb25cLmgiL287CisJfQorCisJIyBTdHJpcCBzdHJpbmdzLgorCSRmSW5TdHJpbmcgJiYgKHMrXi4qPyIrICtvID8gKCRmSW5TdHJpbmcgPSAwKSA6IG5leHQpOworCW0rIitvICYmIChzKyIuKj8iKyArZ28sIChzKyIuKiQrICtvICYmICgkZkluU3RyaW5nID0gMSkpKTsKKworCSMgUGljayB1cCBkZWZpbml0aW9ucy4KKwlpZiAoIG0vXlxzKiMvbyApIHsKKwkgICAgJGlMaW51eFZlcnNpb24gICAgICA9ICQuIGlmIG0vXlxzKiNccyppbmNsdWRlXHMqPGxpbnV4XC92ZXJzaW9uXC5oPi9vOworCX0KKworCSMgTG9vayBmb3IgdXNlczogTElOVVhfVkVSU0lPTl9DT0RFLCBLRVJORUxfVkVSU0lPTiwgVVRTX1JFTEVBU0UKKwlpZiAoKCRfID1+IC9MSU5VWF9WRVJTSU9OX0NPREUvKSB8fCAoJF8gPX4gL1xXS0VSTkVMX1ZFUlNJT04vKSB8fAorCQkoJF8gPX4gL1VUU19SRUxFQVNFLykpIHsKKwkgICAgJGZVc2VWZXJzaW9uID0gMTsKKwkgICAgbGFzdCBMSU5FIGlmICRpTGludXhWZXJzaW9uOworCX0KKyAgICB9CisKKyAgICAjIFJlcG9ydCB1c2VkIHZlcnNpb24gSURzIHdpdGhvdXQgaW5jbHVkZT8KKyAgICBpZiAoJGZVc2VWZXJzaW9uICYmICEgJGlMaW51eFZlcnNpb24pIHsKKwlwcmludCAiJGZpbGU6ICQuOiBuZWVkIGxpbnV4L3ZlcnNpb24uaFxuIjsKKyAgICB9CisKKyAgICAjIFJlcG9ydCBzdXBlcmZsdW91cyBpbmNsdWRlcy4KKyAgICBpZiAoJGlMaW51eFZlcnNpb24gJiYgISAkZlVzZVZlcnNpb24pIHsKKwlwcmludCAiJGZpbGU6ICRpTGludXhWZXJzaW9uIGxpbnV4L3ZlcnNpb24uaCBub3QgbmVlZGVkLlxuIjsKKyAgICB9CisKKyAgICAjIGRlYnVnOiByZXBvcnQgT0sgcmVzdWx0czoKKyAgICBpZiAoJGRlYnVnZ2luZykgeworICAgICAgICBpZiAoJGlMaW51eFZlcnNpb24gJiYgJGZVc2VWZXJzaW9uKSB7CisJICAgIHByaW50ICIkZmlsZTogdmVyc2lvbiB1c2UgaXMgT0sgKCRpTGludXhWZXJzaW9uKVxuIjsKKyAgICAgICAgfQorICAgICAgICBpZiAoISAkaUxpbnV4VmVyc2lvbiAmJiAhICRmVXNlVmVyc2lvbikgeworCSAgICBwcmludCAiJGZpbGU6IHZlcnNpb24gdXNlIGlzIE9LIChub25lKVxuIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNsb3NlKEZJTEUpOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9jb25tYWtlaGFzaC5jIGIvc2NyaXB0cy9jb25tYWtlaGFzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzZGQyM2YyCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9jb25tYWtlaGFzaC5jCkBAIC0wLDAgKzEsMjkzIEBACisvKgorICogY29ubWFrZWhhc2guYworICoKKyAqIENyZWF0ZSBhcnJheXMgZm9yIGluaXRpYWxpemluZyB0aGUga2VybmVsIGZvbGRlZCB0YWJsZXMgKHVzaW5nIGEgaGFzaAorICogdGFibGUgdHVybmVkIG91dCB0byBiZSB0byBsaW1pdGluZy4uLikgIFVuZm9ydHVuYXRlbHkgd2UgY2FuJ3Qgc2ltcGx5CisgKiBwcmVpbml0aWFsaXplIHRoZSB0YWJsZXMgYXQgY29tcGlsZSB0aW1lIHNpbmNlIGtmcmVlKCkgY2Fubm90IGFjY2VwdAorICogbWVtb3J5IG5vdCBhbGxvY2F0ZWQgYnkga21hbGxvYygpLCBhbmQgZG9pbmcgb3VyIG93biBtZW1vcnkgbWFuYWdlbWVudAorICoganVzdCBmb3IgdGhpcyBzZWVtcyBsaWtlIG1hc3NpdmUgb3ZlcmtpbGwuCisgKgorICogQ29weXJpZ2h0IChDKSAxOTk1LTE5OTcgSC4gUGV0ZXIgQW52aW4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgYSBwYXJ0IG9mIHRoZSBMaW51eCBrZXJuZWwsIGFuZCBtYXkgYmUgZnJlZWx5CisgKiBjb3BpZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAoR1BMKSwKKyAqIHZlcnNpb24gMiwgb3IgYXQgeW91ciBvcHRpb24gYW55IGxhdGVyIHZlcnNpb24uCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3lzZXhpdHMuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorCisjZGVmaW5lIE1BWF9GT05UTEVOIDI1NgorCit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVuaWNvZGU7CisKK3ZvaWQgdXNhZ2UoY2hhciAqYXJndjApCit7CisgIGZwcmludGYoc3RkZXJyLCAiVXNhZ2U6IFxuIgorICAgICAgICAgIiAgICAgICAgJXMgY2hhcnRhYmxlIFtoYXNoc2l6ZV0gW2hhc2hzdGVwXSBbbWF4aGFzaGxldmVsXVxuIiwgYXJndjApOworICBleGl0KEVYX1VTQUdFKTsKK30KKworaW50IGdldHVuaWNvZGUoY2hhciAqKnAwKQoreworICB1bnNpZ25lZCBjaGFyICpwID0gKnAwOworCisgIHdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JykKKyAgICBwKys7CisgIGlmICgqcCAhPSAnVScgfHwgcFsxXSAhPSAnKycgfHwKKyAgICAgICFpc3hkaWdpdChwWzJdKSB8fCAhaXN4ZGlnaXQocFszXSkgfHwgIWlzeGRpZ2l0KHBbNF0pIHx8CisgICAgICAhaXN4ZGlnaXQocFs1XSkgfHwgaXN4ZGlnaXQocFs2XSkpCisgICAgcmV0dXJuIC0xOworICAqcDAgPSBwKzY7CisgIHJldHVybiBzdHJ0b2wocCsyLDAsMTYpOworfQorCit1bmljb2RlIHVuaXRhYmxlW01BWF9GT05UTEVOXVsyNTVdOworCQkJCS8qIE1hc3NpdmUgb3ZlcmtpbGwsIGJ1dCB3aG8gY2FyZXM/ICovCitpbnQgdW5pY291bnRbTUFYX0ZPTlRMRU5dOworCit2b2lkIGFkZHBhaXIoaW50IGZwLCBpbnQgdW4pCit7CisgIGludCBpOworCisgIGlmICggdW4gPD0gMHhmZmZlICkKKyAgICB7CisgICAgICAvKiBDaGVjayBpdCBpc24ndCBhIGR1cGxpY2F0ZSAqLworCisgICAgICBmb3IgKCBpID0gMCA7IGkgPCB1bmljb3VudFtmcF0gOyBpKysgKQorCWlmICggdW5pdGFibGVbZnBdW2ldID09IHVuICkKKwkgIHJldHVybjsKKworICAgICAgLyogQWRkIHRvIGxpc3QgKi8KKworICAgICAgaWYgKCB1bmljb3VudFtmcF0gPiAyNTQgKQorCXsKKwkgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IE9ubHkgMjU1IHVuaWNvZGVzL2dseXBoIHBlcm1pdHRlZCFcbiIpOworCSAgZXhpdChFWF9EQVRBRVJSKTsKKwl9CisKKyAgICAgIHVuaXRhYmxlW2ZwXVt1bmljb3VudFtmcF1dID0gdW47CisgICAgICB1bmljb3VudFtmcF0rKzsKKyAgICB9CisKKyAgLyogb3RoZXJ3aXNlOiBpZ25vcmUgKi8KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgRklMRSAqY3RibDsKKyAgY2hhciAqdGJsbmFtZTsKKyAgY2hhciBidWZmZXJbNjU1MzZdOworICBpbnQgZm9udGxlbjsKKyAgaW50IGksIG51bmksIG5lbnQ7CisgIGludCBmcDAsIGZwMSwgdW4wLCB1bjE7CisgIGNoYXIgKnAsICpwMTsKKworICBpZiAoIGFyZ2MgPCAyIHx8IGFyZ2MgPiA1ICkKKyAgICB1c2FnZShhcmd2WzBdKTsKKworICBpZiAoICFzdHJjbXAoYXJndlsxXSwiLSIpICkKKyAgICB7CisgICAgICBjdGJsID0gc3RkaW47CisgICAgICB0YmxuYW1lID0gInN0ZGluIjsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICBjdGJsID0gZm9wZW4odGJsbmFtZSA9IGFyZ3ZbMV0sICJyIik7CisgICAgICBpZiAoICFjdGJsICkKKwl7CisJICBwZXJyb3IodGJsbmFtZSk7CisJICBleGl0KEVYX05PSU5QVVQpOworCX0KKyAgICB9CisKKyAgLyogRm9yIG5vdyB3ZSBhc3N1bWUgdGhlIGRlZmF1bHQgZm9udCBpcyBhbHdheXMgMjU2IGNoYXJhY3RlcnMuICovICAgIAorICBmb250bGVuID0gMjU2OworCisgIC8qIEluaXRpYWxpemUgdGFibGUgKi8KKworICBmb3IgKCBpID0gMCA7IGkgPCBmb250bGVuIDsgaSsrICkKKyAgICB1bmljb3VudFtpXSA9IDA7CisKKyAgLyogTm93IHdlIGNvbWUgdG8gdGhlIHRyaWNreSBwYXJ0LiAgUGFyc2UgdGhlIGlucHV0IHRhYmxlLiAqLworCisgIHdoaWxlICggZmdldHMoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgY3RibCkgIT0gTlVMTCApCisgICAgeworICAgICAgaWYgKCAocCA9IHN0cmNocihidWZmZXIsICdcbicpKSAhPSBOVUxMICkKKwkqcCA9ICdcMCc7CisgICAgICBlbHNlCisJZnByaW50ZihzdGRlcnIsICIlczogV2FybmluZzogbGluZSB0b28gbG9uZ1xuIiwgdGJsbmFtZSk7CisKKyAgICAgIHAgPSBidWZmZXI7CisKKy8qCisgKiBTeW50YXggYWNjZXB0ZWQ6CisgKgk8Zm9udHBvcz4JPHVuaWNvZGU+IDx1bmljb2RlPiAuLi4KKyAqCTxyYW5nZT4JCWlkZW0KKyAqCTxyYW5nZT4JCTx1bmljb2RlIHJhbmdlPgorICoKKyAqIHdoZXJlIDxyYW5nZT4gOjo9IDxmb250cG9zPi08Zm9udHBvcz4KKyAqIGFuZCA8dW5pY29kZT4gOjo9IFUrPGg+PGg+PGg+PGg+CisgKiBhbmQgPGg+IDo6PSA8aGV4YWRlY2ltYWwgZGlnaXQ+CisgKi8KKworICAgICAgd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKQorCXArKzsKKyAgICAgIGlmICghKnAgfHwgKnAgPT0gJyMnKQorCWNvbnRpbnVlOwkvKiBza2lwIGNvbW1lbnQgb3IgYmxhbmsgbGluZSAqLworCisgICAgICBmcDAgPSBzdHJ0b2wocCwgJnAxLCAwKTsKKyAgICAgIGlmIChwMSA9PSBwKQorCXsKKwkgIGZwcmludGYoc3RkZXJyLCAiQmFkIGlucHV0IGxpbmU6ICVzXG4iLCBidWZmZXIpOworCSAgZXhpdChFWF9EQVRBRVJSKTsKKyAgICAgICAgfQorICAgICAgcCA9IHAxOworCisgICAgICB3aGlsZSAoKnAgPT0gJyAnIHx8ICpwID09ICdcdCcpCisJcCsrOworICAgICAgaWYgKCpwID09ICctJykKKwl7CisJICBwKys7CisJICBmcDEgPSBzdHJ0b2wocCwgJnAxLCAwKTsKKwkgIGlmIChwMSA9PSBwKQorCSAgICB7CisJICAgICAgZnByaW50ZihzdGRlcnIsICJCYWQgaW5wdXQgbGluZTogJXNcbiIsIGJ1ZmZlcik7CisJICAgICAgZXhpdChFWF9EQVRBRVJSKTsKKwkgICAgfQorCSAgcCA9IHAxOworICAgICAgICB9CisgICAgICBlbHNlCisJZnAxID0gMDsKKworICAgICAgaWYgKCBmcDAgPCAwIHx8IGZwMCA+PSBmb250bGVuICkKKwl7CisJICAgIGZwcmludGYoc3RkZXJyLAorCQkgICAgIiVzOiBHbHlwaCBudW1iZXIgKDB4JXgpIGxhcmdlciB0aGFuIGZvbnQgbGVuZ3RoXG4iLAorCQkgICAgdGJsbmFtZSwgZnAwKTsKKwkgICAgZXhpdChFWF9EQVRBRVJSKTsKKwl9CisgICAgICBpZiAoIGZwMSAmJiAoZnAxIDwgZnAwIHx8IGZwMSA+PSBmb250bGVuKSApCisJeworCSAgICBmcHJpbnRmKHN0ZGVyciwKKwkJICAgICIlczogQmFkIGVuZCBvZiByYW5nZSAoMHgleClcbiIsCisJCSAgICB0YmxuYW1lLCBmcDEpOworCSAgICBleGl0KEVYX0RBVEFFUlIpOworCX0KKworICAgICAgaWYgKGZwMSkKKwl7CisJICAvKiB3ZSBoYXZlIGEgcmFuZ2U7IGV4cGVjdCB0aGUgd29yZCAiaWRlbSIgb3IgYSBVbmljb2RlIHJhbmdlIG9mIHRoZQorCSAgICAgc2FtZSBsZW5ndGggKi8KKwkgIHdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JykKKwkgICAgcCsrOworCSAgaWYgKCFzdHJuY21wKHAsICJpZGVtIiwgNCkpCisJICAgIHsKKwkgICAgICBmb3IgKGk9ZnAwOyBpPD1mcDE7IGkrKykKKwkJYWRkcGFpcihpLGkpOworCSAgICAgIHAgKz0gNDsKKwkgICAgfQorCSAgZWxzZQorCSAgICB7CisJICAgICAgdW4wID0gZ2V0dW5pY29kZSgmcCk7CisJICAgICAgd2hpbGUgKCpwID09ICcgJyB8fCAqcCA9PSAnXHQnKQorCQlwKys7CisJICAgICAgaWYgKCpwICE9ICctJykKKwkJeworCQkgIGZwcmludGYoc3RkZXJyLAorIiVzOiBDb3JyZXNwb25kaW5nIHRvIGEgcmFuZ2Ugb2YgZm9udCBwb3NpdGlvbnMsIHRoZXJlIHNob3VsZCBiZSBhIFVuaWNvZGUgcmFuZ2VcbiIsCisJCQkgIHRibG5hbWUpOworCQkgIGV4aXQoRVhfREFUQUVSUik7CisJICAgICAgICB9CisJICAgICAgcCsrOworCSAgICAgIHVuMSA9IGdldHVuaWNvZGUoJnApOworCSAgICAgIGlmICh1bjAgPCAwIHx8IHVuMSA8IDApCisJCXsKKwkJICBmcHJpbnRmKHN0ZGVyciwKKyIlczogQmFkIFVuaWNvZGUgcmFuZ2UgY29ycmVzcG9uZGluZyB0byBmb250IHBvc2l0aW9uIHJhbmdlIDB4JXgtMHgleFxuIiwKKwkJCSAgdGJsbmFtZSwgZnAwLCBmcDEpOworCQkgIGV4aXQoRVhfREFUQUVSUik7CisJICAgICAgICB9CisJICAgICAgaWYgKHVuMSAtIHVuMCAhPSBmcDEgLSBmcDApCisJCXsKKwkJICBmcHJpbnRmKHN0ZGVyciwKKyIlczogVW5pY29kZSByYW5nZSBVKyV4LVUrJXggbm90IG9mIHRoZSBzYW1lIGxlbmd0aCBhcyBmb250IHBvc2l0aW9uIHJhbmdlIDB4JXgtMHgleFxuIiwKKwkJCSAgdGJsbmFtZSwgdW4wLCB1bjEsIGZwMCwgZnAxKTsKKwkJICBleGl0KEVYX0RBVEFFUlIpOworCSAgICAgICAgfQorCSAgICAgIGZvcihpPWZwMDsgaTw9ZnAxOyBpKyspCisJCWFkZHBhaXIoaSx1bjAtZnAwK2kpOworCSAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKwl7CisJICAgIC8qIG5vIHJhbmdlOyBleHBlY3QgYSBsaXN0IG9mIHVuaWNvZGUgdmFsdWVzIGZvciBhIHNpbmdsZSBmb250IHBvc2l0aW9uICovCisKKwkgICAgd2hpbGUgKCAodW4wID0gZ2V0dW5pY29kZSgmcCkpID49IDAgKQorCSAgICAgIGFkZHBhaXIoZnAwLCB1bjApOworCX0KKyAgICAgIHdoaWxlICgqcCA9PSAnICcgfHwgKnAgPT0gJ1x0JykKKwlwKys7CisgICAgICBpZiAoKnAgJiYgKnAgIT0gJyMnKQorCWZwcmludGYoc3RkZXJyLCAiJXM6IHRyYWlsaW5nIGp1bmsgKCVzKSBpZ25vcmVkXG4iLCB0YmxuYW1lLCBwKTsKKyAgICB9CisKKyAgLyogT2theSwgd2UgaGl0IEVPRiwgbm93IG91dHB1dCBoYXNoIHRhYmxlICovCisgIAorICBmY2xvc2UoY3RibCk7CisgIAorCisgIC8qIENvbXB1dGUgdG90YWwgc2l6ZSBvZiBVbmljb2RlIGxpc3QgKi8KKyAgbnVuaSA9IDA7CisgIGZvciAoIGkgPSAwIDsgaSA8IGZvbnRsZW4gOyBpKysgKQorICAgIG51bmkgKz0gdW5pY291bnRbaV07CisgIAorICBwcmludGYoIlwKKy8qXG5cCisgKiBEbyBub3QgZWRpdCB0aGlzIGZpbGU7IGl0IHdhcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBieVxuXAorICpcblwKKyAqIGNvbm1ha2VoYXNoICVzID4gW3RoaXMgZmlsZV1cblwKKyAqXG5cCisgKi9cblwKK1xuXAorI2luY2x1ZGUgPGxpbnV4L3R5cGVzLmg+XG5cCitcblwKK3U4IGRmb250X3VuaWNvdW50WyVkXSA9IFxuXAore1xuXHQiLCBhcmd2WzFdLCBmb250bGVuKTsKKworICBmb3IgKCBpID0gMCA7IGkgPCBmb250bGVuIDsgaSsrICkKKyAgICB7CisgICAgICBwcmludGYoIiUzZCIsIHVuaWNvdW50W2ldKTsKKyAgICAgIGlmICggaSA9PSBmb250bGVuLTEgKQorICAgICAgICBwcmludGYoIlxufTtcbiIpOworICAgICAgZWxzZSBpZiAoIGkgJSA4ID09IDcgKQorICAgICAgICBwcmludGYoIixcblx0Iik7CisgICAgICBlbHNlCisgICAgICAgIHByaW50ZigiLCAiKTsKKyAgICB9CisgIAorICBwcmludGYoIlxudTE2IGRmb250X3VuaXRhYmxlWyVkXSA9IFxue1xuXHQiLCBudW5pKTsKKyAgCisgIGZwMCA9IDA7CisgIG5lbnQgPSAwOworICBmb3IgKCBpID0gMCA7IGkgPCBudW5pIDsgaSsrICkKKyAgICB7CisgICAgICB3aGlsZSAoIG5lbnQgPj0gdW5pY291bnRbZnAwXSApCisJeworCSAgZnAwKys7CisJICBuZW50ID0gMDsKKwl9CisgICAgICBwcmludGYoIjB4JTA0eCIsIHVuaXRhYmxlW2ZwMF1bbmVudCsrXSk7CisgICAgICBpZiAoIGkgPT0gbnVuaS0xICkKKyAgICAgICAgIHByaW50ZigiXG59O1xuIik7CisgICAgICAgZWxzZSBpZiAoIGkgJSA4ID09IDcgKQorICAgICAgICAgcHJpbnRmKCIsXG5cdCIpOworICAgICAgIGVsc2UKKyAgICAgICAgIHByaW50ZigiLCAiKTsKKyAgICB9CisKKyAgZXhpdChFWF9PSyk7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2V4dHJhY3QtaWtjb25maWcgYi9zY3JpcHRzL2V4dHJhY3QtaWtjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZDlmOWYzNAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZXh0cmFjdC1pa2NvbmZpZwpAQCAtMCwwICsxLDc3IEBACisjIS9iaW4vc2gKKyMgZXh0cmFjdHMgLmNvbmZpZyBpbmZvIGZyb20gYSBbYl16SW1hZ2UgZmlsZQorIyB1c2VzOiBiaW5vZmZzZXQgKG5ldyksIGRkLCB6Y2F0LCBzdHJpbmdzLCBncmVwCisjICRhcmcxIGlzIFtiXXpJbWFnZSBmaWxlbmFtZQorCitiaW5vZmZzZXQ9Ii4vc2NyaXB0cy9iaW5vZmZzZXQiCisKK0lLQ0ZHX1NUPSIweDQ5IDB4NGIgMHg0MyAweDQ2IDB4NDcgMHg1ZiAweDUzIDB4NTQiCitJS0NGR19FRD0iMHg0OSAweDRiIDB4NDMgMHg0NiAweDQ3IDB4NWYgMHg0NSAweDQ0IgorZnVuY3Rpb24gZHVtcF9jb25maWcgeworICAgIHR5cGVzZXQgZmlsZT0iJDEiCisKKyAgICBzdGFydD1gJGJpbm9mZnNldCAkZmlsZSAkSUtDRkdfU1QgMj4vZGV2L251bGxgCisgICAgWyAiJD8iICE9ICIwIiBdICYmIHN0YXJ0PSItMSIKKyAgICBpZiBbICIkc3RhcnQiIC1lcSAiLTEiIF07IHRoZW4KKwlyZXR1cm4KKyAgICBmaQorICAgIGVuZD1gJGJpbm9mZnNldCAkZmlsZSAkSUtDRkdfRUQgMj4vZGV2L251bGxgCisKKyAgICBsZXQgc3RhcnQ9IiRzdGFydCArIDgiCisgICAgbGV0IHNpemU9IiRlbmQgLSAkc3RhcnQiCisKKyAgICBoZWFkIC0tYnl0ZXM9IiRlbmQiICIkZmlsZSIgfCB0YWlsIC0tYnl0ZXM9IiRzaXplIiB8IHpjYXQKKworICAgIGNsZWFuX3VwCisgICAgZXhpdCAwCit9CisKKwordXNhZ2UoKQoreworCWVjaG8gIiAgdXNhZ2U6IGV4dHJhY3QtaWtjb25maWcgW2JdekltYWdlX2ZpbGVuYW1lIgorfQorCitjbGVhbl91cCgpCit7CisJaWYgWyAiJFRNUEZJTEUiICE9ICIiIF07IHRoZW4KKwkJcm0gLWYgJFRNUEZJTEUKKwlmaQorfQorCitpZiBbICQjIC1sdCAxIF0KK3RoZW4KKwl1c2FnZQorCWV4aXQgMQorZmkKKworVE1QRklMRT0iL3RtcC9pa2NvbmZpZy0kJCIKK2ltYWdlPSIkMSIKKworIyB2bWxpbnV4OiBBdHRlbXB0IHRvIGR1bXAgdGhlIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgZmlsZSBkaXJlY3RseQorZHVtcF9jb25maWcgIiRpbWFnZSIKKworR1pIRFIxPSIweDFmIDB4OGIgMHgwOCAweDAwIgorR1pIRFIyPSIweDFmIDB4OGIgMHgwOCAweDA4IgorCisjIHZtbGludXguZ3o6IENoZWNrIGZvciBhIGNvbXByZXNzZWQgaW1hZ2VzCitvZmY9YCRiaW5vZmZzZXQgIiRpbWFnZSIgJEdaSERSMSAyPi9kZXYvbnVsbGAKK1sgIiQ/IiAhPSAiMCIgXSAmJiBvZmY9Ii0xIgoraWYgWyAiJG9mZiIgLWVxICItMSIgXTsgdGhlbgorCW9mZj1gJGJpbm9mZnNldCAiJGltYWdlIiAkR1pIRFIyIDI+L2Rldi9udWxsYAorCVsgIiQ/IiAhPSAiMCIgXSAmJiBvZmY9Ii0xIgorZmkKK2lmIFsgIiRvZmYiIC1lcSAiMCIgXTsgdGhlbgorCXpjYXQgPCIkaW1hZ2UiID4iJFRNUEZJTEUiCisJZHVtcF9jb25maWcgIiRUTVBGSUxFIgorZWxpZiBbICIkb2ZmIiAtbmUgIi0xIiBdOyB0aGVuCisJKGRkIGlicz0iJG9mZiIgc2tpcD0xIGNvdW50PTAgJiYgZGQgYnM9NTEyaykgPCIkaW1hZ2UiIDI+L2Rldi9udWxsIHwgXAorCQl6Y2F0ID4iJFRNUEZJTEUiCisJZHVtcF9jb25maWcgIiRUTVBGSUxFIgorZmkKKworZWNobyAiRVJST1I6IFVuYWJsZSB0byBleHRyYWN0IGtlcm5lbCBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiIKK2VjaG8gIiAgICAgICBUaGlzIGtlcm5lbCBpbWFnZSBtYXkgbm90IGhhdmUgdGhlIGNvbmZpZyBpbmZvLiIKKworY2xlYW5fdXAKK2V4aXQgMQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nY2MtdmVyc2lvbi5zaCBiL3NjcmlwdHMvZ2NjLXZlcnNpb24uc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI0ZmJlYQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZ2NjLXZlcnNpb24uc2gKQEAgLTAsMCArMSwxNCBAQAorIyEvYmluL3NoCisjCisjIGdjYy12ZXJzaW9uIGdjYy1jb21tYW5kCisjCisjIFByaW50cyB0aGUgZ2NjIHZlcnNpb24gb2YgYGdjYy1jb21tYW5kJyBpbiBhIGNhbm9uaWNhbCA0LWRpZ2l0IGZvcm0KKyMgc3VjaCBhcyBgMDI5NScgZm9yIGdjYy0yLjk1LCBgMDMwMycgZm9yIGdjYy0zLjMsIGV0Yy4KKyMKKworY29tcGlsZXI9IiQqIgorCitNQUpPUj0kKGVjaG8gX19HTlVDX18gfCAkY29tcGlsZXIgLUUgLXhjIC0gfCB0YWlsIC1uIDEpCitNSU5PUj0kKGVjaG8gX19HTlVDX01JTk9SX18gfCAkY29tcGlsZXIgLUUgLXhjIC0gfCB0YWlsIC1uIDEpCitwcmludGYgIiUwMmQlMDJkXFxuIiAkTUFKT1IgJE1JTk9SCisKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZ2VuX2luaXRyYW1mc19saXN0LnNoIGIvc2NyaXB0cy9nZW5faW5pdHJhbWZzX2xpc3Quc2gKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ0MTExNgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZ2VuX2luaXRyYW1mc19saXN0LnNoCkBAIC0wLDAgKzEsMjAzIEBACisjIS9iaW4vYmFzaAorIyBDb3B5cmlnaHQgKEMpIE1hcnRpbiBTY2hsZW1tZXIgPGF6YXJhaEBub3NmZXJhdHUuemEub3JnPgorIyBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwKKyMKKyMgR2VuZXJhdGUgYSBuZXdsaW5lIHNlcGFyYXRlZCBsaXN0IG9mIGVudHJpZXMgZnJvbSB0aGUgZmlsZS9kaXJlY3RvcnkKKyMgc3VwcGxpZWQgYXMgYW4gYXJndW1lbnQuCisjCisjIElmIGEgZmlsZS9kaXJlY3RvcnkgaXMgbm90IHN1cHBsaWVkIHRoZW4gZ2VuZXJhdGUgYSBzbWFsbCBkdW1teSBmaWxlLgorIworIyBUaGUgb3V0cHV0IGlzIHN1aXRhYmxlIGZvciBnZW5faW5pdF9jcGlvIGJ1aWx0IGZyb20gdXNyL2dlbl9pbml0X2NwaW8uYy4KKyMKKworZGVmYXVsdF9pbml0cmFtZnMoKSB7CisJY2F0IDw8LUVPRgorCQkjIFRoaXMgaXMgYSB2ZXJ5IHNpbXBsZSwgZGVmYXVsdCBpbml0cmFtZnMKKworCQlkaXIgL2RldiAwNzU1IDAgMAorCQlub2QgL2Rldi9jb25zb2xlIDA2MDAgMCAwIGMgNSAxCisJCWRpciAvcm9vdCAwNzAwIDAgMAorCUVPRgorfQorCitmaWxldHlwZSgpIHsKKwlsb2NhbCBhcmd2MT0iJDEiCisKKwkjIHN5bWxpbmsgdGVzdCBtdXN0IGNvbWUgYmVmb3JlIGZpbGUgdGVzdAorCWlmIFsgLUwgIiR7YXJndjF9IiBdOyB0aGVuCisJCWVjaG8gInNsaW5rIgorCWVsaWYgWyAtZiAiJHthcmd2MX0iIF07IHRoZW4KKwkJZWNobyAiZmlsZSIKKwllbGlmIFsgLWQgIiR7YXJndjF9IiBdOyB0aGVuCisJCWVjaG8gImRpciIKKwllbGlmIFsgLWIgIiR7YXJndjF9IiAtbyAtYyAiJHthcmd2MX0iIF07IHRoZW4KKwkJZWNobyAibm9kIgorCWVsaWYgWyAtcCAiJHthcmd2MX0iIF07IHRoZW4KKwkJZWNobyAicGlwZSIKKwllbGlmIFsgLVMgIiR7YXJndjF9IiBdOyB0aGVuCisJCWVjaG8gInNvY2siCisJZWxzZQorCQllY2hvICJpbnZhbGlkIgorCWZpCisJcmV0dXJuIDAKK30KKworcHJpbnRfbXRpbWUoKSB7CisJbG9jYWwgYXJndjE9IiQxIgorCWxvY2FsIG15X210aW1lPSIwIgorCisJaWYgWyAtZSAiJHthcmd2MX0iIF07IHRoZW4KKwkJbXlfbXRpbWU9JChmaW5kICIke2FyZ3YxfSIgLXByaW50ZiAiJVRAXG4iIHwgc29ydCAtciB8IGhlYWQgLW4gMSkKKwlmaQorCQorCWVjaG8gIiMgTGFzdCBtb2RpZmllZDogJHtteV9tdGltZX0iCisJZWNobworfQorCitwYXJzZSgpIHsKKwlsb2NhbCBsb2NhdGlvbj0iJDEiCisJbG9jYWwgbmFtZT0iJHtsb2NhdGlvbi8ke3NyY2Rpcn0vL30iCisJIyBjaGFuZ2UgJy8vJyBpbnRvICcvJworCW5hbWU9IiR7bmFtZS8vXC9cLy8vfSIKKwlsb2NhbCBtb2RlPSIkMiIKKwlsb2NhbCB1aWQ9IiQzIgorCWxvY2FsIGdpZD0iJDQiCisJbG9jYWwgZnR5cGU9JChmaWxldHlwZSAiJHtsb2NhdGlvbn0iKQorCSMgcmVtYXAgdWlkL2dpZCB0byAwIGlmIG5lY2Vzc2FyeQorCVsgIiR1aWQiIC1lcSAiJHJvb3RfdWlkIiBdICYmIHVpZD0wCisJWyAiJGdpZCIgLWVxICIkcm9vdF9naWQiIF0gJiYgZ2lkPTAKKwlsb2NhbCBzdHI9IiR7bW9kZX0gJHt1aWR9ICR7Z2lkfSIKKworCVsgIiR7ZnR5cGV9IiA9PSAiaW52YWxpZCIgXSAmJiByZXR1cm4gMAorCVsgIiR7bG9jYXRpb259IiA9PSAiJHtzcmNkaXJ9IiBdICYmIHJldHVybiAwCisKKwljYXNlICIke2Z0eXBlfSIgaW4KKwkJImZpbGUiKQorCQkJc3RyPSIke2Z0eXBlfSAke25hbWV9ICR7bG9jYXRpb259ICR7c3RyfSIKKwkJCTs7CisJCSJub2QiKQorCQkJbG9jYWwgZGV2X3R5cGU9CisJCQlsb2NhbCBtYWo9JChMQ19BTEw9QyBscyAtbCAiJHtsb2NhdGlvbn0iIHwgXAorCQkJCQlnYXdrICd7c3ViKC8sLywgIiIsICQ1KTsgcHJpbnQgJDV9JykKKwkJCWxvY2FsIG1pbj0kKExDX0FMTD1DIGxzIC1sICIke2xvY2F0aW9ufSIgfCBcCisJCQkJCWdhd2sgJ3twcmludCAkNn0nKQorCisJCQlpZiBbIC1iICIke2xvY2F0aW9ufSIgXTsgdGhlbgorCQkJCWRldl90eXBlPSJiIgorCQkJZWxzZQorCQkJCWRldl90eXBlPSJjIgorCQkJZmkKKwkJCXN0cj0iJHtmdHlwZX0gJHtuYW1lfSAke3N0cn0gJHtkZXZfdHlwZX0gJHttYWp9ICR7bWlufSIKKwkJCTs7CisJCSJzbGluayIpCisJCQlsb2NhbCB0YXJnZXQ9JChMQ19BTEw9QyBscyAtbCAiJHtsb2NhdGlvbn0iIHwgXAorCQkJCQlnYXdrICd7cHJpbnQgJDExfScpCisJCQlzdHI9IiR7ZnR5cGV9ICR7bmFtZX0gJHt0YXJnZXR9ICR7c3RyfSIKKwkJCTs7CisJCSopCisJCQlzdHI9IiR7ZnR5cGV9ICR7bmFtZX0gJHtzdHJ9IgorCQkJOzsKKwllc2FjCisKKwllY2hvICIke3N0cn0iCisKKwlyZXR1cm4gMAorfQorCit1c2FnZSgpIHsKKwlwcmludGYgICAgIlVzYWdlOlxuIgorCXByaW50ZiAgICAiJDAgWyBbLXUgPHJvb3RfdWlkPl0gWy1nIDxyb290X2dpZD5dIFstZCB8IDxjcGlvX3NvdXJjZT5dIF0gLiAuIC5cbiIKKwlwcmludGYgICAgIlxuIgorCXByaW50ZiAtLSAiLXUgPHJvb3RfdWlkPiAgVXNlciBJRCB0byBtYXAgdG8gdXNlciBJRCAwIChyb290KS5cbiIKKwlwcmludGYgICAgIiAgICAgICAgICAgICAgIDxyb290X3VpZD4gaXMgb25seSBtZWFuaW5nZnVsIGlmIDxjcGlvX3NvdXJjZT5cbiIKKwlwcmludGYgICAgIiAgICAgICAgICAgICAgIGlzIGEgZGlyZWN0b3J5LlxuIgorCXByaW50ZiAtLSAiLWcgPHJvb3RfZ2lkPiAgR3JvdXAgSUQgdG8gbWFwIHRvIGdyb3VwIElEIDAgKHJvb3QpLlxuIgorCXByaW50ZiAgICAiICAgICAgICAgICAgICAgPHJvb3RfZ2lkPiBpcyBvbmx5IG1lYW5pbmdmdWwgaWYgPGNwaW9fc291cmNlPlxuIgorCXByaW50ZiAgICAiICAgICAgICAgICAgICAgaXMgYSBkaXJlY3RvcnkuXG4iCisJcHJpbnRmICAgICI8Y3Bpb19zb3VyY2U+ICBGaWxlIGxpc3Qgb3IgZGlyZWN0b3J5IGZvciBjcGlvIGFyY2hpdmUuXG4iCisJcHJpbnRmICAgICIgICAgICAgICAgICAgICBJZiA8Y3Bpb19zb3VyY2U+IGlzIG5vdCBwcm92aWRlZCB0aGVuIGFcbiIKKwlwcmludGYgICAgIiAgICAgICAgICAgICAgIGEgZGVmYXVsdCBsaXN0IHdpbGwgYmUgb3V0cHV0LlxuIgorCXByaW50ZiAtLSAiLWQgICAgICAgICAgICAgT3V0cHV0IHRoZSBkZWZhdWx0IGNwaW8gbGlzdC4gIElmIG5vIDxjcGlvX3NvdXJjZT5cbiIKKwlwcmludGYgICAgIiAgICAgICAgICAgICAgIGlzIGdpdmVuIHRoZW4gdGhlIGRlZmF1bHQgY3BpbyBsaXN0IHdpbGwgYmUgb3V0cHV0LlxuIgorCXByaW50ZiAgICAiXG4iCisJcHJpbnRmICAgICJBbGwgb3B0aW9ucyBtYXkgYmUgcmVwZWF0ZWQgYW5kIGFyZSBpbnRlcnByZXRlZCBzZXF1ZW50aWFsbHlcbiIKKwlwcmludGYgICAgImFuZCBpbW1lZGlhdGVseS4gIC11IGFuZCAtZyBzdGF0ZXMgYXJlIHByZXNlcnZlZCBhY3Jvc3NcbiIKKwlwcmludGYgICAgIjxjcGlvX3NvdXJjZT4gb3B0aW9ucyBzbyBhbiBleHBsaWNpdCBcIi11IDAgLWcgMFwiIGlzIHJlcXVpcmVkXG4iCisJcHJpbnRmICAgICJ0byByZXNldCB0aGUgcm9vdC9ncm91cCBtYXBwaW5nLlxuIgorfQorCitidWlsZF9saXN0KCkgeworCXByaW50ZiAiXG4jIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiMgJGNwaW9fc291cmNlXG4iCisKKwlpZiBbIC1mICIkY3Bpb19zb3VyY2UiIF07IHRoZW4KKwkJcHJpbnRfbXRpbWUgIiRjcGlvX3NvdXJjZSIKKwkJY2F0ICIkY3Bpb19zb3VyY2UiCisJZWxpZiBbIC1kICIkY3Bpb19zb3VyY2UiIF07IHRoZW4KKwkJc3JjZGlyPSQoZWNobyAiJGNwaW9fc291cmNlIiB8IHNlZCAtZSAnczovLyo6LzpnJykKKwkJZGlybGlzdD0kKGZpbmQgIiR7c3JjZGlyfSIgLXByaW50ZiAiJXAgJW0gJVUgJUdcbiIgMj4vZGV2L251bGwpCisKKwkJIyBJZiAkZGlybGlzdCBpcyBvbmx5IG9uZSBsaW5lLCB0aGVuIHRoZSBkaXJlY3RvcnkgaXMgZW1wdHkKKwkJaWYgWyAgIiQoZWNobyAiJHtkaXJsaXN0fSIgfCB3YyAtbCkiIC1ndCAxIF07IHRoZW4KKwkJCXByaW50X210aW1lICIkY3Bpb19zb3VyY2UiCisJCQorCQkJZWNobyAiJHtkaXJsaXN0fSIgfCBcCisJCQl3aGlsZSByZWFkIHg7IGRvCisJCQkJcGFyc2UgJHt4fQorCQkJZG9uZQorCQllbHNlCisJCQkjIEZhaWxzYWZlIGluIGNhc2UgZGlyZWN0b3J5IGlzIGVtcHR5CisJCQlkZWZhdWx0X2luaXRyYW1mcworCQlmaQorCWVsc2UKKwkJZWNobyAiICAkMDogQ2Fubm90IG9wZW4gJyRjcGlvX3NvdXJjZSciID4mMgorCQlleGl0IDEKKwlmaQorfQorCisKK3Jvb3RfdWlkPTAKK3Jvb3RfZ2lkPTAKKword2hpbGUgWyAkIyAtZ3QgMCBdOyBkbworCWFyZz0iJDEiCisJc2hpZnQKKwljYXNlICIkYXJnIiBpbgorCQkiLXUiKQorCQkJcm9vdF91aWQ9IiQxIgorCQkJc2hpZnQKKwkJCTs7CisJCSItZyIpCisJCQlyb290X2dpZD0iJDEiCisJCQlzaGlmdAorCQkJOzsKKwkJIi1kIikKKwkJCWRlZmF1bHRfbGlzdD0iJGFyZyIKKwkJCWRlZmF1bHRfaW5pdHJhbWZzCisJCQk7OworCQkiLWgiKQorCQkJdXNhZ2UKKwkJCWV4aXQgMAorCQkJOzsKKwkJKikKKwkJCWNhc2UgIiRhcmciIGluCisJCQkJIi0iKikKKwkJCQkJcHJpbnRmICJFUlJPUjogdW5rbm93biBvcHRpb24gXCIkYXJnXCJcbiIgPiYyCisJCQkJCXByaW50ZiAiSWYgdGhlIGZpbGVuYW1lIHZhbGlkbHkgYmVnaW5zIHdpdGggJy0nLCB0aGVuIGl0IG11c3QgYmUgcHJlZml4ZWRcbiIgPiYyCisJCQkJCXByaW50ZiAiYnkgJy4vJyBzbyB0aGF0IGl0IHdvbid0IGJlIGludGVycHJldGVkIGFzIGFuIG9wdGlvbi4iID4mMgorCQkJCQlwcmludGYgIlxuIiA+JjIKKwkJCQkJdXNhZ2UgPiYyCisJCQkJCWV4aXQgMQorCQkJCQk7OworCQkJCSopCisJCQkJCWNwaW9fc291cmNlPSIkYXJnIgorCQkJCQlidWlsZF9saXN0CisJCQkJCTs7CisJCQllc2FjCisJCQk7OworCWVzYWMKK2RvbmUKKworIyBzcGl0IG91dCB0aGUgZGVmYXVsdCBjcGlvIGxpc3QgaWYgYSBzb3VyY2UgaGFzbid0IGJlZW4gc3BlY2lmaWVkCitbIC16ICIkY3Bpb19zb3VyY2UiIC1hIC16ICIkZGVmYXVsdF9saXN0IiBdICYmIGRlZmF1bHRfaW5pdHJhbWZzCisKK2V4aXQgMApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZW5rc3ltcy9NYWtlZmlsZSBiL3NjcmlwdHMvZ2Vua3N5bXMvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg3NWYyOQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZ2Vua3N5bXMvTWFrZWZpbGUKQEAgLTAsMCArMSw0OSBAQAorCitob3N0cHJvZ3MteQk6PSBnZW5rc3ltcworYWx3YXlzCQk6PSAkKGhvc3Rwcm9ncy15KQorCitnZW5rc3ltcy1vYmpzCTo9IGdlbmtzeW1zLm8gcGFyc2UubyBsZXgubworCisjIC1JIG5lZWRlZCBmb3IgZ2VuZXJhdGVkIEMgc291cmNlIChzaGlwcGVkIHNvdXJjZSkKK0hPU1RDRkxBR1NfcGFyc2UubyA6PSAtV25vLXVuaW5pdGlhbGl6ZWQgLUkkKHNyYykKKworIyBkZXBlbmRlbmNpZXMgb24gZ2VuZXJhdGVkIGZpbGVzIG5lZWQgdG8gYmUgbGlzdGVkIGV4cGxpY2l0bHkKKyQob2JqKS9sZXgubzogJChvYmopL3BhcnNlLmggJChvYmopL2tleXdvcmRzLmMKKworIyAtSSBuZWVkZWQgZm9yIGdlbmVyYXRlZCBDIHNvdXJjZSAoc2hpcHBlZCBzb3VyY2UpCitIT1NUQ0ZMQUdTX2xleC5vIDo9IC1JJChzcmMpCisKK2lmZGVmIEdFTkVSQVRFX1BBUlNFUgorCisjIGdwZXJmCisKK3F1aWV0X2NtZF9rZXl3b3Jkcy5jID0gR1BFUkYgICAkQAorICAgICAgY21kX2tleXdvcmRzLmMgPSBncGVyZiAtTCBBTlNJLUMgLWEgLUMgLUUgLWcgLUggaXNfcmVzZXJ2ZWRfaGFzaAlcCisJCSAgICAgICAtayAxLDMsJCQgLU4gaXNfcmVzZXJ2ZWRfd29yZCAtcCAtdCAkPCA+ICRACisKKyQob2JqKS9rZXl3b3Jkcy5jOiAkKG9iaikva2V5d29yZHMuZ3BlcmYgRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxrZXl3b3Jkcy5jKQorCisjIGZsZXgKKworcXVpZXRfY21kX2xleC5jID0gRkxFWCAgICAkQAorICAgICAgY21kX2xleC5jID0gZmxleCAtbyRAIC1kICQoZmlsdGVyLW91dCBGT1JDRSwkXikKKworJChvYmopL2xleC5jOiAkKG9iaikvbGV4LmwgJChvYmopL3BhcnNlLmggRk9SQ0UKKwkkKGNhbGwgaWZfY2hhbmdlZCxsZXguYykKKworIyBiaXNvbgorCitxdWlldF9jbWRfcGFyc2UuYyA9IEJJU09OICAgJEAKKyAgICAgIGNtZF9wYXJzZS5jID0gYmlzb24gLW8kQCAtZHR2ICQoZmlsdGVyLW91dCBGT1JDRSwkXikKKworJChvYmopL3BhcnNlLmM6ICQob2JqKS9wYXJzZS55IEZPUkNFCisJJChjYWxsIGlmX2NoYW5nZWQscGFyc2UuYykKKworJChvYmopL3BhcnNlLmg6ICQob2JqKS9wYXJzZS5jIDsKKworY2xlYW4tZmlsZXMJKz0gcGFyc2Uub3V0cHV0CisKK2VuZGlmCisKK3RhcmdldHMgKz0ga2V5d29yZHMuYyBsZXguYyBwYXJzZS5jIHBhcnNlLmgKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZ2Vua3N5bXMvZ2Vua3N5bXMuYyBiL3NjcmlwdHMvZ2Vua3N5bXMvZ2Vua3N5bXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTZhNjk0Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9nZW5rc3ltcy9nZW5rc3ltcy5jCkBAIC0wLDAgKzEsNTkxIEBACisvKiBHZW5lcmF0ZSBrZXJuZWwgc3ltYm9sIHZlcnNpb24gaGFzaGVzLgorICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgTGludXggSW50ZXJuYXRpb25hbC4KKworICAgTmV3IGltcGxlbWVudGF0aW9uIGNvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+CisgICBCYXNlZCBvbiBvcmlnaW5hbCB3b3JrIGJ5IEJqb3JuIEVrd2FsbCA8Ymowcm5AYmxveC5zZT4KKworICAgVGhpcyBmaWxlIHdhcyBwYXJ0IG9mIHRoZSBMaW51eCBtb2R1dGlscyAyLjQuMjI6IG1vdmVkIGJhY2sgaW50byB0aGUKKyAgIGtlcm5lbCBzb3VyY2VzIGJ5IFJ1c3R5IFJ1c3NlbGwvS2FpIEdlcm1hc2NoZXdza2kuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2lmZGVmIF9fR05VX0xJQlJBUllfXworI2luY2x1ZGUgPGdldG9wdC5oPgorI2VuZGlmIC8qIF9fR05VX0xJQlJBUllfXyAqLworCisjaW5jbHVkZSAiZ2Vua3N5bXMuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBIQVNIX0JVQ0tFVFMgIDQwOTYKKworc3RhdGljIHN0cnVjdCBzeW1ib2wgKnN5bXRhYltIQVNIX0JVQ0tFVFNdOworRklMRSAqZGVidWdmaWxlOworCitpbnQgY3VyX2xpbmUgPSAxOworY2hhciAqY3VyX2ZpbGVuYW1lLCAqb3V0cHV0X2RpcmVjdG9yeTsKKworaW50IGZsYWdfZGVidWcsIGZsYWdfZHVtcF9kZWZzLCBmbGFnX3dhcm5pbmdzOworCitzdGF0aWMgaW50IGVycm9yczsKK3N0YXRpYyBpbnQgbnN5bXM7CisKK3N0YXRpYyBzdHJ1Y3Qgc3ltYm9sICpleHBhbnNpb25fdHJhaWw7CisKK3N0YXRpYyBjb25zdCBjaGFyICogY29uc3Qgc3ltYm9sX3R5cGVfbmFtZVtdID0geworICAibm9ybWFsIiwgInR5cGVkZWYiLCAiZW51bSIsICJzdHJ1Y3QiLCAidW5pb24iCit9OworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IGNyY3RhYjMyW10gPQoreworICAweDAwMDAwMDAwVSwgMHg3NzA3MzA5NlUsIDB4ZWUwZTYxMmNVLCAweDk5MDk1MWJhVSwgMHgwNzZkYzQxOVUsCisgIDB4NzA2YWY0OGZVLCAweGU5NjNhNTM1VSwgMHg5ZTY0OTVhM1UsIDB4MGVkYjg4MzJVLCAweDc5ZGNiOGE0VSwKKyAgMHhlMGQ1ZTkxZVUsIDB4OTdkMmQ5ODhVLCAweDA5YjY0YzJiVSwgMHg3ZWIxN2NiZFUsIDB4ZTdiODJkMDdVLAorICAweDkwYmYxZDkxVSwgMHgxZGI3MTA2NFUsIDB4NmFiMDIwZjJVLCAweGYzYjk3MTQ4VSwgMHg4NGJlNDFkZVUsCisgIDB4MWFkYWQ0N2RVLCAweDZkZGRlNGViVSwgMHhmNGQ0YjU1MVUsIDB4ODNkMzg1YzdVLCAweDEzNmM5ODU2VSwKKyAgMHg2NDZiYThjMFUsIDB4ZmQ2MmY5N2FVLCAweDhhNjVjOWVjVSwgMHgxNDAxNWM0ZlUsIDB4NjMwNjZjZDlVLAorICAweGZhMGYzZDYzVSwgMHg4ZDA4MGRmNVUsIDB4M2I2ZTIwYzhVLCAweDRjNjkxMDVlVSwgMHhkNTYwNDFlNFUsCisgIDB4YTI2NzcxNzJVLCAweDNjMDNlNGQxVSwgMHg0YjA0ZDQ0N1UsIDB4ZDIwZDg1ZmRVLCAweGE1MGFiNTZiVSwKKyAgMHgzNWI1YThmYVUsIDB4NDJiMjk4NmNVLCAweGRiYmJjOWQ2VSwgMHhhY2JjZjk0MFUsIDB4MzJkODZjZTNVLAorICAweDQ1ZGY1Yzc1VSwgMHhkY2Q2MGRjZlUsIDB4YWJkMTNkNTlVLCAweDI2ZDkzMGFjVSwgMHg1MWRlMDAzYVUsCisgIDB4YzhkNzUxODBVLCAweGJmZDA2MTE2VSwgMHgyMWI0ZjRiNVUsIDB4NTZiM2M0MjNVLCAweGNmYmE5NTk5VSwKKyAgMHhiOGJkYTUwZlUsIDB4MjgwMmI4OWVVLCAweDVmMDU4ODA4VSwgMHhjNjBjZDliMlUsIDB4YjEwYmU5MjRVLAorICAweDJmNmY3Yzg3VSwgMHg1ODY4NGMxMVUsIDB4YzE2MTFkYWJVLCAweGI2NjYyZDNkVSwgMHg3NmRjNDE5MFUsCisgIDB4MDFkYjcxMDZVLCAweDk4ZDIyMGJjVSwgMHhlZmQ1MTAyYVUsIDB4NzFiMTg1ODlVLCAweDA2YjZiNTFmVSwKKyAgMHg5ZmJmZTRhNVUsIDB4ZThiOGQ0MzNVLCAweDc4MDdjOWEyVSwgMHgwZjAwZjkzNFUsIDB4OTYwOWE4OGVVLAorICAweGUxMGU5ODE4VSwgMHg3ZjZhMGRiYlUsIDB4MDg2ZDNkMmRVLCAweDkxNjQ2Yzk3VSwgMHhlNjYzNWMwMVUsCisgIDB4NmI2YjUxZjRVLCAweDFjNmM2MTYyVSwgMHg4NTY1MzBkOFUsIDB4ZjI2MjAwNGVVLCAweDZjMDY5NWVkVSwKKyAgMHgxYjAxYTU3YlUsIDB4ODIwOGY0YzFVLCAweGY1MGZjNDU3VSwgMHg2NWIwZDljNlUsIDB4MTJiN2U5NTBVLAorICAweDhiYmViOGVhVSwgMHhmY2I5ODg3Y1UsIDB4NjJkZDFkZGZVLCAweDE1ZGEyZDQ5VSwgMHg4Y2QzN2NmM1UsCisgIDB4ZmJkNDRjNjVVLCAweDRkYjI2MTU4VSwgMHgzYWI1NTFjZVUsIDB4YTNiYzAwNzRVLCAweGQ0YmIzMGUyVSwKKyAgMHg0YWRmYTU0MVUsIDB4M2RkODk1ZDdVLCAweGE0ZDFjNDZkVSwgMHhkM2Q2ZjRmYlUsIDB4NDM2OWU5NmFVLAorICAweDM0NmVkOWZjVSwgMHhhZDY3ODg0NlUsIDB4ZGE2MGI4ZDBVLCAweDQ0MDQyZDczVSwgMHgzMzAzMWRlNVUsCisgIDB4YWEwYTRjNWZVLCAweGRkMGQ3Y2M5VSwgMHg1MDA1NzEzY1UsIDB4MjcwMjQxYWFVLCAweGJlMGIxMDEwVSwKKyAgMHhjOTBjMjA4NlUsIDB4NTc2OGI1MjVVLCAweDIwNmY4NWIzVSwgMHhiOTY2ZDQwOVUsIDB4Y2U2MWU0OWZVLAorICAweDVlZGVmOTBlVSwgMHgyOWQ5Yzk5OFUsIDB4YjBkMDk4MjJVLCAweGM3ZDdhOGI0VSwgMHg1OWIzM2QxN1UsCisgIDB4MmViNDBkODFVLCAweGI3YmQ1YzNiVSwgMHhjMGJhNmNhZFUsIDB4ZWRiODgzMjBVLCAweDlhYmZiM2I2VSwKKyAgMHgwM2I2ZTIwY1UsIDB4NzRiMWQyOWFVLCAweGVhZDU0NzM5VSwgMHg5ZGQyNzdhZlUsIDB4MDRkYjI2MTVVLAorICAweDczZGMxNjgzVSwgMHhlMzYzMGIxMlUsIDB4OTQ2NDNiODRVLCAweDBkNmQ2YTNlVSwgMHg3YTZhNWFhOFUsCisgIDB4ZTQwZWNmMGJVLCAweDkzMDlmZjlkVSwgMHgwYTAwYWUyN1UsIDB4N2QwNzllYjFVLCAweGYwMGY5MzQ0VSwKKyAgMHg4NzA4YTNkMlUsIDB4MWUwMWYyNjhVLCAweDY5MDZjMmZlVSwgMHhmNzYyNTc1ZFUsIDB4ODA2NTY3Y2JVLAorICAweDE5NmMzNjcxVSwgMHg2ZTZiMDZlN1UsIDB4ZmVkNDFiNzZVLCAweDg5ZDMyYmUwVSwgMHgxMGRhN2E1YVUsCisgIDB4NjdkZDRhY2NVLCAweGY5YjlkZjZmVSwgMHg4ZWJlZWZmOVUsIDB4MTdiN2JlNDNVLCAweDYwYjA4ZWQ1VSwKKyAgMHhkNmQ2YTNlOFUsIDB4YTFkMTkzN2VVLCAweDM4ZDhjMmM0VSwgMHg0ZmRmZjI1MlUsIDB4ZDFiYjY3ZjFVLAorICAweGE2YmM1NzY3VSwgMHgzZmI1MDZkZFUsIDB4NDhiMjM2NGJVLCAweGQ4MGQyYmRhVSwgMHhhZjBhMWI0Y1UsCisgIDB4MzYwMzRhZjZVLCAweDQxMDQ3YTYwVSwgMHhkZjYwZWZjM1UsIDB4YTg2N2RmNTVVLCAweDMxNmU4ZWVmVSwKKyAgMHg0NjY5YmU3OVUsIDB4Y2I2MWIzOGNVLCAweGJjNjY4MzFhVSwgMHgyNTZmZDJhMFUsIDB4NTI2OGUyMzZVLAorICAweGNjMGM3Nzk1VSwgMHhiYjBiNDcwM1UsIDB4MjIwMjE2YjlVLCAweDU1MDUyNjJmVSwgMHhjNWJhM2JiZVUsCisgIDB4YjJiZDBiMjhVLCAweDJiYjQ1YTkyVSwgMHg1Y2IzNmEwNFUsIDB4YzJkN2ZmYTdVLCAweGI1ZDBjZjMxVSwKKyAgMHgyY2Q5OWU4YlUsIDB4NWJkZWFlMWRVLCAweDliNjRjMmIwVSwgMHhlYzYzZjIyNlUsIDB4NzU2YWEzOWNVLAorICAweDAyNmQ5MzBhVSwgMHg5YzA5MDZhOVUsIDB4ZWIwZTM2M2ZVLCAweDcyMDc2Nzg1VSwgMHgwNTAwNTcxM1UsCisgIDB4OTViZjRhODJVLCAweGUyYjg3YTE0VSwgMHg3YmIxMmJhZVUsIDB4MGNiNjFiMzhVLCAweDkyZDI4ZTliVSwKKyAgMHhlNWQ1YmUwZFUsIDB4N2NkY2VmYjdVLCAweDBiZGJkZjIxVSwgMHg4NmQzZDJkNFUsIDB4ZjFkNGUyNDJVLAorICAweDY4ZGRiM2Y4VSwgMHgxZmRhODM2ZVUsIDB4ODFiZTE2Y2RVLCAweGY2YjkyNjViVSwgMHg2ZmIwNzdlMVUsCisgIDB4MThiNzQ3NzdVLCAweDg4MDg1YWU2VSwgMHhmZjBmNmE3MFUsIDB4NjYwNjNiY2FVLCAweDExMDEwYjVjVSwKKyAgMHg4ZjY1OWVmZlUsIDB4Zjg2MmFlNjlVLCAweDYxNmJmZmQzVSwgMHgxNjZjY2Y0NVUsIDB4YTAwYWUyNzhVLAorICAweGQ3MGRkMmVlVSwgMHg0ZTA0ODM1NFUsIDB4MzkwM2IzYzJVLCAweGE3NjcyNjYxVSwgMHhkMDYwMTZmN1UsCisgIDB4NDk2OTQ3NGRVLCAweDNlNmU3N2RiVSwgMHhhZWQxNmE0YVUsIDB4ZDlkNjVhZGNVLCAweDQwZGYwYjY2VSwKKyAgMHgzN2Q4M2JmMFUsIDB4YTliY2FlNTNVLCAweGRlYmI5ZWM1VSwgMHg0N2IyY2Y3ZlUsIDB4MzBiNWZmZTlVLAorICAweGJkYmRmMjFjVSwgMHhjYWJhYzI4YVUsIDB4NTNiMzkzMzBVLCAweDI0YjRhM2E2VSwgMHhiYWQwMzYwNVUsCisgIDB4Y2RkNzA2OTNVLCAweDU0ZGU1NzI5VSwgMHgyM2Q5NjdiZlUsIDB4YjM2NjdhMmVVLCAweGM0NjE0YWI4VSwKKyAgMHg1ZDY4MWIwMlUsIDB4MmE2ZjJiOTRVLCAweGI0MGJiZTM3VSwgMHhjMzBjOGVhMVUsIDB4NWEwNWRmMWJVLAorICAweDJkMDJlZjhkVQorfTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nCitwYXJ0aWFsX2NyYzMyX29uZSh1bnNpZ25lZCBjaGFyIGMsIHVuc2lnbmVkIGxvbmcgY3JjKQoreworICByZXR1cm4gY3JjdGFiMzJbKGNyYyBeIGMpICYgMHhmZl0gXiAoY3JjID4+IDgpOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK3BhcnRpYWxfY3JjMzIoY29uc3QgY2hhciAqcywgdW5zaWduZWQgbG9uZyBjcmMpCit7CisgIHdoaWxlICgqcykKKyAgICBjcmMgPSBwYXJ0aWFsX2NyYzMyX29uZSgqcysrLCBjcmMpOworICByZXR1cm4gY3JjOworfQorCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcKK2NyYzMyKGNvbnN0IGNoYXIgKnMpCit7CisgIHJldHVybiBwYXJ0aWFsX2NyYzMyKHMsIDB4ZmZmZmZmZmYpIF4gMHhmZmZmZmZmZjsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW5saW5lIGVudW0gc3ltYm9sX3R5cGUKK21hcF90b19ucyhlbnVtIHN5bWJvbF90eXBlIHQpCit7CisgIGlmICh0ID09IFNZTV9UWVBFREVGKQorICAgIHQgPSBTWU1fTk9STUFMOworICBlbHNlIGlmICh0ID09IFNZTV9VTklPTikKKyAgICB0ID0gU1lNX1NUUlVDVDsKKyAgcmV0dXJuIHQ7Cit9CisKK3N0cnVjdCBzeW1ib2wgKgorZmluZF9zeW1ib2woY29uc3QgY2hhciAqbmFtZSwgZW51bSBzeW1ib2xfdHlwZSBucykKK3sKKyAgdW5zaWduZWQgbG9uZyBoID0gY3JjMzIobmFtZSkgJSBIQVNIX0JVQ0tFVFM7CisgIHN0cnVjdCBzeW1ib2wgKnN5bTsKKworICBmb3IgKHN5bSA9IHN5bXRhYltoXTsgc3ltIDsgc3ltID0gc3ltLT5oYXNoX25leHQpCisgICAgaWYgKG1hcF90b19ucyhzeW0tPnR5cGUpID09IG1hcF90b19ucyhucykgJiYgc3RyY21wKG5hbWUsIHN5bS0+bmFtZSkgPT0gMCkKKyAgICAgIGJyZWFrOworCisgIHJldHVybiBzeW07Cit9CisKK3N0cnVjdCBzeW1ib2wgKgorYWRkX3N5bWJvbChjb25zdCBjaGFyICpuYW1lLCBlbnVtIHN5bWJvbF90eXBlIHR5cGUsIHN0cnVjdCBzdHJpbmdfbGlzdCAqZGVmbiwgaW50IGlzX2V4dGVybikKK3sKKyAgdW5zaWduZWQgbG9uZyBoID0gY3JjMzIobmFtZSkgJSBIQVNIX0JVQ0tFVFM7CisgIHN0cnVjdCBzeW1ib2wgKnN5bTsKKworICBmb3IgKHN5bSA9IHN5bXRhYltoXTsgc3ltIDsgc3ltID0gc3ltLT5oYXNoX25leHQpCisgICAgaWYgKG1hcF90b19ucyhzeW0tPnR5cGUpID09IG1hcF90b19ucyh0eXBlKQorCSYmIHN0cmNtcChuYW1lLCBzeW0tPm5hbWUpID09IDApCisgICAgICB7CisJaWYgKCFlcXVhbF9saXN0KHN5bS0+ZGVmbiwgZGVmbikpCisJICBlcnJvcl93aXRoX3BvcygicmVkZWZpbml0aW9uIG9mICVzIiwgbmFtZSk7CisJcmV0dXJuIHN5bTsKKyAgICAgIH0KKworICBzeW0gPSB4bWFsbG9jKHNpemVvZigqc3ltKSk7CisgIHN5bS0+bmFtZSA9IG5hbWU7CisgIHN5bS0+dHlwZSA9IHR5cGU7CisgIHN5bS0+ZGVmbiA9IGRlZm47CisgIHN5bS0+ZXhwYW5zaW9uX3RyYWlsID0gTlVMTDsKKyAgc3ltLT5pc19leHRlcm4gPSBpc19leHRlcm47CisKKyAgc3ltLT5oYXNoX25leHQgPSBzeW10YWJbaF07CisgIHN5bXRhYltoXSA9IHN5bTsKKworICBpZiAoZmxhZ19kZWJ1ZykKKyAgICB7CisgICAgICBmcHJpbnRmKGRlYnVnZmlsZSwgIkRlZm4gZm9yICVzICVzID09IDwiLCBzeW1ib2xfdHlwZV9uYW1lW3R5cGVdLCAgbmFtZSk7CisgICAgICBpZiAoaXNfZXh0ZXJuKQorICAgICAgICBmcHV0cygiZXh0ZXJuICIsIGRlYnVnZmlsZSk7CisgICAgICBwcmludF9saXN0KGRlYnVnZmlsZSwgZGVmbik7CisgICAgICBmcHV0cygiPlxuIiwgZGVidWdmaWxlKTsKKyAgICB9CisKKyAgKytuc3ltczsKKyAgcmV0dXJuIHN5bTsKK30KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitpbmxpbmUgdm9pZAorZnJlZV9ub2RlKHN0cnVjdCBzdHJpbmdfbGlzdCAqbm9kZSkKK3sKKyAgZnJlZShub2RlLT5zdHJpbmcpOworICBmcmVlKG5vZGUpOworfQorCit2b2lkCitmcmVlX2xpc3Qoc3RydWN0IHN0cmluZ19saXN0ICpzLCBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmUpCit7CisgIHdoaWxlIChzICE9IGUpCisgICAgeworICAgICAgc3RydWN0IHN0cmluZ19saXN0ICpuZXh0ID0gcy0+bmV4dDsKKyAgICAgIGZyZWVfbm9kZShzKTsKKyAgICAgIHMgPSBuZXh0OworICAgIH0KK30KKworaW5saW5lIHN0cnVjdCBzdHJpbmdfbGlzdCAqCitjb3B5X25vZGUoc3RydWN0IHN0cmluZ19saXN0ICpub2RlKQoreworICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKm5ld25vZGU7CisKKyAgbmV3bm9kZSA9IHhtYWxsb2Moc2l6ZW9mKCpuZXdub2RlKSk7CisgIG5ld25vZGUtPnN0cmluZyA9IHhzdHJkdXAobm9kZS0+c3RyaW5nKTsKKyAgbmV3bm9kZS0+dGFnID0gbm9kZS0+dGFnOworCisgIHJldHVybiBuZXdub2RlOworfQorCitzdHJ1Y3Qgc3RyaW5nX2xpc3QgKgorY29weV9saXN0KHN0cnVjdCBzdHJpbmdfbGlzdCAqcywgc3RydWN0IHN0cmluZ19saXN0ICplKQoreworICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmgsICpwOworCisgIGlmIChzID09IGUpCisgICAgcmV0dXJuIE5VTEw7CisKKyAgcCA9IGggPSBjb3B5X25vZGUocyk7CisgIHdoaWxlICgocyA9IHMtPm5leHQpICE9IGUpCisgICAgcCA9IHAtPm5leHQgPSBjb3B5X25vZGUocyk7CisgIHAtPm5leHQgPSBOVUxMOworCisgIHJldHVybiBoOworfQorCitpbnQKK2VxdWFsX2xpc3Qoc3RydWN0IHN0cmluZ19saXN0ICphLCBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmIpCit7CisgIHdoaWxlIChhICYmIGIpCisgICAgeworICAgICAgaWYgKGEtPnRhZyAhPSBiLT50YWcgfHwgc3RyY21wKGEtPnN0cmluZywgYi0+c3RyaW5nKSkKKwlyZXR1cm4gMDsKKyAgICAgIGEgPSBhLT5uZXh0OworICAgICAgYiA9IGItPm5leHQ7CisgICAgfQorCisgIHJldHVybiAhYSAmJiAhYjsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitwcmludF9ub2RlKEZJTEUgKmYsIHN0cnVjdCBzdHJpbmdfbGlzdCAqbGlzdCkKK3sKKyAgc3dpdGNoIChsaXN0LT50YWcpCisgICAgeworICAgIGNhc2UgU1lNX1NUUlVDVDoKKyAgICAgIHB1dGMoJ3MnLCBmKTsKKyAgICAgIGdvdG8gcHJpbnRpdDsKKyAgICBjYXNlIFNZTV9VTklPTjoKKyAgICAgIHB1dGMoJ3UnLCBmKTsKKyAgICAgIGdvdG8gcHJpbnRpdDsKKyAgICBjYXNlIFNZTV9FTlVNOgorICAgICAgcHV0YygnZScsIGYpOworICAgICAgZ290byBwcmludGl0OworICAgIGNhc2UgU1lNX1RZUEVERUY6CisgICAgICBwdXRjKCd0JywgZik7CisgICAgICBnb3RvIHByaW50aXQ7CisKKyAgICBwcmludGl0OgorICAgICAgcHV0YygnIycsIGYpOworICAgIGNhc2UgU1lNX05PUk1BTDoKKyAgICAgIGZwdXRzKGxpc3QtPnN0cmluZywgZik7CisgICAgICBicmVhazsKKyAgICB9Cit9CisKK3ZvaWQKK3ByaW50X2xpc3QoRklMRSAqZiwgc3RydWN0IHN0cmluZ19saXN0ICpsaXN0KQoreworICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKiplLCAqKmI7CisgIHN0cnVjdCBzdHJpbmdfbGlzdCAqdG1wLCAqKnRtcDI7CisgIGludCBlbGVtID0gMTsKKworICBpZiAobGlzdCA9PSBOVUxMKQorICAgIHsKKyAgICAgIGZwdXRzKCIobmlsKSIsIGYpOworICAgICAgcmV0dXJuOworICAgIH0KKworICB0bXAgPSBsaXN0OworICB3aGlsZSgodG1wID0gdG1wLT5uZXh0KSAhPSBOVUxMKQorCSAgZWxlbSsrOworCisgIGIgPSBhbGxvY2EoZWxlbSAqIHNpemVvZigqZSkpOworICBlID0gYiArIGVsZW07CisgIHRtcDIgPSBlIC0gMTsKKworICAoKnRtcDItLSkgPSBsaXN0OworICB3aGlsZSgobGlzdCA9IGxpc3QtPm5leHQpICE9IE5VTEwpCisJICAqKHRtcDItLSkgPSBsaXN0OworCisgIHdoaWxlIChiICE9IGUpCisgICAgeworICAgICAgcHJpbnRfbm9kZShmLCAqYisrKTsKKyAgICAgIHB1dGMoJyAnLCBmKTsKKyAgICB9Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nCitleHBhbmRfYW5kX2NyY19saXN0KHN0cnVjdCBzdHJpbmdfbGlzdCAqbGlzdCwgdW5zaWduZWQgbG9uZyBjcmMpCit7CisgIHN0cnVjdCBzdHJpbmdfbGlzdCAqKmUsICoqYjsKKyAgc3RydWN0IHN0cmluZ19saXN0ICp0bXAsICoqdG1wMjsKKyAgaW50IGVsZW0gPSAxOworCisgIGlmICghbGlzdCkKKyAgICByZXR1cm4gY3JjOworCisgIHRtcCA9IGxpc3Q7CisgIHdoaWxlKCh0bXAgPSB0bXAtPm5leHQpICE9IE5VTEwpCisJICBlbGVtKys7CisKKyAgYiA9IGFsbG9jYShlbGVtICogc2l6ZW9mKCplKSk7CisgIGUgPSBiICsgZWxlbTsKKyAgdG1wMiA9IGUgLSAxOworCisgICoodG1wMi0tKSA9IGxpc3Q7CisgIHdoaWxlICgobGlzdCA9IGxpc3QtPm5leHQpICE9IE5VTEwpCisgICAgKih0bXAyLS0pID0gbGlzdDsKKworICB3aGlsZSAoYiAhPSBlKQorICAgIHsKKyAgICAgIHN0cnVjdCBzdHJpbmdfbGlzdCAqY3VyOworICAgICAgc3RydWN0IHN5bWJvbCAqc3Vic3ltOworCisgICAgICBjdXIgPSAqKGIrKyk7CisgICAgICBzd2l0Y2ggKGN1ci0+dGFnKQorCXsKKwljYXNlIFNZTV9OT1JNQUw6CisJICBpZiAoZmxhZ19kdW1wX2RlZnMpCisJICAgIGZwcmludGYoZGVidWdmaWxlLCAiJXMgIiwgY3VyLT5zdHJpbmcpOworCSAgY3JjID0gcGFydGlhbF9jcmMzMihjdXItPnN0cmluZywgY3JjKTsKKwkgIGNyYyA9IHBhcnRpYWxfY3JjMzJfb25lKCcgJywgY3JjKTsKKwkgIGJyZWFrOworCisJY2FzZSBTWU1fVFlQRURFRjoKKwkgIHN1YnN5bSA9IGZpbmRfc3ltYm9sKGN1ci0+c3RyaW5nLCBjdXItPnRhZyk7CisJICBpZiAoc3Vic3ltLT5leHBhbnNpb25fdHJhaWwpCisJICAgIHsKKwkgICAgICBpZiAoZmxhZ19kdW1wX2RlZnMpCisJCWZwcmludGYoZGVidWdmaWxlLCAiJXMgIiwgY3VyLT5zdHJpbmcpOworCSAgICAgIGNyYyA9IHBhcnRpYWxfY3JjMzIoY3VyLT5zdHJpbmcsIGNyYyk7CisJICAgICAgY3JjID0gcGFydGlhbF9jcmMzMl9vbmUoJyAnLCBjcmMpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBzdWJzeW0tPmV4cGFuc2lvbl90cmFpbCA9IGV4cGFuc2lvbl90cmFpbDsKKwkgICAgICBleHBhbnNpb25fdHJhaWwgPSBzdWJzeW07CisJICAgICAgY3JjID0gZXhwYW5kX2FuZF9jcmNfbGlzdChzdWJzeW0tPmRlZm4sIGNyYyk7CisJICAgIH0KKwkgIGJyZWFrOworCisJY2FzZSBTWU1fU1RSVUNUOgorCWNhc2UgU1lNX1VOSU9OOgorCWNhc2UgU1lNX0VOVU06CisJICBzdWJzeW0gPSBmaW5kX3N5bWJvbChjdXItPnN0cmluZywgY3VyLT50YWcpOworCSAgaWYgKCFzdWJzeW0pCisJICAgIHsKKwkgICAgICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKm4sICp0ID0gTlVMTDsKKworCSAgICAgIGVycm9yX3dpdGhfcG9zKCJleHBhbmQgdW5kZWZpbmVkICVzICVzIiwKKwkJCSAgICAgc3ltYm9sX3R5cGVfbmFtZVtjdXItPnRhZ10sIGN1ci0+c3RyaW5nKTsKKworCSAgICAgIG4gPSB4bWFsbG9jKHNpemVvZigqbikpOworCSAgICAgIG4tPnN0cmluZyA9IHhzdHJkdXAoc3ltYm9sX3R5cGVfbmFtZVtjdXItPnRhZ10pOworCSAgICAgIG4tPnRhZyA9IFNZTV9OT1JNQUw7CisJICAgICAgbi0+bmV4dCA9IHQ7CisJICAgICAgdCA9IG47CisKKwkgICAgICBuID0geG1hbGxvYyhzaXplb2YoKm4pKTsKKwkgICAgICBuLT5zdHJpbmcgPSB4c3RyZHVwKGN1ci0+c3RyaW5nKTsKKwkgICAgICBuLT50YWcgPSBTWU1fTk9STUFMOworCSAgICAgIG4tPm5leHQgPSB0OworCSAgICAgIHQgPSBuOworCisJICAgICAgbiA9IHhtYWxsb2Moc2l6ZW9mKCpuKSk7CisJICAgICAgbi0+c3RyaW5nID0geHN0cmR1cCgieyBVTktOT1dOIH0iKTsKKwkgICAgICBuLT50YWcgPSBTWU1fTk9STUFMOworCSAgICAgIG4tPm5leHQgPSB0OworCisJICAgICAgc3Vic3ltID0gYWRkX3N5bWJvbChjdXItPnN0cmluZywgY3VyLT50YWcsIG4sIDApOworCSAgICB9CisJICBpZiAoc3Vic3ltLT5leHBhbnNpb25fdHJhaWwpCisJICAgIHsKKwkgICAgICBpZiAoZmxhZ19kdW1wX2RlZnMpCisJCXsKKwkJICBmcHJpbnRmKGRlYnVnZmlsZSwgIiVzICVzICIsIHN5bWJvbF90eXBlX25hbWVbY3VyLT50YWddLAorCQkJICBjdXItPnN0cmluZyk7CisJCX0KKworCSAgICAgIGNyYyA9IHBhcnRpYWxfY3JjMzIoc3ltYm9sX3R5cGVfbmFtZVtjdXItPnRhZ10sIGNyYyk7CisJICAgICAgY3JjID0gcGFydGlhbF9jcmMzMl9vbmUoJyAnLCBjcmMpOworCSAgICAgIGNyYyA9IHBhcnRpYWxfY3JjMzIoY3VyLT5zdHJpbmcsIGNyYyk7CisJICAgICAgY3JjID0gcGFydGlhbF9jcmMzMl9vbmUoJyAnLCBjcmMpOworCSAgICB9CisJICBlbHNlCisJICAgIHsKKwkgICAgICBzdWJzeW0tPmV4cGFuc2lvbl90cmFpbCA9IGV4cGFuc2lvbl90cmFpbDsKKwkgICAgICBleHBhbnNpb25fdHJhaWwgPSBzdWJzeW07CisJICAgICAgY3JjID0gZXhwYW5kX2FuZF9jcmNfbGlzdChzdWJzeW0tPmRlZm4sIGNyYyk7CisJICAgIH0KKwkgIGJyZWFrOworCX0KKyAgICB9CisKKyAgcmV0dXJuIGNyYzsKK30KKwordm9pZAorZXhwb3J0X3N5bWJvbChjb25zdCBjaGFyICpuYW1lKQoreworICBzdHJ1Y3Qgc3ltYm9sICpzeW07CisKKyAgc3ltID0gZmluZF9zeW1ib2wobmFtZSwgU1lNX05PUk1BTCk7CisgIGlmICghc3ltKQorICAgIGVycm9yX3dpdGhfcG9zKCJleHBvcnQgdW5kZWZpbmVkIHN5bWJvbCAlcyIsIG5hbWUpOworICBlbHNlCisgICAgeworICAgICAgdW5zaWduZWQgbG9uZyBjcmM7CisKKyAgICAgIGlmIChmbGFnX2R1bXBfZGVmcykKKwlmcHJpbnRmKGRlYnVnZmlsZSwgIkV4cG9ydCAlcyA9PSA8IiwgbmFtZSk7CisKKyAgICAgIGV4cGFuc2lvbl90cmFpbCA9IChzdHJ1Y3Qgc3ltYm9sICopLTFMOworCisgICAgICBjcmMgPSBleHBhbmRfYW5kX2NyY19saXN0KHN5bS0+ZGVmbiwgMHhmZmZmZmZmZikgXiAweGZmZmZmZmZmOworCisgICAgICBzeW0gPSBleHBhbnNpb25fdHJhaWw7CisgICAgICB3aGlsZSAoc3ltICE9IChzdHJ1Y3Qgc3ltYm9sICopLTFMKQorCXsKKwkgIHN0cnVjdCBzeW1ib2wgKm4gPSBzeW0tPmV4cGFuc2lvbl90cmFpbDsKKwkgIHN5bS0+ZXhwYW5zaW9uX3RyYWlsID0gMDsKKwkgIHN5bSA9IG47CisJfQorCisgICAgICBpZiAoZmxhZ19kdW1wX2RlZnMpCisJZnB1dHMoIj5cbiIsIGRlYnVnZmlsZSk7CisKKyAgICAgIC8qIFVzZWQgYXMgYSBsaW5rZXIgc2NyaXB0LiAqLworICAgICAgcHJpbnRmKCJfX2NyY18lcyA9IDB4JTA4bHggO1xuIiwgbmFtZSwgY3JjKTsKKyAgICB9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3ZvaWQKK2Vycm9yKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICB2YV9saXN0IGFyZ3M7CisKKyAgaWYgKGZsYWdfd2FybmluZ3MpCisgICAgeworICAgICAgdmFfc3RhcnQoYXJncywgZm10KTsKKyAgICAgIHZmcHJpbnRmKHN0ZGVyciwgZm10LCBhcmdzKTsKKyAgICAgIHZhX2VuZChhcmdzKTsKKyAgICAgIHB1dGMoJ1xuJywgc3RkZXJyKTsKKworICAgICAgZXJyb3JzKys7CisgICAgfQorfQorCit2b2lkCitlcnJvcl93aXRoX3Bvcyhjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKyAgdmFfbGlzdCBhcmdzOworCisgIGlmIChmbGFnX3dhcm5pbmdzKQorICAgIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJXM6JWQ6ICIsIGN1cl9maWxlbmFtZSA/IDogIjxzdGRpbj4iLCBjdXJfbGluZSk7CisKKyAgICAgIHZhX3N0YXJ0KGFyZ3MsIGZtdCk7CisgICAgICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXJncyk7CisgICAgICB2YV9lbmQoYXJncyk7CisgICAgICBwdXRjKCdcbicsIHN0ZGVycik7CisKKyAgICAgIGVycm9ycysrOworICAgIH0KK30KKworCit2b2lkIGdlbmtzeW1zX3VzYWdlKHZvaWQpCit7CisJZnB1dHMoIlVzYWdlOlxuIgorCSAgICAgICJnZW5rc3ltcyBbLWREd3FoVl0gPiAvcGF0aC90by8udG1wX29iai52ZXJcbiIKKwkgICAgICAiXG4iCisjaWZkZWYgX19HTlVfTElCUkFSWV9fCisJICAgICAgIiAgLWQsIC0tZGVidWcgICAgICAgICAgIEluY3JlbWVudCB0aGUgZGVidWcgbGV2ZWwgKHJlcGVhdGFibGUpXG4iCisJICAgICAgIiAgLUQsIC0tZHVtcCAgICAgICAgICAgIER1bXAgZXhwYW5kZWQgc3ltYm9sIGRlZnMgKGZvciBkZWJ1Z2dpbmcgb25seSlcbiIKKwkgICAgICAiICAtdywgLS13YXJuaW5ncyAgICAgICAgRW5hYmxlIHdhcm5pbmdzXG4iCisJICAgICAgIiAgLXEsIC0tcXVpZXQgICAgICAgICAgIERpc2FibGUgd2FybmluZ3MgKGRlZmF1bHQpXG4iCisJICAgICAgIiAgLWgsIC0taGVscCAgICAgICAgICAgIFByaW50IHRoaXMgbWVzc2FnZVxuIgorCSAgICAgICIgIC1WLCAtLXZlcnNpb24gICAgICAgICBQcmludCB0aGUgcmVsZWFzZSB2ZXJzaW9uXG4iCisjZWxzZSAgLyogX19HTlVfTElCUkFSWV9fICovCisgICAgICAgICAgICAgIiAgLWQgICAgICAgICAgICAgICAgICAgIEluY3JlbWVudCB0aGUgZGVidWcgbGV2ZWwgKHJlcGVhdGFibGUpXG4iCisgICAgICAgICAgICAgIiAgLUQgICAgICAgICAgICAgICAgICAgIER1bXAgZXhwYW5kZWQgc3ltYm9sIGRlZnMgKGZvciBkZWJ1Z2dpbmcgb25seSlcbiIKKyAgICAgICAgICAgICAiICAtdyAgICAgICAgICAgICAgICAgICAgRW5hYmxlIHdhcm5pbmdzXG4iCisgICAgICAgICAgICAgIiAgLXEgICAgICAgICAgICAgICAgICAgIERpc2FibGUgd2FybmluZ3MgKGRlZmF1bHQpXG4iCisgICAgICAgICAgICAgIiAgLWggICAgICAgICAgICAgICAgICAgIFByaW50IHRoaXMgbWVzc2FnZVxuIgorICAgICAgICAgICAgICIgIC1WICAgICAgICAgICAgICAgICAgICBQcmludCB0aGUgcmVsZWFzZSB2ZXJzaW9uXG4iCisjZW5kaWYgLyogX19HTlVfTElCUkFSWV9fICovCisJICAgICAgLCBzdGRlcnIpOworfQorCitpbnQKK21haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworICBpbnQgbzsKKworI2lmZGVmIF9fR05VX0xJQlJBUllfXworICBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0c1tdID0geworICAgIHsiZGVidWciLCAwLCAwLCAnZCd9LAorICAgIHsid2FybmluZ3MiLCAwLCAwLCAndyd9LAorICAgIHsicXVpZXQiLCAwLCAwLCAncSd9LAorICAgIHsiZHVtcCIsIDAsIDAsICdEJ30sCisgICAgeyJ2ZXJzaW9uIiwgMCwgMCwgJ1YnfSwKKyAgICB7ImhlbHAiLCAwLCAwLCAnaCd9LAorICAgIHswLCAwLCAwLCAwfQorICB9OworCisgIHdoaWxlICgobyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJkd3FWRGs6cDoiLAorCQkJICAmbG9uZ19vcHRzWzBdLCBOVUxMKSkgIT0gRU9GKQorI2Vsc2UgIC8qIF9fR05VX0xJQlJBUllfXyAqLworICB3aGlsZSAoKG8gPSBnZXRvcHQoYXJnYywgYXJndiwgImR3cVZEazpwOiIpKSAhPSBFT0YpCisjZW5kaWYgLyogX19HTlVfTElCUkFSWV9fICovCisgICAgc3dpdGNoIChvKQorICAgICAgeworICAgICAgY2FzZSAnZCc6CisJZmxhZ19kZWJ1ZysrOworCWJyZWFrOworICAgICAgY2FzZSAndyc6CisJZmxhZ193YXJuaW5ncyA9IDE7CisJYnJlYWs7CisgICAgICBjYXNlICdxJzoKKwlmbGFnX3dhcm5pbmdzID0gMDsKKwlicmVhazsKKyAgICAgIGNhc2UgJ1YnOgorCWZwdXRzKCJnZW5rc3ltcyB2ZXJzaW9uIDIuNS42MFxuIiwgc3RkZXJyKTsKKwlicmVhazsKKyAgICAgIGNhc2UgJ0QnOgorCWZsYWdfZHVtcF9kZWZzID0gMTsKKwlicmVhazsKKyAgICAgIGNhc2UgJ2gnOgorCWdlbmtzeW1zX3VzYWdlKCk7CisJcmV0dXJuIDA7CisgICAgICBkZWZhdWx0OgorCWdlbmtzeW1zX3VzYWdlKCk7CisJcmV0dXJuIDE7CisgICAgICB9CisKKyAgICB7CisgICAgICBleHRlcm4gaW50IHl5ZGVidWc7CisgICAgICBleHRlcm4gaW50IHl5X2ZsZXhfZGVidWc7CisKKyAgICAgIHl5ZGVidWcgPSAoZmxhZ19kZWJ1ZyA+IDEpOworICAgICAgeXlfZmxleF9kZWJ1ZyA9IChmbGFnX2RlYnVnID4gMik7CisKKyAgICAgIGRlYnVnZmlsZSA9IHN0ZGVycjsKKyAgICAgIC8qIHNldGxpbmVidWYoZGVidWdmaWxlKTsgKi8KKyAgICB9CisKKyAgeXlwYXJzZSgpOworCisgIGlmIChmbGFnX2RlYnVnKQorICAgIHsKKyAgICAgIGZwcmludGYoZGVidWdmaWxlLCAiSGFzaCB0YWJsZSBvY2N1cGFuY3kgJWQvJWQgPSAlZ1xuIiwKKwkgICAgICBuc3ltcywgSEFTSF9CVUNLRVRTLCAoZG91YmxlKW5zeW1zIC8gKGRvdWJsZSlIQVNIX0JVQ0tFVFMpOworICAgIH0KKworICByZXR1cm4gZXJyb3JzICE9IDA7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2dlbmtzeW1zL2dlbmtzeW1zLmggYi9zY3JpcHRzL2dlbmtzeW1zL2dlbmtzeW1zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA5YWY0NwotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZ2Vua3N5bXMvZ2Vua3N5bXMuaApAQCAtMCwwICsxLDEwNCBAQAorLyogR2VuZXJhdGUga2VybmVsIHN5bWJvbCB2ZXJzaW9uIGhhc2hlcy4KKyAgIENvcHlyaWdodCAxOTk2LCAxOTk3IExpbnV4IEludGVybmF0aW9uYWwuCisKKyAgIE5ldyBpbXBsZW1lbnRhdGlvbiBjb250cmlidXRlZCBieSBSaWNoYXJkIEhlbmRlcnNvbiA8cnRoQHRhbXUuZWR1PgorICAgQmFzZWQgb24gb3JpZ2luYWwgd29yayBieSBCam9ybiBFa3dhbGwgPGJqMHJuQGJsb3guc2U+CisKKyAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBMaW51eCBtb2R1dGlscy4KKworICAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKKyAgIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZQorICAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91cgorICAgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKworICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICAgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAgIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sCisgICBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworCisjaWZuZGVmIE1PRFVUSUxTX0dFTktTWU1TX0gKKyNkZWZpbmUgTU9EVVRJTFNfR0VOS1NZTVNfSCAxCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisKK2VudW0gc3ltYm9sX3R5cGUKK3sKKyAgU1lNX05PUk1BTCwgU1lNX1RZUEVERUYsIFNZTV9FTlVNLCBTWU1fU1RSVUNULCBTWU1fVU5JT04KK307CisKK3N0cnVjdCBzdHJpbmdfbGlzdAoreworICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKm5leHQ7CisgIGVudW0gc3ltYm9sX3R5cGUgdGFnOworICBjaGFyICpzdHJpbmc7Cit9OworCitzdHJ1Y3Qgc3ltYm9sCit7CisgIHN0cnVjdCBzeW1ib2wgKmhhc2hfbmV4dDsKKyAgY29uc3QgY2hhciAqbmFtZTsKKyAgZW51bSBzeW1ib2xfdHlwZSB0eXBlOworICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmRlZm47CisgIHN0cnVjdCBzeW1ib2wgKmV4cGFuc2lvbl90cmFpbDsKKyAgaW50IGlzX2V4dGVybjsKK307CisKK3R5cGVkZWYgc3RydWN0IHN0cmluZ19saXN0ICoqeXlzdHlwZTsKKyNkZWZpbmUgWVlTVFlQRSB5eXN0eXBlCisKK2V4dGVybiBGSUxFICpvdXRmaWxlLCAqZGVidWdmaWxlOworCitleHRlcm4gaW50IGN1cl9saW5lOworZXh0ZXJuIGNoYXIgKmN1cl9maWxlbmFtZSwgKm91dHB1dF9kaXJlY3Rvcnk7CisKK2V4dGVybiBpbnQgZmxhZ19kZWJ1ZywgZmxhZ19kdW1wX2RlZnMsIGZsYWdfd2FybmluZ3M7CitleHRlcm4gaW50IGNoZWNrc3VtX3ZlcnNpb24sIGtlcm5lbF92ZXJzaW9uOworCitleHRlcm4gaW50IHdhbnRfYnJhY2VfcGhyYXNlLCB3YW50X2V4cF9waHJhc2UsIGRpc2NhcmRfcGhyYXNlX2NvbnRlbnRzOworZXh0ZXJuIHN0cnVjdCBzdHJpbmdfbGlzdCAqY3VycmVudF9saXN0LCAqbmV4dF9saXN0OworCisKK3N0cnVjdCBzeW1ib2wgKmZpbmRfc3ltYm9sKGNvbnN0IGNoYXIgKm5hbWUsIGVudW0gc3ltYm9sX3R5cGUgbnMpOworc3RydWN0IHN5bWJvbCAqYWRkX3N5bWJvbChjb25zdCBjaGFyICpuYW1lLCBlbnVtIHN5bWJvbF90eXBlIHR5cGUsCisJCQkgICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmRlZm4sIGludCBpc19leHRlcm4pOwordm9pZCBleHBvcnRfc3ltYm9sKGNvbnN0IGNoYXIgKik7CisKK3N0cnVjdCBzdHJpbmdfbGlzdCAqcmVzZXRfbGlzdCh2b2lkKTsKK3ZvaWQgZnJlZV9saXN0KHN0cnVjdCBzdHJpbmdfbGlzdCAqcywgc3RydWN0IHN0cmluZ19saXN0ICplKTsKK3ZvaWQgZnJlZV9ub2RlKHN0cnVjdCBzdHJpbmdfbGlzdCAqbGlzdCk7CitzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmNvcHlfbm9kZShzdHJ1Y3Qgc3RyaW5nX2xpc3QgKik7CitzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmNvcHlfbGlzdChzdHJ1Y3Qgc3RyaW5nX2xpc3QgKnMsIHN0cnVjdCBzdHJpbmdfbGlzdCAqZSk7CitpbnQgZXF1YWxfbGlzdChzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmEsIHN0cnVjdCBzdHJpbmdfbGlzdCAqYik7Cit2b2lkIHByaW50X2xpc3QoRklMRSAqLCBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmxpc3QpOworCitpbnQgeXlsZXgodm9pZCk7CitpbnQgeXlwYXJzZSh2b2lkKTsKKwordm9pZCBlcnJvcl93aXRoX3Bvcyhjb25zdCBjaGFyICosIC4uLik7CisKKyNkZWZpbmUgdmVyc2lvbihhLGIsYykgICgoYSA8PCAxNikgfCAoYiA8PCA4KSB8IChjKSkKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBNT0RVVElMU19WRVJTSU9OICI8aW4ta2VybmVsPiIKKworI2RlZmluZSB4bWFsbG9jKHNpemUpICh7IHZvaWQgKl9fcHRyID0gbWFsbG9jKHNpemUpOwkJXAorCWlmKCFfX3B0ciAmJiBzaXplICE9IDApIHsJCQkJXAorCQlmcHJpbnRmKHN0ZGVyciwgIm91dCBvZiBtZW1vcnlcbiIpOwkJXAorCQlleGl0KDEpOwkJCQkJXAorCX0JCQkJCQkJXAorCV9fcHRyOyB9KQorI2RlZmluZSB4c3RyZHVwKHN0cikgICh7IGNoYXIgKl9fc3RyID0gc3RyZHVwKHN0cik7CQlcCisJaWYgKCFfX3N0cikgewkJCQkJCVwKKwkJZnByaW50ZihzdGRlcnIsICJvdXQgb2YgbWVtb3J5XG4iKTsJCVwKKwkJZXhpdCgxKTsJCQkJCVwKKwl9CQkJCQkJCVwKKwlfX3N0cjsgfSkKKworI2VuZGlmIC8qIGdlbmtzeW1zLmggKi8KZGlmZiAtLWdpdCBhL3NjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuY19zaGlwcGVkIGIvc2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5jX3NoaXBwZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWFiYWY3NAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZ2Vua3N5bXMva2V5d29yZHMuY19zaGlwcGVkCkBAIC0wLDAgKzEsMTQ1IEBACisvKiBBTlNJLUMgY29kZSBwcm9kdWNlZCBieSBncGVyZiB2ZXJzaW9uIDIuNy4yICovCisvKiBDb21tYW5kLWxpbmU6IGdwZXJmIC1MIEFOU0ktQyAtYSAtQyAtRSAtZyAtSCBpc19yZXNlcnZlZF9oYXNoIC1rICcxLDMsJCcgLU4gaXNfcmVzZXJ2ZWRfd29yZCAtcCAtdCBzY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmICAqLworc3RydWN0IHJlc3dvcmQgeyBjb25zdCBjaGFyICpuYW1lOyBpbnQgdG9rZW47IH07CisvKiBtYXhpbXVtIGtleSByYW5nZSA9IDEwOSwgZHVwbGljYXRlcyA9IDAgKi8KKworI2lmZGVmIF9fR05VQ19fCitfX2lubGluZQorI2Vsc2UKKyNpZmRlZiBfX2NwbHVzcGx1cworaW5saW5lCisjZW5kaWYKKyNlbmRpZgorc3RhdGljIHVuc2lnbmVkIGludAoraXNfcmVzZXJ2ZWRfaGFzaCAocmVnaXN0ZXIgY29uc3QgY2hhciAqc3RyLCByZWdpc3RlciB1bnNpZ25lZCBpbnQgbGVuKQoreworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBhc3NvX3ZhbHVlc1tdID0KKyAgICB7CisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAgIDUsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAgIDAsIDExMywgMTEzLCAxMTMsCisgICAgICAgIDAsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgICAwLCAxMTMsICAgMCwgMTEzLCAgMjAsCisgICAgICAgMjUsICAgMCwgIDM1LCAgMzAsIDExMywgIDIwLCAxMTMsIDExMywgIDQwLCAgMzAsCisgICAgICAgMzAsICAgMCwgICAwLCAxMTMsICAgMCwgIDUxLCAgIDAsICAxNSwgICA1LCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzLCAxMTMsCisgICAgICAxMTMsIDExMywgMTEzLCAxMTMsIDExMywgMTEzCisgICAgfTsKKyAgcmV0dXJuIGxlbiArIGFzc29fdmFsdWVzWyh1bnNpZ25lZCBjaGFyKXN0clsyXV0gKyBhc3NvX3ZhbHVlc1sodW5zaWduZWQgY2hhcilzdHJbMF1dICsgYXNzb192YWx1ZXNbKHVuc2lnbmVkIGNoYXIpc3RyW2xlbiAtIDFdXTsKK30KKworI2lmZGVmIF9fR05VQ19fCitfX2lubGluZQorI2VuZGlmCitjb25zdCBzdHJ1Y3QgcmVzd29yZCAqCitpc19yZXNlcnZlZF93b3JkIChyZWdpc3RlciBjb25zdCBjaGFyICpzdHIsIHJlZ2lzdGVyIHVuc2lnbmVkIGludCBsZW4pCit7CisgIGVudW0KKyAgICB7CisgICAgICBUT1RBTF9LRVlXT1JEUyA9IDQxLAorICAgICAgTUlOX1dPUkRfTEVOR1RIID0gMywKKyAgICAgIE1BWF9XT1JEX0xFTkdUSCA9IDE3LAorICAgICAgTUlOX0hBU0hfVkFMVUUgPSA0LAorICAgICAgTUFYX0hBU0hfVkFMVUUgPSAxMTIKKyAgICB9OworCisgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgcmVzd29yZCB3b3JkbGlzdFtdID0KKyAgICB7CisgICAgICB7IiJ9LCB7IiJ9LCB7IiJ9LCB7IiJ9LAorICAgICAgeyJhdXRvIiwgQVVUT19LRVlXfSwKKyAgICAgIHsiIn0sIHsiIn0sCisgICAgICB7Il9fYXNtX18iLCBBU01fS0VZV30sCisgICAgICB7IiJ9LAorICAgICAgeyJfcmVzdHJpY3QiLCBSRVNUUklDVF9LRVlXfSwKKyAgICAgIHsiX190eXBlb2ZfXyIsIFRZUEVPRl9LRVlXfSwKKyAgICAgIHsiX19hdHRyaWJ1dGUiLCBBVFRSSUJVVEVfS0VZV30sCisgICAgICB7Il9fcmVzdHJpY3RfXyIsIFJFU1RSSUNUX0tFWVd9LAorICAgICAgeyJfX2F0dHJpYnV0ZV9fIiwgQVRUUklCVVRFX0tFWVd9LAorICAgICAgeyIifSwKKyAgICAgIHsiX192b2xhdGlsZSIsIFZPTEFUSUxFX0tFWVd9LAorICAgICAgeyIifSwKKyAgICAgIHsiX192b2xhdGlsZV9fIiwgVk9MQVRJTEVfS0VZV30sCisgICAgICB7IkVYUE9SVF9TWU1CT0wiLCBFWFBPUlRfU1lNQk9MX0tFWVd9LAorICAgICAgeyIifSwgeyIifSwgeyIifSwKKyAgICAgIHsiRVhQT1JUX1NZTUJPTF9HUEwiLCBFWFBPUlRfU1lNQk9MX0tFWVd9LAorICAgICAgeyJpbnQiLCBJTlRfS0VZV30sCisgICAgICB7ImNoYXIiLCBDSEFSX0tFWVd9LAorICAgICAgeyIifSwgeyIifSwKKyAgICAgIHsiX19jb25zdCIsIENPTlNUX0tFWVd9LAorICAgICAgeyJfX2lubGluZSIsIElOTElORV9LRVlXfSwKKyAgICAgIHsiX19jb25zdF9fIiwgQ09OU1RfS0VZV30sCisgICAgICB7Il9faW5saW5lX18iLCBJTkxJTkVfS0VZV30sCisgICAgICB7IiJ9LCB7IiJ9LCB7IiJ9LCB7IiJ9LAorICAgICAgeyJfX2FzbSIsIEFTTV9LRVlXfSwKKyAgICAgIHsiZXh0ZXJuIiwgRVhURVJOX0tFWVd9LAorICAgICAgeyIifSwKKyAgICAgIHsicmVnaXN0ZXIiLCBSRUdJU1RFUl9LRVlXfSwKKyAgICAgIHsiIn0sCisgICAgICB7ImZsb2F0IiwgRkxPQVRfS0VZV30sCisgICAgICB7InR5cGVvZiIsIFRZUEVPRl9LRVlXfSwKKyAgICAgIHsidHlwZWRlZiIsIFRZUEVERUZfS0VZV30sCisgICAgICB7IiJ9LCB7IiJ9LAorICAgICAgeyJfQm9vbCIsIEJPT0xfS0VZV30sCisgICAgICB7ImRvdWJsZSIsIERPVUJMRV9LRVlXfSwKKyAgICAgIHsiIn0sIHsiIn0sCisgICAgICB7ImVudW0iLCBFTlVNX0tFWVd9LAorICAgICAgeyIifSwgeyIifSwgeyIifSwKKyAgICAgIHsidm9sYXRpbGUiLCBWT0xBVElMRV9LRVlXfSwKKyAgICAgIHsidm9pZCIsIFZPSURfS0VZV30sCisgICAgICB7ImNvbnN0IiwgQ09OU1RfS0VZV30sCisgICAgICB7InNob3J0IiwgU0hPUlRfS0VZV30sCisgICAgICB7InN0cnVjdCIsIFNUUlVDVF9LRVlXfSwKKyAgICAgIHsiIn0sCisgICAgICB7InJlc3RyaWN0IiwgUkVTVFJJQ1RfS0VZV30sCisgICAgICB7IiJ9LAorICAgICAgeyJfX3NpZ25lZF9fIiwgU0lHTkVEX0tFWVd9LAorICAgICAgeyIifSwKKyAgICAgIHsiYXNtIiwgQVNNX0tFWVd9LAorICAgICAgeyIifSwgeyIifSwKKyAgICAgIHsiaW5saW5lIiwgSU5MSU5FX0tFWVd9LAorICAgICAgeyIifSwgeyIifSwgeyIifSwKKyAgICAgIHsidW5pb24iLCBVTklPTl9LRVlXfSwKKyAgICAgIHsiIn0sIHsiIn0sIHsiIn0sIHsiIn0sIHsiIn0sIHsiIn0sCisgICAgICB7InN0YXRpYyIsIFNUQVRJQ19LRVlXfSwKKyAgICAgIHsiIn0sIHsiIn0sIHsiIn0sIHsiIn0sIHsiIn0sIHsiIn0sCisgICAgICB7Il9fc2lnbmVkIiwgU0lHTkVEX0tFWVd9LAorICAgICAgeyIifSwgeyIifSwgeyIifSwgeyIifSwgeyIifSwgeyIifSwgeyIifSwgeyIifSwgeyIifSwKKyAgICAgIHsiIn0sIHsiIn0sIHsiIn0sIHsiIn0sIHsiIn0sCisgICAgICB7InVuc2lnbmVkIiwgVU5TSUdORURfS0VZV30sCisgICAgICB7IiJ9LCB7IiJ9LCB7IiJ9LCB7IiJ9LAorICAgICAgeyJsb25nIiwgTE9OR19LRVlXfSwKKyAgICAgIHsiIn0sIHsiIn0sIHsiIn0sIHsiIn0sIHsiIn0sIHsiIn0sIHsiIn0sCisgICAgICB7InNpZ25lZCIsIFNJR05FRF9LRVlXfQorICAgIH07CisKKyAgaWYgKGxlbiA8PSBNQVhfV09SRF9MRU5HVEggJiYgbGVuID49IE1JTl9XT1JEX0xFTkdUSCkKKyAgICB7CisgICAgICByZWdpc3RlciBpbnQga2V5ID0gaXNfcmVzZXJ2ZWRfaGFzaCAoc3RyLCBsZW4pOworCisgICAgICBpZiAoa2V5IDw9IE1BWF9IQVNIX1ZBTFVFICYmIGtleSA+PSAwKQorICAgICAgICB7CisgICAgICAgICAgcmVnaXN0ZXIgY29uc3QgY2hhciAqcyA9IHdvcmRsaXN0W2tleV0ubmFtZTsKKworICAgICAgICAgIGlmICgqc3RyID09ICpzICYmICFzdHJjbXAgKHN0ciArIDEsIHMgKyAxKSkKKyAgICAgICAgICAgIHJldHVybiAmd29yZGxpc3Rba2V5XTsKKyAgICAgICAgfQorICAgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2dlbmtzeW1zL2tleXdvcmRzLmdwZXJmIGIvc2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmJlYzc2Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9nZW5rc3ltcy9rZXl3b3Jkcy5ncGVyZgpAQCAtMCwwICsxLDUwIEBACisleworJX0KK3N0cnVjdCByZXN3b3JkIHsgY29uc3QgY2hhciAqbmFtZTsgaW50IHRva2VuOyB9CislJQorRVhQT1JUX1NZTUJPTCwgRVhQT1JUX1NZTUJPTF9LRVlXCitFWFBPUlRfU1lNQk9MX0dQTCwgRVhQT1JUX1NZTUJPTF9LRVlXCitfX2FzbSwgQVNNX0tFWVcKK19fYXNtX18sIEFTTV9LRVlXCitfX2F0dHJpYnV0ZSwgQVRUUklCVVRFX0tFWVcKK19fYXR0cmlidXRlX18sIEFUVFJJQlVURV9LRVlXCitfX2NvbnN0LCBDT05TVF9LRVlXCitfX2NvbnN0X18sIENPTlNUX0tFWVcKK19faW5saW5lLCBJTkxJTkVfS0VZVworX19pbmxpbmVfXywgSU5MSU5FX0tFWVcKK19fc2lnbmVkLCBTSUdORURfS0VZVworX19zaWduZWRfXywgU0lHTkVEX0tFWVcKK19fdm9sYXRpbGUsIFZPTEFUSUxFX0tFWVcKK19fdm9sYXRpbGVfXywgVk9MQVRJTEVfS0VZVworIyBBY2NvcmRpbmcgdG8gcnRoLCBjOTkgZGVmaW5lcyBfQm9vbCwgX19yZXN0cmljdCwgX19yZXN0cmljdF9fLCByZXN0cmljdC4gIEtBTworX0Jvb2wsIEJPT0xfS0VZVworX3Jlc3RyaWN0LCBSRVNUUklDVF9LRVlXCitfX3Jlc3RyaWN0X18sIFJFU1RSSUNUX0tFWVcKK3Jlc3RyaWN0LCBSRVNUUklDVF9LRVlXCithc20sIEFTTV9LRVlXCisjIGF0dHJpYnV0ZSBjb21tZW50ZWQgb3V0IGluIG1vZHV0aWxzIDIuNC4yLiAgUGVvcGxlIGFyZSB1c2luZyAnYXR0cmlidXRlJyBhcyBhCisjIGZpZWxkIG5hbWUgd2hpY2ggYnJlYWtzIHRoZSBnZW5rc3ltcyBwYXJzZXIuICBJdCBpcyBub3QgYSBnY2Mga2V5d29yZCBhbnl3YXkuCisjIEtBTy4KKyMgICBhdHRyaWJ1dGUsIEFUVFJJQlVURV9LRVlXCithdXRvLCBBVVRPX0tFWVcKK2NoYXIsIENIQVJfS0VZVworY29uc3QsIENPTlNUX0tFWVcKK2RvdWJsZSwgRE9VQkxFX0tFWVcKK2VudW0sIEVOVU1fS0VZVworZXh0ZXJuLCBFWFRFUk5fS0VZVworZmxvYXQsIEZMT0FUX0tFWVcKK2lubGluZSwgSU5MSU5FX0tFWVcKK2ludCwgSU5UX0tFWVcKK2xvbmcsIExPTkdfS0VZVworcmVnaXN0ZXIsIFJFR0lTVEVSX0tFWVcKK3Nob3J0LCBTSE9SVF9LRVlXCitzaWduZWQsIFNJR05FRF9LRVlXCitzdGF0aWMsIFNUQVRJQ19LRVlXCitzdHJ1Y3QsIFNUUlVDVF9LRVlXCit0eXBlZGVmLCBUWVBFREVGX0tFWVcKK3VuaW9uLCBVTklPTl9LRVlXCit1bnNpZ25lZCwgVU5TSUdORURfS0VZVwordm9pZCwgVk9JRF9LRVlXCit2b2xhdGlsZSwgVk9MQVRJTEVfS0VZVwordHlwZW9mLCBUWVBFT0ZfS0VZVworX190eXBlb2ZfXywgVFlQRU9GX0tFWVcKZGlmZiAtLWdpdCBhL3NjcmlwdHMvZ2Vua3N5bXMvbGV4LmNfc2hpcHBlZCBiL3NjcmlwdHMvZ2Vua3N5bXMvbGV4LmNfc2hpcHBlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWJmYmI1Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9nZW5rc3ltcy9sZXguY19zaGlwcGVkCkBAIC0wLDAgKzEsMjA4NCBAQAorI2xpbmUgMiAic2NyaXB0cy9nZW5rc3ltcy9sZXguYyIKKy8qIEEgbGV4aWNhbCBzY2FubmVyIGdlbmVyYXRlZCBieSBmbGV4ICovCisKKy8qIFNjYW5uZXIgc2tlbGV0b24gdmVyc2lvbjoKKyAqICRIZWFkZXI6IC9ob21lL2RhZmZ5L3UwL3Zlcm4vZmxleC9SQ1MvZmxleC5za2wsdiAyLjkxIDk2LzA5LzEwIDE2OjU4OjQ4IHZlcm4gRXhwICQKKyAqLworCisjZGVmaW5lIEZMRVhfU0NBTk5FUgorI2RlZmluZSBZWV9GTEVYX01BSk9SX1ZFUlNJT04gMgorI2RlZmluZSBZWV9GTEVYX01JTk9SX1ZFUlNJT04gNQorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworCisvKiBjZnJvbnQgMS4yIGRlZmluZXMgImNfcGx1c3BsdXMiIGluc3RlYWQgb2YgIl9fY3BsdXNwbHVzIiAqLworI2lmZGVmIGNfcGx1c3BsdXMKKyNpZm5kZWYgX19jcGx1c3BsdXMKKyNkZWZpbmUgX19jcGx1c3BsdXMKKyNlbmRpZgorI2VuZGlmCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyogVXNlIHByb3RvdHlwZXMgaW4gZnVuY3Rpb24gZGVjbGFyYXRpb25zLiAqLworI2RlZmluZSBZWV9VU0VfUFJPVE9TCisKKy8qIFRoZSAiY29uc3QiIHN0b3JhZ2UtY2xhc3MtbW9kaWZpZXIgaXMgdmFsaWQuICovCisjZGVmaW5lIFlZX1VTRV9DT05TVAorCisjZWxzZQkvKiAhIF9fY3BsdXNwbHVzICovCisKKyNpZiBfX1NURENfXworCisjZGVmaW5lIFlZX1VTRV9QUk9UT1MKKyNkZWZpbmUgWVlfVVNFX0NPTlNUCisKKyNlbmRpZgkvKiBfX1NURENfXyAqLworI2VuZGlmCS8qICEgX19jcGx1c3BsdXMgKi8KKworI2lmZGVmIF9fVFVSQk9DX18KKyAjcHJhZ21hIHdhcm4gLXJjaAorICNwcmFnbWEgd2FybiAtdXNlCisjaW5jbHVkZSA8aW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNkZWZpbmUgWVlfVVNFX0NPTlNUCisjZGVmaW5lIFlZX1VTRV9QUk9UT1MKKyNlbmRpZgorCisjaWZkZWYgWVlfVVNFX0NPTlNUCisjZGVmaW5lIHl5Y29uc3QgY29uc3QKKyNlbHNlCisjZGVmaW5lIHl5Y29uc3QKKyNlbmRpZgorCisKKyNpZmRlZiBZWV9VU0VfUFJPVE9TCisjZGVmaW5lIFlZX1BST1RPKHByb3RvKSBwcm90bworI2Vsc2UKKyNkZWZpbmUgWVlfUFJPVE8ocHJvdG8pICgpCisjZW5kaWYKKworLyogUmV0dXJuZWQgdXBvbiBlbmQtb2YtZmlsZS4gKi8KKyNkZWZpbmUgWVlfTlVMTCAwCisKKy8qIFByb21vdGVzIGEgcG9zc2libHkgbmVnYXRpdmUsIHBvc3NpYmx5IHNpZ25lZCBjaGFyIHRvIGFuIHVuc2lnbmVkCisgKiBpbnRlZ2VyIGZvciB1c2UgYXMgYW4gYXJyYXkgaW5kZXguICBJZiB0aGUgc2lnbmVkIGNoYXIgaXMgbmVnYXRpdmUsCisgKiB3ZSB3YW50IHRvIGluc3RlYWQgdHJlYXQgaXQgYXMgYW4gOC1iaXQgdW5zaWduZWQgY2hhciwgaGVuY2UgdGhlCisgKiBkb3VibGUgY2FzdC4KKyAqLworI2RlZmluZSBZWV9TQ19UT19VSShjKSAoKHVuc2lnbmVkIGludCkgKHVuc2lnbmVkIGNoYXIpIGMpCisKKy8qIEVudGVyIGEgc3RhcnQgY29uZGl0aW9uLiAgVGhpcyBtYWNybyByZWFsbHkgb3VnaHQgdG8gdGFrZSBhIHBhcmFtZXRlciwKKyAqIGJ1dCB3ZSBkbyBpdCB0aGUgZGlzZ3VzdGluZyBjcnVmdHkgd2F5IGZvcmNlZCBvbiB1cyBieSB0aGUgKCktbGVzcworICogZGVmaW5pdGlvbiBvZiBCRUdJTi4KKyAqLworI2RlZmluZSBCRUdJTiB5eV9zdGFydCA9IDEgKyAyICoKKworLyogVHJhbnNsYXRlIHRoZSBjdXJyZW50IHN0YXJ0IHN0YXRlIGludG8gYSB2YWx1ZSB0aGF0IGNhbiBiZSBsYXRlciBoYW5kZWQKKyAqIHRvIEJFR0lOIHRvIHJldHVybiB0byB0aGUgc3RhdGUuICBUaGUgWVlTVEFURSBhbGlhcyBpcyBmb3IgbGV4CisgKiBjb21wYXRpYmlsaXR5LgorICovCisjZGVmaW5lIFlZX1NUQVJUICgoeXlfc3RhcnQgLSAxKSAvIDIpCisjZGVmaW5lIFlZU1RBVEUgWVlfU1RBUlQKKworLyogQWN0aW9uIG51bWJlciBmb3IgRU9GIHJ1bGUgb2YgYSBnaXZlbiBzdGFydCBzdGF0ZS4gKi8KKyNkZWZpbmUgWVlfU1RBVEVfRU9GKHN0YXRlKSAoWVlfRU5EX09GX0JVRkZFUiArIHN0YXRlICsgMSkKKworLyogU3BlY2lhbCBhY3Rpb24gbWVhbmluZyAic3RhcnQgcHJvY2Vzc2luZyBhIG5ldyBmaWxlIi4gKi8KKyNkZWZpbmUgWVlfTkVXX0ZJTEUgeXlyZXN0YXJ0KCB5eWluICkKKworI2RlZmluZSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVIgMAorCisvKiBTaXplIG9mIGRlZmF1bHQgaW5wdXQgYnVmZmVyLiAqLworI2RlZmluZSBZWV9CVUZfU0laRSAxNjM4NAorCit0eXBlZGVmIHN0cnVjdCB5eV9idWZmZXJfc3RhdGUgKllZX0JVRkZFUl9TVEFURTsKKworZXh0ZXJuIGludCB5eWxlbmc7CitleHRlcm4gRklMRSAqeXlpbiwgKnl5b3V0OworCisjZGVmaW5lIEVPQl9BQ1RfQ09OVElOVUVfU0NBTiAwCisjZGVmaW5lIEVPQl9BQ1RfRU5EX09GX0ZJTEUgMQorI2RlZmluZSBFT0JfQUNUX0xBU1RfTUFUQ0ggMgorCisvKiBUaGUgZnVua3kgZG8td2hpbGUgaW4gdGhlIGZvbGxvd2luZyAjZGVmaW5lIGlzIHVzZWQgdG8gdHVybiB0aGUgZGVmaW5pdGlvbgorICogaW50IGEgc2luZ2xlIEMgc3RhdGVtZW50ICh3aGljaCBuZWVkcyBhIHNlbWktY29sb24gdGVybWluYXRvcikuICBUaGlzCisgKiBhdm9pZHMgcHJvYmxlbXMgd2l0aCBjb2RlIGxpa2U6CisgKgorICogCWlmICggY29uZGl0aW9uX2hvbGRzICkKKyAqCQl5eWxlc3MoIDUgKTsKKyAqCWVsc2UKKyAqCQlkb19zb21ldGhpbmdfZWxzZSgpOworICoKKyAqIFByaW9yIHRvIHVzaW5nIHRoZSBkby13aGlsZSB0aGUgY29tcGlsZXIgd291bGQgZ2V0IHVwc2V0IGF0IHRoZQorICogImVsc2UiIGJlY2F1c2UgaXQgaW50ZXJwcmV0ZWQgdGhlICJpZiIgc3RhdGVtZW50IGFzIGJlaW5nIGFsbAorICogZG9uZSB3aGVuIGl0IHJlYWNoZWQgdGhlICc7JyBhZnRlciB0aGUgeXlsZXNzKCkgY2FsbC4KKyAqLworCisvKiBSZXR1cm4gYWxsIGJ1dCB0aGUgZmlyc3QgJ24nIG1hdGNoZWQgY2hhcmFjdGVycyBiYWNrIHRvIHRoZSBpbnB1dCBzdHJlYW0uICovCisKKyNkZWZpbmUgeXlsZXNzKG4pIFwKKwlkbyBcCisJCXsgXAorCQkvKiBVbmRvIGVmZmVjdHMgb2Ygc2V0dGluZyB1cCB5eXRleHQuICovIFwKKwkJKnl5X2NwID0geXlfaG9sZF9jaGFyOyBcCisJCVlZX1JFU1RPUkVfWVlfTU9SRV9PRkZTRVQgXAorCQl5eV9jX2J1Zl9wID0geXlfY3AgPSB5eV9icCArIG4gLSBZWV9NT1JFX0FESjsgXAorCQlZWV9ET19CRUZPUkVfQUNUSU9OOyAvKiBzZXQgdXAgeXl0ZXh0IGFnYWluICovIFwKKwkJfSBcCisJd2hpbGUgKCAwICkKKworI2RlZmluZSB1bnB1dChjKSB5eXVucHV0KCBjLCB5eXRleHRfcHRyICkKKworLyogVGhlIGZvbGxvd2luZyBpcyBiZWNhdXNlIHdlIGNhbm5vdCBwb3J0YWJseSBnZXQgb3VyIGhhbmRzIG9uIHNpemVfdAorICogKHdpdGhvdXQgYXV0b2NvbmYncyBoZWxwLCB3aGljaCBpc24ndCBhdmFpbGFibGUgYmVjYXVzZSB3ZSB3YW50CisgKiBmbGV4LWdlbmVyYXRlZCBzY2FubmVycyB0byBjb21waWxlIG9uIHRoZWlyIG93bikuCisgKi8KK3R5cGVkZWYgdW5zaWduZWQgaW50IHl5X3NpemVfdDsKKworCitzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlCisJeworCUZJTEUgKnl5X2lucHV0X2ZpbGU7CisKKwljaGFyICp5eV9jaF9idWY7CQkvKiBpbnB1dCBidWZmZXIgKi8KKwljaGFyICp5eV9idWZfcG9zOwkJLyogY3VycmVudCBwb3NpdGlvbiBpbiBpbnB1dCBidWZmZXIgKi8KKworCS8qIFNpemUgb2YgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLCBub3QgaW5jbHVkaW5nIHJvb20gZm9yIEVPQgorCSAqIGNoYXJhY3RlcnMuCisJICovCisJeXlfc2l6ZV90IHl5X2J1Zl9zaXplOworCisJLyogTnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCBpbnRvIHl5X2NoX2J1Ziwgbm90IGluY2x1ZGluZyBFT0IKKwkgKiBjaGFyYWN0ZXJzLgorCSAqLworCWludCB5eV9uX2NoYXJzOworCisJLyogV2hldGhlciB3ZSAib3duIiB0aGUgYnVmZmVyIC0gaS5lLiwgd2Uga25vdyB3ZSBjcmVhdGVkIGl0LAorCSAqIGFuZCBjYW4gcmVhbGxvYygpIGl0IHRvIGdyb3cgaXQsIGFuZCBzaG91bGQgZnJlZSgpIGl0IHRvCisJICogZGVsZXRlIGl0LgorCSAqLworCWludCB5eV9pc19vdXJfYnVmZmVyOworCisJLyogV2hldGhlciB0aGlzIGlzIGFuICJpbnRlcmFjdGl2ZSIgaW5wdXQgc291cmNlOyBpZiBzbywgYW5kCisJICogaWYgd2UncmUgdXNpbmcgc3RkaW8gZm9yIGlucHV0LCB0aGVuIHdlIHdhbnQgdG8gdXNlIGdldGMoKQorCSAqIGluc3RlYWQgb2YgZnJlYWQoKSwgdG8gbWFrZSBzdXJlIHdlIHN0b3AgZmV0Y2hpbmcgaW5wdXQgYWZ0ZXIKKwkgKiBlYWNoIG5ld2xpbmUuCisJICovCisJaW50IHl5X2lzX2ludGVyYWN0aXZlOworCisJLyogV2hldGhlciB3ZSdyZSBjb25zaWRlcmVkIHRvIGJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLgorCSAqIElmIHNvLCAnXicgcnVsZXMgd2lsbCBiZSBhY3RpdmUgb24gdGhlIG5leHQgbWF0Y2gsIG90aGVyd2lzZQorCSAqIG5vdC4KKwkgKi8KKwlpbnQgeXlfYXRfYm9sOworCisJLyogV2hldGhlciB0byB0cnkgdG8gZmlsbCB0aGUgaW5wdXQgYnVmZmVyIHdoZW4gd2UgcmVhY2ggdGhlCisJICogZW5kIG9mIGl0LgorCSAqLworCWludCB5eV9maWxsX2J1ZmZlcjsKKworCWludCB5eV9idWZmZXJfc3RhdHVzOworI2RlZmluZSBZWV9CVUZGRVJfTkVXIDAKKyNkZWZpbmUgWVlfQlVGRkVSX05PUk1BTCAxCisJLyogV2hlbiBhbiBFT0YncyBiZWVuIHNlZW4gYnV0IHRoZXJlJ3Mgc3RpbGwgc29tZSB0ZXh0IHRvIHByb2Nlc3MKKwkgKiB0aGVuIHdlIG1hcmsgdGhlIGJ1ZmZlciBhcyBZWV9FT0ZfUEVORElORywgdG8gaW5kaWNhdGUgdGhhdCB3ZQorCSAqIHNob3VsZG4ndCB0cnkgcmVhZGluZyBmcm9tIHRoZSBpbnB1dCBzb3VyY2UgYW55IG1vcmUuICBXZSBtaWdodAorCSAqIHN0aWxsIGhhdmUgYSBidW5jaCBvZiB0b2tlbnMgdG8gbWF0Y2gsIHRob3VnaCwgYmVjYXVzZSBvZgorCSAqIHBvc3NpYmxlIGJhY2tpbmctdXAuCisJICoKKwkgKiBXaGVuIHdlIGFjdHVhbGx5IHNlZSB0aGUgRU9GLCB3ZSBjaGFuZ2UgdGhlIHN0YXR1cyB0byAibmV3IgorCSAqICh2aWEgeXlyZXN0YXJ0KCkpLCBzbyB0aGF0IHRoZSB1c2VyIGNhbiBjb250aW51ZSBzY2FubmluZyBieQorCSAqIGp1c3QgcG9pbnRpbmcgeXlpbiBhdCBhIG5ldyBpbnB1dCBmaWxlLgorCSAqLworI2RlZmluZSBZWV9CVUZGRVJfRU9GX1BFTkRJTkcgMgorCX07CisKK3N0YXRpYyBZWV9CVUZGRVJfU1RBVEUgeXlfY3VycmVudF9idWZmZXIgPSAwOworCisvKiBXZSBwcm92aWRlIG1hY3JvcyBmb3IgYWNjZXNzaW5nIGJ1ZmZlciBzdGF0ZXMgaW4gY2FzZSBpbiB0aGUKKyAqIGZ1dHVyZSB3ZSB3YW50IHRvIHB1dCB0aGUgYnVmZmVyIHN0YXRlcyBpbiBhIG1vcmUgZ2VuZXJhbAorICogInNjYW5uZXIgc3RhdGUiLgorICovCisjZGVmaW5lIFlZX0NVUlJFTlRfQlVGRkVSIHl5X2N1cnJlbnRfYnVmZmVyCisKKworLyogeXlfaG9sZF9jaGFyIGhvbGRzIHRoZSBjaGFyYWN0ZXIgbG9zdCB3aGVuIHl5dGV4dCBpcyBmb3JtZWQuICovCitzdGF0aWMgY2hhciB5eV9ob2xkX2NoYXI7CisKK3N0YXRpYyBpbnQgeXlfbl9jaGFyczsJCS8qIG51bWJlciBvZiBjaGFyYWN0ZXJzIHJlYWQgaW50byB5eV9jaF9idWYgKi8KKworCitpbnQgeXlsZW5nOworCisvKiBQb2ludHMgdG8gY3VycmVudCBjaGFyYWN0ZXIgaW4gYnVmZmVyLiAqLworc3RhdGljIGNoYXIgKnl5X2NfYnVmX3AgPSAoY2hhciAqKSAwOworc3RhdGljIGludCB5eV9pbml0ID0gMTsJCS8qIHdoZXRoZXIgd2UgbmVlZCB0byBpbml0aWFsaXplICovCitzdGF0aWMgaW50IHl5X3N0YXJ0ID0gMDsJLyogc3RhcnQgc3RhdGUgbnVtYmVyICovCisKKy8qIEZsYWcgd2hpY2ggaXMgdXNlZCB0byBhbGxvdyB5eXdyYXAoKSdzIHRvIGRvIGJ1ZmZlciBzd2l0Y2hlcworICogaW5zdGVhZCBvZiBzZXR0aW5nIHVwIGEgZnJlc2ggeXlpbi4gIEEgYml0IG9mIGEgaGFjayAuLi4KKyAqLworc3RhdGljIGludCB5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2Y7CisKK3ZvaWQgeXlyZXN0YXJ0IFlZX1BST1RPKCggRklMRSAqaW5wdXRfZmlsZSApKTsKKwordm9pZCB5eV9zd2l0Y2hfdG9fYnVmZmVyIFlZX1BST1RPKCggWVlfQlVGRkVSX1NUQVRFIG5ld19idWZmZXIgKSk7Cit2b2lkIHl5X2xvYWRfYnVmZmVyX3N0YXRlIFlZX1BST1RPKCggdm9pZCApKTsKK1lZX0JVRkZFUl9TVEFURSB5eV9jcmVhdGVfYnVmZmVyIFlZX1BST1RPKCggRklMRSAqZmlsZSwgaW50IHNpemUgKSk7Cit2b2lkIHl5X2RlbGV0ZV9idWZmZXIgWVlfUFJPVE8oKCBZWV9CVUZGRVJfU1RBVEUgYiApKTsKK3ZvaWQgeXlfaW5pdF9idWZmZXIgWVlfUFJPVE8oKCBZWV9CVUZGRVJfU1RBVEUgYiwgRklMRSAqZmlsZSApKTsKK3ZvaWQgeXlfZmx1c2hfYnVmZmVyIFlZX1BST1RPKCggWVlfQlVGRkVSX1NUQVRFIGIgKSk7CisjZGVmaW5lIFlZX0ZMVVNIX0JVRkZFUiB5eV9mbHVzaF9idWZmZXIoIHl5X2N1cnJlbnRfYnVmZmVyICkKKworWVlfQlVGRkVSX1NUQVRFIHl5X3NjYW5fYnVmZmVyIFlZX1BST1RPKCggY2hhciAqYmFzZSwgeXlfc2l6ZV90IHNpemUgKSk7CitZWV9CVUZGRVJfU1RBVEUgeXlfc2Nhbl9zdHJpbmcgWVlfUFJPVE8oKCB5eWNvbnN0IGNoYXIgKnl5X3N0ciApKTsKK1lZX0JVRkZFUl9TVEFURSB5eV9zY2FuX2J5dGVzIFlZX1BST1RPKCggeXljb25zdCBjaGFyICpieXRlcywgaW50IGxlbiApKTsKKworc3RhdGljIHZvaWQgKnl5X2ZsZXhfYWxsb2MgWVlfUFJPVE8oKCB5eV9zaXplX3QgKSk7CitzdGF0aWMgdm9pZCAqeXlfZmxleF9yZWFsbG9jIFlZX1BST1RPKCggdm9pZCAqLCB5eV9zaXplX3QgKSk7CitzdGF0aWMgdm9pZCB5eV9mbGV4X2ZyZWUgWVlfUFJPVE8oKCB2b2lkICogKSk7CisKKyNkZWZpbmUgeXlfbmV3X2J1ZmZlciB5eV9jcmVhdGVfYnVmZmVyCisKKyNkZWZpbmUgeXlfc2V0X2ludGVyYWN0aXZlKGlzX2ludGVyYWN0aXZlKSBcCisJeyBcCisJaWYgKCAhIHl5X2N1cnJlbnRfYnVmZmVyICkgXAorCQl5eV9jdXJyZW50X2J1ZmZlciA9IHl5X2NyZWF0ZV9idWZmZXIoIHl5aW4sIFlZX0JVRl9TSVpFICk7IFwKKwl5eV9jdXJyZW50X2J1ZmZlci0+eXlfaXNfaW50ZXJhY3RpdmUgPSBpc19pbnRlcmFjdGl2ZTsgXAorCX0KKworI2RlZmluZSB5eV9zZXRfYm9sKGF0X2JvbCkgXAorCXsgXAorCWlmICggISB5eV9jdXJyZW50X2J1ZmZlciApIFwKKwkJeXlfY3VycmVudF9idWZmZXIgPSB5eV9jcmVhdGVfYnVmZmVyKCB5eWluLCBZWV9CVUZfU0laRSApOyBcCisJeXlfY3VycmVudF9idWZmZXItPnl5X2F0X2JvbCA9IGF0X2JvbDsgXAorCX0KKworI2RlZmluZSBZWV9BVF9CT0woKSAoeXlfY3VycmVudF9idWZmZXItPnl5X2F0X2JvbCkKKworCisjZGVmaW5lIHl5d3JhcCgpIDEKKyNkZWZpbmUgWVlfU0tJUF9ZWVdSQVAKKworI2RlZmluZSBGTEVYX0RFQlVHCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgWVlfQ0hBUjsKK0ZJTEUgKnl5aW4gPSAoRklMRSAqKSAwLCAqeXlvdXQgPSAoRklMRSAqKSAwOwordHlwZWRlZiBpbnQgeXlfc3RhdGVfdHlwZTsKKworI2RlZmluZSBGTEVYX0RFQlVHCitleHRlcm4gY2hhciAqeXl0ZXh0OworI2RlZmluZSB5eXRleHRfcHRyIHl5dGV4dAorCitzdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV9nZXRfcHJldmlvdXNfc3RhdGUgWVlfUFJPVE8oKCB2b2lkICkpOworc3RhdGljIHl5X3N0YXRlX3R5cGUgeXlfdHJ5X05VTF90cmFucyBZWV9QUk9UTygoIHl5X3N0YXRlX3R5cGUgY3VycmVudF9zdGF0ZSApKTsKK3N0YXRpYyBpbnQgeXlfZ2V0X25leHRfYnVmZmVyIFlZX1BST1RPKCggdm9pZCApKTsKK3N0YXRpYyB2b2lkIHl5X2ZhdGFsX2Vycm9yIFlZX1BST1RPKCggeXljb25zdCBjaGFyIG1zZ1tdICkpOworCisvKiBEb25lIGFmdGVyIHRoZSBjdXJyZW50IHBhdHRlcm4gaGFzIGJlZW4gbWF0Y2hlZCBhbmQgYmVmb3JlIHRoZQorICogY29ycmVzcG9uZGluZyBhY3Rpb24gLSBzZXRzIHVwIHl5dGV4dC4KKyAqLworI2RlZmluZSBZWV9ET19CRUZPUkVfQUNUSU9OIFwKKwl5eXRleHRfcHRyID0geXlfYnA7IFwKKwl5eWxlbmcgPSAoaW50KSAoeXlfY3AgLSB5eV9icCk7IFwKKwl5eV9ob2xkX2NoYXIgPSAqeXlfY3A7IFwKKwkqeXlfY3AgPSAnXDAnOyBcCisJeXlfY19idWZfcCA9IHl5X2NwOworCisjZGVmaW5lIFlZX05VTV9SVUxFUyAxMworI2RlZmluZSBZWV9FTkRfT0ZfQlVGRkVSIDE0CitzdGF0aWMgeXljb25zdCBzaG9ydCBpbnQgeXlfYWNjZXB0Wzc2XSA9CisgICAgeyAgIDAsCisgICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgMTQsICAgMTIsICAgIDQsICAgIDMsICAgMTIsICAgIDcsCisgICAgICAgMTIsICAgMTIsICAgIDcsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgIDksICAgIDksCisgICAgICAgMTIsICAgMTIsICAgMTIsICAgIDQsICAgIDAsICAgIDUsICAgIDAsICAgIDcsICAgIDAsICAgIDYsCisgICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDIsICAgIDgsICAgMTAsICAgMTAsCisgICAgICAgIDksICAgIDAsICAgIDAsICAgIDksICAgIDksICAgIDAsICAgIDksICAgIDAsICAgIDAsICAgMTEsCisgICAgICAgIDAsICAgIDAsICAgIDAsICAgMTAsICAgIDAsICAgMTAsICAgIDksICAgIDksICAgIDAsICAgIDAsCisgICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgMTAsICAgMTAsICAgIDAsICAgIDAsICAgIDAsCisgICAgICAgIDAsICAgIDAsICAgIDAsICAgIDEsICAgIDAKKyAgICB9IDsKKworc3RhdGljIHl5Y29uc3QgaW50IHl5X2VjWzI1Nl0gPQorICAgIHsgICAwLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAyLCAgICAzLAorICAgICAgICA0LCAgICA0LCAgICA0LCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAyLCAgICAxLCAgICA1LCAgICA2LCAgICA3LCAgICA4LCAgICA5LCAgIDEwLCAgICAxLAorICAgICAgICAxLCAgICA4LCAgIDExLCAgICAxLCAgIDEyLCAgIDEzLCAgICA4LCAgIDE0LCAgIDE1LCAgIDE1LAorICAgICAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE1LCAgIDE2LCAgIDE2LCAgICAxLCAgICAxLCAgIDE3LAorICAgICAgIDE4LCAgIDE5LCAgICAxLCAgICAxLCAgIDIwLCAgIDIwLCAgIDIwLCAgIDIwLCAgIDIxLCAgIDIyLAorICAgICAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgIDIzLCAgICA3LCAgICA3LCAgICA3LCAgICA3LAorICAgICAgICA3LCAgICA3LCAgICA3LCAgICA3LCAgIDI0LCAgICA3LCAgICA3LCAgIDI1LCAgICA3LCAgICA3LAorICAgICAgICAxLCAgIDI2LCAgICAxLCAgICA4LCAgICA3LCAgICAxLCAgIDIwLCAgIDIwLCAgIDIwLCAgIDIwLAorCisgICAgICAgMjEsICAgMjIsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgMjcsICAgIDcsICAgIDcsCisgICAgICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgIDcsICAgMjQsICAgIDcsICAgIDcsICAgMjUsCisgICAgICAgIDcsICAgIDcsICAgIDEsICAgMjgsICAgIDEsICAgIDgsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMQorICAgIH0gOworCitzdGF0aWMgeXljb25zdCBpbnQgeXlfbWV0YVsyOV0gPQorICAgIHsgICAwLAorICAgICAgICAxLCAgICAxLCAgICAyLCAgICAxLCAgICAxLCAgICAxLCAgICAzLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICA0LCAgICA0LCAgICA1LCAgICA2LCAgICA2LCAgICA2LCAgICAxLCAgICAxLCAgICAxLCAgICA3LAorICAgICAgICA4LCAgICA3LCAgICAzLCAgICAzLCAgICAzLCAgICAxLCAgICAzLCAgICAxCisgICAgfSA7CisKK3N0YXRpYyB5eWNvbnN0IHNob3J0IGludCB5eV9iYXNlWzg4XSA9CisgICAgeyAgIDAsCisgICAgICAgIDAsICAxNDcsICAgMjEsICAxNDAsICAxNDUsICAyODQsICAgMzksICAyODQsICAgMjYsICAgIDAsCisgICAgICAgMzIsICAxMjYsICAgNDAsICAgNDQsICAxMTUsICAgMzUsICAgMzYsICAgNDYsICAgNTAsICAgNTMsCisgICAgICAgMzksICAgNjEsICAgNTQsICAgNzksICAgNjUsICAyODQsICAgIDAsICAgIDAsICAgNjYsICAyODQsCisgICAgICAgIDAsICAxMTksICAgNzksICAgNzUsICAxMjMsICAxMDQsICAyODQsICAyODQsICAxMDcsICAgIDAsCisgICAgICAgNzksICAgNzMsICAgNzYsICAgNzYsICAgNjYsICAgIDAsICAgIDAsICAgODUsICAgODYsICAyODQsCisgICAgICAxMzMsICAgODMsICAgOTEsICAyODQsICAgOTksICAxNDcsICAyODQsICAxMTQsICAxMjIsICAgNzAsCisgICAgICAxMDcsICAxNDEsICAxNzIsICAxNTEsICAxMzUsICAxODEsICAyODQsICAxMzcsICAxMTQsICAxNTcsCisgICAgICAxNDksICAgNDgsICAgNDUsICAyODQsICAyODQsICAyMDgsICAyMTQsICAyMjIsICAyMzAsICAyMzgsCisgICAgICAyNDYsICAyNTAsICAyNTUsICAyNTYsICAyNjEsICAyNjcsICAyNzUKKyAgICB9IDsKKworc3RhdGljIHl5Y29uc3Qgc2hvcnQgaW50IHl5X2RlZls4OF0gPQorICAgIHsgICAwLAorICAgICAgIDc1LCAgICAxLCAgICAxLCAgICAzLCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc2LCAgIDc3LAorICAgICAgIDc4LCAgIDc1LCAgIDc3LCAgIDc5LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDE5LAorICAgICAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc2LCAgIDc1LCAgIDgwLCAgIDc3LCAgIDc4LCAgIDc1LAorICAgICAgIDgxLCAgIDc1LCAgIDc2LCAgIDc4LCAgIDc5LCAgIDc5LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDM5LAorICAgICAgIDE5LCAgIDgyLCAgIDgzLCAgIDc1LCAgIDc1LCAgIDg0LCAgIDIwLCAgIDc2LCAgIDc4LCAgIDc1LAorICAgICAgIDc5LCAgIDUxLCAgIDg1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDg0LCAgIDc5LCAgIDUxLAorICAgICAgIDc5LCAgIDc5LCAgIDc5LCAgIDUxLCAgIDc1LCAgIDc1LCAgIDc1LCAgIDg2LCAgIDc5LCAgIDYzLAorICAgICAgIDg2LCAgIDg3LCAgIDg3LCAgIDc1LCAgICAwLCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LAorICAgICAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1CisgICAgfSA7CisKK3N0YXRpYyB5eWNvbnN0IHNob3J0IGludCB5eV9ueHRbMzEzXSA9CisgICAgeyAgIDAsCisgICAgICAgIDYsICAgIDcsICAgIDgsICAgIDcsICAgIDksICAgIDYsICAgMTAsICAgIDYsICAgIDYsICAgMTEsCisgICAgICAgIDYsICAgIDYsICAgMTIsICAgIDYsICAgIDYsICAgIDYsICAgIDYsICAgIDYsICAgIDYsICAgMTAsCisgICAgICAgMTAsICAgMTAsICAgMTMsICAgMTAsICAgMTAsICAgIDYsICAgMTAsICAgIDYsICAgMTUsICAgMTYsCisgICAgICAgMjYsICAgMTUsICAgMTcsICAgMTgsICAgMTksICAgMjAsICAgMjAsICAgMjEsICAgMTUsICAgMjIsCisgICAgICAgMjQsICAgMzAsICAgMjQsICAgMzgsICAgMzMsICAgMzYsICAgMzcsICAgNzQsICAgMjMsICAgMzQsCisgICAgICAgNzQsICAgMjcsICAgMzgsICAgMzgsICAgMzgsICAgMzgsICAgMzgsICAgMzEsICAgMzIsICAgMzksCisgICAgICAgMzksICAgMzksICAgNDAsICAgNDEsICAgNDEsICAgNDIsICAgNDcsICAgNDcsICAgNDcsICAgMjYsCisgICAgICAgNDMsICAgMzgsICAgNDQsICAgNDUsICAgNDYsICAgMzAsICAgNDQsICAgNzUsICAgMzgsICAgMzgsCisgICAgICAgMjQsICAgMzgsICAgMjQsICAgMjYsICAgMzAsICAgNDAsICAgNTUsICAgNTUsICAgNTcsICAgMjYsCisgICAgICAgMjcsICAgMzEsICAgNTcsICAgNDMsICAgMzUsICAgMzAsICAgNjQsICAgNjQsICAgNjQsICAgNTcsCisKKyAgICAgICAzMSwgICA2NSwgICA2NSwgICA3NSwgICAyNywgICAzNiwgICAzNywgICAzNSwgICA1OSwgICAzNywKKyAgICAgICAyNywgICAzMSwgICA1NiwgICA1NiwgICA1NiwgICA1OSwgICAzNywgICA1MSwgICA1MiwgICA1MiwKKyAgICAgICAzOSwgICAzOSwgICAzOSwgICA1OSwgICAzNywgICAzNywgICA2OCwgICA1MywgICA1NCwgICA1NCwKKyAgICAgICA2OSwgICA1MCwgICAzOCwgICA1NCwgICA1OSwgICAzNywgICA0NCwgICA0NSwgICAzMiwgICAzNywKKyAgICAgICA0NCwgICAzNSwgICA1OSwgICAzNywgICA3NSwgICAxNCwgICA2MCwgICA2MCwgICA2NiwgICA2NiwKKyAgICAgICA2NiwgICAzNywgICAxNCwgICA3MiwgICA3NSwgICA2MSwgICA2MiwgICA2MywgICA1OSwgICA2MSwKKyAgICAgICA1NiwgICA1NiwgICA1NiwgICA2OSwgICA2NCwgICA2NCwgICA2NCwgICA2OSwgICA2NywgICA2NywKKyAgICAgICA3NSwgICA3NSwgICA3NSwgICA2NywgICAzNywgICAzNSwgICA3NSwgICA3NSwgICA3NSwgICA2MSwKKyAgICAgICA2MiwgICA3NSwgICA3NSwgICA2MSwgICA3NSwgICA3MCwgICA3MCwgICA3MCwgICA3NSwgICA3NSwKKyAgICAgICA3NSwgICA3MCwgICA3MCwgICA3MCwgICA2NiwgICA2NiwgICA2NiwgICA3NSwgICA3NSwgICA3NSwKKworICAgICAgIDc1LCAgIDc1LCAgIDU0LCAgIDU0LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDU0LCAgIDI1LCAgIDI1LAorICAgICAgIDI1LCAgIDI1LCAgIDI1LCAgIDI1LCAgIDI1LCAgIDI1LCAgIDI4LCAgIDc1LCAgIDc1LCAgIDI4LAorICAgICAgIDI4LCAgIDI4LCAgIDI5LCAgIDI5LCAgIDI5LCAgIDI5LCAgIDI5LCAgIDI5LCAgIDI5LCAgIDI5LAorICAgICAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDM1LCAgIDQ4LCAgIDc1LAorICAgICAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ4LCAgIDQ5LCAgIDc1LCAgIDQ5LCAgIDQ5LAorICAgICAgIDQ5LCAgIDQ5LCAgIDQ5LCAgIDQ5LCAgIDQyLCAgIDQyLCAgIDc1LCAgIDQyLCAgIDU2LCAgIDc1LAorICAgICAgIDU2LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDY2LCAgIDc1LCAgIDY2LCAgIDcxLCAgIDcxLCAgIDcxLAorICAgICAgIDcxLCAgIDcxLCAgIDcxLCAgIDcxLCAgIDcxLCAgIDczLCAgIDczLCAgIDczLCAgIDczLCAgIDczLAorICAgICAgIDczLCAgIDczLCAgIDczLCAgICA1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LAorICAgICAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LCAgIDc1LAorCisgICAgICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsCisgICAgICAgNzUsICAgNzUKKyAgICB9IDsKKworc3RhdGljIHl5Y29uc3Qgc2hvcnQgaW50IHl5X2Noa1szMTNdID0KKyAgICB7ICAgMCwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMywgICAgMywKKyAgICAgICAgOSwgICAgMywgICAgMywgICAgMywgICAgMywgICAgMywgICAgMywgICAgMywgICAgMywgICAgMywKKyAgICAgICAgNywgICAxMSwgICAgNywgICAxNiwgICAxMywgICAxNCwgICAxNCwgICA3MywgICAgMywgICAxMywKKyAgICAgICA3MiwgICAgOSwgICAxNiwgICAxNywgICAxNywgICAyMSwgICAyMSwgICAxMSwgICAxOCwgICAxOCwKKyAgICAgICAxOCwgICAxOCwgICAxOSwgICAxOSwgICAxOSwgICAxOSwgICAyMCwgICAyMCwgICAyMCwgICAyNSwKKyAgICAgICAxOSwgICAyMywgICAxOSwgICAxOSwgICAxOSwgICAyOSwgICAxOSwgICAyMCwgICAyMiwgICAyMiwKKyAgICAgICAyNCwgICAyMywgICAyNCwgICAzMywgICAzNCwgICA0MiwgICA0MywgICA0MywgICA0NSwgICA0OCwKKyAgICAgICAyNSwgICAyOSwgICA0NSwgICA0MiwgICA2MCwgICA0OSwgICA1MiwgICA1MiwgICA1MiwgICA0NCwKKworICAgICAgIDM0LCAgIDUzLCAgIDUzLCAgIDQxLCAgIDMzLCAgIDM2LCAgIDM2LCAgIDUyLCAgIDYxLCAgIDYxLAorICAgICAgIDQ4LCAgIDQ5LCAgIDU1LCAgIDU1LCAgIDU1LCAgIDY5LCAgIDY5LCAgIDM2LCAgIDM2LCAgIDM2LAorICAgICAgIDM5LCAgIDM5LCAgIDM5LCAgIDU5LCAgIDU5LCAgIDM1LCAgIDU5LCAgIDM5LCAgIDM5LCAgIDM5LAorICAgICAgIDYxLCAgIDMyLCAgIDE1LCAgIDM5LCAgIDUxLCAgIDUxLCAgIDU4LCAgIDU4LCAgIDEyLCAgIDY4LAorICAgICAgIDU4LCAgIDY4LCAgIDYyLCAgIDYyLCAgICA1LCAgICA0LCAgIDUxLCAgIDUxLCAgIDY1LCAgIDY1LAorICAgICAgIDY1LCAgIDcxLCAgICAyLCAgIDcxLCAgICAwLCAgIDUxLCAgIDUxLCAgIDUxLCAgIDcwLCAgIDUxLAorICAgICAgIDU2LCAgIDU2LCAgIDU2LCAgIDYyLCAgIDY0LCAgIDY0LCAgIDY0LCAgIDYyLCAgIDU2LCAgIDU2LAorICAgICAgICAwLCAgICAwLCAgICAwLCAgIDU2LCAgIDYzLCAgIDY0LCAgICAwLCAgICAwLCAgICAwLCAgIDcwLAorICAgICAgIDcwLCAgICAwLCAgICAwLCAgIDcwLCAgICAwLCAgIDYzLCAgIDYzLCAgIDYzLCAgICAwLCAgICAwLAorICAgICAgICAwLCAgIDYzLCAgIDYzLCAgIDYzLCAgIDY2LCAgIDY2LCAgIDY2LCAgICAwLCAgICAwLCAgICAwLAorCisgICAgICAgIDAsICAgIDAsICAgNjYsICAgNjYsICAgIDAsICAgIDAsICAgIDAsICAgNjYsICAgNzYsICAgNzYsCisgICAgICAgNzYsICAgNzYsICAgNzYsICAgNzYsICAgNzYsICAgNzYsICAgNzcsICAgIDAsICAgIDAsICAgNzcsCisgICAgICAgNzcsICAgNzcsICAgNzgsICAgNzgsICAgNzgsICAgNzgsICAgNzgsICAgNzgsICAgNzgsICAgNzgsCisgICAgICAgNzksICAgNzksICAgNzksICAgNzksICAgNzksICAgNzksICAgNzksICAgNzksICAgODAsICAgIDAsCisgICAgICAgODAsICAgODAsICAgODAsICAgODAsICAgODAsICAgODAsICAgODEsICAgIDAsICAgODEsICAgODEsCisgICAgICAgODEsICAgODEsICAgODEsICAgODEsICAgODIsICAgODIsICAgIDAsICAgODIsICAgODMsICAgIDAsCisgICAgICAgODMsICAgODQsICAgODQsICAgODQsICAgODUsICAgIDAsICAgODUsICAgODYsICAgODYsICAgODYsCisgICAgICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODcsICAgODcsICAgODcsICAgODcsICAgODcsCisgICAgICAgODcsICAgODcsICAgODcsICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsCisgICAgICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsICAgNzUsCisKKyAgICAgICA3NSwgICA3NSwgICA3NSwgICA3NSwgICA3NSwgICA3NSwgICA3NSwgICA3NSwgICA3NSwgICA3NSwKKyAgICAgICA3NSwgICA3NQorICAgIH0gOworCitzdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV9sYXN0X2FjY2VwdGluZ19zdGF0ZTsKK3N0YXRpYyBjaGFyICp5eV9sYXN0X2FjY2VwdGluZ19jcG9zOworCitleHRlcm4gaW50IHl5X2ZsZXhfZGVidWc7CitpbnQgeXlfZmxleF9kZWJ1ZyA9IDE7CisKK3N0YXRpYyB5eWNvbnN0IHNob3J0IGludCB5eV9ydWxlX2xpbmVudW1bMTNdID0KKyAgICB7ICAgMCwKKyAgICAgICA2OSwgICA3MCwgICA3MSwgICA3NCwgICA3NywgICA3OCwgICA3OSwgICA4NSwgICA4NiwgICA4NywKKyAgICAgICA4OSwgICA5MgorICAgIH0gOworCisvKiBUaGUgaW50ZW50IGJlaGluZCB0aGlzIGRlZmluaXRpb24gaXMgdGhhdCBpdCdsbCBjYXRjaAorICogYW55IHVzZXMgb2YgUkVKRUNUIHdoaWNoIGZsZXggbWlzc2VkLgorICovCisjZGVmaW5lIFJFSkVDVCByZWplY3RfdXNlZF9idXRfbm90X2RldGVjdGVkCisjZGVmaW5lIHl5bW9yZSgpIHl5bW9yZV91c2VkX2J1dF9ub3RfZGV0ZWN0ZWQKKyNkZWZpbmUgWVlfTU9SRV9BREogMAorI2RlZmluZSBZWV9SRVNUT1JFX1lZX01PUkVfT0ZGU0VUCitjaGFyICp5eXRleHQ7CisjbGluZSAxICJzY3JpcHRzL2dlbmtzeW1zL2xleC5sIgorI2RlZmluZSBJTklUSUFMIDAKKy8qIExleGljYWwgYW5hbHlzaXMgZm9yIGdlbmtzeW1zLgorICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgTGludXggSW50ZXJuYXRpb25hbC4KKworICAgTmV3IGltcGxlbWVudGF0aW9uIGNvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+CisgICBCYXNlZCBvbiBvcmlnaW5hbCB3b3JrIGJ5IEJqb3JuIEVrd2FsbCA8Ymowcm5AYmxveC5zZT4KKworICAgVGFrZW4gZnJvbSBMaW51eCBtb2R1dGlscyAyLjQuMjIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisjbGluZSAyNSAic2NyaXB0cy9nZW5rc3ltcy9sZXgubCIKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlICJnZW5rc3ltcy5oIgorI2luY2x1ZGUgInBhcnNlLmgiCisKKy8qIFdlJ3ZlIGdvdCBhIHR3by1sZXZlbCBsZXhlciBoZXJlLiAgV2UgbGV0IGZsZXggZG8gYmFzaWMgdG9rZW5pemF0aW9uCisgICBhbmQgdGhlbiB3ZSBjYXRlZ29yaXplIHRob3NlIGJhc2ljIHRva2VucyBpbiB0aGUgc2Vjb25kIHN0YWdlLiAgKi8KKyNkZWZpbmUgWVlfREVDTAkJc3RhdGljIGludCB5eWxleDEodm9pZCkKKworLyogVmVyc2lvbiAyIGNoZWNrc3VtbWluZyBkb2VzIHByb3BlciB0b2tlbml6YXRpb247IHZlcnNpb24gMSB3YXNuJ3QKKyAgIHF1aXRlIHNvIHBlZGFudGljLiAgKi8KKyNkZWZpbmUgVjJfVE9LRU5TIDEKKworLyogV2UgZG9uJ3QgZG8gbXVsdGlwbGUgaW5wdXQgZmlsZXMuICAqLworI2xpbmUgNTEzICJzY3JpcHRzL2dlbmtzeW1zL2xleC5jIgorCisvKiBNYWNyb3MgYWZ0ZXIgdGhpcyBwb2ludCBjYW4gYWxsIGJlIG92ZXJyaWRkZW4gYnkgdXNlciBkZWZpbml0aW9ucyBpbgorICogc2VjdGlvbiAxLgorICovCisKKyNpZm5kZWYgWVlfU0tJUF9ZWVdSQVAKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiBpbnQgeXl3cmFwIFlZX1BST1RPKCggdm9pZCApKTsKKyNlbHNlCitleHRlcm4gaW50IHl5d3JhcCBZWV9QUk9UTygoIHZvaWQgKSk7CisjZW5kaWYKKyNlbmRpZgorCisjaWZuZGVmIFlZX05PX1VOUFVUCitzdGF0aWMgdm9pZCB5eXVucHV0IFlZX1BST1RPKCggaW50IGMsIGNoYXIgKmJ1Zl9wdHIgKSk7CisjZW5kaWYKKworI2lmbmRlZiB5eXRleHRfcHRyCitzdGF0aWMgdm9pZCB5eV9mbGV4X3N0cm5jcHkgWVlfUFJPVE8oKCBjaGFyICosIHl5Y29uc3QgY2hhciAqLCBpbnQgKSk7CisjZW5kaWYKKworI2lmZGVmIFlZX05FRURfU1RSTEVOCitzdGF0aWMgaW50IHl5X2ZsZXhfc3RybGVuIFlZX1BST1RPKCggeXljb25zdCBjaGFyICogKSk7CisjZW5kaWYKKworI2lmbmRlZiBZWV9OT19JTlBVVAorI2lmZGVmIF9fY3BsdXNwbHVzCitzdGF0aWMgaW50IHl5aW5wdXQgWVlfUFJPVE8oKCB2b2lkICkpOworI2Vsc2UKK3N0YXRpYyBpbnQgaW5wdXQgWVlfUFJPVE8oKCB2b2lkICkpOworI2VuZGlmCisjZW5kaWYKKworI2lmIFlZX1NUQUNLX1VTRUQKK3N0YXRpYyBpbnQgeXlfc3RhcnRfc3RhY2tfcHRyID0gMDsKK3N0YXRpYyBpbnQgeXlfc3RhcnRfc3RhY2tfZGVwdGggPSAwOworc3RhdGljIGludCAqeXlfc3RhcnRfc3RhY2sgPSAwOworI2lmbmRlZiBZWV9OT19QVVNIX1NUQVRFCitzdGF0aWMgdm9pZCB5eV9wdXNoX3N0YXRlIFlZX1BST1RPKCggaW50IG5ld19zdGF0ZSApKTsKKyNlbmRpZgorI2lmbmRlZiBZWV9OT19QT1BfU1RBVEUKK3N0YXRpYyB2b2lkIHl5X3BvcF9zdGF0ZSBZWV9QUk9UTygoIHZvaWQgKSk7CisjZW5kaWYKKyNpZm5kZWYgWVlfTk9fVE9QX1NUQVRFCitzdGF0aWMgaW50IHl5X3RvcF9zdGF0ZSBZWV9QUk9UTygoIHZvaWQgKSk7CisjZW5kaWYKKworI2Vsc2UKKyNkZWZpbmUgWVlfTk9fUFVTSF9TVEFURSAxCisjZGVmaW5lIFlZX05PX1BPUF9TVEFURSAxCisjZGVmaW5lIFlZX05PX1RPUF9TVEFURSAxCisjZW5kaWYKKworI2lmZGVmIFlZX01BTExPQ19ERUNMCitZWV9NQUxMT0NfREVDTAorI2Vsc2UKKyNpZiBfX1NURENfXworI2lmbmRlZiBfX2NwbHVzcGx1cworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisjZWxzZQorLyogSnVzdCB0cnkgdG8gZ2V0IGJ5IHdpdGhvdXQgZGVjbGFyaW5nIHRoZSByb3V0aW5lcy4gIFRoaXMgd2lsbCBmYWlsCisgKiBtaXNlcmFibHkgb24gbm9uLUFOU0kgc3lzdGVtcyBmb3Igd2hpY2ggc2l6ZW9mKHNpemVfdCkgIT0gc2l6ZW9mKGludCkKKyAqIG9yIHNpemVvZih2b2lkKikgIT0gc2l6ZW9mKGludCkuCisgKi8KKyNlbmRpZgorI2VuZGlmCisKKy8qIEFtb3VudCBvZiBzdHVmZiB0byBzbHVycCB1cCB3aXRoIGVhY2ggcmVhZC4gKi8KKyNpZm5kZWYgWVlfUkVBRF9CVUZfU0laRQorI2RlZmluZSBZWV9SRUFEX0JVRl9TSVpFIDgxOTIKKyNlbmRpZgorCisvKiBDb3B5IHdoYXRldmVyIHRoZSBsYXN0IHJ1bGUgbWF0Y2hlZCB0byB0aGUgc3RhbmRhcmQgb3V0cHV0LiAqLworCisjaWZuZGVmIEVDSE8KKy8qIFRoaXMgdXNlZCB0byBiZSBhbiBmcHV0cygpLCBidXQgc2luY2UgdGhlIHN0cmluZyBtaWdodCBjb250YWluIE5VTCdzLAorICogd2Ugbm93IHVzZSBmd3JpdGUoKS4KKyAqLworI2RlZmluZSBFQ0hPICh2b2lkKSBmd3JpdGUoIHl5dGV4dCwgeXlsZW5nLCAxLCB5eW91dCApCisjZW5kaWYKKworLyogR2V0cyBpbnB1dCBhbmQgc3R1ZmZzIGl0IGludG8gImJ1ZiIuICBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkLCBvciBZWV9OVUxMLAorICogaXMgcmV0dXJuZWQgaW4gInJlc3VsdCIuCisgKi8KKyNpZm5kZWYgWVlfSU5QVVQKKyNkZWZpbmUgWVlfSU5QVVQoYnVmLHJlc3VsdCxtYXhfc2l6ZSkgXAorCWlmICggeXlfY3VycmVudF9idWZmZXItPnl5X2lzX2ludGVyYWN0aXZlICkgXAorCQl7IFwKKwkJaW50IGMgPSAnKicsIG47IFwKKwkJZm9yICggbiA9IDA7IG4gPCBtYXhfc2l6ZSAmJiBcCisJCQkgICAgIChjID0gZ2V0YyggeXlpbiApKSAhPSBFT0YgJiYgYyAhPSAnXG4nOyArK24gKSBcCisJCQlidWZbbl0gPSAoY2hhcikgYzsgXAorCQlpZiAoIGMgPT0gJ1xuJyApIFwKKwkJCWJ1ZltuKytdID0gKGNoYXIpIGM7IFwKKwkJaWYgKCBjID09IEVPRiAmJiBmZXJyb3IoIHl5aW4gKSApIFwKKwkJCVlZX0ZBVEFMX0VSUk9SKCAiaW5wdXQgaW4gZmxleCBzY2FubmVyIGZhaWxlZCIgKTsgXAorCQlyZXN1bHQgPSBuOyBcCisJCX0gXAorCWVsc2UgaWYgKCAoKHJlc3VsdCA9IGZyZWFkKCBidWYsIDEsIG1heF9zaXplLCB5eWluICkpID09IDApIFwKKwkJICAmJiBmZXJyb3IoIHl5aW4gKSApIFwKKwkJWVlfRkFUQUxfRVJST1IoICJpbnB1dCBpbiBmbGV4IHNjYW5uZXIgZmFpbGVkIiApOworI2VuZGlmCisKKy8qIE5vIHNlbWktY29sb24gYWZ0ZXIgcmV0dXJuOyBjb3JyZWN0IHVzYWdlIGlzIHRvIHdyaXRlICJ5eXRlcm1pbmF0ZSgpOyIgLQorICogd2UgZG9uJ3Qgd2FudCBhbiBleHRyYSAnOycgYWZ0ZXIgdGhlICJyZXR1cm4iIGJlY2F1c2UgdGhhdCB3aWxsIGNhdXNlCisgKiBzb21lIGNvbXBpbGVycyB0byBjb21wbGFpbiBhYm91dCB1bnJlYWNoYWJsZSBzdGF0ZW1lbnRzLgorICovCisjaWZuZGVmIHl5dGVybWluYXRlCisjZGVmaW5lIHl5dGVybWluYXRlKCkgcmV0dXJuIFlZX05VTEwKKyNlbmRpZgorCisvKiBOdW1iZXIgb2YgZW50cmllcyBieSB3aGljaCBzdGFydC1jb25kaXRpb24gc3RhY2sgZ3Jvd3MuICovCisjaWZuZGVmIFlZX1NUQVJUX1NUQUNLX0lOQ1IKKyNkZWZpbmUgWVlfU1RBUlRfU1RBQ0tfSU5DUiAyNQorI2VuZGlmCisKKy8qIFJlcG9ydCBhIGZhdGFsIGVycm9yLiAqLworI2lmbmRlZiBZWV9GQVRBTF9FUlJPUgorI2RlZmluZSBZWV9GQVRBTF9FUlJPUihtc2cpIHl5X2ZhdGFsX2Vycm9yKCBtc2cgKQorI2VuZGlmCisKKy8qIERlZmF1bHQgZGVjbGFyYXRpb24gb2YgZ2VuZXJhdGVkIHNjYW5uZXIgLSBhIGRlZmluZSBzbyB0aGUgdXNlciBjYW4KKyAqIGVhc2lseSBhZGQgcGFyYW1ldGVycy4KKyAqLworI2lmbmRlZiBZWV9ERUNMCisjZGVmaW5lIFlZX0RFQ0wgaW50IHl5bGV4IFlZX1BST1RPKCggdm9pZCApKQorI2VuZGlmCisKKy8qIENvZGUgZXhlY3V0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHJ1bGUsIGFmdGVyIHl5dGV4dCBhbmQgeXlsZW5nCisgKiBoYXZlIGJlZW4gc2V0IHVwLgorICovCisjaWZuZGVmIFlZX1VTRVJfQUNUSU9OCisjZGVmaW5lIFlZX1VTRVJfQUNUSU9OCisjZW5kaWYKKworLyogQ29kZSBleGVjdXRlZCBhdCB0aGUgZW5kIG9mIGVhY2ggcnVsZS4gKi8KKyNpZm5kZWYgWVlfQlJFQUsKKyNkZWZpbmUgWVlfQlJFQUsgYnJlYWs7CisjZW5kaWYKKworI2RlZmluZSBZWV9SVUxFX1NFVFVQIFwKKwlpZiAoIHl5bGVuZyA+IDAgKSBcCisJCXl5X2N1cnJlbnRfYnVmZmVyLT55eV9hdF9ib2wgPSBcCisJCQkJKHl5dGV4dFt5eWxlbmcgLSAxXSA9PSAnXG4nKTsgXAorCVlZX1VTRVJfQUNUSU9OCisKK1lZX0RFQ0wKKwl7CisJcmVnaXN0ZXIgeXlfc3RhdGVfdHlwZSB5eV9jdXJyZW50X3N0YXRlOworCXJlZ2lzdGVyIGNoYXIgKnl5X2NwID0gTlVMTCwgKnl5X2JwID0gTlVMTDsKKwlyZWdpc3RlciBpbnQgeXlfYWN0OworCisjbGluZSA2NSAic2NyaXB0cy9nZW5rc3ltcy9sZXgubCIKKworCisKKyAvKiBLZWVwIHRyYWNrIG9mIG91ciBsb2NhdGlvbiBpbiB0aGUgb3JpZ2luYWwgc291cmNlIGZpbGVzLiAgKi8KKyNsaW5lIDY3MiAic2NyaXB0cy9nZW5rc3ltcy9sZXguYyIKKworCWlmICggeXlfaW5pdCApCisJCXsKKwkJeXlfaW5pdCA9IDA7CisKKyNpZmRlZiBZWV9VU0VSX0lOSVQKKwkJWVlfVVNFUl9JTklUOworI2VuZGlmCisKKwkJaWYgKCAhIHl5X3N0YXJ0ICkKKwkJCXl5X3N0YXJ0ID0gMTsJLyogZmlyc3Qgc3RhcnQgc3RhdGUgKi8KKworCQlpZiAoICEgeXlpbiApCisJCQl5eWluID0gc3RkaW47CisKKwkJaWYgKCAhIHl5b3V0ICkKKwkJCXl5b3V0ID0gc3Rkb3V0OworCisJCWlmICggISB5eV9jdXJyZW50X2J1ZmZlciApCisJCQl5eV9jdXJyZW50X2J1ZmZlciA9CisJCQkJeXlfY3JlYXRlX2J1ZmZlciggeXlpbiwgWVlfQlVGX1NJWkUgKTsKKworCQl5eV9sb2FkX2J1ZmZlcl9zdGF0ZSgpOworCQl9CisKKwl3aGlsZSAoIDEgKQkJLyogbG9vcHMgdW50aWwgZW5kLW9mLWZpbGUgaXMgcmVhY2hlZCAqLworCQl7CisJCXl5X2NwID0geXlfY19idWZfcDsKKworCQkvKiBTdXBwb3J0IG9mIHl5dGV4dC4gKi8KKwkJKnl5X2NwID0geXlfaG9sZF9jaGFyOworCisJCS8qIHl5X2JwIHBvaW50cyB0byB0aGUgcG9zaXRpb24gaW4geXlfY2hfYnVmIG9mIHRoZSBzdGFydCBvZgorCQkgKiB0aGUgY3VycmVudCBydW4uCisJCSAqLworCQl5eV9icCA9IHl5X2NwOworCisJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9zdGFydDsKKwkJeXlfY3VycmVudF9zdGF0ZSArPSBZWV9BVF9CT0woKTsKK3l5X21hdGNoOgorCQlkbworCQkJeworCQkJcmVnaXN0ZXIgWVlfQ0hBUiB5eV9jID0geXlfZWNbWVlfU0NfVE9fVUkoKnl5X2NwKV07CisJCQlpZiAoIHl5X2FjY2VwdFt5eV9jdXJyZW50X3N0YXRlXSApCisJCQkJeworCQkJCXl5X2xhc3RfYWNjZXB0aW5nX3N0YXRlID0geXlfY3VycmVudF9zdGF0ZTsKKwkJCQl5eV9sYXN0X2FjY2VwdGluZ19jcG9zID0geXlfY3A7CisJCQkJfQorCQkJd2hpbGUgKCB5eV9jaGtbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArIHl5X2NdICE9IHl5X2N1cnJlbnRfc3RhdGUgKQorCQkJCXsKKwkJCQl5eV9jdXJyZW50X3N0YXRlID0gKGludCkgeXlfZGVmW3l5X2N1cnJlbnRfc3RhdGVdOworCQkJCWlmICggeXlfY3VycmVudF9zdGF0ZSA+PSA3NiApCisJCQkJCXl5X2MgPSB5eV9tZXRhWyh1bnNpZ25lZCBpbnQpIHl5X2NdOworCQkJCX0KKwkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9ueHRbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArICh1bnNpZ25lZCBpbnQpIHl5X2NdOworCQkJKyt5eV9jcDsKKwkJCX0KKwkJd2hpbGUgKCB5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICE9IDI4NCApOworCit5eV9maW5kX2FjdGlvbjoKKwkJeXlfYWN0ID0geXlfYWNjZXB0W3l5X2N1cnJlbnRfc3RhdGVdOworCQlpZiAoIHl5X2FjdCA9PSAwICkKKwkJCXsgLyogaGF2ZSB0byBiYWNrIHVwICovCisJCQl5eV9jcCA9IHl5X2xhc3RfYWNjZXB0aW5nX2Nwb3M7CisJCQl5eV9jdXJyZW50X3N0YXRlID0geXlfbGFzdF9hY2NlcHRpbmdfc3RhdGU7CisJCQl5eV9hY3QgPSB5eV9hY2NlcHRbeXlfY3VycmVudF9zdGF0ZV07CisJCQl9CisKKwkJWVlfRE9fQkVGT1JFX0FDVElPTjsKKworCitkb19hY3Rpb246CS8qIFRoaXMgbGFiZWwgaXMgdXNlZCBvbmx5IHRvIGFjY2VzcyBFT0YgYWN0aW9ucy4gKi8KKworCQlpZiAoIHl5X2ZsZXhfZGVidWcgKQorCQkJeworCQkJaWYgKCB5eV9hY3QgPT0gMCApCisJCQkJZnByaW50Ziggc3RkZXJyLCAiLS1zY2FubmVyIGJhY2tpbmcgdXBcbiIgKTsKKwkJCWVsc2UgaWYgKCB5eV9hY3QgPCAxMyApCisJCQkJZnByaW50Ziggc3RkZXJyLCAiLS1hY2NlcHRpbmcgcnVsZSBhdCBsaW5lICVkIChcIiVzXCIpXG4iLAorCQkJCSAgICAgICAgIHl5X3J1bGVfbGluZW51bVt5eV9hY3RdLCB5eXRleHQgKTsKKwkJCWVsc2UgaWYgKCB5eV9hY3QgPT0gMTMgKQorCQkJCWZwcmludGYoIHN0ZGVyciwgIi0tYWNjZXB0aW5nIGRlZmF1bHQgcnVsZSAoXCIlc1wiKVxuIiwKKwkJCQkgICAgICAgICB5eXRleHQgKTsKKwkJCWVsc2UgaWYgKCB5eV9hY3QgPT0gMTQgKQorCQkJCWZwcmludGYoIHN0ZGVyciwgIi0tKGVuZCBvZiBidWZmZXIgb3IgYSBOVUwpXG4iICk7CisJCQllbHNlCisJCQkJZnByaW50Ziggc3RkZXJyLCAiLS1FT0YgKHN0YXJ0IGNvbmRpdGlvbiAlZClcbiIsIFlZX1NUQVJUICk7CisJCQl9CisKKwkJc3dpdGNoICggeXlfYWN0ICkKKwl7IC8qIGJlZ2lubmluZyBvZiBhY3Rpb24gc3dpdGNoICovCisJCQljYXNlIDA6IC8qIG11c3QgYmFjayB1cCAqLworCQkJLyogdW5kbyB0aGUgZWZmZWN0cyBvZiBZWV9ET19CRUZPUkVfQUNUSU9OICovCisJCQkqeXlfY3AgPSB5eV9ob2xkX2NoYXI7CisJCQl5eV9jcCA9IHl5X2xhc3RfYWNjZXB0aW5nX2Nwb3M7CisJCQl5eV9jdXJyZW50X3N0YXRlID0geXlfbGFzdF9hY2NlcHRpbmdfc3RhdGU7CisJCQlnb3RvIHl5X2ZpbmRfYWN0aW9uOworCitjYXNlIDE6CitZWV9SVUxFX1NFVFVQCisjbGluZSA2OSAic2NyaXB0cy9nZW5rc3ltcy9sZXgubCIKK3JldHVybiBGSUxFTkFNRTsKKwlZWV9CUkVBSworY2FzZSAyOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgNzAgInNjcmlwdHMvZ2Vua3N5bXMvbGV4LmwiCitjdXJfbGluZSsrOworCVlZX0JSRUFLCitjYXNlIDM6CitZWV9SVUxFX1NFVFVQCisjbGluZSA3MSAic2NyaXB0cy9nZW5rc3ltcy9sZXgubCIKK2N1cl9saW5lKys7CisJWVlfQlJFQUsKKy8qIElnbm9yZSBhbGwgb3RoZXIgd2hpdGVzcGFjZS4gICovCitjYXNlIDQ6CitZWV9SVUxFX1NFVFVQCisjbGluZSA3NCAic2NyaXB0cy9nZW5rc3ltcy9sZXgubCIKKzsKKwlZWV9CUkVBSworY2FzZSA1OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgNzcgInNjcmlwdHMvZ2Vua3N5bXMvbGV4LmwiCityZXR1cm4gU1RSSU5HOworCVlZX0JSRUFLCitjYXNlIDY6CitZWV9SVUxFX1NFVFVQCisjbGluZSA3OCAic2NyaXB0cy9nZW5rc3ltcy9sZXgubCIKK3JldHVybiBDSEFSOworCVlZX0JSRUFLCitjYXNlIDc6CitZWV9SVUxFX1NFVFVQCisjbGluZSA3OSAic2NyaXB0cy9nZW5rc3ltcy9sZXgubCIKK3JldHVybiBJREVOVDsKKwlZWV9CUkVBSworLyogVGhlIFBlZGFudCByZXF1aXJlcyB0aGF0IHRoZSBvdGhlciBDIG11bHRpLWNoYXJhY3RlciB0b2tlbnMgYmUKKyAgICByZWNvZ25pemVkIGFzIHRva2Vucy4gIFdlIGRvbid0IGFjdHVhbGx5IHVzZSB0aGVtIHNpbmNlIHdlIGRvbid0CisgICAgcGFyc2UgZXhwcmVzc2lvbnMsIGJ1dCB3ZSBkbyB3YW50IHdoaXRlc3BhY2UgdG8gYmUgYXJyYW5nZWQKKyAgICBhcm91bmQgdGhlbSBwcm9wZXJseS4gICovCitjYXNlIDg6CitZWV9SVUxFX1NFVFVQCisjbGluZSA4NSAic2NyaXB0cy9nZW5rc3ltcy9sZXgubCIKK3JldHVybiBPVEhFUjsKKwlZWV9CUkVBSworY2FzZSA5OgorWVlfUlVMRV9TRVRVUAorI2xpbmUgODYgInNjcmlwdHMvZ2Vua3N5bXMvbGV4LmwiCityZXR1cm4gSU5UOworCVlZX0JSRUFLCitjYXNlIDEwOgorWVlfUlVMRV9TRVRVUAorI2xpbmUgODcgInNjcmlwdHMvZ2Vua3N5bXMvbGV4LmwiCityZXR1cm4gUkVBTDsKKwlZWV9CUkVBSworY2FzZSAxMToKK1lZX1JVTEVfU0VUVVAKKyNsaW5lIDg5ICJzY3JpcHRzL2dlbmtzeW1zL2xleC5sIgorcmV0dXJuIERPVFM7CisJWVlfQlJFQUsKKy8qIEFsbCBvdGhlciB0b2tlbnMgYXJlIHNpbmdsZSBjaGFyYWN0ZXJzLiAgKi8KK2Nhc2UgMTI6CitZWV9SVUxFX1NFVFVQCisjbGluZSA5MiAic2NyaXB0cy9nZW5rc3ltcy9sZXgubCIKK3JldHVybiB5eXRleHRbMF07CisJWVlfQlJFQUsKK2Nhc2UgMTM6CitZWV9SVUxFX1NFVFVQCisjbGluZSA5NSAic2NyaXB0cy9nZW5rc3ltcy9sZXgubCIKK0VDSE87CisJWVlfQlJFQUsKKyNsaW5lIDg0MiAic2NyaXB0cy9nZW5rc3ltcy9sZXguYyIKK2Nhc2UgWVlfU1RBVEVfRU9GKElOSVRJQUwpOgorY2FzZSBZWV9TVEFURV9FT0YoVjJfVE9LRU5TKToKKwl5eXRlcm1pbmF0ZSgpOworCisJY2FzZSBZWV9FTkRfT0ZfQlVGRkVSOgorCQl7CisJCS8qIEFtb3VudCBvZiB0ZXh0IG1hdGNoZWQgbm90IGluY2x1ZGluZyB0aGUgRU9CIGNoYXIuICovCisJCWludCB5eV9hbW91bnRfb2ZfbWF0Y2hlZF90ZXh0ID0gKGludCkgKHl5X2NwIC0geXl0ZXh0X3B0cikgLSAxOworCisJCS8qIFVuZG8gdGhlIGVmZmVjdHMgb2YgWVlfRE9fQkVGT1JFX0FDVElPTi4gKi8KKwkJKnl5X2NwID0geXlfaG9sZF9jaGFyOworCQlZWV9SRVNUT1JFX1lZX01PUkVfT0ZGU0VUCisKKwkJaWYgKCB5eV9jdXJyZW50X2J1ZmZlci0+eXlfYnVmZmVyX3N0YXR1cyA9PSBZWV9CVUZGRVJfTkVXICkKKwkJCXsKKwkJCS8qIFdlJ3JlIHNjYW5uaW5nIGEgbmV3IGZpbGUgb3IgaW5wdXQgc291cmNlLiAgSXQncworCQkJICogcG9zc2libGUgdGhhdCB0aGlzIGhhcHBlbmVkIGJlY2F1c2UgdGhlIHVzZXIKKwkJCSAqIGp1c3QgcG9pbnRlZCB5eWluIGF0IGEgbmV3IHNvdXJjZSBhbmQgY2FsbGVkCisJCQkgKiB5eWxleCgpLiAgSWYgc28sIHRoZW4gd2UgaGF2ZSB0byBhc3N1cmUKKwkJCSAqIGNvbnNpc3RlbmN5IGJldHdlZW4geXlfY3VycmVudF9idWZmZXIgYW5kIG91cgorCQkJICogZ2xvYmFscy4gIEhlcmUgaXMgdGhlIHJpZ2h0IHBsYWNlIHRvIGRvIHNvLCBiZWNhdXNlCisJCQkgKiB0aGlzIGlzIHRoZSBmaXJzdCBhY3Rpb24gKG90aGVyIHRoYW4gcG9zc2libHkgYQorCQkJICogYmFjay11cCkgdGhhdCB3aWxsIG1hdGNoIGZvciB0aGUgbmV3IGlucHV0IHNvdXJjZS4KKwkJCSAqLworCQkJeXlfbl9jaGFycyA9IHl5X2N1cnJlbnRfYnVmZmVyLT55eV9uX2NoYXJzOworCQkJeXlfY3VycmVudF9idWZmZXItPnl5X2lucHV0X2ZpbGUgPSB5eWluOworCQkJeXlfY3VycmVudF9idWZmZXItPnl5X2J1ZmZlcl9zdGF0dXMgPSBZWV9CVUZGRVJfTk9STUFMOworCQkJfQorCisJCS8qIE5vdGUgdGhhdCBoZXJlIHdlIHRlc3QgZm9yIHl5X2NfYnVmX3AgIjw9IiB0byB0aGUgcG9zaXRpb24KKwkJICogb2YgdGhlIGZpcnN0IEVPQiBpbiB0aGUgYnVmZmVyLCBzaW5jZSB5eV9jX2J1Zl9wIHdpbGwKKwkJICogYWxyZWFkeSBoYXZlIGJlZW4gaW5jcmVtZW50ZWQgcGFzdCB0aGUgTlVMIGNoYXJhY3RlcgorCQkgKiAoc2luY2UgYWxsIHN0YXRlcyBtYWtlIHRyYW5zaXRpb25zIG9uIEVPQiB0byB0aGUKKwkJICogZW5kLW9mLWJ1ZmZlciBzdGF0ZSkuICBDb250cmFzdCB0aGlzIHdpdGggdGhlIHRlc3QKKwkJICogaW4gaW5wdXQoKS4KKwkJICovCisJCWlmICggeXlfY19idWZfcCA8PSAmeXlfY3VycmVudF9idWZmZXItPnl5X2NoX2J1Zlt5eV9uX2NoYXJzXSApCisJCQl7IC8qIFRoaXMgd2FzIHJlYWxseSBhIE5VTC4gKi8KKwkJCXl5X3N0YXRlX3R5cGUgeXlfbmV4dF9zdGF0ZTsKKworCQkJeXlfY19idWZfcCA9IHl5dGV4dF9wdHIgKyB5eV9hbW91bnRfb2ZfbWF0Y2hlZF90ZXh0OworCisJCQl5eV9jdXJyZW50X3N0YXRlID0geXlfZ2V0X3ByZXZpb3VzX3N0YXRlKCk7CisKKwkJCS8qIE9rYXksIHdlJ3JlIG5vdyBwb3NpdGlvbmVkIHRvIG1ha2UgdGhlIE5VTAorCQkJICogdHJhbnNpdGlvbi4gIFdlIGNvdWxkbid0IGhhdmUKKwkJCSAqIHl5X2dldF9wcmV2aW91c19zdGF0ZSgpIGdvIGFoZWFkIGFuZCBkbyBpdAorCQkJICogZm9yIHVzIGJlY2F1c2UgaXQgZG9lc24ndCBrbm93IGhvdyB0byBkZWFsCisJCQkgKiB3aXRoIHRoZSBwb3NzaWJpbGl0eSBvZiBqYW1taW5nIChhbmQgd2UgZG9uJ3QKKwkJCSAqIHdhbnQgdG8gYnVpbGQgamFtbWluZyBpbnRvIGl0IGJlY2F1c2UgdGhlbiBpdAorCQkJICogd2lsbCBydW4gbW9yZSBzbG93bHkpLgorCQkJICovCisKKwkJCXl5X25leHRfc3RhdGUgPSB5eV90cnlfTlVMX3RyYW5zKCB5eV9jdXJyZW50X3N0YXRlICk7CisKKwkJCXl5X2JwID0geXl0ZXh0X3B0ciArIFlZX01PUkVfQURKOworCisJCQlpZiAoIHl5X25leHRfc3RhdGUgKQorCQkJCXsKKwkJCQkvKiBDb25zdW1lIHRoZSBOVUwuICovCisJCQkJeXlfY3AgPSArK3l5X2NfYnVmX3A7CisJCQkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X25leHRfc3RhdGU7CisJCQkJZ290byB5eV9tYXRjaDsKKwkJCQl9CisKKwkJCWVsc2UKKwkJCQl7CisJCQkJeXlfY3AgPSB5eV9jX2J1Zl9wOworCQkJCWdvdG8geXlfZmluZF9hY3Rpb247CisJCQkJfQorCQkJfQorCisJCWVsc2Ugc3dpdGNoICggeXlfZ2V0X25leHRfYnVmZmVyKCkgKQorCQkJeworCQkJY2FzZSBFT0JfQUNUX0VORF9PRl9GSUxFOgorCQkJCXsKKwkJCQl5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YgPSAwOworCisJCQkJaWYgKCB5eXdyYXAoKSApCisJCQkJCXsKKwkJCQkJLyogTm90ZTogYmVjYXVzZSB3ZSd2ZSB0YWtlbiBjYXJlIGluCisJCQkJCSAqIHl5X2dldF9uZXh0X2J1ZmZlcigpIHRvIGhhdmUgc2V0IHVwCisJCQkJCSAqIHl5dGV4dCwgd2UgY2FuIG5vdyBzZXQgdXAKKwkJCQkJICogeXlfY19idWZfcCBzbyB0aGF0IGlmIHNvbWUgdG90YWwKKwkJCQkJICogaG9zZXIgKGxpa2UgZmxleCBpdHNlbGYpIHdhbnRzIHRvCisJCQkJCSAqIGNhbGwgdGhlIHNjYW5uZXIgYWZ0ZXIgd2UgcmV0dXJuIHRoZQorCQkJCQkgKiBZWV9OVUxMLCBpdCdsbCBzdGlsbCB3b3JrIC0gYW5vdGhlcgorCQkJCQkgKiBZWV9OVUxMIHdpbGwgZ2V0IHJldHVybmVkLgorCQkJCQkgKi8KKwkJCQkJeXlfY19idWZfcCA9IHl5dGV4dF9wdHIgKyBZWV9NT1JFX0FESjsKKworCQkJCQl5eV9hY3QgPSBZWV9TVEFURV9FT0YoWVlfU1RBUlQpOworCQkJCQlnb3RvIGRvX2FjdGlvbjsKKwkJCQkJfQorCisJCQkJZWxzZQorCQkJCQl7CisJCQkJCWlmICggISB5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YgKQorCQkJCQkJWVlfTkVXX0ZJTEU7CisJCQkJCX0KKwkJCQlicmVhazsKKwkJCQl9CisKKwkJCWNhc2UgRU9CX0FDVF9DT05USU5VRV9TQ0FOOgorCQkJCXl5X2NfYnVmX3AgPQorCQkJCQl5eXRleHRfcHRyICsgeXlfYW1vdW50X29mX21hdGNoZWRfdGV4dDsKKworCQkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9nZXRfcHJldmlvdXNfc3RhdGUoKTsKKworCQkJCXl5X2NwID0geXlfY19idWZfcDsKKwkJCQl5eV9icCA9IHl5dGV4dF9wdHIgKyBZWV9NT1JFX0FESjsKKwkJCQlnb3RvIHl5X21hdGNoOworCisJCQljYXNlIEVPQl9BQ1RfTEFTVF9NQVRDSDoKKwkJCQl5eV9jX2J1Zl9wID0KKwkJCQkmeXlfY3VycmVudF9idWZmZXItPnl5X2NoX2J1Zlt5eV9uX2NoYXJzXTsKKworCQkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9nZXRfcHJldmlvdXNfc3RhdGUoKTsKKworCQkJCXl5X2NwID0geXlfY19idWZfcDsKKwkJCQl5eV9icCA9IHl5dGV4dF9wdHIgKyBZWV9NT1JFX0FESjsKKwkJCQlnb3RvIHl5X2ZpbmRfYWN0aW9uOworCQkJfQorCQlicmVhazsKKwkJfQorCisJZGVmYXVsdDoKKwkJWVlfRkFUQUxfRVJST1IoCisJCQkiZmF0YWwgZmxleCBzY2FubmVyIGludGVybmFsIGVycm9yLS1ubyBhY3Rpb24gZm91bmQiICk7CisJfSAvKiBlbmQgb2YgYWN0aW9uIHN3aXRjaCAqLworCQl9IC8qIGVuZCBvZiBzY2FubmluZyBvbmUgdG9rZW4gKi8KKwl9IC8qIGVuZCBvZiB5eWxleCAqLworCisKKy8qIHl5X2dldF9uZXh0X2J1ZmZlciAtIHRyeSB0byByZWFkIGluIGEgbmV3IGJ1ZmZlcgorICoKKyAqIFJldHVybnMgYSBjb2RlIHJlcHJlc2VudGluZyBhbiBhY3Rpb246CisgKglFT0JfQUNUX0xBU1RfTUFUQ0ggLQorICoJRU9CX0FDVF9DT05USU5VRV9TQ0FOIC0gY29udGludWUgc2Nhbm5pbmcgZnJvbSBjdXJyZW50IHBvc2l0aW9uCisgKglFT0JfQUNUX0VORF9PRl9GSUxFIC0gZW5kIG9mIGZpbGUKKyAqLworCitzdGF0aWMgaW50IHl5X2dldF9uZXh0X2J1ZmZlcigpCisJeworCXJlZ2lzdGVyIGNoYXIgKmRlc3QgPSB5eV9jdXJyZW50X2J1ZmZlci0+eXlfY2hfYnVmOworCXJlZ2lzdGVyIGNoYXIgKnNvdXJjZSA9IHl5dGV4dF9wdHI7CisJcmVnaXN0ZXIgaW50IG51bWJlcl90b19tb3ZlLCBpOworCWludCByZXRfdmFsOworCisJaWYgKCB5eV9jX2J1Zl9wID4gJnl5X2N1cnJlbnRfYnVmZmVyLT55eV9jaF9idWZbeXlfbl9jaGFycyArIDFdICkKKwkJWVlfRkFUQUxfRVJST1IoCisJCSJmYXRhbCBmbGV4IHNjYW5uZXIgaW50ZXJuYWwgZXJyb3ItLWVuZCBvZiBidWZmZXIgbWlzc2VkIiApOworCisJaWYgKCB5eV9jdXJyZW50X2J1ZmZlci0+eXlfZmlsbF9idWZmZXIgPT0gMCApCisJCXsgLyogRG9uJ3QgdHJ5IHRvIGZpbGwgdGhlIGJ1ZmZlciwgc28gdGhpcyBpcyBhbiBFT0YuICovCisJCWlmICggeXlfY19idWZfcCAtIHl5dGV4dF9wdHIgLSBZWV9NT1JFX0FESiA9PSAxICkKKwkJCXsKKwkJCS8qIFdlIG1hdGNoZWQgYSBzaW5nbGUgY2hhcmFjdGVyLCB0aGUgRU9CLCBzbworCQkJICogdHJlYXQgdGhpcyBhcyBhIGZpbmFsIEVPRi4KKwkJCSAqLworCQkJcmV0dXJuIEVPQl9BQ1RfRU5EX09GX0ZJTEU7CisJCQl9CisKKwkJZWxzZQorCQkJeworCQkJLyogV2UgbWF0Y2hlZCBzb21lIHRleHQgcHJpb3IgdG8gdGhlIEVPQiwgZmlyc3QKKwkJCSAqIHByb2Nlc3MgaXQuCisJCQkgKi8KKwkJCXJldHVybiBFT0JfQUNUX0xBU1RfTUFUQ0g7CisJCQl9CisJCX0KKworCS8qIFRyeSB0byByZWFkIG1vcmUgZGF0YS4gKi8KKworCS8qIEZpcnN0IG1vdmUgbGFzdCBjaGFycyB0byBzdGFydCBvZiBidWZmZXIuICovCisJbnVtYmVyX3RvX21vdmUgPSAoaW50KSAoeXlfY19idWZfcCAtIHl5dGV4dF9wdHIpIC0gMTsKKworCWZvciAoIGkgPSAwOyBpIDwgbnVtYmVyX3RvX21vdmU7ICsraSApCisJCSooZGVzdCsrKSA9ICooc291cmNlKyspOworCisJaWYgKCB5eV9jdXJyZW50X2J1ZmZlci0+eXlfYnVmZmVyX3N0YXR1cyA9PSBZWV9CVUZGRVJfRU9GX1BFTkRJTkcgKQorCQkvKiBkb24ndCBkbyB0aGUgcmVhZCwgaXQncyBub3QgZ3VhcmFudGVlZCB0byByZXR1cm4gYW4gRU9GLAorCQkgKiBqdXN0IGZvcmNlIGFuIEVPRgorCQkgKi8KKwkJeXlfY3VycmVudF9idWZmZXItPnl5X25fY2hhcnMgPSB5eV9uX2NoYXJzID0gMDsKKworCWVsc2UKKwkJeworCQlpbnQgbnVtX3RvX3JlYWQgPQorCQkJeXlfY3VycmVudF9idWZmZXItPnl5X2J1Zl9zaXplIC0gbnVtYmVyX3RvX21vdmUgLSAxOworCisJCXdoaWxlICggbnVtX3RvX3JlYWQgPD0gMCApCisJCQl7IC8qIE5vdCBlbm91Z2ggcm9vbSBpbiB0aGUgYnVmZmVyIC0gZ3JvdyBpdC4gKi8KKyNpZmRlZiBZWV9VU0VTX1JFSkVDVAorCQkJWVlfRkFUQUxfRVJST1IoCisiaW5wdXQgYnVmZmVyIG92ZXJmbG93LCBjYW4ndCBlbmxhcmdlIGJ1ZmZlciBiZWNhdXNlIHNjYW5uZXIgdXNlcyBSRUpFQ1QiICk7CisjZWxzZQorCisJCQkvKiBqdXN0IGEgc2hvcnRlciBuYW1lIGZvciB0aGUgY3VycmVudCBidWZmZXIgKi8KKwkJCVlZX0JVRkZFUl9TVEFURSBiID0geXlfY3VycmVudF9idWZmZXI7CisKKwkJCWludCB5eV9jX2J1Zl9wX29mZnNldCA9CisJCQkJKGludCkgKHl5X2NfYnVmX3AgLSBiLT55eV9jaF9idWYpOworCisJCQlpZiAoIGItPnl5X2lzX291cl9idWZmZXIgKQorCQkJCXsKKwkJCQlpbnQgbmV3X3NpemUgPSBiLT55eV9idWZfc2l6ZSAqIDI7CisKKwkJCQlpZiAoIG5ld19zaXplIDw9IDAgKQorCQkJCQliLT55eV9idWZfc2l6ZSArPSBiLT55eV9idWZfc2l6ZSAvIDg7CisJCQkJZWxzZQorCQkJCQliLT55eV9idWZfc2l6ZSAqPSAyOworCisJCQkJYi0+eXlfY2hfYnVmID0gKGNoYXIgKikKKwkJCQkJLyogSW5jbHVkZSByb29tIGluIGZvciAyIEVPQiBjaGFycy4gKi8KKwkJCQkJeXlfZmxleF9yZWFsbG9jKCAodm9pZCAqKSBiLT55eV9jaF9idWYsCisJCQkJCQkJIGItPnl5X2J1Zl9zaXplICsgMiApOworCQkJCX0KKwkJCWVsc2UKKwkJCQkvKiBDYW4ndCBncm93IGl0LCB3ZSBkb24ndCBvd24gaXQuICovCisJCQkJYi0+eXlfY2hfYnVmID0gMDsKKworCQkJaWYgKCAhIGItPnl5X2NoX2J1ZiApCisJCQkJWVlfRkFUQUxfRVJST1IoCisJCQkJImZhdGFsIGVycm9yIC0gc2Nhbm5lciBpbnB1dCBidWZmZXIgb3ZlcmZsb3ciICk7CisKKwkJCXl5X2NfYnVmX3AgPSAmYi0+eXlfY2hfYnVmW3l5X2NfYnVmX3Bfb2Zmc2V0XTsKKworCQkJbnVtX3RvX3JlYWQgPSB5eV9jdXJyZW50X2J1ZmZlci0+eXlfYnVmX3NpemUgLQorCQkJCQkJbnVtYmVyX3RvX21vdmUgLSAxOworI2VuZGlmCisJCQl9CisKKwkJaWYgKCBudW1fdG9fcmVhZCA+IFlZX1JFQURfQlVGX1NJWkUgKQorCQkJbnVtX3RvX3JlYWQgPSBZWV9SRUFEX0JVRl9TSVpFOworCisJCS8qIFJlYWQgaW4gbW9yZSBkYXRhLiAqLworCQlZWV9JTlBVVCggKCZ5eV9jdXJyZW50X2J1ZmZlci0+eXlfY2hfYnVmW251bWJlcl90b19tb3ZlXSksCisJCQl5eV9uX2NoYXJzLCBudW1fdG9fcmVhZCApOworCisJCXl5X2N1cnJlbnRfYnVmZmVyLT55eV9uX2NoYXJzID0geXlfbl9jaGFyczsKKwkJfQorCisJaWYgKCB5eV9uX2NoYXJzID09IDAgKQorCQl7CisJCWlmICggbnVtYmVyX3RvX21vdmUgPT0gWVlfTU9SRV9BREogKQorCQkJeworCQkJcmV0X3ZhbCA9IEVPQl9BQ1RfRU5EX09GX0ZJTEU7CisJCQl5eXJlc3RhcnQoIHl5aW4gKTsKKwkJCX0KKworCQllbHNlCisJCQl7CisJCQlyZXRfdmFsID0gRU9CX0FDVF9MQVNUX01BVENIOworCQkJeXlfY3VycmVudF9idWZmZXItPnl5X2J1ZmZlcl9zdGF0dXMgPQorCQkJCVlZX0JVRkZFUl9FT0ZfUEVORElORzsKKwkJCX0KKwkJfQorCisJZWxzZQorCQlyZXRfdmFsID0gRU9CX0FDVF9DT05USU5VRV9TQ0FOOworCisJeXlfbl9jaGFycyArPSBudW1iZXJfdG9fbW92ZTsKKwl5eV9jdXJyZW50X2J1ZmZlci0+eXlfY2hfYnVmW3l5X25fY2hhcnNdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOworCXl5X2N1cnJlbnRfYnVmZmVyLT55eV9jaF9idWZbeXlfbl9jaGFycyArIDFdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOworCisJeXl0ZXh0X3B0ciA9ICZ5eV9jdXJyZW50X2J1ZmZlci0+eXlfY2hfYnVmWzBdOworCisJcmV0dXJuIHJldF92YWw7CisJfQorCisKKy8qIHl5X2dldF9wcmV2aW91c19zdGF0ZSAtIGdldCB0aGUgc3RhdGUganVzdCBiZWZvcmUgdGhlIEVPQiBjaGFyIHdhcyByZWFjaGVkICovCisKK3N0YXRpYyB5eV9zdGF0ZV90eXBlIHl5X2dldF9wcmV2aW91c19zdGF0ZSgpCisJeworCXJlZ2lzdGVyIHl5X3N0YXRlX3R5cGUgeXlfY3VycmVudF9zdGF0ZTsKKwlyZWdpc3RlciBjaGFyICp5eV9jcDsKKworCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9zdGFydDsKKwl5eV9jdXJyZW50X3N0YXRlICs9IFlZX0FUX0JPTCgpOworCisJZm9yICggeXlfY3AgPSB5eXRleHRfcHRyICsgWVlfTU9SRV9BREo7IHl5X2NwIDwgeXlfY19idWZfcDsgKyt5eV9jcCApCisJCXsKKwkJcmVnaXN0ZXIgWVlfQ0hBUiB5eV9jID0gKCp5eV9jcCA/IHl5X2VjW1lZX1NDX1RPX1VJKCp5eV9jcCldIDogMSk7CisJCWlmICggeXlfYWNjZXB0W3l5X2N1cnJlbnRfc3RhdGVdICkKKwkJCXsKKwkJCXl5X2xhc3RfYWNjZXB0aW5nX3N0YXRlID0geXlfY3VycmVudF9zdGF0ZTsKKwkJCXl5X2xhc3RfYWNjZXB0aW5nX2Nwb3MgPSB5eV9jcDsKKwkJCX0KKwkJd2hpbGUgKCB5eV9jaGtbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArIHl5X2NdICE9IHl5X2N1cnJlbnRfc3RhdGUgKQorCQkJeworCQkJeXlfY3VycmVudF9zdGF0ZSA9IChpbnQpIHl5X2RlZlt5eV9jdXJyZW50X3N0YXRlXTsKKwkJCWlmICggeXlfY3VycmVudF9zdGF0ZSA+PSA3NiApCisJCQkJeXlfYyA9IHl5X21ldGFbKHVuc2lnbmVkIGludCkgeXlfY107CisJCQl9CisJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9ueHRbeXlfYmFzZVt5eV9jdXJyZW50X3N0YXRlXSArICh1bnNpZ25lZCBpbnQpIHl5X2NdOworCQl9CisKKwlyZXR1cm4geXlfY3VycmVudF9zdGF0ZTsKKwl9CisKKworLyogeXlfdHJ5X05VTF90cmFucyAtIHRyeSB0byBtYWtlIGEgdHJhbnNpdGlvbiBvbiB0aGUgTlVMIGNoYXJhY3RlcgorICoKKyAqIHN5bm9wc2lzCisgKgluZXh0X3N0YXRlID0geXlfdHJ5X05VTF90cmFucyggY3VycmVudF9zdGF0ZSApOworICovCisKKyNpZmRlZiBZWV9VU0VfUFJPVE9TCitzdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV90cnlfTlVMX3RyYW5zKCB5eV9zdGF0ZV90eXBlIHl5X2N1cnJlbnRfc3RhdGUgKQorI2Vsc2UKK3N0YXRpYyB5eV9zdGF0ZV90eXBlIHl5X3RyeV9OVUxfdHJhbnMoIHl5X2N1cnJlbnRfc3RhdGUgKQoreXlfc3RhdGVfdHlwZSB5eV9jdXJyZW50X3N0YXRlOworI2VuZGlmCisJeworCXJlZ2lzdGVyIGludCB5eV9pc19qYW07CisJcmVnaXN0ZXIgY2hhciAqeXlfY3AgPSB5eV9jX2J1Zl9wOworCisJcmVnaXN0ZXIgWVlfQ0hBUiB5eV9jID0gMTsKKwlpZiAoIHl5X2FjY2VwdFt5eV9jdXJyZW50X3N0YXRlXSApCisJCXsKKwkJeXlfbGFzdF9hY2NlcHRpbmdfc3RhdGUgPSB5eV9jdXJyZW50X3N0YXRlOworCQl5eV9sYXN0X2FjY2VwdGluZ19jcG9zID0geXlfY3A7CisJCX0KKwl3aGlsZSAoIHl5X2Noa1t5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICsgeXlfY10gIT0geXlfY3VycmVudF9zdGF0ZSApCisJCXsKKwkJeXlfY3VycmVudF9zdGF0ZSA9IChpbnQpIHl5X2RlZlt5eV9jdXJyZW50X3N0YXRlXTsKKwkJaWYgKCB5eV9jdXJyZW50X3N0YXRlID49IDc2ICkKKwkJCXl5X2MgPSB5eV9tZXRhWyh1bnNpZ25lZCBpbnQpIHl5X2NdOworCQl9CisJeXlfY3VycmVudF9zdGF0ZSA9IHl5X254dFt5eV9iYXNlW3l5X2N1cnJlbnRfc3RhdGVdICsgKHVuc2lnbmVkIGludCkgeXlfY107CisJeXlfaXNfamFtID0gKHl5X2N1cnJlbnRfc3RhdGUgPT0gNzUpOworCisJcmV0dXJuIHl5X2lzX2phbSA/IDAgOiB5eV9jdXJyZW50X3N0YXRlOworCX0KKworCisjaWZuZGVmIFlZX05PX1VOUFVUCisjaWZkZWYgWVlfVVNFX1BST1RPUworc3RhdGljIHZvaWQgeXl1bnB1dCggaW50IGMsIHJlZ2lzdGVyIGNoYXIgKnl5X2JwICkKKyNlbHNlCitzdGF0aWMgdm9pZCB5eXVucHV0KCBjLCB5eV9icCApCitpbnQgYzsKK3JlZ2lzdGVyIGNoYXIgKnl5X2JwOworI2VuZGlmCisJeworCXJlZ2lzdGVyIGNoYXIgKnl5X2NwID0geXlfY19idWZfcDsKKworCS8qIHVuZG8gZWZmZWN0cyBvZiBzZXR0aW5nIHVwIHl5dGV4dCAqLworCSp5eV9jcCA9IHl5X2hvbGRfY2hhcjsKKworCWlmICggeXlfY3AgPCB5eV9jdXJyZW50X2J1ZmZlci0+eXlfY2hfYnVmICsgMiApCisJCXsgLyogbmVlZCB0byBzaGlmdCB0aGluZ3MgdXAgdG8gbWFrZSByb29tICovCisJCS8qICsyIGZvciBFT0IgY2hhcnMuICovCisJCXJlZ2lzdGVyIGludCBudW1iZXJfdG9fbW92ZSA9IHl5X25fY2hhcnMgKyAyOworCQlyZWdpc3RlciBjaGFyICpkZXN0ID0gJnl5X2N1cnJlbnRfYnVmZmVyLT55eV9jaF9idWZbCisJCQkJCXl5X2N1cnJlbnRfYnVmZmVyLT55eV9idWZfc2l6ZSArIDJdOworCQlyZWdpc3RlciBjaGFyICpzb3VyY2UgPQorCQkJCSZ5eV9jdXJyZW50X2J1ZmZlci0+eXlfY2hfYnVmW251bWJlcl90b19tb3ZlXTsKKworCQl3aGlsZSAoIHNvdXJjZSA+IHl5X2N1cnJlbnRfYnVmZmVyLT55eV9jaF9idWYgKQorCQkJKi0tZGVzdCA9ICotLXNvdXJjZTsKKworCQl5eV9jcCArPSAoaW50KSAoZGVzdCAtIHNvdXJjZSk7CisJCXl5X2JwICs9IChpbnQpIChkZXN0IC0gc291cmNlKTsKKwkJeXlfY3VycmVudF9idWZmZXItPnl5X25fY2hhcnMgPQorCQkJeXlfbl9jaGFycyA9IHl5X2N1cnJlbnRfYnVmZmVyLT55eV9idWZfc2l6ZTsKKworCQlpZiAoIHl5X2NwIDwgeXlfY3VycmVudF9idWZmZXItPnl5X2NoX2J1ZiArIDIgKQorCQkJWVlfRkFUQUxfRVJST1IoICJmbGV4IHNjYW5uZXIgcHVzaC1iYWNrIG92ZXJmbG93IiApOworCQl9CisKKwkqLS15eV9jcCA9IChjaGFyKSBjOworCisKKwl5eXRleHRfcHRyID0geXlfYnA7CisJeXlfaG9sZF9jaGFyID0gKnl5X2NwOworCXl5X2NfYnVmX3AgPSB5eV9jcDsKKwl9CisjZW5kaWYJLyogaWZuZGVmIFlZX05PX1VOUFVUICovCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitzdGF0aWMgaW50IHl5aW5wdXQoKQorI2Vsc2UKK3N0YXRpYyBpbnQgaW5wdXQoKQorI2VuZGlmCisJeworCWludCBjOworCisJKnl5X2NfYnVmX3AgPSB5eV9ob2xkX2NoYXI7CisKKwlpZiAoICp5eV9jX2J1Zl9wID09IFlZX0VORF9PRl9CVUZGRVJfQ0hBUiApCisJCXsKKwkJLyogeXlfY19idWZfcCBub3cgcG9pbnRzIHRvIHRoZSBjaGFyYWN0ZXIgd2Ugd2FudCB0byByZXR1cm4uCisJCSAqIElmIHRoaXMgb2NjdXJzICpiZWZvcmUqIHRoZSBFT0IgY2hhcmFjdGVycywgdGhlbiBpdCdzIGEKKwkJICogdmFsaWQgTlVMOyBpZiBub3QsIHRoZW4gd2UndmUgaGl0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKwkJICovCisJCWlmICggeXlfY19idWZfcCA8ICZ5eV9jdXJyZW50X2J1ZmZlci0+eXlfY2hfYnVmW3l5X25fY2hhcnNdICkKKwkJCS8qIFRoaXMgd2FzIHJlYWxseSBhIE5VTC4gKi8KKwkJCSp5eV9jX2J1Zl9wID0gJ1wwJzsKKworCQllbHNlCisJCQl7IC8qIG5lZWQgbW9yZSBpbnB1dCAqLworCQkJaW50IG9mZnNldCA9IHl5X2NfYnVmX3AgLSB5eXRleHRfcHRyOworCQkJKyt5eV9jX2J1Zl9wOworCisJCQlzd2l0Y2ggKCB5eV9nZXRfbmV4dF9idWZmZXIoKSApCisJCQkJeworCQkJCWNhc2UgRU9CX0FDVF9MQVNUX01BVENIOgorCQkJCQkvKiBUaGlzIGhhcHBlbnMgYmVjYXVzZSB5eV9nX25fYigpCisJCQkJCSAqIHNlZXMgdGhhdCB3ZSd2ZSBhY2N1bXVsYXRlZCBhCisJCQkJCSAqIHRva2VuIGFuZCBmbGFncyB0aGF0IHdlIG5lZWQgdG8KKwkJCQkJICogdHJ5IG1hdGNoaW5nIHRoZSB0b2tlbiBiZWZvcmUKKwkJCQkJICogcHJvY2VlZGluZy4gIEJ1dCBmb3IgaW5wdXQoKSwKKwkJCQkJICogdGhlcmUncyBubyBtYXRjaGluZyB0byBjb25zaWRlci4KKwkJCQkJICogU28gY29udmVydCB0aGUgRU9CX0FDVF9MQVNUX01BVENICisJCQkJCSAqIHRvIEVPQl9BQ1RfRU5EX09GX0ZJTEUuCisJCQkJCSAqLworCisJCQkJCS8qIFJlc2V0IGJ1ZmZlciBzdGF0dXMuICovCisJCQkJCXl5cmVzdGFydCggeXlpbiApOworCisJCQkJCS8qIGZhbGwgdGhyb3VnaCAqLworCisJCQkJY2FzZSBFT0JfQUNUX0VORF9PRl9GSUxFOgorCQkJCQl7CisJCQkJCWlmICggeXl3cmFwKCkgKQorCQkJCQkJcmV0dXJuIEVPRjsKKworCQkJCQlpZiAoICEgeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mICkKKwkJCQkJCVlZX05FV19GSUxFOworI2lmZGVmIF9fY3BsdXNwbHVzCisJCQkJCXJldHVybiB5eWlucHV0KCk7CisjZWxzZQorCQkJCQlyZXR1cm4gaW5wdXQoKTsKKyNlbmRpZgorCQkJCQl9CisKKwkJCQljYXNlIEVPQl9BQ1RfQ09OVElOVUVfU0NBTjoKKwkJCQkJeXlfY19idWZfcCA9IHl5dGV4dF9wdHIgKyBvZmZzZXQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJYyA9ICoodW5zaWduZWQgY2hhciAqKSB5eV9jX2J1Zl9wOwkvKiBjYXN0IGZvciA4LWJpdCBjaGFyJ3MgKi8KKwkqeXlfY19idWZfcCA9ICdcMCc7CS8qIHByZXNlcnZlIHl5dGV4dCAqLworCXl5X2hvbGRfY2hhciA9ICorK3l5X2NfYnVmX3A7CisKKwl5eV9jdXJyZW50X2J1ZmZlci0+eXlfYXRfYm9sID0gKGMgPT0gJ1xuJyk7CisKKwlyZXR1cm4gYzsKKwl9CisKKworI2lmZGVmIFlZX1VTRV9QUk9UT1MKK3ZvaWQgeXlyZXN0YXJ0KCBGSUxFICppbnB1dF9maWxlICkKKyNlbHNlCit2b2lkIHl5cmVzdGFydCggaW5wdXRfZmlsZSApCitGSUxFICppbnB1dF9maWxlOworI2VuZGlmCisJeworCWlmICggISB5eV9jdXJyZW50X2J1ZmZlciApCisJCXl5X2N1cnJlbnRfYnVmZmVyID0geXlfY3JlYXRlX2J1ZmZlciggeXlpbiwgWVlfQlVGX1NJWkUgKTsKKworCXl5X2luaXRfYnVmZmVyKCB5eV9jdXJyZW50X2J1ZmZlciwgaW5wdXRfZmlsZSApOworCXl5X2xvYWRfYnVmZmVyX3N0YXRlKCk7CisJfQorCisKKyNpZmRlZiBZWV9VU0VfUFJPVE9TCit2b2lkIHl5X3N3aXRjaF90b19idWZmZXIoIFlZX0JVRkZFUl9TVEFURSBuZXdfYnVmZmVyICkKKyNlbHNlCit2b2lkIHl5X3N3aXRjaF90b19idWZmZXIoIG5ld19idWZmZXIgKQorWVlfQlVGRkVSX1NUQVRFIG5ld19idWZmZXI7CisjZW5kaWYKKwl7CisJaWYgKCB5eV9jdXJyZW50X2J1ZmZlciA9PSBuZXdfYnVmZmVyICkKKwkJcmV0dXJuOworCisJaWYgKCB5eV9jdXJyZW50X2J1ZmZlciApCisJCXsKKwkJLyogRmx1c2ggb3V0IGluZm9ybWF0aW9uIGZvciBvbGQgYnVmZmVyLiAqLworCQkqeXlfY19idWZfcCA9IHl5X2hvbGRfY2hhcjsKKwkJeXlfY3VycmVudF9idWZmZXItPnl5X2J1Zl9wb3MgPSB5eV9jX2J1Zl9wOworCQl5eV9jdXJyZW50X2J1ZmZlci0+eXlfbl9jaGFycyA9IHl5X25fY2hhcnM7CisJCX0KKworCXl5X2N1cnJlbnRfYnVmZmVyID0gbmV3X2J1ZmZlcjsKKwl5eV9sb2FkX2J1ZmZlcl9zdGF0ZSgpOworCisJLyogV2UgZG9uJ3QgYWN0dWFsbHkga25vdyB3aGV0aGVyIHdlIGRpZCB0aGlzIHN3aXRjaCBkdXJpbmcKKwkgKiBFT0YgKHl5d3JhcCgpKSBwcm9jZXNzaW5nLCBidXQgdGhlIG9ubHkgdGltZSB0aGlzIGZsYWcKKwkgKiBpcyBsb29rZWQgYXQgaXMgYWZ0ZXIgeXl3cmFwKCkgaXMgY2FsbGVkLCBzbyBpdCdzIHNhZmUKKwkgKiB0byBnbyBhaGVhZCBhbmQgYWx3YXlzIHNldCBpdC4KKwkgKi8KKwl5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YgPSAxOworCX0KKworCisjaWZkZWYgWVlfVVNFX1BST1RPUwordm9pZCB5eV9sb2FkX2J1ZmZlcl9zdGF0ZSggdm9pZCApCisjZWxzZQordm9pZCB5eV9sb2FkX2J1ZmZlcl9zdGF0ZSgpCisjZW5kaWYKKwl7CisJeXlfbl9jaGFycyA9IHl5X2N1cnJlbnRfYnVmZmVyLT55eV9uX2NoYXJzOworCXl5dGV4dF9wdHIgPSB5eV9jX2J1Zl9wID0geXlfY3VycmVudF9idWZmZXItPnl5X2J1Zl9wb3M7CisJeXlpbiA9IHl5X2N1cnJlbnRfYnVmZmVyLT55eV9pbnB1dF9maWxlOworCXl5X2hvbGRfY2hhciA9ICp5eV9jX2J1Zl9wOworCX0KKworCisjaWZkZWYgWVlfVVNFX1BST1RPUworWVlfQlVGRkVSX1NUQVRFIHl5X2NyZWF0ZV9idWZmZXIoIEZJTEUgKmZpbGUsIGludCBzaXplICkKKyNlbHNlCitZWV9CVUZGRVJfU1RBVEUgeXlfY3JlYXRlX2J1ZmZlciggZmlsZSwgc2l6ZSApCitGSUxFICpmaWxlOworaW50IHNpemU7CisjZW5kaWYKKwl7CisJWVlfQlVGRkVSX1NUQVRFIGI7CisKKwliID0gKFlZX0JVRkZFUl9TVEFURSkgeXlfZmxleF9hbGxvYyggc2l6ZW9mKCBzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlICkgKTsKKwlpZiAoICEgYiApCisJCVlZX0ZBVEFMX0VSUk9SKCAib3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHl5X2NyZWF0ZV9idWZmZXIoKSIgKTsKKworCWItPnl5X2J1Zl9zaXplID0gc2l6ZTsKKworCS8qIHl5X2NoX2J1ZiBoYXMgdG8gYmUgMiBjaGFyYWN0ZXJzIGxvbmdlciB0aGFuIHRoZSBzaXplIGdpdmVuIGJlY2F1c2UKKwkgKiB3ZSBuZWVkIHRvIHB1dCBpbiAyIGVuZC1vZi1idWZmZXIgY2hhcmFjdGVycy4KKwkgKi8KKwliLT55eV9jaF9idWYgPSAoY2hhciAqKSB5eV9mbGV4X2FsbG9jKCBiLT55eV9idWZfc2l6ZSArIDIgKTsKKwlpZiAoICEgYi0+eXlfY2hfYnVmICkKKwkJWVlfRkFUQUxfRVJST1IoICJvdXQgb2YgZHluYW1pYyBtZW1vcnkgaW4geXlfY3JlYXRlX2J1ZmZlcigpIiApOworCisJYi0+eXlfaXNfb3VyX2J1ZmZlciA9IDE7CisKKwl5eV9pbml0X2J1ZmZlciggYiwgZmlsZSApOworCisJcmV0dXJuIGI7CisJfQorCisKKyNpZmRlZiBZWV9VU0VfUFJPVE9TCit2b2lkIHl5X2RlbGV0ZV9idWZmZXIoIFlZX0JVRkZFUl9TVEFURSBiICkKKyNlbHNlCit2b2lkIHl5X2RlbGV0ZV9idWZmZXIoIGIgKQorWVlfQlVGRkVSX1NUQVRFIGI7CisjZW5kaWYKKwl7CisJaWYgKCAhIGIgKQorCQlyZXR1cm47CisKKwlpZiAoIGIgPT0geXlfY3VycmVudF9idWZmZXIgKQorCQl5eV9jdXJyZW50X2J1ZmZlciA9IChZWV9CVUZGRVJfU1RBVEUpIDA7CisKKwlpZiAoIGItPnl5X2lzX291cl9idWZmZXIgKQorCQl5eV9mbGV4X2ZyZWUoICh2b2lkICopIGItPnl5X2NoX2J1ZiApOworCisJeXlfZmxleF9mcmVlKCAodm9pZCAqKSBiICk7CisJfQorCisKKworI2lmZGVmIFlZX1VTRV9QUk9UT1MKK3ZvaWQgeXlfaW5pdF9idWZmZXIoIFlZX0JVRkZFUl9TVEFURSBiLCBGSUxFICpmaWxlICkKKyNlbHNlCit2b2lkIHl5X2luaXRfYnVmZmVyKCBiLCBmaWxlICkKK1lZX0JVRkZFUl9TVEFURSBiOworRklMRSAqZmlsZTsKKyNlbmRpZgorCisKKwl7CisJeXlfZmx1c2hfYnVmZmVyKCBiICk7CisKKwliLT55eV9pbnB1dF9maWxlID0gZmlsZTsKKwliLT55eV9maWxsX2J1ZmZlciA9IDE7CisKKyNpZiBZWV9BTFdBWVNfSU5URVJBQ1RJVkUKKwliLT55eV9pc19pbnRlcmFjdGl2ZSA9IDE7CisjZWxzZQorI2lmIFlZX05FVkVSX0lOVEVSQUNUSVZFCisJYi0+eXlfaXNfaW50ZXJhY3RpdmUgPSAwOworI2Vsc2UKKwliLT55eV9pc19pbnRlcmFjdGl2ZSA9IGZpbGUgPyAoaXNhdHR5KCBmaWxlbm8oZmlsZSkgKSA+IDApIDogMDsKKyNlbmRpZgorI2VuZGlmCisJfQorCisKKyNpZmRlZiBZWV9VU0VfUFJPVE9TCit2b2lkIHl5X2ZsdXNoX2J1ZmZlciggWVlfQlVGRkVSX1NUQVRFIGIgKQorI2Vsc2UKK3ZvaWQgeXlfZmx1c2hfYnVmZmVyKCBiICkKK1lZX0JVRkZFUl9TVEFURSBiOworI2VuZGlmCisKKwl7CisJaWYgKCAhIGIgKQorCQlyZXR1cm47CisKKwliLT55eV9uX2NoYXJzID0gMDsKKworCS8qIFdlIGFsd2F5cyBuZWVkIHR3byBlbmQtb2YtYnVmZmVyIGNoYXJhY3RlcnMuICBUaGUgZmlyc3QgY2F1c2VzCisJICogYSB0cmFuc2l0aW9uIHRvIHRoZSBlbmQtb2YtYnVmZmVyIHN0YXRlLiAgVGhlIHNlY29uZCBjYXVzZXMKKwkgKiBhIGphbSBpbiB0aGF0IHN0YXRlLgorCSAqLworCWItPnl5X2NoX2J1ZlswXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKKwliLT55eV9jaF9idWZbMV0gPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVI7CisKKwliLT55eV9idWZfcG9zID0gJmItPnl5X2NoX2J1ZlswXTsKKworCWItPnl5X2F0X2JvbCA9IDE7CisJYi0+eXlfYnVmZmVyX3N0YXR1cyA9IFlZX0JVRkZFUl9ORVc7CisKKwlpZiAoIGIgPT0geXlfY3VycmVudF9idWZmZXIgKQorCQl5eV9sb2FkX2J1ZmZlcl9zdGF0ZSgpOworCX0KKworCisjaWZuZGVmIFlZX05PX1NDQU5fQlVGRkVSCisjaWZkZWYgWVlfVVNFX1BST1RPUworWVlfQlVGRkVSX1NUQVRFIHl5X3NjYW5fYnVmZmVyKCBjaGFyICpiYXNlLCB5eV9zaXplX3Qgc2l6ZSApCisjZWxzZQorWVlfQlVGRkVSX1NUQVRFIHl5X3NjYW5fYnVmZmVyKCBiYXNlLCBzaXplICkKK2NoYXIgKmJhc2U7Cit5eV9zaXplX3Qgc2l6ZTsKKyNlbmRpZgorCXsKKwlZWV9CVUZGRVJfU1RBVEUgYjsKKworCWlmICggc2l6ZSA8IDIgfHwKKwkgICAgIGJhc2Vbc2l6ZS0yXSAhPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVIgfHwKKwkgICAgIGJhc2Vbc2l6ZS0xXSAhPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVIgKQorCQkvKiBUaGV5IGZvcmdvdCB0byBsZWF2ZSByb29tIGZvciB0aGUgRU9CJ3MuICovCisJCXJldHVybiAwOworCisJYiA9IChZWV9CVUZGRVJfU1RBVEUpIHl5X2ZsZXhfYWxsb2MoIHNpemVvZiggc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSApICk7CisJaWYgKCAhIGIgKQorCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB5eV9zY2FuX2J1ZmZlcigpIiApOworCisJYi0+eXlfYnVmX3NpemUgPSBzaXplIC0gMjsJLyogIi0gMiIgdG8gdGFrZSBjYXJlIG9mIEVPQidzICovCisJYi0+eXlfYnVmX3BvcyA9IGItPnl5X2NoX2J1ZiA9IGJhc2U7CisJYi0+eXlfaXNfb3VyX2J1ZmZlciA9IDA7CisJYi0+eXlfaW5wdXRfZmlsZSA9IDA7CisJYi0+eXlfbl9jaGFycyA9IGItPnl5X2J1Zl9zaXplOworCWItPnl5X2lzX2ludGVyYWN0aXZlID0gMDsKKwliLT55eV9hdF9ib2wgPSAxOworCWItPnl5X2ZpbGxfYnVmZmVyID0gMDsKKwliLT55eV9idWZmZXJfc3RhdHVzID0gWVlfQlVGRkVSX05FVzsKKworCXl5X3N3aXRjaF90b19idWZmZXIoIGIgKTsKKworCXJldHVybiBiOworCX0KKyNlbmRpZgorCisKKyNpZm5kZWYgWVlfTk9fU0NBTl9TVFJJTkcKKyNpZmRlZiBZWV9VU0VfUFJPVE9TCitZWV9CVUZGRVJfU1RBVEUgeXlfc2Nhbl9zdHJpbmcoIHl5Y29uc3QgY2hhciAqeXlfc3RyICkKKyNlbHNlCitZWV9CVUZGRVJfU1RBVEUgeXlfc2Nhbl9zdHJpbmcoIHl5X3N0ciApCit5eWNvbnN0IGNoYXIgKnl5X3N0cjsKKyNlbmRpZgorCXsKKwlpbnQgbGVuOworCWZvciAoIGxlbiA9IDA7IHl5X3N0cltsZW5dOyArK2xlbiApCisJCTsKKworCXJldHVybiB5eV9zY2FuX2J5dGVzKCB5eV9zdHIsIGxlbiApOworCX0KKyNlbmRpZgorCisKKyNpZm5kZWYgWVlfTk9fU0NBTl9CWVRFUworI2lmZGVmIFlZX1VTRV9QUk9UT1MKK1lZX0JVRkZFUl9TVEFURSB5eV9zY2FuX2J5dGVzKCB5eWNvbnN0IGNoYXIgKmJ5dGVzLCBpbnQgbGVuICkKKyNlbHNlCitZWV9CVUZGRVJfU1RBVEUgeXlfc2Nhbl9ieXRlcyggYnl0ZXMsIGxlbiApCit5eWNvbnN0IGNoYXIgKmJ5dGVzOworaW50IGxlbjsKKyNlbmRpZgorCXsKKwlZWV9CVUZGRVJfU1RBVEUgYjsKKwljaGFyICpidWY7CisJeXlfc2l6ZV90IG47CisJaW50IGk7CisKKwkvKiBHZXQgbWVtb3J5IGZvciBmdWxsIGJ1ZmZlciwgaW5jbHVkaW5nIHNwYWNlIGZvciB0cmFpbGluZyBFT0Incy4gKi8KKwluID0gbGVuICsgMjsKKwlidWYgPSAoY2hhciAqKSB5eV9mbGV4X2FsbG9jKCBuICk7CisJaWYgKCAhIGJ1ZiApCisJCVlZX0ZBVEFMX0VSUk9SKCAib3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHl5X3NjYW5fYnl0ZXMoKSIgKTsKKworCWZvciAoIGkgPSAwOyBpIDwgbGVuOyArK2kgKQorCQlidWZbaV0gPSBieXRlc1tpXTsKKworCWJ1ZltsZW5dID0gYnVmW2xlbisxXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKKworCWIgPSB5eV9zY2FuX2J1ZmZlciggYnVmLCBuICk7CisJaWYgKCAhIGIgKQorCQlZWV9GQVRBTF9FUlJPUiggImJhZCBidWZmZXIgaW4geXlfc2Nhbl9ieXRlcygpIiApOworCisJLyogSXQncyBva2F5IHRvIGdyb3cgZXRjLiB0aGlzIGJ1ZmZlciwgYW5kIHdlIHNob3VsZCB0aHJvdyBpdAorCSAqIGF3YXkgd2hlbiB3ZSdyZSBkb25lLgorCSAqLworCWItPnl5X2lzX291cl9idWZmZXIgPSAxOworCisJcmV0dXJuIGI7CisJfQorI2VuZGlmCisKKworI2lmbmRlZiBZWV9OT19QVVNIX1NUQVRFCisjaWZkZWYgWVlfVVNFX1BST1RPUworc3RhdGljIHZvaWQgeXlfcHVzaF9zdGF0ZSggaW50IG5ld19zdGF0ZSApCisjZWxzZQorc3RhdGljIHZvaWQgeXlfcHVzaF9zdGF0ZSggbmV3X3N0YXRlICkKK2ludCBuZXdfc3RhdGU7CisjZW5kaWYKKwl7CisJaWYgKCB5eV9zdGFydF9zdGFja19wdHIgPj0geXlfc3RhcnRfc3RhY2tfZGVwdGggKQorCQl7CisJCXl5X3NpemVfdCBuZXdfc2l6ZTsKKworCQl5eV9zdGFydF9zdGFja19kZXB0aCArPSBZWV9TVEFSVF9TVEFDS19JTkNSOworCQluZXdfc2l6ZSA9IHl5X3N0YXJ0X3N0YWNrX2RlcHRoICogc2l6ZW9mKCBpbnQgKTsKKworCQlpZiAoICEgeXlfc3RhcnRfc3RhY2sgKQorCQkJeXlfc3RhcnRfc3RhY2sgPSAoaW50ICopIHl5X2ZsZXhfYWxsb2MoIG5ld19zaXplICk7CisKKwkJZWxzZQorCQkJeXlfc3RhcnRfc3RhY2sgPSAoaW50ICopIHl5X2ZsZXhfcmVhbGxvYygKKwkJCQkJKHZvaWQgKikgeXlfc3RhcnRfc3RhY2ssIG5ld19zaXplICk7CisKKwkJaWYgKCAhIHl5X3N0YXJ0X3N0YWNrICkKKwkJCVlZX0ZBVEFMX0VSUk9SKAorCQkJIm91dCBvZiBtZW1vcnkgZXhwYW5kaW5nIHN0YXJ0LWNvbmRpdGlvbiBzdGFjayIgKTsKKwkJfQorCisJeXlfc3RhcnRfc3RhY2tbeXlfc3RhcnRfc3RhY2tfcHRyKytdID0gWVlfU1RBUlQ7CisKKwlCRUdJTihuZXdfc3RhdGUpOworCX0KKyNlbmRpZgorCisKKyNpZm5kZWYgWVlfTk9fUE9QX1NUQVRFCitzdGF0aWMgdm9pZCB5eV9wb3Bfc3RhdGUoKQorCXsKKwlpZiAoIC0teXlfc3RhcnRfc3RhY2tfcHRyIDwgMCApCisJCVlZX0ZBVEFMX0VSUk9SKCAic3RhcnQtY29uZGl0aW9uIHN0YWNrIHVuZGVyZmxvdyIgKTsKKworCUJFR0lOKHl5X3N0YXJ0X3N0YWNrW3l5X3N0YXJ0X3N0YWNrX3B0cl0pOworCX0KKyNlbmRpZgorCisKKyNpZm5kZWYgWVlfTk9fVE9QX1NUQVRFCitzdGF0aWMgaW50IHl5X3RvcF9zdGF0ZSgpCisJeworCXJldHVybiB5eV9zdGFydF9zdGFja1t5eV9zdGFydF9zdGFja19wdHIgLSAxXTsKKwl9CisjZW5kaWYKKworI2lmbmRlZiBZWV9FWElUX0ZBSUxVUkUKKyNkZWZpbmUgWVlfRVhJVF9GQUlMVVJFIDIKKyNlbmRpZgorCisjaWZkZWYgWVlfVVNFX1BST1RPUworc3RhdGljIHZvaWQgeXlfZmF0YWxfZXJyb3IoIHl5Y29uc3QgY2hhciBtc2dbXSApCisjZWxzZQorc3RhdGljIHZvaWQgeXlfZmF0YWxfZXJyb3IoIG1zZyApCitjaGFyIG1zZ1tdOworI2VuZGlmCisJeworCSh2b2lkKSBmcHJpbnRmKCBzdGRlcnIsICIlc1xuIiwgbXNnICk7CisJZXhpdCggWVlfRVhJVF9GQUlMVVJFICk7CisJfQorCisKKworLyogUmVkZWZpbmUgeXlsZXNzKCkgc28gaXQgd29ya3MgaW4gc2VjdGlvbiAzIGNvZGUuICovCisKKyN1bmRlZiB5eWxlc3MKKyNkZWZpbmUgeXlsZXNzKG4pIFwKKwlkbyBcCisJCXsgXAorCQkvKiBVbmRvIGVmZmVjdHMgb2Ygc2V0dGluZyB1cCB5eXRleHQuICovIFwKKwkJeXl0ZXh0W3l5bGVuZ10gPSB5eV9ob2xkX2NoYXI7IFwKKwkJeXlfY19idWZfcCA9IHl5dGV4dCArIG47IFwKKwkJeXlfaG9sZF9jaGFyID0gKnl5X2NfYnVmX3A7IFwKKwkJKnl5X2NfYnVmX3AgPSAnXDAnOyBcCisJCXl5bGVuZyA9IG47IFwKKwkJfSBcCisJd2hpbGUgKCAwICkKKworCisvKiBJbnRlcm5hbCB1dGlsaXR5IHJvdXRpbmVzLiAqLworCisjaWZuZGVmIHl5dGV4dF9wdHIKKyNpZmRlZiBZWV9VU0VfUFJPVE9TCitzdGF0aWMgdm9pZCB5eV9mbGV4X3N0cm5jcHkoIGNoYXIgKnMxLCB5eWNvbnN0IGNoYXIgKnMyLCBpbnQgbiApCisjZWxzZQorc3RhdGljIHZvaWQgeXlfZmxleF9zdHJuY3B5KCBzMSwgczIsIG4gKQorY2hhciAqczE7Cit5eWNvbnN0IGNoYXIgKnMyOworaW50IG47CisjZW5kaWYKKwl7CisJcmVnaXN0ZXIgaW50IGk7CisJZm9yICggaSA9IDA7IGkgPCBuOyArK2kgKQorCQlzMVtpXSA9IHMyW2ldOworCX0KKyNlbmRpZgorCisjaWZkZWYgWVlfTkVFRF9TVFJMRU4KKyNpZmRlZiBZWV9VU0VfUFJPVE9TCitzdGF0aWMgaW50IHl5X2ZsZXhfc3RybGVuKCB5eWNvbnN0IGNoYXIgKnMgKQorI2Vsc2UKK3N0YXRpYyBpbnQgeXlfZmxleF9zdHJsZW4oIHMgKQoreXljb25zdCBjaGFyICpzOworI2VuZGlmCisJeworCXJlZ2lzdGVyIGludCBuOworCWZvciAoIG4gPSAwOyBzW25dOyArK24gKQorCQk7CisKKwlyZXR1cm4gbjsKKwl9CisjZW5kaWYKKworCisjaWZkZWYgWVlfVVNFX1BST1RPUworc3RhdGljIHZvaWQgKnl5X2ZsZXhfYWxsb2MoIHl5X3NpemVfdCBzaXplICkKKyNlbHNlCitzdGF0aWMgdm9pZCAqeXlfZmxleF9hbGxvYyggc2l6ZSApCit5eV9zaXplX3Qgc2l6ZTsKKyNlbmRpZgorCXsKKwlyZXR1cm4gKHZvaWQgKikgbWFsbG9jKCBzaXplICk7CisJfQorCisjaWZkZWYgWVlfVVNFX1BST1RPUworc3RhdGljIHZvaWQgKnl5X2ZsZXhfcmVhbGxvYyggdm9pZCAqcHRyLCB5eV9zaXplX3Qgc2l6ZSApCisjZWxzZQorc3RhdGljIHZvaWQgKnl5X2ZsZXhfcmVhbGxvYyggcHRyLCBzaXplICkKK3ZvaWQgKnB0cjsKK3l5X3NpemVfdCBzaXplOworI2VuZGlmCisJeworCS8qIFRoZSBjYXN0IHRvIChjaGFyICopIGluIHRoZSBmb2xsb3dpbmcgYWNjb21tb2RhdGVzIGJvdGgKKwkgKiBpbXBsZW1lbnRhdGlvbnMgdGhhdCB1c2UgY2hhciogZ2VuZXJpYyBwb2ludGVycywgYW5kIHRob3NlCisJICogdGhhdCB1c2Ugdm9pZCogZ2VuZXJpYyBwb2ludGVycy4gIEl0IHdvcmtzIHdpdGggdGhlIGxhdHRlcgorCSAqIGJlY2F1c2UgYm90aCBBTlNJIEMgYW5kIEMrKyBhbGxvdyBjYXN0bGVzcyBhc3NpZ25tZW50IGZyb20KKwkgKiBhbnkgcG9pbnRlciB0eXBlIHRvIHZvaWQqLCBhbmQgZGVhbCB3aXRoIGFyZ3VtZW50IGNvbnZlcnNpb25zCisJICogYXMgdGhvdWdoIGRvaW5nIGFuIGFzc2lnbm1lbnQuCisJICovCisJcmV0dXJuICh2b2lkICopIHJlYWxsb2MoIChjaGFyICopIHB0ciwgc2l6ZSApOworCX0KKworI2lmZGVmIFlZX1VTRV9QUk9UT1MKK3N0YXRpYyB2b2lkIHl5X2ZsZXhfZnJlZSggdm9pZCAqcHRyICkKKyNlbHNlCitzdGF0aWMgdm9pZCB5eV9mbGV4X2ZyZWUoIHB0ciApCit2b2lkICpwdHI7CisjZW5kaWYKKwl7CisJZnJlZSggcHRyICk7CisJfQorCisjaWYgWVlfTUFJTgoraW50IG1haW4oKQorCXsKKwl5eWxleCgpOworCXJldHVybiAwOworCX0KKyNlbmRpZgorI2xpbmUgOTUgInNjcmlwdHMvZ2Vua3N5bXMvbGV4LmwiCisKKworLyogQnJpbmcgaW4gdGhlIGtleXdvcmQgcmVjb2duaXplci4gICovCisKKyNpbmNsdWRlICJrZXl3b3Jkcy5jIgorCisKKy8qIE1hY3JvcyB0byBhcHBlbmQgdG8gb3VyIHBocmFzZSBjb2xsZWN0aW9uIGxpc3QuICAqLworCisjZGVmaW5lIF9BUFAoVCxMKQlkbyB7CQkJCQkJICAgXAorCQkJICBjdXJfbm9kZSA9IG5leHRfbm9kZTsJCQkJICAgXAorCQkJICBuZXh0X25vZGUgPSB4bWFsbG9jKHNpemVvZigqbmV4dF9ub2RlKSk7CSAgIFwKKwkJCSAgbmV4dF9ub2RlLT5uZXh0ID0gY3VyX25vZGU7CQkJICAgXAorCQkJICBjdXJfbm9kZS0+c3RyaW5nID0gbWVtY3B5KHhtYWxsb2MoTCsxKSwgVCwgTCsxKTsgXAorCQkJICBjdXJfbm9kZS0+dGFnID0gU1lNX05PUk1BTDsJCQkgICBcCisJCQl9IHdoaWxlICgwKQorCisjZGVmaW5lIEFQUAkJX0FQUCh5eXRleHQsIHl5bGVuZykKKworCisvKiBUaGUgc2Vjb25kIHN0YWdlIGxleGVyLiAgSGVyZSB3ZSBpbmNvcnBvcmF0ZSBrbm93bGVkZ2Ugb2YgdGhlIHN0YXRlCisgICBvZiB0aGUgcGFyc2VyIHRvIHRhaWxvciB0aGUgdG9rZW5zIHRoYXQgYXJlIHJldHVybmVkLiAgKi8KKworaW50Cit5eWxleCh2b2lkKQoreworICBzdGF0aWMgZW51bSB7CisgICAgU1RfTk9UU1RBUlRFRCwgU1RfTk9STUFMLCBTVF9BVFRSSUJVVEUsIFNUX0FTTSwgU1RfQlJBQ0tFVCwgU1RfQlJBQ0UsCisgICAgU1RfRVhQUkVTU0lPTiwgU1RfVEFCTEVfMSwgU1RfVEFCTEVfMiwgU1RfVEFCTEVfMywgU1RfVEFCTEVfNCwKKyAgICBTVF9UQUJMRV81LCBTVF9UQUJMRV82CisgIH0gbGV4c3RhdGUgPSBTVF9OT1RTVEFSVEVEOworCisgIHN0YXRpYyBpbnQgc3VwcHJlc3NfdHlwZV9sb29rdXAsIGRvbnRfd2FudF9icmFjZV9waHJhc2U7CisgIHN0YXRpYyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKm5leHRfbm9kZTsKKworICBpbnQgdG9rZW4sIGNvdW50ID0gMDsKKyAgc3RydWN0IHN0cmluZ19saXN0ICpjdXJfbm9kZTsKKworICBpZiAobGV4c3RhdGUgPT0gU1RfTk9UU1RBUlRFRCkKKyAgICB7CisgICAgICBCRUdJTihWMl9UT0tFTlMpOworICAgICAgbmV4dF9ub2RlID0geG1hbGxvYyhzaXplb2YoKm5leHRfbm9kZSkpOworICAgICAgbmV4dF9ub2RlLT5uZXh0ID0gTlVMTDsKKyAgICAgIGxleHN0YXRlID0gU1RfTk9STUFMOworICAgIH0KKworcmVwZWF0OgorICB0b2tlbiA9IHl5bGV4MSgpOworCisgIGlmICh0b2tlbiA9PSAwKQorICAgIHJldHVybiAwOworICBlbHNlIGlmICh0b2tlbiA9PSBGSUxFTkFNRSkKKyAgICB7CisgICAgICBjaGFyICpmaWxlLCAqZTsKKworICAgICAgLyogU2F2ZSB0aGUgZmlsZW5hbWUgYW5kIGxpbmUgbnVtYmVyIGZvciBsYXRlciBlcnJvciBtZXNzYWdlcy4gICovCisKKyAgICAgIGlmIChjdXJfZmlsZW5hbWUpCisJZnJlZShjdXJfZmlsZW5hbWUpOworCisgICAgICBmaWxlID0gc3RyY2hyKHl5dGV4dCwgJ1wiJykrMTsKKyAgICAgIGUgPSBzdHJjaHIoZmlsZSwgJ1wiJyk7CisgICAgICAqZSA9ICdcMCc7CisgICAgICBjdXJfZmlsZW5hbWUgPSBtZW1jcHkoeG1hbGxvYyhlLWZpbGUrMSksIGZpbGUsIGUtZmlsZSsxKTsKKyAgICAgIGN1cl9saW5lID0gYXRvaSh5eXRleHQrMik7CisKKyAgICAgIGdvdG8gcmVwZWF0OworICAgIH0KKworICBzd2l0Y2ggKGxleHN0YXRlKQorICAgIHsKKyAgICBjYXNlIFNUX05PUk1BTDoKKyAgICAgIHN3aXRjaCAodG9rZW4pCisJeworCWNhc2UgSURFTlQ6CisJICBBUFA7CisJICB7CisJICAgIGNvbnN0IHN0cnVjdCByZXN3b3JkICpyID0gaXNfcmVzZXJ2ZWRfd29yZCh5eXRleHQsIHl5bGVuZyk7CisJICAgIGlmIChyKQorCSAgICAgIHsKKwkJc3dpdGNoICh0b2tlbiA9IHItPnRva2VuKQorCQkgIHsKKwkJICBjYXNlIEFUVFJJQlVURV9LRVlXOgorCQkgICAgbGV4c3RhdGUgPSBTVF9BVFRSSUJVVEU7CisJCSAgICBjb3VudCA9IDA7CisJCSAgICBnb3RvIHJlcGVhdDsKKwkJICBjYXNlIEFTTV9LRVlXOgorCQkgICAgbGV4c3RhdGUgPSBTVF9BU007CisJCSAgICBjb3VudCA9IDA7CisJCSAgICBnb3RvIHJlcGVhdDsKKworCQkgIGNhc2UgU1RSVUNUX0tFWVc6CisJCSAgY2FzZSBVTklPTl9LRVlXOgorCQkgICAgZG9udF93YW50X2JyYWNlX3BocmFzZSA9IDM7CisJCSAgY2FzZSBFTlVNX0tFWVc6CisJCSAgICBzdXBwcmVzc190eXBlX2xvb2t1cCA9IDI7CisJCSAgICBnb3RvIGZpbmk7CisKKwkJICBjYXNlIEVYUE9SVF9TWU1CT0xfS0VZVzoKKwkJICAgICAgZ290byBmaW5pOworCQkgIH0KKwkgICAgICB9CisJICAgIGlmICghc3VwcHJlc3NfdHlwZV9sb29rdXApCisJICAgICAgeworCQlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBmaW5kX3N5bWJvbCh5eXRleHQsIFNZTV9UWVBFREVGKTsKKwkJaWYgKHN5bSAmJiBzeW0tPnR5cGUgPT0gU1lNX1RZUEVERUYpCisJCSAgdG9rZW4gPSBUWVBFOworCSAgICAgIH0KKwkgIH0KKwkgIGJyZWFrOworCisJY2FzZSAnWyc6CisJICBBUFA7CisJICBsZXhzdGF0ZSA9IFNUX0JSQUNLRVQ7CisJICBjb3VudCA9IDE7CisJICBnb3RvIHJlcGVhdDsKKworCWNhc2UgJ3snOgorCSAgQVBQOworCSAgaWYgKGRvbnRfd2FudF9icmFjZV9waHJhc2UpCisJICAgIGJyZWFrOworCSAgbGV4c3RhdGUgPSBTVF9CUkFDRTsKKwkgIGNvdW50ID0gMTsKKwkgIGdvdG8gcmVwZWF0OworCisJY2FzZSAnPSc6IGNhc2UgJzonOgorCSAgQVBQOworCSAgbGV4c3RhdGUgPSBTVF9FWFBSRVNTSU9OOworCSAgYnJlYWs7CisKKwljYXNlIERPVFM6CisJZGVmYXVsdDoKKwkgIEFQUDsKKwkgIGJyZWFrOworCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTVF9BVFRSSUJVVEU6CisgICAgICBBUFA7CisgICAgICBzd2l0Y2ggKHRva2VuKQorCXsKKwljYXNlICcoJzoKKwkgICsrY291bnQ7CisJICBnb3RvIHJlcGVhdDsKKwljYXNlICcpJzoKKwkgIGlmICgtLWNvdW50ID09IDApCisJICAgIHsKKwkgICAgICBsZXhzdGF0ZSA9IFNUX05PUk1BTDsKKwkgICAgICB0b2tlbiA9IEFUVFJJQlVURV9QSFJBU0U7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGdvdG8gcmVwZWF0OworCWRlZmF1bHQ6CisJICBnb3RvIHJlcGVhdDsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgU1RfQVNNOgorICAgICAgQVBQOworICAgICAgc3dpdGNoICh0b2tlbikKKwl7CisJY2FzZSAnKCc6CisJICArK2NvdW50OworCSAgZ290byByZXBlYXQ7CisJY2FzZSAnKSc6CisJICBpZiAoLS1jb3VudCA9PSAwKQorCSAgICB7CisJICAgICAgbGV4c3RhdGUgPSBTVF9OT1JNQUw7CisJICAgICAgdG9rZW4gPSBBU01fUEhSQVNFOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBnb3RvIHJlcGVhdDsKKwlkZWZhdWx0OgorCSAgZ290byByZXBlYXQ7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNUX0JSQUNLRVQ6CisgICAgICBBUFA7CisgICAgICBzd2l0Y2ggKHRva2VuKQorCXsKKwljYXNlICdbJzoKKwkgICsrY291bnQ7CisJICBnb3RvIHJlcGVhdDsKKwljYXNlICddJzoKKwkgIGlmICgtLWNvdW50ID09IDApCisJICAgIHsKKwkgICAgICBsZXhzdGF0ZSA9IFNUX05PUk1BTDsKKwkgICAgICB0b2tlbiA9IEJSQUNLRVRfUEhSQVNFOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBnb3RvIHJlcGVhdDsKKwlkZWZhdWx0OgorCSAgZ290byByZXBlYXQ7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNUX0JSQUNFOgorICAgICAgQVBQOworICAgICAgc3dpdGNoICh0b2tlbikKKwl7CisJY2FzZSAneyc6CisJICArK2NvdW50OworCSAgZ290byByZXBlYXQ7CisJY2FzZSAnfSc6CisJICBpZiAoLS1jb3VudCA9PSAwKQorCSAgICB7CisJICAgICAgbGV4c3RhdGUgPSBTVF9OT1JNQUw7CisJICAgICAgdG9rZW4gPSBCUkFDRV9QSFJBU0U7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGdvdG8gcmVwZWF0OworCWRlZmF1bHQ6CisJICBnb3RvIHJlcGVhdDsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgU1RfRVhQUkVTU0lPTjoKKyAgICAgIHN3aXRjaCAodG9rZW4pCisJeworCWNhc2UgJygnOiBjYXNlICdbJzogY2FzZSAneyc6CisJICArK2NvdW50OworCSAgQVBQOworCSAgZ290byByZXBlYXQ7CisJY2FzZSAnKSc6IGNhc2UgJ10nOiBjYXNlICd9JzoKKwkgIC0tY291bnQ7CisJICBBUFA7CisJICBnb3RvIHJlcGVhdDsKKwljYXNlICcsJzogY2FzZSAnOyc6CisJICBpZiAoY291bnQgPT0gMCkKKwkgICAgeworCSAgICAgIC8qIFB1dCBiYWNrIHRoZSB0b2tlbiB3ZSBqdXN0IHJlYWQgc28ncyB3ZSBjYW4gZmluZCBpdCBhZ2FpbgorCQkgYWZ0ZXIgcmVnaXN0ZXJpbmcgdGhlIGV4cHJlc3Npb24uICAqLworCSAgICAgIHVucHV0KHRva2VuKTsKKworCSAgICAgIGxleHN0YXRlID0gU1RfTk9STUFMOworCSAgICAgIHRva2VuID0gRVhQUkVTU0lPTl9QSFJBU0U7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIEFQUDsKKwkgIGdvdG8gcmVwZWF0OworCWRlZmF1bHQ6CisJICBBUFA7CisJICBnb3RvIHJlcGVhdDsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgU1RfVEFCTEVfMToKKyAgICAgIGdvdG8gcmVwZWF0OworCisgICAgY2FzZSBTVF9UQUJMRV8yOgorICAgICAgaWYgKHRva2VuID09IElERU5UICYmIHl5bGVuZyA9PSAxICYmIHl5dGV4dFswXSA9PSAnWCcpCisJeworCSAgdG9rZW4gPSBFWFBPUlRfU1lNQk9MX0tFWVc7CisJICBsZXhzdGF0ZSA9IFNUX1RBQkxFXzU7CisJICBBUFA7CisJICBicmVhazsKKwl9CisgICAgICBsZXhzdGF0ZSA9IFNUX1RBQkxFXzY7CisgICAgICAvKiBGQUxMVEhSVSAqLworCisgICAgY2FzZSBTVF9UQUJMRV82OgorICAgICAgc3dpdGNoICh0b2tlbikKKwl7CisJY2FzZSAneyc6IGNhc2UgJ1snOiBjYXNlICcoJzoKKwkgICsrY291bnQ7CisJICBicmVhazsKKwljYXNlICd9JzogY2FzZSAnXSc6IGNhc2UgJyknOgorCSAgLS1jb3VudDsKKwkgIGJyZWFrOworCWNhc2UgJywnOgorCSAgaWYgKGNvdW50ID09IDApCisJICAgIGxleHN0YXRlID0gU1RfVEFCTEVfMjsKKwkgIGJyZWFrOworCX07CisgICAgICBnb3RvIHJlcGVhdDsKKworICAgIGNhc2UgU1RfVEFCTEVfMzoKKyAgICAgIGdvdG8gcmVwZWF0OworCisgICAgY2FzZSBTVF9UQUJMRV80OgorICAgICAgaWYgKHRva2VuID09ICc7JykKKwlsZXhzdGF0ZSA9IFNUX05PUk1BTDsKKyAgICAgIGdvdG8gcmVwZWF0OworCisgICAgY2FzZSBTVF9UQUJMRV81OgorICAgICAgc3dpdGNoICh0b2tlbikKKwl7CisJY2FzZSAnLCc6CisJICB0b2tlbiA9ICc7JzsKKwkgIGxleHN0YXRlID0gU1RfVEFCTEVfMjsKKwkgIEFQUDsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBBUFA7CisJICBicmVhazsKKwl9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCgpOworICAgIH0KK2Zpbmk6CisKKyAgaWYgKHN1cHByZXNzX3R5cGVfbG9va3VwID4gMCkKKyAgICAtLXN1cHByZXNzX3R5cGVfbG9va3VwOworICBpZiAoZG9udF93YW50X2JyYWNlX3BocmFzZSA+IDApCisgICAgLS1kb250X3dhbnRfYnJhY2VfcGhyYXNlOworCisgIHl5bHZhbCA9ICZuZXh0X25vZGUtPm5leHQ7CisKKyAgcmV0dXJuIHRva2VuOworfQorI2lmbmRlZiBZWVNUWVBFCisjZGVmaW5lIFlZU1RZUEUgaW50CisjZW5kaWYKKyNkZWZpbmUJQVNNX0tFWVcJMjU3CisjZGVmaW5lCUFUVFJJQlVURV9LRVlXCTI1OAorI2RlZmluZQlBVVRPX0tFWVcJMjU5CisjZGVmaW5lCUJPT0xfS0VZVwkyNjAKKyNkZWZpbmUJQ0hBUl9LRVlXCTI2MQorI2RlZmluZQlDT05TVF9LRVlXCTI2MgorI2RlZmluZQlET1VCTEVfS0VZVwkyNjMKKyNkZWZpbmUJRU5VTV9LRVlXCTI2NAorI2RlZmluZQlFWFRFUk5fS0VZVwkyNjUKKyNkZWZpbmUJRkxPQVRfS0VZVwkyNjYKKyNkZWZpbmUJSU5MSU5FX0tFWVcJMjY3CisjZGVmaW5lCUlOVF9LRVlXCTI2OAorI2RlZmluZQlMT05HX0tFWVcJMjY5CisjZGVmaW5lCVJFR0lTVEVSX0tFWVcJMjcwCisjZGVmaW5lCVJFU1RSSUNUX0tFWVcJMjcxCisjZGVmaW5lCVNIT1JUX0tFWVcJMjcyCisjZGVmaW5lCVNJR05FRF9LRVlXCTI3MworI2RlZmluZQlTVEFUSUNfS0VZVwkyNzQKKyNkZWZpbmUJU1RSVUNUX0tFWVcJMjc1CisjZGVmaW5lCVRZUEVERUZfS0VZVwkyNzYKKyNkZWZpbmUJVU5JT05fS0VZVwkyNzcKKyNkZWZpbmUJVU5TSUdORURfS0VZVwkyNzgKKyNkZWZpbmUJVk9JRF9LRVlXCTI3OQorI2RlZmluZQlWT0xBVElMRV9LRVlXCTI4MAorI2RlZmluZQlUWVBFT0ZfS0VZVwkyODEKKyNkZWZpbmUJRVhQT1JUX1NZTUJPTF9LRVlXCTI4MgorI2RlZmluZQlBU01fUEhSQVNFCTI4MworI2RlZmluZQlBVFRSSUJVVEVfUEhSQVNFCTI4NAorI2RlZmluZQlCUkFDRV9QSFJBU0UJMjg1CisjZGVmaW5lCUJSQUNLRVRfUEhSQVNFCTI4NgorI2RlZmluZQlFWFBSRVNTSU9OX1BIUkFTRQkyODcKKyNkZWZpbmUJQ0hBUgkyODgKKyNkZWZpbmUJRE9UUwkyODkKKyNkZWZpbmUJSURFTlQJMjkwCisjZGVmaW5lCUlOVAkyOTEKKyNkZWZpbmUJUkVBTAkyOTIKKyNkZWZpbmUJU1RSSU5HCTI5MworI2RlZmluZQlUWVBFCTI5NAorI2RlZmluZQlPVEhFUgkyOTUKKyNkZWZpbmUJRklMRU5BTUUJMjk2CisKKworZXh0ZXJuIFlZU1RZUEUgeXlsdmFsOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZW5rc3ltcy9sZXgubCBiL3NjcmlwdHMvZ2Vua3N5bXMvbGV4LmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmUwZGZlZQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvZ2Vua3N5bXMvbGV4LmwKQEAgLTAsMCArMSw0MDcgQEAKKy8qIExleGljYWwgYW5hbHlzaXMgZm9yIGdlbmtzeW1zLgorICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcgTGludXggSW50ZXJuYXRpb25hbC4KKworICAgTmV3IGltcGxlbWVudGF0aW9uIGNvbnRyaWJ1dGVkIGJ5IFJpY2hhcmQgSGVuZGVyc29uIDxydGhAdGFtdS5lZHU+CisgICBCYXNlZCBvbiBvcmlnaW5hbCB3b3JrIGJ5IEJqb3JuIEVrd2FsbCA8Ymowcm5AYmxveC5zZT4KKworICAgVGFrZW4gZnJvbSBMaW51eCBtb2R1dGlscyAyLjQuMjIuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworJXsKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKyNpbmNsdWRlICJnZW5rc3ltcy5oIgorI2luY2x1ZGUgInBhcnNlLmgiCisKKy8qIFdlJ3ZlIGdvdCBhIHR3by1sZXZlbCBsZXhlciBoZXJlLiAgV2UgbGV0IGZsZXggZG8gYmFzaWMgdG9rZW5pemF0aW9uCisgICBhbmQgdGhlbiB3ZSBjYXRlZ29yaXplIHRob3NlIGJhc2ljIHRva2VucyBpbiB0aGUgc2Vjb25kIHN0YWdlLiAgKi8KKyNkZWZpbmUgWVlfREVDTAkJc3RhdGljIGludCB5eWxleDEodm9pZCkKKworJX0KKworSURFTlQJCQlbQS1aYS16X1wkXVtBLVphLXowLTlfXCRdKgorCitPX0lOVAkJCTBbMC03XSoKK0RfSU5UCQkJWzEtOV1bMC05XSoKK1hfSU5UCQkJMFtYeF1bMC05QS1GYS1mXSsKK0lfU1VGCQkJW1V1XXxbTGxdfFtVdV1bTGxdfFtMbF1bVXVdCitJTlQJCQkoe09fSU5UfXx7RF9JTlR9fHtYX0lOVH0pe0lfU1VGfT8KKworRlJBQwkJCShbMC05XSpcLlswLTldKyl8KFswLTldK1wuKQorRVhQCQkJW0VlXVsrLV0/WzAtOV0rCitGX1NVRgkJCVtGZkxsXQorUkVBTAkJCSh7RlJBQ317RVhQfT97Rl9TVUZ9Pyl8KFswLTldK3tFWFB9e0ZfU1VGfT8pCisKK1NUUklORwkJCUw/XCIoW15cXFwiXSpcXC4pKlteXFxcIl0qXCIKK0NIQVIJCQlMP1wnKFteXFxcJ10qXFwuKSpbXlxcXCddKlwnCisKK01DX1RPS0VOCQkoW34lXiYqKz18PD4vLV09KXwoJiYpfCgifHwiKXwoLT4pfCg8PCl8KD4+KQorCisvKiBWZXJzaW9uIDIgY2hlY2tzdW1taW5nIGRvZXMgcHJvcGVyIHRva2VuaXphdGlvbjsgdmVyc2lvbiAxIHdhc24ndAorICAgcXVpdGUgc28gcGVkYW50aWMuICAqLworJXMgVjJfVE9LRU5TCisKKy8qIFdlIGRvbid0IGRvIG11bHRpcGxlIGlucHV0IGZpbGVzLiAgKi8KKyVvcHRpb24gbm95eXdyYXAKKworJSUKKworCisgLyogS2VlcCB0cmFjayBvZiBvdXIgbG9jYXRpb24gaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlcy4gICovCiteI1sgXHRdK3tJTlR9WyBcdF0rXCJbXlwiXG5dK1wiLipcbglyZXR1cm4gRklMRU5BTUU7CiteIy4qXG4JCQkJCWN1cl9saW5lKys7CitcbgkJCQkJY3VyX2xpbmUrKzsKKworIC8qIElnbm9yZSBhbGwgb3RoZXIgd2hpdGVzcGFjZS4gICovCitbIFx0XGZcdlxyXSsJCQkJOworCisKK3tTVFJJTkd9CQkJCXJldHVybiBTVFJJTkc7Cit7Q0hBUn0JCQkJCXJldHVybiBDSEFSOwore0lERU5UfQkJCQkJcmV0dXJuIElERU5UOworCisgLyogVGhlIFBlZGFudCByZXF1aXJlcyB0aGF0IHRoZSBvdGhlciBDIG11bHRpLWNoYXJhY3RlciB0b2tlbnMgYmUKKyAgICByZWNvZ25pemVkIGFzIHRva2Vucy4gIFdlIGRvbid0IGFjdHVhbGx5IHVzZSB0aGVtIHNpbmNlIHdlIGRvbid0CisgICAgcGFyc2UgZXhwcmVzc2lvbnMsIGJ1dCB3ZSBkbyB3YW50IHdoaXRlc3BhY2UgdG8gYmUgYXJyYW5nZWQKKyAgICBhcm91bmQgdGhlbSBwcm9wZXJseS4gICovCis8VjJfVE9LRU5TPntNQ19UT0tFTn0JCQlyZXR1cm4gT1RIRVI7Cis8VjJfVE9LRU5TPntJTlR9CQkJcmV0dXJuIElOVDsKKzxWMl9UT0tFTlM+e1JFQUx9CQkJcmV0dXJuIFJFQUw7CisKKyIuLi4iCQkJCQlyZXR1cm4gRE9UUzsKKworIC8qIEFsbCBvdGhlciB0b2tlbnMgYXJlIHNpbmdsZSBjaGFyYWN0ZXJzLiAgKi8KKy4JCQkJCXJldHVybiB5eXRleHRbMF07CisKKworJSUKKworLyogQnJpbmcgaW4gdGhlIGtleXdvcmQgcmVjb2duaXplci4gICovCisKKyNpbmNsdWRlICJrZXl3b3Jkcy5jIgorCisKKy8qIE1hY3JvcyB0byBhcHBlbmQgdG8gb3VyIHBocmFzZSBjb2xsZWN0aW9uIGxpc3QuICAqLworCisjZGVmaW5lIF9BUFAoVCxMKQlkbyB7CQkJCQkJICAgXAorCQkJICBjdXJfbm9kZSA9IG5leHRfbm9kZTsJCQkJICAgXAorCQkJICBuZXh0X25vZGUgPSB4bWFsbG9jKHNpemVvZigqbmV4dF9ub2RlKSk7CSAgIFwKKwkJCSAgbmV4dF9ub2RlLT5uZXh0ID0gY3VyX25vZGU7CQkJICAgXAorCQkJICBjdXJfbm9kZS0+c3RyaW5nID0gbWVtY3B5KHhtYWxsb2MoTCsxKSwgVCwgTCsxKTsgXAorCQkJICBjdXJfbm9kZS0+dGFnID0gU1lNX05PUk1BTDsJCQkgICBcCisJCQl9IHdoaWxlICgwKQorCisjZGVmaW5lIEFQUAkJX0FQUCh5eXRleHQsIHl5bGVuZykKKworCisvKiBUaGUgc2Vjb25kIHN0YWdlIGxleGVyLiAgSGVyZSB3ZSBpbmNvcnBvcmF0ZSBrbm93bGVkZ2Ugb2YgdGhlIHN0YXRlCisgICBvZiB0aGUgcGFyc2VyIHRvIHRhaWxvciB0aGUgdG9rZW5zIHRoYXQgYXJlIHJldHVybmVkLiAgKi8KKworaW50Cit5eWxleCh2b2lkKQoreworICBzdGF0aWMgZW51bSB7CisgICAgU1RfTk9UU1RBUlRFRCwgU1RfTk9STUFMLCBTVF9BVFRSSUJVVEUsIFNUX0FTTSwgU1RfQlJBQ0tFVCwgU1RfQlJBQ0UsCisgICAgU1RfRVhQUkVTU0lPTiwgU1RfVEFCTEVfMSwgU1RfVEFCTEVfMiwgU1RfVEFCTEVfMywgU1RfVEFCTEVfNCwKKyAgICBTVF9UQUJMRV81LCBTVF9UQUJMRV82CisgIH0gbGV4c3RhdGUgPSBTVF9OT1RTVEFSVEVEOworCisgIHN0YXRpYyBpbnQgc3VwcHJlc3NfdHlwZV9sb29rdXAsIGRvbnRfd2FudF9icmFjZV9waHJhc2U7CisgIHN0YXRpYyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKm5leHRfbm9kZTsKKworICBpbnQgdG9rZW4sIGNvdW50ID0gMDsKKyAgc3RydWN0IHN0cmluZ19saXN0ICpjdXJfbm9kZTsKKworICBpZiAobGV4c3RhdGUgPT0gU1RfTk9UU1RBUlRFRCkKKyAgICB7CisgICAgICBCRUdJTihWMl9UT0tFTlMpOworICAgICAgbmV4dF9ub2RlID0geG1hbGxvYyhzaXplb2YoKm5leHRfbm9kZSkpOworICAgICAgbmV4dF9ub2RlLT5uZXh0ID0gTlVMTDsKKyAgICAgIGxleHN0YXRlID0gU1RfTk9STUFMOworICAgIH0KKworcmVwZWF0OgorICB0b2tlbiA9IHl5bGV4MSgpOworCisgIGlmICh0b2tlbiA9PSAwKQorICAgIHJldHVybiAwOworICBlbHNlIGlmICh0b2tlbiA9PSBGSUxFTkFNRSkKKyAgICB7CisgICAgICBjaGFyICpmaWxlLCAqZTsKKworICAgICAgLyogU2F2ZSB0aGUgZmlsZW5hbWUgYW5kIGxpbmUgbnVtYmVyIGZvciBsYXRlciBlcnJvciBtZXNzYWdlcy4gICovCisKKyAgICAgIGlmIChjdXJfZmlsZW5hbWUpCisJZnJlZShjdXJfZmlsZW5hbWUpOworCisgICAgICBmaWxlID0gc3RyY2hyKHl5dGV4dCwgJ1wiJykrMTsKKyAgICAgIGUgPSBzdHJjaHIoZmlsZSwgJ1wiJyk7CisgICAgICAqZSA9ICdcMCc7CisgICAgICBjdXJfZmlsZW5hbWUgPSBtZW1jcHkoeG1hbGxvYyhlLWZpbGUrMSksIGZpbGUsIGUtZmlsZSsxKTsKKyAgICAgIGN1cl9saW5lID0gYXRvaSh5eXRleHQrMik7CisKKyAgICAgIGdvdG8gcmVwZWF0OworICAgIH0KKworICBzd2l0Y2ggKGxleHN0YXRlKQorICAgIHsKKyAgICBjYXNlIFNUX05PUk1BTDoKKyAgICAgIHN3aXRjaCAodG9rZW4pCisJeworCWNhc2UgSURFTlQ6CisJICBBUFA7CisJICB7CisJICAgIGNvbnN0IHN0cnVjdCByZXN3b3JkICpyID0gaXNfcmVzZXJ2ZWRfd29yZCh5eXRleHQsIHl5bGVuZyk7CisJICAgIGlmIChyKQorCSAgICAgIHsKKwkJc3dpdGNoICh0b2tlbiA9IHItPnRva2VuKQorCQkgIHsKKwkJICBjYXNlIEFUVFJJQlVURV9LRVlXOgorCQkgICAgbGV4c3RhdGUgPSBTVF9BVFRSSUJVVEU7CisJCSAgICBjb3VudCA9IDA7CisJCSAgICBnb3RvIHJlcGVhdDsKKwkJICBjYXNlIEFTTV9LRVlXOgorCQkgICAgbGV4c3RhdGUgPSBTVF9BU007CisJCSAgICBjb3VudCA9IDA7CisJCSAgICBnb3RvIHJlcGVhdDsKKworCQkgIGNhc2UgU1RSVUNUX0tFWVc6CisJCSAgY2FzZSBVTklPTl9LRVlXOgorCQkgICAgZG9udF93YW50X2JyYWNlX3BocmFzZSA9IDM7CisJCSAgY2FzZSBFTlVNX0tFWVc6CisJCSAgICBzdXBwcmVzc190eXBlX2xvb2t1cCA9IDI7CisJCSAgICBnb3RvIGZpbmk7CisKKwkJICBjYXNlIEVYUE9SVF9TWU1CT0xfS0VZVzoKKwkJICAgICAgZ290byBmaW5pOworCQkgIH0KKwkgICAgICB9CisJICAgIGlmICghc3VwcHJlc3NfdHlwZV9sb29rdXApCisJICAgICAgeworCQlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBmaW5kX3N5bWJvbCh5eXRleHQsIFNZTV9UWVBFREVGKTsKKwkJaWYgKHN5bSAmJiBzeW0tPnR5cGUgPT0gU1lNX1RZUEVERUYpCisJCSAgdG9rZW4gPSBUWVBFOworCSAgICAgIH0KKwkgIH0KKwkgIGJyZWFrOworCisJY2FzZSAnWyc6CisJICBBUFA7CisJICBsZXhzdGF0ZSA9IFNUX0JSQUNLRVQ7CisJICBjb3VudCA9IDE7CisJICBnb3RvIHJlcGVhdDsKKworCWNhc2UgJ3snOgorCSAgQVBQOworCSAgaWYgKGRvbnRfd2FudF9icmFjZV9waHJhc2UpCisJICAgIGJyZWFrOworCSAgbGV4c3RhdGUgPSBTVF9CUkFDRTsKKwkgIGNvdW50ID0gMTsKKwkgIGdvdG8gcmVwZWF0OworCisJY2FzZSAnPSc6IGNhc2UgJzonOgorCSAgQVBQOworCSAgbGV4c3RhdGUgPSBTVF9FWFBSRVNTSU9OOworCSAgYnJlYWs7CisKKwljYXNlIERPVFM6CisJZGVmYXVsdDoKKwkgIEFQUDsKKwkgIGJyZWFrOworCX0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBTVF9BVFRSSUJVVEU6CisgICAgICBBUFA7CisgICAgICBzd2l0Y2ggKHRva2VuKQorCXsKKwljYXNlICcoJzoKKwkgICsrY291bnQ7CisJICBnb3RvIHJlcGVhdDsKKwljYXNlICcpJzoKKwkgIGlmICgtLWNvdW50ID09IDApCisJICAgIHsKKwkgICAgICBsZXhzdGF0ZSA9IFNUX05PUk1BTDsKKwkgICAgICB0b2tlbiA9IEFUVFJJQlVURV9QSFJBU0U7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGdvdG8gcmVwZWF0OworCWRlZmF1bHQ6CisJICBnb3RvIHJlcGVhdDsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgU1RfQVNNOgorICAgICAgQVBQOworICAgICAgc3dpdGNoICh0b2tlbikKKwl7CisJY2FzZSAnKCc6CisJICArK2NvdW50OworCSAgZ290byByZXBlYXQ7CisJY2FzZSAnKSc6CisJICBpZiAoLS1jb3VudCA9PSAwKQorCSAgICB7CisJICAgICAgbGV4c3RhdGUgPSBTVF9OT1JNQUw7CisJICAgICAgdG9rZW4gPSBBU01fUEhSQVNFOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBnb3RvIHJlcGVhdDsKKwlkZWZhdWx0OgorCSAgZ290byByZXBlYXQ7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNUX0JSQUNLRVQ6CisgICAgICBBUFA7CisgICAgICBzd2l0Y2ggKHRva2VuKQorCXsKKwljYXNlICdbJzoKKwkgICsrY291bnQ7CisJICBnb3RvIHJlcGVhdDsKKwljYXNlICddJzoKKwkgIGlmICgtLWNvdW50ID09IDApCisJICAgIHsKKwkgICAgICBsZXhzdGF0ZSA9IFNUX05PUk1BTDsKKwkgICAgICB0b2tlbiA9IEJSQUNLRVRfUEhSQVNFOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICBnb3RvIHJlcGVhdDsKKwlkZWZhdWx0OgorCSAgZ290byByZXBlYXQ7CisJfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFNUX0JSQUNFOgorICAgICAgQVBQOworICAgICAgc3dpdGNoICh0b2tlbikKKwl7CisJY2FzZSAneyc6CisJICArK2NvdW50OworCSAgZ290byByZXBlYXQ7CisJY2FzZSAnfSc6CisJICBpZiAoLS1jb3VudCA9PSAwKQorCSAgICB7CisJICAgICAgbGV4c3RhdGUgPSBTVF9OT1JNQUw7CisJICAgICAgdG9rZW4gPSBCUkFDRV9QSFJBU0U7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIGdvdG8gcmVwZWF0OworCWRlZmF1bHQ6CisJICBnb3RvIHJlcGVhdDsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgU1RfRVhQUkVTU0lPTjoKKyAgICAgIHN3aXRjaCAodG9rZW4pCisJeworCWNhc2UgJygnOiBjYXNlICdbJzogY2FzZSAneyc6CisJICArK2NvdW50OworCSAgQVBQOworCSAgZ290byByZXBlYXQ7CisJY2FzZSAnKSc6IGNhc2UgJ10nOiBjYXNlICd9JzoKKwkgIC0tY291bnQ7CisJICBBUFA7CisJICBnb3RvIHJlcGVhdDsKKwljYXNlICcsJzogY2FzZSAnOyc6CisJICBpZiAoY291bnQgPT0gMCkKKwkgICAgeworCSAgICAgIC8qIFB1dCBiYWNrIHRoZSB0b2tlbiB3ZSBqdXN0IHJlYWQgc28ncyB3ZSBjYW4gZmluZCBpdCBhZ2FpbgorCQkgYWZ0ZXIgcmVnaXN0ZXJpbmcgdGhlIGV4cHJlc3Npb24uICAqLworCSAgICAgIHVucHV0KHRva2VuKTsKKworCSAgICAgIGxleHN0YXRlID0gU1RfTk9STUFMOworCSAgICAgIHRva2VuID0gRVhQUkVTU0lPTl9QSFJBU0U7CisJICAgICAgYnJlYWs7CisJICAgIH0KKwkgIEFQUDsKKwkgIGdvdG8gcmVwZWF0OworCWRlZmF1bHQ6CisJICBBUFA7CisJICBnb3RvIHJlcGVhdDsKKwl9CisgICAgICBicmVhazsKKworICAgIGNhc2UgU1RfVEFCTEVfMToKKyAgICAgIGdvdG8gcmVwZWF0OworCisgICAgY2FzZSBTVF9UQUJMRV8yOgorICAgICAgaWYgKHRva2VuID09IElERU5UICYmIHl5bGVuZyA9PSAxICYmIHl5dGV4dFswXSA9PSAnWCcpCisJeworCSAgdG9rZW4gPSBFWFBPUlRfU1lNQk9MX0tFWVc7CisJICBsZXhzdGF0ZSA9IFNUX1RBQkxFXzU7CisJICBBUFA7CisJICBicmVhazsKKwl9CisgICAgICBsZXhzdGF0ZSA9IFNUX1RBQkxFXzY7CisgICAgICAvKiBGQUxMVEhSVSAqLworCisgICAgY2FzZSBTVF9UQUJMRV82OgorICAgICAgc3dpdGNoICh0b2tlbikKKwl7CisJY2FzZSAneyc6IGNhc2UgJ1snOiBjYXNlICcoJzoKKwkgICsrY291bnQ7CisJICBicmVhazsKKwljYXNlICd9JzogY2FzZSAnXSc6IGNhc2UgJyknOgorCSAgLS1jb3VudDsKKwkgIGJyZWFrOworCWNhc2UgJywnOgorCSAgaWYgKGNvdW50ID09IDApCisJICAgIGxleHN0YXRlID0gU1RfVEFCTEVfMjsKKwkgIGJyZWFrOworCX07CisgICAgICBnb3RvIHJlcGVhdDsKKworICAgIGNhc2UgU1RfVEFCTEVfMzoKKyAgICAgIGdvdG8gcmVwZWF0OworCisgICAgY2FzZSBTVF9UQUJMRV80OgorICAgICAgaWYgKHRva2VuID09ICc7JykKKwlsZXhzdGF0ZSA9IFNUX05PUk1BTDsKKyAgICAgIGdvdG8gcmVwZWF0OworCisgICAgY2FzZSBTVF9UQUJMRV81OgorICAgICAgc3dpdGNoICh0b2tlbikKKwl7CisJY2FzZSAnLCc6CisJICB0b2tlbiA9ICc7JzsKKwkgIGxleHN0YXRlID0gU1RfVEFCTEVfMjsKKwkgIEFQUDsKKwkgIGJyZWFrOworCWRlZmF1bHQ6CisJICBBUFA7CisJICBicmVhazsKKwl9CisgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICBhYm9ydCgpOworICAgIH0KK2Zpbmk6CisKKyAgaWYgKHN1cHByZXNzX3R5cGVfbG9va3VwID4gMCkKKyAgICAtLXN1cHByZXNzX3R5cGVfbG9va3VwOworICBpZiAoZG9udF93YW50X2JyYWNlX3BocmFzZSA+IDApCisgICAgLS1kb250X3dhbnRfYnJhY2VfcGhyYXNlOworCisgIHl5bHZhbCA9ICZuZXh0X25vZGUtPm5leHQ7CisKKyAgcmV0dXJuIHRva2VuOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS5jX3NoaXBwZWQgYi9zY3JpcHRzL2dlbmtzeW1zL3BhcnNlLmNfc2hpcHBlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzZiMTI4Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS5jX3NoaXBwZWQKQEAgLTAsMCArMSwxNTc3IEBACisKKy8qICBBIEJpc29uIHBhcnNlciwgbWFkZSBmcm9tIHNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueQorICAgIGJ5IEdOVSBCaXNvbiB2ZXJzaW9uIDEuMjggICovCisKKyNkZWZpbmUgWVlCSVNPTiAxICAvKiBJZGVudGlmeSBCaXNvbiBvdXRwdXQuICAqLworCisjZGVmaW5lCUFTTV9LRVlXCTI1NworI2RlZmluZQlBVFRSSUJVVEVfS0VZVwkyNTgKKyNkZWZpbmUJQVVUT19LRVlXCTI1OQorI2RlZmluZQlCT09MX0tFWVcJMjYwCisjZGVmaW5lCUNIQVJfS0VZVwkyNjEKKyNkZWZpbmUJQ09OU1RfS0VZVwkyNjIKKyNkZWZpbmUJRE9VQkxFX0tFWVcJMjYzCisjZGVmaW5lCUVOVU1fS0VZVwkyNjQKKyNkZWZpbmUJRVhURVJOX0tFWVcJMjY1CisjZGVmaW5lCUZMT0FUX0tFWVcJMjY2CisjZGVmaW5lCUlOTElORV9LRVlXCTI2NworI2RlZmluZQlJTlRfS0VZVwkyNjgKKyNkZWZpbmUJTE9OR19LRVlXCTI2OQorI2RlZmluZQlSRUdJU1RFUl9LRVlXCTI3MAorI2RlZmluZQlSRVNUUklDVF9LRVlXCTI3MQorI2RlZmluZQlTSE9SVF9LRVlXCTI3MgorI2RlZmluZQlTSUdORURfS0VZVwkyNzMKKyNkZWZpbmUJU1RBVElDX0tFWVcJMjc0CisjZGVmaW5lCVNUUlVDVF9LRVlXCTI3NQorI2RlZmluZQlUWVBFREVGX0tFWVcJMjc2CisjZGVmaW5lCVVOSU9OX0tFWVcJMjc3CisjZGVmaW5lCVVOU0lHTkVEX0tFWVcJMjc4CisjZGVmaW5lCVZPSURfS0VZVwkyNzkKKyNkZWZpbmUJVk9MQVRJTEVfS0VZVwkyODAKKyNkZWZpbmUJVFlQRU9GX0tFWVcJMjgxCisjZGVmaW5lCUVYUE9SVF9TWU1CT0xfS0VZVwkyODIKKyNkZWZpbmUJQVNNX1BIUkFTRQkyODMKKyNkZWZpbmUJQVRUUklCVVRFX1BIUkFTRQkyODQKKyNkZWZpbmUJQlJBQ0VfUEhSQVNFCTI4NQorI2RlZmluZQlCUkFDS0VUX1BIUkFTRQkyODYKKyNkZWZpbmUJRVhQUkVTU0lPTl9QSFJBU0UJMjg3CisjZGVmaW5lCUNIQVIJMjg4CisjZGVmaW5lCURPVFMJMjg5CisjZGVmaW5lCUlERU5UCTI5MAorI2RlZmluZQlJTlQJMjkxCisjZGVmaW5lCVJFQUwJMjkyCisjZGVmaW5lCVNUUklORwkyOTMKKyNkZWZpbmUJVFlQRQkyOTQKKyNkZWZpbmUJT1RIRVIJMjk1CisjZGVmaW5lCUZJTEVOQU1FCTI5NgorCisjbGluZSAyNCAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgorCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNpbmNsdWRlICJnZW5rc3ltcy5oIgorCitzdGF0aWMgaW50IGlzX3R5cGVkZWY7CitzdGF0aWMgaW50IGlzX2V4dGVybjsKK3N0YXRpYyBjaGFyICpjdXJyZW50X25hbWU7CitzdGF0aWMgc3RydWN0IHN0cmluZ19saXN0ICpkZWNsX3NwZWM7CisKK3N0YXRpYyB2b2lkIHl5ZXJyb3IoY29uc3QgY2hhciAqKTsKKworc3RhdGljIGlubGluZSB2b2lkCityZW1vdmVfbm9kZShzdHJ1Y3Qgc3RyaW5nX2xpc3QgKipwKQoreworICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKm5vZGUgPSAqcDsKKyAgKnAgPSBub2RlLT5uZXh0OworICBmcmVlX25vZGUobm9kZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorcmVtb3ZlX2xpc3Qoc3RydWN0IHN0cmluZ19saXN0ICoqcGIsIHN0cnVjdCBzdHJpbmdfbGlzdCAqKnBlKQoreworICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmIgPSAqcGIsICplID0gKnBlOworICAqcGIgPSBlOworICBmcmVlX2xpc3QoYiwgZSk7Cit9CisKKyNpZm5kZWYgWVlTVFlQRQorI2RlZmluZSBZWVNUWVBFIGludAorI2VuZGlmCisjaWZuZGVmIFlZREVCVUcKKyNkZWZpbmUgWVlERUJVRyAxCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpZm5kZWYgX19jcGx1c3BsdXMKKyNpZm5kZWYgX19TVERDX18KKyNkZWZpbmUgY29uc3QKKyNlbmRpZgorI2VuZGlmCisKKworCisjZGVmaW5lCVlZRklOQUwJCTE3MgorI2RlZmluZQlZWUZMQUcJCS0zMjc2OAorI2RlZmluZQlZWU5UQkFTRQk1MgorCisjZGVmaW5lIFlZVFJBTlNMQVRFKHgpICgodW5zaWduZWQpKHgpIDw9IDI5NiA/IHl5dHJhbnNsYXRlW3hdIDogOTYpCisKK3N0YXRpYyBjb25zdCBjaGFyIHl5dHJhbnNsYXRlW10gPSB7ICAgICAwLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgIDQ2LAorICAgIDQ3LCAgICA0OCwgICAgIDIsICAgIDQ1LCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICA1MSwgICAgNDMsICAgICAyLAorICAgIDQ5LCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgNTAsICAgICAyLCAgICA0NCwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAzLCAgICAgNCwgICAgIDUsICAgICA2LAorICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LAorICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDIzLCAgICAyNCwgICAgMjUsICAgIDI2LAorICAgIDI3LCAgICAyOCwgICAgMjksICAgIDMwLCAgICAzMSwgICAgMzIsICAgIDMzLCAgICAzNCwgICAgMzUsICAgIDM2LAorICAgIDM3LCAgICAzOCwgICAgMzksICAgIDQwLCAgICA0MSwgICAgNDIKK307CisKKyNpZiBZWURFQlVHICE9IDAKK3N0YXRpYyBjb25zdCBzaG9ydCB5eXByaHNbXSA9IHsgICAgIDAsCisgICAgIDAsICAgICAyLCAgICAgNSwgICAgIDYsICAgICA5LCAgICAxMCwgICAgMTQsICAgIDE2LCAgICAxOCwgICAgMjAsCisgICAgMjIsICAgIDI1LCAgICAyOCwgICAgMzIsICAgIDMzLCAgICAzNSwgICAgMzcsICAgIDQxLCAgICA0NiwgICAgNDcsCisgICAgNDksICAgIDUxLCAgICA1NCwgICAgNTYsICAgIDU4LCAgICA2MCwgICAgNjIsICAgIDY0LCAgICA2NiwgICAgNjgsCisgICAgNzAsICAgIDcyLCAgICA3NywgICAgODAsICAgIDgzLCAgICA4NiwgICAgOTAsICAgIDk0LCAgICA5OCwgICAxMDEsCisgICAxMDQsICAgMTA3LCAgIDEwOSwgICAxMTEsICAgMTEzLCAgIDExNSwgICAxMTcsICAgMTE5LCAgIDEyMSwgICAxMjMsCisgICAxMjUsICAgMTI3LCAgIDEyOSwgICAxMzIsICAgMTMzLCAgIDEzNSwgICAxMzcsICAgMTQwLCAgIDE0MiwgICAxNDQsCisgICAxNDYsICAgMTQ4LCAgIDE1MSwgICAxNTMsICAgMTU1LCAgIDE2MCwgICAxNjUsICAgMTY4LCAgIDE3MiwgICAxNzYsCisgICAxNzksICAgMTgxLCAgIDE4MywgICAxODUsICAgMTkwLCAgIDE5NSwgICAxOTgsICAgMjAyLCAgIDIwNiwgICAyMDksCisgICAyMTEsICAgMjE1LCAgIDIxNiwgICAyMTgsICAgMjIwLCAgIDIyNCwgICAyMjcsICAgMjMwLCAgIDIzMiwgICAyMzMsCisgICAyMzUsICAgMjM3LCAgIDI0MiwgICAyNDcsICAgMjUwLCAgIDI1NCwgICAyNTgsICAgMjYyLCAgIDI2MywgICAyNjUsCisgICAyNjgsICAgMjcyLCAgIDI3NiwgICAyNzcsICAgMjc5LCAgIDI4MSwgICAyODQsICAgMjg4LCAgIDI5MSwgICAyOTIsCisgICAyOTQsICAgMjk2LCAgIDMwMCwgICAzMDMsICAgMzA2LCAgIDMwOCwgICAzMTEsICAgMzEyLCAgIDMxNCwgICAzMTcsCisgICAzMTgsICAgMzIwCit9OworCitzdGF0aWMgY29uc3Qgc2hvcnQgeXlyaHNbXSA9IHsgICAgNTMsCisgICAgIDAsICAgIDUyLCAgICA1MywgICAgIDAsICAgICAwLCAgICA1NCwgICAgNTUsICAgICAwLCAgICAgMCwgICAgMjIsCisgICAgNTYsICAgIDU3LCAgICAgMCwgICAgNTcsICAgICAwLCAgICA4MSwgICAgIDAsICAgIDkzLCAgICAgMCwgICAgOTUsCisgICAgIDAsICAgICAxLCAgICA0MywgICAgIDAsICAgICAxLCAgICA0NCwgICAgIDAsICAgIDYxLCAgICA1OCwgICAgNDMsCisgICAgIDAsICAgICAwLCAgICA1OSwgICAgIDAsICAgIDYwLCAgICAgMCwgICAgNTksICAgIDQ1LCAgICA2MCwgICAgIDAsCisgICAgNzEsICAgIDk0LCAgICA5MiwgICAgODIsICAgICAwLCAgICAgMCwgICAgNjIsICAgICAwLCAgICA2MywgICAgIDAsCisgICAgNjIsICAgIDYzLCAgICAgMCwgICAgNjQsICAgICAwLCAgICA2NSwgICAgIDAsICAgICA1LCAgICAgMCwgICAgMTYsCisgICAgIDAsICAgIDIwLCAgICAgMCwgICAgMTEsICAgICAwLCAgICAxMywgICAgIDAsICAgIDY2LCAgICAgMCwgICAgNzAsCisgICAgIDAsICAgIDI3LCAgICA0NiwgICAgNjIsICAgIDQ3LCAgICAgMCwgICAgMjEsICAgIDM2LCAgICAgMCwgICAgMjMsCisgICAgMzYsICAgICAwLCAgICAxMCwgICAgMzYsICAgICAwLCAgICAyMSwgICAgMzYsICAgIDg0LCAgICAgMCwgICAgMjMsCisgICAgMzYsICAgIDg0LCAgICAgMCwgICAgMTAsICAgIDM2LCAgICAzMSwgICAgIDAsICAgIDEwLCAgICAzMSwgICAgIDAsCisgICAgMjEsICAgIDg0LCAgICAgMCwgICAgMjMsICAgIDg0LCAgICAgMCwgICAgIDcsICAgICAwLCAgICAxOCwgICAgIDAsCisgICAgMTQsICAgICAwLCAgICAxNSwgICAgIDAsICAgIDE5LCAgICAgMCwgICAgMjQsICAgICAwLCAgICAxMiwgICAgIDAsCisgICAgIDksICAgICAwLCAgICAyNSwgICAgIDAsICAgICA2LCAgICAgMCwgICAgNDAsICAgICAwLCAgICA0OCwgICAgNjgsCisgICAgIDAsICAgICAwLCAgICA2OSwgICAgIDAsICAgIDcwLCAgICAgMCwgICAgNjksICAgIDcwLCAgICAgMCwgICAgIDgsCisgICAgIDAsICAgIDI2LCAgICAgMCwgICAgMzAsICAgICAwLCAgICAxNywgICAgIDAsICAgIDY3LCAgICA3MSwgICAgIDAsCisgICAgNzIsICAgICAwLCAgICAzNiwgICAgIDAsICAgIDcyLCAgICA0NiwgICAgNzUsICAgIDQ3LCAgICAgMCwgICAgNzIsCisgICAgNDYsICAgICAxLCAgICA0NywgICAgIDAsICAgIDcyLCAgICAzMiwgICAgIDAsICAgIDQ2LCAgICA3MSwgICAgNDcsCisgICAgIDAsICAgIDQ2LCAgICAgMSwgICAgNDcsICAgICAwLCAgICA2NywgICAgNzMsICAgICAwLCAgICA3NCwgICAgIDAsCisgICAgMzYsICAgICAwLCAgICA0MCwgICAgIDAsICAgIDc0LCAgICA0NiwgICAgNzUsICAgIDQ3LCAgICAgMCwgICAgNzQsCisgICAgNDYsICAgICAxLCAgICA0NywgICAgIDAsICAgIDc0LCAgICAzMiwgICAgIDAsICAgIDQ2LCAgICA3MywgICAgNDcsCisgICAgIDAsICAgIDQ2LCAgICAgMSwgICAgNDcsICAgICAwLCAgICA3NiwgICAgMzUsICAgICAwLCAgICA3NiwgICAgIDAsCisgICAgNzcsICAgIDQ1LCAgICAzNSwgICAgIDAsICAgICAwLCAgICA3NywgICAgIDAsICAgIDc4LCAgICAgMCwgICAgNzcsCisgICAgNDUsICAgIDc4LCAgICAgMCwgICAgNjIsICAgIDc5LCAgICAgMCwgICAgNjcsICAgIDc5LCAgICAgMCwgICAgODAsCisgICAgIDAsICAgICAwLCAgICAzNiwgICAgIDAsICAgIDQwLCAgICAgMCwgICAgODAsICAgIDQ2LCAgICA3NSwgICAgNDcsCisgICAgIDAsICAgIDgwLCAgICA0NiwgICAgIDEsICAgIDQ3LCAgICAgMCwgICAgODAsICAgIDMyLCAgICAgMCwgICAgNDYsCisgICAgNzksICAgIDQ3LCAgICAgMCwgICAgNDYsICAgICAxLCAgICA0NywgICAgIDAsICAgIDYxLCAgICA3MSwgICAgMzEsCisgICAgIDAsICAgICAwLCAgICA4MywgICAgIDAsICAgIDQ5LCAgICAzMywgICAgIDAsICAgIDUwLCAgICA4NSwgICAgNDQsCisgICAgIDAsICAgIDUwLCAgICAgMSwgICAgNDQsICAgICAwLCAgICAgMCwgICAgODYsICAgICAwLCAgICA4NywgICAgIDAsCisgICAgODYsICAgIDg3LCAgICAgMCwgICAgNjEsICAgIDg4LCAgICA0MywgICAgIDAsICAgICAxLCAgICA0MywgICAgIDAsCisgICAgIDAsICAgIDg5LCAgICAgMCwgICAgOTAsICAgICAwLCAgICA4OSwgICAgNDUsICAgIDkwLCAgICAgMCwgICAgNzMsCisgICAgOTIsICAgICAwLCAgICAzNiwgICAgOTEsICAgICAwLCAgICA5MSwgICAgIDAsICAgIDUxLCAgICAzMywgICAgIDAsCisgICAgIDAsICAgIDMwLCAgICAgMCwgICAgMjksICAgIDQzLCAgICAgMCwgICAgIDAsICAgIDI5LCAgICAgMCwgICAgMjgsCisgICAgNDYsICAgIDM2LCAgICA0NywgICAgNDMsICAgICAwCit9OworCisjZW5kaWYKKworI2lmIFlZREVCVUcgIT0gMAorc3RhdGljIGNvbnN0IHNob3J0IHl5cmxpbmVbXSA9IHsgMCwKKyAgIDEwMSwgICAxMDMsICAgMTA2LCAgIDEwOSwgICAxMTIsICAgMTE0LCAgIDExNSwgICAxMTYsICAgMTE3LCAgIDExOCwKKyAgIDExOSwgICAxMjAsICAgMTIzLCAgIDEzNywgICAxMzksICAgMTQyLCAgIDE1MSwgICAxNjMsICAgMTY5LCAgIDE3MSwKKyAgIDE3NCwgICAxNzYsICAgMTc5LCAgIDE4NiwgICAxODksICAgMTkxLCAgIDE5MiwgICAxOTMsICAgMTk0LCAgIDE5NywKKyAgIDE5OSwgICAyMDAsICAgMjA0LCAgIDIwNiwgICAyMDgsICAgMjEyLCAgIDIxOSwgICAyMjYsICAgMjM1LCAgIDIzNiwKKyAgIDIzNywgICAyNDAsICAgMjQyLCAgIDI0MywgICAyNDQsICAgMjQ1LCAgIDI0NiwgICAyNDcsICAgMjQ4LCAgIDI0OSwKKyAgIDI1MCwgICAyNTEsICAgMjU0LCAgIDI1OSwgICAyNjEsICAgMjY0LCAgIDI2NiwgICAyNjksICAgMjcwLCAgIDI3MCwKKyAgIDI3MSwgICAyNzgsICAgMjgwLCAgIDI4MywgICAyOTMsICAgMjk1LCAgIDI5NywgICAyOTksICAgMzAxLCAgIDMwNywKKyAgIDMwOSwgICAzMTIsICAgMzE0LCAgIDMxNSwgICAzMTcsICAgMzE5LCAgIDMyMSwgICAzMjMsICAgMzI3LCAgIDMyOSwKKyAgIDMzMCwgICAzMzMsICAgMzM1LCAgIDMzOCwgICAzNDAsICAgMzQ0LCAgIDM0OSwgICAzNTIsICAgMzU1LCAgIDM1NywKKyAgIDM2NSwgICAzNjksICAgMzcxLCAgIDM3MywgICAzNzUsICAgMzc3LCAgIDM4MSwgICAzOTAsICAgMzkyLCAgIDM5NiwKKyAgIDQwMSwgICA0MDMsICAgNDA2LCAgIDQwOCwgICA0MTEsICAgNDEzLCAgIDQxNiwgICA0MTksICAgNDIzLCAgIDQyNSwKKyAgIDQyOCwgICA0MzAsICAgNDMzLCAgIDQzNSwgICA0MzYsICAgNDM5LCAgIDQ0MywgICA0NDUsICAgNDQ4LCAgIDQ1MiwKKyAgIDQ1NCwgICA0NTcKK307CisjZW5kaWYKKworCisjaWYgWVlERUJVRyAhPSAwIHx8IGRlZmluZWQgKFlZRVJST1JfVkVSQk9TRSkKKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB5eXRuYW1lW10gPSB7ICAgIiQiLCJlcnJvciIsIiR1bmRlZmluZWQuIiwiQVNNX0tFWVciLAorIkFUVFJJQlVURV9LRVlXIiwiQVVUT19LRVlXIiwiQk9PTF9LRVlXIiwiQ0hBUl9LRVlXIiwiQ09OU1RfS0VZVyIsIkRPVUJMRV9LRVlXIiwKKyJFTlVNX0tFWVciLCJFWFRFUk5fS0VZVyIsIkZMT0FUX0tFWVciLCJJTkxJTkVfS0VZVyIsIklOVF9LRVlXIiwiTE9OR19LRVlXIiwKKyJSRUdJU1RFUl9LRVlXIiwiUkVTVFJJQ1RfS0VZVyIsIlNIT1JUX0tFWVciLCJTSUdORURfS0VZVyIsIlNUQVRJQ19LRVlXIiwiU1RSVUNUX0tFWVciLAorIlRZUEVERUZfS0VZVyIsIlVOSU9OX0tFWVciLCJVTlNJR05FRF9LRVlXIiwiVk9JRF9LRVlXIiwiVk9MQVRJTEVfS0VZVyIsIlRZUEVPRl9LRVlXIiwKKyJFWFBPUlRfU1lNQk9MX0tFWVciLCJBU01fUEhSQVNFIiwiQVRUUklCVVRFX1BIUkFTRSIsIkJSQUNFX1BIUkFTRSIsIkJSQUNLRVRfUEhSQVNFIiwKKyJFWFBSRVNTSU9OX1BIUkFTRSIsIkNIQVIiLCJET1RTIiwiSURFTlQiLCJJTlQiLCJSRUFMIiwiU1RSSU5HIiwiVFlQRSIsIk9USEVSIiwKKyJGSUxFTkFNRSIsIic7JyIsIid9JyIsIicsJyIsIicoJyIsIicpJyIsIicqJyIsIic9JyIsIid7JyIsIic6JyIsImRlY2xhcmF0aW9uX3NlcSIsCisiZGVjbGFyYXRpb24iLCJAMSIsImRlY2xhcmF0aW9uMSIsIkAyIiwic2ltcGxlX2RlY2xhcmF0aW9uIiwiaW5pdF9kZWNsYXJhdG9yX2xpc3Rfb3B0IiwKKyJpbml0X2RlY2xhcmF0b3JfbGlzdCIsImluaXRfZGVjbGFyYXRvciIsImRlY2xfc3BlY2lmaWVyX3NlcV9vcHQiLCJkZWNsX3NwZWNpZmllcl9zZXEiLAorImRlY2xfc3BlY2lmaWVyIiwic3RvcmFnZV9jbGFzc19zcGVjaWZpZXIiLCJ0eXBlX3NwZWNpZmllciIsInNpbXBsZV90eXBlX3NwZWNpZmllciIsCisicHRyX29wZXJhdG9yIiwiY3Zhcl9xdWFsaWZpZXJfc2VxX29wdCIsImN2YXJfcXVhbGlmaWVyX3NlcSIsImN2YXJfcXVhbGlmaWVyIiwKKyJkZWNsYXJhdG9yIiwiZGlyZWN0X2RlY2xhcmF0b3IiLCJuZXN0ZWRfZGVjbGFyYXRvciIsImRpcmVjdF9uZXN0ZWRfZGVjbGFyYXRvciIsCisicGFyYW1ldGVyX2RlY2xhcmF0aW9uX2NsYXVzZSIsInBhcmFtZXRlcl9kZWNsYXJhdGlvbl9saXN0X29wdCIsInBhcmFtZXRlcl9kZWNsYXJhdGlvbl9saXN0IiwKKyJwYXJhbWV0ZXJfZGVjbGFyYXRpb24iLCJtX2Fic3RyYWN0X2RlY2xhcmF0b3IiLCJkaXJlY3RfbV9hYnN0cmFjdF9kZWNsYXJhdG9yIiwKKyJmdW5jdGlvbl9kZWZpbml0aW9uIiwiaW5pdGlhbGl6ZXJfb3B0IiwiaW5pdGlhbGl6ZXIiLCJjbGFzc19ib2R5IiwibWVtYmVyX3NwZWNpZmljYXRpb25fb3B0IiwKKyJtZW1iZXJfc3BlY2lmaWNhdGlvbiIsIm1lbWJlcl9kZWNsYXJhdGlvbiIsIm1lbWJlcl9kZWNsYXJhdG9yX2xpc3Rfb3B0IiwibWVtYmVyX2RlY2xhcmF0b3JfbGlzdCIsCisibWVtYmVyX2RlY2xhcmF0b3IiLCJtZW1iZXJfYml0ZmllbGRfZGVjbGFyYXRvciIsImF0dHJpYnV0ZV9vcHQiLCJhc21fZGVmaW5pdGlvbiIsCisiYXNtX3BocmFzZV9vcHQiLCJleHBvcnRfZGVmaW5pdGlvbiIsIE5VTEwKK307CisjZW5kaWYKKworc3RhdGljIGNvbnN0IHNob3J0IHl5cjFbXSA9IHsgICAgIDAsCisgICAgNTIsICAgIDUyLCAgICA1NCwgICAgNTMsICAgIDU2LCAgICA1NSwgICAgNTUsICAgIDU1LCAgICA1NSwgICAgNTUsCisgICAgNTUsICAgIDU1LCAgICA1NywgICAgNTgsICAgIDU4LCAgICA1OSwgICAgNTksICAgIDYwLCAgICA2MSwgICAgNjEsCisgICAgNjIsICAgIDYyLCAgICA2MywgICAgNjMsICAgIDY0LCAgICA2NCwgICAgNjQsICAgIDY0LCAgICA2NCwgICAgNjUsCisgICAgNjUsICAgIDY1LCAgICA2NSwgICAgNjUsICAgIDY1LCAgICA2NSwgICAgNjUsICAgIDY1LCAgICA2NSwgICAgNjUsCisgICAgNjUsICAgIDY2LCAgICA2NiwgICAgNjYsICAgIDY2LCAgICA2NiwgICAgNjYsICAgIDY2LCAgICA2NiwgICAgNjYsCisgICAgNjYsICAgIDY2LCAgICA2NywgICAgNjgsICAgIDY4LCAgICA2OSwgICAgNjksICAgIDcwLCAgICA3MCwgICAgNzAsCisgICAgNzAsICAgIDcxLCAgICA3MSwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzIsICAgIDcyLCAgICA3MiwgICAgNzMsCisgICAgNzMsICAgIDc0LCAgICA3NCwgICAgNzQsICAgIDc0LCAgICA3NCwgICAgNzQsICAgIDc0LCAgICA3NSwgICAgNzUsCisgICAgNzUsICAgIDc2LCAgICA3NiwgICAgNzcsICAgIDc3LCAgICA3OCwgICAgNzksICAgIDc5LCAgICA4MCwgICAgODAsCisgICAgODAsICAgIDgwLCAgICA4MCwgICAgODAsICAgIDgwLCAgICA4MCwgICAgODEsICAgIDgyLCAgICA4MiwgICAgODMsCisgICAgODQsICAgIDg0LCAgICA4NSwgICAgODUsICAgIDg2LCAgICA4NiwgICAgODcsICAgIDg3LCAgICA4OCwgICAgODgsCisgICAgODksICAgIDg5LCAgICA5MCwgICAgOTAsICAgIDkwLCAgICA5MSwgICAgOTIsICAgIDkyLCAgICA5MywgICAgOTQsCisgICAgOTQsICAgIDk1Cit9OworCitzdGF0aWMgY29uc3Qgc2hvcnQgeXlyMltdID0geyAgICAgMCwKKyAgICAgMSwgICAgIDIsICAgICAwLCAgICAgMiwgICAgIDAsICAgICAzLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKKyAgICAgMiwgICAgIDIsICAgICAzLCAgICAgMCwgICAgIDEsICAgICAxLCAgICAgMywgICAgIDQsICAgICAwLCAgICAgMSwKKyAgICAgMSwgICAgIDIsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKKyAgICAgMSwgICAgIDQsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAzLCAgICAgMywgICAgIDMsICAgICAyLCAgICAgMiwKKyAgICAgMiwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwKKyAgICAgMSwgICAgIDEsICAgICAyLCAgICAgMCwgICAgIDEsICAgICAxLCAgICAgMiwgICAgIDEsICAgICAxLCAgICAgMSwKKyAgICAgMSwgICAgIDIsICAgICAxLCAgICAgMSwgICAgIDQsICAgICA0LCAgICAgMiwgICAgIDMsICAgICAzLCAgICAgMiwKKyAgICAgMSwgICAgIDEsICAgICAxLCAgICAgNCwgICAgIDQsICAgICAyLCAgICAgMywgICAgIDMsICAgICAyLCAgICAgMSwKKyAgICAgMywgICAgIDAsICAgICAxLCAgICAgMSwgICAgIDMsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAwLCAgICAgMSwKKyAgICAgMSwgICAgIDQsICAgICA0LCAgICAgMiwgICAgIDMsICAgICAzLCAgICAgMywgICAgIDAsICAgICAxLCAgICAgMiwKKyAgICAgMywgICAgIDMsICAgICAwLCAgICAgMSwgICAgIDEsICAgICAyLCAgICAgMywgICAgIDIsICAgICAwLCAgICAgMSwKKyAgICAgMSwgICAgIDMsICAgICAyLCAgICAgMiwgICAgIDEsICAgICAyLCAgICAgMCwgICAgIDEsICAgICAyLCAgICAgMCwKKyAgICAgMSwgICAgIDUKK307CisKK3N0YXRpYyBjb25zdCBzaG9ydCB5eWRlZmFjdFtdID0geyAgICAgMywKKyAgICAgMywgICAgIDEsICAgICAwLCAgICAgMiwgICAgIDAsICAgIDI1LCAgICA1MSwgICAgNDIsICAgIDU4LCAgICA0OSwKKyAgICAgMCwgICAgMjgsICAgIDQ4LCAgICAyOSwgICAgNDQsICAgIDQ1LCAgICAyNiwgICAgNjEsICAgIDQzLCAgICA0NiwKKyAgICAyNywgICAgIDAsICAgICA1LCAgICAgMCwgICAgNDcsICAgIDUwLCAgICA1OSwgICAgIDAsICAgICAwLCAgICAgMCwKKyAgICA2MCwgICAgNTIsICAgICA0LCAgICAgNywgICAgMTQsICAgIDIwLCAgICAyMSwgICAgMjMsICAgIDI0LCAgICAzMCwKKyAgICAzMSwgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAzOSwgICAgMzUsICAgIDMzLCAgICAgMCwKKyAgICA0MCwgICAgMTksICAgIDM0LCAgICA0MSwgICAgIDAsICAgICAwLCAgIDExOSwgICAgNjQsICAgICAwLCAgICA1NCwKKyAgICAgMCwgICAgMTUsICAgIDE2LCAgICAgMCwgICAxMjAsICAgIDYzLCAgICAyMiwgICAgMzgsICAgIDM2LCAgICAgMCwKKyAgIDEwOSwgICAgIDAsICAgICAwLCAgIDEwNSwgICAgIDYsICAgIDE0LCAgICAzNywgICAgIDAsICAgICAwLCAgICAgMCwKKyAgICAgMCwgICAgNTMsICAgIDU1LCAgICA1NiwgICAgMTMsICAgICAwLCAgICA2MiwgICAxMjEsICAgIDk3LCAgIDExNywKKyAgICA2NywgICAgIDAsICAgMTA4LCAgIDEwMiwgICAgNzIsICAgIDczLCAgICAgMCwgICAgIDAsICAgICAwLCAgIDExNywKKyAgICA3MSwgICAgIDAsICAgMTEwLCAgIDExMSwgICAxMTUsICAgMTAxLCAgICAgMCwgICAxMDYsICAgMTIwLCAgICAzMiwKKyAgICAgMCwgICAgNjksICAgIDY4LCAgICA1NywgICAgMTcsICAgMTE4LCAgICA5OCwgICAgIDAsICAgIDg5LCAgICAgMCwKKyAgICA4MCwgICAgODMsICAgIDg0LCAgIDExNCwgICAgIDAsICAgIDcyLCAgICAgMCwgICAxMTYsICAgIDcwLCAgIDExMywKKyAgICA3NiwgICAgIDAsICAgMTA3LCAgICAgMCwgICAxMjIsICAgICAwLCAgICAxOCwgICAgOTksICAgIDY2LCAgICA5MCwKKyAgICA1MiwgICAgIDAsICAgIDg5LCAgICA4NiwgICAgODgsICAgIDY1LCAgICA3OSwgICAgIDAsICAgIDc4LCAgICA3NywKKyAgICAgMCwgICAgIDAsICAgMTEyLCAgIDEwMCwgICAgIDAsICAgIDkxLCAgICAgMCwgICAgODcsICAgIDk0LCAgICAgMCwKKyAgICA4MSwgICAgODUsICAgIDc1LCAgICA3NCwgICAgOTYsICAgIDk1LCAgICAgMCwgICAgIDAsICAgIDkzLCAgICA5MiwKKyAgICAgMCwgICAgIDAKK307CisKK3N0YXRpYyBjb25zdCBzaG9ydCB5eWRlZmdvdG9bXSA9IHsgICAgIDEsCisgICAgIDIsICAgICAzLCAgICAzMywgICAgNTIsICAgIDM0LCAgICA2MSwgICAgNjIsICAgIDYzLCAgICA3MSwgICAgMzYsCisgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDY0LCAgICA4MiwgICAgODMsICAgIDQxLCAgIDEwOSwgICAgNjYsCisgICAxMDAsICAgMTAxLCAgIDEyMCwgICAxMjEsICAgMTIyLCAgIDEyMywgICAxNDQsICAgMTQ1LCAgICA0MiwgICAxMzcsCisgICAxMzgsICAgIDUxLCAgICA3MiwgICAgNzMsICAgIDc0LCAgIDEwMiwgICAxMDMsICAgMTA0LCAgIDEwNSwgICAxMTcsCisgICAgNDMsICAgIDkwLCAgICA0NAorfTsKKworc3RhdGljIGNvbnN0IHNob3J0IHl5cGFjdFtdID0gey0zMjc2OCwKKyAgICAxNSwtMzI3NjgsICAgMTk3LC0zMjc2OCwgICAgMjMsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwKKyAgIC0xOCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwKKy0zMjc2OCwgICAtMjgsLTMyNzY4LCAgIC0yNSwtMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAtMjYsICAgLTIyLCAgIC0xMiwKKy0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAgNDksICAgNDkzLC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwKKy0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwgICAgMjcsICAgIC04LCAgIDEwMSwKKy0zMjc2OCwgICA0OTMsICAgIC04LC0zMjc2OCwgICA0OTMsICAgIDEwLC0zMjc2OCwtMzI3NjgsICAgIDExLCAgICAgOSwKKyAgICAxOCwgICAgMjYsLTMyNzY4LCAgICA0OSwgICAtMTUsICAgLTEzLC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgICAyNSwKKyAgICAyNCwgICAgNDgsICAgMTQ5LC0zMjc2OCwtMzI3NjgsICAgIDQ5LC0zMjc2OCwgICA0MTQsICAgIDM5LCAgICA0MCwKKyAgICA0NywtMzI3NjgsICAgICA5LC0zMjc2OCwtMzI3NjgsICAgIDQ5LC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgICA2NiwKKy0zMjc2OCwgICAyNDEsLTMyNzY4LC0zMjc2OCwgICAgNTAsLTMyNzY4LCAgICAgNSwgICAgNjUsICAgIDQyLCAgICA2NiwKKyAgICAxNywgICAgNTYsICAgIDU1LC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgICA2MCwtMzI3NjgsICAgIDc1LC0zMjc2OCwKKyAgICA4MCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgICA4MSwgICAgODIsICAgMzcwLCAgICA4NSwKKyAgICA5OCwgICAgODksLTMyNzY4LC0zMjc2OCwgICAgODgsLTMyNzY4LCAgICA5MSwtMzI3NjgsLTMyNzY4LC0zMjc2OCwKKy0zMjc2OCwgICAyODQsLTMyNzY4LCAgICAyNCwtMzI3NjgsICAgMTAzLC0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwKKy0zMjc2OCwgICAgIDgsICAgIDQzLC0zMjc2OCwgICAgMzAsLTMyNzY4LC0zMjc2OCwgICA0NTcsLTMyNzY4LC0zMjc2OCwKKyAgICA5MiwgICAgOTMsLTMyNzY4LC0zMjc2OCwgICAgOTUsLTMyNzY4LCAgICA5NiwtMzI3NjgsLTMyNzY4LCAgIDMyNywKKy0zMjc2OCwtMzI3NjgsLTMyNzY4LC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgICA5OSwgICAxMDQsLTMyNzY4LC0zMjc2OCwKKyAgIDE0OCwtMzI3NjgKK307CisKK3N0YXRpYyBjb25zdCBzaG9ydCB5eXBnb3RvW10gPSB7LTMyNzY4LAorICAgMTUyLC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgIDExOSwtMzI3NjgsLTMyNzY4LCAgICA5NCwgICAgIDAsICAgLTU1LAorICAgLTM1LC0zMjc2OCwtMzI3NjgsLTMyNzY4LCAgIC02OSwtMzI3NjgsLTMyNzY4LCAgIC01NiwgICAtMzAsLTMyNzY4LAorICAgLTc2LC0zMjc2OCwgIC0xMjIsLTMyNzY4LC0zMjc2OCwgICAgMjksICAgLTYyLC0zMjc2OCwtMzI3NjgsLTMyNzY4LAorLTMyNzY4LCAgIC0xNywtMzI3NjgsLTMyNzY4LCAgIDEwNSwtMzI3NjgsLTMyNzY4LCAgICA1MiwgICAgODYsICAgIDgzLAorLTMyNzY4LC0zMjc2OCwtMzI3NjgKK307CisKKworI2RlZmluZQlZWUxBU1QJCTUzMworCisKK3N0YXRpYyBjb25zdCBzaG9ydCB5eXRhYmxlW10gPSB7ICAgIDc4LAorICAgIDY3LCAgICA5OSwgICAgMzUsICAgIDg0LCAgICA2NSwgICAxMjUsICAgIDU0LCAgICA0OSwgICAxNTUsICAgMTUyLAorICAgIDUzLCAgICA4MCwgICAgNDcsICAgIDg4LCAgIDE3MSwgICAgODksICAgICA5LCAgICA0OCwgICAgOTEsICAgIDU1LAorICAgMTI3LCAgICA1MCwgICAxMjksICAgIDU2LCAgICA1MCwgICAgMTgsICAgMTE0LCAgICA5OSwgICAgODEsICAgIDk5LAorICAgIDU3LCAgICA2OSwgICAgOTIsICAgIDg3LCAgICAyNywgICAgNzcsICAgMTE5LCAgIDE2OCwgICAgMzEsICAgLTg5LAorICAgMTI2LCAgICA1MCwgICAgNjcsICAgMTQwLCAgICA5NiwgICAgNzksICAgIDU4LCAgIDE1NiwgICAxMzEsICAgMTQzLAorICAgIDk3LCAgICA3NiwgICAgNjAsICAgMTQyLCAgIC04OSwgICAgNjAsICAgIDU5LCAgICA2OCwgICAgNjAsICAgIDk1LAorICAgIDg1LCAgIDE1OSwgICAxMzIsICAgIDk2LCAgICA5OSwgICAgNDUsICAgIDQ2LCAgICA5MywgICAgOTQsICAgIDk3LAorICAgIDg2LCAgICA2MCwgICAxNDMsICAgMTQzLCAgICA5OCwgICAxNjAsICAgMTE5LCAgIDEyNiwgICAxNDAsICAgMTU3LAorICAgMTU4LCAgICA5NiwgICAxNTYsICAgIDY3LCAgICA1OCwgICAxMTEsICAgMTEyLCAgICA5NywgICAxNDIsICAgIDYwLAorICAgIDYwLCAgIDEwNiwgICAxMTksICAgMTEzLCAgICA1OSwgICAxMTYsICAgIDYwLCAgIDEyOCwgICAxMzMsICAgMTM0LAorICAgIDk4LCAgICA3MCwgICAgOTMsICAgIDg4LCAgIDExOSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLAorICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLAorICAgIDIxLCAgICAyMiwgICAxMzUsICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LCAgICAyOCwgICAxMzksICAgMTM2LAorICAgIDMxLCAgIDE0NiwgICAxNDcsICAgMTQ4LCAgIDE0OSwgICAxNTQsICAgLTE5LCAgIDE1MCwgICAxNjMsICAgMTY0LAorICAgIDMyLCAgIDE2NSwgICAxNjYsICAgLTE5LCAgLTEwMywgICAxNjksICAgLTE5LCAgIDE3MiwgICAtMTksICAgMTA3LAorICAgMTcwLCAgIC0xOSwgICAgIDQsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLAorICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLAorICAgIDc1LCAgICAyNCwgICAgMjUsICAgIDI2LCAgICAyNywgICAgMjgsICAgMTYyLCAgIDEwOCwgICAgMzEsICAgMTE1LAorICAgMTI0LCAgICAgMCwgICAxMzAsICAgICAwLCAgIC0xOSwgICAxNTMsICAgICAwLCAgICAgMCwgICAgMzIsICAgICAwLAorICAgICAwLCAgIC0xOSwgIC0xMDQsICAgICAwLCAgIC0xOSwgICAgIDAsICAgLTE5LCAgICAgNSwgICAgIDAsICAgLTE5LAorICAgICAwLCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LAorICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgMjMsICAgIDI0LAorICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDI4LCAgICAyOSwgICAgMzAsICAgIDMxLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAwLCAgICAgMCwgICAtMTksICAgICAwLCAgICAgMCwgICAgIDAsICAgIDMyLCAgICAgMCwgICAgIDAsICAgLTE5LAorICAgICAwLCAgIDExOCwgICAtMTksICAgICAwLCAgIC0xOSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLAorICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLAorICAgIDIxLCAgICAyMiwgICAgIDAsICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LCAgICAyOCwgICAgIDAsICAgICAwLAorICAgIDMxLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAtODIsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgIDMyLCAgICAgMCwgICAgIDAsICAgICAwLCAgIDE1MSwgICAgIDAsICAgICAwLCAgIC04MiwgICAgIDYsICAgICA3LAorICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LAorICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgIDAsICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LAorICAgIDI4LCAgICAgMCwgICAgIDAsICAgIDMxLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAtODIsICAgICAwLAorICAgICAwLCAgICAgMCwgICAgIDAsICAgIDMyLCAgICAgMCwgICAgIDAsICAgICAwLCAgIDE2NywgICAgIDAsICAgICAwLAorICAgLTgyLCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LAorICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgIDAsICAgIDI0LAorICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDI4LCAgICAgMCwgICAgIDAsICAgIDMxLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAwLCAgIC04MiwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDMyLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAwLCAgICAgMCwgICAgIDAsICAgLTgyLCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLAorICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLAorICAgIDIyLCAgICAgMCwgICAgMjQsICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDI4LCAgICAgMCwgICAgIDAsICAgIDMxLAorICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAxNDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgMTQxLAorICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAxNDIsICAgICAwLCAgICA2MCwgICAgIDYsICAgICA3LAorICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LAorICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgIDAsICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LAorICAgIDI4LCAgICAgMCwgICAgIDAsICAgIDMxLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAwLCAgICAgMCwgICAgIDAsICAgIDMyLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgMTEwLCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LAorICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAyMiwgICAgIDAsICAgIDI0LAorICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDI4LCAgICAgMCwgICAgIDAsICAgIDMxLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAwLCAgIDE2MSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDMyLCAgICAgNiwgICAgIDcsICAgICA4LAorICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LAorICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAgMCwgICAgMjQsICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDI4LAorICAgICAwLCAgICAgMCwgICAgMzEsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAorICAgICAwLCAgICAgMCwgICAgMzIKK307CisKK3N0YXRpYyBjb25zdCBzaG9ydCB5eWNoZWNrW10gPSB7ICAgIDU1LAorICAgIDM2LCAgICA3MSwgICAgIDMsICAgIDYwLCAgICAzNSwgICAgIDEsICAgIDI0LCAgICAzNiwgICAgIDEsICAgMTMyLAorICAgIDM2LCAgICAgMSwgICAgMzEsICAgIDI5LCAgICAgMCwgICAgMzEsICAgICA4LCAgICAzNiwgICAgMzIsICAgIDQ2LAorICAgIDk3LCAgICA1MCwgICAgOTksICAgIDQ2LCAgICA1MCwgICAgMTcsICAgIDgzLCAgICA5NywgICAgNTksICAgIDk5LAorICAgIDQzLCAgICA0OSwgICAgNDYsICAgIDY0LCAgICAyNiwgICAgNTMsICAgIDkyLCAgIDE2MCwgICAgMzAsICAgIDMyLAorICAgIDM2LCAgICA1MCwgICAgNzgsICAgIDM2LCAgICA0MCwgICAgMzYsICAgIDM2LCAgICA0MCwgICAgMzIsICAgMTE5LAorICAgIDQ2LCAgICA1MiwgICAgNDgsICAgIDQ2LCAgICA0NywgICAgNDgsICAgIDQ2LCAgICAzMSwgICAgNDgsICAgIDM2LAorICAgIDQzLCAgICAzMiwgICAgNDYsICAgIDQwLCAgIDEzNCwgICAgNDMsICAgIDQ0LCAgICA0MywgICAgNDQsICAgIDQ2LAorICAgIDQ1LCAgICA0OCwgICAxNDIsICAgMTQzLCAgICA1MSwgICAgNDYsICAgMTMyLCAgICAzNiwgICAgMzYsICAgMTQyLAorICAgMTQzLCAgICA0MCwgICAgNDAsICAgMTE5LCAgICAzNiwgICAgNDcsICAgIDQ3LCAgICA0NiwgICAgNDYsICAgIDQ4LAorICAgIDQ4LCAgICA0NCwgICAxNDgsICAgIDQ3LCAgICA0NiwgICAgMzAsICAgIDQ4LCAgICAzMywgICAgNDMsICAgIDQ1LAorICAgIDUxLCAgICAgMSwgICAgNDMsICAgIDI5LCAgIDE2MCwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LAorICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LAorICAgIDIwLCAgICAyMSwgICAgNDMsICAgIDIzLCAgICAyNCwgICAgMjUsICAgIDI2LCAgICAyNywgICAgNDcsICAgIDQ5LAorICAgIDMwLCAgICA0NywgICAgMzUsICAgIDQ1LCAgICA0NywgICAgMzMsICAgIDM2LCAgICA0NywgICAgNDcsICAgIDQ3LAorICAgIDQwLCAgICA0NywgICAgNDcsICAgIDQzLCAgICA0NCwgICAgNDcsICAgIDQ2LCAgICAgMCwgICAgNDgsICAgICAxLAorICAgIDQ3LCAgICA1MSwgICAgIDEsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLAorICAgIDEyLCAgICAxMywgICAgMTQsICAgIDE1LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLAorICAgIDUyLCAgICAyMywgICAgMjQsICAgIDI1LCAgICAyNiwgICAgMjcsICAgMTQ4LCAgICA3MywgICAgMzAsICAgIDg2LAorICAgIDk1LCAgICAtMSwgICAxMDAsICAgIC0xLCAgICAzNiwgICAxMzQsICAgIC0xLCAgICAtMSwgICAgNDAsICAgIC0xLAorICAgIC0xLCAgICA0MywgICAgNDQsICAgIC0xLCAgICA0NiwgICAgLTEsICAgIDQ4LCAgICAgMSwgICAgLTEsICAgIDUxLAorICAgIC0xLCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLAorICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDIzLAorICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LCAgICAyOCwgICAgMjksICAgIDMwLCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgIC0xLCAgICAtMSwgICAgMzYsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDQwLCAgICAtMSwgICAgLTEsICAgIDQzLAorICAgIC0xLCAgICAgMSwgICAgNDYsICAgIC0xLCAgICA0OCwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LAorICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LAorICAgIDIwLCAgICAyMSwgICAgLTEsICAgIDIzLCAgICAyNCwgICAgMjUsICAgIDI2LCAgICAyNywgICAgLTEsICAgIC0xLAorICAgIDMwLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgMzUsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgIDQwLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAgMSwgICAgLTEsICAgIC0xLCAgICA0NywgICAgIDUsICAgICA2LAorICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LAorICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgLTEsICAgIDIzLCAgICAyNCwgICAgMjUsICAgIDI2LAorICAgIDI3LCAgICAtMSwgICAgLTEsICAgIDMwLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgMzUsICAgIC0xLAorICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDQwLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAgMSwgICAgLTEsICAgIC0xLAorICAgIDQ3LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLAorICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgLTEsICAgIDIzLAorICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LCAgICAtMSwgICAgLTEsICAgIDMwLCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgIC0xLCAgICAzNSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDQwLCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDQ3LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLAorICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLAorICAgIDIxLCAgICAtMSwgICAgMjMsICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LCAgICAtMSwgICAgLTEsICAgIDMwLAorICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgMzYsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDQwLAorICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgNDYsICAgIC0xLCAgICA0OCwgICAgIDUsICAgICA2LAorICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLCAgICAxNCwgICAgMTUsICAgIDE2LAorICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgLTEsICAgIDIzLCAgICAyNCwgICAgMjUsICAgIDI2LAorICAgIDI3LCAgICAtMSwgICAgLTEsICAgIDMwLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDQwLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgIDQ3LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTIsICAgIDEzLAorICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgLTEsICAgIDIzLAorICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LCAgICAtMSwgICAgLTEsICAgIDMwLCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgIC0xLCAgICAzNSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIDQwLCAgICAgNSwgICAgIDYsICAgICA3LAorICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LCAgICAxNSwgICAgMTYsICAgIDE3LAorICAgIDE4LCAgICAxOSwgICAgMjAsICAgIDIxLCAgICAtMSwgICAgMjMsICAgIDI0LCAgICAyNSwgICAgMjYsICAgIDI3LAorICAgIC0xLCAgICAtMSwgICAgMzAsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLCAgICAtMSwgICAgLTEsICAgIC0xLAorICAgIC0xLCAgICAtMSwgICAgNDAKK307CisvKiAtKi1DLSotICBOb3RlIHNvbWUgY29tcGlsZXJzIGNob2tlIG9uIGNvbW1lbnRzIG9uIGAjbGluZScgbGluZXMuICAqLworI2xpbmUgMyAiL3Vzci9saWIvYmlzb24uc2ltcGxlIgorLyogVGhpcyBmaWxlIGNvbWVzIGZyb20gYmlzb24tMS4yOC4gICovCisKKy8qIFNrZWxldG9uIG91dHB1dCBwYXJzZXIgZm9yIGJpc29uLAorICAgQ29weXJpZ2h0IChDKSAxOTg0LCAxOTg5LCAxOTkwIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgorCisgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAgIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikKKyAgIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorCisgICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAgIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAgIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLiAgKi8KKworLyogQXMgYSBzcGVjaWFsIGV4Y2VwdGlvbiwgd2hlbiB0aGlzIGZpbGUgaXMgY29waWVkIGJ5IEJpc29uIGludG8gYQorICAgQmlzb24gb3V0cHV0IGZpbGUsIHlvdSBtYXkgdXNlIHRoYXQgb3V0cHV0IGZpbGUgd2l0aG91dCByZXN0cmljdGlvbi4KKyAgIFRoaXMgc3BlY2lhbCBleGNlcHRpb24gd2FzIGFkZGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24KKyAgIGluIHZlcnNpb24gMS4yNCBvZiBCaXNvbi4gICovCisKKy8qIFRoaXMgaXMgdGhlIHBhcnNlciBjb2RlIHRoYXQgaXMgd3JpdHRlbiBpbnRvIGVhY2ggYmlzb24gcGFyc2VyCisgIHdoZW4gdGhlICVzZW1hbnRpY19wYXJzZXIgZGVjbGFyYXRpb24gaXMgbm90IHNwZWNpZmllZCBpbiB0aGUgZ3JhbW1hci4KKyAgSXQgd2FzIHdyaXR0ZW4gYnkgUmljaGFyZCBTdGFsbG1hbiBieSBzaW1wbGlmeWluZyB0aGUgaGFpcnkgcGFyc2VyCisgIHVzZWQgd2hlbiAlc2VtYW50aWNfcGFyc2VyIGlzIHNwZWNpZmllZC4gICovCisKKyNpZm5kZWYgWVlTVEFDS19VU0VfQUxMT0NBCisjaWZkZWYgYWxsb2NhCisjZGVmaW5lIFlZU1RBQ0tfVVNFX0FMTE9DQQorI2Vsc2UgLyogYWxsb2NhIG5vdCBkZWZpbmVkICovCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgWVlTVEFDS19VU0VfQUxMT0NBCisjZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCisjZWxzZSAvKiBub3QgR05VIEMuICAqLworI2lmICghZGVmaW5lZCAoX19TVERDX18pICYmIGRlZmluZWQgKHNwYXJjKSkgfHwgZGVmaW5lZCAoX19zcGFyY19fKSB8fCBkZWZpbmVkIChfX3NwYXJjKSB8fCBkZWZpbmVkIChfX3NnaSkgfHwgKGRlZmluZWQgKF9fc3VuKSAmJiBkZWZpbmVkIChfX2kzODYpKQorI2RlZmluZSBZWVNUQUNLX1VTRV9BTExPQ0EKKyNpbmNsdWRlIDxhbGxvY2EuaD4KKyNlbHNlIC8qIG5vdCBzcGFyYyAqLworLyogV2UgdGhpbmsgdGhpcyB0ZXN0IGRldGVjdHMgV2F0Y29tIGFuZCBNaWNyb3NvZnQgQy4gICovCisvKiBUaGlzIHVzZWQgdG8gdGVzdCBNU0RPUywgYnV0IHRoYXQgaXMgYSBiYWQgaWRlYQorICAgc2luY2UgdGhhdCBzeW1ib2wgaXMgaW4gdGhlIHVzZXIgbmFtZXNwYWNlLiAgKi8KKyNpZiAoZGVmaW5lZCAoX01TRE9TKSB8fCBkZWZpbmVkIChfTVNET1NfKSkgJiYgIWRlZmluZWQgKF9fVFVSQk9DX18pCisjaWYgMCAvKiBObyBuZWVkIGZvciBtYWxsb2MuaCwgd2hpY2ggcG9sbHV0ZXMgdGhlIG5hbWVzcGFjZTsKKwkgaW5zdGVhZCwganVzdCBkb24ndCB1c2UgYWxsb2NhLiAgKi8KKyNpbmNsdWRlIDxtYWxsb2MuaD4KKyNlbmRpZgorI2Vsc2UgLyogbm90IE1TRE9TLCBvciBfX1RVUkJPQ19fICovCisjaWYgZGVmaW5lZChfQUlYKQorLyogSSBkb24ndCBrbm93IHdoYXQgdGhpcyB3YXMgbmVlZGVkIGZvciwgYnV0IGl0IHBvbGx1dGVzIHRoZSBuYW1lc3BhY2UuCisgICBTbyBJIHR1cm5lZCBpdCBvZmYuICAgcm1zLCAyIE1heSAxOTk3LiAgKi8KKy8qICNpbmNsdWRlIDxtYWxsb2MuaD4gICovCisgI3ByYWdtYSBhbGxvY2EKKyNkZWZpbmUgWVlTVEFDS19VU0VfQUxMT0NBCisjZWxzZSAvKiBub3QgTVNET1MsIG9yIF9fVFVSQk9DX18sIG9yIF9BSVggKi8KKyNpZiAwCisjaWZkZWYgX19ocHV4IC8qIGhhaWJsZUBpbG9nLmZyIHNheXMgdGhpcyB3b3JrcyBmb3IgSFBVWCA5LjA1IGFuZCB1cCwKKwkJIGFuZCBvbiBIUFVYIDEwLiAgRXZlbnR1YWxseSB3ZSBjYW4gdHVybiB0aGlzIG9uLiAgKi8KKyNkZWZpbmUgWVlTVEFDS19VU0VfQUxMT0NBCisjZGVmaW5lIGFsbG9jYSBfX2J1aWx0aW5fYWxsb2NhCisjZW5kaWYgLyogX19ocHV4ICovCisjZW5kaWYKKyNlbmRpZiAvKiBub3QgX0FJWCAqLworI2VuZGlmIC8qIG5vdCBNU0RPUywgb3IgX19UVVJCT0NfXyAqLworI2VuZGlmIC8qIG5vdCBzcGFyYyAqLworI2VuZGlmIC8qIG5vdCBHTlUgQyAqLworI2VuZGlmIC8qIGFsbG9jYSBub3QgZGVmaW5lZCAqLworI2VuZGlmIC8qIFlZU1RBQ0tfVVNFX0FMTE9DQSBub3QgZGVmaW5lZCAqLworCisjaWZkZWYgWVlTVEFDS19VU0VfQUxMT0NBCisjZGVmaW5lIFlZU1RBQ0tfQUxMT0MgYWxsb2NhCisjZWxzZQorI2RlZmluZSBZWVNUQUNLX0FMTE9DIG1hbGxvYworI2VuZGlmCisKKy8qIE5vdGU6IHRoZXJlIG11c3QgYmUgb25seSBvbmUgZG9sbGFyIHNpZ24gaW4gdGhpcyBmaWxlLgorICAgSXQgaXMgcmVwbGFjZWQgYnkgdGhlIGxpc3Qgb2YgYWN0aW9ucywgZWFjaCBhY3Rpb24KKyAgIGFzIG9uZSBjYXNlIG9mIHRoZSBzd2l0Y2guICAqLworCisjZGVmaW5lIHl5ZXJyb2sJCSh5eWVycnN0YXR1cyA9IDApCisjZGVmaW5lIHl5Y2xlYXJpbgkoeXljaGFyID0gWVlFTVBUWSkKKyNkZWZpbmUgWVlFTVBUWQkJLTIKKyNkZWZpbmUgWVlFT0YJCTAKKyNkZWZpbmUgWVlBQ0NFUFQJZ290byB5eWFjY2VwdGxhYgorI2RlZmluZSBZWUFCT1JUIAlnb3RvIHl5YWJvcnRsYWIKKyNkZWZpbmUgWVlFUlJPUgkJZ290byB5eWVycmxhYjEKKy8qIExpa2UgWVlFUlJPUiBleGNlcHQgZG8gY2FsbCB5eWVycm9yLgorICAgVGhpcyByZW1haW5zIGhlcmUgdGVtcG9yYXJpbHkgdG8gZWFzZSB0aGUKKyAgIHRyYW5zaXRpb24gdG8gdGhlIG5ldyBtZWFuaW5nIG9mIFlZRVJST1IsIGZvciBHQ0MuCisgICBPbmNlIEdDQyB2ZXJzaW9uIDIgaGFzIHN1cHBsYW50ZWQgdmVyc2lvbiAxLCB0aGlzIGNhbiBnby4gICovCisjZGVmaW5lIFlZRkFJTAkJZ290byB5eWVycmxhYgorI2RlZmluZSBZWVJFQ09WRVJJTkcoKSAgKCEheXllcnJzdGF0dXMpCisjZGVmaW5lIFlZQkFDS1VQKHRva2VuLCB2YWx1ZSkgXAorZG8JCQkJCQkJCVwKKyAgaWYgKHl5Y2hhciA9PSBZWUVNUFRZICYmIHl5bGVuID09IDEpCQkJCVwKKyAgICB7IHl5Y2hhciA9ICh0b2tlbiksIHl5bHZhbCA9ICh2YWx1ZSk7CQkJXAorICAgICAgeXljaGFyMSA9IFlZVFJBTlNMQVRFICh5eWNoYXIpOwkJCQlcCisgICAgICBZWVBPUFNUQUNLOwkJCQkJCVwKKyAgICAgIGdvdG8geXliYWNrdXA7CQkJCQkJXAorICAgIH0JCQkJCQkJCVwKKyAgZWxzZQkJCQkJCQkJXAorICAgIHsgeXllcnJvciAoInN5bnRheCBlcnJvcjogY2Fubm90IGJhY2sgdXAiKTsgWVlFUlJPUjsgfQlcCit3aGlsZSAoMCkKKworI2RlZmluZSBZWVRFUlJPUgkxCisjZGVmaW5lIFlZRVJSQ09ERQkyNTYKKworI2lmbmRlZiBZWVBVUkUKKyNkZWZpbmUgWVlMRVgJCXl5bGV4KCkKKyNlbmRpZgorCisjaWZkZWYgWVlQVVJFCisjaWZkZWYgWVlMU1BfTkVFREVECisjaWZkZWYgWVlMRVhfUEFSQU0KKyNkZWZpbmUgWVlMRVgJCXl5bGV4KCZ5eWx2YWwsICZ5eWxsb2MsIFlZTEVYX1BBUkFNKQorI2Vsc2UKKyNkZWZpbmUgWVlMRVgJCXl5bGV4KCZ5eWx2YWwsICZ5eWxsb2MpCisjZW5kaWYKKyNlbHNlIC8qIG5vdCBZWUxTUF9ORUVERUQgKi8KKyNpZmRlZiBZWUxFWF9QQVJBTQorI2RlZmluZSBZWUxFWAkJeXlsZXgoJnl5bHZhbCwgWVlMRVhfUEFSQU0pCisjZWxzZQorI2RlZmluZSBZWUxFWAkJeXlsZXgoJnl5bHZhbCkKKyNlbmRpZgorI2VuZGlmIC8qIG5vdCBZWUxTUF9ORUVERUQgKi8KKyNlbmRpZgorCisvKiBJZiBub25yZWVudHJhbnQsIGdlbmVyYXRlIHRoZSB2YXJpYWJsZXMgaGVyZSAqLworCisjaWZuZGVmIFlZUFVSRQorCitpbnQJeXljaGFyOwkJCS8qICB0aGUgbG9va2FoZWFkIHN5bWJvbAkJKi8KK1lZU1RZUEUJeXlsdmFsOwkJCS8qICB0aGUgc2VtYW50aWMgdmFsdWUgb2YgdGhlCQkqLworCQkJCS8qICBsb29rYWhlYWQgc3ltYm9sCQkJKi8KKworI2lmZGVmIFlZTFNQX05FRURFRAorWVlMVFlQRSB5eWxsb2M7CQkJLyogIGxvY2F0aW9uIGRhdGEgZm9yIHRoZSBsb29rYWhlYWQJKi8KKwkJCQkvKiAgc3ltYm9sCQkJCSovCisjZW5kaWYKKworaW50IHl5bmVycnM7CQkJLyogIG51bWJlciBvZiBwYXJzZSBlcnJvcnMgc28gZmFyICAgICAgICovCisjZW5kaWYgIC8qIG5vdCBZWVBVUkUgKi8KKworI2lmIFlZREVCVUcgIT0gMAoraW50IHl5ZGVidWc7CQkJLyogIG5vbnplcm8gbWVhbnMgcHJpbnQgcGFyc2UgdHJhY2UJKi8KKy8qIFNpbmNlIHRoaXMgaXMgdW5pbml0aWFsaXplZCwgaXQgZG9lcyBub3Qgc3RvcCBtdWx0aXBsZSBwYXJzZXJzCisgICBmcm9tIGNvZXhpc3RpbmcuICAqLworI2VuZGlmCisKKy8qICBZWUlOSVRERVBUSCBpbmRpY2F0ZXMgdGhlIGluaXRpYWwgc2l6ZSBvZiB0aGUgcGFyc2VyJ3Mgc3RhY2tzCSovCisKKyNpZm5kZWYJWVlJTklUREVQVEgKKyNkZWZpbmUgWVlJTklUREVQVEggMjAwCisjZW5kaWYKKworLyogIFlZTUFYREVQVEggaXMgdGhlIG1heGltdW0gc2l6ZSB0aGUgc3RhY2tzIGNhbiBncm93IHRvCisgICAgKGVmZmVjdGl2ZSBvbmx5IGlmIHRoZSBidWlsdC1pbiBzdGFjayBleHRlbnNpb24gbWV0aG9kIGlzIHVzZWQpLiAgKi8KKworI2lmIFlZTUFYREVQVEggPT0gMAorI3VuZGVmIFlZTUFYREVQVEgKKyNlbmRpZgorCisjaWZuZGVmIFlZTUFYREVQVEgKKyNkZWZpbmUgWVlNQVhERVBUSCAxMDAwMAorI2VuZGlmCisMCisvKiBEZWZpbmUgX195eV9tZW1jcHkuICBOb3RlIHRoYXQgdGhlIHNpemUgYXJndW1lbnQKKyAgIHNob3VsZCBiZSBwYXNzZWQgd2l0aCB0eXBlIHVuc2lnbmVkIGludCwgYmVjYXVzZSB0aGF0IGlzIHdoYXQgdGhlIG5vbi1HQ0MKKyAgIGRlZmluaXRpb25zIHJlcXVpcmUuICBXaXRoIEdDQywgX19idWlsdGluX21lbWNweSB0YWtlcyBhbiBhcmcKKyAgIG9mIHR5cGUgc2l6ZV90LCBidXQgaXQgY2FuIGhhbmRsZSB1bnNpZ25lZCBpbnQuICAqLworCisjaWYgX19HTlVDX18gPiAxCQkvKiBHTlUgQyBhbmQgR05VIEMrKyBkZWZpbmUgdGhpcy4gICovCisjZGVmaW5lIF9feXlfbWVtY3B5KFRPLEZST00sQ09VTlQpCV9fYnVpbHRpbl9tZW1jcHkoVE8sRlJPTSxDT1VOVCkKKyNlbHNlCQkJCS8qIG5vdCBHTlUgQyBvciBDKysgKi8KKyNpZm5kZWYgX19jcGx1c3BsdXMKKworLyogVGhpcyBpcyB0aGUgbW9zdCByZWxpYWJsZSB3YXkgdG8gYXZvaWQgaW5jb21wYXRpYmlsaXRpZXMKKyAgIGluIGF2YWlsYWJsZSBidWlsdC1pbiBmdW5jdGlvbnMgb24gdmFyaW91cyBzeXN0ZW1zLiAgKi8KK3N0YXRpYyB2b2lkCitfX3l5X21lbWNweSAodG8sIGZyb20sIGNvdW50KQorICAgICBjaGFyICp0bzsKKyAgICAgY2hhciAqZnJvbTsKKyAgICAgdW5zaWduZWQgaW50IGNvdW50OworeworICByZWdpc3RlciBjaGFyICpmID0gZnJvbTsKKyAgcmVnaXN0ZXIgY2hhciAqdCA9IHRvOworICByZWdpc3RlciBpbnQgaSA9IGNvdW50OworCisgIHdoaWxlIChpLS0gPiAwKQorICAgICp0KysgPSAqZisrOworfQorCisjZWxzZSAvKiBfX2NwbHVzcGx1cyAqLworCisvKiBUaGlzIGlzIHRoZSBtb3N0IHJlbGlhYmxlIHdheSB0byBhdm9pZCBpbmNvbXBhdGliaWxpdGllcworICAgaW4gYXZhaWxhYmxlIGJ1aWx0LWluIGZ1bmN0aW9ucyBvbiB2YXJpb3VzIHN5c3RlbXMuICAqLworc3RhdGljIHZvaWQKK19feXlfbWVtY3B5IChjaGFyICp0bywgY2hhciAqZnJvbSwgdW5zaWduZWQgaW50IGNvdW50KQoreworICByZWdpc3RlciBjaGFyICp0ID0gdG87CisgIHJlZ2lzdGVyIGNoYXIgKmYgPSBmcm9tOworICByZWdpc3RlciBpbnQgaSA9IGNvdW50OworCisgIHdoaWxlIChpLS0gPiAwKQorICAgICp0KysgPSAqZisrOworfQorCisjZW5kaWYKKyNlbmRpZgorDAorI2xpbmUgMjE3ICIvdXNyL2xpYi9iaXNvbi5zaW1wbGUiCisKKy8qIFRoZSB1c2VyIGNhbiBkZWZpbmUgWVlQQVJTRV9QQVJBTSBhcyB0aGUgbmFtZSBvZiBhbiBhcmd1bWVudCB0byBiZSBwYXNzZWQKKyAgIGludG8geXlwYXJzZS4gIFRoZSBhcmd1bWVudCBzaG91bGQgaGF2ZSB0eXBlIHZvaWQgKi4KKyAgIEl0IHNob3VsZCBhY3R1YWxseSBwb2ludCB0byBhbiBvYmplY3QuCisgICBHcmFtbWFyIGFjdGlvbnMgY2FuIGFjY2VzcyB0aGUgdmFyaWFibGUgYnkgY2FzdGluZyBpdAorICAgdG8gdGhlIHByb3BlciBwb2ludGVyIHR5cGUuICAqLworCisjaWZkZWYgWVlQQVJTRV9QQVJBTQorI2lmZGVmIF9fY3BsdXNwbHVzCisjZGVmaW5lIFlZUEFSU0VfUEFSQU1fQVJHIHZvaWQgKllZUEFSU0VfUEFSQU0KKyNkZWZpbmUgWVlQQVJTRV9QQVJBTV9ERUNMCisjZWxzZSAvKiBub3QgX19jcGx1c3BsdXMgKi8KKyNkZWZpbmUgWVlQQVJTRV9QQVJBTV9BUkcgWVlQQVJTRV9QQVJBTQorI2RlZmluZSBZWVBBUlNFX1BBUkFNX0RFQ0wgdm9pZCAqWVlQQVJTRV9QQVJBTTsKKyNlbmRpZiAvKiBub3QgX19jcGx1c3BsdXMgKi8KKyNlbHNlIC8qIG5vdCBZWVBBUlNFX1BBUkFNICovCisjZGVmaW5lIFlZUEFSU0VfUEFSQU1fQVJHCisjZGVmaW5lIFlZUEFSU0VfUEFSQU1fREVDTAorI2VuZGlmIC8qIG5vdCBZWVBBUlNFX1BBUkFNICovCisKKy8qIFByZXZlbnQgd2FybmluZyBpZiAtV3N0cmljdC1wcm90b3R5cGVzLiAgKi8KKyNpZmRlZiBfX0dOVUNfXworI2lmZGVmIFlZUEFSU0VfUEFSQU0KK2ludCB5eXBhcnNlICh2b2lkICopOworI2Vsc2UKK2ludCB5eXBhcnNlICh2b2lkKTsKKyNlbmRpZgorI2VuZGlmCisKK2ludAoreXlwYXJzZShZWVBBUlNFX1BBUkFNX0FSRykKKyAgICAgWVlQQVJTRV9QQVJBTV9ERUNMCit7CisgIHJlZ2lzdGVyIGludCB5eXN0YXRlOworICByZWdpc3RlciBpbnQgeXluOworICByZWdpc3RlciBzaG9ydCAqeXlzc3A7CisgIHJlZ2lzdGVyIFlZU1RZUEUgKnl5dnNwOworICBpbnQgeXllcnJzdGF0dXM7CS8qICBudW1iZXIgb2YgdG9rZW5zIHRvIHNoaWZ0IGJlZm9yZSBlcnJvciBtZXNzYWdlcyBlbmFibGVkICovCisgIGludCB5eWNoYXIxID0gMDsJCS8qICBsb29rYWhlYWQgdG9rZW4gYXMgYW4gaW50ZXJuYWwgKHRyYW5zbGF0ZWQpIHRva2VuIG51bWJlciAqLworCisgIHNob3J0CXl5c3NhW1lZSU5JVERFUFRIXTsJLyogIHRoZSBzdGF0ZSBzdGFjawkJCSovCisgIFlZU1RZUEUgeXl2c2FbWVlJTklUREVQVEhdOwkvKiAgdGhlIHNlbWFudGljIHZhbHVlIHN0YWNrCQkqLworCisgIHNob3J0ICp5eXNzID0geXlzc2E7CQkvKiAgcmVmZXIgdG8gdGhlIHN0YWNrcyB0aHJ1IHNlcGFyYXRlIHBvaW50ZXJzICovCisgIFlZU1RZUEUgKnl5dnMgPSB5eXZzYTsJLyogIHRvIGFsbG93IHl5b3ZlcmZsb3cgdG8gcmVhbGxvY2F0ZSB0aGVtIGVsc2V3aGVyZSAqLworCisjaWZkZWYgWVlMU1BfTkVFREVECisgIFlZTFRZUEUgeXlsc2FbWVlJTklUREVQVEhdOwkvKiAgdGhlIGxvY2F0aW9uIHN0YWNrCQkJKi8KKyAgWVlMVFlQRSAqeXlscyA9IHl5bHNhOworICBZWUxUWVBFICp5eWxzcDsKKworI2RlZmluZSBZWVBPUFNUQUNLICAgKHl5dnNwLS0sIHl5c3NwLS0sIHl5bHNwLS0pCisjZWxzZQorI2RlZmluZSBZWVBPUFNUQUNLICAgKHl5dnNwLS0sIHl5c3NwLS0pCisjZW5kaWYKKworICBpbnQgeXlzdGFja3NpemUgPSBZWUlOSVRERVBUSDsKKyAgaW50IHl5ZnJlZV9zdGFja3MgPSAwOworCisjaWZkZWYgWVlQVVJFCisgIGludCB5eWNoYXI7CisgIFlZU1RZUEUgeXlsdmFsOworICBpbnQgeXluZXJyczsKKyNpZmRlZiBZWUxTUF9ORUVERUQKKyAgWVlMVFlQRSB5eWxsb2M7CisjZW5kaWYKKyNlbmRpZgorCisgIFlZU1RZUEUgeXl2YWw7CQkvKiAgdGhlIHZhcmlhYmxlIHVzZWQgdG8gcmV0dXJuCQkqLworCQkJCS8qICBzZW1hbnRpYyB2YWx1ZXMgZnJvbSB0aGUgYWN0aW9uCSovCisJCQkJLyogIHJvdXRpbmVzCQkJCSovCisKKyAgaW50IHl5bGVuOworCisjaWYgWVlERUJVRyAhPSAwCisgIGlmICh5eWRlYnVnKQorICAgIGZwcmludGYoc3RkZXJyLCAiU3RhcnRpbmcgcGFyc2VcbiIpOworI2VuZGlmCisKKyAgeXlzdGF0ZSA9IDA7CisgIHl5ZXJyc3RhdHVzID0gMDsKKyAgeXluZXJycyA9IDA7CisgIHl5Y2hhciA9IFlZRU1QVFk7CQkvKiBDYXVzZSBhIHRva2VuIHRvIGJlIHJlYWQuICAqLworCisgIC8qIEluaXRpYWxpemUgc3RhY2sgcG9pbnRlcnMuCisgICAgIFdhc3RlIG9uZSBlbGVtZW50IG9mIHZhbHVlIGFuZCBsb2NhdGlvbiBzdGFjaworICAgICBzbyB0aGF0IHRoZXkgc3RheSBvbiB0aGUgc2FtZSBsZXZlbCBhcyB0aGUgc3RhdGUgc3RhY2suCisgICAgIFRoZSB3YXN0ZWQgZWxlbWVudHMgYXJlIG5ldmVyIGluaXRpYWxpemVkLiAgKi8KKworICB5eXNzcCA9IHl5c3MgLSAxOworICB5eXZzcCA9IHl5dnM7CisjaWZkZWYgWVlMU1BfTkVFREVECisgIHl5bHNwID0geXlsczsKKyNlbmRpZgorCisvKiBQdXNoIGEgbmV3IHN0YXRlLCB3aGljaCBpcyBmb3VuZCBpbiAgeXlzdGF0ZSAgLiAgKi8KKy8qIEluIGFsbCBjYXNlcywgd2hlbiB5b3UgZ2V0IGhlcmUsIHRoZSB2YWx1ZSBhbmQgbG9jYXRpb24gc3RhY2tzCisgICBoYXZlIGp1c3QgYmVlbiBwdXNoZWQuIHNvIHB1c2hpbmcgYSBzdGF0ZSBoZXJlIGV2ZW5zIHRoZSBzdGFja3MuICAqLworeXluZXdzdGF0ZToKKworICAqKyt5eXNzcCA9IHl5c3RhdGU7CisKKyAgaWYgKHl5c3NwID49IHl5c3MgKyB5eXN0YWNrc2l6ZSAtIDEpCisgICAgeworICAgICAgLyogR2l2ZSB1c2VyIGEgY2hhbmNlIHRvIHJlYWxsb2NhdGUgdGhlIHN0YWNrICovCisgICAgICAvKiBVc2UgY29waWVzIG9mIHRoZXNlIHNvIHRoYXQgdGhlICYncyBkb24ndCBmb3JjZSB0aGUgcmVhbCBvbmVzIGludG8gbWVtb3J5LiAqLworICAgICAgWVlTVFlQRSAqeXl2czEgPSB5eXZzOworICAgICAgc2hvcnQgKnl5c3MxID0geXlzczsKKyNpZmRlZiBZWUxTUF9ORUVERUQKKyAgICAgIFlZTFRZUEUgKnl5bHMxID0geXlsczsKKyNlbmRpZgorCisgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgdXNlZCBzaXplIG9mIHRoZSB0aHJlZSBzdGFja3MsIGluIGVsZW1lbnRzLiAgKi8KKyAgICAgIGludCBzaXplID0geXlzc3AgLSB5eXNzICsgMTsKKworI2lmZGVmIHl5b3ZlcmZsb3cKKyAgICAgIC8qIEVhY2ggc3RhY2sgcG9pbnRlciBhZGRyZXNzIGlzIGZvbGxvd2VkIGJ5IHRoZSBzaXplIG9mCisJIHRoZSBkYXRhIGluIHVzZSBpbiB0aGF0IHN0YWNrLCBpbiBieXRlcy4gICovCisjaWZkZWYgWVlMU1BfTkVFREVECisgICAgICAvKiBUaGlzIHVzZWQgdG8gYmUgYSBjb25kaXRpb25hbCBhcm91bmQganVzdCB0aGUgdHdvIGV4dHJhIGFyZ3MsCisJIGJ1dCB0aGF0IG1pZ2h0IGJlIHVuZGVmaW5lZCBpZiB5eW92ZXJmbG93IGlzIGEgbWFjcm8uICAqLworICAgICAgeXlvdmVyZmxvdygicGFyc2VyIHN0YWNrIG92ZXJmbG93IiwKKwkJICZ5eXNzMSwgc2l6ZSAqIHNpemVvZiAoKnl5c3NwKSwKKwkJICZ5eXZzMSwgc2l6ZSAqIHNpemVvZiAoKnl5dnNwKSwKKwkJICZ5eWxzMSwgc2l6ZSAqIHNpemVvZiAoKnl5bHNwKSwKKwkJICZ5eXN0YWNrc2l6ZSk7CisjZWxzZQorICAgICAgeXlvdmVyZmxvdygicGFyc2VyIHN0YWNrIG92ZXJmbG93IiwKKwkJICZ5eXNzMSwgc2l6ZSAqIHNpemVvZiAoKnl5c3NwKSwKKwkJICZ5eXZzMSwgc2l6ZSAqIHNpemVvZiAoKnl5dnNwKSwKKwkJICZ5eXN0YWNrc2l6ZSk7CisjZW5kaWYKKworICAgICAgeXlzcyA9IHl5c3MxOyB5eXZzID0geXl2czE7CisjaWZkZWYgWVlMU1BfTkVFREVECisgICAgICB5eWxzID0geXlsczE7CisjZW5kaWYKKyNlbHNlIC8qIG5vIHl5b3ZlcmZsb3cgKi8KKyAgICAgIC8qIEV4dGVuZCB0aGUgc3RhY2sgb3VyIG93biB3YXkuICAqLworICAgICAgaWYgKHl5c3RhY2tzaXplID49IFlZTUFYREVQVEgpCisJeworCSAgeXllcnJvcigicGFyc2VyIHN0YWNrIG92ZXJmbG93Iik7CisJICBpZiAoeXlmcmVlX3N0YWNrcykKKwkgICAgeworCSAgICAgIGZyZWUgKHl5c3MpOworCSAgICAgIGZyZWUgKHl5dnMpOworI2lmZGVmIFlZTFNQX05FRURFRAorCSAgICAgIGZyZWUgKHl5bHMpOworI2VuZGlmCisJICAgIH0KKwkgIHJldHVybiAyOworCX0KKyAgICAgIHl5c3RhY2tzaXplICo9IDI7CisgICAgICBpZiAoeXlzdGFja3NpemUgPiBZWU1BWERFUFRIKQorCXl5c3RhY2tzaXplID0gWVlNQVhERVBUSDsKKyNpZm5kZWYgWVlTVEFDS19VU0VfQUxMT0NBCisgICAgICB5eWZyZWVfc3RhY2tzID0gMTsKKyNlbmRpZgorICAgICAgeXlzcyA9IChzaG9ydCAqKSBZWVNUQUNLX0FMTE9DICh5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKnl5c3NwKSk7CisgICAgICBfX3l5X21lbWNweSAoKGNoYXIgKil5eXNzLCAoY2hhciAqKXl5c3MxLAorCQkgICBzaXplICogKHVuc2lnbmVkIGludCkgc2l6ZW9mICgqeXlzc3ApKTsKKyAgICAgIHl5dnMgPSAoWVlTVFlQRSAqKSBZWVNUQUNLX0FMTE9DICh5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKnl5dnNwKSk7CisgICAgICBfX3l5X21lbWNweSAoKGNoYXIgKil5eXZzLCAoY2hhciAqKXl5dnMxLAorCQkgICBzaXplICogKHVuc2lnbmVkIGludCkgc2l6ZW9mICgqeXl2c3ApKTsKKyNpZmRlZiBZWUxTUF9ORUVERUQKKyAgICAgIHl5bHMgPSAoWVlMVFlQRSAqKSBZWVNUQUNLX0FMTE9DICh5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKnl5bHNwKSk7CisgICAgICBfX3l5X21lbWNweSAoKGNoYXIgKil5eWxzLCAoY2hhciAqKXl5bHMxLAorCQkgICBzaXplICogKHVuc2lnbmVkIGludCkgc2l6ZW9mICgqeXlsc3ApKTsKKyNlbmRpZgorI2VuZGlmIC8qIG5vIHl5b3ZlcmZsb3cgKi8KKworICAgICAgeXlzc3AgPSB5eXNzICsgc2l6ZSAtIDE7CisgICAgICB5eXZzcCA9IHl5dnMgKyBzaXplIC0gMTsKKyNpZmRlZiBZWUxTUF9ORUVERUQKKyAgICAgIHl5bHNwID0geXlscyArIHNpemUgLSAxOworI2VuZGlmCisKKyNpZiBZWURFQlVHICE9IDAKKyAgICAgIGlmICh5eWRlYnVnKQorCWZwcmludGYoc3RkZXJyLCAiU3RhY2sgc2l6ZSBpbmNyZWFzZWQgdG8gJWRcbiIsIHl5c3RhY2tzaXplKTsKKyNlbmRpZgorCisgICAgICBpZiAoeXlzc3AgPj0geXlzcyArIHl5c3RhY2tzaXplIC0gMSkKKwlZWUFCT1JUOworICAgIH0KKworI2lmIFlZREVCVUcgIT0gMAorICBpZiAoeXlkZWJ1ZykKKyAgICBmcHJpbnRmKHN0ZGVyciwgIkVudGVyaW5nIHN0YXRlICVkXG4iLCB5eXN0YXRlKTsKKyNlbmRpZgorCisgIGdvdG8geXliYWNrdXA7CisgeXliYWNrdXA6CisKKy8qIERvIGFwcHJvcHJpYXRlIHByb2Nlc3NpbmcgZ2l2ZW4gdGhlIGN1cnJlbnQgc3RhdGUuICAqLworLyogUmVhZCBhIGxvb2thaGVhZCB0b2tlbiBpZiB3ZSBuZWVkIG9uZSBhbmQgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCisvKiB5eXJlc3VtZTogKi8KKworICAvKiBGaXJzdCB0cnkgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aG91dCByZWZlcmVuY2UgdG8gbG9va2FoZWFkIHRva2VuLiAgKi8KKworICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07CisgIGlmICh5eW4gPT0gWVlGTEFHKQorICAgIGdvdG8geXlkZWZhdWx0OworCisgIC8qIE5vdCBrbm93biA9PiBnZXQgYSBsb29rYWhlYWQgdG9rZW4gaWYgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCisKKyAgLyogeXljaGFyIGlzIGVpdGhlciBZWUVNUFRZIG9yIFlZRU9GCisgICAgIG9yIGEgdmFsaWQgdG9rZW4gaW4gZXh0ZXJuYWwgZm9ybS4gICovCisKKyAgaWYgKHl5Y2hhciA9PSBZWUVNUFRZKQorICAgIHsKKyNpZiBZWURFQlVHICE9IDAKKyAgICAgIGlmICh5eWRlYnVnKQorCWZwcmludGYoc3RkZXJyLCAiUmVhZGluZyBhIHRva2VuOiAiKTsKKyNlbmRpZgorICAgICAgeXljaGFyID0gWVlMRVg7CisgICAgfQorCisgIC8qIENvbnZlcnQgdG9rZW4gdG8gaW50ZXJuYWwgZm9ybSAoaW4geXljaGFyMSkgZm9yIGluZGV4aW5nIHRhYmxlcyB3aXRoICovCisKKyAgaWYgKHl5Y2hhciA8PSAwKQkJLyogVGhpcyBtZWFucyBlbmQgb2YgaW5wdXQuICovCisgICAgeworICAgICAgeXljaGFyMSA9IDA7CisgICAgICB5eWNoYXIgPSBZWUVPRjsJCS8qIERvbid0IGNhbGwgWVlMRVggYW55IG1vcmUgKi8KKworI2lmIFlZREVCVUcgIT0gMAorICAgICAgaWYgKHl5ZGVidWcpCisJZnByaW50ZihzdGRlcnIsICJOb3cgYXQgZW5kIG9mIGlucHV0LlxuIik7CisjZW5kaWYKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB5eWNoYXIxID0gWVlUUkFOU0xBVEUoeXljaGFyKTsKKworI2lmIFlZREVCVUcgIT0gMAorICAgICAgaWYgKHl5ZGVidWcpCisJeworCSAgZnByaW50ZiAoc3RkZXJyLCAiTmV4dCB0b2tlbiBpcyAlZCAoJXMiLCB5eWNoYXIsIHl5dG5hbWVbeXljaGFyMV0pOworCSAgLyogR2l2ZSB0aGUgaW5kaXZpZHVhbCBwYXJzZXIgYSB3YXkgdG8gcHJpbnQgdGhlIHByZWNpc2UgbWVhbmluZworCSAgICAgb2YgYSB0b2tlbiwgZm9yIGZ1cnRoZXIgZGVidWdnaW5nIGluZm8uICAqLworI2lmZGVmIFlZUFJJTlQKKwkgIFlZUFJJTlQgKHN0ZGVyciwgeXljaGFyLCB5eWx2YWwpOworI2VuZGlmCisJICBmcHJpbnRmIChzdGRlcnIsICIpXG4iKTsKKwl9CisjZW5kaWYKKyAgICB9CisKKyAgeXluICs9IHl5Y2hhcjE7CisgIGlmICh5eW4gPCAwIHx8IHl5biA+IFlZTEFTVCB8fCB5eWNoZWNrW3l5bl0gIT0geXljaGFyMSkKKyAgICBnb3RvIHl5ZGVmYXVsdDsKKworICB5eW4gPSB5eXRhYmxlW3l5bl07CisKKyAgLyogeXluIGlzIHdoYXQgdG8gZG8gZm9yIHRoaXMgdG9rZW4gdHlwZSBpbiB0aGlzIHN0YXRlLgorICAgICBOZWdhdGl2ZSA9PiByZWR1Y2UsIC15eW4gaXMgcnVsZSBudW1iZXIuCisgICAgIFBvc2l0aXZlID0+IHNoaWZ0LCB5eW4gaXMgbmV3IHN0YXRlLgorICAgICAgIE5ldyBzdGF0ZSBpcyBmaW5hbCBzdGF0ZSA9PiBkb24ndCBib3RoZXIgdG8gc2hpZnQsCisgICAgICAganVzdCByZXR1cm4gc3VjY2Vzcy4KKyAgICAgMCwgb3IgbW9zdCBuZWdhdGl2ZSBudW1iZXIgPT4gZXJyb3IuICAqLworCisgIGlmICh5eW4gPCAwKQorICAgIHsKKyAgICAgIGlmICh5eW4gPT0gWVlGTEFHKQorCWdvdG8geXllcnJsYWI7CisgICAgICB5eW4gPSAteXluOworICAgICAgZ290byB5eXJlZHVjZTsKKyAgICB9CisgIGVsc2UgaWYgKHl5biA9PSAwKQorICAgIGdvdG8geXllcnJsYWI7CisKKyAgaWYgKHl5biA9PSBZWUZJTkFMKQorICAgIFlZQUNDRVBUOworCisgIC8qIFNoaWZ0IHRoZSBsb29rYWhlYWQgdG9rZW4uICAqLworCisjaWYgWVlERUJVRyAhPSAwCisgIGlmICh5eWRlYnVnKQorICAgIGZwcmludGYoc3RkZXJyLCAiU2hpZnRpbmcgdG9rZW4gJWQgKCVzKSwgIiwgeXljaGFyLCB5eXRuYW1lW3l5Y2hhcjFdKTsKKyNlbmRpZgorCisgIC8qIERpc2NhcmQgdGhlIHRva2VuIGJlaW5nIHNoaWZ0ZWQgdW5sZXNzIGl0IGlzIGVvZi4gICovCisgIGlmICh5eWNoYXIgIT0gWVlFT0YpCisgICAgeXljaGFyID0gWVlFTVBUWTsKKworICAqKyt5eXZzcCA9IHl5bHZhbDsKKyNpZmRlZiBZWUxTUF9ORUVERUQKKyAgKisreXlsc3AgPSB5eWxsb2M7CisjZW5kaWYKKworICAvKiBjb3VudCB0b2tlbnMgc2hpZnRlZCBzaW5jZSBlcnJvcjsgYWZ0ZXIgdGhyZWUsIHR1cm4gb2ZmIGVycm9yIHN0YXR1cy4gICovCisgIGlmICh5eWVycnN0YXR1cykgeXllcnJzdGF0dXMtLTsKKworICB5eXN0YXRlID0geXluOworICBnb3RvIHl5bmV3c3RhdGU7CisKKy8qIERvIHRoZSBkZWZhdWx0IGFjdGlvbiBmb3IgdGhlIGN1cnJlbnQgc3RhdGUuICAqLworeXlkZWZhdWx0OgorCisgIHl5biA9IHl5ZGVmYWN0W3l5c3RhdGVdOworICBpZiAoeXluID09IDApCisgICAgZ290byB5eWVycmxhYjsKKworLyogRG8gYSByZWR1Y3Rpb24uICB5eW4gaXMgdGhlIG51bWJlciBvZiBhIHJ1bGUgdG8gcmVkdWNlIHdpdGguICAqLworeXlyZWR1Y2U6CisgIHl5bGVuID0geXlyMlt5eW5dOworICBpZiAoeXlsZW4gPiAwKQorICAgIHl5dmFsID0geXl2c3BbMS15eWxlbl07IC8qIGltcGxlbWVudCBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhY3Rpb24gKi8KKworI2lmIFlZREVCVUcgIT0gMAorICBpZiAoeXlkZWJ1ZykKKyAgICB7CisgICAgICBpbnQgaTsKKworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiUmVkdWNpbmcgdmlhIHJ1bGUgJWQgKGxpbmUgJWQpLCAiLAorCSAgICAgICB5eW4sIHl5cmxpbmVbeXluXSk7CisKKyAgICAgIC8qIFByaW50IHRoZSBzeW1ib2xzIGJlaW5nIHJlZHVjZWQsIGFuZCB0aGVpciByZXN1bHQuICAqLworICAgICAgZm9yIChpID0geXlwcmhzW3l5bl07IHl5cmhzW2ldID4gMDsgaSsrKQorCWZwcmludGYgKHN0ZGVyciwgIiVzICIsIHl5dG5hbWVbeXlyaHNbaV1dKTsKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiAtPiAlc1xuIiwgeXl0bmFtZVt5eXIxW3l5bl1dKTsKKyAgICB9CisjZW5kaWYKKworCisgIHN3aXRjaCAoeXluKSB7CisKK2Nhc2UgMzoKKyNsaW5lIDEwNyAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyBpc190eXBlZGVmID0gMDsgaXNfZXh0ZXJuID0gMDsgY3VycmVudF9uYW1lID0gTlVMTDsgZGVjbF9zcGVjID0gTlVMTDsgOworICAgIGJyZWFrO30KK2Nhc2UgNDoKKyNsaW5lIDEwOSAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyBmcmVlX2xpc3QoKnl5dnNwWzBdLCBOVUxMKTsgKnl5dnNwWzBdID0gTlVMTDsgOworICAgIGJyZWFrO30KK2Nhc2UgNToKKyNsaW5lIDExMyAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyBpc190eXBlZGVmID0gMTsgOworICAgIGJyZWFrO30KK2Nhc2UgNjoKKyNsaW5lIDExNCAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyB5eXZhbCA9IHl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSAxMToKKyNsaW5lIDExOSAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyB5eXZhbCA9IHl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSAxMjoKKyNsaW5lIDEyMCAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyB5eXZhbCA9IHl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSAxMzoKKyNsaW5lIDEyNSAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyBpZiAoY3VycmVudF9uYW1lKSB7CisJCSAgICBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmRlY2wgPSAoKnl5dnNwWzBdKS0+bmV4dDsKKwkJICAgICgqeXl2c3BbMF0pLT5uZXh0ID0gTlVMTDsKKwkJICAgIGFkZF9zeW1ib2woY3VycmVudF9uYW1lLAorCQkJICAgICAgIGlzX3R5cGVkZWYgPyBTWU1fVFlQRURFRiA6IFNZTV9OT1JNQUwsCisJCQkgICAgICAgZGVjbCwgaXNfZXh0ZXJuKTsKKwkJICAgIGN1cnJlbnRfbmFtZSA9IE5VTEw7CisJCSAgfQorCQkgIHl5dmFsID0geXl2c3BbMF07CisJCTsKKyAgICBicmVhazt9CitjYXNlIDE0OgorI2xpbmUgMTM4ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHl5dmFsID0gTlVMTDsgOworICAgIGJyZWFrO30KK2Nhc2UgMTY6CisjbGluZSAxNDQgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgc3RydWN0IHN0cmluZ19saXN0ICpkZWNsID0gKnl5dnNwWzBdOworCQkgICp5eXZzcFswXSA9IE5VTEw7CisJCSAgYWRkX3N5bWJvbChjdXJyZW50X25hbWUsCisJCQkgICAgIGlzX3R5cGVkZWYgPyBTWU1fVFlQRURFRiA6IFNZTV9OT1JNQUwsIGRlY2wsIGlzX2V4dGVybik7CisJCSAgY3VycmVudF9uYW1lID0gTlVMTDsKKwkJICB5eXZhbCA9IHl5dnNwWzBdOworCQk7CisgICAgYnJlYWs7fQorY2FzZSAxNzoKKyNsaW5lIDE1MiAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmRlY2wgPSAqeXl2c3BbMF07CisJCSAgKnl5dnNwWzBdID0gTlVMTDsKKwkJICBmcmVlX2xpc3QoKnl5dnNwWy0xXSwgTlVMTCk7CisJCSAgKnl5dnNwWy0xXSA9IGRlY2xfc3BlYzsKKwkJICBhZGRfc3ltYm9sKGN1cnJlbnRfbmFtZSwKKwkJCSAgICAgaXNfdHlwZWRlZiA/IFNZTV9UWVBFREVGIDogU1lNX05PUk1BTCwgZGVjbCwgaXNfZXh0ZXJuKTsKKwkJICBjdXJyZW50X25hbWUgPSBOVUxMOworCQkgIHl5dmFsID0geXl2c3BbMF07CisJCTsKKyAgICBicmVhazt9CitjYXNlIDE4OgorI2xpbmUgMTY1ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHl5dmFsID0geXl2c3BbMF0gPyB5eXZzcFswXSA6IHl5dnNwWy0xXSA/IHl5dnNwWy0xXSA6IHl5dnNwWy0yXSA/IHl5dnNwWy0yXSA6IHl5dnNwWy0zXTsgOworICAgIGJyZWFrO30KK2Nhc2UgMTk6CisjbGluZSAxNzAgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgZGVjbF9zcGVjID0gTlVMTDsgOworICAgIGJyZWFrO30KK2Nhc2UgMjE6CisjbGluZSAxNzUgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgZGVjbF9zcGVjID0gKnl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSAyMjoKKyNsaW5lIDE3NiAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyBkZWNsX3NwZWMgPSAqeXl2c3BbMF07IDsKKyAgICBicmVhazt9CitjYXNlIDIzOgorI2xpbmUgMTgxICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IC8qIFZlcnNpb24gMiBjaGVja3N1bW1pbmcgaWdub3JlcyBzdG9yYWdlIGNsYXNzLCBhcyB0aGF0CisJCSAgICAgaXMgcmVhbGx5IGlycmVsZXZhbnQgdG8gdGhlIGxpbmthZ2UuICAqLworCQkgIHJlbW92ZV9ub2RlKHl5dnNwWzBdKTsKKwkJICB5eXZhbCA9IHl5dnNwWzBdOworCQk7CisgICAgYnJlYWs7fQorY2FzZSAyODoKKyNsaW5lIDE5MyAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyBpc19leHRlcm4gPSAxOyB5eXZhbCA9IHl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSAyOToKKyNsaW5lIDE5NCAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyBpc19leHRlcm4gPSAwOyB5eXZhbCA9IHl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSAzMzoKKyNsaW5lIDIwNSAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyByZW1vdmVfbm9kZSh5eXZzcFstMV0pOyAoKnl5dnNwWzBdKS0+dGFnID0gU1lNX1NUUlVDVDsgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgMzQ6CisjbGluZSAyMDcgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgcmVtb3ZlX25vZGUoeXl2c3BbLTFdKTsgKCp5eXZzcFswXSktPnRhZyA9IFNZTV9VTklPTjsgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgMzU6CisjbGluZSAyMDkgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgcmVtb3ZlX25vZGUoeXl2c3BbLTFdKTsgKCp5eXZzcFswXSktPnRhZyA9IFNZTV9FTlVNOyB5eXZhbCA9IHl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSAzNjoKKyNsaW5lIDIxMyAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKnMgPSAqeXl2c3BbMF0sICppID0gKnl5dnNwWy0xXSwgKnI7CisJCSAgciA9IGNvcHlfbm9kZShpKTsgci0+dGFnID0gU1lNX1NUUlVDVDsKKwkJICByLT5uZXh0ID0gKCp5eXZzcFstMl0pLT5uZXh0OyAqeXl2c3BbMF0gPSByOyAoKnl5dnNwWy0yXSktPm5leHQgPSBOVUxMOworCQkgIGFkZF9zeW1ib2woaS0+c3RyaW5nLCBTWU1fU1RSVUNULCBzLCBpc19leHRlcm4pOworCQkgIHl5dmFsID0geXl2c3BbMF07CisJCTsKKyAgICBicmVhazt9CitjYXNlIDM3OgorI2xpbmUgMjIwICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHN0cnVjdCBzdHJpbmdfbGlzdCAqcyA9ICp5eXZzcFswXSwgKmkgPSAqeXl2c3BbLTFdLCAqcjsKKwkJICByID0gY29weV9ub2RlKGkpOyByLT50YWcgPSBTWU1fVU5JT047CisJCSAgci0+bmV4dCA9ICgqeXl2c3BbLTJdKS0+bmV4dDsgKnl5dnNwWzBdID0gcjsgKCp5eXZzcFstMl0pLT5uZXh0ID0gTlVMTDsKKwkJICBhZGRfc3ltYm9sKGktPnN0cmluZywgU1lNX1VOSU9OLCBzLCBpc19leHRlcm4pOworCQkgIHl5dmFsID0geXl2c3BbMF07CisJCTsKKyAgICBicmVhazt9CitjYXNlIDM4OgorI2xpbmUgMjI3ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHN0cnVjdCBzdHJpbmdfbGlzdCAqcyA9ICp5eXZzcFswXSwgKmkgPSAqeXl2c3BbLTFdLCAqcjsKKwkJICByID0gY29weV9ub2RlKGkpOyByLT50YWcgPSBTWU1fRU5VTTsKKwkJICByLT5uZXh0ID0gKCp5eXZzcFstMl0pLT5uZXh0OyAqeXl2c3BbMF0gPSByOyAoKnl5dnNwWy0yXSktPm5leHQgPSBOVUxMOworCQkgIGFkZF9zeW1ib2woaS0+c3RyaW5nLCBTWU1fRU5VTSwgcywgaXNfZXh0ZXJuKTsKKwkJICB5eXZhbCA9IHl5dnNwWzBdOworCQk7CisgICAgYnJlYWs7fQorY2FzZSAzOToKKyNsaW5lIDIzNSAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyB5eXZhbCA9IHl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSA0MDoKKyNsaW5lIDIzNiAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyB5eXZhbCA9IHl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSA0MToKKyNsaW5lIDIzNyAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyB5eXZhbCA9IHl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSA1MjoKKyNsaW5lIDI1MSAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyAoKnl5dnNwWzBdKS0+dGFnID0gU1lNX1RZUEVERUY7IHl5dmFsID0geXl2c3BbMF07IDsKKyAgICBicmVhazt9CitjYXNlIDUzOgorI2xpbmUgMjU2ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHl5dmFsID0geXl2c3BbMF0gPyB5eXZzcFswXSA6IHl5dnNwWy0xXTsgOworICAgIGJyZWFrO30KK2Nhc2UgNTQ6CisjbGluZSAyNjAgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSBOVUxMOyA7CisgICAgYnJlYWs7fQorY2FzZSA1NzoKKyNsaW5lIDI2NiAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyB5eXZhbCA9IHl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSA2MToKKyNsaW5lIDI3MiAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyAvKiByZXN0cmljdCBoYXMgbm8gZWZmZWN0IGluIHByb3RvdHlwZXMgc28gaWdub3JlIGl0ICovCisJCSAgcmVtb3ZlX25vZGUoeXl2c3BbMF0pOworCQkgIHl5dmFsID0geXl2c3BbMF07CisJCTsKKyAgICBicmVhazt9CitjYXNlIDYyOgorI2xpbmUgMjc5ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHl5dmFsID0geXl2c3BbMF07IDsKKyAgICBicmVhazt9CitjYXNlIDY0OgorI2xpbmUgMjg1ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IGlmIChjdXJyZW50X25hbWUgIT0gTlVMTCkgeworCQkgICAgZXJyb3Jfd2l0aF9wb3MoInVuZXhwZWN0ZWQgc2Vjb25kIGRlY2xhcmF0aW9uIG5hbWUiKTsKKwkJICAgIFlZRVJST1I7CisJCSAgfSBlbHNlIHsKKwkJICAgIGN1cnJlbnRfbmFtZSA9ICgqeXl2c3BbMF0pLT5zdHJpbmc7CisJCSAgICB5eXZhbCA9IHl5dnNwWzBdOworCQkgIH0KKwkJOworICAgIGJyZWFrO30KK2Nhc2UgNjU6CisjbGluZSAyOTQgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgNjY6CisjbGluZSAyOTYgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgNjc6CisjbGluZSAyOTggInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgNjg6CisjbGluZSAzMDAgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgNjk6CisjbGluZSAzMDIgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgNzA6CisjbGluZSAzMDggInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgNzQ6CisjbGluZSAzMTYgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgNzU6CisjbGluZSAzMTggInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgNzY6CisjbGluZSAzMjAgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgNzc6CisjbGluZSAzMjIgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgNzg6CisjbGluZSAzMjQgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgNzk6CisjbGluZSAzMjggInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgODE6CisjbGluZSAzMzAgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgODI6CisjbGluZSAzMzQgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSBOVUxMOyA7CisgICAgYnJlYWs7fQorY2FzZSA4NToKKyNsaW5lIDM0MSAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyB5eXZhbCA9IHl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSA4NjoKKyNsaW5lIDM0NiAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyB5eXZhbCA9IHl5dnNwWzBdID8geXl2c3BbMF0gOiB5eXZzcFstMV07IDsKKyAgICBicmVhazt9CitjYXNlIDg3OgorI2xpbmUgMzUxICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHl5dmFsID0geXl2c3BbMF0gPyB5eXZzcFswXSA6IHl5dnNwWy0xXTsgOworICAgIGJyZWFrO30KK2Nhc2UgODk6CisjbGluZSAzNTYgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSBOVUxMOyA7CisgICAgYnJlYWs7fQorY2FzZSA5MDoKKyNsaW5lIDM1OCAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyAvKiBGb3IgdmVyc2lvbiAyIGNoZWNrc3Vtcywgd2UgZG9uJ3Qgd2FudCB0byByZW1lbWJlcgorCQkgICAgIHByaXZhdGUgcGFyYW1ldGVyIG5hbWVzLiAgKi8KKwkJICByZW1vdmVfbm9kZSh5eXZzcFswXSk7CisJCSAgeXl2YWwgPSB5eXZzcFswXTsKKwkJOworICAgIGJyZWFrO30KK2Nhc2UgOTE6CisjbGluZSAzNjYgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgcmVtb3ZlX25vZGUoeXl2c3BbMF0pOworCQkgIHl5dmFsID0geXl2c3BbMF07CisJCTsKKyAgICBicmVhazt9CitjYXNlIDkyOgorI2xpbmUgMzcwICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHl5dmFsID0geXl2c3BbMF07IDsKKyAgICBicmVhazt9CitjYXNlIDkzOgorI2xpbmUgMzcyICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHl5dmFsID0geXl2c3BbMF07IDsKKyAgICBicmVhazt9CitjYXNlIDk0OgorI2xpbmUgMzc0ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHl5dmFsID0geXl2c3BbMF07IDsKKyAgICBicmVhazt9CitjYXNlIDk1OgorI2xpbmUgMzc2ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHl5dmFsID0geXl2c3BbMF07IDsKKyAgICBicmVhazt9CitjYXNlIDk2OgorI2xpbmUgMzc4ICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHl5dmFsID0geXl2c3BbMF07IDsKKyAgICBicmVhazt9CitjYXNlIDk3OgorI2xpbmUgMzgzICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHN0cnVjdCBzdHJpbmdfbGlzdCAqZGVjbCA9ICp5eXZzcFstMV07CisJCSAgKnl5dnNwWy0xXSA9IE5VTEw7CisJCSAgYWRkX3N5bWJvbChjdXJyZW50X25hbWUsIFNZTV9OT1JNQUwsIGRlY2wsIGlzX2V4dGVybik7CisJCSAgeXl2YWwgPSB5eXZzcFswXTsKKwkJOworICAgIGJyZWFrO30KK2Nhc2UgOTg6CisjbGluZSAzOTEgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSBOVUxMOyA7CisgICAgYnJlYWs7fQorY2FzZSAxMDA6CisjbGluZSAzOTggInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgcmVtb3ZlX2xpc3QoeXl2c3BbMF0sICYoKnl5dnNwWy0xXSktPm5leHQpOyB5eXZhbCA9IHl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSAxMDE6CisjbGluZSA0MDIgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgMTAyOgorI2xpbmUgNDAzICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHl5dmFsID0geXl2c3BbMF07IDsKKyAgICBicmVhazt9CitjYXNlIDEwMzoKKyNsaW5lIDQwNyAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyB5eXZhbCA9IE5VTEw7IDsKKyAgICBicmVhazt9CitjYXNlIDEwNjoKKyNsaW5lIDQxMyAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyB5eXZhbCA9IHl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSAxMDc6CisjbGluZSA0MTggInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgMTA4OgorI2xpbmUgNDIwICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHl5dmFsID0geXl2c3BbMF07IDsKKyAgICBicmVhazt9CitjYXNlIDEwOToKKyNsaW5lIDQyNCAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyB5eXZhbCA9IE5VTEw7IDsKKyAgICBicmVhazt9CitjYXNlIDExMjoKKyNsaW5lIDQzMCAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyB5eXZhbCA9IHl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSAxMTM6CisjbGluZSA0MzQgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXSA/IHl5dnNwWzBdIDogeXl2c3BbLTFdOyA7CisgICAgYnJlYWs7fQorY2FzZSAxMTQ6CisjbGluZSA0MzUgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSB5eXZzcFswXTsgOworICAgIGJyZWFrO30KK2Nhc2UgMTE2OgorI2xpbmUgNDQwICJzY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkiCit7IHl5dmFsID0geXl2c3BbMF07IDsKKyAgICBicmVhazt9CitjYXNlIDExNzoKKyNsaW5lIDQ0NCAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyB5eXZhbCA9IE5VTEw7IDsKKyAgICBicmVhazt9CitjYXNlIDExOToKKyNsaW5lIDQ0OSAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgoreyB5eXZhbCA9IHl5dnNwWzBdOyA7CisgICAgYnJlYWs7fQorY2FzZSAxMjA6CisjbGluZSA0NTMgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgeXl2YWwgPSBOVUxMOyA7CisgICAgYnJlYWs7fQorY2FzZSAxMjI6CisjbGluZSA0NTkgInNjcmlwdHMvZ2Vua3N5bXMvcGFyc2UueSIKK3sgZXhwb3J0X3N5bWJvbCgoKnl5dnNwWy0yXSktPnN0cmluZyk7IHl5dmFsID0geXl2c3BbMF07IDsKKyAgICBicmVhazt9Cit9CisgICAvKiB0aGUgYWN0aW9uIGZpbGUgZ2V0cyBjb3BpZWQgaW4gaW4gcGxhY2Ugb2YgdGhpcyBkb2xsYXJzaWduICovCisjbGluZSA1NDMgIi91c3IvbGliL2Jpc29uLnNpbXBsZSIKKwwKKyAgeXl2c3AgLT0geXlsZW47CisgIHl5c3NwIC09IHl5bGVuOworI2lmZGVmIFlZTFNQX05FRURFRAorICB5eWxzcCAtPSB5eWxlbjsKKyNlbmRpZgorCisjaWYgWVlERUJVRyAhPSAwCisgIGlmICh5eWRlYnVnKQorICAgIHsKKyAgICAgIHNob3J0ICpzc3AxID0geXlzcyAtIDE7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJzdGF0ZSBzdGFjayBub3ciKTsKKyAgICAgIHdoaWxlIChzc3AxICE9IHl5c3NwKQorCWZwcmludGYgKHN0ZGVyciwgIiAlZCIsICorK3NzcDEpOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiXG4iKTsKKyAgICB9CisjZW5kaWYKKworICAqKyt5eXZzcCA9IHl5dmFsOworCisjaWZkZWYgWVlMU1BfTkVFREVECisgIHl5bHNwKys7CisgIGlmICh5eWxlbiA9PSAwKQorICAgIHsKKyAgICAgIHl5bHNwLT5maXJzdF9saW5lID0geXlsbG9jLmZpcnN0X2xpbmU7CisgICAgICB5eWxzcC0+Zmlyc3RfY29sdW1uID0geXlsbG9jLmZpcnN0X2NvbHVtbjsKKyAgICAgIHl5bHNwLT5sYXN0X2xpbmUgPSAoeXlsc3AtMSktPmxhc3RfbGluZTsKKyAgICAgIHl5bHNwLT5sYXN0X2NvbHVtbiA9ICh5eWxzcC0xKS0+bGFzdF9jb2x1bW47CisgICAgICB5eWxzcC0+dGV4dCA9IDA7CisgICAgfQorICBlbHNlCisgICAgeworICAgICAgeXlsc3AtPmxhc3RfbGluZSA9ICh5eWxzcCt5eWxlbi0xKS0+bGFzdF9saW5lOworICAgICAgeXlsc3AtPmxhc3RfY29sdW1uID0gKHl5bHNwK3l5bGVuLTEpLT5sYXN0X2NvbHVtbjsKKyAgICB9CisjZW5kaWYKKworICAvKiBOb3cgInNoaWZ0IiB0aGUgcmVzdWx0IG9mIHRoZSByZWR1Y3Rpb24uCisgICAgIERldGVybWluZSB3aGF0IHN0YXRlIHRoYXQgZ29lcyB0bywKKyAgICAgYmFzZWQgb24gdGhlIHN0YXRlIHdlIHBvcHBlZCBiYWNrIHRvCisgICAgIGFuZCB0aGUgcnVsZSBudW1iZXIgcmVkdWNlZCBieS4gICovCisKKyAgeXluID0geXlyMVt5eW5dOworCisgIHl5c3RhdGUgPSB5eXBnb3RvW3l5biAtIFlZTlRCQVNFXSArICp5eXNzcDsKKyAgaWYgKHl5c3RhdGUgPj0gMCAmJiB5eXN0YXRlIDw9IFlZTEFTVCAmJiB5eWNoZWNrW3l5c3RhdGVdID09ICp5eXNzcCkKKyAgICB5eXN0YXRlID0geXl0YWJsZVt5eXN0YXRlXTsKKyAgZWxzZQorICAgIHl5c3RhdGUgPSB5eWRlZmdvdG9beXluIC0gWVlOVEJBU0VdOworCisgIGdvdG8geXluZXdzdGF0ZTsKKworeXllcnJsYWI6ICAgLyogaGVyZSBvbiBkZXRlY3RpbmcgZXJyb3IgKi8KKworICBpZiAoISB5eWVycnN0YXR1cykKKyAgICAvKiBJZiBub3QgYWxyZWFkeSByZWNvdmVyaW5nIGZyb20gYW4gZXJyb3IsIHJlcG9ydCB0aGlzIGVycm9yLiAgKi8KKyAgICB7CisgICAgICArK3l5bmVycnM7CisKKyNpZmRlZiBZWUVSUk9SX1ZFUkJPU0UKKyAgICAgIHl5biA9IHl5cGFjdFt5eXN0YXRlXTsKKworICAgICAgaWYgKHl5biA+IFlZRkxBRyAmJiB5eW4gPCBZWUxBU1QpCisJeworCSAgaW50IHNpemUgPSAwOworCSAgY2hhciAqbXNnOworCSAgaW50IHgsIGNvdW50OworCisJICBjb3VudCA9IDA7CisJICAvKiBTdGFydCBYIGF0IC15eW4gaWYgbmVjIHRvIGF2b2lkIG5lZ2F0aXZlIGluZGV4ZXMgaW4geXljaGVjay4gICovCisJICBmb3IgKHggPSAoeXluIDwgMCA/IC15eW4gOiAwKTsKKwkgICAgICAgeCA8IChzaXplb2YoeXl0bmFtZSkgLyBzaXplb2YoY2hhciAqKSk7IHgrKykKKwkgICAgaWYgKHl5Y2hlY2tbeCArIHl5bl0gPT0geCkKKwkgICAgICBzaXplICs9IHN0cmxlbih5eXRuYW1lW3hdKSArIDE1LCBjb3VudCsrOworCSAgbXNnID0gKGNoYXIgKikgbWFsbG9jKHNpemUgKyAxNSk7CisJICBpZiAobXNnICE9IDApCisJICAgIHsKKwkgICAgICBzdHJjcHkobXNnLCAicGFyc2UgZXJyb3IiKTsKKworCSAgICAgIGlmIChjb3VudCA8IDUpCisJCXsKKwkJICBjb3VudCA9IDA7CisJCSAgZm9yICh4ID0gKHl5biA8IDAgPyAteXluIDogMCk7CisJCSAgICAgICB4IDwgKHNpemVvZih5eXRuYW1lKSAvIHNpemVvZihjaGFyICopKTsgeCsrKQorCQkgICAgaWYgKHl5Y2hlY2tbeCArIHl5bl0gPT0geCkKKwkJICAgICAgeworCQkJc3RyY2F0KG1zZywgY291bnQgPT0gMCA/ICIsIGV4cGVjdGluZyBgIiA6ICIgb3IgYCIpOworCQkJc3RyY2F0KG1zZywgeXl0bmFtZVt4XSk7CisJCQlzdHJjYXQobXNnLCAiJyIpOworCQkJY291bnQrKzsKKwkJICAgICAgfQorCQl9CisJICAgICAgeXllcnJvcihtc2cpOworCSAgICAgIGZyZWUobXNnKTsKKwkgICAgfQorCSAgZWxzZQorCSAgICB5eWVycm9yICgicGFyc2UgZXJyb3I7IGFsc28gdmlydHVhbCBtZW1vcnkgZXhjZWVkZWQiKTsKKwl9CisgICAgICBlbHNlCisjZW5kaWYgLyogWVlFUlJPUl9WRVJCT1NFICovCisJeXllcnJvcigicGFyc2UgZXJyb3IiKTsKKyAgICB9CisKKyAgZ290byB5eWVycmxhYjE7Cit5eWVycmxhYjE6ICAgLyogaGVyZSBvbiBlcnJvciByYWlzZWQgZXhwbGljaXRseSBieSBhbiBhY3Rpb24gKi8KKworICBpZiAoeXllcnJzdGF0dXMgPT0gMykKKyAgICB7CisgICAgICAvKiBpZiBqdXN0IHRyaWVkIGFuZCBmYWlsZWQgdG8gcmV1c2UgbG9va2FoZWFkIHRva2VuIGFmdGVyIGFuIGVycm9yLCBkaXNjYXJkIGl0LiAgKi8KKworICAgICAgLyogcmV0dXJuIGZhaWx1cmUgaWYgYXQgZW5kIG9mIGlucHV0ICovCisgICAgICBpZiAoeXljaGFyID09IFlZRU9GKQorCVlZQUJPUlQ7CisKKyNpZiBZWURFQlVHICE9IDAKKyAgICAgIGlmICh5eWRlYnVnKQorCWZwcmludGYoc3RkZXJyLCAiRGlzY2FyZGluZyB0b2tlbiAlZCAoJXMpLlxuIiwgeXljaGFyLCB5eXRuYW1lW3l5Y2hhcjFdKTsKKyNlbmRpZgorCisgICAgICB5eWNoYXIgPSBZWUVNUFRZOworICAgIH0KKworICAvKiBFbHNlIHdpbGwgdHJ5IHRvIHJldXNlIGxvb2thaGVhZCB0b2tlbgorICAgICBhZnRlciBzaGlmdGluZyB0aGUgZXJyb3IgdG9rZW4uICAqLworCisgIHl5ZXJyc3RhdHVzID0gMzsJCS8qIEVhY2ggcmVhbCB0b2tlbiBzaGlmdGVkIGRlY3JlbWVudHMgdGhpcyAqLworCisgIGdvdG8geXllcnJoYW5kbGU7CisKK3l5ZXJyZGVmYXVsdDogIC8qIGN1cnJlbnQgc3RhdGUgZG9lcyBub3QgZG8gYW55dGhpbmcgc3BlY2lhbCBmb3IgdGhlIGVycm9yIHRva2VuLiAqLworCisjaWYgMAorICAvKiBUaGlzIGlzIHdyb25nOyBvbmx5IHN0YXRlcyB0aGF0IGV4cGxpY2l0bHkgd2FudCBlcnJvciB0b2tlbnMKKyAgICAgc2hvdWxkIHNoaWZ0IHRoZW0uICAqLworICB5eW4gPSB5eWRlZmFjdFt5eXN0YXRlXTsgIC8qIElmIGl0cyBkZWZhdWx0IGlzIHRvIGFjY2VwdCBhbnkgdG9rZW4sIG9rLiAgT3RoZXJ3aXNlIHBvcCBpdC4qLworICBpZiAoeXluKSBnb3RvIHl5ZGVmYXVsdDsKKyNlbmRpZgorCit5eWVycnBvcDogICAvKiBwb3AgdGhlIGN1cnJlbnQgc3RhdGUgYmVjYXVzZSBpdCBjYW5ub3QgaGFuZGxlIHRoZSBlcnJvciB0b2tlbiAqLworCisgIGlmICh5eXNzcCA9PSB5eXNzKSBZWUFCT1JUOworICB5eXZzcC0tOworICB5eXN0YXRlID0gKi0teXlzc3A7CisjaWZkZWYgWVlMU1BfTkVFREVECisgIHl5bHNwLS07CisjZW5kaWYKKworI2lmIFlZREVCVUcgIT0gMAorICBpZiAoeXlkZWJ1ZykKKyAgICB7CisgICAgICBzaG9ydCAqc3NwMSA9IHl5c3MgLSAxOworICAgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3I6IHN0YXRlIHN0YWNrIG5vdyIpOworICAgICAgd2hpbGUgKHNzcDEgIT0geXlzc3ApCisJZnByaW50ZiAoc3RkZXJyLCAiICVkIiwgKisrc3NwMSk7CisgICAgICBmcHJpbnRmIChzdGRlcnIsICJcbiIpOworICAgIH0KKyNlbmRpZgorCit5eWVycmhhbmRsZToKKworICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07CisgIGlmICh5eW4gPT0gWVlGTEFHKQorICAgIGdvdG8geXllcnJkZWZhdWx0OworCisgIHl5biArPSBZWVRFUlJPUjsKKyAgaWYgKHl5biA8IDAgfHwgeXluID4gWVlMQVNUIHx8IHl5Y2hlY2tbeXluXSAhPSBZWVRFUlJPUikKKyAgICBnb3RvIHl5ZXJyZGVmYXVsdDsKKworICB5eW4gPSB5eXRhYmxlW3l5bl07CisgIGlmICh5eW4gPCAwKQorICAgIHsKKyAgICAgIGlmICh5eW4gPT0gWVlGTEFHKQorCWdvdG8geXllcnJwb3A7CisgICAgICB5eW4gPSAteXluOworICAgICAgZ290byB5eXJlZHVjZTsKKyAgICB9CisgIGVsc2UgaWYgKHl5biA9PSAwKQorICAgIGdvdG8geXllcnJwb3A7CisKKyAgaWYgKHl5biA9PSBZWUZJTkFMKQorICAgIFlZQUNDRVBUOworCisjaWYgWVlERUJVRyAhPSAwCisgIGlmICh5eWRlYnVnKQorICAgIGZwcmludGYoc3RkZXJyLCAiU2hpZnRpbmcgZXJyb3IgdG9rZW4sICIpOworI2VuZGlmCisKKyAgKisreXl2c3AgPSB5eWx2YWw7CisjaWZkZWYgWVlMU1BfTkVFREVECisgICorK3l5bHNwID0geXlsbG9jOworI2VuZGlmCisKKyAgeXlzdGF0ZSA9IHl5bjsKKyAgZ290byB5eW5ld3N0YXRlOworCisgeXlhY2NlcHRsYWI6CisgIC8qIFlZQUNDRVBUIGNvbWVzIGhlcmUuICAqLworICBpZiAoeXlmcmVlX3N0YWNrcykKKyAgICB7CisgICAgICBmcmVlICh5eXNzKTsKKyAgICAgIGZyZWUgKHl5dnMpOworI2lmZGVmIFlZTFNQX05FRURFRAorICAgICAgZnJlZSAoeXlscyk7CisjZW5kaWYKKyAgICB9CisgIHJldHVybiAwOworCisgeXlhYm9ydGxhYjoKKyAgLyogWVlBQk9SVCBjb21lcyBoZXJlLiAgKi8KKyAgaWYgKHl5ZnJlZV9zdGFja3MpCisgICAgeworICAgICAgZnJlZSAoeXlzcyk7CisgICAgICBmcmVlICh5eXZzKTsKKyNpZmRlZiBZWUxTUF9ORUVERUQKKyAgICAgIGZyZWUgKHl5bHMpOworI2VuZGlmCisgICAgfQorICByZXR1cm4gMTsKK30KKyNsaW5lIDQ2MyAic2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IgorCisKK3N0YXRpYyB2b2lkCit5eWVycm9yKGNvbnN0IGNoYXIgKmUpCit7CisgIGVycm9yX3dpdGhfcG9zKCIlcyIsIGUpOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS5oX3NoaXBwZWQgYi9zY3JpcHRzL2dlbmtzeW1zL3BhcnNlLmhfc2hpcHBlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWIyN2UzCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS5oX3NoaXBwZWQKQEAgLTAsMCArMSw0NiBAQAorI2lmbmRlZiBZWVNUWVBFCisjZGVmaW5lIFlZU1RZUEUgaW50CisjZW5kaWYKKyNkZWZpbmUJQVNNX0tFWVcJMjU3CisjZGVmaW5lCUFUVFJJQlVURV9LRVlXCTI1OAorI2RlZmluZQlBVVRPX0tFWVcJMjU5CisjZGVmaW5lCUJPT0xfS0VZVwkyNjAKKyNkZWZpbmUJQ0hBUl9LRVlXCTI2MQorI2RlZmluZQlDT05TVF9LRVlXCTI2MgorI2RlZmluZQlET1VCTEVfS0VZVwkyNjMKKyNkZWZpbmUJRU5VTV9LRVlXCTI2NAorI2RlZmluZQlFWFRFUk5fS0VZVwkyNjUKKyNkZWZpbmUJRkxPQVRfS0VZVwkyNjYKKyNkZWZpbmUJSU5MSU5FX0tFWVcJMjY3CisjZGVmaW5lCUlOVF9LRVlXCTI2OAorI2RlZmluZQlMT05HX0tFWVcJMjY5CisjZGVmaW5lCVJFR0lTVEVSX0tFWVcJMjcwCisjZGVmaW5lCVJFU1RSSUNUX0tFWVcJMjcxCisjZGVmaW5lCVNIT1JUX0tFWVcJMjcyCisjZGVmaW5lCVNJR05FRF9LRVlXCTI3MworI2RlZmluZQlTVEFUSUNfS0VZVwkyNzQKKyNkZWZpbmUJU1RSVUNUX0tFWVcJMjc1CisjZGVmaW5lCVRZUEVERUZfS0VZVwkyNzYKKyNkZWZpbmUJVU5JT05fS0VZVwkyNzcKKyNkZWZpbmUJVU5TSUdORURfS0VZVwkyNzgKKyNkZWZpbmUJVk9JRF9LRVlXCTI3OQorI2RlZmluZQlWT0xBVElMRV9LRVlXCTI4MAorI2RlZmluZQlUWVBFT0ZfS0VZVwkyODEKKyNkZWZpbmUJRVhQT1JUX1NZTUJPTF9LRVlXCTI4MgorI2RlZmluZQlBU01fUEhSQVNFCTI4MworI2RlZmluZQlBVFRSSUJVVEVfUEhSQVNFCTI4NAorI2RlZmluZQlCUkFDRV9QSFJBU0UJMjg1CisjZGVmaW5lCUJSQUNLRVRfUEhSQVNFCTI4NgorI2RlZmluZQlFWFBSRVNTSU9OX1BIUkFTRQkyODcKKyNkZWZpbmUJQ0hBUgkyODgKKyNkZWZpbmUJRE9UUwkyODkKKyNkZWZpbmUJSURFTlQJMjkwCisjZGVmaW5lCUlOVAkyOTEKKyNkZWZpbmUJUkVBTAkyOTIKKyNkZWZpbmUJU1RSSU5HCTI5MworI2RlZmluZQlUWVBFCTI5NAorI2RlZmluZQlPVEhFUgkyOTUKKyNkZWZpbmUJRklMRU5BTUUJMjk2CisKKworZXh0ZXJuIFlZU1RZUEUgeXlsdmFsOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55IGIvc2NyaXB0cy9nZW5rc3ltcy9wYXJzZS55Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5OTA0MzcKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2dlbmtzeW1zL3BhcnNlLnkKQEAgLTAsMCArMSw0NjkgQEAKKy8qIEMgZ2xvYmFsIGRlY2xhcmF0aW9uIHBhcnNlciBmb3IgZ2Vua3N5bXMuCisgICBDb3B5cmlnaHQgMTk5NiwgMTk5NyBMaW51eCBJbnRlcm5hdGlvbmFsLgorCisgICBOZXcgaW1wbGVtZW50YXRpb24gY29udHJpYnV0ZWQgYnkgUmljaGFyZCBIZW5kZXJzb24gPHJ0aEB0YW11LmVkdT4KKyAgIEJhc2VkIG9uIG9yaWdpbmFsIHdvcmsgYnkgQmpvcm4gRWt3YWxsIDxiajBybkBibG94LnNlPgorCisgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgTGludXggbW9kdXRpbHMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgICB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIKKyAgIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAgIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgICBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLAorICAgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKworJXsKKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgImdlbmtzeW1zLmgiCisKK3N0YXRpYyBpbnQgaXNfdHlwZWRlZjsKK3N0YXRpYyBpbnQgaXNfZXh0ZXJuOworc3RhdGljIGNoYXIgKmN1cnJlbnRfbmFtZTsKK3N0YXRpYyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmRlY2xfc3BlYzsKKworc3RhdGljIHZvaWQgeXllcnJvcihjb25zdCBjaGFyICopOworCitzdGF0aWMgaW5saW5lIHZvaWQKK3JlbW92ZV9ub2RlKHN0cnVjdCBzdHJpbmdfbGlzdCAqKnApCit7CisgIHN0cnVjdCBzdHJpbmdfbGlzdCAqbm9kZSA9ICpwOworICAqcCA9IG5vZGUtPm5leHQ7CisgIGZyZWVfbm9kZShub2RlKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCityZW1vdmVfbGlzdChzdHJ1Y3Qgc3RyaW5nX2xpc3QgKipwYiwgc3RydWN0IHN0cmluZ19saXN0ICoqcGUpCit7CisgIHN0cnVjdCBzdHJpbmdfbGlzdCAqYiA9ICpwYiwgKmUgPSAqcGU7CisgICpwYiA9IGU7CisgIGZyZWVfbGlzdChiLCBlKTsKK30KKworJX0KKworJXRva2VuIEFTTV9LRVlXCisldG9rZW4gQVRUUklCVVRFX0tFWVcKKyV0b2tlbiBBVVRPX0tFWVcKKyV0b2tlbiBCT09MX0tFWVcKKyV0b2tlbiBDSEFSX0tFWVcKKyV0b2tlbiBDT05TVF9LRVlXCisldG9rZW4gRE9VQkxFX0tFWVcKKyV0b2tlbiBFTlVNX0tFWVcKKyV0b2tlbiBFWFRFUk5fS0VZVworJXRva2VuIEZMT0FUX0tFWVcKKyV0b2tlbiBJTkxJTkVfS0VZVworJXRva2VuIElOVF9LRVlXCisldG9rZW4gTE9OR19LRVlXCisldG9rZW4gUkVHSVNURVJfS0VZVworJXRva2VuIFJFU1RSSUNUX0tFWVcKKyV0b2tlbiBTSE9SVF9LRVlXCisldG9rZW4gU0lHTkVEX0tFWVcKKyV0b2tlbiBTVEFUSUNfS0VZVworJXRva2VuIFNUUlVDVF9LRVlXCisldG9rZW4gVFlQRURFRl9LRVlXCisldG9rZW4gVU5JT05fS0VZVworJXRva2VuIFVOU0lHTkVEX0tFWVcKKyV0b2tlbiBWT0lEX0tFWVcKKyV0b2tlbiBWT0xBVElMRV9LRVlXCisldG9rZW4gVFlQRU9GX0tFWVcKKworJXRva2VuIEVYUE9SVF9TWU1CT0xfS0VZVworCisldG9rZW4gQVNNX1BIUkFTRQorJXRva2VuIEFUVFJJQlVURV9QSFJBU0UKKyV0b2tlbiBCUkFDRV9QSFJBU0UKKyV0b2tlbiBCUkFDS0VUX1BIUkFTRQorJXRva2VuIEVYUFJFU1NJT05fUEhSQVNFCisKKyV0b2tlbiBDSEFSCisldG9rZW4gRE9UUworJXRva2VuIElERU5UCisldG9rZW4gSU5UCisldG9rZW4gUkVBTAorJXRva2VuIFNUUklORworJXRva2VuIFRZUEUKKyV0b2tlbiBPVEhFUgorJXRva2VuIEZJTEVOQU1FCisKKyUlCisKK2RlY2xhcmF0aW9uX3NlcToKKwlkZWNsYXJhdGlvbgorCXwgZGVjbGFyYXRpb25fc2VxIGRlY2xhcmF0aW9uCisJOworCitkZWNsYXJhdGlvbjoKKwl7IGlzX3R5cGVkZWYgPSAwOyBpc19leHRlcm4gPSAwOyBjdXJyZW50X25hbWUgPSBOVUxMOyBkZWNsX3NwZWMgPSBOVUxMOyB9CisJZGVjbGFyYXRpb24xCisJeyBmcmVlX2xpc3QoKiQyLCBOVUxMKTsgKiQyID0gTlVMTDsgfQorCTsKKworZGVjbGFyYXRpb24xOgorCVRZUEVERUZfS0VZVyB7IGlzX3R5cGVkZWYgPSAxOyB9IHNpbXBsZV9kZWNsYXJhdGlvbgorCQl7ICQkID0gJDM7IH0KKwl8IHNpbXBsZV9kZWNsYXJhdGlvbgorCXwgZnVuY3Rpb25fZGVmaW5pdGlvbgorCXwgYXNtX2RlZmluaXRpb24KKwl8IGV4cG9ydF9kZWZpbml0aW9uCisJfCBlcnJvciAnOycJCQkJeyAkJCA9ICQyOyB9CisJfCBlcnJvciAnfScJCQkJeyAkJCA9ICQyOyB9CisJOworCitzaW1wbGVfZGVjbGFyYXRpb246CisJZGVjbF9zcGVjaWZpZXJfc2VxX29wdCBpbml0X2RlY2xhcmF0b3JfbGlzdF9vcHQgJzsnCisJCXsgaWYgKGN1cnJlbnRfbmFtZSkgeworCQkgICAgc3RydWN0IHN0cmluZ19saXN0ICpkZWNsID0gKCokMyktPm5leHQ7CisJCSAgICAoKiQzKS0+bmV4dCA9IE5VTEw7CisJCSAgICBhZGRfc3ltYm9sKGN1cnJlbnRfbmFtZSwKKwkJCSAgICAgICBpc190eXBlZGVmID8gU1lNX1RZUEVERUYgOiBTWU1fTk9STUFMLAorCQkJICAgICAgIGRlY2wsIGlzX2V4dGVybik7CisJCSAgICBjdXJyZW50X25hbWUgPSBOVUxMOworCQkgIH0KKwkJICAkJCA9ICQzOworCQl9CisJOworCitpbml0X2RlY2xhcmF0b3JfbGlzdF9vcHQ6CisJLyogZW1wdHkgKi8JCQkJeyAkJCA9IE5VTEw7IH0KKwl8IGluaXRfZGVjbGFyYXRvcl9saXN0CisJOworCitpbml0X2RlY2xhcmF0b3JfbGlzdDoKKwlpbml0X2RlY2xhcmF0b3IKKwkJeyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmRlY2wgPSAqJDE7CisJCSAgKiQxID0gTlVMTDsKKwkJICBhZGRfc3ltYm9sKGN1cnJlbnRfbmFtZSwKKwkJCSAgICAgaXNfdHlwZWRlZiA/IFNZTV9UWVBFREVGIDogU1lNX05PUk1BTCwgZGVjbCwgaXNfZXh0ZXJuKTsKKwkJICBjdXJyZW50X25hbWUgPSBOVUxMOworCQkgICQkID0gJDE7CisJCX0KKwl8IGluaXRfZGVjbGFyYXRvcl9saXN0ICcsJyBpbml0X2RlY2xhcmF0b3IKKwkJeyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKmRlY2wgPSAqJDM7CisJCSAgKiQzID0gTlVMTDsKKwkJICBmcmVlX2xpc3QoKiQyLCBOVUxMKTsKKwkJICAqJDIgPSBkZWNsX3NwZWM7CisJCSAgYWRkX3N5bWJvbChjdXJyZW50X25hbWUsCisJCQkgICAgIGlzX3R5cGVkZWYgPyBTWU1fVFlQRURFRiA6IFNZTV9OT1JNQUwsIGRlY2wsIGlzX2V4dGVybik7CisJCSAgY3VycmVudF9uYW1lID0gTlVMTDsKKwkJICAkJCA9ICQzOworCQl9CisJOworCitpbml0X2RlY2xhcmF0b3I6CisJZGVjbGFyYXRvciBhc21fcGhyYXNlX29wdCBhdHRyaWJ1dGVfb3B0IGluaXRpYWxpemVyX29wdAorCQl7ICQkID0gJDQgPyAkNCA6ICQzID8gJDMgOiAkMiA/ICQyIDogJDE7IH0KKwk7CisKKy8qIEhhbmcgb24gdG8gdGhlIHNwZWNpZmllcnMgc28gdGhhdCB3ZSBjYW4gcmV1c2UgdGhlbS4gICovCitkZWNsX3NwZWNpZmllcl9zZXFfb3B0OgorCS8qIGVtcHR5ICovCQkJCXsgZGVjbF9zcGVjID0gTlVMTDsgfQorCXwgZGVjbF9zcGVjaWZpZXJfc2VxCisJOworCitkZWNsX3NwZWNpZmllcl9zZXE6CisJZGVjbF9zcGVjaWZpZXIJCQkJeyBkZWNsX3NwZWMgPSAqJDE7IH0KKwl8IGRlY2xfc3BlY2lmaWVyX3NlcSBkZWNsX3NwZWNpZmllcgl7IGRlY2xfc3BlYyA9ICokMjsgfQorCTsKKworZGVjbF9zcGVjaWZpZXI6CisJc3RvcmFnZV9jbGFzc19zcGVjaWZpZXIKKwkJeyAvKiBWZXJzaW9uIDIgY2hlY2tzdW1taW5nIGlnbm9yZXMgc3RvcmFnZSBjbGFzcywgYXMgdGhhdAorCQkgICAgIGlzIHJlYWxseSBpcnJlbGV2YW50IHRvIHRoZSBsaW5rYWdlLiAgKi8KKwkJICByZW1vdmVfbm9kZSgkMSk7CisJCSAgJCQgPSAkMTsKKwkJfQorCXwgdHlwZV9zcGVjaWZpZXIKKwk7CisKK3N0b3JhZ2VfY2xhc3Nfc3BlY2lmaWVyOgorCUFVVE9fS0VZVworCXwgUkVHSVNURVJfS0VZVworCXwgU1RBVElDX0tFWVcKKwl8IEVYVEVSTl9LRVlXCXsgaXNfZXh0ZXJuID0gMTsgJCQgPSAkMTsgfQorCXwgSU5MSU5FX0tFWVcJeyBpc19leHRlcm4gPSAwOyAkJCA9ICQxOyB9CisJOworCit0eXBlX3NwZWNpZmllcjoKKwlzaW1wbGVfdHlwZV9zcGVjaWZpZXIKKwl8IGN2YXJfcXVhbGlmaWVyCisJfCBUWVBFT0ZfS0VZVyAnKCcgZGVjbF9zcGVjaWZpZXJfc2VxICcpJworCisJLyogUmVmZXJlbmNlcyB0byBzL3UvZSdzIGRlZmluZWQgZWxzZXdoZXJlLiAgUmVhcnJhbmdlIHRoaW5ncworCSAgIHNvIHRoYXQgaXQgaXMgZWFzaWVyIHRvIGV4cGFuZCB0aGUgZGVmaW5pdGlvbiBmdWxseSBsYXRlci4gICovCisJfCBTVFJVQ1RfS0VZVyBJREVOVAorCQl7IHJlbW92ZV9ub2RlKCQxKTsgKCokMiktPnRhZyA9IFNZTV9TVFJVQ1Q7ICQkID0gJDI7IH0KKwl8IFVOSU9OX0tFWVcgSURFTlQKKwkJeyByZW1vdmVfbm9kZSgkMSk7ICgqJDIpLT50YWcgPSBTWU1fVU5JT047ICQkID0gJDI7IH0KKwl8IEVOVU1fS0VZVyBJREVOVAorCQl7IHJlbW92ZV9ub2RlKCQxKTsgKCokMiktPnRhZyA9IFNZTV9FTlVNOyAkJCA9ICQyOyB9CisKKwkvKiBGdWxsIGRlZmluaXRpb25zIG9mIGFuIHMvdS9lLiAgUmVjb3JkIGl0LiAgKi8KKwl8IFNUUlVDVF9LRVlXIElERU5UIGNsYXNzX2JvZHkKKwkJeyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKnMgPSAqJDMsICppID0gKiQyLCAqcjsKKwkJICByID0gY29weV9ub2RlKGkpOyByLT50YWcgPSBTWU1fU1RSVUNUOworCQkgIHItPm5leHQgPSAoKiQxKS0+bmV4dDsgKiQzID0gcjsgKCokMSktPm5leHQgPSBOVUxMOworCQkgIGFkZF9zeW1ib2woaS0+c3RyaW5nLCBTWU1fU1RSVUNULCBzLCBpc19leHRlcm4pOworCQkgICQkID0gJDM7CisJCX0KKwl8IFVOSU9OX0tFWVcgSURFTlQgY2xhc3NfYm9keQorCQl7IHN0cnVjdCBzdHJpbmdfbGlzdCAqcyA9ICokMywgKmkgPSAqJDIsICpyOworCQkgIHIgPSBjb3B5X25vZGUoaSk7IHItPnRhZyA9IFNZTV9VTklPTjsKKwkJICByLT5uZXh0ID0gKCokMSktPm5leHQ7ICokMyA9IHI7ICgqJDEpLT5uZXh0ID0gTlVMTDsKKwkJICBhZGRfc3ltYm9sKGktPnN0cmluZywgU1lNX1VOSU9OLCBzLCBpc19leHRlcm4pOworCQkgICQkID0gJDM7CisJCX0KKwl8IEVOVU1fS0VZVyBJREVOVCBCUkFDRV9QSFJBU0UKKwkJeyBzdHJ1Y3Qgc3RyaW5nX2xpc3QgKnMgPSAqJDMsICppID0gKiQyLCAqcjsKKwkJICByID0gY29weV9ub2RlKGkpOyByLT50YWcgPSBTWU1fRU5VTTsKKwkJICByLT5uZXh0ID0gKCokMSktPm5leHQ7ICokMyA9IHI7ICgqJDEpLT5uZXh0ID0gTlVMTDsKKwkJICBhZGRfc3ltYm9sKGktPnN0cmluZywgU1lNX0VOVU0sIHMsIGlzX2V4dGVybik7CisJCSAgJCQgPSAkMzsKKwkJfQorCisJLyogQW5vbnltb3VzIHMvdS9lIGRlZmluaXRpb25zLiAgTm90aGluZyBuZWVkcyBkb2luZy4gICovCisJfCBFTlVNX0tFWVcgQlJBQ0VfUEhSQVNFCQkJeyAkJCA9ICQyOyB9CisJfCBTVFJVQ1RfS0VZVyBjbGFzc19ib2R5CQkJeyAkJCA9ICQyOyB9CisJfCBVTklPTl9LRVlXIGNsYXNzX2JvZHkJCQkJeyAkJCA9ICQyOyB9CisJOworCitzaW1wbGVfdHlwZV9zcGVjaWZpZXI6CisJQ0hBUl9LRVlXCisJfCBTSE9SVF9LRVlXCisJfCBJTlRfS0VZVworCXwgTE9OR19LRVlXCisJfCBTSUdORURfS0VZVworCXwgVU5TSUdORURfS0VZVworCXwgRkxPQVRfS0VZVworCXwgRE9VQkxFX0tFWVcKKwl8IFZPSURfS0VZVworCXwgQk9PTF9LRVlXCisJfCBUWVBFCQkJeyAoKiQxKS0+dGFnID0gU1lNX1RZUEVERUY7ICQkID0gJDE7IH0KKwk7CisKK3B0cl9vcGVyYXRvcjoKKwknKicgY3Zhcl9xdWFsaWZpZXJfc2VxX29wdAorCQl7ICQkID0gJDIgPyAkMiA6ICQxOyB9CisJOworCitjdmFyX3F1YWxpZmllcl9zZXFfb3B0OgorCS8qIGVtcHR5ICovCQkJCQl7ICQkID0gTlVMTDsgfQorCXwgY3Zhcl9xdWFsaWZpZXJfc2VxCisJOworCitjdmFyX3F1YWxpZmllcl9zZXE6CisJY3Zhcl9xdWFsaWZpZXIKKwl8IGN2YXJfcXVhbGlmaWVyX3NlcSBjdmFyX3F1YWxpZmllcgkJeyAkJCA9ICQyOyB9CisJOworCitjdmFyX3F1YWxpZmllcjoKKwlDT05TVF9LRVlXIHwgVk9MQVRJTEVfS0VZVyB8IEFUVFJJQlVURV9QSFJBU0UKKwl8IFJFU1RSSUNUX0tFWVcKKwkJeyAvKiByZXN0cmljdCBoYXMgbm8gZWZmZWN0IGluIHByb3RvdHlwZXMgc28gaWdub3JlIGl0ICovCisJCSAgcmVtb3ZlX25vZGUoJDEpOworCQkgICQkID0gJDE7CisJCX0KKwk7CisKK2RlY2xhcmF0b3I6CisJcHRyX29wZXJhdG9yIGRlY2xhcmF0b3IJCQl7ICQkID0gJDI7IH0KKwl8IGRpcmVjdF9kZWNsYXJhdG9yCisJOworCitkaXJlY3RfZGVjbGFyYXRvcjoKKwlJREVOVAorCQl7IGlmIChjdXJyZW50X25hbWUgIT0gTlVMTCkgeworCQkgICAgZXJyb3Jfd2l0aF9wb3MoInVuZXhwZWN0ZWQgc2Vjb25kIGRlY2xhcmF0aW9uIG5hbWUiKTsKKwkJICAgIFlZRVJST1I7CisJCSAgfSBlbHNlIHsKKwkJICAgIGN1cnJlbnRfbmFtZSA9ICgqJDEpLT5zdHJpbmc7CisJCSAgICAkJCA9ICQxOworCQkgIH0KKwkJfQorCXwgZGlyZWN0X2RlY2xhcmF0b3IgJygnIHBhcmFtZXRlcl9kZWNsYXJhdGlvbl9jbGF1c2UgJyknCisJCXsgJCQgPSAkNDsgfQorCXwgZGlyZWN0X2RlY2xhcmF0b3IgJygnIGVycm9yICcpJworCQl7ICQkID0gJDQ7IH0KKwl8IGRpcmVjdF9kZWNsYXJhdG9yIEJSQUNLRVRfUEhSQVNFCisJCXsgJCQgPSAkMjsgfQorCXwgJygnIGRlY2xhcmF0b3IgJyknCisJCXsgJCQgPSAkMzsgfQorCXwgJygnIGVycm9yICcpJworCQl7ICQkID0gJDM7IH0KKwk7CisKKy8qIE5lc3RlZCBkZWNsYXJhdG9ycyBkaWZmZXIgZnJvbSByZWd1bGFyIGRlY2xhcmF0b3JzIGluIHRoYXQgdGhleSBkbworICAgbm90IHJlY29yZCB0aGUgc3ltYm9scyB0aGV5IGZpbmQgaW4gdGhlIGdsb2JhbCBzeW1ib2wgdGFibGUuICAqLworbmVzdGVkX2RlY2xhcmF0b3I6CisJcHRyX29wZXJhdG9yIG5lc3RlZF9kZWNsYXJhdG9yCQl7ICQkID0gJDI7IH0KKwl8IGRpcmVjdF9uZXN0ZWRfZGVjbGFyYXRvcgorCTsKKworZGlyZWN0X25lc3RlZF9kZWNsYXJhdG9yOgorCUlERU5UCisJfCBUWVBFCisJfCBkaXJlY3RfbmVzdGVkX2RlY2xhcmF0b3IgJygnIHBhcmFtZXRlcl9kZWNsYXJhdGlvbl9jbGF1c2UgJyknCisJCXsgJCQgPSAkNDsgfQorCXwgZGlyZWN0X25lc3RlZF9kZWNsYXJhdG9yICcoJyBlcnJvciAnKScKKwkJeyAkJCA9ICQ0OyB9CisJfCBkaXJlY3RfbmVzdGVkX2RlY2xhcmF0b3IgQlJBQ0tFVF9QSFJBU0UKKwkJeyAkJCA9ICQyOyB9CisJfCAnKCcgbmVzdGVkX2RlY2xhcmF0b3IgJyknCisJCXsgJCQgPSAkMzsgfQorCXwgJygnIGVycm9yICcpJworCQl7ICQkID0gJDM7IH0KKwk7CisKK3BhcmFtZXRlcl9kZWNsYXJhdGlvbl9jbGF1c2U6CisJcGFyYW1ldGVyX2RlY2xhcmF0aW9uX2xpc3Rfb3B0IERPVFMJCXsgJCQgPSAkMjsgfQorCXwgcGFyYW1ldGVyX2RlY2xhcmF0aW9uX2xpc3Rfb3B0CisJfCBwYXJhbWV0ZXJfZGVjbGFyYXRpb25fbGlzdCAnLCcgRE9UUwkJeyAkJCA9ICQzOyB9CisJOworCitwYXJhbWV0ZXJfZGVjbGFyYXRpb25fbGlzdF9vcHQ6CisJLyogZW1wdHkgKi8JCQkJCXsgJCQgPSBOVUxMOyB9CisJfCBwYXJhbWV0ZXJfZGVjbGFyYXRpb25fbGlzdAorCTsKKworcGFyYW1ldGVyX2RlY2xhcmF0aW9uX2xpc3Q6CisJcGFyYW1ldGVyX2RlY2xhcmF0aW9uCisJfCBwYXJhbWV0ZXJfZGVjbGFyYXRpb25fbGlzdCAnLCcgcGFyYW1ldGVyX2RlY2xhcmF0aW9uCisJCXsgJCQgPSAkMzsgfQorCTsKKworcGFyYW1ldGVyX2RlY2xhcmF0aW9uOgorCWRlY2xfc3BlY2lmaWVyX3NlcSBtX2Fic3RyYWN0X2RlY2xhcmF0b3IKKwkJeyAkJCA9ICQyID8gJDIgOiAkMTsgfQorCTsKKworbV9hYnN0cmFjdF9kZWNsYXJhdG9yOgorCXB0cl9vcGVyYXRvciBtX2Fic3RyYWN0X2RlY2xhcmF0b3IKKwkJeyAkJCA9ICQyID8gJDIgOiAkMTsgfQorCXwgZGlyZWN0X21fYWJzdHJhY3RfZGVjbGFyYXRvcgorCTsKKworZGlyZWN0X21fYWJzdHJhY3RfZGVjbGFyYXRvcjoKKwkvKiBlbXB0eSAqLwkJCQkJeyAkJCA9IE5VTEw7IH0KKwl8IElERU5UCisJCXsgLyogRm9yIHZlcnNpb24gMiBjaGVja3N1bXMsIHdlIGRvbid0IHdhbnQgdG8gcmVtZW1iZXIKKwkJICAgICBwcml2YXRlIHBhcmFtZXRlciBuYW1lcy4gICovCisJCSAgcmVtb3ZlX25vZGUoJDEpOworCQkgICQkID0gJDE7CisJCX0KKwkvKiBUaGlzIHdhc24ndCByZWFsbHkgYSB0eXBlZGVmIG5hbWUgYnV0IGFuIGlkZW50aWZpZXIgdGhhdAorCSAgIHNoYWRvd3Mgb25lLiAgKi8KKwl8IFRZUEUKKwkJeyByZW1vdmVfbm9kZSgkMSk7CisJCSAgJCQgPSAkMTsKKwkJfQorCXwgZGlyZWN0X21fYWJzdHJhY3RfZGVjbGFyYXRvciAnKCcgcGFyYW1ldGVyX2RlY2xhcmF0aW9uX2NsYXVzZSAnKScKKwkJeyAkJCA9ICQ0OyB9CisJfCBkaXJlY3RfbV9hYnN0cmFjdF9kZWNsYXJhdG9yICcoJyBlcnJvciAnKScKKwkJeyAkJCA9ICQ0OyB9CisJfCBkaXJlY3RfbV9hYnN0cmFjdF9kZWNsYXJhdG9yIEJSQUNLRVRfUEhSQVNFCisJCXsgJCQgPSAkMjsgfQorCXwgJygnIG1fYWJzdHJhY3RfZGVjbGFyYXRvciAnKScKKwkJeyAkJCA9ICQzOyB9CisJfCAnKCcgZXJyb3IgJyknCisJCXsgJCQgPSAkMzsgfQorCTsKKworZnVuY3Rpb25fZGVmaW5pdGlvbjoKKwlkZWNsX3NwZWNpZmllcl9zZXFfb3B0IGRlY2xhcmF0b3IgQlJBQ0VfUEhSQVNFCisJCXsgc3RydWN0IHN0cmluZ19saXN0ICpkZWNsID0gKiQyOworCQkgICokMiA9IE5VTEw7CisJCSAgYWRkX3N5bWJvbChjdXJyZW50X25hbWUsIFNZTV9OT1JNQUwsIGRlY2wsIGlzX2V4dGVybik7CisJCSAgJCQgPSAkMzsKKwkJfQorCTsKKworaW5pdGlhbGl6ZXJfb3B0OgorCS8qIGVtcHR5ICovCQkJCQl7ICQkID0gTlVMTDsgfQorCXwgaW5pdGlhbGl6ZXIKKwk7CisKKy8qIFdlIG5ldmVyIGNhcmUgYWJvdXQgdGhlIGNvbnRlbnRzIG9mIGFuIGluaXRpYWxpemVyLiAgKi8KK2luaXRpYWxpemVyOgorCSc9JyBFWFBSRVNTSU9OX1BIUkFTRQorCQl7IHJlbW92ZV9saXN0KCQyLCAmKCokMSktPm5leHQpOyAkJCA9ICQyOyB9CisJOworCitjbGFzc19ib2R5OgorCSd7JyBtZW1iZXJfc3BlY2lmaWNhdGlvbl9vcHQgJ30nCQl7ICQkID0gJDM7IH0KKwl8ICd7JyBlcnJvciAnfScJCQkJCXsgJCQgPSAkMzsgfQorCTsKKworbWVtYmVyX3NwZWNpZmljYXRpb25fb3B0OgorCS8qIGVtcHR5ICovCQkJCQl7ICQkID0gTlVMTDsgfQorCXwgbWVtYmVyX3NwZWNpZmljYXRpb24KKwk7CisKK21lbWJlcl9zcGVjaWZpY2F0aW9uOgorCW1lbWJlcl9kZWNsYXJhdGlvbgorCXwgbWVtYmVyX3NwZWNpZmljYXRpb24gbWVtYmVyX2RlY2xhcmF0aW9uCXsgJCQgPSAkMjsgfQorCTsKKworbWVtYmVyX2RlY2xhcmF0aW9uOgorCWRlY2xfc3BlY2lmaWVyX3NlcV9vcHQgbWVtYmVyX2RlY2xhcmF0b3JfbGlzdF9vcHQgJzsnCisJCXsgJCQgPSAkMzsgfQorCXwgZXJyb3IgJzsnCisJCXsgJCQgPSAkMjsgfQorCTsKKworbWVtYmVyX2RlY2xhcmF0b3JfbGlzdF9vcHQ6CisJLyogZW1wdHkgKi8JCQkJCXsgJCQgPSBOVUxMOyB9CisJfCBtZW1iZXJfZGVjbGFyYXRvcl9saXN0CisJOworCittZW1iZXJfZGVjbGFyYXRvcl9saXN0OgorCW1lbWJlcl9kZWNsYXJhdG9yCisJfCBtZW1iZXJfZGVjbGFyYXRvcl9saXN0ICcsJyBtZW1iZXJfZGVjbGFyYXRvcgl7ICQkID0gJDM7IH0KKwk7CisKK21lbWJlcl9kZWNsYXJhdG9yOgorCW5lc3RlZF9kZWNsYXJhdG9yIGF0dHJpYnV0ZV9vcHQJCQl7ICQkID0gJDIgPyAkMiA6ICQxOyB9CisJfCBJREVOVCBtZW1iZXJfYml0ZmllbGRfZGVjbGFyYXRvcgkJeyAkJCA9ICQyOyB9CisJfCBtZW1iZXJfYml0ZmllbGRfZGVjbGFyYXRvcgorCTsKKworbWVtYmVyX2JpdGZpZWxkX2RlY2xhcmF0b3I6CisJJzonIEVYUFJFU1NJT05fUEhSQVNFCQkJCXsgJCQgPSAkMjsgfQorCTsKKworYXR0cmlidXRlX29wdDoKKwkvKiBlbXB0eSAqLwkJCQkJeyAkJCA9IE5VTEw7IH0KKwl8IEFUVFJJQlVURV9QSFJBU0UKKwk7CisKK2FzbV9kZWZpbml0aW9uOgorCUFTTV9QSFJBU0UgJzsnCQkJCQl7ICQkID0gJDI7IH0KKwk7CisKK2FzbV9waHJhc2Vfb3B0OgorCS8qIGVtcHR5ICovCQkJCQl7ICQkID0gTlVMTDsgfQorCXwgQVNNX1BIUkFTRQorCTsKKworZXhwb3J0X2RlZmluaXRpb246CisJRVhQT1JUX1NZTUJPTF9LRVlXICcoJyBJREVOVCAnKScgJzsnCisJCXsgZXhwb3J0X3N5bWJvbCgoKiQzKS0+c3RyaW5nKTsgJCQgPSAkNTsgfQorCTsKKworCislJQorCitzdGF0aWMgdm9pZAoreXllcnJvcihjb25zdCBjaGFyICplKQoreworICBlcnJvcl93aXRoX3BvcygiJXMiLCBlKTsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2FsbHN5bXMuYyBiL3NjcmlwdHMva2FsbHN5bXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTBmZmRhCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rYWxsc3ltcy5jCkBAIC0wLDAgKzEsNjg2IEBACisvKiBHZW5lcmF0ZSBhc3NlbWJsZXIgc291cmNlIGNvbnRhaW5pbmcgc3ltYm9sIGluZm9ybWF0aW9uCisgKgorICogQ29weXJpZ2h0IDIwMDIgICAgICAgYnkgS2FpIEdlcm1hc2NoZXdza2kKKyAqCisgKiBUaGlzIHNvZnR3YXJlIG1heSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCBhY2NvcmRpbmcgdG8gdGhlIHRlcm1zCisgKiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsIGluY29ycG9yYXRlZCBoZXJlaW4gYnkgcmVmZXJlbmNlLgorICoKKyAqIFVzYWdlOiBubSAtbiB2bWxpbnV4IHwgc2NyaXB0cy9rYWxsc3ltcyBbLS1hbGwtc3ltYm9sc10gPiBzeW1ib2xzLlMKKyAqCisgKiBDaGFuZ2VMb2c6CisgKgorICogKDI1L0F1Zy8yMDA0KSBQYXVsbyBNYXJxdWVzIDxwbWFycXVlc0BncnVwb3BpZS5jb20+CisgKiAgICAgIENoYW5nZWQgdGhlIGNvbXByZXNzaW9uIG1ldGhvZCBmcm9tIHN0ZW0gY29tcHJlc3Npb24gdG8gInRhYmxlIGxvb2t1cCIKKyAqICAgICAgY29tcHJlc3Npb24KKyAqCisgKiAgICAgIFRhYmxlIGNvbXByZXNzaW9uIHVzZXMgYWxsIHRoZSB1bnVzZWQgY2hhciBjb2RlcyBvbiB0aGUgc3ltYm9scyBhbmQKKyAqICBtYXBzIHRoZXNlIHRvIHRoZSBtb3N0IHVzZWQgc3Vic3RyaW5ncyAodG9rZW5zKS4gRm9yIGluc3RhbmNlLCBpdCBtaWdodAorICogIG1hcCBjaGFyIGNvZGUgMHhGNyB0byByZXByZXNlbnQgIndyaXRlXyIgYW5kIHRoZW4gaW4gZXZlcnkgc3ltYm9sIHdoZXJlCisgKiAgIndyaXRlXyIgYXBwZWFycyBpdCBjYW4gYmUgcmVwbGFjZWQgYnkgMHhGNywgc2F2aW5nIDUgYnl0ZXMuCisgKiAgICAgIFRoZSB1c2VkIGNvZGVzIHRoZW1zZWx2ZXMgYXJlIGFsc28gcGxhY2VkIGluIHRoZSB0YWJsZSBzbyB0aGF0IHRoZQorICogIGRlY29tcHJlc2lvbiBjYW4gd29yayB3aXRob3V0ICJzcGVjaWFsIGNhc2VzIi4KKyAqICAgICAgQXBwbGllZCB0byBrZXJuZWwgc3ltYm9scywgdGhpcyB1c3VhbGx5IHByb2R1Y2VzIGEgY29tcHJlc3Npb24gcmF0aW8KKyAqICBvZiBhYm91dCA1MCUuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisKKy8qIG1heGltdW0gdG9rZW4gbGVuZ3RoIHVzZWQuIEl0IGRvZXNuJ3QgcGF5IHRvIGluY3JlYXNlIGl0IGEgbG90LCBiZWNhdXNlCisgKiB2ZXJ5IGxvbmcgc3Vic3RyaW5ncyBwcm9iYWJseSBkb24ndCByZXBlYXQgdGhlbXNlbHZlcyB0b28gb2Z0ZW4uICovCisjZGVmaW5lIE1BWF9UT0tfU0laRQkJMTEKKyNkZWZpbmUgS1NZTV9OQU1FX0xFTgkJMTI3CisKKy8qIHdlIHVzZSBvbmx5IGEgc3Vic2V0IG9mIHRoZSBjb21wbGV0ZSBzeW1ib2wgdGFibGUgdG8gZ2F0aGVyIHRoZSB0b2tlbiBjb3VudCwKKyAqIHRvIHNwZWVkIHVwIGNvbXByZXNzaW9uLCBhdCB0aGUgZXhwZW5zZSBvZiBhIGxpdHRsZSBjb21wcmVzc2lvbiByYXRpbyAqLworI2RlZmluZSBXT1JLSU5HX1NFVAkJMTAyNAorCisvKiBmaXJzdCBmaW5kIHRoZSBiZXN0IHRva2VuIG9ubHkgb24gdGhlIGxpc3Qgb2YgdG9rZW5zIHRoYXQgd291bGQgcHJvZml0IG1vcmUKKyAqIHRoYW4gR09PRF9CQURfVEhSRVNIT0xELiBPbmx5IGlmIHRoaXMgbGlzdCBpcyBlbXB0eSBnbyB0byB0aGUgImJhZCIgbGlzdC4KKyAqIEluY3JlYXNpbmcgdGhpcyB2YWx1ZSB3aWxsIHB1dCBsZXNzIHRva2VucyBvbiB0aGUgImdvb2QiIGxpc3QsIHNvIHRoZSBzZWFyY2gKKyAqIGlzIGZhc3Rlci4gSG93ZXZlciwgaWYgdGhlIGdvb2QgbGlzdCBydW5zIG91dCBvZiB0b2tlbnMsIHdlIG11c3QgcGFpbmZ1bGx5CisgKiBzZWFyY2ggdGhlIGJhZCBsaXN0LiAqLworI2RlZmluZSBHT09EX0JBRF9USFJFU0hPTEQJMTAKKworLyogdG9rZW4gaGFzaCBwYXJhbWV0ZXJzICovCisjZGVmaW5lIEhBU0hfQklUUwkJMTgKKyNkZWZpbmUgSEFTSF9UQUJMRV9TSVpFCQkoMSA8PCBIQVNIX0JJVFMpCisjZGVmaW5lIEhBU0hfTUFTSwkJKEhBU0hfVEFCTEVfU0laRSAtIDEpCisjZGVmaW5lIEhBU0hfQkFTRV9PRkZTRVQJMjE2NjEzNjI2MVUKKyNkZWZpbmUgSEFTSF9GT0xEKGEpCQkoKGEpJihIQVNIX01BU0spKQorCisvKiBmbGFncyB0byBtYXJrIHN5bWJvbHMgKi8KKyNkZWZpbmUgU1lNX0ZMQUdfVkFMSUQJCTEKKyNkZWZpbmUgU1lNX0ZMQUdfU0FNUExFRAkyCisKK3N0cnVjdCBzeW1fZW50cnkgeworCXVuc2lnbmVkIGxvbmcgbG9uZyBhZGRyOworCWNoYXIgdHlwZTsKKwl1bnNpZ25lZCBjaGFyIGZsYWdzOworCXVuc2lnbmVkIGNoYXIgbGVuOworCXVuc2lnbmVkIGNoYXIgKnN5bTsKK307CisKKworc3RhdGljIHN0cnVjdCBzeW1fZW50cnkgKnRhYmxlOworc3RhdGljIGludCBzaXplLCBjbnQ7CitzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nIF9zdGV4dCwgX2V0ZXh0LCBfc2luaXR0ZXh0LCBfZWluaXR0ZXh0Oworc3RhdGljIGludCBhbGxfc3ltYm9scyA9IDA7CisKK3N0cnVjdCB0b2tlbiB7CisJdW5zaWduZWQgY2hhciBkYXRhW01BWF9UT0tfU0laRV07CisJdW5zaWduZWQgY2hhciBsZW47CisJLyogcHJvZml0OiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgY291bGQgYmUgc2F2ZWQgYnkgaW5zZXJ0aW5nIHRoaXMKKwkgKiB0b2tlbiBpbnRvIHRoZSB0YWJsZSAqLworCWludCBwcm9maXQ7CisJc3RydWN0IHRva2VuICpuZXh0OwkvKiBuZXh0IHRva2VuIG9uIHRoZSBoYXNoIGxpc3QgKi8KKwlzdHJ1Y3QgdG9rZW4gKnJpZ2h0OwkvKiBuZXh0IHRva2VuIG9uIHRoZSBnb29kL2JhZCBsaXN0ICovCisJc3RydWN0IHRva2VuICpsZWZ0OyAgICAvKiBwcmV2aW91cyB0b2tlbiBvbiB0aGUgZ29vZC9iYWQgbGlzdCAqLworCXN0cnVjdCB0b2tlbiAqc21hbGxlcjsgLyogdG9rZW4gdGhhdCBpcyBsZXNzIG9uZSBsZXR0ZXIgdGhhbiB0aGlzIG9uZSAqLworCX07CisKK3N0cnVjdCB0b2tlbiBiYWRfaGVhZCwgZ29vZF9oZWFkOworc3RydWN0IHRva2VuICpoYXNoX3RhYmxlW0hBU0hfVEFCTEVfU0laRV07CisKKy8qIHRoZSB0YWJsZSB0aGF0IGhvbGRzIHRoZSByZXN1bHQgb2YgdGhlIGNvbXByZXNzaW9uICovCit1bnNpZ25lZCBjaGFyIGJlc3RfdGFibGVbMjU2XVtNQVhfVE9LX1NJWkUrMV07Cit1bnNpZ25lZCBjaGFyIGJlc3RfdGFibGVfbGVuWzI1Nl07CisKKworc3RhdGljIHZvaWQKK3VzYWdlKHZvaWQpCit7CisJZnByaW50ZihzdGRlcnIsICJVc2FnZToga2FsbHN5bXMgWy0tYWxsLXN5bWJvbHNdIDwgaW4ubWFwID4gb3V0LlNcbiIpOworCWV4aXQoMSk7Cit9CisKKy8qCisgKiBUaGlzIGlnbm9yZXMgdGhlIGludGVuc2VseSBhbm5veWluZyAibWFwcGluZyBzeW1ib2xzIiBmb3VuZAorICogaW4gQVJNIEVMRiBmaWxlczogJGEsICR0IGFuZCAkZC4KKyAqLworc3RhdGljIGlubGluZSBpbnQKK2lzX2FybV9tYXBwaW5nX3N5bWJvbChjb25zdCBjaGFyICpzdHIpCit7CisJcmV0dXJuIHN0clswXSA9PSAnJCcgJiYgc3RyY2hyKCJhdGQiLCBzdHJbMV0pCisJICAgICAgICYmIChzdHJbMl0gPT0gJ1wwJyB8fCBzdHJbMl0gPT0gJy4nKTsKK30KKworc3RhdGljIGludAorcmVhZF9zeW1ib2woRklMRSAqaW4sIHN0cnVjdCBzeW1fZW50cnkgKnMpCit7CisJY2hhciBzdHJbNTAwXTsKKwlpbnQgcmM7CisKKwlyYyA9IGZzY2FuZihpbiwgIiVsbHggJWMgJTQ5OXNcbiIsICZzLT5hZGRyLCAmcy0+dHlwZSwgc3RyKTsKKwlpZiAocmMgIT0gMykgeworCQlpZiAocmMgIT0gRU9GKSB7CisJCQkvKiBza2lwIGxpbmUgKi8KKwkJCWZnZXRzKHN0ciwgNTAwLCBpbik7CisJCX0KKwkJcmV0dXJuIC0xOworCX0KKworCS8qIElnbm9yZSBtb3N0IGFic29sdXRlL3VuZGVmaW5lZCAoPykgc3ltYm9scy4gKi8KKwlpZiAoc3RyY21wKHN0ciwgIl9zdGV4dCIpID09IDApCisJCV9zdGV4dCA9IHMtPmFkZHI7CisJZWxzZSBpZiAoc3RyY21wKHN0ciwgIl9ldGV4dCIpID09IDApCisJCV9ldGV4dCA9IHMtPmFkZHI7CisJZWxzZSBpZiAoc3RyY21wKHN0ciwgIl9zaW5pdHRleHQiKSA9PSAwKQorCQlfc2luaXR0ZXh0ID0gcy0+YWRkcjsKKwllbHNlIGlmIChzdHJjbXAoc3RyLCAiX2Vpbml0dGV4dCIpID09IDApCisJCV9laW5pdHRleHQgPSBzLT5hZGRyOworCWVsc2UgaWYgKHRvdXBwZXIocy0+dHlwZSkgPT0gJ0EnKQorCXsKKwkJLyogS2VlcCB0aGVzZSB1c2VmdWwgYWJzb2x1dGUgc3ltYm9scyAqLworCQlpZiAoc3RyY21wKHN0ciwgIl9fa2VybmVsX3N5c2NhbGxfdmlhX2JyZWFrIikgJiYKKwkJICAgIHN0cmNtcChzdHIsICJfX2tlcm5lbF9zeXNjYWxsX3ZpYV9lcGMiKSAmJgorCQkgICAgc3RyY21wKHN0ciwgIl9fa2VybmVsX3NpZ3RyYW1wIikgJiYKKwkJICAgIHN0cmNtcChzdHIsICJfX2dwIikpCisJCQlyZXR1cm4gLTE7CisKKwl9CisJZWxzZSBpZiAodG91cHBlcihzLT50eXBlKSA9PSAnVScgfHwKKwkJIGlzX2FybV9tYXBwaW5nX3N5bWJvbChzdHIpKQorCQlyZXR1cm4gLTE7CisKKwkvKiBpbmNsdWRlIHRoZSB0eXBlIGZpZWxkIGluIHRoZSBzeW1ib2wgbmFtZSwgc28gdGhhdCBpdCBnZXRzCisJICogY29tcHJlc3NlZCB0b2dldGhlciAqLworCXMtPmxlbiA9IHN0cmxlbihzdHIpICsgMTsKKwlzLT5zeW0gPSAoY2hhciAqKSBtYWxsb2Mocy0+bGVuICsgMSk7CisJc3RyY3B5KHMtPnN5bSArIDEsIHN0cik7CisJcy0+c3ltWzBdID0gcy0+dHlwZTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitzeW1ib2xfdmFsaWQoc3RydWN0IHN5bV9lbnRyeSAqcykKK3sKKwkvKiBTeW1ib2xzIHdoaWNoIHZhcnkgYmV0d2VlbiBwYXNzZXMuICBQYXNzZXMgMSBhbmQgMiBtdXN0IGhhdmUKKwkgKiBpZGVudGljYWwgc3ltYm9sIGxpc3RzLiAgVGhlIGthbGxzeW1zXyogc3ltYm9scyBiZWxvdyBhcmUgb25seSBhZGRlZAorCSAqIGFmdGVyIHBhc3MgMSwgdGhleSB3b3VsZCBiZSBpbmNsdWRlZCBpbiBwYXNzIDIgd2hlbiAtLWFsbC1zeW1ib2xzIGlzCisJICogc3BlY2lmaWVkIHNvIGV4Y2x1ZGUgdGhlbSB0byBnZXQgYSBzdGFibGUgc3ltYm9sIGxpc3QuCisJICovCisJc3RhdGljIGNoYXIgKnNwZWNpYWxfc3ltYm9sc1tdID0geworCQkia2FsbHN5bXNfYWRkcmVzc2VzIiwKKwkJImthbGxzeW1zX251bV9zeW1zIiwKKwkJImthbGxzeW1zX25hbWVzIiwKKwkJImthbGxzeW1zX21hcmtlcnMiLAorCQkia2FsbHN5bXNfdG9rZW5fdGFibGUiLAorCQkia2FsbHN5bXNfdG9rZW5faW5kZXgiLAorCisJLyogRXhjbHVkZSBsaW5rZXIgZ2VuZXJhdGVkIHN5bWJvbHMgd2hpY2ggdmFyeSBiZXR3ZWVuIHBhc3NlcyAqLworCQkiX1NEQV9CQVNFXyIsCQkvKiBwcGMgKi8KKwkJIl9TREEyX0JBU0VfIiwJCS8qIHBwYyAqLworCQlOVUxMIH07CisJaW50IGk7CisKKwkvKiBpZiAtLWFsbC1zeW1ib2xzIGlzIG5vdCBzcGVjaWZpZWQsIHRoZW4gc3ltYm9scyBvdXRzaWRlIHRoZSB0ZXh0CisJICogYW5kIGluaXR0ZXh0IHNlY3Rpb25zIGFyZSBkaXNjYXJkZWQgKi8KKwlpZiAoIWFsbF9zeW1ib2xzKSB7CisJCWlmICgocy0+YWRkciA8IF9zdGV4dCB8fCBzLT5hZGRyID4gX2V0ZXh0KQorCQkgICAgJiYgKHMtPmFkZHIgPCBfc2luaXR0ZXh0IHx8IHMtPmFkZHIgPiBfZWluaXR0ZXh0KSkKKwkJCXJldHVybiAwOworCQkvKiBDb3JuZXIgY2FzZS4gIERpc2NhcmQgYW55IHN5bWJvbHMgd2l0aCB0aGUgc2FtZSB2YWx1ZSBhcworCQkgKiBfZXRleHQgb3IgX2Vpbml0dGV4dCwgdGhleSBjYW4gbW92ZSBiZXR3ZWVuIHBhc3MgMSBhbmQgMgorCQkgKiB3aGVuIHRoZSBrYWxsc3ltcyBkYXRhIGlzIGFkZGVkLiAgSWYgdGhlc2Ugc3ltYm9scyBtb3ZlIHRoZW4KKwkJICogdGhleSBtYXkgZ2V0IGRyb3BwZWQgaW4gcGFzcyAyLCB3aGljaCBicmVha3MgdGhlIGthbGxzeW1zCisJCSAqIHJ1bGVzLgorCQkgKi8KKwkJaWYgKChzLT5hZGRyID09IF9ldGV4dCAmJiBzdHJjbXAocy0+c3ltICsgMSwgIl9ldGV4dCIpKSB8fAorCQkgICAgKHMtPmFkZHIgPT0gX2Vpbml0dGV4dCAmJiBzdHJjbXAocy0+c3ltICsgMSwgIl9laW5pdHRleHQiKSkpCisJCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBFeGNsdWRlIHN5bWJvbHMgd2hpY2ggdmFyeSBiZXR3ZWVuIHBhc3Nlcy4gKi8KKwlpZiAoc3Ryc3RyKHMtPnN5bSArIDEsICJfY29tcGlsZWQuIikpCisJCXJldHVybiAwOworCisJZm9yIChpID0gMDsgc3BlY2lhbF9zeW1ib2xzW2ldOyBpKyspCisJCWlmKCBzdHJjbXAocy0+c3ltICsgMSwgc3BlY2lhbF9zeW1ib2xzW2ldKSA9PSAwICkKKwkJCXJldHVybiAwOworCisJcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkCityZWFkX21hcChGSUxFICppbikKK3sKKwl3aGlsZSAoIWZlb2YoaW4pKSB7CisJCWlmIChjbnQgPj0gc2l6ZSkgeworCQkJc2l6ZSArPSAxMDAwMDsKKwkJCXRhYmxlID0gcmVhbGxvYyh0YWJsZSwgc2l6ZW9mKCp0YWJsZSkgKiBzaXplKTsKKwkJCWlmICghdGFibGUpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIm91dCBvZiBtZW1vcnlcbiIpOworCQkJCWV4aXQgKDEpOworCQkJfQorCQl9CisJCWlmIChyZWFkX3N5bWJvbChpbiwgJnRhYmxlW2NudF0pID09IDApCisJCQljbnQrKzsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIG91dHB1dF9sYWJlbChjaGFyICpsYWJlbCkKK3sKKwlwcmludGYoIi5nbG9ibCAlc1xuIixsYWJlbCk7CisJcHJpbnRmKCJcdEFMR05cbiIpOworCXByaW50ZigiJXM6XG4iLGxhYmVsKTsKK30KKworLyogdW5jb21wcmVzcyBhIGNvbXByZXNzZWQgc3ltYm9sLiBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGUgYmVzdCB0YWJsZQorICogbWlnaHQgc3RpbGwgYmUgY29tcHJlc3NlZCBpdHNlbGYsIHNvIHRoZSBmdW5jdGlvbiBuZWVkcyB0byBiZSByZWN1cnNpdmUgKi8KK3N0YXRpYyBpbnQgZXhwYW5kX3N5bWJvbCh1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuLCBjaGFyICpyZXN1bHQpCit7CisJaW50IGMsIHJsZW4sIHRvdGFsPTA7CisKKwl3aGlsZSAobGVuKSB7CisJCWMgPSAqZGF0YTsKKwkJLyogaWYgdGhlIHRhYmxlIGhvbGRzIGEgc2luZ2xlIGNoYXIgdGhhdCBpcyB0aGUgc2FtZSBhcyB0aGUgb25lCisJCSAqIHdlIGFyZSBsb29raW5nIGZvciwgdGhlbiBlbmQgdGhlIHNlYXJjaCAqLworCQlpZiAoYmVzdF90YWJsZVtjXVswXT09YyAmJiBiZXN0X3RhYmxlX2xlbltjXT09MSkgeworCQkJKnJlc3VsdCsrID0gYzsKKwkJCXRvdGFsKys7CisJCX0gZWxzZSB7CisJCQkvKiBpZiBub3QsIHJlY3Vyc2UgYW5kIGV4cGFuZCAqLworCQkJcmxlbiA9IGV4cGFuZF9zeW1ib2woYmVzdF90YWJsZVtjXSwgYmVzdF90YWJsZV9sZW5bY10sIHJlc3VsdCk7CisJCQl0b3RhbCArPSBybGVuOworCQkJcmVzdWx0ICs9IHJsZW47CisJCX0KKwkJZGF0YSsrOworCQlsZW4tLTsKKwl9CisJKnJlc3VsdD0wOworCisJcmV0dXJuIHRvdGFsOworfQorCitzdGF0aWMgdm9pZAord3JpdGVfc3JjKHZvaWQpCit7CisJaW50IGksIGssIG9mZiwgdmFsaWQ7CisJdW5zaWduZWQgaW50IGJlc3RfaWR4WzI1Nl07CisJdW5zaWduZWQgaW50ICptYXJrZXJzOworCWNoYXIgYnVmW0tTWU1fTkFNRV9MRU4rMV07CisKKwlwcmludGYoIiNpbmNsdWRlIDxhc20vdHlwZXMuaD5cbiIpOworCXByaW50ZigiI2lmIEJJVFNfUEVSX0xPTkcgPT0gNjRcbiIpOworCXByaW50ZigiI2RlZmluZSBQVFIgLnF1YWRcbiIpOworCXByaW50ZigiI2RlZmluZSBBTEdOIC5hbGlnbiA4XG4iKTsKKwlwcmludGYoIiNlbHNlXG4iKTsKKwlwcmludGYoIiNkZWZpbmUgUFRSIC5sb25nXG4iKTsKKwlwcmludGYoIiNkZWZpbmUgQUxHTiAuYWxpZ24gNFxuIik7CisJcHJpbnRmKCIjZW5kaWZcbiIpOworCisJcHJpbnRmKCIuZGF0YVxuIik7CisKKwlvdXRwdXRfbGFiZWwoImthbGxzeW1zX2FkZHJlc3NlcyIpOworCXZhbGlkID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsKKwkJaWYgKHRhYmxlW2ldLmZsYWdzICYgU1lNX0ZMQUdfVkFMSUQpIHsKKwkJCXByaW50ZigiXHRQVFJcdCUjbGx4XG4iLCB0YWJsZVtpXS5hZGRyKTsKKwkJCXZhbGlkKys7CisJCX0KKwl9CisJcHJpbnRmKCJcbiIpOworCisJb3V0cHV0X2xhYmVsKCJrYWxsc3ltc19udW1fc3ltcyIpOworCXByaW50ZigiXHRQVFJcdCVkXG4iLCB2YWxpZCk7CisJcHJpbnRmKCJcbiIpOworCisJLyogdGFibGUgb2Ygb2Zmc2V0IG1hcmtlcnMsIHRoYXQgZ2l2ZSB0aGUgb2Zmc2V0IGluIHRoZSBjb21wcmVzc2VkIHN0cmVhbQorCSAqIGV2ZXJ5IDI1NiBzeW1ib2xzICovCisJbWFya2VycyA9ICh1bnNpZ25lZCBpbnQgKikgbWFsbG9jKHNpemVvZih1bnNpZ25lZCBpbnQpKigodmFsaWQgKyAyNTUpIC8gMjU2KSk7CisKKwlvdXRwdXRfbGFiZWwoImthbGxzeW1zX25hbWVzIik7CisJdmFsaWQgPSAwOworCW9mZiA9IDA7CisJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisKKwkJaWYgKCF0YWJsZVtpXS5mbGFncyAmIFNZTV9GTEFHX1ZBTElEKQorCQkJY29udGludWU7CisKKwkJaWYgKCh2YWxpZCAmIDB4RkYpID09IDApCisJCQltYXJrZXJzW3ZhbGlkID4+IDhdID0gb2ZmOworCisJCXByaW50ZigiXHQuYnl0ZSAweCUwMngiLCB0YWJsZVtpXS5sZW4pOworCQlmb3IgKGsgPSAwOyBrIDwgdGFibGVbaV0ubGVuOyBrKyspCisJCQlwcmludGYoIiwgMHglMDJ4IiwgdGFibGVbaV0uc3ltW2tdKTsKKwkJcHJpbnRmKCJcbiIpOworCisJCW9mZiArPSB0YWJsZVtpXS5sZW4gKyAxOworCQl2YWxpZCsrOworCX0KKwlwcmludGYoIlxuIik7CisKKwlvdXRwdXRfbGFiZWwoImthbGxzeW1zX21hcmtlcnMiKTsKKwlmb3IgKGkgPSAwOyBpIDwgKCh2YWxpZCArIDI1NSkgPj4gOCk7IGkrKykKKwkJcHJpbnRmKCJcdFBUUlx0JWRcbiIsIG1hcmtlcnNbaV0pOworCXByaW50ZigiXG4iKTsKKworCWZyZWUobWFya2Vycyk7CisKKwlvdXRwdXRfbGFiZWwoImthbGxzeW1zX3Rva2VuX3RhYmxlIik7CisJb2ZmID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKKwkJYmVzdF9pZHhbaV0gPSBvZmY7CisJCWV4cGFuZF9zeW1ib2woYmVzdF90YWJsZVtpXSxiZXN0X3RhYmxlX2xlbltpXSxidWYpOworCQlwcmludGYoIlx0LmFzY2l6XHRcIiVzXCJcbiIsIGJ1Zik7CisJCW9mZiArPSBzdHJsZW4oYnVmKSArIDE7CisJfQorCXByaW50ZigiXG4iKTsKKworCW91dHB1dF9sYWJlbCgia2FsbHN5bXNfdG9rZW5faW5kZXgiKTsKKwlmb3IgKGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCXByaW50ZigiXHQuc2hvcnRcdCVkXG4iLCBiZXN0X2lkeFtpXSk7CisJcHJpbnRmKCJcbiIpOworfQorCisKKy8qIHRhYmxlIGxvb2t1cCBjb21wcmVzc2lvbiBmdW5jdGlvbnMgKi8KKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgcmVoYXNoX3Rva2VuKHVuc2lnbmVkIGludCBoYXNoLCB1bnNpZ25lZCBjaGFyIGRhdGEpCit7CisJcmV0dXJuICgoaGFzaCAqIDE2Nzc3NjE5KSBeIGRhdGEpOworfQorCitzdGF0aWMgdW5zaWduZWQgaW50IGhhc2hfdG9rZW4odW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwl1bnNpZ25lZCBpbnQgaGFzaD1IQVNIX0JBU0VfT0ZGU0VUOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKQorCQloYXNoID0gcmVoYXNoX3Rva2VuKGhhc2gsIGRhdGFbaV0pOworCisJcmV0dXJuIEhBU0hfRk9MRChoYXNoKTsKK30KKworLyogZmluZCBhIHRva2VuIGdpdmVuIGl0cyBkYXRhIGFuZCBoYXNoIHZhbHVlICovCitzdGF0aWMgc3RydWN0IHRva2VuICpmaW5kX3Rva2VuX2hhc2godW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbiwgdW5zaWduZWQgaW50IGhhc2gpCit7CisJc3RydWN0IHRva2VuICpwdHI7CisKKwlwdHIgPSBoYXNoX3RhYmxlW2hhc2hdOworCisJd2hpbGUgKHB0cikgeworCQlpZiAoKHB0ci0+bGVuID09IGxlbikgJiYgKG1lbWNtcChwdHItPmRhdGEsIGRhdGEsIGxlbikgPT0gMCkpCisJCQlyZXR1cm4gcHRyOworCQlwdHI9cHRyLT5uZXh0OworCX0KKworCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQgaW5zZXJ0X3Rva2VuX2luX2dyb3VwKHN0cnVjdCB0b2tlbiAqaGVhZCwgc3RydWN0IHRva2VuICpwdHIpCit7CisJcHRyLT5yaWdodCA9IGhlYWQtPnJpZ2h0OworCXB0ci0+cmlnaHQtPmxlZnQgPSBwdHI7CisJaGVhZC0+cmlnaHQgPSBwdHI7CisJcHRyLT5sZWZ0ID0gaGVhZDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIHJlbW92ZV90b2tlbl9mcm9tX2dyb3VwKHN0cnVjdCB0b2tlbiAqcHRyKQoreworCXB0ci0+bGVmdC0+cmlnaHQgPSBwdHItPnJpZ2h0OworCXB0ci0+cmlnaHQtPmxlZnQgPSBwdHItPmxlZnQ7Cit9CisKKworLyogYnVpbGQgdGhlIGNvdW50cyBmb3IgYWxsIHRoZSB0b2tlbnMgdGhhdCBzdGFydCB3aXRoICJkYXRhIiwgYW5kIGhhdmUgbGVuZ2h0cworICogZnJvbSAyIHRvICJsZW4iICovCitzdGF0aWMgdm9pZCBsZWFybl90b2tlbih1bnNpZ25lZCBjaGFyICpkYXRhLCBpbnQgbGVuKQoreworCXN0cnVjdCB0b2tlbiAqcHRyLCpsYXN0X3B0cjsKKwlpbnQgaSwgbmV3cHJvZml0OworCXVuc2lnbmVkIGludCBoYXNoID0gSEFTSF9CQVNFX09GRlNFVDsKKwl1bnNpZ25lZCBpbnQgaGFzaGVzW01BWF9UT0tfU0laRSArIDFdOworCisJaWYgKGxlbiA+IE1BWF9UT0tfU0laRSkKKwkJbGVuID0gTUFYX1RPS19TSVpFOworCisJLyogY2FsY3VsYXRlIGFuZCBzdG9yZSB0aGUgaGFzaCB2YWx1ZXMgZm9yIGFsbCB0aGUgc3ViLXRva2VucyAqLworCWhhc2ggPSByZWhhc2hfdG9rZW4oaGFzaCwgZGF0YVswXSk7CisJZm9yIChpID0gMjsgaSA8PSBsZW47IGkrKykgeworCQloYXNoID0gcmVoYXNoX3Rva2VuKGhhc2gsIGRhdGFbaS0xXSk7CisJCWhhc2hlc1tpXSA9IEhBU0hfRk9MRChoYXNoKTsKKwl9CisKKwlsYXN0X3B0ciA9IE5VTEw7CisJcHRyID0gTlVMTDsKKworCWZvciAoaSA9IGxlbjsgaSA+PSAyOyBpLS0pIHsKKwkJaGFzaCA9IGhhc2hlc1tpXTsKKworCQlpZiAoIXB0cikgcHRyID0gZmluZF90b2tlbl9oYXNoKGRhdGEsIGksIGhhc2gpOworCisJCWlmICghcHRyKSB7CisJCQkvKiBjcmVhdGUgYSBuZXcgdG9rZW4gZW50cnkgKi8KKwkJCXB0ciA9IChzdHJ1Y3QgdG9rZW4gKikgbWFsbG9jKHNpemVvZigqcHRyKSk7CisKKwkJCW1lbWNweShwdHItPmRhdGEsIGRhdGEsIGkpOworCQkJcHRyLT5sZW4gPSBpOworCisJCQkvKiB3aGVuIHdlIGNyZWF0ZSBhbiBlbnRyeSwgaXQncyBwcm9maXQgaXMgMCBiZWNhdXNlCisJCQkgKiB3ZSBhbHNvIHRha2UgaW50byBhY2NvdW50IHRoZSBzaXplIG9mIHRoZSB0b2tlbiBvbgorCQkJICogdGhlIGNvbXByZXNzZWQgdGFibGUuIFdlIHRoZW4gc3VidHJhY3QgR09PRF9CQURfVEhSRVNIT0xECisJCQkgKiBzbyB0aGF0IHRoZSB0ZXN0IHRvIHNlZSBpZiB0aGlzIHRva2VuIGJlbG9uZ3MgdG8KKwkJCSAqIHRoZSBnb29kIG9yIGJhZCBsaXN0LCBpcyBhIGNvbXBhcmlzb24gdG8gemVybyAqLworCQkJcHRyLT5wcm9maXQgPSAtR09PRF9CQURfVEhSRVNIT0xEOworCisJCQlwdHItPm5leHQgPSBoYXNoX3RhYmxlW2hhc2hdOworCQkJaGFzaF90YWJsZVtoYXNoXSA9IHB0cjsKKworCQkJaW5zZXJ0X3Rva2VuX2luX2dyb3VwKCZiYWRfaGVhZCwgcHRyKTsKKworCQkJcHRyLT5zbWFsbGVyID0gTlVMTDsKKwkJfSBlbHNlIHsKKwkJCW5ld3Byb2ZpdCA9IHB0ci0+cHJvZml0ICsgKHB0ci0+bGVuIC0gMSk7CisJCQkvKiBjaGVjayB0byBzZWUgaWYgdGhpcyB0b2tlbiBuZWVkcyB0byBiZSBtb3ZlZCB0byBhCisJCQkgKiBkaWZmZXJlbnQgbGlzdCAqLworCQkJaWYoKHB0ci0+cHJvZml0IDwgMCkgJiYgKG5ld3Byb2ZpdCA+PSAwKSkgeworCQkJCXJlbW92ZV90b2tlbl9mcm9tX2dyb3VwKHB0cik7CisJCQkJaW5zZXJ0X3Rva2VuX2luX2dyb3VwKCZnb29kX2hlYWQscHRyKTsKKwkJCX0KKwkJCXB0ci0+cHJvZml0ID0gbmV3cHJvZml0OworCQl9CisKKwkJaWYgKGxhc3RfcHRyKSBsYXN0X3B0ci0+c21hbGxlciA9IHB0cjsKKwkJbGFzdF9wdHIgPSBwdHI7CisKKwkJcHRyID0gcHRyLT5zbWFsbGVyOworCX0KK30KKworLyogZGVjcmVhc2UgdGhlIGNvdW50cyBmb3IgYWxsIHRoZSB0b2tlbnMgdGhhdCBzdGFydCB3aXRoICJkYXRhIiwgYW5kIGhhdmUgbGVuZ2h0cworICogZnJvbSAyIHRvICJsZW4iLiBUaGlzIGZ1bmN0aW9uIGlzIG11Y2ggc2ltcGxlciB0aGFuIGxlYXJuX3Rva2VuIGJlY2F1c2Ugd2UgaGF2ZQorICogbW9yZSBndWFyYW50ZWVzICh0aG8gdG9rZW5zIGV4aXN0LCB0aGUgLT5zbWFsbGVyIHBvaW50ZXIgaXMgc2V0LCBldGMuKQorICogVGhlIHR3byBzZXBhcmF0ZSBmdW5jdGlvbnMgZXhpc3Qgb25seSBiZWNhdXNlIG9mIGNvbXByZXNzaW9uIHBlcmZvcm1hbmNlICovCitzdGF0aWMgdm9pZCBmb3JnZXRfdG9rZW4odW5zaWduZWQgY2hhciAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgdG9rZW4gKnB0cjsKKwlpbnQgaSwgbmV3cHJvZml0OworCXVuc2lnbmVkIGludCBoYXNoPTA7CisKKwlpZiAobGVuID4gTUFYX1RPS19TSVpFKSBsZW4gPSBNQVhfVE9LX1NJWkU7CisKKwloYXNoID0gaGFzaF90b2tlbihkYXRhLCBsZW4pOworCXB0ciA9IGZpbmRfdG9rZW5faGFzaChkYXRhLCBsZW4sIGhhc2gpOworCisJZm9yIChpID0gbGVuOyBpID49IDI7IGktLSkgeworCisJCW5ld3Byb2ZpdCA9IHB0ci0+cHJvZml0IC0gKHB0ci0+bGVuIC0gMSk7CisJCWlmICgocHRyLT5wcm9maXQgPj0gMCkgJiYgKG5ld3Byb2ZpdCA8IDApKSB7CisJCQlyZW1vdmVfdG9rZW5fZnJvbV9ncm91cChwdHIpOworCQkJaW5zZXJ0X3Rva2VuX2luX2dyb3VwKCZiYWRfaGVhZCwgcHRyKTsKKwkJfQorCQlwdHItPnByb2ZpdD1uZXdwcm9maXQ7CisKKwkJcHRyPXB0ci0+c21hbGxlcjsKKwl9Cit9CisKKy8qIGNvdW50IGFsbCB0aGUgcG9zc2libGUgdG9rZW5zIGluIGEgc3ltYm9sICovCitzdGF0aWMgdm9pZCBsZWFybl9zeW1ib2wodW5zaWduZWQgY2hhciAqc3ltYm9sLCBpbnQgbGVuKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGxlbiAtIDE7IGkrKykKKwkJbGVhcm5fdG9rZW4oc3ltYm9sICsgaSwgbGVuIC0gaSk7Cit9CisKKy8qIGRlY3JlYXNlIHRoZSBjb3VudCBmb3IgYWxsIHRoZSBwb3NzaWJsZSB0b2tlbnMgaW4gYSBzeW1ib2wgKi8KK3N0YXRpYyB2b2lkIGZvcmdldF9zeW1ib2wodW5zaWduZWQgY2hhciAqc3ltYm9sLCBpbnQgbGVuKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IGxlbiAtIDE7IGkrKykKKwkJZm9yZ2V0X3Rva2VuKHN5bWJvbCArIGksIGxlbiAtIGkpOworfQorCisvKiBzZXQgYWxsIHRoZSBzeW1ib2wgZmxhZ3MgYW5kIGRvIHRoZSBpbml0aWFsIHRva2VuIGNvdW50ICovCitzdGF0aWMgdm9pZCBidWlsZF9pbml0aWFsX3Rva190YWJsZSh2b2lkKQoreworCWludCBpLCB1c2VfaXQsIHZhbGlkOworCisJdmFsaWQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworCQl0YWJsZVtpXS5mbGFncyA9IDA7CisJCWlmICggc3ltYm9sX3ZhbGlkKCZ0YWJsZVtpXSkgKSB7CisJCQl0YWJsZVtpXS5mbGFncyB8PSBTWU1fRkxBR19WQUxJRDsKKwkJCXZhbGlkKys7CisJCX0KKwl9CisKKwl1c2VfaXQgPSAwOworCWZvciAoaSA9IDA7IGkgPCBjbnQ7IGkrKykgeworCisJCS8qIHN1YnNhbXBsZSB0aGUgYXZhaWxhYmxlIHN5bWJvbHMuIFRoaXMgbWV0aG9kIGlzIGFsbW9zdCBsaWtlCisJCSAqIGEgQnJlc2VuaGFtJ3MgYWxnb3JpdGhtIHRvIGdldCB1bmlmb3JtbHkgZGlzdHJpYnV0ZWQgc2FtcGxlcworCQkgKiBhY3Jvc3MgdGhlIHN5bWJvbCB0YWJsZSAqLworCQlpZiAodGFibGVbaV0uZmxhZ3MgJiBTWU1fRkxBR19WQUxJRCkgeworCisJCQl1c2VfaXQgKz0gV09SS0lOR19TRVQ7CisKKwkJCWlmICh1c2VfaXQgPj0gdmFsaWQpIHsKKwkJCQl0YWJsZVtpXS5mbGFncyB8PSBTWU1fRkxBR19TQU1QTEVEOworCQkJCXVzZV9pdCAtPSB2YWxpZDsKKwkJCX0KKwkJfQorCQlpZiAodGFibGVbaV0uZmxhZ3MgJiBTWU1fRkxBR19TQU1QTEVEKQorCQkJbGVhcm5fc3ltYm9sKHRhYmxlW2ldLnN5bSwgdGFibGVbaV0ubGVuKTsKKwl9Cit9CisKKy8qIHJlcGxhY2UgYSBnaXZlbiB0b2tlbiBpbiBhbGwgdGhlIHZhbGlkIHN5bWJvbHMuIFVzZSB0aGUgc2FtcGxlZCBzeW1ib2xzCisgKiB0byB1cGRhdGUgdGhlIGNvdW50cyAqLworc3RhdGljIHZvaWQgY29tcHJlc3Nfc3ltYm9scyh1bnNpZ25lZCBjaGFyICpzdHIsIGludCB0bGVuLCBpbnQgaWR4KQoreworCWludCBpLCBsZW4sIGxlYXJuLCBzaXplOworCXVuc2lnbmVkIGNoYXIgKnA7CisKKwlmb3IgKGkgPSAwOyBpIDwgY250OyBpKyspIHsKKworCQlpZiAoISh0YWJsZVtpXS5mbGFncyAmIFNZTV9GTEFHX1ZBTElEKSkgY29udGludWU7CisKKwkJbGVuID0gdGFibGVbaV0ubGVuOworCQlsZWFybiA9IDA7CisJCXAgPSB0YWJsZVtpXS5zeW07CisKKwkJZG8geworCQkJLyogZmluZCB0aGUgdG9rZW4gb24gdGhlIHN5bWJvbCAqLworCQkJcCA9ICh1bnNpZ25lZCBjaGFyICopIHN0cnN0cigoY2hhciAqKSBwLCAoY2hhciAqKSBzdHIpOworCQkJaWYgKCFwKSBicmVhazsKKworCQkJaWYgKCFsZWFybikgeworCQkJCS8qIGlmIHRoaXMgc3ltYm9sIHdhcyB1c2VkIHRvIGNvdW50LCBkZWNyZWFzZSBpdCAqLworCQkJCWlmICh0YWJsZVtpXS5mbGFncyAmIFNZTV9GTEFHX1NBTVBMRUQpCisJCQkJCWZvcmdldF9zeW1ib2wodGFibGVbaV0uc3ltLCBsZW4pOworCQkJCWxlYXJuID0gMTsKKwkJCX0KKworCQkJKnAgPSBpZHg7CisJCQlzaXplID0gKGxlbiAtIChwIC0gdGFibGVbaV0uc3ltKSkgLSB0bGVuICsgMTsKKwkJCW1lbW1vdmUocCArIDEsIHAgKyB0bGVuLCBzaXplKTsKKwkJCXArKzsKKwkJCWxlbiAtPSB0bGVuIC0gMTsKKworCQl9IHdoaWxlIChzaXplID49IHRsZW4pOworCisJCWlmKGxlYXJuKSB7CisJCQl0YWJsZVtpXS5sZW4gPSBsZW47CisJCQkvKiBpZiB0aGlzIHN5bWJvbCB3YXMgdXNlZCB0byBjb3VudCwgbGVhcm4gaXQgYWdhaW4gKi8KKwkJCWlmKHRhYmxlW2ldLmZsYWdzICYgU1lNX0ZMQUdfU0FNUExFRCkKKwkJCQlsZWFybl9zeW1ib2wodGFibGVbaV0uc3ltLCBsZW4pOworCQl9CisJfQorfQorCisvKiBzZWFyY2ggdGhlIHRva2VuIHdpdGggdGhlIG1heGltdW0gcHJvZml0ICovCitzdGF0aWMgc3RydWN0IHRva2VuICpmaW5kX2Jlc3RfdG9rZW4odm9pZCkKK3sKKwlzdHJ1Y3QgdG9rZW4gKnB0ciwqYmVzdCwqaGVhZDsKKwlpbnQgYmVzdHByb2ZpdDsKKworCWJlc3Rwcm9maXQ9LTEwMDAwOworCisJLyogZmFpbHNhZmU6IGlmIHRoZSAiZ29vZCIgbGlzdCBpcyBlbXB0eSBzZWFyY2ggZnJvbSB0aGUgImJhZCIgbGlzdCAqLworCWlmKGdvb2RfaGVhZC5yaWdodCA9PSAmZ29vZF9oZWFkKSBoZWFkID0gJmJhZF9oZWFkOworCWVsc2UgaGVhZCA9ICZnb29kX2hlYWQ7CisKKwlwdHIgPSBoZWFkLT5yaWdodDsKKwliZXN0ID0gTlVMTDsKKwl3aGlsZSAocHRyICE9IGhlYWQpIHsKKwkJaWYgKHB0ci0+cHJvZml0ID4gYmVzdHByb2ZpdCkgeworCQkJYmVzdHByb2ZpdCA9IHB0ci0+cHJvZml0OworCQkJYmVzdCA9IHB0cjsKKwkJfQorCQlwdHIgPSBwdHItPnJpZ2h0OworCX0KKworCXJldHVybiBiZXN0OworfQorCisvKiB0aGlzIGlzIHRoZSBjb3JlIG9mIHRoZSBhbGdvcml0aG06IGNhbGN1bGF0ZSB0aGUgImJlc3QiIHRhYmxlICovCitzdGF0aWMgdm9pZCBvcHRpbWl6ZV9yZXN1bHQodm9pZCkKK3sKKwlzdHJ1Y3QgdG9rZW4gKmJlc3Q7CisJaW50IGk7CisKKwkvKiB1c2luZyB0aGUgJ1wwJyBzeW1ib2wgbGFzdCBhbGxvd3MgY29tcHJlc3Nfc3ltYm9scyB0byB1c2Ugc3RhbmRhcmQKKwkgKiBmYXN0IHN0cmluZyBmdW5jdGlvbnMgKi8KKwlmb3IgKGkgPSAyNTU7IGkgPj0gMDsgaS0tKSB7CisKKwkJLyogaWYgdGhpcyB0YWJsZSBzbG90IGlzIGVtcHR5IChpdCBpcyBub3QgdXNlZCBieSBhbiBhY3R1YWwKKwkJICogb3JpZ2luYWwgY2hhciBjb2RlICovCisJCWlmICghYmVzdF90YWJsZV9sZW5baV0pIHsKKworCQkJLyogZmluZCB0aGUgdG9rZW4gd2l0aCB0aGUgYnJlYXRlcyBwcm9maXQgdmFsdWUgKi8KKwkJCWJlc3QgPSBmaW5kX2Jlc3RfdG9rZW4oKTsKKworCQkJLyogcGxhY2UgaXQgaW4gdGhlICJiZXN0IiB0YWJsZSAqLworCQkJYmVzdF90YWJsZV9sZW5baV0gPSBiZXN0LT5sZW47CisJCQltZW1jcHkoYmVzdF90YWJsZVtpXSwgYmVzdC0+ZGF0YSwgYmVzdF90YWJsZV9sZW5baV0pOworCQkJLyogemVybyB0ZXJtaW5hdGUgdGhlIHRva2VuIHNvIHRoYXQgd2UgY2FuIHVzZSBzdHJzdHIKKwkJCSAgIGluIGNvbXByZXNzX3N5bWJvbHMgKi8KKwkJCWJlc3RfdGFibGVbaV1bYmVzdF90YWJsZV9sZW5baV1dPSdcMCc7CisKKwkJCS8qIHJlcGxhY2UgdGhpcyB0b2tlbiBpbiBhbGwgdGhlIHZhbGlkIHN5bWJvbHMgKi8KKwkJCWNvbXByZXNzX3N5bWJvbHMoYmVzdF90YWJsZVtpXSwgYmVzdF90YWJsZV9sZW5baV0sIGkpOworCQl9CisJfQorfQorCisvKiBzdGFydCBieSBwbGFjaW5nIHRoZSBzeW1ib2xzIHRoYXQgYXJlIGFjdHVhbGx5IHVzZWQgb24gdGhlIHRhYmxlICovCitzdGF0aWMgdm9pZCBpbnNlcnRfcmVhbF9zeW1ib2xzX2luX3RhYmxlKHZvaWQpCit7CisJaW50IGksIGosIGM7CisKKwltZW1zZXQoYmVzdF90YWJsZSwgMCwgc2l6ZW9mKGJlc3RfdGFibGUpKTsKKwltZW1zZXQoYmVzdF90YWJsZV9sZW4sIDAsIHNpemVvZihiZXN0X3RhYmxlX2xlbikpOworCisJZm9yIChpID0gMDsgaSA8IGNudDsgaSsrKSB7CisJCWlmICh0YWJsZVtpXS5mbGFncyAmIFNZTV9GTEFHX1ZBTElEKSB7CisJCQlmb3IgKGogPSAwOyBqIDwgdGFibGVbaV0ubGVuOyBqKyspIHsKKwkJCQljID0gdGFibGVbaV0uc3ltW2pdOworCQkJCWJlc3RfdGFibGVbY11bMF09YzsKKwkJCQliZXN0X3RhYmxlX2xlbltjXT0xOworCQkJfQorCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBvcHRpbWl6ZV90b2tlbl90YWJsZSh2b2lkKQoreworCW1lbXNldChoYXNoX3RhYmxlLCAwLCBzaXplb2YoaGFzaF90YWJsZSkpOworCisJZ29vZF9oZWFkLmxlZnQgPSAmZ29vZF9oZWFkOworCWdvb2RfaGVhZC5yaWdodCA9ICZnb29kX2hlYWQ7CisKKwliYWRfaGVhZC5sZWZ0ID0gJmJhZF9oZWFkOworCWJhZF9oZWFkLnJpZ2h0ID0gJmJhZF9oZWFkOworCisJYnVpbGRfaW5pdGlhbF90b2tfdGFibGUoKTsKKworCWluc2VydF9yZWFsX3N5bWJvbHNfaW5fdGFibGUoKTsKKworCW9wdGltaXplX3Jlc3VsdCgpOworfQorCisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaWYgKGFyZ2MgPT0gMiAmJiBzdHJjbXAoYXJndlsxXSwgIi0tYWxsLXN5bWJvbHMiKSA9PSAwKQorCQlhbGxfc3ltYm9scyA9IDE7CisJZWxzZSBpZiAoYXJnYyAhPSAxKQorCQl1c2FnZSgpOworCisJcmVhZF9tYXAoc3RkaW4pOworCW9wdGltaXplX3Rva2VuX3RhYmxlKCk7CisJd3JpdGVfc3JjKCk7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL01ha2VmaWxlIGIvc2NyaXB0cy9rY29uZmlnL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhNWRkYzQKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvTWFrZWZpbGUKQEAgLTAsMCArMSwyMDggQEAKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIEtlcm5lbCBjb25maWd1cmF0aW9uIHRhcmdldHMKKyMgVGhlc2UgdGFyZ2V0cyBhcmUgdXNlZCBmcm9tIHRvcC1sZXZlbCBtYWtlZmlsZQorCisuUEhPTlk6IG9sZGNvbmZpZyB4Y29uZmlnIGdjb25maWcgbWVudWNvbmZpZyBjb25maWcgc2lsZW50b2xkY29uZmlnCisKK3hjb25maWc6ICQob2JqKS9xY29uZgorCSQ8IGFyY2gvJChBUkNIKS9LY29uZmlnCisKK2djb25maWc6ICQob2JqKS9nY29uZgorCSQ8IGFyY2gvJChBUkNIKS9LY29uZmlnCisKK21lbnVjb25maWc6ICQob2JqKS9tY29uZgorCSQoUSkkKE1BS0UpICQoYnVpbGQpPXNjcmlwdHMvbHhkaWFsb2cKKwkkPCBhcmNoLyQoQVJDSCkvS2NvbmZpZworCitjb25maWc6ICQob2JqKS9jb25mCisJJDwgYXJjaC8kKEFSQ0gpL0tjb25maWcKKworb2xkY29uZmlnOiAkKG9iaikvY29uZgorCSQ8IC1vIGFyY2gvJChBUkNIKS9LY29uZmlnCisKK3NpbGVudG9sZGNvbmZpZzogJChvYmopL2NvbmYKKwkkPCAtcyBhcmNoLyQoQVJDSCkvS2NvbmZpZworCisuUEhPTlk6IHJhbmRjb25maWcgYWxseWVzY29uZmlnIGFsbG5vY29uZmlnIGFsbG1vZGNvbmZpZyBkZWZjb25maWcKKworcmFuZGNvbmZpZzogJChvYmopL2NvbmYKKwkkPCAtciBhcmNoLyQoQVJDSCkvS2NvbmZpZworCithbGx5ZXNjb25maWc6ICQob2JqKS9jb25mCisJJDwgLXkgYXJjaC8kKEFSQ0gpL0tjb25maWcKKworYWxsbm9jb25maWc6ICQob2JqKS9jb25mCisJJDwgLW4gYXJjaC8kKEFSQ0gpL0tjb25maWcKKworYWxsbW9kY29uZmlnOiAkKG9iaikvY29uZgorCSQ8IC1tIGFyY2gvJChBUkNIKS9LY29uZmlnCisKK2RlZmNvbmZpZzogJChvYmopL2NvbmYKK2lmZXEgKCQoS0JVSUxEX0RFRkNPTkZJRyksKQorCSQ8IC1kIGFyY2gvJChBUkNIKS9LY29uZmlnCitlbHNlCisJQGVjaG8gKioqIERlZmF1bHQgY29uZmlndXJhdGlvbiBpcyBiYXNlZCBvbiAnJChLQlVJTERfREVGQ09ORklHKScKKwkkKFEpJDwgLUQgYXJjaC8kKEFSQ0gpL2NvbmZpZ3MvJChLQlVJTERfREVGQ09ORklHKSBhcmNoLyQoQVJDSCkvS2NvbmZpZworZW5kaWYKKworJV9kZWZjb25maWc6ICQob2JqKS9jb25mCisJJChRKSQ8IC1EIGFyY2gvJChBUkNIKS9jb25maWdzLyRAIGFyY2gvJChBUkNIKS9LY29uZmlnCisKKyMgSGVscCB0ZXh0IHVzZWQgYnkgbWFrZSBoZWxwCitoZWxwOgorCUBlY2hvICAnICBjb25maWcJICAtIFVwZGF0ZSBjdXJyZW50IGNvbmZpZyB1dGlsaXNpbmcgYSBsaW5lLW9yaWVudGVkIHByb2dyYW0nCisJQGVjaG8gICcgIG1lbnVjb25maWcJICAtIFVwZGF0ZSBjdXJyZW50IGNvbmZpZyB1dGlsaXNpbmcgYSBtZW51IGJhc2VkIHByb2dyYW0nCisJQGVjaG8gICcgIHhjb25maWcJICAtIFVwZGF0ZSBjdXJyZW50IGNvbmZpZyB1dGlsaXNpbmcgYSBRVCBiYXNlZCBmcm9udC1lbmQnCisJQGVjaG8gICcgIGdjb25maWcJICAtIFVwZGF0ZSBjdXJyZW50IGNvbmZpZyB1dGlsaXNpbmcgYSBHVEsgYmFzZWQgZnJvbnQtZW5kJworCUBlY2hvICAnICBvbGRjb25maWcJICAtIFVwZGF0ZSBjdXJyZW50IGNvbmZpZyB1dGlsaXNpbmcgYSBwcm92aWRlZCAuY29uZmlnIGFzIGJhc2UnCisJQGVjaG8gICcgIHJhbmRjb25maWcJICAtIE5ldyBjb25maWcgd2l0aCByYW5kb20gYW5zd2VyIHRvIGFsbCBvcHRpb25zJworCUBlY2hvICAnICBkZWZjb25maWcJICAtIE5ldyBjb25maWcgd2l0aCBkZWZhdWx0IGFuc3dlciB0byBhbGwgb3B0aW9ucycKKwlAZWNobyAgJyAgYWxsbW9kY29uZmlnCSAgLSBOZXcgY29uZmlnIHNlbGVjdGluZyBtb2R1bGVzIHdoZW4gcG9zc2libGUnCisJQGVjaG8gICcgIGFsbHllc2NvbmZpZwkgIC0gTmV3IGNvbmZpZyB3aGVyZSBhbGwgb3B0aW9ucyBhcmUgYWNjZXB0ZWQgd2l0aCB5ZXMnCisJQGVjaG8gICcgIGFsbG5vY29uZmlnCSAgLSBOZXcgbWluaW1hbCBjb25maWcnCisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjIFNoYXJlZCBNYWtlZmlsZSBmb3IgdGhlIHZhcmlvdXMga2NvbmZpZyBleGVjdXRhYmxlczoKKyMgY29uZjoJICBVc2VkIGZvciBkZWZjb25maWcsIG9sZGNvbmZpZyBhbmQgcmVsYXRlZCB0YXJnZXRzCisjIG1jb25mOiAgVXNlZCBmb3IgdGhlIG1jb25maWcgdGFyZ2V0LgorIyAgICAgICAgIFV0aWxpemVzIHRoZSBseGRpYWxvZyBwYWNrYWdlCisjIHFjb25mOiAgVXNlZCBmb3IgdGhlIHhjb25maWcgdGFyZ2V0CisjICAgICAgICAgQmFzZWQgb24gUVQgd2hpY2ggbmVlZHMgdG8gYmUgaW5zdGFsbGVkIHRvIGNvbXBpbGUgaXQKKyMgZ2NvbmY6ICBVc2VkIGZvciB0aGUgZ2NvbmZpZyB0YXJnZXQKKyMgICAgICAgICBCYXNlZCBvbiBHVEsgd2hpY2ggbmVlZHMgdG8gYmUgaW5zdGFsbGVkIHRvIGNvbXBpbGUgaXQKKyMgb2JqZWN0IGZpbGVzIHVzZWQgYnkgYWxsIGtjb25maWcgZmxhdm91cnMKKworaG9zdHByb2dzLXkJOj0gY29uZiBtY29uZiBxY29uZiBnY29uZgorY29uZi1vYmpzCTo9IGNvbmYubyAgemNvbmYudGFiLm8KK21jb25mLW9ianMJOj0gbWNvbmYubyB6Y29uZi50YWIubworCitpZmVxICgkKE1BS0VDTURHT0FMUykseGNvbmZpZykKKwlxY29uZi10YXJnZXQgOj0gMQorZW5kaWYKK2lmZXEgKCQoTUFLRUNNREdPQUxTKSxnY29uZmlnKQorCWdjb25mLXRhcmdldCA6PSAxCitlbmRpZgorCisKK2lmZXEgKCQocWNvbmYtdGFyZ2V0KSwxKQorcWNvbmYtY3h4b2Jqcwk6PSBxY29uZi5vCitxY29uZi1vYmpzCTo9IGtjb25maWdfbG9hZC5vIHpjb25mLnRhYi5vCitlbmRpZgorCitpZmVxICgkKGdjb25mLXRhcmdldCksMSkKK2djb25mLW9ianMJOj0gZ2NvbmYubyBrY29uZmlnX2xvYWQubyB6Y29uZi50YWIubworZW5kaWYKKworY2xlYW4tZmlsZXMJOj0gbGtjX2RlZnMuaCBxY29uZi5tb2MgLnRtcF9xdGNoZWNrIFwKKwkJICAgLnRtcF9ndGtjaGVjayB6Y29uZi50YWIuYyB6Y29uZi50YWIuaCBsZXguemNvbmYuYworCisjIGdlbmVyYXRlZCBmaWxlcyBzZWVtIHRvIG5lZWQgdGhpcyB0byBmaW5kIGxvY2FsIGluY2x1ZGUgZmlsZXMKK0hPU1RDRkxBR1NfbGV4Lnpjb25mLm8JOj0gLUkkKHNyYykKK0hPU1RDRkxBR1NfemNvbmYudGFiLm8JOj0gLUkkKHNyYykKKworSE9TVExPQURMSUJFU19xY29uZgk9IC1MJChRVExJQlBBVEgpIC1XbCwtcnBhdGgsJChRVExJQlBBVEgpIC1sJChRVExJQikgLWxkbAorSE9TVENYWEZMQUdTX3Fjb25mLm8JPSAtSSQoUVRESVIpL2luY2x1ZGUgLUQgTEtDX0RJUkVDVF9MSU5LCisKK0hPU1RMT0FETElCRVNfZ2NvbmYJPSBgcGtnLWNvbmZpZyBndGsrLTIuMCBnbW9kdWxlLTIuMCBsaWJnbGFkZS0yLjAgLS1saWJzYAorSE9TVENGTEFHU19nY29uZi5vCT0gYHBrZy1jb25maWcgZ3RrKy0yLjAgZ21vZHVsZS0yLjAgbGliZ2xhZGUtMi4wIC0tY2ZsYWdzYCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIC1EIExLQ19ESVJFQ1RfTElOSworCiskKG9iaikvY29uZi5vICQob2JqKS9tY29uZi5vICQob2JqKS9xY29uZi5vICQob2JqKS9nY29uZi5vOiAkKG9iaikvemNvbmYudGFiLmgKKworJChvYmopL3pjb25mLnRhYi5oOiAkKHNyYykvemNvbmYudGFiLmhfc2hpcHBlZAorJChvYmopL3pjb25mLnRhYi5jOiAkKHNyYykvemNvbmYudGFiLmNfc2hpcHBlZAorJChvYmopL2xleC56Y29uZi5jOiAkKHNyYykvbGV4Lnpjb25mLmNfc2hpcHBlZAorCiskKG9iaikvcWNvbmYubzogJChvYmopLy50bXBfcXRjaGVjaworCitpZmVxICgkKHFjb25mLXRhcmdldCksMSkKK01PQyA9ICQoUVRESVIpL2Jpbi9tb2MKK1FUTElCUEFUSCA9ICQoUVRESVIpL2xpYgorLWluY2x1ZGUgJChvYmopLy50bXBfcXRjaGVjaworCisjIFFUIG5lZWRzIHNvbWUgZXh0cmEgZWZmb3J0Li4uCiskKG9iaikvLnRtcF9xdGNoZWNrOgorCUBzZXQgLWU7IGZvciBkIGluICQkUVRESVIgL3Vzci9zaGFyZS9xdCogL3Vzci9saWIvcXQqOyBkbyBcCisJICBpZiBbIC1mICQkZC9pbmNsdWRlL3Fjb25maWcuaCBdOyB0aGVuIERJUj0kJGQ7IGJyZWFrOyBmaTsgXAorCWRvbmU7IFwKKwlpZiBbIC16ICIkJERJUiIgXTsgdGhlbiBcCisJICBlY2hvICIqIjsgXAorCSAgZWNobyAiKiBVbmFibGUgdG8gZmluZCB0aGUgUVQgaW5zdGFsbGF0aW9uLiBQbGVhc2UgbWFrZSBzdXJlIHRoYXQgdGhlIjsgXAorCSAgZWNobyAiKiBRVCBkZXZlbG9wbWVudCBwYWNrYWdlIGlzIGNvcnJlY3RseSBpbnN0YWxsZWQgYW5kIHRoZSBRVERJUiI7IFwKKwkgIGVjaG8gIiogZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0IHRvIHRoZSBjb3JyZWN0IGxvY2F0aW9uLiI7IFwKKwkgIGVjaG8gIioiOyBcCisJICBmYWxzZTsgXAorCWZpOyBcCisJTElCUEFUSD0kJERJUi9saWI7IExJQj1xdDsgXAorCSQoSE9TVENYWCkgLXByaW50LW11bHRpLW9zLWRpcmVjdG9yeSA+IC9kZXYvbnVsbCAyPiYxICYmIFwKKwkgIExJQlBBVEg9JCRESVIvbGliLyQkKCQoSE9TVENYWCkgLXByaW50LW11bHRpLW9zLWRpcmVjdG9yeSk7IFwKKwlpZiBbIC1mICQkTElCUEFUSC9saWJxdC1tdC5zbyBdOyB0aGVuIExJQj1xdC1tdDsgZmk7IFwKKwllY2hvICJRVERJUj0kJERJUiIgPiAkQDsgZWNobyAiUVRMSUJQQVRIPSQkTElCUEFUSCIgPj4gJEA7IFwKKwllY2hvICJRVExJQj0kJExJQiIgPj4gJEA7IFwKKwlpZiBbICEgLXggJCRESVIvYmluL21vYyAtYSAteCAvdXNyL2Jpbi9tb2MgXTsgdGhlbiBcCisJICBlY2hvICIqIjsgXAorCSAgZWNobyAiKiBVbmFibGUgdG8gZmluZCAkJERJUi9iaW4vbW9jLCB1c2luZyAvdXNyL2Jpbi9tb2MgaW5zdGVhZC4iOyBcCisJICBlY2hvICIqIjsgXAorCSAgZWNobyAiTU9DPS91c3IvYmluL21vYyIgPj4gJEA7IFwKKwlmaQorZW5kaWYKKworJChvYmopL2djb25mLm86ICQob2JqKS8udG1wX2d0a2NoZWNrCisKK2lmZXEgKCQoZ2NvbmYtdGFyZ2V0KSwxKQorLWluY2x1ZGUgJChvYmopLy50bXBfZ3RrY2hlY2sKKworIyBHVEsgbmVlZHMgc29tZSBleHRyYSBlZmZvcnQsIHRvby4uLgorJChvYmopLy50bXBfZ3RrY2hlY2s6CisJQGlmIGBwa2ctY29uZmlnIGd0aystMi4wIGdtb2R1bGUtMi4wIGxpYmdsYWRlLTIuMCAtLWV4aXN0c2A7IHRoZW4JCVwKKwkJaWYgYHBrZy1jb25maWcgZ3RrKy0yLjAgLS1hdGxlYXN0LXZlcnNpb249Mi4wLjBgOyB0aGVuCQkJXAorCQkJdG91Y2ggJEA7CQkJCQkJCQlcCisJCWVsc2UJCQkJCQkJCQlcCisJCQllY2hvICIqIjsgCQkJCQkJCVwKKwkJCWVjaG8gIiogR1RLKyBpcyBwcmVzZW50IGJ1dCB2ZXJzaW9uID49IDIuMC4wIGlzIHJlcXVpcmVkLiI7CVwKKwkJCWVjaG8gIioiOwkJCQkJCQlcCisJCQlmYWxzZTsJCQkJCQkJCVwKKwkJZmkJCQkJCQkJCQlcCisJZWxzZQkJCQkJCQkJCQlcCisJCWVjaG8gIioiOyAJCQkJCQkJCVwKKwkJZWNobyAiKiBVbmFibGUgdG8gZmluZCB0aGUgR1RLKyBpbnN0YWxsYXRpb24uIFBsZWFzZSBtYWtlIHN1cmUgdGhhdCI7IAlcCisJCWVjaG8gIiogdGhlIEdUSysgMi4wIGRldmVsb3BtZW50IHBhY2thZ2UgaXMgY29ycmVjdGx5IGluc3RhbGxlZC4uLiI7IAlcCisJCWVjaG8gIiogWW91IG5lZWQgZ3RrKy0yLjAsIGdsaWItMi4wIGFuZCBsaWJnbGFkZS0yLjAuIjsgCQlcCisJCWVjaG8gIioiOyAJCQkJCQkJCVwKKwkJZmFsc2U7CQkJCQkJCQkJXAorCWZpCitlbmRpZgorCiskKG9iaikvemNvbmYudGFiLm86ICQob2JqKS9sZXguemNvbmYuYworCiskKG9iaikva2NvbmZpZ19sb2FkLm86ICQob2JqKS9sa2NfZGVmcy5oCisKKyQob2JqKS9xY29uZi5vOiAkKG9iaikvcWNvbmYubW9jICQob2JqKS9sa2NfZGVmcy5oCisKKyQob2JqKS9nY29uZi5vOiAkKG9iaikvbGtjX2RlZnMuaAorCiskKG9iaikvJS5tb2M6ICQoc3JjKS8lLmgKKwkkKE1PQykgLWkgJDwgLW8gJEAKKworJChvYmopL2xrY19kZWZzLmg6ICQoc3JjKS9sa2NfcHJvdG8uaAorCXNlZCA8ICQ8ID4gJEAgJ3MvUChcKFteLF0qXCksLiovI2RlZmluZSBcMSAoXCpcMV9wKS8nCisKKworIyMjCisjIFRoZSBmb2xsb3dpbmcgcmVxdWlyZXMgZmxleC9iaXNvbgorIyBCeSBkZWZhdWx0IHdlIHVzZSB0aGUgX3NoaXBwZWQgdmVyc2lvbnMsIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIGxpbmUgaWYKKyMgeW91IGFyZSBtb2RpZnlpbmcgdGhlIGZsZXgvYmlzb24gc3JjLgorIyBMS0NfR0VOUEFSU0VSIDo9IDEKKworaWZkZWYgTEtDX0dFTlBBUlNFUgorCiskKG9iaikvemNvbmYudGFiLmM6ICQob2JqKS96Y29uZi55IAorJChvYmopL3pjb25mLnRhYi5oOiAkKG9iaikvemNvbmYudGFiLmMKKworJS50YWIuYzogJS55CisJYmlzb24gLXQgLWQgLXYgLWIgJCogLXAgJChub3RkaXIgJCopICQ8CisKK2xleC4lLmM6ICUubAorCWZsZXggLVAkKG5vdGRpciAkKikgLW8kQCAkPAorCitlbmRpZgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2NvbmYuYyBiL3NjcmlwdHMva2NvbmZpZy9jb25mLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ5NGQxYQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9jb25mLmMKQEAgLTAsMCArMSw1ODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+CisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KKyAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2RlZmluZSBMS0NfRElSRUNUX0xJTksKKyNpbmNsdWRlICJsa2MuaCIKKworc3RhdGljIHZvaWQgY29uZihzdHJ1Y3QgbWVudSAqbWVudSk7CitzdGF0aWMgdm9pZCBjaGVja19jb25mKHN0cnVjdCBtZW51ICptZW51KTsKKworZW51bSB7CisJYXNrX2FsbCwKKwlhc2tfbmV3LAorCWFza19zaWxlbnQsCisJc2V0X2RlZmF1bHQsCisJc2V0X3llcywKKwlzZXRfbW9kLAorCXNldF9ubywKKwlzZXRfcmFuZG9tCit9IGlucHV0X21vZGUgPSBhc2tfYWxsOworY2hhciAqZGVmY29uZmlnX2ZpbGU7CisKK3N0YXRpYyBpbnQgaW5kZW50ID0gMTsKK3N0YXRpYyBpbnQgdmFsaWRfc3RkaW4gPSAxOworc3RhdGljIGludCBjb25mX2NudDsKK3N0YXRpYyBzaWduZWQgY2hhciBsaW5lWzEyOF07CitzdGF0aWMgc3RydWN0IG1lbnUgKnJvb3RFbnRyeTsKKworc3RhdGljIGNoYXIgbm9oZWxwX3RleHRbXSA9ICJTb3JyeSwgbm8gaGVscCBhdmFpbGFibGUgZm9yIHRoaXMgb3B0aW9uIHlldC5cbiI7CisKK3N0YXRpYyB2b2lkIHN0cmlwKHNpZ25lZCBjaGFyICpzdHIpCit7CisJc2lnbmVkIGNoYXIgKnAgPSBzdHI7CisJaW50IGw7CisKKwl3aGlsZSAoKGlzc3BhY2UoKnApKSkKKwkJcCsrOworCWwgPSBzdHJsZW4ocCk7CisJaWYgKHAgIT0gc3RyKQorCQltZW1tb3ZlKHN0ciwgcCwgbCArIDEpOworCWlmICghbCkKKwkJcmV0dXJuOworCXAgPSBzdHIgKyBsIC0gMTsKKwl3aGlsZSAoKGlzc3BhY2UoKnApKSkKKwkJKnAtLSA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX3N0ZGluKHZvaWQpCit7CisJaWYgKCF2YWxpZF9zdGRpbiAmJiBpbnB1dF9tb2RlID09IGFza19zaWxlbnQpIHsKKwkJcHJpbnRmKCJhYm9ydGVkIVxuXG4iKTsKKwkJcHJpbnRmKCJDb25zb2xlIGlucHV0L291dHB1dCBpcyByZWRpcmVjdGVkLiAiKTsKKwkJcHJpbnRmKCJSdW4gJ21ha2Ugb2xkY29uZmlnJyB0byB1cGRhdGUgY29uZmlndXJhdGlvbi5cblxuIik7CisJCWV4aXQoMSk7CisJfQorfQorCitzdGF0aWMgdm9pZCBjb25mX2Fza3ZhbHVlKHN0cnVjdCBzeW1ib2wgKnN5bSwgY29uc3QgY2hhciAqZGVmKQoreworCWVudW0gc3ltYm9sX3R5cGUgdHlwZSA9IHN5bV9nZXRfdHlwZShzeW0pOworCXRyaXN0YXRlIHZhbDsKKworCWlmICghc3ltX2hhc192YWx1ZShzeW0pKQorCQlwcmludGYoIihORVcpICIpOworCisJbGluZVswXSA9ICdcbic7CisJbGluZVsxXSA9IDA7CisKKwlpZiAoIXN5bV9pc19jaGFuZ2FibGUoc3ltKSkgeworCQlwcmludGYoIiVzXG4iLCBkZWYpOworCQlsaW5lWzBdID0gJ1xuJzsKKwkJbGluZVsxXSA9IDA7CisJCXJldHVybjsKKwl9CisKKwlzd2l0Y2ggKGlucHV0X21vZGUpIHsKKwljYXNlIGFza19uZXc6CisJY2FzZSBhc2tfc2lsZW50OgorCQlpZiAoc3ltX2hhc192YWx1ZShzeW0pKSB7CisJCQlwcmludGYoIiVzXG4iLCBkZWYpOworCQkJcmV0dXJuOworCQl9CisJCWNoZWNrX3N0ZGluKCk7CisJY2FzZSBhc2tfYWxsOgorCQlmZmx1c2goc3Rkb3V0KTsKKwkJZmdldHMobGluZSwgMTI4LCBzdGRpbik7CisJCXJldHVybjsKKwljYXNlIHNldF9kZWZhdWx0OgorCQlwcmludGYoIiVzXG4iLCBkZWYpOworCQlyZXR1cm47CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBTX0lOVDoKKwljYXNlIFNfSEVYOgorCWNhc2UgU19TVFJJTkc6CisJCXByaW50ZigiJXNcbiIsIGRlZik7CisJCXJldHVybjsKKwlkZWZhdWx0OgorCQk7CisJfQorCXN3aXRjaCAoaW5wdXRfbW9kZSkgeworCWNhc2Ugc2V0X3llczoKKwkJaWYgKHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCB5ZXMpKSB7CisJCQlsaW5lWzBdID0gJ3knOworCQkJbGluZVsxXSA9ICdcbic7CisJCQlsaW5lWzJdID0gMDsKKwkJCWJyZWFrOworCQl9CisJY2FzZSBzZXRfbW9kOgorCQlpZiAodHlwZSA9PSBTX1RSSVNUQVRFKSB7CisJCQlpZiAoc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIG1vZCkpIHsKKwkJCQlsaW5lWzBdID0gJ20nOworCQkJCWxpbmVbMV0gPSAnXG4nOworCQkJCWxpbmVbMl0gPSAwOworCQkJCWJyZWFrOworCQkJfQorCQl9IGVsc2UgeworCQkJaWYgKHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCB5ZXMpKSB7CisJCQkJbGluZVswXSA9ICd5JzsKKwkJCQlsaW5lWzFdID0gJ1xuJzsKKwkJCQlsaW5lWzJdID0gMDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCWNhc2Ugc2V0X25vOgorCQlpZiAoc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIG5vKSkgeworCQkJbGluZVswXSA9ICduJzsKKwkJCWxpbmVbMV0gPSAnXG4nOworCQkJbGluZVsyXSA9IDA7CisJCQlicmVhazsKKwkJfQorCWNhc2Ugc2V0X3JhbmRvbToKKwkJZG8geworCQkJdmFsID0gKHRyaXN0YXRlKShyYW5kb20oKSAlIDMpOworCQl9IHdoaWxlICghc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIHZhbCkpOworCQlzd2l0Y2ggKHZhbCkgeworCQljYXNlIG5vOiBsaW5lWzBdID0gJ24nOyBicmVhazsKKwkJY2FzZSBtb2Q6IGxpbmVbMF0gPSAnbSc7IGJyZWFrOworCQljYXNlIHllczogbGluZVswXSA9ICd5JzsgYnJlYWs7CisJCX0KKwkJbGluZVsxXSA9ICdcbic7CisJCWxpbmVbMl0gPSAwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcHJpbnRmKCIlcyIsIGxpbmUpOworfQorCitpbnQgY29uZl9zdHJpbmcoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltID0gbWVudS0+c3ltOworCWNvbnN0IGNoYXIgKmRlZiwgKmhlbHA7CisKKwl3aGlsZSAoMSkgeworCQlwcmludGYoIiUqcyVzICIsIGluZGVudCAtIDEsICIiLCBtZW51LT5wcm9tcHQtPnRleHQpOworCQlwcmludGYoIiglcykgIiwgc3ltLT5uYW1lKTsKKwkJZGVmID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKTsKKwkJaWYgKHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSkpCisJCQlwcmludGYoIlslc10gIiwgZGVmKTsKKwkJY29uZl9hc2t2YWx1ZShzeW0sIGRlZik7CisJCXN3aXRjaCAobGluZVswXSkgeworCQljYXNlICdcbic6CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCQkvKiBwcmludCBoZWxwICovCisJCQlpZiAobGluZVsxXSA9PSAnXG4nKSB7CisJCQkJaGVscCA9IG5vaGVscF90ZXh0OworCQkJCWlmIChtZW51LT5zeW0tPmhlbHApCisJCQkJCWhlbHAgPSBtZW51LT5zeW0tPmhlbHA7CisJCQkJcHJpbnRmKCJcbiVzXG4iLCBtZW51LT5zeW0tPmhlbHApOworCQkJCWRlZiA9IE5VTEw7CisJCQkJYnJlYWs7CisJCQl9CisJCWRlZmF1bHQ6CisJCQlsaW5lW3N0cmxlbihsaW5lKS0xXSA9IDA7CisJCQlkZWYgPSBsaW5lOworCQl9CisJCWlmIChkZWYgJiYgc3ltX3NldF9zdHJpbmdfdmFsdWUoc3ltLCBkZWYpKQorCQkJcmV0dXJuIDA7CisJfQorfQorCitzdGF0aWMgaW50IGNvbmZfc3ltKHN0cnVjdCBtZW51ICptZW51KQoreworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IG1lbnUtPnN5bTsKKwlpbnQgdHlwZTsKKwl0cmlzdGF0ZSBvbGR2YWwsIG5ld3ZhbDsKKwljb25zdCBjaGFyICpoZWxwOworCisJd2hpbGUgKDEpIHsKKwkJcHJpbnRmKCIlKnMlcyAiLCBpbmRlbnQgLSAxLCAiIiwgbWVudS0+cHJvbXB0LT50ZXh0KTsKKwkJaWYgKHN5bS0+bmFtZSkKKwkJCXByaW50ZigiKCVzKSAiLCBzeW0tPm5hbWUpOworCQl0eXBlID0gc3ltX2dldF90eXBlKHN5bSk7CisJCXB1dGNoYXIoJ1snKTsKKwkJb2xkdmFsID0gc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzeW0pOworCQlzd2l0Y2ggKG9sZHZhbCkgeworCQljYXNlIG5vOgorCQkJcHV0Y2hhcignTicpOworCQkJYnJlYWs7CisJCWNhc2UgbW9kOgorCQkJcHV0Y2hhcignTScpOworCQkJYnJlYWs7CisJCWNhc2UgeWVzOgorCQkJcHV0Y2hhcignWScpOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKG9sZHZhbCAhPSBubyAmJiBzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgbm8pKQorCQkJcHJpbnRmKCIvbiIpOworCQlpZiAob2xkdmFsICE9IG1vZCAmJiBzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgbW9kKSkKKwkJCXByaW50ZigiL20iKTsKKwkJaWYgKG9sZHZhbCAhPSB5ZXMgJiYgc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIHllcykpCisJCQlwcmludGYoIi95Iik7CisJCWlmIChzeW0tPmhlbHApCisJCQlwcmludGYoIi8/Iik7CisJCXByaW50ZigiXSAiKTsKKwkJY29uZl9hc2t2YWx1ZShzeW0sIHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSkpOworCQlzdHJpcChsaW5lKTsKKworCQlzd2l0Y2ggKGxpbmVbMF0pIHsKKwkJY2FzZSAnbic6CisJCWNhc2UgJ04nOgorCQkJbmV3dmFsID0gbm87CisJCQlpZiAoIWxpbmVbMV0gfHwgIXN0cmNtcCgmbGluZVsxXSwgIm8iKSkKKwkJCQlicmVhazsKKwkJCWNvbnRpbnVlOworCQljYXNlICdtJzoKKwkJY2FzZSAnTSc6CisJCQluZXd2YWwgPSBtb2Q7CisJCQlpZiAoIWxpbmVbMV0pCisJCQkJYnJlYWs7CisJCQljb250aW51ZTsKKwkJY2FzZSAneSc6CisJCWNhc2UgJ1knOgorCQkJbmV3dmFsID0geWVzOworCQkJaWYgKCFsaW5lWzFdIHx8ICFzdHJjbXAoJmxpbmVbMV0sICJlcyIpKQorCQkJCWJyZWFrOworCQkJY29udGludWU7CisJCWNhc2UgMDoKKwkJCW5ld3ZhbCA9IG9sZHZhbDsKKwkJCWJyZWFrOworCQljYXNlICc/JzoKKwkJCWdvdG8gaGVscDsKKwkJZGVmYXVsdDoKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSwgbmV3dmFsKSkKKwkJCXJldHVybiAwOworaGVscDoKKwkJaGVscCA9IG5vaGVscF90ZXh0OworCQlpZiAoc3ltLT5oZWxwKQorCQkJaGVscCA9IHN5bS0+aGVscDsKKwkJcHJpbnRmKCJcbiVzXG4iLCBoZWxwKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY29uZl9jaG9pY2Uoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltLCAqZGVmX3N5bTsKKwlzdHJ1Y3QgbWVudSAqY2hpbGQ7CisJaW50IHR5cGU7CisJYm9vbCBpc19uZXc7CisKKwlzeW0gPSBtZW51LT5zeW07CisJdHlwZSA9IHN5bV9nZXRfdHlwZShzeW0pOworCWlzX25ldyA9ICFzeW1faGFzX3ZhbHVlKHN5bSk7CisJaWYgKHN5bV9pc19jaGFuZ2FibGUoc3ltKSkgeworCQljb25mX3N5bShtZW51KTsKKwkJc3ltX2NhbGNfdmFsdWUoc3ltKTsKKwkJc3dpdGNoIChzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSkpIHsKKwkJY2FzZSBubzoKKwkJCXJldHVybiAxOworCQljYXNlIG1vZDoKKwkJCXJldHVybiAwOworCQljYXNlIHllczoKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIHsKKwkJc3dpdGNoIChzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSkpIHsKKwkJY2FzZSBubzoKKwkJCXJldHVybiAxOworCQljYXNlIG1vZDoKKwkJCXByaW50ZigiJSpzJXNcbiIsIGluZGVudCAtIDEsICIiLCBtZW51X2dldF9wcm9tcHQobWVudSkpOworCQkJcmV0dXJuIDA7CisJCWNhc2UgeWVzOgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwl3aGlsZSAoMSkgeworCQlpbnQgY250LCBkZWY7CisKKwkJcHJpbnRmKCIlKnMlc1xuIiwgaW5kZW50IC0gMSwgIiIsIG1lbnVfZ2V0X3Byb21wdChtZW51KSk7CisJCWRlZl9zeW0gPSBzeW1fZ2V0X2Nob2ljZV92YWx1ZShzeW0pOworCQljbnQgPSBkZWYgPSAwOworCQlsaW5lWzBdID0gJzAnOworCQlsaW5lWzFdID0gMDsKKwkJZm9yIChjaGlsZCA9IG1lbnUtPmxpc3Q7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisJCQlpZiAoIW1lbnVfaXNfdmlzaWJsZShjaGlsZCkpCisJCQkJY29udGludWU7CisJCQlpZiAoIWNoaWxkLT5zeW0pIHsKKwkJCQlwcmludGYoIiUqYyAlc1xuIiwgaW5kZW50LCAnKicsIG1lbnVfZ2V0X3Byb21wdChjaGlsZCkpOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJY250Kys7CisJCQlpZiAoY2hpbGQtPnN5bSA9PSBkZWZfc3ltKSB7CisJCQkJZGVmID0gY250OworCQkJCXByaW50ZigiJSpjIiwgaW5kZW50LCAnPicpOworCQkJfSBlbHNlCisJCQkJcHJpbnRmKCIlKmMiLCBpbmRlbnQsICcgJyk7CisJCQlwcmludGYoIiAlZC4gJXMiLCBjbnQsIG1lbnVfZ2V0X3Byb21wdChjaGlsZCkpOworCQkJaWYgKGNoaWxkLT5zeW0tPm5hbWUpCisJCQkJcHJpbnRmKCIgKCVzKSIsIGNoaWxkLT5zeW0tPm5hbWUpOworCQkJaWYgKCFzeW1faGFzX3ZhbHVlKGNoaWxkLT5zeW0pKQorCQkJCXByaW50ZigiIChORVcpIik7CisJCQlwcmludGYoIlxuIik7CisJCX0KKwkJcHJpbnRmKCIlKnNjaG9pY2UiLCBpbmRlbnQgLSAxLCAiIik7CisJCWlmIChjbnQgPT0gMSkgeworCQkJcHJpbnRmKCJbMV06IDFcbiIpOworCQkJZ290byBjb25mX2NoaWxkczsKKwkJfQorCQlwcmludGYoIlsxLSVkIiwgY250KTsKKwkJaWYgKHN5bS0+aGVscCkKKwkJCXByaW50ZigiPyIpOworCQlwcmludGYoIl06ICIpOworCQlzd2l0Y2ggKGlucHV0X21vZGUpIHsKKwkJY2FzZSBhc2tfbmV3OgorCQljYXNlIGFza19zaWxlbnQ6CisJCQlpZiAoIWlzX25ldykgeworCQkJCWNudCA9IGRlZjsKKwkJCQlwcmludGYoIiVkXG4iLCBjbnQpOworCQkJCWJyZWFrOworCQkJfQorCQkJY2hlY2tfc3RkaW4oKTsKKwkJY2FzZSBhc2tfYWxsOgorCQkJZmZsdXNoKHN0ZG91dCk7CisJCQlmZ2V0cyhsaW5lLCAxMjgsIHN0ZGluKTsKKwkJCXN0cmlwKGxpbmUpOworCQkJaWYgKGxpbmVbMF0gPT0gJz8nKSB7CisJCQkJcHJpbnRmKCJcbiVzXG4iLCBtZW51LT5zeW0tPmhlbHAgPworCQkJCQltZW51LT5zeW0tPmhlbHAgOiBub2hlbHBfdGV4dCk7CisJCQkJY29udGludWU7CisJCQl9CisJCQlpZiAoIWxpbmVbMF0pCisJCQkJY250ID0gZGVmOworCQkJZWxzZSBpZiAoaXNkaWdpdChsaW5lWzBdKSkKKwkJCQljbnQgPSBhdG9pKGxpbmUpOworCQkJZWxzZQorCQkJCWNvbnRpbnVlOworCQkJYnJlYWs7CisJCWNhc2Ugc2V0X3JhbmRvbToKKwkJCWRlZiA9IChyYW5kb20oKSAlIGNudCkgKyAxOworCQljYXNlIHNldF9kZWZhdWx0OgorCQljYXNlIHNldF95ZXM6CisJCWNhc2Ugc2V0X21vZDoKKwkJY2FzZSBzZXRfbm86CisJCQljbnQgPSBkZWY7CisJCQlwcmludGYoIiVkXG4iLCBjbnQpOworCQkJYnJlYWs7CisJCX0KKworCWNvbmZfY2hpbGRzOgorCQlmb3IgKGNoaWxkID0gbWVudS0+bGlzdDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKwkJCWlmICghY2hpbGQtPnN5bSB8fCAhbWVudV9pc192aXNpYmxlKGNoaWxkKSkKKwkJCQljb250aW51ZTsKKwkJCWlmICghLS1jbnQpCisJCQkJYnJlYWs7CisJCX0KKwkJaWYgKCFjaGlsZCkKKwkJCWNvbnRpbnVlOworCQlpZiAobGluZVtzdHJsZW4obGluZSkgLSAxXSA9PSAnPycpIHsKKwkJCXByaW50ZigiXG4lc1xuIiwgY2hpbGQtPnN5bS0+aGVscCA/CisJCQkJY2hpbGQtPnN5bS0+aGVscCA6IG5vaGVscF90ZXh0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCXN5bV9zZXRfY2hvaWNlX3ZhbHVlKHN5bSwgY2hpbGQtPnN5bSk7CisJCWlmIChjaGlsZC0+bGlzdCkgeworCQkJaW5kZW50ICs9IDI7CisJCQljb25mKGNoaWxkLT5saXN0KTsKKwkJCWluZGVudCAtPSAyOworCQl9CisJCXJldHVybiAxOworCX0KK30KKworc3RhdGljIHZvaWQgY29uZihzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXN0cnVjdCBtZW51ICpjaGlsZDsKKworCWlmICghbWVudV9pc192aXNpYmxlKG1lbnUpKQorCQlyZXR1cm47CisKKwlzeW0gPSBtZW51LT5zeW07CisJcHJvcCA9IG1lbnUtPnByb21wdDsKKwlpZiAocHJvcCkgeworCQljb25zdCBjaGFyICpwcm9tcHQ7CisKKwkJc3dpdGNoIChwcm9wLT50eXBlKSB7CisJCWNhc2UgUF9NRU5VOgorCQkJaWYgKGlucHV0X21vZGUgPT0gYXNrX3NpbGVudCAmJiByb290RW50cnkgIT0gbWVudSkgeworCQkJCWNoZWNrX2NvbmYobWVudSk7CisJCQkJcmV0dXJuOworCQkJfQorCQljYXNlIFBfQ09NTUVOVDoKKwkJCXByb21wdCA9IG1lbnVfZ2V0X3Byb21wdChtZW51KTsKKwkJCWlmIChwcm9tcHQpCisJCQkJcHJpbnRmKCIlKmNcbiUqYyAlc1xuJSpjXG4iLAorCQkJCQlpbmRlbnQsICcqJywKKwkJCQkJaW5kZW50LCAnKicsIHByb21wdCwKKwkJCQkJaW5kZW50LCAnKicpOworCQlkZWZhdWx0OgorCQkJOworCQl9CisJfQorCisJaWYgKCFzeW0pCisJCWdvdG8gY29uZl9jaGlsZHM7CisKKwlpZiAoc3ltX2lzX2Nob2ljZShzeW0pKSB7CisJCWNvbmZfY2hvaWNlKG1lbnUpOworCQlpZiAoc3ltLT5jdXJyLnRyaSAhPSBtb2QpCisJCQlyZXR1cm47CisJCWdvdG8gY29uZl9jaGlsZHM7CisJfQorCisJc3dpdGNoIChzeW0tPnR5cGUpIHsKKwljYXNlIFNfSU5UOgorCWNhc2UgU19IRVg6CisJY2FzZSBTX1NUUklORzoKKwkJY29uZl9zdHJpbmcobWVudSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWNvbmZfc3ltKG1lbnUpOworCQlicmVhazsKKwl9CisKK2NvbmZfY2hpbGRzOgorCWlmIChzeW0pCisJCWluZGVudCArPSAyOworCWZvciAoY2hpbGQgPSBtZW51LT5saXN0OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkKKwkJY29uZihjaGlsZCk7CisJaWYgKHN5bSkKKwkJaW5kZW50IC09IDI7Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrX2NvbmYoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXN0cnVjdCBtZW51ICpjaGlsZDsKKworCWlmICghbWVudV9pc192aXNpYmxlKG1lbnUpKQorCQlyZXR1cm47CisKKwlzeW0gPSBtZW51LT5zeW07CisJaWYgKHN5bSkgeworCQlpZiAoc3ltX2lzX2NoYW5nYWJsZShzeW0pICYmICFzeW1faGFzX3ZhbHVlKHN5bSkpIHsKKwkJCWlmICghY29uZl9jbnQrKykKKwkJCQlwcmludGYoIipcbiogUmVzdGFydCBjb25maWcuLi5cbipcbiIpOworCQkJcm9vdEVudHJ5ID0gbWVudV9nZXRfcGFyZW50X21lbnUobWVudSk7CisJCQljb25mKHJvb3RFbnRyeSk7CisJCX0KKwkJaWYgKHN5bV9pc19jaG9pY2Uoc3ltKSAmJiBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSkgIT0gbW9kKQorCQkJcmV0dXJuOworCX0KKworCWZvciAoY2hpbGQgPSBtZW51LT5saXN0OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkKKwkJY2hlY2tfY29uZihjaGlsZCk7Cit9CisKK2ludCBtYWluKGludCBhYywgY2hhciAqKmF2KQoreworCWludCBpID0gMTsKKwljb25zdCBjaGFyICpuYW1lOworCXN0cnVjdCBzdGF0IHRtcHN0YXQ7CisKKwlpZiAoYWMgPiBpICYmIGF2W2ldWzBdID09ICctJykgeworCQlzd2l0Y2ggKGF2W2krK11bMV0pIHsKKwkJY2FzZSAnbyc6CisJCQlpbnB1dF9tb2RlID0gYXNrX25ldzsKKwkJCWJyZWFrOworCQljYXNlICdzJzoKKwkJCWlucHV0X21vZGUgPSBhc2tfc2lsZW50OworCQkJdmFsaWRfc3RkaW4gPSBpc2F0dHkoMCkgJiYgaXNhdHR5KDEpICYmIGlzYXR0eSgyKTsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCWlucHV0X21vZGUgPSBzZXRfZGVmYXVsdDsKKwkJCWJyZWFrOworCQljYXNlICdEJzoKKwkJCWlucHV0X21vZGUgPSBzZXRfZGVmYXVsdDsKKwkJCWRlZmNvbmZpZ19maWxlID0gYXZbaSsrXTsKKwkJCWlmICghZGVmY29uZmlnX2ZpbGUpIHsKKwkJCQlwcmludGYoIiVzOiBObyBkZWZhdWx0IGNvbmZpZyBmaWxlIHNwZWNpZmllZFxuIiwKKwkJCQkJYXZbMF0pOworCQkJCWV4aXQoMSk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSAnbic6CisJCQlpbnB1dF9tb2RlID0gc2V0X25vOworCQkJYnJlYWs7CisJCWNhc2UgJ20nOgorCQkJaW5wdXRfbW9kZSA9IHNldF9tb2Q7CisJCQlicmVhazsKKwkJY2FzZSAneSc6CisJCQlpbnB1dF9tb2RlID0gc2V0X3llczsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCWlucHV0X21vZGUgPSBzZXRfcmFuZG9tOworCQkJc3JhbmRvbSh0aW1lKE5VTEwpKTsKKwkJCWJyZWFrOworCQljYXNlICdoJzoKKwkJY2FzZSAnPyc6CisJCQlwcmludGYoIiVzIFstb3wtc10gY29uZmlnXG4iLCBhdlswXSk7CisJCQlleGl0KDApOworCQl9CisJfQorICAJbmFtZSA9IGF2W2ldOworCWlmICghbmFtZSkgeworCQlwcmludGYoIiVzOiBLY29uZmlnIGZpbGUgbWlzc2luZ1xuIiwgYXZbMF0pOworCX0KKwljb25mX3BhcnNlKG5hbWUpOworCS8vemNvbmZkdW1wKHN0ZG91dCk7CisJc3dpdGNoIChpbnB1dF9tb2RlKSB7CisJY2FzZSBzZXRfZGVmYXVsdDoKKwkJaWYgKCFkZWZjb25maWdfZmlsZSkKKwkJCWRlZmNvbmZpZ19maWxlID0gY29uZl9nZXRfZGVmYXVsdF9jb25mbmFtZSgpOworCQlpZiAoY29uZl9yZWFkKGRlZmNvbmZpZ19maWxlKSkgeworCQkJcHJpbnRmKCIqKipcbiIKKwkJCQkiKioqIENhbid0IGZpbmQgZGVmYXVsdCBjb25maWd1cmF0aW9uIFwiJXNcIiFcbiIKKwkJCQkiKioqXG4iLCBkZWZjb25maWdfZmlsZSk7CisJCQlleGl0KDEpOworCQl9CisJCWJyZWFrOworCWNhc2UgYXNrX3NpbGVudDoKKwkJaWYgKHN0YXQoIi5jb25maWciLCAmdG1wc3RhdCkpIHsKKwkJCXByaW50ZigiKioqXG4iCisJCQkJIioqKiBZb3UgaGF2ZSBub3QgeWV0IGNvbmZpZ3VyZWQgeW91ciBrZXJuZWwhXG4iCisJCQkJIioqKlxuIgorCQkJCSIqKiogUGxlYXNlIHJ1biBzb21lIGNvbmZpZ3VyYXRvciAoZS5nLiBcIm1ha2Ugb2xkY29uZmlnXCIgb3JcbiIKKwkJCQkiKioqIFwibWFrZSBtZW51Y29uZmlnXCIgb3IgXCJtYWtlIHhjb25maWdcIikuXG4iCisJCQkJIioqKlxuIik7CisJCQlleGl0KDEpOworCQl9CisJY2FzZSBhc2tfYWxsOgorCWNhc2UgYXNrX25ldzoKKwkJY29uZl9yZWFkKE5VTEwpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlpZiAoaW5wdXRfbW9kZSAhPSBhc2tfc2lsZW50KSB7CisJCXJvb3RFbnRyeSA9ICZyb290bWVudTsKKwkJY29uZigmcm9vdG1lbnUpOworCQlpZiAoaW5wdXRfbW9kZSA9PSBhc2tfYWxsKSB7CisJCQlpbnB1dF9tb2RlID0gYXNrX3NpbGVudDsKKwkJCXZhbGlkX3N0ZGluID0gMTsKKwkJfQorCX0KKwlkbyB7CisJCWNvbmZfY250ID0gMDsKKwkJY2hlY2tfY29uZigmcm9vdG1lbnUpOworCX0gd2hpbGUgKGNvbmZfY250KTsKKwlpZiAoY29uZl93cml0ZShOVUxMKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlxuKioqIEVycm9yIGR1cmluZyB3cml0aW5nIG9mIHRoZSBrZXJuZWwgY29uZmlndXJhdGlvbi5cblxuIik7CisJCXJldHVybiAxOworCX0KKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jIGIvc2NyaXB0cy9rY29uZmlnL2NvbmZkYXRhLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU4MmFlMwotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9jb25mZGF0YS5jCkBAIC0wLDAgKzEsNDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCisgKi8KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2RlZmluZSBMS0NfRElSRUNUX0xJTksKKyNpbmNsdWRlICJsa2MuaCIKKworY29uc3QgY2hhciBjb25mX2RlZl9maWxlbmFtZVtdID0gIi5jb25maWciOworCitjb25zdCBjaGFyIGNvbmZfZGVmbmFtZVtdID0gImFyY2gvJEFSQ0gvZGVmY29uZmlnIjsKKworY29uc3QgY2hhciAqY29uZl9jb25mbmFtZXNbXSA9IHsKKwkiLmNvbmZpZyIsCisJIi9saWIvbW9kdWxlcy8kVU5BTUVfUkVMRUFTRS8uY29uZmlnIiwKKwkiL2V0Yy9rZXJuZWwtY29uZmlnIiwKKwkiL2Jvb3QvY29uZmlnLSRVTkFNRV9SRUxFQVNFIiwKKwljb25mX2RlZm5hbWUsCisJTlVMTCwKK307CisKK3N0YXRpYyBjaGFyICpjb25mX2V4cGFuZF92YWx1ZShjb25zdCBzaWduZWQgY2hhciAqaW4pCit7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCWNvbnN0IHNpZ25lZCBjaGFyICpzcmM7CisJc3RhdGljIGNoYXIgcmVzX3ZhbHVlW1NZTUJPTF9NQVhMRU5HVEhdOworCWNoYXIgKmRzdCwgbmFtZVtTWU1CT0xfTUFYTEVOR1RIXTsKKworCXJlc192YWx1ZVswXSA9IDA7CisJZHN0ID0gbmFtZTsKKwl3aGlsZSAoKHNyYyA9IHN0cmNocihpbiwgJyQnKSkpIHsKKwkJc3RybmNhdChyZXNfdmFsdWUsIGluLCBzcmMgLSBpbik7CisJCXNyYysrOworCQlkc3QgPSBuYW1lOworCQl3aGlsZSAoaXNhbG51bSgqc3JjKSB8fCAqc3JjID09ICdfJykKKwkJCSpkc3QrKyA9ICpzcmMrKzsKKwkJKmRzdCA9IDA7CisJCXN5bSA9IHN5bV9sb29rdXAobmFtZSwgMCk7CisJCXN5bV9jYWxjX3ZhbHVlKHN5bSk7CisJCXN0cmNhdChyZXNfdmFsdWUsIHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSkpOworCQlpbiA9IHNyYzsKKwl9CisJc3RyY2F0KHJlc192YWx1ZSwgaW4pOworCisJcmV0dXJuIHJlc192YWx1ZTsKK30KKworY2hhciAqY29uZl9nZXRfZGVmYXVsdF9jb25mbmFtZSh2b2lkKQoreworCXN0cnVjdCBzdGF0IGJ1ZjsKKwlzdGF0aWMgY2hhciBmdWxsbmFtZVtQQVRIX01BWCsxXTsKKwljaGFyICplbnYsICpuYW1lOworCisJbmFtZSA9IGNvbmZfZXhwYW5kX3ZhbHVlKGNvbmZfZGVmbmFtZSk7CisJZW52ID0gZ2V0ZW52KFNSQ1RSRUUpOworCWlmIChlbnYpIHsKKwkJc3ByaW50ZihmdWxsbmFtZSwgIiVzLyVzIiwgZW52LCBuYW1lKTsKKwkJaWYgKCFzdGF0KGZ1bGxuYW1lLCAmYnVmKSkKKwkJCXJldHVybiBmdWxsbmFtZTsKKwl9CisJcmV0dXJuIG5hbWU7Cit9CisKK2ludCBjb25mX3JlYWQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlGSUxFICppbiA9IE5VTEw7CisJY2hhciBsaW5lWzEwMjRdOworCWNoYXIgKnAsICpwMjsKKwlpbnQgbGluZW5vID0gMDsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXN0cnVjdCBleHByICplOworCWludCBpOworCisJaWYgKG5hbWUpIHsKKwkJaW4gPSB6Y29uZl9mb3BlbihuYW1lKTsKKwl9IGVsc2UgeworCQljb25zdCBjaGFyICoqbmFtZXMgPSBjb25mX2NvbmZuYW1lczsKKwkJd2hpbGUgKChuYW1lID0gKm5hbWVzKyspKSB7CisJCQluYW1lID0gY29uZl9leHBhbmRfdmFsdWUobmFtZSk7CisJCQlpbiA9IHpjb25mX2ZvcGVuKG5hbWUpOworCQkJaWYgKGluKSB7CisJCQkJcHJpbnRmKCIjXG4iCisJCQkJICAgICAgICIjIHVzaW5nIGRlZmF1bHRzIGZvdW5kIGluICVzXG4iCisJCQkJICAgICAgICIjXG4iLCBuYW1lKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKworCWlmICghaW4pCisJCXJldHVybiAxOworCisJZm9yX2FsbF9zeW1ib2xzKGksIHN5bSkgeworCQlzeW0tPmZsYWdzIHw9IFNZTUJPTF9ORVcgfCBTWU1CT0xfQ0hBTkdFRDsKKwkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX1ZBTElEOworCQlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCQljYXNlIFNfSU5UOgorCQljYXNlIFNfSEVYOgorCQljYXNlIFNfU1RSSU5HOgorCQkJaWYgKHN5bS0+dXNlci52YWwpCisJCQkJZnJlZShzeW0tPnVzZXIudmFsKTsKKwkJZGVmYXVsdDoKKwkJCXN5bS0+dXNlci52YWwgPSBOVUxMOworCQkJc3ltLT51c2VyLnRyaSA9IG5vOworCQl9CisJfQorCisJd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgaW4pKSB7CisJCWxpbmVubysrOworCQlzeW0gPSBOVUxMOworCQlzd2l0Y2ggKGxpbmVbMF0pIHsKKwkJY2FzZSAnIyc6CisJCQlpZiAobWVtY21wKGxpbmUgKyAyLCAiQ09ORklHXyIsIDcpKQorCQkJCWNvbnRpbnVlOworCQkJcCA9IHN0cmNocihsaW5lICsgOSwgJyAnKTsKKwkJCWlmICghcCkKKwkJCQljb250aW51ZTsKKwkJCSpwKysgPSAwOworCQkJaWYgKHN0cm5jbXAocCwgImlzIG5vdCBzZXQiLCAxMCkpCisJCQkJY29udGludWU7CisJCQlzeW0gPSBzeW1fZmluZChsaW5lICsgOSk7CisJCQlpZiAoIXN5bSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6IHRyeWluZyB0byBhc3NpZ24gbm9uZXhpc3RlbnQgc3ltYm9sICVzXG4iLCBuYW1lLCBsaW5lbm8sIGxpbmUgKyA5KTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJCQljYXNlIFNfQk9PTEVBTjoKKwkJCWNhc2UgU19UUklTVEFURToKKwkJCQlzeW0tPnVzZXIudHJpID0gbm87CisJCQkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX05FVzsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgJ0MnOgorCQkJaWYgKG1lbWNtcChsaW5lLCAiQ09ORklHXyIsIDcpKQorCQkJCWNvbnRpbnVlOworCQkJcCA9IHN0cmNocihsaW5lICsgNywgJz0nKTsKKwkJCWlmICghcCkKKwkJCQljb250aW51ZTsKKwkJCSpwKysgPSAwOworCQkJcDIgPSBzdHJjaHIocCwgJ1xuJyk7CisJCQlpZiAocDIpCisJCQkJKnAyID0gMDsKKwkJCXN5bSA9IHN5bV9maW5kKGxpbmUgKyA3KTsKKwkJCWlmICghc3ltKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICIlczolZDogdHJ5aW5nIHRvIGFzc2lnbiBub25leGlzdGVudCBzeW1ib2wgJXNcbiIsIG5hbWUsIGxpbmVubywgbGluZSArIDcpOworCQkJCWJyZWFrOworCQkJfQorCQkJc3dpdGNoIChzeW0tPnR5cGUpIHsKKwkJCWNhc2UgU19UUklTVEFURToKKwkJCQlpZiAocFswXSA9PSAnbScpIHsKKwkJCQkJc3ltLT51c2VyLnRyaSA9IG1vZDsKKwkJCQkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX05FVzsKKwkJCQkJYnJlYWs7CisJCQkJfQorCQkJY2FzZSBTX0JPT0xFQU46CisJCQkJaWYgKHBbMF0gPT0gJ3knKSB7CisJCQkJCXN5bS0+dXNlci50cmkgPSB5ZXM7CisJCQkJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9ORVc7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlpZiAocFswXSA9PSAnbicpIHsKKwkJCQkJc3ltLT51c2VyLnRyaSA9IG5vOworCQkJCQlzeW0tPmZsYWdzICY9IH5TWU1CT0xfTkVXOworCQkJCQlicmVhazsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIFNfU1RSSU5HOgorCQkJCWlmICgqcCsrICE9ICciJykKKwkJCQkJYnJlYWs7CisJCQkJZm9yIChwMiA9IHA7IChwMiA9IHN0cnBicmsocDIsICJcIlxcIikpOyBwMisrKSB7CisJCQkJCWlmICgqcDIgPT0gJyInKSB7CisJCQkJCQkqcDIgPSAwOworCQkJCQkJYnJlYWs7CisJCQkJCX0KKwkJCQkJbWVtbW92ZShwMiwgcDIgKyAxLCBzdHJsZW4ocDIpKTsKKwkJCQl9CisJCQkJaWYgKCFwMikgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOiBpbnZhbGlkIHN0cmluZyBmb3VuZFxuIiwgbmFtZSwgbGluZW5vKTsKKwkJCQkJZXhpdCgxKTsKKwkJCQl9CisJCQljYXNlIFNfSU5UOgorCQkJY2FzZSBTX0hFWDoKKwkJCQlpZiAoc3ltX3N0cmluZ192YWxpZChzeW0sIHApKSB7CisJCQkJCXN5bS0+dXNlci52YWwgPSBzdHJkdXAocCk7CisJCQkJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9ORVc7CisJCQkJfSBlbHNlIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsICIlczolZDogc3ltYm9sIHZhbHVlICclcycgaW52YWxpZCBmb3IgJXNcbiIsIG5hbWUsIGxpbmVubywgcCwgc3ltLT5uYW1lKTsKKwkJCQkJZXhpdCgxKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCTsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlICdcbic6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChzeW0gJiYgc3ltX2lzX2Nob2ljZV92YWx1ZShzeW0pKSB7CisJCQlzdHJ1Y3Qgc3ltYm9sICpjcyA9IHByb3BfZ2V0X3N5bWJvbChzeW1fZ2V0X2Nob2ljZV9wcm9wKHN5bSkpOworCQkJc3dpdGNoIChzeW0tPnVzZXIudHJpKSB7CisJCQljYXNlIG5vOgorCQkJCWJyZWFrOworCQkJY2FzZSBtb2Q6CisJCQkJaWYgKGNzLT51c2VyLnRyaSA9PSB5ZXMpCisJCQkJCS8qIHdhcm4/ICovOworCQkJCWJyZWFrOworCQkJY2FzZSB5ZXM6CisJCQkJaWYgKGNzLT51c2VyLnRyaSAhPSBubykKKwkJCQkJLyogd2Fybj8gKi87CisJCQkJY3MtPnVzZXIudmFsID0gc3ltOworCQkJCWJyZWFrOworCQkJfQorCQkJY3MtPnVzZXIudHJpID0gRV9PUihjcy0+dXNlci50cmksIHN5bS0+dXNlci50cmkpOworCQkJY3MtPmZsYWdzICY9IH5TWU1CT0xfTkVXOworCQl9CisJfQorCWZjbG9zZShpbik7CisKKwlpZiAobW9kdWxlc19zeW0pCisJCXN5bV9jYWxjX3ZhbHVlKG1vZHVsZXNfc3ltKTsKKwlmb3JfYWxsX3N5bWJvbHMoaSwgc3ltKSB7CisJCXN5bV9jYWxjX3ZhbHVlKHN5bSk7CisJCWlmIChzeW1faGFzX3ZhbHVlKHN5bSkgJiYgIXN5bV9pc19jaG9pY2VfdmFsdWUoc3ltKSkgeworCQkJaWYgKHN5bS0+dmlzaWJsZSA9PSBubykKKwkJCQlzeW0tPmZsYWdzIHw9IFNZTUJPTF9ORVc7CisJCQlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCQkJY2FzZSBTX1NUUklORzoKKwkJCWNhc2UgU19JTlQ6CisJCQljYXNlIFNfSEVYOgorCQkJCWlmICghc3ltX3N0cmluZ193aXRoaW5fcmFuZ2Uoc3ltLCBzeW0tPnVzZXIudmFsKSkKKwkJCQkJc3ltLT5mbGFncyB8PSBTWU1CT0xfTkVXOworCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlpZiAoIXN5bV9pc19jaG9pY2Uoc3ltKSkKKwkJCWNvbnRpbnVlOworCQlwcm9wID0gc3ltX2dldF9jaG9pY2VfcHJvcChzeW0pOworCQlmb3IgKGUgPSBwcm9wLT5leHByOyBlOyBlID0gZS0+bGVmdC5leHByKQorCQkJaWYgKGUtPnJpZ2h0LnN5bS0+dmlzaWJsZSAhPSBubykKKwkJCQlzeW0tPmZsYWdzIHw9IGUtPnJpZ2h0LnN5bS0+ZmxhZ3MgJiBTWU1CT0xfTkVXOworCX0KKworCXN5bV9jaGFuZ2VfY291bnQgPSAxOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBjb25mX3dyaXRlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJRklMRSAqb3V0LCAqb3V0X2g7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXN0cnVjdCBtZW51ICptZW51OworCWNvbnN0IGNoYXIgKmJhc2VuYW1lOworCWNoYXIgZGlybmFtZVsxMjhdLCB0bXBuYW1lWzEyOF0sIG5ld25hbWVbMTI4XTsKKwlpbnQgdHlwZSwgbDsKKwljb25zdCBjaGFyICpzdHI7CisJdGltZV90IG5vdzsKKwlpbnQgdXNlX3RpbWVzdGFtcCA9IDE7CisJY2hhciAqZW52OworCisJZGlybmFtZVswXSA9IDA7CisJaWYgKG5hbWUgJiYgbmFtZVswXSkgeworCQlzdHJ1Y3Qgc3RhdCBzdDsKKwkJY2hhciAqc2xhc2g7CisKKwkJaWYgKCFzdGF0KG5hbWUsICZzdCkgJiYgU19JU0RJUihzdC5zdF9tb2RlKSkgeworCQkJc3RyY3B5KGRpcm5hbWUsIG5hbWUpOworCQkJc3RyY2F0KGRpcm5hbWUsICIvIik7CisJCQliYXNlbmFtZSA9IGNvbmZfZGVmX2ZpbGVuYW1lOworCQl9IGVsc2UgaWYgKChzbGFzaCA9IHN0cnJjaHIobmFtZSwgJy8nKSkpIHsKKwkJCWludCBzaXplID0gc2xhc2ggLSBuYW1lICsgMTsKKwkJCW1lbWNweShkaXJuYW1lLCBuYW1lLCBzaXplKTsKKwkJCWRpcm5hbWVbc2l6ZV0gPSAwOworCQkJaWYgKHNsYXNoWzFdKQorCQkJCWJhc2VuYW1lID0gc2xhc2ggKyAxOworCQkJZWxzZQorCQkJCWJhc2VuYW1lID0gY29uZl9kZWZfZmlsZW5hbWU7CisJCX0gZWxzZQorCQkJYmFzZW5hbWUgPSBuYW1lOworCX0gZWxzZQorCQliYXNlbmFtZSA9IGNvbmZfZGVmX2ZpbGVuYW1lOworCisJc3ByaW50ZihuZXduYW1lLCAiJXMudG1wY29uZmlnLiVkIiwgZGlybmFtZSwgKGludClnZXRwaWQoKSk7CisJb3V0ID0gZm9wZW4obmV3bmFtZSwgInciKTsKKwlpZiAoIW91dCkKKwkJcmV0dXJuIDE7CisJb3V0X2ggPSBOVUxMOworCWlmICghbmFtZSkgeworCQlvdXRfaCA9IGZvcGVuKCIudG1wY29uZmlnLmgiLCAidyIpOworCQlpZiAoIW91dF9oKQorCQkJcmV0dXJuIDE7CisJfQorCXN5bSA9IHN5bV9sb29rdXAoIktFUk5FTFJFTEVBU0UiLCAwKTsKKwlzeW1fY2FsY192YWx1ZShzeW0pOworCXRpbWUoJm5vdyk7CisJZW52ID0gZ2V0ZW52KCJLQ09ORklHX05PVElNRVNUQU1QIik7CisJaWYgKGVudiAmJiAqZW52KQorCQl1c2VfdGltZXN0YW1wID0gMDsKKworCWZwcmludGYob3V0LCAiI1xuIgorCQkgICAgICIjIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1ha2UgY29uZmlnOiBkb24ndCBlZGl0XG4iCisJCSAgICAgIiMgTGludXgga2VybmVsIHZlcnNpb246ICVzXG4iCisJCSAgICAgIiVzJXMiCisJCSAgICAgIiNcbiIsCisJCSAgICAgc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKSwKKwkJICAgICB1c2VfdGltZXN0YW1wID8gIiMgIiA6ICIiLAorCQkgICAgIHVzZV90aW1lc3RhbXAgPyBjdGltZSgmbm93KSA6ICIiKTsKKwlpZiAob3V0X2gpCisJCWZwcmludGYob3V0X2gsICIvKlxuIgorCQkJICAgICAgICIgKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBDIGNvbmZpZzogZG9uJ3QgZWRpdFxuIgorCQkJICAgICAgICIgKiBMaW51eCBrZXJuZWwgdmVyc2lvbjogJXNcbiIKKwkJCSAgICAgICAiJXMlcyIKKwkJCSAgICAgICAiICovXG4iCisJCQkgICAgICAgIiNkZWZpbmUgQVVUT0NPTkZfSU5DTFVERURcbiIsCisJCQkgICAgICAgc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKSwKKwkJCSAgICAgICB1c2VfdGltZXN0YW1wID8gIiAqICIgOiAiIiwKKwkJCSAgICAgICB1c2VfdGltZXN0YW1wID8gY3RpbWUoJm5vdykgOiAiIik7CisKKwlpZiAoIXN5bV9jaGFuZ2VfY291bnQpCisJCXN5bV9jbGVhcl9hbGxfdmFsaWQoKTsKKworCW1lbnUgPSByb290bWVudS5saXN0OworCXdoaWxlIChtZW51KSB7CisJCXN5bSA9IG1lbnUtPnN5bTsKKwkJaWYgKCFzeW0pIHsKKwkJCWlmICghbWVudV9pc192aXNpYmxlKG1lbnUpKQorCQkJCWdvdG8gbmV4dDsKKwkJCXN0ciA9IG1lbnVfZ2V0X3Byb21wdChtZW51KTsKKwkJCWZwcmludGYob3V0LCAiXG4iCisJCQkJICAgICAiI1xuIgorCQkJCSAgICAgIiMgJXNcbiIKKwkJCQkgICAgICIjXG4iLCBzdHIpOworCQkJaWYgKG91dF9oKQorCQkJCWZwcmludGYob3V0X2gsICJcbiIKKwkJCQkJICAgICAgICIvKlxuIgorCQkJCQkgICAgICAgIiAqICVzXG4iCisJCQkJCSAgICAgICAiICovXG4iLCBzdHIpOworCQl9IGVsc2UgaWYgKCEoc3ltLT5mbGFncyAmIFNZTUJPTF9DSE9JQ0UpKSB7CisJCQlzeW1fY2FsY192YWx1ZShzeW0pOworCQkJaWYgKCEoc3ltLT5mbGFncyAmIFNZTUJPTF9XUklURSkpCisJCQkJZ290byBuZXh0OworCQkJc3ltLT5mbGFncyAmPSB+U1lNQk9MX1dSSVRFOworCQkJdHlwZSA9IHN5bS0+dHlwZTsKKwkJCWlmICh0eXBlID09IFNfVFJJU1RBVEUpIHsKKwkJCQlzeW1fY2FsY192YWx1ZShtb2R1bGVzX3N5bSk7CisJCQkJaWYgKG1vZHVsZXNfc3ltLT5jdXJyLnRyaSA9PSBubykKKwkJCQkJdHlwZSA9IFNfQk9PTEVBTjsKKwkJCX0KKwkJCXN3aXRjaCAodHlwZSkgeworCQkJY2FzZSBTX0JPT0xFQU46CisJCQljYXNlIFNfVFJJU1RBVEU6CisJCQkJc3dpdGNoIChzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSkpIHsKKwkJCQljYXNlIG5vOgorCQkJCQlmcHJpbnRmKG91dCwgIiMgQ09ORklHXyVzIGlzIG5vdCBzZXRcbiIsIHN5bS0+bmFtZSk7CisJCQkJCWlmIChvdXRfaCkKKwkJCQkJCWZwcmludGYob3V0X2gsICIjdW5kZWYgQ09ORklHXyVzXG4iLCBzeW0tPm5hbWUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIG1vZDoKKwkJCQkJZnByaW50ZihvdXQsICJDT05GSUdfJXM9bVxuIiwgc3ltLT5uYW1lKTsKKwkJCQkJaWYgKG91dF9oKQorCQkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgQ09ORklHXyVzX01PRFVMRSAxXG4iLCBzeW0tPm5hbWUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIHllczoKKwkJCQkJZnByaW50ZihvdXQsICJDT05GSUdfJXM9eVxuIiwgc3ltLT5uYW1lKTsKKwkJCQkJaWYgKG91dF9oKQorCQkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgQ09ORklHXyVzIDFcbiIsIHN5bS0+bmFtZSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgU19TVFJJTkc6CisJCQkJLy8gZml4IG1lCisJCQkJc3RyID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKTsKKwkJCQlmcHJpbnRmKG91dCwgIkNPTkZJR18lcz1cIiIsIHN5bS0+bmFtZSk7CisJCQkJaWYgKG91dF9oKQorCQkJCQlmcHJpbnRmKG91dF9oLCAiI2RlZmluZSBDT05GSUdfJXMgXCIiLCBzeW0tPm5hbWUpOworCQkJCWRvIHsKKwkJCQkJbCA9IHN0cmNzcG4oc3RyLCAiXCJcXCIpOworCQkJCQlpZiAobCkgeworCQkJCQkJZndyaXRlKHN0ciwgbCwgMSwgb3V0KTsKKwkJCQkJCWlmIChvdXRfaCkKKwkJCQkJCQlmd3JpdGUoc3RyLCBsLCAxLCBvdXRfaCk7CisJCQkJCX0KKwkJCQkJc3RyICs9IGw7CisJCQkJCXdoaWxlICgqc3RyID09ICdcXCcgfHwgKnN0ciA9PSAnIicpIHsKKwkJCQkJCWZwcmludGYob3V0LCAiXFwlYyIsICpzdHIpOworCQkJCQkJaWYgKG91dF9oKQorCQkJCQkJCWZwcmludGYob3V0X2gsICJcXCVjIiwgKnN0cik7CisJCQkJCQlzdHIrKzsKKwkJCQkJfQorCQkJCX0gd2hpbGUgKCpzdHIpOworCQkJCWZwdXRzKCJcIlxuIiwgb3V0KTsKKwkJCQlpZiAob3V0X2gpCisJCQkJCWZwdXRzKCJcIlxuIiwgb3V0X2gpOworCQkJCWJyZWFrOworCQkJY2FzZSBTX0hFWDoKKwkJCQlzdHIgPSBzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pOworCQkJCWlmIChzdHJbMF0gIT0gJzAnIHx8IChzdHJbMV0gIT0gJ3gnICYmIHN0clsxXSAhPSAnWCcpKSB7CisJCQkJCWZwcmludGYob3V0LCAiQ09ORklHXyVzPSVzXG4iLCBzeW0tPm5hbWUsIHN0cik7CisJCQkJCWlmIChvdXRfaCkKKwkJCQkJCWZwcmludGYob3V0X2gsICIjZGVmaW5lIENPTkZJR18lcyAweCVzXG4iLCBzeW0tPm5hbWUsIHN0cik7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCWNhc2UgU19JTlQ6CisJCQkJc3RyID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKTsKKwkJCQlmcHJpbnRmKG91dCwgIkNPTkZJR18lcz0lc1xuIiwgc3ltLT5uYW1lLCBzdHIpOworCQkJCWlmIChvdXRfaCkKKwkJCQkJZnByaW50ZihvdXRfaCwgIiNkZWZpbmUgQ09ORklHXyVzICVzXG4iLCBzeW0tPm5hbWUsIHN0cik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKworCW5leHQ6CisJCWlmIChtZW51LT5saXN0KSB7CisJCQltZW51ID0gbWVudS0+bGlzdDsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmIChtZW51LT5uZXh0KQorCQkJbWVudSA9IG1lbnUtPm5leHQ7CisJCWVsc2Ugd2hpbGUgKChtZW51ID0gbWVudS0+cGFyZW50KSkgeworCQkJaWYgKG1lbnUtPm5leHQpIHsKKwkJCQltZW51ID0gbWVudS0+bmV4dDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KKwlmY2xvc2Uob3V0KTsKKwlpZiAob3V0X2gpIHsKKwkJZmNsb3NlKG91dF9oKTsKKwkJcmVuYW1lKCIudG1wY29uZmlnLmgiLCAiaW5jbHVkZS9saW51eC9hdXRvY29uZi5oIik7CisJCWZpbGVfd3JpdGVfZGVwKE5VTEwpOworCX0KKwlpZiAoIW5hbWUgfHwgYmFzZW5hbWUgIT0gY29uZl9kZWZfZmlsZW5hbWUpIHsKKwkJaWYgKCFuYW1lKQorCQkJbmFtZSA9IGNvbmZfZGVmX2ZpbGVuYW1lOworCQlzcHJpbnRmKHRtcG5hbWUsICIlcy5vbGQiLCBuYW1lKTsKKwkJcmVuYW1lKG5hbWUsIHRtcG5hbWUpOworCX0KKwlzcHJpbnRmKHRtcG5hbWUsICIlcyVzIiwgZGlybmFtZSwgYmFzZW5hbWUpOworCWlmIChyZW5hbWUobmV3bmFtZSwgdG1wbmFtZSkpCisJCXJldHVybiAxOworCisJc3ltX2NoYW5nZV9jb3VudCA9IDA7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9leHByLmMgYi9zY3JpcHRzL2tjb25maWcvZXhwci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwZTRmOWQKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvZXhwci5jCkBAIC0wLDAgKzEsMTA5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIExLQ19ESVJFQ1RfTElOSworI2luY2x1ZGUgImxrYy5oIgorCisjZGVmaW5lIERFQlVHX0VYUFIJMAorCitzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY19zeW1ib2woc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBleHByICplID0gbWFsbG9jKHNpemVvZigqZSkpOworCW1lbXNldChlLCAwLCBzaXplb2YoKmUpKTsKKwllLT50eXBlID0gRV9TWU1CT0w7CisJZS0+bGVmdC5zeW0gPSBzeW07CisJcmV0dXJuIGU7Cit9CisKK3N0cnVjdCBleHByICpleHByX2FsbG9jX29uZShlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3QgZXhwciAqY2UpCit7CisJc3RydWN0IGV4cHIgKmUgPSBtYWxsb2Moc2l6ZW9mKCplKSk7CisJbWVtc2V0KGUsIDAsIHNpemVvZigqZSkpOworCWUtPnR5cGUgPSB0eXBlOworCWUtPmxlZnQuZXhwciA9IGNlOworCXJldHVybiBlOworfQorCitzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY190d28oZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpCit7CisJc3RydWN0IGV4cHIgKmUgPSBtYWxsb2Moc2l6ZW9mKCplKSk7CisJbWVtc2V0KGUsIDAsIHNpemVvZigqZSkpOworCWUtPnR5cGUgPSB0eXBlOworCWUtPmxlZnQuZXhwciA9IGUxOworCWUtPnJpZ2h0LmV4cHIgPSBlMjsKKwlyZXR1cm4gZTsKK30KKworc3RydWN0IGV4cHIgKmV4cHJfYWxsb2NfY29tcChlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3Qgc3ltYm9sICpzMSwgc3RydWN0IHN5bWJvbCAqczIpCit7CisJc3RydWN0IGV4cHIgKmUgPSBtYWxsb2Moc2l6ZW9mKCplKSk7CisJbWVtc2V0KGUsIDAsIHNpemVvZigqZSkpOworCWUtPnR5cGUgPSB0eXBlOworCWUtPmxlZnQuc3ltID0gczE7CisJZS0+cmlnaHQuc3ltID0gczI7CisJcmV0dXJuIGU7Cit9CisKK3N0cnVjdCBleHByICpleHByX2FsbG9jX2FuZChzdHJ1Y3QgZXhwciAqZTEsIHN0cnVjdCBleHByICplMikKK3sKKwlpZiAoIWUxKQorCQlyZXR1cm4gZTI7CisJcmV0dXJuIGUyID8gZXhwcl9hbGxvY190d28oRV9BTkQsIGUxLCBlMikgOiBlMTsKK30KKworc3RydWN0IGV4cHIgKmV4cHJfYWxsb2Nfb3Ioc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpCit7CisJaWYgKCFlMSkKKwkJcmV0dXJuIGUyOworCXJldHVybiBlMiA/IGV4cHJfYWxsb2NfdHdvKEVfT1IsIGUxLCBlMikgOiBlMTsKK30KKworc3RydWN0IGV4cHIgKmV4cHJfY29weShzdHJ1Y3QgZXhwciAqb3JnKQoreworCXN0cnVjdCBleHByICplOworCisJaWYgKCFvcmcpCisJCXJldHVybiBOVUxMOworCisJZSA9IG1hbGxvYyhzaXplb2YoKm9yZykpOworCW1lbWNweShlLCBvcmcsIHNpemVvZigqb3JnKSk7CisJc3dpdGNoIChvcmctPnR5cGUpIHsKKwljYXNlIEVfU1lNQk9MOgorCQllLT5sZWZ0ID0gb3JnLT5sZWZ0OworCQlicmVhazsKKwljYXNlIEVfTk9UOgorCQllLT5sZWZ0LmV4cHIgPSBleHByX2NvcHkob3JnLT5sZWZ0LmV4cHIpOworCQlicmVhazsKKwljYXNlIEVfRVFVQUw6CisJY2FzZSBFX1VORVFVQUw6CisJCWUtPmxlZnQuc3ltID0gb3JnLT5sZWZ0LnN5bTsKKwkJZS0+cmlnaHQuc3ltID0gb3JnLT5yaWdodC5zeW07CisJCWJyZWFrOworCWNhc2UgRV9BTkQ6CisJY2FzZSBFX09SOgorCWNhc2UgRV9DSE9JQ0U6CisJCWUtPmxlZnQuZXhwciA9IGV4cHJfY29weShvcmctPmxlZnQuZXhwcik7CisJCWUtPnJpZ2h0LmV4cHIgPSBleHByX2NvcHkob3JnLT5yaWdodC5leHByKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcHJpbnRmKCJjYW4ndCBjb3B5IHR5cGUgJWRcbiIsIGUtPnR5cGUpOworCQlmcmVlKGUpOworCQllID0gTlVMTDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIGU7Cit9CisKK3ZvaWQgZXhwcl9mcmVlKHN0cnVjdCBleHByICplKQoreworCWlmICghZSkKKwkJcmV0dXJuOworCisJc3dpdGNoIChlLT50eXBlKSB7CisJY2FzZSBFX1NZTUJPTDoKKwkJYnJlYWs7CisJY2FzZSBFX05PVDoKKwkJZXhwcl9mcmVlKGUtPmxlZnQuZXhwcik7CisJCXJldHVybjsKKwljYXNlIEVfRVFVQUw6CisJY2FzZSBFX1VORVFVQUw6CisJCWJyZWFrOworCWNhc2UgRV9PUjoKKwljYXNlIEVfQU5EOgorCQlleHByX2ZyZWUoZS0+bGVmdC5leHByKTsKKwkJZXhwcl9mcmVlKGUtPnJpZ2h0LmV4cHIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlwcmludGYoImhvdyB0byBmcmVlIHR5cGUgJWQ/XG4iLCBlLT50eXBlKTsKKwkJYnJlYWs7CisJfQorCWZyZWUoZSk7Cit9CisKK3N0YXRpYyBpbnQgdHJhbnNfY291bnQ7CisKKyNkZWZpbmUgZTEgKCplcDEpCisjZGVmaW5lIGUyICgqZXAyKQorCitzdGF0aWMgdm9pZCBfX2V4cHJfZWxpbWluYXRlX2VxKGVudW0gZXhwcl90eXBlIHR5cGUsIHN0cnVjdCBleHByICoqZXAxLCBzdHJ1Y3QgZXhwciAqKmVwMikKK3sKKwlpZiAoZTEtPnR5cGUgPT0gdHlwZSkgeworCQlfX2V4cHJfZWxpbWluYXRlX2VxKHR5cGUsICZlMS0+bGVmdC5leHByLCAmZTIpOworCQlfX2V4cHJfZWxpbWluYXRlX2VxKHR5cGUsICZlMS0+cmlnaHQuZXhwciwgJmUyKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZTItPnR5cGUgPT0gdHlwZSkgeworCQlfX2V4cHJfZWxpbWluYXRlX2VxKHR5cGUsICZlMSwgJmUyLT5sZWZ0LmV4cHIpOworCQlfX2V4cHJfZWxpbWluYXRlX2VxKHR5cGUsICZlMSwgJmUyLT5yaWdodC5leHByKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZTEtPnR5cGUgPT0gRV9TWU1CT0wgJiYgZTItPnR5cGUgPT0gRV9TWU1CT0wgJiYKKwkgICAgZTEtPmxlZnQuc3ltID09IGUyLT5sZWZ0LnN5bSAmJiAoZTEtPmxlZnQuc3ltLT5mbGFncyAmIChTWU1CT0xfWUVTfFNZTUJPTF9OTykpKQorCQlyZXR1cm47CisJaWYgKCFleHByX2VxKGUxLCBlMikpCisJCXJldHVybjsKKwl0cmFuc19jb3VudCsrOworCWV4cHJfZnJlZShlMSk7IGV4cHJfZnJlZShlMik7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBFX09SOgorCQllMSA9IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfbm8pOworCQllMiA9IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfbm8pOworCQlicmVhazsKKwljYXNlIEVfQU5EOgorCQllMSA9IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfeWVzKTsKKwkJZTIgPSBleHByX2FsbG9jX3N5bWJvbCgmc3ltYm9sX3llcyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCTsKKwl9Cit9CisKK3ZvaWQgZXhwcl9lbGltaW5hdGVfZXEoc3RydWN0IGV4cHIgKiplcDEsIHN0cnVjdCBleHByICoqZXAyKQoreworCWlmICghZTEgfHwgIWUyKQorCQlyZXR1cm47CisJc3dpdGNoIChlMS0+dHlwZSkgeworCWNhc2UgRV9PUjoKKwljYXNlIEVfQU5EOgorCQlfX2V4cHJfZWxpbWluYXRlX2VxKGUxLT50eXBlLCBlcDEsIGVwMik7CisJZGVmYXVsdDoKKwkJOworCX0KKwlpZiAoZTEtPnR5cGUgIT0gZTItPnR5cGUpIHN3aXRjaCAoZTItPnR5cGUpIHsKKwljYXNlIEVfT1I6CisJY2FzZSBFX0FORDoKKwkJX19leHByX2VsaW1pbmF0ZV9lcShlMi0+dHlwZSwgZXAxLCBlcDIpOworCWRlZmF1bHQ6CisJCTsKKwl9CisJZTEgPSBleHByX2VsaW1pbmF0ZV95bihlMSk7CisJZTIgPSBleHByX2VsaW1pbmF0ZV95bihlMik7Cit9CisKKyN1bmRlZiBlMQorI3VuZGVmIGUyCisKK2ludCBleHByX2VxKHN0cnVjdCBleHByICplMSwgc3RydWN0IGV4cHIgKmUyKQoreworCWludCByZXMsIG9sZF9jb3VudDsKKworCWlmIChlMS0+dHlwZSAhPSBlMi0+dHlwZSkKKwkJcmV0dXJuIDA7CisJc3dpdGNoIChlMS0+dHlwZSkgeworCWNhc2UgRV9FUVVBTDoKKwljYXNlIEVfVU5FUVVBTDoKKwkJcmV0dXJuIGUxLT5sZWZ0LnN5bSA9PSBlMi0+bGVmdC5zeW0gJiYgZTEtPnJpZ2h0LnN5bSA9PSBlMi0+cmlnaHQuc3ltOworCWNhc2UgRV9TWU1CT0w6CisJCXJldHVybiBlMS0+bGVmdC5zeW0gPT0gZTItPmxlZnQuc3ltOworCWNhc2UgRV9OT1Q6CisJCXJldHVybiBleHByX2VxKGUxLT5sZWZ0LmV4cHIsIGUyLT5sZWZ0LmV4cHIpOworCWNhc2UgRV9BTkQ6CisJY2FzZSBFX09SOgorCQllMSA9IGV4cHJfY29weShlMSk7CisJCWUyID0gZXhwcl9jb3B5KGUyKTsKKwkJb2xkX2NvdW50ID0gdHJhbnNfY291bnQ7CisJCWV4cHJfZWxpbWluYXRlX2VxKCZlMSwgJmUyKTsKKwkJcmVzID0gKGUxLT50eXBlID09IEVfU1lNQk9MICYmIGUyLT50eXBlID09IEVfU1lNQk9MICYmCisJCSAgICAgICBlMS0+bGVmdC5zeW0gPT0gZTItPmxlZnQuc3ltKTsKKwkJZXhwcl9mcmVlKGUxKTsKKwkJZXhwcl9mcmVlKGUyKTsKKwkJdHJhbnNfY291bnQgPSBvbGRfY291bnQ7CisJCXJldHVybiByZXM7CisJY2FzZSBFX0NIT0lDRToKKwljYXNlIEVfUkFOR0U6CisJY2FzZSBFX05PTkU6CisJCS8qIHBhbmljICovOworCX0KKworCWlmIChERUJVR19FWFBSKSB7CisJCWV4cHJfZnByaW50KGUxLCBzdGRvdXQpOworCQlwcmludGYoIiA9ICIpOworCQlleHByX2ZwcmludChlMiwgc3Rkb3V0KTsKKwkJcHJpbnRmKCIgP1xuIik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBleHByICpleHByX2VsaW1pbmF0ZV95bihzdHJ1Y3QgZXhwciAqZSkKK3sKKwlzdHJ1Y3QgZXhwciAqdG1wOworCisJaWYgKGUpIHN3aXRjaCAoZS0+dHlwZSkgeworCWNhc2UgRV9BTkQ6CisJCWUtPmxlZnQuZXhwciA9IGV4cHJfZWxpbWluYXRlX3luKGUtPmxlZnQuZXhwcik7CisJCWUtPnJpZ2h0LmV4cHIgPSBleHByX2VsaW1pbmF0ZV95bihlLT5yaWdodC5leHByKTsKKwkJaWYgKGUtPmxlZnQuZXhwci0+dHlwZSA9PSBFX1NZTUJPTCkgeworCQkJaWYgKGUtPmxlZnQuZXhwci0+bGVmdC5zeW0gPT0gJnN5bWJvbF9ubykgeworCQkJCWV4cHJfZnJlZShlLT5sZWZ0LmV4cHIpOworCQkJCWV4cHJfZnJlZShlLT5yaWdodC5leHByKTsKKwkJCQllLT50eXBlID0gRV9TWU1CT0w7CisJCQkJZS0+bGVmdC5zeW0gPSAmc3ltYm9sX25vOworCQkJCWUtPnJpZ2h0LmV4cHIgPSBOVUxMOworCQkJCXJldHVybiBlOworCQkJfSBlbHNlIGlmIChlLT5sZWZ0LmV4cHItPmxlZnQuc3ltID09ICZzeW1ib2xfeWVzKSB7CisJCQkJZnJlZShlLT5sZWZ0LmV4cHIpOworCQkJCXRtcCA9IGUtPnJpZ2h0LmV4cHI7CisJCQkJKmUgPSAqKGUtPnJpZ2h0LmV4cHIpOworCQkJCWZyZWUodG1wKTsKKwkJCQlyZXR1cm4gZTsKKwkJCX0KKwkJfQorCQlpZiAoZS0+cmlnaHQuZXhwci0+dHlwZSA9PSBFX1NZTUJPTCkgeworCQkJaWYgKGUtPnJpZ2h0LmV4cHItPmxlZnQuc3ltID09ICZzeW1ib2xfbm8pIHsKKwkJCQlleHByX2ZyZWUoZS0+bGVmdC5leHByKTsKKwkJCQlleHByX2ZyZWUoZS0+cmlnaHQuZXhwcik7CisJCQkJZS0+dHlwZSA9IEVfU1lNQk9MOworCQkJCWUtPmxlZnQuc3ltID0gJnN5bWJvbF9ubzsKKwkJCQllLT5yaWdodC5leHByID0gTlVMTDsKKwkJCQlyZXR1cm4gZTsKKwkJCX0gZWxzZSBpZiAoZS0+cmlnaHQuZXhwci0+bGVmdC5zeW0gPT0gJnN5bWJvbF95ZXMpIHsKKwkJCQlmcmVlKGUtPnJpZ2h0LmV4cHIpOworCQkJCXRtcCA9IGUtPmxlZnQuZXhwcjsKKwkJCQkqZSA9ICooZS0+bGVmdC5leHByKTsKKwkJCQlmcmVlKHRtcCk7CisJCQkJcmV0dXJuIGU7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFX09SOgorCQllLT5sZWZ0LmV4cHIgPSBleHByX2VsaW1pbmF0ZV95bihlLT5sZWZ0LmV4cHIpOworCQllLT5yaWdodC5leHByID0gZXhwcl9lbGltaW5hdGVfeW4oZS0+cmlnaHQuZXhwcik7CisJCWlmIChlLT5sZWZ0LmV4cHItPnR5cGUgPT0gRV9TWU1CT0wpIHsKKwkJCWlmIChlLT5sZWZ0LmV4cHItPmxlZnQuc3ltID09ICZzeW1ib2xfbm8pIHsKKwkJCQlmcmVlKGUtPmxlZnQuZXhwcik7CisJCQkJdG1wID0gZS0+cmlnaHQuZXhwcjsKKwkJCQkqZSA9ICooZS0+cmlnaHQuZXhwcik7CisJCQkJZnJlZSh0bXApOworCQkJCXJldHVybiBlOworCQkJfSBlbHNlIGlmIChlLT5sZWZ0LmV4cHItPmxlZnQuc3ltID09ICZzeW1ib2xfeWVzKSB7CisJCQkJZXhwcl9mcmVlKGUtPmxlZnQuZXhwcik7CisJCQkJZXhwcl9mcmVlKGUtPnJpZ2h0LmV4cHIpOworCQkJCWUtPnR5cGUgPSBFX1NZTUJPTDsKKwkJCQllLT5sZWZ0LnN5bSA9ICZzeW1ib2xfeWVzOworCQkJCWUtPnJpZ2h0LmV4cHIgPSBOVUxMOworCQkJCXJldHVybiBlOworCQkJfQorCQl9CisJCWlmIChlLT5yaWdodC5leHByLT50eXBlID09IEVfU1lNQk9MKSB7CisJCQlpZiAoZS0+cmlnaHQuZXhwci0+bGVmdC5zeW0gPT0gJnN5bWJvbF9ubykgeworCQkJCWZyZWUoZS0+cmlnaHQuZXhwcik7CisJCQkJdG1wID0gZS0+bGVmdC5leHByOworCQkJCSplID0gKihlLT5sZWZ0LmV4cHIpOworCQkJCWZyZWUodG1wKTsKKwkJCQlyZXR1cm4gZTsKKwkJCX0gZWxzZSBpZiAoZS0+cmlnaHQuZXhwci0+bGVmdC5zeW0gPT0gJnN5bWJvbF95ZXMpIHsKKwkJCQlleHByX2ZyZWUoZS0+bGVmdC5leHByKTsKKwkJCQlleHByX2ZyZWUoZS0+cmlnaHQuZXhwcik7CisJCQkJZS0+dHlwZSA9IEVfU1lNQk9MOworCQkJCWUtPmxlZnQuc3ltID0gJnN5bWJvbF95ZXM7CisJCQkJZS0+cmlnaHQuZXhwciA9IE5VTEw7CisJCQkJcmV0dXJuIGU7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJOworCX0KKwlyZXR1cm4gZTsKK30KKworLyoKKyAqIGJvb2wgRk9PIT1uID0+IEZPTworICovCitzdHJ1Y3QgZXhwciAqZXhwcl90cmFuc19ib29sKHN0cnVjdCBleHByICplKQoreworCWlmICghZSkKKwkJcmV0dXJuIE5VTEw7CisJc3dpdGNoIChlLT50eXBlKSB7CisJY2FzZSBFX0FORDoKKwljYXNlIEVfT1I6CisJY2FzZSBFX05PVDoKKwkJZS0+bGVmdC5leHByID0gZXhwcl90cmFuc19ib29sKGUtPmxlZnQuZXhwcik7CisJCWUtPnJpZ2h0LmV4cHIgPSBleHByX3RyYW5zX2Jvb2woZS0+cmlnaHQuZXhwcik7CisJCWJyZWFrOworCWNhc2UgRV9VTkVRVUFMOgorCQkvLyBGT08hPW4gLT4gRk9PCisJCWlmIChlLT5sZWZ0LnN5bS0+dHlwZSA9PSBTX1RSSVNUQVRFKSB7CisJCQlpZiAoZS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbm8pIHsKKwkJCQllLT50eXBlID0gRV9TWU1CT0w7CisJCQkJZS0+cmlnaHQuc3ltID0gTlVMTDsKKwkJCX0KKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQk7CisJfQorCXJldHVybiBlOworfQorCisvKgorICogZTEgfHwgZTIgLT4gPworICovCitzdHJ1Y3QgZXhwciAqZXhwcl9qb2luX29yKHN0cnVjdCBleHByICplMSwgc3RydWN0IGV4cHIgKmUyKQoreworCXN0cnVjdCBleHByICp0bXA7CisJc3RydWN0IHN5bWJvbCAqc3ltMSwgKnN5bTI7CisKKwlpZiAoZXhwcl9lcShlMSwgZTIpKQorCQlyZXR1cm4gZXhwcl9jb3B5KGUxKTsKKwlpZiAoZTEtPnR5cGUgIT0gRV9FUVVBTCAmJiBlMS0+dHlwZSAhPSBFX1VORVFVQUwgJiYgZTEtPnR5cGUgIT0gRV9TWU1CT0wgJiYgZTEtPnR5cGUgIT0gRV9OT1QpCisJCXJldHVybiBOVUxMOworCWlmIChlMi0+dHlwZSAhPSBFX0VRVUFMICYmIGUyLT50eXBlICE9IEVfVU5FUVVBTCAmJiBlMi0+dHlwZSAhPSBFX1NZTUJPTCAmJiBlMi0+dHlwZSAhPSBFX05PVCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKGUxLT50eXBlID09IEVfTk9UKSB7CisJCXRtcCA9IGUxLT5sZWZ0LmV4cHI7CisJCWlmICh0bXAtPnR5cGUgIT0gRV9FUVVBTCAmJiB0bXAtPnR5cGUgIT0gRV9VTkVRVUFMICYmIHRtcC0+dHlwZSAhPSBFX1NZTUJPTCkKKwkJCXJldHVybiBOVUxMOworCQlzeW0xID0gdG1wLT5sZWZ0LnN5bTsKKwl9IGVsc2UKKwkJc3ltMSA9IGUxLT5sZWZ0LnN5bTsKKwlpZiAoZTItPnR5cGUgPT0gRV9OT1QpIHsKKwkJaWYgKGUyLT5sZWZ0LmV4cHItPnR5cGUgIT0gRV9TWU1CT0wpCisJCQlyZXR1cm4gTlVMTDsKKwkJc3ltMiA9IGUyLT5sZWZ0LmV4cHItPmxlZnQuc3ltOworCX0gZWxzZQorCQlzeW0yID0gZTItPmxlZnQuc3ltOworCWlmIChzeW0xICE9IHN5bTIpCisJCXJldHVybiBOVUxMOworCWlmIChzeW0xLT50eXBlICE9IFNfQk9PTEVBTiAmJiBzeW0xLT50eXBlICE9IFNfVFJJU1RBVEUpCisJCXJldHVybiBOVUxMOworCWlmIChzeW0xLT50eXBlID09IFNfVFJJU1RBVEUpIHsKKwkJaWYgKGUxLT50eXBlID09IEVfRVFVQUwgJiYgZTItPnR5cGUgPT0gRV9FUVVBTCAmJgorCQkgICAgKChlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfeWVzICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QpIHx8CisJCSAgICAgKGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QgJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcykpKSB7CisJCQkvLyAoYT0neScpIHx8IChhPSdtJykgLT4gKGEhPSduJykKKwkJCXJldHVybiBleHByX2FsbG9jX2NvbXAoRV9VTkVRVUFMLCBzeW0xLCAmc3ltYm9sX25vKTsKKwkJfQorCQlpZiAoZTEtPnR5cGUgPT0gRV9FUVVBTCAmJiBlMi0+dHlwZSA9PSBFX0VRVUFMICYmCisJCSAgICAoKGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMgJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX25vKSB8fAorCQkgICAgIChlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbm8gJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcykpKSB7CisJCQkvLyAoYT0neScpIHx8IChhPSduJykgLT4gKGEhPSdtJykKKwkJCXJldHVybiBleHByX2FsbG9jX2NvbXAoRV9VTkVRVUFMLCBzeW0xLCAmc3ltYm9sX21vZCk7CisJCX0KKwkJaWYgKGUxLT50eXBlID09IEVfRVFVQUwgJiYgZTItPnR5cGUgPT0gRV9FUVVBTCAmJgorCQkgICAgKChlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9ubykgfHwKKwkJICAgICAoZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX25vICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QpKSkgeworCQkJLy8gKGE9J20nKSB8fCAoYT0nbicpIC0+IChhIT0neScpCisJCQlyZXR1cm4gZXhwcl9hbGxvY19jb21wKEVfVU5FUVVBTCwgc3ltMSwgJnN5bWJvbF95ZXMpOworCQl9CisJfQorCWlmIChzeW0xLT50eXBlID09IFNfQk9PTEVBTiAmJiBzeW0xID09IHN5bTIpIHsKKwkJaWYgKChlMS0+dHlwZSA9PSBFX05PVCAmJiBlMS0+bGVmdC5leHByLT50eXBlID09IEVfU1lNQk9MICYmIGUyLT50eXBlID09IEVfU1lNQk9MKSB8fAorCQkgICAgKGUyLT50eXBlID09IEVfTk9UICYmIGUyLT5sZWZ0LmV4cHItPnR5cGUgPT0gRV9TWU1CT0wgJiYgZTEtPnR5cGUgPT0gRV9TWU1CT0wpKQorCQkJcmV0dXJuIGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfeWVzKTsKKwl9CisKKwlpZiAoREVCVUdfRVhQUikgeworCQlwcmludGYoIm9wdGltaXplICgiKTsKKwkJZXhwcl9mcHJpbnQoZTEsIHN0ZG91dCk7CisJCXByaW50ZigiKSB8fCAoIik7CisJCWV4cHJfZnByaW50KGUyLCBzdGRvdXQpOworCQlwcmludGYoIik/XG4iKTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBleHByICpleHByX2pvaW5fYW5kKHN0cnVjdCBleHByICplMSwgc3RydWN0IGV4cHIgKmUyKQoreworCXN0cnVjdCBleHByICp0bXA7CisJc3RydWN0IHN5bWJvbCAqc3ltMSwgKnN5bTI7CisKKwlpZiAoZXhwcl9lcShlMSwgZTIpKQorCQlyZXR1cm4gZXhwcl9jb3B5KGUxKTsKKwlpZiAoZTEtPnR5cGUgIT0gRV9FUVVBTCAmJiBlMS0+dHlwZSAhPSBFX1VORVFVQUwgJiYgZTEtPnR5cGUgIT0gRV9TWU1CT0wgJiYgZTEtPnR5cGUgIT0gRV9OT1QpCisJCXJldHVybiBOVUxMOworCWlmIChlMi0+dHlwZSAhPSBFX0VRVUFMICYmIGUyLT50eXBlICE9IEVfVU5FUVVBTCAmJiBlMi0+dHlwZSAhPSBFX1NZTUJPTCAmJiBlMi0+dHlwZSAhPSBFX05PVCkKKwkJcmV0dXJuIE5VTEw7CisJaWYgKGUxLT50eXBlID09IEVfTk9UKSB7CisJCXRtcCA9IGUxLT5sZWZ0LmV4cHI7CisJCWlmICh0bXAtPnR5cGUgIT0gRV9FUVVBTCAmJiB0bXAtPnR5cGUgIT0gRV9VTkVRVUFMICYmIHRtcC0+dHlwZSAhPSBFX1NZTUJPTCkKKwkJCXJldHVybiBOVUxMOworCQlzeW0xID0gdG1wLT5sZWZ0LnN5bTsKKwl9IGVsc2UKKwkJc3ltMSA9IGUxLT5sZWZ0LnN5bTsKKwlpZiAoZTItPnR5cGUgPT0gRV9OT1QpIHsKKwkJaWYgKGUyLT5sZWZ0LmV4cHItPnR5cGUgIT0gRV9TWU1CT0wpCisJCQlyZXR1cm4gTlVMTDsKKwkJc3ltMiA9IGUyLT5sZWZ0LmV4cHItPmxlZnQuc3ltOworCX0gZWxzZQorCQlzeW0yID0gZTItPmxlZnQuc3ltOworCWlmIChzeW0xICE9IHN5bTIpCisJCXJldHVybiBOVUxMOworCWlmIChzeW0xLT50eXBlICE9IFNfQk9PTEVBTiAmJiBzeW0xLT50eXBlICE9IFNfVFJJU1RBVEUpCisJCXJldHVybiBOVUxMOworCisJaWYgKChlMS0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlMi0+dHlwZSA9PSBFX0VRVUFMICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMpIHx8CisJICAgIChlMi0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlMS0+dHlwZSA9PSBFX0VRVUFMICYmIGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMpKQorCQkvLyAoYSkgJiYgKGE9J3knKSAtPiAoYT0neScpCisJCXJldHVybiBleHByX2FsbG9jX2NvbXAoRV9FUVVBTCwgc3ltMSwgJnN5bWJvbF95ZXMpOworCisJaWYgKChlMS0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlMi0+dHlwZSA9PSBFX1VORVFVQUwgJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX25vKSB8fAorCSAgICAoZTItPnR5cGUgPT0gRV9TWU1CT0wgJiYgZTEtPnR5cGUgPT0gRV9VTkVRVUFMICYmIGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9ubykpCisJCS8vIChhKSAmJiAoYSE9J24nKSAtPiAoYSkKKwkJcmV0dXJuIGV4cHJfYWxsb2Nfc3ltYm9sKHN5bTEpOworCisJaWYgKChlMS0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlMi0+dHlwZSA9PSBFX1VORVFVQUwgJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX21vZCkgfHwKKwkgICAgKGUyLT50eXBlID09IEVfU1lNQk9MICYmIGUxLT50eXBlID09IEVfVU5FUVVBTCAmJiBlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kKSkKKwkJLy8gKGEpICYmIChhIT0nbScpIC0+IChhPSd5JykKKwkJcmV0dXJuIGV4cHJfYWxsb2NfY29tcChFX0VRVUFMLCBzeW0xLCAmc3ltYm9sX3llcyk7CisKKwlpZiAoc3ltMS0+dHlwZSA9PSBTX1RSSVNUQVRFKSB7CisJCWlmIChlMS0+dHlwZSA9PSBFX0VRVUFMICYmIGUyLT50eXBlID09IEVfVU5FUVVBTCkgeworCQkJLy8gKGE9J2InKSAmJiAoYSE9J2MnKSAtPiAnYic9J2MnID8gJ24nIDogYT0nYicKKwkJCXN5bTIgPSBlMS0+cmlnaHQuc3ltOworCQkJaWYgKChlMi0+cmlnaHQuc3ltLT5mbGFncyAmIFNZTUJPTF9DT05TVCkgJiYgKHN5bTItPmZsYWdzICYgU1lNQk9MX0NPTlNUKSkKKwkJCQlyZXR1cm4gc3ltMiAhPSBlMi0+cmlnaHQuc3ltID8gZXhwcl9hbGxvY19jb21wKEVfRVFVQUwsIHN5bTEsIHN5bTIpCisJCQkJCQkJICAgICA6IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfbm8pOworCQl9CisJCWlmIChlMS0+dHlwZSA9PSBFX1VORVFVQUwgJiYgZTItPnR5cGUgPT0gRV9FUVVBTCkgeworCQkJLy8gKGE9J2InKSAmJiAoYSE9J2MnKSAtPiAnYic9J2MnID8gJ24nIDogYT0nYicKKwkJCXN5bTIgPSBlMi0+cmlnaHQuc3ltOworCQkJaWYgKChlMS0+cmlnaHQuc3ltLT5mbGFncyAmIFNZTUJPTF9DT05TVCkgJiYgKHN5bTItPmZsYWdzICYgU1lNQk9MX0NPTlNUKSkKKwkJCQlyZXR1cm4gc3ltMiAhPSBlMS0+cmlnaHQuc3ltID8gZXhwcl9hbGxvY19jb21wKEVfRVFVQUwsIHN5bTEsIHN5bTIpCisJCQkJCQkJICAgICA6IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfbm8pOworCQl9CisJCWlmIChlMS0+dHlwZSA9PSBFX1VORVFVQUwgJiYgZTItPnR5cGUgPT0gRV9VTkVRVUFMICYmCisJCQkgICAoKGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMgJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX25vKSB8fAorCQkJICAgIChlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbm8gJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcykpKQorCQkJLy8gKGEhPSd5JykgJiYgKGEhPSduJykgLT4gKGE9J20nKQorCQkJcmV0dXJuIGV4cHJfYWxsb2NfY29tcChFX0VRVUFMLCBzeW0xLCAmc3ltYm9sX21vZCk7CisKKwkJaWYgKGUxLT50eXBlID09IEVfVU5FUVVBTCAmJiBlMi0+dHlwZSA9PSBFX1VORVFVQUwgJiYKKwkJCSAgICgoZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcyAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kKSB8fAorCQkJICAgIChlMS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMpKSkKKwkJCS8vIChhIT0neScpICYmIChhIT0nbScpIC0+IChhPSduJykKKwkJCXJldHVybiBleHByX2FsbG9jX2NvbXAoRV9FUVVBTCwgc3ltMSwgJnN5bWJvbF9ubyk7CisKKwkJaWYgKGUxLT50eXBlID09IEVfVU5FUVVBTCAmJiBlMi0+dHlwZSA9PSBFX1VORVFVQUwgJiYKKwkJCSAgICgoZTEtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX21vZCAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfbm8pIHx8CisJCQkgICAgKGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9ubyAmJiBlMi0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kKSkpCisJCQkvLyAoYSE9J20nKSAmJiAoYSE9J24nKSAtPiAoYT0nbScpCisJCQlyZXR1cm4gZXhwcl9hbGxvY19jb21wKEVfRVFVQUwsIHN5bTEsICZzeW1ib2xfeWVzKTsKKworCQlpZiAoKGUxLT50eXBlID09IEVfU1lNQk9MICYmIGUyLT50eXBlID09IEVfRVFVQUwgJiYgZTItPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX21vZCkgfHwKKwkJICAgIChlMi0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlMS0+dHlwZSA9PSBFX0VRVUFMICYmIGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QpIHx8CisJCSAgICAoZTEtPnR5cGUgPT0gRV9TWU1CT0wgJiYgZTItPnR5cGUgPT0gRV9VTkVRVUFMICYmIGUyLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMpIHx8CisJCSAgICAoZTItPnR5cGUgPT0gRV9TWU1CT0wgJiYgZTEtPnR5cGUgPT0gRV9VTkVRVUFMICYmIGUxLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMpKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKERFQlVHX0VYUFIpIHsKKwkJcHJpbnRmKCJvcHRpbWl6ZSAoIik7CisJCWV4cHJfZnByaW50KGUxLCBzdGRvdXQpOworCQlwcmludGYoIikgJiYgKCIpOworCQlleHByX2ZwcmludChlMiwgc3Rkb3V0KTsKKwkJcHJpbnRmKCIpP1xuIik7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBleHByX2VsaW1pbmF0ZV9kdXBzMShlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpCit7CisjZGVmaW5lIGUxICgqZXAxKQorI2RlZmluZSBlMiAoKmVwMikKKwlzdHJ1Y3QgZXhwciAqdG1wOworCisJaWYgKGUxLT50eXBlID09IHR5cGUpIHsKKwkJZXhwcl9lbGltaW5hdGVfZHVwczEodHlwZSwgJmUxLT5sZWZ0LmV4cHIsICZlMik7CisJCWV4cHJfZWxpbWluYXRlX2R1cHMxKHR5cGUsICZlMS0+cmlnaHQuZXhwciwgJmUyKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoZTItPnR5cGUgPT0gdHlwZSkgeworCQlleHByX2VsaW1pbmF0ZV9kdXBzMSh0eXBlLCAmZTEsICZlMi0+bGVmdC5leHByKTsKKwkJZXhwcl9lbGltaW5hdGVfZHVwczEodHlwZSwgJmUxLCAmZTItPnJpZ2h0LmV4cHIpOworCQlyZXR1cm47CisJfQorCWlmIChlMSA9PSBlMikKKwkJcmV0dXJuOworCisJc3dpdGNoIChlMS0+dHlwZSkgeworCWNhc2UgRV9PUjogY2FzZSBFX0FORDoKKwkJZXhwcl9lbGltaW5hdGVfZHVwczEoZTEtPnR5cGUsICZlMSwgJmUxKTsKKwlkZWZhdWx0OgorCQk7CisJfQorCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBFX09SOgorCQl0bXAgPSBleHByX2pvaW5fb3IoZTEsIGUyKTsKKwkJaWYgKHRtcCkgeworCQkJZXhwcl9mcmVlKGUxKTsgZXhwcl9mcmVlKGUyKTsKKwkJCWUxID0gZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF9ubyk7CisJCQllMiA9IHRtcDsKKwkJCXRyYW5zX2NvdW50Kys7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFX0FORDoKKwkJdG1wID0gZXhwcl9qb2luX2FuZChlMSwgZTIpOworCQlpZiAodG1wKSB7CisJCQlleHByX2ZyZWUoZTEpOyBleHByX2ZyZWUoZTIpOworCQkJZTEgPSBleHByX2FsbG9jX3N5bWJvbCgmc3ltYm9sX3llcyk7CisJCQllMiA9IHRtcDsKKwkJCXRyYW5zX2NvdW50Kys7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJOworCX0KKyN1bmRlZiBlMQorI3VuZGVmIGUyCit9CisKK3N0YXRpYyB2b2lkIGV4cHJfZWxpbWluYXRlX2R1cHMyKGVudW0gZXhwcl90eXBlIHR5cGUsIHN0cnVjdCBleHByICoqZXAxLCBzdHJ1Y3QgZXhwciAqKmVwMikKK3sKKyNkZWZpbmUgZTEgKCplcDEpCisjZGVmaW5lIGUyICgqZXAyKQorCXN0cnVjdCBleHByICp0bXAsICp0bXAxLCAqdG1wMjsKKworCWlmIChlMS0+dHlwZSA9PSB0eXBlKSB7CisJCWV4cHJfZWxpbWluYXRlX2R1cHMyKHR5cGUsICZlMS0+bGVmdC5leHByLCAmZTIpOworCQlleHByX2VsaW1pbmF0ZV9kdXBzMih0eXBlLCAmZTEtPnJpZ2h0LmV4cHIsICZlMik7CisJCXJldHVybjsKKwl9CisJaWYgKGUyLT50eXBlID09IHR5cGUpIHsKKwkJZXhwcl9lbGltaW5hdGVfZHVwczIodHlwZSwgJmUxLCAmZTItPmxlZnQuZXhwcik7CisJCWV4cHJfZWxpbWluYXRlX2R1cHMyKHR5cGUsICZlMSwgJmUyLT5yaWdodC5leHByKTsKKwl9CisJaWYgKGUxID09IGUyKQorCQlyZXR1cm47CisKKwlzd2l0Y2ggKGUxLT50eXBlKSB7CisJY2FzZSBFX09SOgorCQlleHByX2VsaW1pbmF0ZV9kdXBzMihlMS0+dHlwZSwgJmUxLCAmZTEpOworCQkvLyAoRk9PIHx8IEJBUikgJiYgKCFGT08gJiYgIUJBUikgLT4gbgorCQl0bXAxID0gZXhwcl90cmFuc2Zvcm0oZXhwcl9hbGxvY19vbmUoRV9OT1QsIGV4cHJfY29weShlMSkpKTsKKwkJdG1wMiA9IGV4cHJfY29weShlMik7CisJCXRtcCA9IGV4cHJfZXh0cmFjdF9lcV9hbmQoJnRtcDEsICZ0bXAyKTsKKwkJaWYgKGV4cHJfaXNfeWVzKHRtcDEpKSB7CisJCQlleHByX2ZyZWUoZTEpOworCQkJZTEgPSBleHByX2FsbG9jX3N5bWJvbCgmc3ltYm9sX25vKTsKKwkJCXRyYW5zX2NvdW50Kys7CisJCX0KKwkJZXhwcl9mcmVlKHRtcDIpOworCQlleHByX2ZyZWUodG1wMSk7CisJCWV4cHJfZnJlZSh0bXApOworCQlicmVhazsKKwljYXNlIEVfQU5EOgorCQlleHByX2VsaW1pbmF0ZV9kdXBzMihlMS0+dHlwZSwgJmUxLCAmZTEpOworCQkvLyAoRk9PICYmIEJBUikgfHwgKCFGT08gfHwgIUJBUikgLT4geQorCQl0bXAxID0gZXhwcl90cmFuc2Zvcm0oZXhwcl9hbGxvY19vbmUoRV9OT1QsIGV4cHJfY29weShlMSkpKTsKKwkJdG1wMiA9IGV4cHJfY29weShlMik7CisJCXRtcCA9IGV4cHJfZXh0cmFjdF9lcV9vcigmdG1wMSwgJnRtcDIpOworCQlpZiAoZXhwcl9pc19ubyh0bXAxKSkgeworCQkJZXhwcl9mcmVlKGUxKTsKKwkJCWUxID0gZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF95ZXMpOworCQkJdHJhbnNfY291bnQrKzsKKwkJfQorCQlleHByX2ZyZWUodG1wMik7CisJCWV4cHJfZnJlZSh0bXAxKTsKKwkJZXhwcl9mcmVlKHRtcCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCTsKKwl9CisjdW5kZWYgZTEKKyN1bmRlZiBlMgorfQorCitzdHJ1Y3QgZXhwciAqZXhwcl9lbGltaW5hdGVfZHVwcyhzdHJ1Y3QgZXhwciAqZSkKK3sKKwlpbnQgb2xkY291bnQ7CisJaWYgKCFlKQorCQlyZXR1cm4gZTsKKworCW9sZGNvdW50ID0gdHJhbnNfY291bnQ7CisJd2hpbGUgKDEpIHsKKwkJdHJhbnNfY291bnQgPSAwOworCQlzd2l0Y2ggKGUtPnR5cGUpIHsKKwkJY2FzZSBFX09SOiBjYXNlIEVfQU5EOgorCQkJZXhwcl9lbGltaW5hdGVfZHVwczEoZS0+dHlwZSwgJmUsICZlKTsKKwkJCWV4cHJfZWxpbWluYXRlX2R1cHMyKGUtPnR5cGUsICZlLCAmZSk7CisJCWRlZmF1bHQ6CisJCQk7CisJCX0KKwkJaWYgKCF0cmFuc19jb3VudCkKKwkJCWJyZWFrOworCQllID0gZXhwcl9lbGltaW5hdGVfeW4oZSk7CisJfQorCXRyYW5zX2NvdW50ID0gb2xkY291bnQ7CisJcmV0dXJuIGU7Cit9CisKK3N0cnVjdCBleHByICpleHByX3RyYW5zZm9ybShzdHJ1Y3QgZXhwciAqZSkKK3sKKwlzdHJ1Y3QgZXhwciAqdG1wOworCisJaWYgKCFlKQorCQlyZXR1cm4gTlVMTDsKKwlzd2l0Y2ggKGUtPnR5cGUpIHsKKwljYXNlIEVfRVFVQUw6CisJY2FzZSBFX1VORVFVQUw6CisJY2FzZSBFX1NZTUJPTDoKKwljYXNlIEVfQ0hPSUNFOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQllLT5sZWZ0LmV4cHIgPSBleHByX3RyYW5zZm9ybShlLT5sZWZ0LmV4cHIpOworCQllLT5yaWdodC5leHByID0gZXhwcl90cmFuc2Zvcm0oZS0+cmlnaHQuZXhwcik7CisJfQorCisJc3dpdGNoIChlLT50eXBlKSB7CisJY2FzZSBFX0VRVUFMOgorCQlpZiAoZS0+bGVmdC5zeW0tPnR5cGUgIT0gU19CT09MRUFOKQorCQkJYnJlYWs7CisJCWlmIChlLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9ubykgeworCQkJZS0+dHlwZSA9IEVfTk9UOworCQkJZS0+bGVmdC5leHByID0gZXhwcl9hbGxvY19zeW1ib2woZS0+bGVmdC5zeW0pOworCQkJZS0+cmlnaHQuc3ltID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChlLT5yaWdodC5zeW0gPT0gJnN5bWJvbF9tb2QpIHsKKwkJCXByaW50ZigiYm9vbGVhbiBzeW1ib2wgJXMgdGVzdGVkIGZvciAnbSc/IHRlc3QgZm9yY2VkIHRvICduJ1xuIiwgZS0+bGVmdC5zeW0tPm5hbWUpOworCQkJZS0+dHlwZSA9IEVfU1lNQk9MOworCQkJZS0+bGVmdC5zeW0gPSAmc3ltYm9sX25vOworCQkJZS0+cmlnaHQuc3ltID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCWlmIChlLT5yaWdodC5zeW0gPT0gJnN5bWJvbF95ZXMpIHsKKwkJCWUtPnR5cGUgPSBFX1NZTUJPTDsKKwkJCWUtPnJpZ2h0LnN5bSA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIEVfVU5FUVVBTDoKKwkJaWYgKGUtPmxlZnQuc3ltLT50eXBlICE9IFNfQk9PTEVBTikKKwkJCWJyZWFrOworCQlpZiAoZS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbm8pIHsKKwkJCWUtPnR5cGUgPSBFX1NZTUJPTDsKKwkJCWUtPnJpZ2h0LnN5bSA9IE5VTEw7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZS0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kKSB7CisJCQlwcmludGYoImJvb2xlYW4gc3ltYm9sICVzIHRlc3RlZCBmb3IgJ20nPyB0ZXN0IGZvcmNlZCB0byAneSdcbiIsIGUtPmxlZnQuc3ltLT5uYW1lKTsKKwkJCWUtPnR5cGUgPSBFX1NZTUJPTDsKKwkJCWUtPmxlZnQuc3ltID0gJnN5bWJvbF95ZXM7CisJCQllLT5yaWdodC5zeW0gPSBOVUxMOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKGUtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX3llcykgeworCQkJZS0+dHlwZSA9IEVfTk9UOworCQkJZS0+bGVmdC5leHByID0gZXhwcl9hbGxvY19zeW1ib2woZS0+bGVmdC5zeW0pOworCQkJZS0+cmlnaHQuc3ltID0gTlVMTDsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgRV9OT1Q6CisJCXN3aXRjaCAoZS0+bGVmdC5leHByLT50eXBlKSB7CisJCWNhc2UgRV9OT1Q6CisJCQkvLyAhIWEgLT4gYQorCQkJdG1wID0gZS0+bGVmdC5leHByLT5sZWZ0LmV4cHI7CisJCQlmcmVlKGUtPmxlZnQuZXhwcik7CisJCQlmcmVlKGUpOworCQkJZSA9IHRtcDsKKwkJCWUgPSBleHByX3RyYW5zZm9ybShlKTsKKwkJCWJyZWFrOworCQljYXNlIEVfRVFVQUw6CisJCWNhc2UgRV9VTkVRVUFMOgorCQkJLy8gIWE9J3gnIC0+IGEhPSd4JworCQkJdG1wID0gZS0+bGVmdC5leHByOworCQkJZnJlZShlKTsKKwkJCWUgPSB0bXA7CisJCQllLT50eXBlID0gZS0+dHlwZSA9PSBFX0VRVUFMID8gRV9VTkVRVUFMIDogRV9FUVVBTDsKKwkJCWJyZWFrOworCQljYXNlIEVfT1I6CisJCQkvLyAhKGEgfHwgYikgLT4gIWEgJiYgIWIKKwkJCXRtcCA9IGUtPmxlZnQuZXhwcjsKKwkJCWUtPnR5cGUgPSBFX0FORDsKKwkJCWUtPnJpZ2h0LmV4cHIgPSBleHByX2FsbG9jX29uZShFX05PVCwgdG1wLT5yaWdodC5leHByKTsKKwkJCXRtcC0+dHlwZSA9IEVfTk9UOworCQkJdG1wLT5yaWdodC5leHByID0gTlVMTDsKKwkJCWUgPSBleHByX3RyYW5zZm9ybShlKTsKKwkJCWJyZWFrOworCQljYXNlIEVfQU5EOgorCQkJLy8gIShhICYmIGIpIC0+ICFhIHx8ICFiCisJCQl0bXAgPSBlLT5sZWZ0LmV4cHI7CisJCQllLT50eXBlID0gRV9PUjsKKwkJCWUtPnJpZ2h0LmV4cHIgPSBleHByX2FsbG9jX29uZShFX05PVCwgdG1wLT5yaWdodC5leHByKTsKKwkJCXRtcC0+dHlwZSA9IEVfTk9UOworCQkJdG1wLT5yaWdodC5leHByID0gTlVMTDsKKwkJCWUgPSBleHByX3RyYW5zZm9ybShlKTsKKwkJCWJyZWFrOworCQljYXNlIEVfU1lNQk9MOgorCQkJaWYgKGUtPmxlZnQuZXhwci0+bGVmdC5zeW0gPT0gJnN5bWJvbF95ZXMpIHsKKwkJCQkvLyAhJ3knIC0+ICduJworCQkJCXRtcCA9IGUtPmxlZnQuZXhwcjsKKwkJCQlmcmVlKGUpOworCQkJCWUgPSB0bXA7CisJCQkJZS0+dHlwZSA9IEVfU1lNQk9MOworCQkJCWUtPmxlZnQuc3ltID0gJnN5bWJvbF9ubzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmIChlLT5sZWZ0LmV4cHItPmxlZnQuc3ltID09ICZzeW1ib2xfbW9kKSB7CisJCQkJLy8gISdtJyAtPiAnbScKKwkJCQl0bXAgPSBlLT5sZWZ0LmV4cHI7CisJCQkJZnJlZShlKTsKKwkJCQllID0gdG1wOworCQkJCWUtPnR5cGUgPSBFX1NZTUJPTDsKKwkJCQllLT5sZWZ0LnN5bSA9ICZzeW1ib2xfbW9kOworCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKGUtPmxlZnQuZXhwci0+bGVmdC5zeW0gPT0gJnN5bWJvbF9ubykgeworCQkJCS8vICEnbicgLT4gJ3knCisJCQkJdG1wID0gZS0+bGVmdC5leHByOworCQkJCWZyZWUoZSk7CisJCQkJZSA9IHRtcDsKKwkJCQllLT50eXBlID0gRV9TWU1CT0w7CisJCQkJZS0+bGVmdC5zeW0gPSAmc3ltYm9sX3llczsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCTsKKwl9CisJcmV0dXJuIGU7Cit9CisKK2ludCBleHByX2NvbnRhaW5zX3N5bWJvbChzdHJ1Y3QgZXhwciAqZGVwLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJaWYgKCFkZXApCisJCXJldHVybiAwOworCisJc3dpdGNoIChkZXAtPnR5cGUpIHsKKwljYXNlIEVfQU5EOgorCWNhc2UgRV9PUjoKKwkJcmV0dXJuIGV4cHJfY29udGFpbnNfc3ltYm9sKGRlcC0+bGVmdC5leHByLCBzeW0pIHx8CisJCSAgICAgICBleHByX2NvbnRhaW5zX3N5bWJvbChkZXAtPnJpZ2h0LmV4cHIsIHN5bSk7CisJY2FzZSBFX1NZTUJPTDoKKwkJcmV0dXJuIGRlcC0+bGVmdC5zeW0gPT0gc3ltOworCWNhc2UgRV9FUVVBTDoKKwljYXNlIEVfVU5FUVVBTDoKKwkJcmV0dXJuIGRlcC0+bGVmdC5zeW0gPT0gc3ltIHx8CisJCSAgICAgICBkZXAtPnJpZ2h0LnN5bSA9PSBzeW07CisJY2FzZSBFX05PVDoKKwkJcmV0dXJuIGV4cHJfY29udGFpbnNfc3ltYm9sKGRlcC0+bGVmdC5leHByLCBzeW0pOworCWRlZmF1bHQ6CisJCTsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2Jvb2wgZXhwcl9kZXBlbmRzX3N5bWJvbChzdHJ1Y3QgZXhwciAqZGVwLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJaWYgKCFkZXApCisJCXJldHVybiBmYWxzZTsKKworCXN3aXRjaCAoZGVwLT50eXBlKSB7CisJY2FzZSBFX0FORDoKKwkJcmV0dXJuIGV4cHJfZGVwZW5kc19zeW1ib2woZGVwLT5sZWZ0LmV4cHIsIHN5bSkgfHwKKwkJICAgICAgIGV4cHJfZGVwZW5kc19zeW1ib2woZGVwLT5yaWdodC5leHByLCBzeW0pOworCWNhc2UgRV9TWU1CT0w6CisJCXJldHVybiBkZXAtPmxlZnQuc3ltID09IHN5bTsKKwljYXNlIEVfRVFVQUw6CisJCWlmIChkZXAtPmxlZnQuc3ltID09IHN5bSkgeworCQkJaWYgKGRlcC0+cmlnaHQuc3ltID09ICZzeW1ib2xfeWVzIHx8IGRlcC0+cmlnaHQuc3ltID09ICZzeW1ib2xfbW9kKQorCQkJCXJldHVybiB0cnVlOworCQl9CisJCWJyZWFrOworCWNhc2UgRV9VTkVRVUFMOgorCQlpZiAoZGVwLT5sZWZ0LnN5bSA9PSBzeW0pIHsKKwkJCWlmIChkZXAtPnJpZ2h0LnN5bSA9PSAmc3ltYm9sX25vKQorCQkJCXJldHVybiB0cnVlOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCTsKKwl9CisgCXJldHVybiBmYWxzZTsKK30KKworc3RydWN0IGV4cHIgKmV4cHJfZXh0cmFjdF9lcV9hbmQoc3RydWN0IGV4cHIgKiplcDEsIHN0cnVjdCBleHByICoqZXAyKQoreworCXN0cnVjdCBleHByICp0bXAgPSBOVUxMOworCWV4cHJfZXh0cmFjdF9lcShFX0FORCwgJnRtcCwgZXAxLCBlcDIpOworCWlmICh0bXApIHsKKwkJKmVwMSA9IGV4cHJfZWxpbWluYXRlX3luKCplcDEpOworCQkqZXAyID0gZXhwcl9lbGltaW5hdGVfeW4oKmVwMik7CisJfQorCXJldHVybiB0bXA7Cit9CisKK3N0cnVjdCBleHByICpleHByX2V4dHJhY3RfZXFfb3Ioc3RydWN0IGV4cHIgKiplcDEsIHN0cnVjdCBleHByICoqZXAyKQoreworCXN0cnVjdCBleHByICp0bXAgPSBOVUxMOworCWV4cHJfZXh0cmFjdF9lcShFX09SLCAmdG1wLCBlcDEsIGVwMik7CisJaWYgKHRtcCkgeworCQkqZXAxID0gZXhwcl9lbGltaW5hdGVfeW4oKmVwMSk7CisJCSplcDIgPSBleHByX2VsaW1pbmF0ZV95bigqZXAyKTsKKwl9CisJcmV0dXJuIHRtcDsKK30KKwordm9pZCBleHByX2V4dHJhY3RfZXEoZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKiplcCwgc3RydWN0IGV4cHIgKiplcDEsIHN0cnVjdCBleHByICoqZXAyKQoreworI2RlZmluZSBlMSAoKmVwMSkKKyNkZWZpbmUgZTIgKCplcDIpCisJaWYgKGUxLT50eXBlID09IHR5cGUpIHsKKwkJZXhwcl9leHRyYWN0X2VxKHR5cGUsIGVwLCAmZTEtPmxlZnQuZXhwciwgJmUyKTsKKwkJZXhwcl9leHRyYWN0X2VxKHR5cGUsIGVwLCAmZTEtPnJpZ2h0LmV4cHIsICZlMik7CisJCXJldHVybjsKKwl9CisJaWYgKGUyLT50eXBlID09IHR5cGUpIHsKKwkJZXhwcl9leHRyYWN0X2VxKHR5cGUsIGVwLCBlcDEsICZlMi0+bGVmdC5leHByKTsKKwkJZXhwcl9leHRyYWN0X2VxKHR5cGUsIGVwLCBlcDEsICZlMi0+cmlnaHQuZXhwcik7CisJCXJldHVybjsKKwl9CisJaWYgKGV4cHJfZXEoZTEsIGUyKSkgeworCQkqZXAgPSAqZXAgPyBleHByX2FsbG9jX3R3byh0eXBlLCAqZXAsIGUxKSA6IGUxOworCQlleHByX2ZyZWUoZTIpOworCQlpZiAodHlwZSA9PSBFX0FORCkgeworCQkJZTEgPSBleHByX2FsbG9jX3N5bWJvbCgmc3ltYm9sX3llcyk7CisJCQllMiA9IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfeWVzKTsKKwkJfSBlbHNlIGlmICh0eXBlID09IEVfT1IpIHsKKwkJCWUxID0gZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF9ubyk7CisJCQllMiA9IGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfbm8pOworCQl9CisJfQorI3VuZGVmIGUxCisjdW5kZWYgZTIKK30KKworc3RydWN0IGV4cHIgKmV4cHJfdHJhbnNfY29tcGFyZShzdHJ1Y3QgZXhwciAqZSwgZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBleHByICplMSwgKmUyOworCisJaWYgKCFlKSB7CisJCWUgPSBleHByX2FsbG9jX3N5bWJvbChzeW0pOworCQlpZiAodHlwZSA9PSBFX1VORVFVQUwpCisJCQllID0gZXhwcl9hbGxvY19vbmUoRV9OT1QsIGUpOworCQlyZXR1cm4gZTsKKwl9CisJc3dpdGNoIChlLT50eXBlKSB7CisJY2FzZSBFX0FORDoKKwkJZTEgPSBleHByX3RyYW5zX2NvbXBhcmUoZS0+bGVmdC5leHByLCBFX0VRVUFMLCBzeW0pOworCQllMiA9IGV4cHJfdHJhbnNfY29tcGFyZShlLT5yaWdodC5leHByLCBFX0VRVUFMLCBzeW0pOworCQlpZiAoc3ltID09ICZzeW1ib2xfeWVzKQorCQkJZSA9IGV4cHJfYWxsb2NfdHdvKEVfQU5ELCBlMSwgZTIpOworCQlpZiAoc3ltID09ICZzeW1ib2xfbm8pCisJCQllID0gZXhwcl9hbGxvY190d28oRV9PUiwgZTEsIGUyKTsKKwkJaWYgKHR5cGUgPT0gRV9VTkVRVUFMKQorCQkJZSA9IGV4cHJfYWxsb2Nfb25lKEVfTk9ULCBlKTsKKwkJcmV0dXJuIGU7CisJY2FzZSBFX09SOgorCQllMSA9IGV4cHJfdHJhbnNfY29tcGFyZShlLT5sZWZ0LmV4cHIsIEVfRVFVQUwsIHN5bSk7CisJCWUyID0gZXhwcl90cmFuc19jb21wYXJlKGUtPnJpZ2h0LmV4cHIsIEVfRVFVQUwsIHN5bSk7CisJCWlmIChzeW0gPT0gJnN5bWJvbF95ZXMpCisJCQllID0gZXhwcl9hbGxvY190d28oRV9PUiwgZTEsIGUyKTsKKwkJaWYgKHN5bSA9PSAmc3ltYm9sX25vKQorCQkJZSA9IGV4cHJfYWxsb2NfdHdvKEVfQU5ELCBlMSwgZTIpOworCQlpZiAodHlwZSA9PSBFX1VORVFVQUwpCisJCQllID0gZXhwcl9hbGxvY19vbmUoRV9OT1QsIGUpOworCQlyZXR1cm4gZTsKKwljYXNlIEVfTk9UOgorCQlyZXR1cm4gZXhwcl90cmFuc19jb21wYXJlKGUtPmxlZnQuZXhwciwgdHlwZSA9PSBFX0VRVUFMID8gRV9VTkVRVUFMIDogRV9FUVVBTCwgc3ltKTsKKwljYXNlIEVfVU5FUVVBTDoKKwljYXNlIEVfRVFVQUw6CisJCWlmICh0eXBlID09IEVfRVFVQUwpIHsKKwkJCWlmIChzeW0gPT0gJnN5bWJvbF95ZXMpCisJCQkJcmV0dXJuIGV4cHJfY29weShlKTsKKwkJCWlmIChzeW0gPT0gJnN5bWJvbF9tb2QpCisJCQkJcmV0dXJuIGV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfbm8pOworCQkJaWYgKHN5bSA9PSAmc3ltYm9sX25vKQorCQkJCXJldHVybiBleHByX2FsbG9jX29uZShFX05PVCwgZXhwcl9jb3B5KGUpKTsKKwkJfSBlbHNlIHsKKwkJCWlmIChzeW0gPT0gJnN5bWJvbF95ZXMpCisJCQkJcmV0dXJuIGV4cHJfYWxsb2Nfb25lKEVfTk9ULCBleHByX2NvcHkoZSkpOworCQkJaWYgKHN5bSA9PSAmc3ltYm9sX21vZCkKKwkJCQlyZXR1cm4gZXhwcl9hbGxvY19zeW1ib2woJnN5bWJvbF95ZXMpOworCQkJaWYgKHN5bSA9PSAmc3ltYm9sX25vKQorCQkJCXJldHVybiBleHByX2NvcHkoZSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFX1NZTUJPTDoKKwkJcmV0dXJuIGV4cHJfYWxsb2NfY29tcCh0eXBlLCBlLT5sZWZ0LnN5bSwgc3ltKTsKKwljYXNlIEVfQ0hPSUNFOgorCWNhc2UgRV9SQU5HRToKKwljYXNlIEVfTk9ORToKKwkJLyogcGFuaWMgKi87CisJfQorCXJldHVybiBOVUxMOworfQorCit0cmlzdGF0ZSBleHByX2NhbGNfdmFsdWUoc3RydWN0IGV4cHIgKmUpCit7CisJdHJpc3RhdGUgdmFsMSwgdmFsMjsKKwljb25zdCBjaGFyICpzdHIxLCAqc3RyMjsKKworCWlmICghZSkKKwkJcmV0dXJuIHllczsKKworCXN3aXRjaCAoZS0+dHlwZSkgeworCWNhc2UgRV9TWU1CT0w6CisJCXN5bV9jYWxjX3ZhbHVlKGUtPmxlZnQuc3ltKTsKKwkJcmV0dXJuIGUtPmxlZnQuc3ltLT5jdXJyLnRyaTsKKwljYXNlIEVfQU5EOgorCQl2YWwxID0gZXhwcl9jYWxjX3ZhbHVlKGUtPmxlZnQuZXhwcik7CisJCXZhbDIgPSBleHByX2NhbGNfdmFsdWUoZS0+cmlnaHQuZXhwcik7CisJCXJldHVybiBFX0FORCh2YWwxLCB2YWwyKTsKKwljYXNlIEVfT1I6CisJCXZhbDEgPSBleHByX2NhbGNfdmFsdWUoZS0+bGVmdC5leHByKTsKKwkJdmFsMiA9IGV4cHJfY2FsY192YWx1ZShlLT5yaWdodC5leHByKTsKKwkJcmV0dXJuIEVfT1IodmFsMSwgdmFsMik7CisJY2FzZSBFX05PVDoKKwkJdmFsMSA9IGV4cHJfY2FsY192YWx1ZShlLT5sZWZ0LmV4cHIpOworCQlyZXR1cm4gRV9OT1QodmFsMSk7CisJY2FzZSBFX0VRVUFMOgorCQlzeW1fY2FsY192YWx1ZShlLT5sZWZ0LnN5bSk7CisJCXN5bV9jYWxjX3ZhbHVlKGUtPnJpZ2h0LnN5bSk7CisJCXN0cjEgPSBzeW1fZ2V0X3N0cmluZ192YWx1ZShlLT5sZWZ0LnN5bSk7CisJCXN0cjIgPSBzeW1fZ2V0X3N0cmluZ192YWx1ZShlLT5yaWdodC5zeW0pOworCQlyZXR1cm4gIXN0cmNtcChzdHIxLCBzdHIyKSA/IHllcyA6IG5vOworCWNhc2UgRV9VTkVRVUFMOgorCQlzeW1fY2FsY192YWx1ZShlLT5sZWZ0LnN5bSk7CisJCXN5bV9jYWxjX3ZhbHVlKGUtPnJpZ2h0LnN5bSk7CisJCXN0cjEgPSBzeW1fZ2V0X3N0cmluZ192YWx1ZShlLT5sZWZ0LnN5bSk7CisJCXN0cjIgPSBzeW1fZ2V0X3N0cmluZ192YWx1ZShlLT5yaWdodC5zeW0pOworCQlyZXR1cm4gIXN0cmNtcChzdHIxLCBzdHIyKSA/IG5vIDogeWVzOworCWRlZmF1bHQ6CisJCXByaW50ZigiZXhwcl9jYWxjX3ZhbHVlOiAlZD9cbiIsIGUtPnR5cGUpOworCQlyZXR1cm4gbm87CisJfQorfQorCitpbnQgZXhwcl9jb21wYXJlX3R5cGUoZW51bSBleHByX3R5cGUgdDEsIGVudW0gZXhwcl90eXBlIHQyKQoreworI2lmIDAKKwlyZXR1cm4gMTsKKyNlbHNlCisJaWYgKHQxID09IHQyKQorCQlyZXR1cm4gMDsKKwlzd2l0Y2ggKHQxKSB7CisJY2FzZSBFX0VRVUFMOgorCWNhc2UgRV9VTkVRVUFMOgorCQlpZiAodDIgPT0gRV9OT1QpCisJCQlyZXR1cm4gMTsKKwljYXNlIEVfTk9UOgorCQlpZiAodDIgPT0gRV9BTkQpCisJCQlyZXR1cm4gMTsKKwljYXNlIEVfQU5EOgorCQlpZiAodDIgPT0gRV9PUikKKwkJCXJldHVybiAxOworCWNhc2UgRV9PUjoKKwkJaWYgKHQyID09IEVfQ0hPSUNFKQorCQkJcmV0dXJuIDE7CisJY2FzZSBFX0NIT0lDRToKKwkJaWYgKHQyID09IDApCisJCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLTE7CisJfQorCXByaW50ZigiWyVkZ3QlZD9dIiwgdDEsIHQyKTsKKwlyZXR1cm4gMDsKKyNlbmRpZgorfQorCit2b2lkIGV4cHJfcHJpbnQoc3RydWN0IGV4cHIgKmUsIHZvaWQgKCpmbikodm9pZCAqLCBjb25zdCBjaGFyICopLCB2b2lkICpkYXRhLCBpbnQgcHJldnRva2VuKQoreworCWlmICghZSkgeworCQlmbihkYXRhLCAieSIpOworCQlyZXR1cm47CisJfQorCisJaWYgKGV4cHJfY29tcGFyZV90eXBlKHByZXZ0b2tlbiwgZS0+dHlwZSkgPiAwKQorCQlmbihkYXRhLCAiKCIpOworCXN3aXRjaCAoZS0+dHlwZSkgeworCWNhc2UgRV9TWU1CT0w6CisJCWlmIChlLT5sZWZ0LnN5bS0+bmFtZSkKKwkJCWZuKGRhdGEsIGUtPmxlZnQuc3ltLT5uYW1lKTsKKwkJZWxzZQorCQkJZm4oZGF0YSwgIjxjaG9pY2U+Iik7CisJCWJyZWFrOworCWNhc2UgRV9OT1Q6CisJCWZuKGRhdGEsICIhIik7CisJCWV4cHJfcHJpbnQoZS0+bGVmdC5leHByLCBmbiwgZGF0YSwgRV9OT1QpOworCQlicmVhazsKKwljYXNlIEVfRVFVQUw6CisJCWZuKGRhdGEsIGUtPmxlZnQuc3ltLT5uYW1lKTsKKwkJZm4oZGF0YSwgIj0iKTsKKwkJZm4oZGF0YSwgZS0+cmlnaHQuc3ltLT5uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBFX1VORVFVQUw6CisJCWZuKGRhdGEsIGUtPmxlZnQuc3ltLT5uYW1lKTsKKwkJZm4oZGF0YSwgIiE9Iik7CisJCWZuKGRhdGEsIGUtPnJpZ2h0LnN5bS0+bmFtZSk7CisJCWJyZWFrOworCWNhc2UgRV9PUjoKKwkJZXhwcl9wcmludChlLT5sZWZ0LmV4cHIsIGZuLCBkYXRhLCBFX09SKTsKKwkJZm4oZGF0YSwgIiB8fCAiKTsKKwkJZXhwcl9wcmludChlLT5yaWdodC5leHByLCBmbiwgZGF0YSwgRV9PUik7CisJCWJyZWFrOworCWNhc2UgRV9BTkQ6CisJCWV4cHJfcHJpbnQoZS0+bGVmdC5leHByLCBmbiwgZGF0YSwgRV9BTkQpOworCQlmbihkYXRhLCAiICYmICIpOworCQlleHByX3ByaW50KGUtPnJpZ2h0LmV4cHIsIGZuLCBkYXRhLCBFX0FORCk7CisJCWJyZWFrOworCWNhc2UgRV9DSE9JQ0U6CisJCWZuKGRhdGEsIGUtPnJpZ2h0LnN5bS0+bmFtZSk7CisJCWlmIChlLT5sZWZ0LmV4cHIpIHsKKwkJCWZuKGRhdGEsICIgXiAiKTsKKwkJCWV4cHJfcHJpbnQoZS0+bGVmdC5leHByLCBmbiwgZGF0YSwgRV9DSE9JQ0UpOworCQl9CisJCWJyZWFrOworCWNhc2UgRV9SQU5HRToKKwkJZm4oZGF0YSwgIlsiKTsKKwkJZm4oZGF0YSwgZS0+bGVmdC5zeW0tPm5hbWUpOworCQlmbihkYXRhLCAiICIpOworCQlmbihkYXRhLCBlLT5yaWdodC5zeW0tPm5hbWUpOworCQlmbihkYXRhLCAiXSIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCSAgeworCQljaGFyIGJ1ZlszMl07CisJCXNwcmludGYoYnVmLCAiPHVua25vd24gdHlwZSAlZD4iLCBlLT50eXBlKTsKKwkJZm4oZGF0YSwgYnVmKTsKKwkJYnJlYWs7CisJICB9CisJfQorCWlmIChleHByX2NvbXBhcmVfdHlwZShwcmV2dG9rZW4sIGUtPnR5cGUpID4gMCkKKwkJZm4oZGF0YSwgIikiKTsKK30KKworc3RhdGljIHZvaWQgZXhwcl9wcmludF9maWxlX2hlbHBlcih2b2lkICpkYXRhLCBjb25zdCBjaGFyICpzdHIpCit7CisJZndyaXRlKHN0ciwgc3RybGVuKHN0ciksIDEsIGRhdGEpOworfQorCit2b2lkIGV4cHJfZnByaW50KHN0cnVjdCBleHByICplLCBGSUxFICpvdXQpCit7CisJZXhwcl9wcmludChlLCBleHByX3ByaW50X2ZpbGVfaGVscGVyLCBvdXQsIEVfTk9ORSk7Cit9CisKK3N0YXRpYyB2b2lkIGV4cHJfcHJpbnRfZ3N0cl9oZWxwZXIodm9pZCAqZGF0YSwgY29uc3QgY2hhciAqc3RyKQoreworCXN0cl9hcHBlbmQoKHN0cnVjdCBnc3RyKilkYXRhLCBzdHIpOworfQorCit2b2lkIGV4cHJfZ3N0cl9wcmludChzdHJ1Y3QgZXhwciAqZSwgc3RydWN0IGdzdHIgKmdzKQoreworCWV4cHJfcHJpbnQoZSwgZXhwcl9wcmludF9nc3RyX2hlbHBlciwgZ3MsIEVfTk9ORSk7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvZXhwci5oIGIvc2NyaXB0cy9rY29uZmlnL2V4cHIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDM5ZmY0Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL2V4cHIuaApAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKKyNpZm5kZWYgRVhQUl9ICisjZGVmaW5lIEVYUFJfSAorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2lmbmRlZiBfX2NwbHVzcGx1cworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNlbmRpZgorCitzdHJ1Y3QgZmlsZSB7CisJc3RydWN0IGZpbGUgKm5leHQ7CisJc3RydWN0IGZpbGUgKnBhcmVudDsKKwljaGFyICpuYW1lOworCWludCBsaW5lbm87CisJaW50IGZsYWdzOworfTsKKworI2RlZmluZSBGSUxFX0JVU1kJCTB4MDAwMQorI2RlZmluZSBGSUxFX1NDQU5ORUQJCTB4MDAwMgorI2RlZmluZSBGSUxFX1BSSU5URUQJCTB4MDAwNAorCit0eXBlZGVmIGVudW0gdHJpc3RhdGUgeworCW5vLCBtb2QsIHllcworfSB0cmlzdGF0ZTsKKworZW51bSBleHByX3R5cGUgeworCUVfTk9ORSwgRV9PUiwgRV9BTkQsIEVfTk9ULCBFX0VRVUFMLCBFX1VORVFVQUwsIEVfQ0hPSUNFLCBFX1NZTUJPTCwgRV9SQU5HRQorfTsKKwordW5pb24gZXhwcl9kYXRhIHsKKwlzdHJ1Y3QgZXhwciAqZXhwcjsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07Cit9OworCitzdHJ1Y3QgZXhwciB7CisJZW51bSBleHByX3R5cGUgdHlwZTsKKwl1bmlvbiBleHByX2RhdGEgbGVmdCwgcmlnaHQ7Cit9OworCisjZGVmaW5lIEVfT1IoZGVwMSwgZGVwMikJKCgoZGVwMSk+KGRlcDIpKT8oZGVwMSk6KGRlcDIpKQorI2RlZmluZSBFX0FORChkZXAxLCBkZXAyKQkoKChkZXAxKTwoZGVwMikpPyhkZXAxKTooZGVwMikpCisjZGVmaW5lIEVfTk9UKGRlcCkJCSgyLShkZXApKQorCitzdHJ1Y3QgZXhwcl92YWx1ZSB7CisJc3RydWN0IGV4cHIgKmV4cHI7CisJdHJpc3RhdGUgdHJpOworfTsKKworc3RydWN0IHN5bWJvbF92YWx1ZSB7CisJdm9pZCAqdmFsOworCXRyaXN0YXRlIHRyaTsKK307CisKK2VudW0gc3ltYm9sX3R5cGUgeworCVNfVU5LTk9XTiwgU19CT09MRUFOLCBTX1RSSVNUQVRFLCBTX0lOVCwgU19IRVgsIFNfU1RSSU5HLCBTX09USEVSCit9OworCitzdHJ1Y3Qgc3ltYm9sIHsKKwlzdHJ1Y3Qgc3ltYm9sICpuZXh0OworCWNoYXIgKm5hbWU7CisJY2hhciAqaGVscDsKKwllbnVtIHN5bWJvbF90eXBlIHR5cGU7CisJc3RydWN0IHN5bWJvbF92YWx1ZSBjdXJyLCB1c2VyOworCXRyaXN0YXRlIHZpc2libGU7CisJaW50IGZsYWdzOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3QgZXhwciAqZGVwLCAqZGVwMjsKKwlzdHJ1Y3QgZXhwcl92YWx1ZSByZXZfZGVwOworfTsKKworI2RlZmluZSBmb3JfYWxsX3N5bWJvbHMoaSwgc3ltKSBmb3IgKGkgPSAwOyBpIDwgMjU3OyBpKyspIGZvciAoc3ltID0gc3ltYm9sX2hhc2hbaV07IHN5bTsgc3ltID0gc3ltLT5uZXh0KSBpZiAoc3ltLT50eXBlICE9IFNfT1RIRVIpCisKKyNkZWZpbmUgU1lNQk9MX1lFUwkJMHgwMDAxCisjZGVmaW5lIFNZTUJPTF9NT0QJCTB4MDAwMgorI2RlZmluZSBTWU1CT0xfTk8JCTB4MDAwNAorI2RlZmluZSBTWU1CT0xfQ09OU1QJCTB4MDAwNworI2RlZmluZSBTWU1CT0xfQ0hFQ0sJCTB4MDAwOAorI2RlZmluZSBTWU1CT0xfQ0hPSUNFCQkweDAwMTAKKyNkZWZpbmUgU1lNQk9MX0NIT0lDRVZBTAkweDAwMjAKKyNkZWZpbmUgU1lNQk9MX1BSSU5URUQJCTB4MDA0MAorI2RlZmluZSBTWU1CT0xfVkFMSUQJCTB4MDA4MAorI2RlZmluZSBTWU1CT0xfT1BUSU9OQUwJCTB4MDEwMAorI2RlZmluZSBTWU1CT0xfV1JJVEUJCTB4MDIwMAorI2RlZmluZSBTWU1CT0xfQ0hBTkdFRAkJMHgwNDAwCisjZGVmaW5lIFNZTUJPTF9ORVcJCTB4MDgwMAorI2RlZmluZSBTWU1CT0xfQVVUTwkJMHgxMDAwCisjZGVmaW5lIFNZTUJPTF9DSEVDS0VECQkweDIwMDAKKyNkZWZpbmUgU1lNQk9MX0NIRUNLX0RPTkUJMHg0MDAwCisjZGVmaW5lIFNZTUJPTF9XQVJORUQJCTB4ODAwMAorCisjZGVmaW5lIFNZTUJPTF9NQVhMRU5HVEgJMjU2CisjZGVmaW5lIFNZTUJPTF9IQVNIU0laRQkJMjU3CisjZGVmaW5lIFNZTUJPTF9IQVNITUFTSwkJMHhmZgorCitlbnVtIHByb3BfdHlwZSB7CisJUF9VTktOT1dOLCBQX1BST01QVCwgUF9DT01NRU5ULCBQX01FTlUsIFBfREVGQVVMVCwgUF9DSE9JQ0UsIFBfU0VMRUNULCBQX1JBTkdFCit9OworCitzdHJ1Y3QgcHJvcGVydHkgeworCXN0cnVjdCBwcm9wZXJ0eSAqbmV4dDsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJZW51bSBwcm9wX3R5cGUgdHlwZTsKKwljb25zdCBjaGFyICp0ZXh0OworCXN0cnVjdCBleHByX3ZhbHVlIHZpc2libGU7CisJc3RydWN0IGV4cHIgKmV4cHI7CisJc3RydWN0IG1lbnUgKm1lbnU7CisJc3RydWN0IGZpbGUgKmZpbGU7CisJaW50IGxpbmVubzsKK307CisKKyNkZWZpbmUgZm9yX2FsbF9wcm9wZXJ0aWVzKHN5bSwgc3QsIHRvaykgXAorCWZvciAoc3QgPSBzeW0tPnByb3A7IHN0OyBzdCA9IHN0LT5uZXh0KSBcCisJCWlmIChzdC0+dHlwZSA9PSAodG9rKSkKKyNkZWZpbmUgZm9yX2FsbF9kZWZhdWx0cyhzeW0sIHN0KSBmb3JfYWxsX3Byb3BlcnRpZXMoc3ltLCBzdCwgUF9ERUZBVUxUKQorI2RlZmluZSBmb3JfYWxsX2Nob2ljZXMoc3ltLCBzdCkgZm9yX2FsbF9wcm9wZXJ0aWVzKHN5bSwgc3QsIFBfQ0hPSUNFKQorI2RlZmluZSBmb3JfYWxsX3Byb21wdHMoc3ltLCBzdCkgXAorCWZvciAoc3QgPSBzeW0tPnByb3A7IHN0OyBzdCA9IHN0LT5uZXh0KSBcCisJCWlmIChzdC0+dGV4dCkKKworc3RydWN0IG1lbnUgeworCXN0cnVjdCBtZW51ICpuZXh0OworCXN0cnVjdCBtZW51ICpwYXJlbnQ7CisJc3RydWN0IG1lbnUgKmxpc3Q7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvbXB0OworCXN0cnVjdCBleHByICpkZXA7CisJdW5zaWduZWQgaW50IGZsYWdzOworCS8vY2hhciAqaGVscDsKKwlzdHJ1Y3QgZmlsZSAqZmlsZTsKKwlpbnQgbGluZW5vOworCXZvaWQgKmRhdGE7Cit9OworCisjZGVmaW5lIE1FTlVfQ0hBTkdFRAkJMHgwMDAxCisjZGVmaW5lIE1FTlVfUk9PVAkJMHgwMDAyCisKKyNpZm5kZWYgU1dJRworCitleHRlcm4gc3RydWN0IGZpbGUgKmZpbGVfbGlzdDsKK2V4dGVybiBzdHJ1Y3QgZmlsZSAqY3VycmVudF9maWxlOworc3RydWN0IGZpbGUgKmxvb2t1cF9maWxlKGNvbnN0IGNoYXIgKm5hbWUpOworCitleHRlcm4gc3RydWN0IHN5bWJvbCBzeW1ib2xfeWVzLCBzeW1ib2xfbm8sIHN5bWJvbF9tb2Q7CitleHRlcm4gc3RydWN0IHN5bWJvbCAqbW9kdWxlc19zeW07CitleHRlcm4gaW50IGNkZWJ1ZzsKK3N0cnVjdCBleHByICpleHByX2FsbG9jX3N5bWJvbChzdHJ1Y3Qgc3ltYm9sICpzeW0pOworc3RydWN0IGV4cHIgKmV4cHJfYWxsb2Nfb25lKGVudW0gZXhwcl90eXBlIHR5cGUsIHN0cnVjdCBleHByICpjZSk7CitzdHJ1Y3QgZXhwciAqZXhwcl9hbGxvY190d28oZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKmUxLCBzdHJ1Y3QgZXhwciAqZTIpOworc3RydWN0IGV4cHIgKmV4cHJfYWxsb2NfY29tcChlbnVtIGV4cHJfdHlwZSB0eXBlLCBzdHJ1Y3Qgc3ltYm9sICpzMSwgc3RydWN0IHN5bWJvbCAqczIpOworc3RydWN0IGV4cHIgKmV4cHJfYWxsb2NfYW5kKHN0cnVjdCBleHByICplMSwgc3RydWN0IGV4cHIgKmUyKTsKK3N0cnVjdCBleHByICpleHByX2FsbG9jX29yKHN0cnVjdCBleHByICplMSwgc3RydWN0IGV4cHIgKmUyKTsKK3N0cnVjdCBleHByICpleHByX2NvcHkoc3RydWN0IGV4cHIgKm9yZyk7Cit2b2lkIGV4cHJfZnJlZShzdHJ1Y3QgZXhwciAqZSk7CitpbnQgZXhwcl9lcShzdHJ1Y3QgZXhwciAqZTEsIHN0cnVjdCBleHByICplMik7Cit2b2lkIGV4cHJfZWxpbWluYXRlX2VxKHN0cnVjdCBleHByICoqZXAxLCBzdHJ1Y3QgZXhwciAqKmVwMik7Cit0cmlzdGF0ZSBleHByX2NhbGNfdmFsdWUoc3RydWN0IGV4cHIgKmUpOworc3RydWN0IGV4cHIgKmV4cHJfZWxpbWluYXRlX3luKHN0cnVjdCBleHByICplKTsKK3N0cnVjdCBleHByICpleHByX3RyYW5zX2Jvb2woc3RydWN0IGV4cHIgKmUpOworc3RydWN0IGV4cHIgKmV4cHJfZWxpbWluYXRlX2R1cHMoc3RydWN0IGV4cHIgKmUpOworc3RydWN0IGV4cHIgKmV4cHJfdHJhbnNmb3JtKHN0cnVjdCBleHByICplKTsKK2ludCBleHByX2NvbnRhaW5zX3N5bWJvbChzdHJ1Y3QgZXhwciAqZGVwLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pOworYm9vbCBleHByX2RlcGVuZHNfc3ltYm9sKHN0cnVjdCBleHByICpkZXAsIHN0cnVjdCBzeW1ib2wgKnN5bSk7CitzdHJ1Y3QgZXhwciAqZXhwcl9leHRyYWN0X2VxX2FuZChzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpOworc3RydWN0IGV4cHIgKmV4cHJfZXh0cmFjdF9lcV9vcihzdHJ1Y3QgZXhwciAqKmVwMSwgc3RydWN0IGV4cHIgKiplcDIpOwordm9pZCBleHByX2V4dHJhY3RfZXEoZW51bSBleHByX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKiplcCwgc3RydWN0IGV4cHIgKiplcDEsIHN0cnVjdCBleHByICoqZXAyKTsKK3N0cnVjdCBleHByICpleHByX3RyYW5zX2NvbXBhcmUoc3RydWN0IGV4cHIgKmUsIGVudW0gZXhwcl90eXBlIHR5cGUsIHN0cnVjdCBzeW1ib2wgKnN5bSk7CisKK3ZvaWQgZXhwcl9mcHJpbnQoc3RydWN0IGV4cHIgKmUsIEZJTEUgKm91dCk7CitzdHJ1Y3QgZ3N0cjsgLyogZm9yd2FyZCAqLwordm9pZCBleHByX2dzdHJfcHJpbnQoc3RydWN0IGV4cHIgKmUsIHN0cnVjdCBnc3RyICpncyk7CisKK3N0YXRpYyBpbmxpbmUgaW50IGV4cHJfaXNfeWVzKHN0cnVjdCBleHByICplKQoreworCXJldHVybiAhZSB8fCAoZS0+dHlwZSA9PSBFX1NZTUJPTCAmJiBlLT5sZWZ0LnN5bSA9PSAmc3ltYm9sX3llcyk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGV4cHJfaXNfbm8oc3RydWN0IGV4cHIgKmUpCit7CisJcmV0dXJuIGUgJiYgKGUtPnR5cGUgPT0gRV9TWU1CT0wgJiYgZS0+bGVmdC5zeW0gPT0gJnN5bWJvbF9ubyk7Cit9CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIEVYUFJfSCAqLwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2djb25mLmMgYi9zY3JpcHRzL2tjb25maWcvZ2NvbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmRiZTZlCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL2djb25mLmMKQEAgLTAsMCArMSwxNjM5IEBACisvKiBIZXkgRU1BQ1MgLSotIGxpbnV4LWMgLSotICovCisvKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDAzIFJvbWFpbiBMaWV2aW4gPHJvbXNAdGlscC5pbmZvPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCisgKgorICovCisKKyNpZmRlZiBIQVZFX0NPTkZJR19ICisjICBpbmNsdWRlIDxjb25maWcuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAibGtjLmgiCisjaW5jbHVkZSAiaW1hZ2VzLmMiCisKKyNpbmNsdWRlIDxnbGFkZS9nbGFkZS5oPgorI2luY2x1ZGUgPGd0ay9ndGsuaD4KKyNpbmNsdWRlIDxnbGliLmg+CisjaW5jbHVkZSA8Z2RrL2dka2tleXN5bXMuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisvLyNkZWZpbmUgREVCVUcKKworZW51bSB7CisJU0lOR0xFX1ZJRVcsIFNQTElUX1ZJRVcsIEZVTExfVklFVworfTsKKworc3RhdGljIGdpbnQgdmlld19tb2RlID0gRlVMTF9WSUVXOworc3RhdGljIGdib29sZWFuIHNob3dfbmFtZSA9IFRSVUU7CitzdGF0aWMgZ2Jvb2xlYW4gc2hvd19yYW5nZSA9IFRSVUU7CitzdGF0aWMgZ2Jvb2xlYW4gc2hvd192YWx1ZSA9IFRSVUU7CitzdGF0aWMgZ2Jvb2xlYW4gc2hvd19hbGwgPSBGQUxTRTsKK3N0YXRpYyBnYm9vbGVhbiBzaG93X2RlYnVnID0gRkFMU0U7CitzdGF0aWMgZ2Jvb2xlYW4gcmVzaXplYWJsZSA9IEZBTFNFOworCitzdGF0aWMgZ2Jvb2xlYW4gY29uZmlnX2NoYW5nZWQgPSBGQUxTRTsKKworc3RhdGljIGNoYXIgbm9oZWxwX3RleHRbXSA9CisgICAgIlNvcnJ5LCBubyBoZWxwIGF2YWlsYWJsZSBmb3IgdGhpcyBvcHRpb24geWV0LlxuIjsKKworR3RrV2lkZ2V0ICptYWluX3duZCA9IE5VTEw7CitHdGtXaWRnZXQgKnRyZWUxX3cgPSBOVUxMOwkvLyBsZWZ0ICBmcmFtZQorR3RrV2lkZ2V0ICp0cmVlMl93ID0gTlVMTDsJLy8gcmlnaHQgZnJhbWUKK0d0a1dpZGdldCAqdGV4dF93ID0gTlVMTDsKK0d0a1dpZGdldCAqaHBhbmVkID0gTlVMTDsKK0d0a1dpZGdldCAqdnBhbmVkID0gTlVMTDsKK0d0a1dpZGdldCAqYmFja19idG4gPSBOVUxMOworCitHdGtUZXh0VGFnICp0YWcxLCAqdGFnMjsKK0dka0NvbG9yIGNvbG9yOworCitHdGtUcmVlU3RvcmUgKnRyZWUxLCAqdHJlZTIsICp0cmVlOworR3RrVHJlZU1vZGVsICptb2RlbDEsICptb2RlbDI7CitzdGF0aWMgR3RrVHJlZUl0ZXIgKnBhcmVudHNbMjU2XTsKK3N0YXRpYyBnaW50IGluZGVudDsKKworc3RhdGljIHN0cnVjdCBtZW51ICpjdXJyZW50OyAvLyBjdXJyZW50IG5vZGUgZm9yIFNJTkdMRSB2aWV3CitzdGF0aWMgc3RydWN0IG1lbnUgKmJyb3dzZWQ7IC8vIGJyb3dzZWQgbm9kZSBmb3IgU1BMSVQgdmlldworCitlbnVtIHsKKwlDT0xfT1BUSU9OLCBDT0xfTkFNRSwgQ09MX05PLCBDT0xfTU9ELCBDT0xfWUVTLCBDT0xfVkFMVUUsCisJQ09MX01FTlUsIENPTF9DT0xPUiwgQ09MX0VESVQsIENPTF9QSVhCVUYsCisJQ09MX1BJWFZJUywgQ09MX0JUTlZJUywgQ09MX0JUTkFDVCwgQ09MX0JUTklOQywgQ09MX0JUTlJBRCwKKwlDT0xfTlVNQkVSCit9OworCitzdGF0aWMgdm9pZCBkaXNwbGF5X2xpc3Qodm9pZCk7CitzdGF0aWMgdm9pZCBkaXNwbGF5X3RyZWUoc3RydWN0IG1lbnUgKm1lbnUpOworc3RhdGljIHZvaWQgZGlzcGxheV90cmVlX3BhcnQodm9pZCk7CitzdGF0aWMgdm9pZCB1cGRhdGVfdHJlZShzdHJ1Y3QgbWVudSAqc3JjLCBHdGtUcmVlSXRlciAqIGRzdCk7CitzdGF0aWMgdm9pZCBzZXRfbm9kZShHdGtUcmVlSXRlciAqIG5vZGUsIHN0cnVjdCBtZW51ICptZW51LCBnY2hhciAqKiByb3cpOworc3RhdGljIGdjaGFyICoqZmlsbF9yb3coc3RydWN0IG1lbnUgKm1lbnUpOworCisKKy8qIEhlbHBpbmcvRGVidWdnaW5nIEZ1bmN0aW9ucyAqLworCisKK2NvbnN0IGNoYXIgKmRiZ19wcmludF9zdHlwZShpbnQgdmFsKQoreworCXN0YXRpYyBjaGFyIGJ1ZlsyNTZdOworCisJYnplcm8oYnVmLCAyNTYpOworCisJaWYgKHZhbCA9PSBTX1VOS05PV04pCisJCXN0cmNweShidWYsICJ1bmtub3duIik7CisJaWYgKHZhbCA9PSBTX0JPT0xFQU4pCisJCXN0cmNweShidWYsICJib29sZWFuIik7CisJaWYgKHZhbCA9PSBTX1RSSVNUQVRFKQorCQlzdHJjcHkoYnVmLCAidHJpc3RhdGUiKTsKKwlpZiAodmFsID09IFNfSU5UKQorCQlzdHJjcHkoYnVmLCAiaW50Iik7CisJaWYgKHZhbCA9PSBTX0hFWCkKKwkJc3RyY3B5KGJ1ZiwgImhleCIpOworCWlmICh2YWwgPT0gU19TVFJJTkcpCisJCXN0cmNweShidWYsICJzdHJpbmciKTsKKwlpZiAodmFsID09IFNfT1RIRVIpCisJCXN0cmNweShidWYsICJvdGhlciIpOworCisjaWZkZWYgREVCVUcKKwlwcmludGYoIiVzIiwgYnVmKTsKKyNlbmRpZgorCisJcmV0dXJuIGJ1ZjsKK30KKworY29uc3QgY2hhciAqZGJnX3ByaW50X2ZsYWdzKGludCB2YWwpCit7CisJc3RhdGljIGNoYXIgYnVmWzI1Nl07CisKKwliemVybyhidWYsIDI1Nik7CisKKwlpZiAodmFsICYgU1lNQk9MX1lFUykKKwkJc3RyY2F0KGJ1ZiwgInllcy8iKTsKKwlpZiAodmFsICYgU1lNQk9MX01PRCkKKwkJc3RyY2F0KGJ1ZiwgIm1vZC8iKTsKKwlpZiAodmFsICYgU1lNQk9MX05PKQorCQlzdHJjYXQoYnVmLCAibm8vIik7CisJaWYgKHZhbCAmIFNZTUJPTF9DT05TVCkKKwkJc3RyY2F0KGJ1ZiwgImNvbnN0LyIpOworCWlmICh2YWwgJiBTWU1CT0xfQ0hFQ0spCisJCXN0cmNhdChidWYsICJjaGVjay8iKTsKKwlpZiAodmFsICYgU1lNQk9MX0NIT0lDRSkKKwkJc3RyY2F0KGJ1ZiwgImNob2ljZS8iKTsKKwlpZiAodmFsICYgU1lNQk9MX0NIT0lDRVZBTCkKKwkJc3RyY2F0KGJ1ZiwgImNob2ljZXZhbC8iKTsKKwlpZiAodmFsICYgU1lNQk9MX1BSSU5URUQpCisJCXN0cmNhdChidWYsICJwcmludGVkLyIpOworCWlmICh2YWwgJiBTWU1CT0xfVkFMSUQpCisJCXN0cmNhdChidWYsICJ2YWxpZC8iKTsKKwlpZiAodmFsICYgU1lNQk9MX09QVElPTkFMKQorCQlzdHJjYXQoYnVmLCAib3B0aW9uYWwvIik7CisJaWYgKHZhbCAmIFNZTUJPTF9XUklURSkKKwkJc3RyY2F0KGJ1ZiwgIndyaXRlLyIpOworCWlmICh2YWwgJiBTWU1CT0xfQ0hBTkdFRCkKKwkJc3RyY2F0KGJ1ZiwgImNoYW5nZWQvIik7CisJaWYgKHZhbCAmIFNZTUJPTF9ORVcpCisJCXN0cmNhdChidWYsICJuZXcvIik7CisJaWYgKHZhbCAmIFNZTUJPTF9BVVRPKQorCQlzdHJjYXQoYnVmLCAiYXV0by8iKTsKKworCWJ1ZltzdHJsZW4oYnVmKSAtIDFdID0gJ1wwJzsKKyNpZmRlZiBERUJVRworCXByaW50ZigiJXMiLCBidWYpOworI2VuZGlmCisKKwlyZXR1cm4gYnVmOworfQorCitjb25zdCBjaGFyICpkYmdfcHJpbnRfcHR5cGUoaW50IHZhbCkKK3sKKwlzdGF0aWMgY2hhciBidWZbMjU2XTsKKworCWJ6ZXJvKGJ1ZiwgMjU2KTsKKworCWlmICh2YWwgPT0gUF9VTktOT1dOKQorCQlzdHJjcHkoYnVmLCAidW5rbm93biIpOworCWlmICh2YWwgPT0gUF9QUk9NUFQpCisJCXN0cmNweShidWYsICJwcm9tcHQiKTsKKwlpZiAodmFsID09IFBfQ09NTUVOVCkKKwkJc3RyY3B5KGJ1ZiwgImNvbW1lbnQiKTsKKwlpZiAodmFsID09IFBfTUVOVSkKKwkJc3RyY3B5KGJ1ZiwgIm1lbnUiKTsKKwlpZiAodmFsID09IFBfREVGQVVMVCkKKwkJc3RyY3B5KGJ1ZiwgImRlZmF1bHQiKTsKKwlpZiAodmFsID09IFBfQ0hPSUNFKQorCQlzdHJjcHkoYnVmLCAiY2hvaWNlIik7CisKKyNpZmRlZiBERUJVRworCXByaW50ZigiJXMiLCBidWYpOworI2VuZGlmCisKKwlyZXR1cm4gYnVmOworfQorCisKKy8qIE1haW4gV2luZG93IEluaXRpYWxpemF0aW9uICovCisKKwordm9pZCBpbml0X21haW5fd2luZG93KGNvbnN0IGdjaGFyICogZ2xhZGVfZmlsZSkKK3sKKwlHbGFkZVhNTCAqeG1sOworCUd0a1dpZGdldCAqd2lkZ2V0OworCUd0a1RleHRCdWZmZXIgKnR4dGJ1ZjsKKwljaGFyIHRpdGxlWzI1Nl07CisJR2RrUGl4bWFwICpwaXhtYXA7CisJR2RrQml0bWFwICptYXNrOworCUd0a1N0eWxlICpzdHlsZTsKKworCXhtbCA9IGdsYWRlX3htbF9uZXcoZ2xhZGVfZmlsZSwgIndpbmRvdzEiLCBOVUxMKTsKKwlpZiAoIXhtbCkKKwkJZ19lcnJvcigiR1VJIGxvYWRpbmcgZmFpbGVkICFcbiIpOworCWdsYWRlX3htbF9zaWduYWxfYXV0b2Nvbm5lY3QoeG1sKTsKKworCW1haW5fd25kID0gZ2xhZGVfeG1sX2dldF93aWRnZXQoeG1sLCAid2luZG93MSIpOworCWhwYW5lZCA9IGdsYWRlX3htbF9nZXRfd2lkZ2V0KHhtbCwgImhwYW5lZDEiKTsKKwl2cGFuZWQgPSBnbGFkZV94bWxfZ2V0X3dpZGdldCh4bWwsICJ2cGFuZWQxIik7CisJdHJlZTFfdyA9IGdsYWRlX3htbF9nZXRfd2lkZ2V0KHhtbCwgInRyZWV2aWV3MSIpOworCXRyZWUyX3cgPSBnbGFkZV94bWxfZ2V0X3dpZGdldCh4bWwsICJ0cmVldmlldzIiKTsKKwl0ZXh0X3cgPSBnbGFkZV94bWxfZ2V0X3dpZGdldCh4bWwsICJ0ZXh0dmlldzMiKTsKKworCWJhY2tfYnRuID0gZ2xhZGVfeG1sX2dldF93aWRnZXQoeG1sLCAiYnV0dG9uMSIpOworCWd0a193aWRnZXRfc2V0X3NlbnNpdGl2ZShiYWNrX2J0biwgRkFMU0UpOworCisJd2lkZ2V0ID0gZ2xhZGVfeG1sX2dldF93aWRnZXQoeG1sLCAic2hvd19uYW1lMSIpOworCWd0a19jaGVja19tZW51X2l0ZW1fc2V0X2FjdGl2ZSgoR3RrQ2hlY2tNZW51SXRlbSAqKSB3aWRnZXQsCisJCQkJICAgICAgIHNob3dfbmFtZSk7CisKKwl3aWRnZXQgPSBnbGFkZV94bWxfZ2V0X3dpZGdldCh4bWwsICJzaG93X3JhbmdlMSIpOworCWd0a19jaGVja19tZW51X2l0ZW1fc2V0X2FjdGl2ZSgoR3RrQ2hlY2tNZW51SXRlbSAqKSB3aWRnZXQsCisJCQkJICAgICAgIHNob3dfcmFuZ2UpOworCisJd2lkZ2V0ID0gZ2xhZGVfeG1sX2dldF93aWRnZXQoeG1sLCAic2hvd19kYXRhMSIpOworCWd0a19jaGVja19tZW51X2l0ZW1fc2V0X2FjdGl2ZSgoR3RrQ2hlY2tNZW51SXRlbSAqKSB3aWRnZXQsCisJCQkJICAgICAgIHNob3dfdmFsdWUpOworCisJc3R5bGUgPSBndGtfd2lkZ2V0X2dldF9zdHlsZShtYWluX3duZCk7CisJd2lkZ2V0ID0gZ2xhZGVfeG1sX2dldF93aWRnZXQoeG1sLCAidG9vbGJhcjEiKTsKKworCXBpeG1hcCA9IGdka19waXhtYXBfY3JlYXRlX2Zyb21feHBtX2QobWFpbl93bmQtPndpbmRvdywgJm1hc2ssCisJCQkJCSAgICAgICZzdHlsZS0+YmdbR1RLX1NUQVRFX05PUk1BTF0sCisJCQkJCSAgICAgIChnY2hhciAqKikgeHBtX3NpbmdsZV92aWV3KTsKKwlndGtfaW1hZ2Vfc2V0X2Zyb21fcGl4bWFwKEdUS19JTUFHRQorCQkJCSAgKCgoR3RrVG9vbGJhckNoaWxkCisJCQkJICAgICAqKSAoZ19saXN0X250aChHVEtfVE9PTEJBUih3aWRnZXQpLT4KKwkJCQkJCSAgICBjaGlsZHJlbiwKKwkJCQkJCSAgICA1KS0+ZGF0YSkpLT5pY29uKSwKKwkJCQkgIHBpeG1hcCwgbWFzayk7CisJcGl4bWFwID0KKwkgICAgZ2RrX3BpeG1hcF9jcmVhdGVfZnJvbV94cG1fZChtYWluX3duZC0+d2luZG93LCAmbWFzaywKKwkJCQkJICZzdHlsZS0+YmdbR1RLX1NUQVRFX05PUk1BTF0sCisJCQkJCSAoZ2NoYXIgKiopIHhwbV9zcGxpdF92aWV3KTsKKwlndGtfaW1hZ2Vfc2V0X2Zyb21fcGl4bWFwKEdUS19JTUFHRQorCQkJCSAgKCgoR3RrVG9vbGJhckNoaWxkCisJCQkJICAgICAqKSAoZ19saXN0X250aChHVEtfVE9PTEJBUih3aWRnZXQpLT4KKwkJCQkJCSAgICBjaGlsZHJlbiwKKwkJCQkJCSAgICA2KS0+ZGF0YSkpLT5pY29uKSwKKwkJCQkgIHBpeG1hcCwgbWFzayk7CisJcGl4bWFwID0KKwkgICAgZ2RrX3BpeG1hcF9jcmVhdGVfZnJvbV94cG1fZChtYWluX3duZC0+d2luZG93LCAmbWFzaywKKwkJCQkJICZzdHlsZS0+YmdbR1RLX1NUQVRFX05PUk1BTF0sCisJCQkJCSAoZ2NoYXIgKiopIHhwbV90cmVlX3ZpZXcpOworCWd0a19pbWFnZV9zZXRfZnJvbV9waXhtYXAoR1RLX0lNQUdFCisJCQkJICAoKChHdGtUb29sYmFyQ2hpbGQKKwkJCQkgICAgICopIChnX2xpc3RfbnRoKEdUS19UT09MQkFSKHdpZGdldCktPgorCQkJCQkJICAgIGNoaWxkcmVuLAorCQkJCQkJICAgIDcpLT5kYXRhKSktPmljb24pLAorCQkJCSAgcGl4bWFwLCBtYXNrKTsKKworCXN3aXRjaCAodmlld19tb2RlKSB7CisJY2FzZSBTSU5HTEVfVklFVzoKKwkJd2lkZ2V0ID0gZ2xhZGVfeG1sX2dldF93aWRnZXQoeG1sLCAiYnV0dG9uNCIpOworCQlnX3NpZ25hbF9lbWl0X2J5X25hbWUod2lkZ2V0LCAiY2xpY2tlZCIpOworCQlicmVhazsKKwljYXNlIFNQTElUX1ZJRVc6CisJCXdpZGdldCA9IGdsYWRlX3htbF9nZXRfd2lkZ2V0KHhtbCwgImJ1dHRvbjUiKTsKKwkJZ19zaWduYWxfZW1pdF9ieV9uYW1lKHdpZGdldCwgImNsaWNrZWQiKTsKKwkJYnJlYWs7CisJY2FzZSBGVUxMX1ZJRVc6CisJCXdpZGdldCA9IGdsYWRlX3htbF9nZXRfd2lkZ2V0KHhtbCwgImJ1dHRvbjYiKTsKKwkJZ19zaWduYWxfZW1pdF9ieV9uYW1lKHdpZGdldCwgImNsaWNrZWQiKTsKKwkJYnJlYWs7CisJfQorCisJdHh0YnVmID0gZ3RrX3RleHRfdmlld19nZXRfYnVmZmVyKEdUS19URVhUX1ZJRVcodGV4dF93KSk7CisJdGFnMSA9IGd0a190ZXh0X2J1ZmZlcl9jcmVhdGVfdGFnKHR4dGJ1ZiwgIm15dGFnMSIsCisJCQkJCSAgImZvcmVncm91bmQiLCAicmVkIiwKKwkJCQkJICAid2VpZ2h0IiwgUEFOR09fV0VJR0hUX0JPTEQsCisJCQkJCSAgTlVMTCk7CisJdGFnMiA9IGd0a190ZXh0X2J1ZmZlcl9jcmVhdGVfdGFnKHR4dGJ1ZiwgIm15dGFnMiIsCisJCQkJCSAgLyoic3R5bGUiLCBQQU5HT19TVFlMRV9PQkxJUVVFLCAqLworCQkJCQkgIE5VTEwpOworCisJc3ByaW50Zih0aXRsZSwgIkxpbnV4IEtlcm5lbCB2JXMgQ29uZmlndXJhdGlvbiIsCisJCWdldGVudigiS0VSTkVMUkVMRUFTRSIpKTsKKwlndGtfd2luZG93X3NldF90aXRsZShHVEtfV0lORE9XKG1haW5fd25kKSwgdGl0bGUpOworCisJZ3RrX3dpZGdldF9zaG93KG1haW5fd25kKTsKK30KKwordm9pZCBpbml0X3RyZWVfbW9kZWwodm9pZCkKK3sKKwlnaW50IGk7CisKKwl0cmVlID0gdHJlZTIgPSBndGtfdHJlZV9zdG9yZV9uZXcoQ09MX05VTUJFUiwKKwkJCQkJICBHX1RZUEVfU1RSSU5HLCBHX1RZUEVfU1RSSU5HLAorCQkJCQkgIEdfVFlQRV9TVFJJTkcsIEdfVFlQRV9TVFJJTkcsCisJCQkJCSAgR19UWVBFX1NUUklORywgR19UWVBFX1NUUklORywKKwkJCQkJICBHX1RZUEVfUE9JTlRFUiwgR0RLX1RZUEVfQ09MT1IsCisJCQkJCSAgR19UWVBFX0JPT0xFQU4sIEdES19UWVBFX1BJWEJVRiwKKwkJCQkJICBHX1RZUEVfQk9PTEVBTiwgR19UWVBFX0JPT0xFQU4sCisJCQkJCSAgR19UWVBFX0JPT0xFQU4sIEdfVFlQRV9CT09MRUFOLAorCQkJCQkgIEdfVFlQRV9CT09MRUFOKTsKKwltb2RlbDIgPSBHVEtfVFJFRV9NT0RFTCh0cmVlMik7CisKKwlmb3IgKHBhcmVudHNbMF0gPSBOVUxMLCBpID0gMTsgaSA8IDI1NjsgaSsrKQorCQlwYXJlbnRzW2ldID0gKEd0a1RyZWVJdGVyICopIGdfbWFsbG9jKHNpemVvZihHdGtUcmVlSXRlcikpOworCisJdHJlZTEgPSBndGtfdHJlZV9zdG9yZV9uZXcoQ09MX05VTUJFUiwKKwkJCQkgICBHX1RZUEVfU1RSSU5HLCBHX1RZUEVfU1RSSU5HLAorCQkJCSAgIEdfVFlQRV9TVFJJTkcsIEdfVFlQRV9TVFJJTkcsCisJCQkJICAgR19UWVBFX1NUUklORywgR19UWVBFX1NUUklORywKKwkJCQkgICBHX1RZUEVfUE9JTlRFUiwgR0RLX1RZUEVfQ09MT1IsCisJCQkJICAgR19UWVBFX0JPT0xFQU4sIEdES19UWVBFX1BJWEJVRiwKKwkJCQkgICBHX1RZUEVfQk9PTEVBTiwgR19UWVBFX0JPT0xFQU4sCisJCQkJICAgR19UWVBFX0JPT0xFQU4sIEdfVFlQRV9CT09MRUFOLAorCQkJCSAgIEdfVFlQRV9CT09MRUFOKTsKKwltb2RlbDEgPSBHVEtfVFJFRV9NT0RFTCh0cmVlMSk7Cit9CisKK3ZvaWQgaW5pdF9sZWZ0X3RyZWUodm9pZCkKK3sKKwlHdGtUcmVlVmlldyAqdmlldyA9IEdUS19UUkVFX1ZJRVcodHJlZTFfdyk7CisJR3RrQ2VsbFJlbmRlcmVyICpyZW5kZXJlcjsKKwlHdGtUcmVlU2VsZWN0aW9uICpzZWw7CisJR3RrVHJlZVZpZXdDb2x1bW4gKmNvbHVtbjsKKworCWd0a190cmVlX3ZpZXdfc2V0X21vZGVsKHZpZXcsIG1vZGVsMSk7CisJZ3RrX3RyZWVfdmlld19zZXRfaGVhZGVyc192aXNpYmxlKHZpZXcsIFRSVUUpOworCWd0a190cmVlX3ZpZXdfc2V0X3J1bGVzX2hpbnQodmlldywgRkFMU0UpOworCQorCWNvbHVtbiA9IGd0a190cmVlX3ZpZXdfY29sdW1uX25ldygpOworCWd0a190cmVlX3ZpZXdfYXBwZW5kX2NvbHVtbih2aWV3LCBjb2x1bW4pOworCWd0a190cmVlX3ZpZXdfY29sdW1uX3NldF90aXRsZShjb2x1bW4sICJPcHRpb25zIik7CisKKwlyZW5kZXJlciA9IGd0a19jZWxsX3JlbmRlcmVyX3RvZ2dsZV9uZXcoKTsKKwlndGtfdHJlZV92aWV3X2NvbHVtbl9wYWNrX3N0YXJ0KEdUS19UUkVFX1ZJRVdfQ09MVU1OKGNvbHVtbiksCisJCQkJCXJlbmRlcmVyLCBGQUxTRSk7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X2F0dHJpYnV0ZXMoR1RLX1RSRUVfVklFV19DT0xVTU4oY29sdW1uKSwKKwkJCQkJICAgIHJlbmRlcmVyLAorCQkJCQkgICAgImFjdGl2ZSIsIENPTF9CVE5BQ1QsCisJCQkJCSAgICAiaW5jb25zaXN0ZW50IiwgQ09MX0JUTklOQywKKwkJCQkJICAgICJ2aXNpYmxlIiwgQ09MX0JUTlZJUywgCisJCQkJCSAgICAicmFkaW8iLCBDT0xfQlROUkFELCBOVUxMKTsKKwlyZW5kZXJlciA9IGd0a19jZWxsX3JlbmRlcmVyX3RleHRfbmV3KCk7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fcGFja19zdGFydChHVEtfVFJFRV9WSUVXX0NPTFVNTihjb2x1bW4pLAorCQkJCQlyZW5kZXJlciwgRkFMU0UpOwkKKwlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfYXR0cmlidXRlcyhHVEtfVFJFRV9WSUVXX0NPTFVNTihjb2x1bW4pLAorCQkJCQkgICAgcmVuZGVyZXIsCisJCQkJCSAgICAidGV4dCIsIENPTF9PUFRJT04sCisJCQkJCSAgICAiZm9yZWdyb3VuZC1nZGsiLAorCQkJCQkgICAgQ09MX0NPTE9SLCBOVUxMKTsKKworCXNlbCA9IGd0a190cmVlX3ZpZXdfZ2V0X3NlbGVjdGlvbih2aWV3KTsKKwlndGtfdHJlZV9zZWxlY3Rpb25fc2V0X21vZGUoc2VsLCBHVEtfU0VMRUNUSU9OX1NJTkdMRSk7CisJZ3RrX3dpZGdldF9yZWFsaXplKHRyZWUxX3cpOworfQorCitzdGF0aWMgdm9pZCByZW5kZXJlcl9lZGl0ZWQoR3RrQ2VsbFJlbmRlcmVyVGV4dCAqIGNlbGwsCisJCQkgICAgY29uc3QgZ2NoYXIgKiBwYXRoX3N0cmluZywKKwkJCSAgICBjb25zdCBnY2hhciAqIG5ld190ZXh0LCBncG9pbnRlciB1c2VyX2RhdGEpOworc3RhdGljIHZvaWQgcmVuZGVyZXJfdG9nZ2xlZChHdGtDZWxsUmVuZGVyZXJUb2dnbGUgKiBjZWxscmVuZGVyZXJ0b2dnbGUsCisJCQkgICAgIGdjaGFyICogYXJnMSwgZ3BvaW50ZXIgdXNlcl9kYXRhKTsKKwordm9pZCBpbml0X3JpZ2h0X3RyZWUodm9pZCkKK3sKKwlHdGtUcmVlVmlldyAqdmlldyA9IEdUS19UUkVFX1ZJRVcodHJlZTJfdyk7CisJR3RrQ2VsbFJlbmRlcmVyICpyZW5kZXJlcjsKKwlHdGtUcmVlU2VsZWN0aW9uICpzZWw7CisJR3RrVHJlZVZpZXdDb2x1bW4gKmNvbHVtbjsKKwlnaW50IGk7CisKKwlndGtfdHJlZV92aWV3X3NldF9tb2RlbCh2aWV3LCBtb2RlbDIpOworCWd0a190cmVlX3ZpZXdfc2V0X2hlYWRlcnNfdmlzaWJsZSh2aWV3LCBUUlVFKTsKKwlndGtfdHJlZV92aWV3X3NldF9ydWxlc19oaW50KHZpZXcsIEZBTFNFKTsKKworCWNvbHVtbiA9IGd0a190cmVlX3ZpZXdfY29sdW1uX25ldygpOworCWd0a190cmVlX3ZpZXdfYXBwZW5kX2NvbHVtbih2aWV3LCBjb2x1bW4pOworCWd0a190cmVlX3ZpZXdfY29sdW1uX3NldF90aXRsZShjb2x1bW4sICJPcHRpb25zIik7CisKKwlyZW5kZXJlciA9IGd0a19jZWxsX3JlbmRlcmVyX3BpeGJ1Zl9uZXcoKTsKKwlndGtfdHJlZV92aWV3X2NvbHVtbl9wYWNrX3N0YXJ0KEdUS19UUkVFX1ZJRVdfQ09MVU1OKGNvbHVtbiksCisJCQkJCXJlbmRlcmVyLCBGQUxTRSk7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X2F0dHJpYnV0ZXMoR1RLX1RSRUVfVklFV19DT0xVTU4oY29sdW1uKSwKKwkJCQkJICAgIHJlbmRlcmVyLAorCQkJCQkgICAgInBpeGJ1ZiIsIENPTF9QSVhCVUYsCisJCQkJCSAgICAidmlzaWJsZSIsIENPTF9QSVhWSVMsIE5VTEwpOworCXJlbmRlcmVyID0gZ3RrX2NlbGxfcmVuZGVyZXJfdG9nZ2xlX25ldygpOworCWd0a190cmVlX3ZpZXdfY29sdW1uX3BhY2tfc3RhcnQoR1RLX1RSRUVfVklFV19DT0xVTU4oY29sdW1uKSwKKwkJCQkJcmVuZGVyZXIsIEZBTFNFKTsKKwlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfYXR0cmlidXRlcyhHVEtfVFJFRV9WSUVXX0NPTFVNTihjb2x1bW4pLAorCQkJCQkgICAgcmVuZGVyZXIsCisJCQkJCSAgICAiYWN0aXZlIiwgQ09MX0JUTkFDVCwKKwkJCQkJICAgICJpbmNvbnNpc3RlbnQiLCBDT0xfQlROSU5DLAorCQkJCQkgICAgInZpc2libGUiLCBDT0xfQlROVklTLCAKKwkJCQkJICAgICJyYWRpbyIsIENPTF9CVE5SQUQsIE5VTEwpOworCS8qZ19zaWduYWxfY29ubmVjdChHX09CSkVDVChyZW5kZXJlciksICJ0b2dnbGVkIiwKKwkgICBHX0NBTExCQUNLKHJlbmRlcmVyX3RvZ2dsZWQpLCBOVUxMKTsgKi8KKwlyZW5kZXJlciA9IGd0a19jZWxsX3JlbmRlcmVyX3RleHRfbmV3KCk7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fcGFja19zdGFydChHVEtfVFJFRV9WSUVXX0NPTFVNTihjb2x1bW4pLAorCQkJCQlyZW5kZXJlciwgRkFMU0UpOworCWd0a190cmVlX3ZpZXdfY29sdW1uX3NldF9hdHRyaWJ1dGVzKEdUS19UUkVFX1ZJRVdfQ09MVU1OKGNvbHVtbiksCisJCQkJCSAgICByZW5kZXJlciwKKwkJCQkJICAgICJ0ZXh0IiwgQ09MX09QVElPTiwKKwkJCQkJICAgICJmb3JlZ3JvdW5kLWdkayIsCisJCQkJCSAgICBDT0xfQ09MT1IsIE5VTEwpOworCisJcmVuZGVyZXIgPSBndGtfY2VsbF9yZW5kZXJlcl90ZXh0X25ldygpOworCWd0a190cmVlX3ZpZXdfaW5zZXJ0X2NvbHVtbl93aXRoX2F0dHJpYnV0ZXModmlldywgLTEsCisJCQkJCQkgICAgIk5hbWUiLCByZW5kZXJlciwKKwkJCQkJCSAgICAidGV4dCIsIENPTF9OQU1FLAorCQkJCQkJICAgICJmb3JlZ3JvdW5kLWdkayIsCisJCQkJCQkgICAgQ09MX0NPTE9SLCBOVUxMKTsKKwlyZW5kZXJlciA9IGd0a19jZWxsX3JlbmRlcmVyX3RleHRfbmV3KCk7CisJZ3RrX3RyZWVfdmlld19pbnNlcnRfY29sdW1uX3dpdGhfYXR0cmlidXRlcyh2aWV3LCAtMSwKKwkJCQkJCSAgICAiTiIsIHJlbmRlcmVyLAorCQkJCQkJICAgICJ0ZXh0IiwgQ09MX05PLAorCQkJCQkJICAgICJmb3JlZ3JvdW5kLWdkayIsCisJCQkJCQkgICAgQ09MX0NPTE9SLCBOVUxMKTsKKwlyZW5kZXJlciA9IGd0a19jZWxsX3JlbmRlcmVyX3RleHRfbmV3KCk7CisJZ3RrX3RyZWVfdmlld19pbnNlcnRfY29sdW1uX3dpdGhfYXR0cmlidXRlcyh2aWV3LCAtMSwKKwkJCQkJCSAgICAiTSIsIHJlbmRlcmVyLAorCQkJCQkJICAgICJ0ZXh0IiwgQ09MX01PRCwKKwkJCQkJCSAgICAiZm9yZWdyb3VuZC1nZGsiLAorCQkJCQkJICAgIENPTF9DT0xPUiwgTlVMTCk7CisJcmVuZGVyZXIgPSBndGtfY2VsbF9yZW5kZXJlcl90ZXh0X25ldygpOworCWd0a190cmVlX3ZpZXdfaW5zZXJ0X2NvbHVtbl93aXRoX2F0dHJpYnV0ZXModmlldywgLTEsCisJCQkJCQkgICAgIlkiLCByZW5kZXJlciwKKwkJCQkJCSAgICAidGV4dCIsIENPTF9ZRVMsCisJCQkJCQkgICAgImZvcmVncm91bmQtZ2RrIiwKKwkJCQkJCSAgICBDT0xfQ09MT1IsIE5VTEwpOworCXJlbmRlcmVyID0gZ3RrX2NlbGxfcmVuZGVyZXJfdGV4dF9uZXcoKTsKKwlndGtfdHJlZV92aWV3X2luc2VydF9jb2x1bW5fd2l0aF9hdHRyaWJ1dGVzKHZpZXcsIC0xLAorCQkJCQkJICAgICJWYWx1ZSIsIHJlbmRlcmVyLAorCQkJCQkJICAgICJ0ZXh0IiwgQ09MX1ZBTFVFLAorCQkJCQkJICAgICJlZGl0YWJsZSIsCisJCQkJCQkgICAgQ09MX0VESVQsCisJCQkJCQkgICAgImZvcmVncm91bmQtZ2RrIiwKKwkJCQkJCSAgICBDT0xfQ09MT1IsIE5VTEwpOworCWdfc2lnbmFsX2Nvbm5lY3QoR19PQkpFQ1QocmVuZGVyZXIpLCAiZWRpdGVkIiwKKwkJCSBHX0NBTExCQUNLKHJlbmRlcmVyX2VkaXRlZCksIE5VTEwpOworCisJY29sdW1uID0gZ3RrX3RyZWVfdmlld19nZXRfY29sdW1uKHZpZXcsIENPTF9OQU1FKTsKKwlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfdmlzaWJsZShjb2x1bW4sIHNob3dfbmFtZSk7CisJY29sdW1uID0gZ3RrX3RyZWVfdmlld19nZXRfY29sdW1uKHZpZXcsIENPTF9OTyk7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3Zpc2libGUoY29sdW1uLCBzaG93X3JhbmdlKTsKKwljb2x1bW4gPSBndGtfdHJlZV92aWV3X2dldF9jb2x1bW4odmlldywgQ09MX01PRCk7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3Zpc2libGUoY29sdW1uLCBzaG93X3JhbmdlKTsKKwljb2x1bW4gPSBndGtfdHJlZV92aWV3X2dldF9jb2x1bW4odmlldywgQ09MX1lFUyk7CisJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3Zpc2libGUoY29sdW1uLCBzaG93X3JhbmdlKTsKKwljb2x1bW4gPSBndGtfdHJlZV92aWV3X2dldF9jb2x1bW4odmlldywgQ09MX1ZBTFVFKTsKKwlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfdmlzaWJsZShjb2x1bW4sIHNob3dfdmFsdWUpOworCisJaWYgKHJlc2l6ZWFibGUpIHsKKwkJZm9yIChpID0gMDsgaSA8IENPTF9WQUxVRTsgaSsrKSB7CisJCQljb2x1bW4gPSBndGtfdHJlZV92aWV3X2dldF9jb2x1bW4odmlldywgaSk7CisJCQlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfcmVzaXphYmxlKGNvbHVtbiwgVFJVRSk7CisJCX0KKwl9CisKKwlzZWwgPSBndGtfdHJlZV92aWV3X2dldF9zZWxlY3Rpb24odmlldyk7CisJZ3RrX3RyZWVfc2VsZWN0aW9uX3NldF9tb2RlKHNlbCwgR1RLX1NFTEVDVElPTl9TSU5HTEUpOworfQorCisKKy8qIFV0aWxpdHkgRnVuY3Rpb25zICovCisKKworc3RhdGljIHZvaWQgdGV4dF9pbnNlcnRfaGVscChzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlHdGtUZXh0QnVmZmVyICpidWZmZXI7CisJR3RrVGV4dEl0ZXIgc3RhcnQsIGVuZDsKKwljb25zdCBjaGFyICpwcm9tcHQgPSBtZW51X2dldF9wcm9tcHQobWVudSk7CisJZ2NoYXIgKm5hbWU7CisJY29uc3QgY2hhciAqaGVscCA9IG5vaGVscF90ZXh0OworCisJaWYgKCFtZW51LT5zeW0pCisJCWhlbHAgPSAiIjsKKwllbHNlIGlmIChtZW51LT5zeW0tPmhlbHApCisJCWhlbHAgPSBtZW51LT5zeW0tPmhlbHA7CisKKwlpZiAobWVudS0+c3ltICYmIG1lbnUtPnN5bS0+bmFtZSkKKwkJbmFtZSA9IGdfc3RyZHVwX3ByaW50ZihtZW51LT5zeW0tPm5hbWUpOworCWVsc2UKKwkJbmFtZSA9IGdfc3RyZHVwKCIiKTsKKworCWJ1ZmZlciA9IGd0a190ZXh0X3ZpZXdfZ2V0X2J1ZmZlcihHVEtfVEVYVF9WSUVXKHRleHRfdykpOworCWd0a190ZXh0X2J1ZmZlcl9nZXRfYm91bmRzKGJ1ZmZlciwgJnN0YXJ0LCAmZW5kKTsKKwlndGtfdGV4dF9idWZmZXJfZGVsZXRlKGJ1ZmZlciwgJnN0YXJ0LCAmZW5kKTsKKwlndGtfdGV4dF92aWV3X3NldF9sZWZ0X21hcmdpbihHVEtfVEVYVF9WSUVXKHRleHRfdyksIDE1KTsKKworCWd0a190ZXh0X2J1ZmZlcl9nZXRfZW5kX2l0ZXIoYnVmZmVyLCAmZW5kKTsKKwlndGtfdGV4dF9idWZmZXJfaW5zZXJ0X3dpdGhfdGFncyhidWZmZXIsICZlbmQsIHByb21wdCwgLTEsIHRhZzEsCisJCQkJCSBOVUxMKTsKKwlndGtfdGV4dF9idWZmZXJfaW5zZXJ0X2F0X2N1cnNvcihidWZmZXIsICIgIiwgMSk7CisJZ3RrX3RleHRfYnVmZmVyX2dldF9lbmRfaXRlcihidWZmZXIsICZlbmQpOworCWd0a190ZXh0X2J1ZmZlcl9pbnNlcnRfd2l0aF90YWdzKGJ1ZmZlciwgJmVuZCwgbmFtZSwgLTEsIHRhZzEsCisJCQkJCSBOVUxMKTsKKwlndGtfdGV4dF9idWZmZXJfaW5zZXJ0X2F0X2N1cnNvcihidWZmZXIsICJcblxuIiwgMik7CisJZ3RrX3RleHRfYnVmZmVyX2dldF9lbmRfaXRlcihidWZmZXIsICZlbmQpOworCWd0a190ZXh0X2J1ZmZlcl9pbnNlcnRfd2l0aF90YWdzKGJ1ZmZlciwgJmVuZCwgaGVscCwgLTEsIHRhZzIsCisJCQkJCSBOVUxMKTsKK30KKworCitzdGF0aWMgdm9pZCB0ZXh0X2luc2VydF9tc2coY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKm1lc3NhZ2UpCit7CisJR3RrVGV4dEJ1ZmZlciAqYnVmZmVyOworCUd0a1RleHRJdGVyIHN0YXJ0LCBlbmQ7CisJY29uc3QgY2hhciAqbXNnID0gbWVzc2FnZTsKKworCWJ1ZmZlciA9IGd0a190ZXh0X3ZpZXdfZ2V0X2J1ZmZlcihHVEtfVEVYVF9WSUVXKHRleHRfdykpOworCWd0a190ZXh0X2J1ZmZlcl9nZXRfYm91bmRzKGJ1ZmZlciwgJnN0YXJ0LCAmZW5kKTsKKwlndGtfdGV4dF9idWZmZXJfZGVsZXRlKGJ1ZmZlciwgJnN0YXJ0LCAmZW5kKTsKKwlndGtfdGV4dF92aWV3X3NldF9sZWZ0X21hcmdpbihHVEtfVEVYVF9WSUVXKHRleHRfdyksIDE1KTsKKworCWd0a190ZXh0X2J1ZmZlcl9nZXRfZW5kX2l0ZXIoYnVmZmVyLCAmZW5kKTsKKwlndGtfdGV4dF9idWZmZXJfaW5zZXJ0X3dpdGhfdGFncyhidWZmZXIsICZlbmQsIHRpdGxlLCAtMSwgdGFnMSwKKwkJCQkJIE5VTEwpOworCWd0a190ZXh0X2J1ZmZlcl9pbnNlcnRfYXRfY3Vyc29yKGJ1ZmZlciwgIlxuXG4iLCAyKTsKKwlndGtfdGV4dF9idWZmZXJfZ2V0X2VuZF9pdGVyKGJ1ZmZlciwgJmVuZCk7CisJZ3RrX3RleHRfYnVmZmVyX2luc2VydF93aXRoX3RhZ3MoYnVmZmVyLCAmZW5kLCBtc2csIC0xLCB0YWcyLAorCQkJCQkgTlVMTCk7Cit9CisKKworLyogTWFpbiBXaW5kb3dzIENhbGxiYWNrcyAqLworCit2b2lkIG9uX3NhdmUxX2FjdGl2YXRlKEd0a01lbnVJdGVtICogbWVudWl0ZW0sIGdwb2ludGVyIHVzZXJfZGF0YSk7CitnYm9vbGVhbiBvbl93aW5kb3cxX2RlbGV0ZV9ldmVudChHdGtXaWRnZXQgKiB3aWRnZXQsIEdka0V2ZW50ICogZXZlbnQsCisJCQkJIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlHdGtXaWRnZXQgKmRpYWxvZywgKmxhYmVsOworCWdpbnQgcmVzdWx0OworCisJaWYgKGNvbmZpZ19jaGFuZ2VkID09IEZBTFNFKQorCQlyZXR1cm4gRkFMU0U7CisKKwlkaWFsb2cgPSBndGtfZGlhbG9nX25ld193aXRoX2J1dHRvbnMoIldhcm5pbmcgISIsCisJCQkJCSAgICAgR1RLX1dJTkRPVyhtYWluX3duZCksCisJCQkJCSAgICAgKEd0a0RpYWxvZ0ZsYWdzKQorCQkJCQkgICAgIChHVEtfRElBTE9HX01PREFMIHwKKwkJCQkJICAgICAgR1RLX0RJQUxPR19ERVNUUk9ZX1dJVEhfUEFSRU5UKSwKKwkJCQkJICAgICBHVEtfU1RPQ0tfT0ssCisJCQkJCSAgICAgR1RLX1JFU1BPTlNFX1lFUywKKwkJCQkJICAgICBHVEtfU1RPQ0tfTk8sCisJCQkJCSAgICAgR1RLX1JFU1BPTlNFX05PLAorCQkJCQkgICAgIEdUS19TVE9DS19DQU5DRUwsCisJCQkJCSAgICAgR1RLX1JFU1BPTlNFX0NBTkNFTCwgTlVMTCk7CisJZ3RrX2RpYWxvZ19zZXRfZGVmYXVsdF9yZXNwb25zZShHVEtfRElBTE9HKGRpYWxvZyksCisJCQkJCUdUS19SRVNQT05TRV9DQU5DRUwpOworCisJbGFiZWwgPSBndGtfbGFiZWxfbmV3KCJcblNhdmUgY29uZmlndXJhdGlvbiA/XG4iKTsKKwlndGtfY29udGFpbmVyX2FkZChHVEtfQ09OVEFJTkVSKEdUS19ESUFMT0coZGlhbG9nKS0+dmJveCksIGxhYmVsKTsKKwlndGtfd2lkZ2V0X3Nob3cobGFiZWwpOworCisJcmVzdWx0ID0gZ3RrX2RpYWxvZ19ydW4oR1RLX0RJQUxPRyhkaWFsb2cpKTsKKwlzd2l0Y2ggKHJlc3VsdCkgeworCWNhc2UgR1RLX1JFU1BPTlNFX1lFUzoKKwkJb25fc2F2ZTFfYWN0aXZhdGUoTlVMTCwgTlVMTCk7CisJCXJldHVybiBGQUxTRTsKKwljYXNlIEdUS19SRVNQT05TRV9OTzoKKwkJcmV0dXJuIEZBTFNFOworCWNhc2UgR1RLX1JFU1BPTlNFX0NBTkNFTDoKKwljYXNlIEdUS19SRVNQT05TRV9ERUxFVEVfRVZFTlQ6CisJZGVmYXVsdDoKKwkJZ3RrX3dpZGdldF9kZXN0cm95KGRpYWxvZyk7CisJCXJldHVybiBUUlVFOworCX0KKworCXJldHVybiBGQUxTRTsKK30KKworCit2b2lkIG9uX3dpbmRvdzFfZGVzdHJveShHdGtPYmplY3QgKiBvYmplY3QsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlndGtfbWFpbl9xdWl0KCk7Cit9CisKKwordm9pZAorb25fd2luZG93MV9zaXplX3JlcXVlc3QoR3RrV2lkZ2V0ICogd2lkZ2V0LAorCQkJR3RrUmVxdWlzaXRpb24gKiByZXF1aXNpdGlvbiwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCXN0YXRpYyBnaW50IG9sZF9oOworCWdpbnQgdywgaDsKKworCWlmICh3aWRnZXQtPndpbmRvdyA9PSBOVUxMKQorCQlndGtfd2luZG93X2dldF9kZWZhdWx0X3NpemUoR1RLX1dJTkRPVyhtYWluX3duZCksICZ3LCAmaCk7CisJZWxzZQorCQlnZGtfd2luZG93X2dldF9zaXplKHdpZGdldC0+d2luZG93LCAmdywgJmgpOworCisJaWYgKGggPT0gb2xkX2gpCisJCXJldHVybjsKKwlvbGRfaCA9IGg7CisKKwlndGtfcGFuZWRfc2V0X3Bvc2l0aW9uKEdUS19QQU5FRCh2cGFuZWQpLCAyICogaCAvIDMpOworfQorCisKKy8qIE1lbnUgJiBUb29sYmFyIENhbGxiYWNrcyAqLworCisKK3N0YXRpYyB2b2lkCitsb2FkX2ZpbGVuYW1lKEd0a0ZpbGVTZWxlY3Rpb24gKiBmaWxlX3NlbGVjdG9yLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJY29uc3QgZ2NoYXIgKmZuOworCisJZm4gPSBndGtfZmlsZV9zZWxlY3Rpb25fZ2V0X2ZpbGVuYW1lKEdUS19GSUxFX1NFTEVDVElPTgorCQkJCQkgICAgICh1c2VyX2RhdGEpKTsKKworCWlmIChjb25mX3JlYWQoZm4pKQorCQl0ZXh0X2luc2VydF9tc2coIkVycm9yIiwgIlVuYWJsZSB0byBsb2FkIGNvbmZpZ3VyYXRpb24gISIpOworCWVsc2UKKwkJZGlzcGxheV90cmVlKCZyb290bWVudSk7Cit9CisKK3ZvaWQgb25fbG9hZDFfYWN0aXZhdGUoR3RrTWVudUl0ZW0gKiBtZW51aXRlbSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCUd0a1dpZGdldCAqZnM7CisKKwlmcyA9IGd0a19maWxlX3NlbGVjdGlvbl9uZXcoIkxvYWQgZmlsZS4uLiIpOworCWdfc2lnbmFsX2Nvbm5lY3QoR1RLX09CSkVDVChHVEtfRklMRV9TRUxFQ1RJT04oZnMpLT5va19idXR0b24pLAorCQkJICJjbGlja2VkIiwKKwkJCSBHX0NBTExCQUNLKGxvYWRfZmlsZW5hbWUpLCAoZ3BvaW50ZXIpIGZzKTsKKwlnX3NpZ25hbF9jb25uZWN0X3N3YXBwZWQoR1RLX09CSkVDVAorCQkJCSAoR1RLX0ZJTEVfU0VMRUNUSU9OKGZzKS0+b2tfYnV0dG9uKSwKKwkJCQkgImNsaWNrZWQiLCBHX0NBTExCQUNLKGd0a193aWRnZXRfZGVzdHJveSksCisJCQkJIChncG9pbnRlcikgZnMpOworCWdfc2lnbmFsX2Nvbm5lY3Rfc3dhcHBlZChHVEtfT0JKRUNUCisJCQkJIChHVEtfRklMRV9TRUxFQ1RJT04oZnMpLT5jYW5jZWxfYnV0dG9uKSwKKwkJCQkgImNsaWNrZWQiLCBHX0NBTExCQUNLKGd0a193aWRnZXRfZGVzdHJveSksCisJCQkJIChncG9pbnRlcikgZnMpOworCWd0a193aWRnZXRfc2hvdyhmcyk7Cit9CisKKwordm9pZCBvbl9zYXZlMV9hY3RpdmF0ZShHdGtNZW51SXRlbSAqIG1lbnVpdGVtLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJaWYgKGNvbmZfd3JpdGUoTlVMTCkpCisJCXRleHRfaW5zZXJ0X21zZygiRXJyb3IiLCAiVW5hYmxlIHRvIHNhdmUgY29uZmlndXJhdGlvbiAhIik7CisKKwljb25maWdfY2hhbmdlZCA9IEZBTFNFOworfQorCisKK3N0YXRpYyB2b2lkCitzdG9yZV9maWxlbmFtZShHdGtGaWxlU2VsZWN0aW9uICogZmlsZV9zZWxlY3RvciwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCWNvbnN0IGdjaGFyICpmbjsKKworCWZuID0gZ3RrX2ZpbGVfc2VsZWN0aW9uX2dldF9maWxlbmFtZShHVEtfRklMRV9TRUxFQ1RJT04KKwkJCQkJICAgICAodXNlcl9kYXRhKSk7CisKKwlpZiAoY29uZl93cml0ZShmbikpCisJCXRleHRfaW5zZXJ0X21zZygiRXJyb3IiLCAiVW5hYmxlIHRvIHNhdmUgY29uZmlndXJhdGlvbiAhIik7CisKKwlndGtfd2lkZ2V0X2Rlc3Ryb3koR1RLX1dJREdFVCh1c2VyX2RhdGEpKTsKK30KKwordm9pZCBvbl9zYXZlX2FzMV9hY3RpdmF0ZShHdGtNZW51SXRlbSAqIG1lbnVpdGVtLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJR3RrV2lkZ2V0ICpmczsKKworCWZzID0gZ3RrX2ZpbGVfc2VsZWN0aW9uX25ldygiU2F2ZSBmaWxlIGFzLi4uIik7CisJZ19zaWduYWxfY29ubmVjdChHVEtfT0JKRUNUKEdUS19GSUxFX1NFTEVDVElPTihmcyktPm9rX2J1dHRvbiksCisJCQkgImNsaWNrZWQiLAorCQkJIEdfQ0FMTEJBQ0soc3RvcmVfZmlsZW5hbWUpLCAoZ3BvaW50ZXIpIGZzKTsKKwlnX3NpZ25hbF9jb25uZWN0X3N3YXBwZWQoR1RLX09CSkVDVAorCQkJCSAoR1RLX0ZJTEVfU0VMRUNUSU9OKGZzKS0+b2tfYnV0dG9uKSwKKwkJCQkgImNsaWNrZWQiLCBHX0NBTExCQUNLKGd0a193aWRnZXRfZGVzdHJveSksCisJCQkJIChncG9pbnRlcikgZnMpOworCWdfc2lnbmFsX2Nvbm5lY3Rfc3dhcHBlZChHVEtfT0JKRUNUCisJCQkJIChHVEtfRklMRV9TRUxFQ1RJT04oZnMpLT5jYW5jZWxfYnV0dG9uKSwKKwkJCQkgImNsaWNrZWQiLCBHX0NBTExCQUNLKGd0a193aWRnZXRfZGVzdHJveSksCisJCQkJIChncG9pbnRlcikgZnMpOworCWd0a193aWRnZXRfc2hvdyhmcyk7Cit9CisKKwordm9pZCBvbl9xdWl0MV9hY3RpdmF0ZShHdGtNZW51SXRlbSAqIG1lbnVpdGVtLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJaWYgKCFvbl93aW5kb3cxX2RlbGV0ZV9ldmVudChOVUxMLCBOVUxMLCBOVUxMKSkKKwkJZ3RrX3dpZGdldF9kZXN0cm95KEdUS19XSURHRVQobWFpbl93bmQpKTsKK30KKworCit2b2lkIG9uX3Nob3dfbmFtZTFfYWN0aXZhdGUoR3RrTWVudUl0ZW0gKiBtZW51aXRlbSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCUd0a1RyZWVWaWV3Q29sdW1uICpjb2w7CisKKwlzaG93X25hbWUgPSBHVEtfQ0hFQ0tfTUVOVV9JVEVNKG1lbnVpdGVtKS0+YWN0aXZlOworCWNvbCA9IGd0a190cmVlX3ZpZXdfZ2V0X2NvbHVtbihHVEtfVFJFRV9WSUVXKHRyZWUyX3cpLCBDT0xfTkFNRSk7CisJaWYgKGNvbCkKKwkJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3Zpc2libGUoY29sLCBzaG93X25hbWUpOworfQorCisKK3ZvaWQgb25fc2hvd19yYW5nZTFfYWN0aXZhdGUoR3RrTWVudUl0ZW0gKiBtZW51aXRlbSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCUd0a1RyZWVWaWV3Q29sdW1uICpjb2w7CisKKwlzaG93X3JhbmdlID0gR1RLX0NIRUNLX01FTlVfSVRFTShtZW51aXRlbSktPmFjdGl2ZTsKKwljb2wgPSBndGtfdHJlZV92aWV3X2dldF9jb2x1bW4oR1RLX1RSRUVfVklFVyh0cmVlMl93KSwgQ09MX05PKTsKKwlpZiAoY29sKQorCQlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfdmlzaWJsZShjb2wsIHNob3dfcmFuZ2UpOworCWNvbCA9IGd0a190cmVlX3ZpZXdfZ2V0X2NvbHVtbihHVEtfVFJFRV9WSUVXKHRyZWUyX3cpLCBDT0xfTU9EKTsKKwlpZiAoY29sKQorCQlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfdmlzaWJsZShjb2wsIHNob3dfcmFuZ2UpOworCWNvbCA9IGd0a190cmVlX3ZpZXdfZ2V0X2NvbHVtbihHVEtfVFJFRV9WSUVXKHRyZWUyX3cpLCBDT0xfWUVTKTsKKwlpZiAoY29sKQorCQlndGtfdHJlZV92aWV3X2NvbHVtbl9zZXRfdmlzaWJsZShjb2wsIHNob3dfcmFuZ2UpOworCit9CisKKwordm9pZCBvbl9zaG93X2RhdGExX2FjdGl2YXRlKEd0a01lbnVJdGVtICogbWVudWl0ZW0sIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlHdGtUcmVlVmlld0NvbHVtbiAqY29sOworCisJc2hvd192YWx1ZSA9IEdUS19DSEVDS19NRU5VX0lURU0obWVudWl0ZW0pLT5hY3RpdmU7CisJY29sID0gZ3RrX3RyZWVfdmlld19nZXRfY29sdW1uKEdUS19UUkVFX1ZJRVcodHJlZTJfdyksIENPTF9WQUxVRSk7CisJaWYgKGNvbCkKKwkJZ3RrX3RyZWVfdmlld19jb2x1bW5fc2V0X3Zpc2libGUoY29sLCBzaG93X3ZhbHVlKTsKK30KKworCit2b2lkCitvbl9zaG93X2FsbF9vcHRpb25zMV9hY3RpdmF0ZShHdGtNZW51SXRlbSAqIG1lbnVpdGVtLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJc2hvd19hbGwgPSBHVEtfQ0hFQ0tfTUVOVV9JVEVNKG1lbnVpdGVtKS0+YWN0aXZlOworCisJZ3RrX3RyZWVfc3RvcmVfY2xlYXIodHJlZTIpOworCWRpc3BsYXlfdHJlZSgmcm9vdG1lbnUpOwkvLyBpbnN0ZWFkIG9mIHVwZGF0ZV90cmVlIHRvIHNwZWVkLXVwCit9CisKKwordm9pZAorb25fc2hvd19kZWJ1Z19pbmZvMV9hY3RpdmF0ZShHdGtNZW51SXRlbSAqIG1lbnVpdGVtLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJc2hvd19kZWJ1ZyA9IEdUS19DSEVDS19NRU5VX0lURU0obWVudWl0ZW0pLT5hY3RpdmU7CisJdXBkYXRlX3RyZWUoJnJvb3RtZW51LCBOVUxMKTsKK30KKworCit2b2lkIG9uX2ludHJvZHVjdGlvbjFfYWN0aXZhdGUoR3RrTWVudUl0ZW0gKiBtZW51aXRlbSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCUd0a1dpZGdldCAqZGlhbG9nOworCWNvbnN0IGdjaGFyICppbnRyb190ZXh0ID0KKwkgICAgIldlbGNvbWUgdG8gZ2tjLCB0aGUgR1RLKyBncmFwaGljYWwga2VybmVsIGNvbmZpZ3VyYXRpb24gdG9vbFxuIgorCSAgICAiZm9yIExpbnV4LlxuIgorCSAgICAiRm9yIGVhY2ggb3B0aW9uLCBhIGJsYW5rIGJveCBpbmRpY2F0ZXMgdGhlIGZlYXR1cmUgaXMgZGlzYWJsZWQsIGFcbiIKKwkgICAgImNoZWNrIGluZGljYXRlcyBpdCBpcyBlbmFibGVkLCBhbmQgYSBkb3QgaW5kaWNhdGVzIHRoYXQgaXQgaXMgdG9cbiIKKwkgICAgImJlIGNvbXBpbGVkIGFzIGEgbW9kdWxlLiAgQ2xpY2tpbmcgb24gdGhlIGJveCB3aWxsIGN5Y2xlIHRocm91Z2ggdGhlIHRocmVlIHN0YXRlcy5cbiIKKwkgICAgIlxuIgorCSAgICAiSWYgeW91IGRvIG5vdCBzZWUgYW4gb3B0aW9uIChlLmcuLCBhIGRldmljZSBkcml2ZXIpIHRoYXQgeW91XG4iCisJICAgICJiZWxpZXZlIHNob3VsZCBiZSBwcmVzZW50LCB0cnkgdHVybmluZyBvbiBTaG93IEFsbCBPcHRpb25zXG4iCisJICAgICJ1bmRlciB0aGUgT3B0aW9ucyBtZW51LlxuIgorCSAgICAiQWx0aG91Z2ggdGhlcmUgaXMgbm8gY3Jvc3MgcmVmZXJlbmNlIHlldCB0byBoZWxwIHlvdSBmaWd1cmUgb3V0XG4iCisJICAgICJ3aGF0IG90aGVyIG9wdGlvbnMgbXVzdCBiZSBlbmFibGVkIHRvIHN1cHBvcnQgdGhlIG9wdGlvbiB5b3VcbiIKKwkgICAgImFyZSBpbnRlcmVzdGVkIGluLCB5b3UgY2FuIHN0aWxsIHZpZXcgdGhlIGhlbHAgb2YgYSBncmF5ZWQtb3V0XG4iCisJICAgICJvcHRpb24uXG4iCisJICAgICJcbiIKKwkgICAgIlRvZ2dsaW5nIFNob3cgRGVidWcgSW5mbyB1bmRlciB0aGUgT3B0aW9ucyBtZW51IHdpbGwgc2hvdyBcbiIKKwkgICAgInRoZSBkZXBlbmRlbmNpZXMsIHdoaWNoIHlvdSBjYW4gdGhlbiBtYXRjaCBieSBleGFtaW5pbmcgb3RoZXIgb3B0aW9ucy4iOworCisJZGlhbG9nID0gZ3RrX21lc3NhZ2VfZGlhbG9nX25ldyhHVEtfV0lORE9XKG1haW5fd25kKSwKKwkJCQkJR1RLX0RJQUxPR19ERVNUUk9ZX1dJVEhfUEFSRU5ULAorCQkJCQlHVEtfTUVTU0FHRV9JTkZPLAorCQkJCQlHVEtfQlVUVE9OU19DTE9TRSwgaW50cm9fdGV4dCk7CisJZ19zaWduYWxfY29ubmVjdF9zd2FwcGVkKEdUS19PQkpFQ1QoZGlhbG9nKSwgInJlc3BvbnNlIiwKKwkJCQkgR19DQUxMQkFDSyhndGtfd2lkZ2V0X2Rlc3Ryb3kpLAorCQkJCSBHVEtfT0JKRUNUKGRpYWxvZykpOworCWd0a193aWRnZXRfc2hvd19hbGwoZGlhbG9nKTsKK30KKworCit2b2lkIG9uX2Fib3V0MV9hY3RpdmF0ZShHdGtNZW51SXRlbSAqIG1lbnVpdGVtLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJR3RrV2lkZ2V0ICpkaWFsb2c7CisJY29uc3QgZ2NoYXIgKmFib3V0X3RleHQgPQorCSAgICAiZ2tjIGlzIGNvcHlyaWdodCAoYykgMjAwMiBSb21haW4gTGlldmluIDxyb21zQGxwZy50aWNhbGMub3JnPi5cbiIKKwkgICAgIkJhc2VkIG9uIHRoZSBzb3VyY2UgY29kZSBmcm9tIFJvbWFuIFppcHBlbC5cbiI7CisKKwlkaWFsb2cgPSBndGtfbWVzc2FnZV9kaWFsb2dfbmV3KEdUS19XSU5ET1cobWFpbl93bmQpLAorCQkJCQlHVEtfRElBTE9HX0RFU1RST1lfV0lUSF9QQVJFTlQsCisJCQkJCUdUS19NRVNTQUdFX0lORk8sCisJCQkJCUdUS19CVVRUT05TX0NMT1NFLCBhYm91dF90ZXh0KTsKKwlnX3NpZ25hbF9jb25uZWN0X3N3YXBwZWQoR1RLX09CSkVDVChkaWFsb2cpLCAicmVzcG9uc2UiLAorCQkJCSBHX0NBTExCQUNLKGd0a193aWRnZXRfZGVzdHJveSksCisJCQkJIEdUS19PQkpFQ1QoZGlhbG9nKSk7CisJZ3RrX3dpZGdldF9zaG93X2FsbChkaWFsb2cpOworfQorCisKK3ZvaWQgb25fbGljZW5zZTFfYWN0aXZhdGUoR3RrTWVudUl0ZW0gKiBtZW51aXRlbSwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCUd0a1dpZGdldCAqZGlhbG9nOworCWNvbnN0IGdjaGFyICpsaWNlbnNlX3RleHQgPQorCSAgICAiZ2tjIGlzIHJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi5cbiIKKwkgICAgIkZvciBtb3JlIGluZm9ybWF0aW9uLCBwbGVhc2Ugc2VlIHRoZSBzb3VyY2UgY29kZSBvclxuIgorCSAgICAidmlzaXQgaHR0cDovL3d3dy5mc2Yub3JnL2xpY2Vuc2VzL2xpY2Vuc2VzLmh0bWxcbiI7CisKKwlkaWFsb2cgPSBndGtfbWVzc2FnZV9kaWFsb2dfbmV3KEdUS19XSU5ET1cobWFpbl93bmQpLAorCQkJCQlHVEtfRElBTE9HX0RFU1RST1lfV0lUSF9QQVJFTlQsCisJCQkJCUdUS19NRVNTQUdFX0lORk8sCisJCQkJCUdUS19CVVRUT05TX0NMT1NFLCBsaWNlbnNlX3RleHQpOworCWdfc2lnbmFsX2Nvbm5lY3Rfc3dhcHBlZChHVEtfT0JKRUNUKGRpYWxvZyksICJyZXNwb25zZSIsCisJCQkJIEdfQ0FMTEJBQ0soZ3RrX3dpZGdldF9kZXN0cm95KSwKKwkJCQkgR1RLX09CSkVDVChkaWFsb2cpKTsKKwlndGtfd2lkZ2V0X3Nob3dfYWxsKGRpYWxvZyk7Cit9CisKKwordm9pZCBvbl9iYWNrX3ByZXNzZWQoR3RrQnV0dG9uICogYnV0dG9uLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJZW51bSBwcm9wX3R5cGUgcHR5cGU7CisKKwljdXJyZW50ID0gY3VycmVudC0+cGFyZW50OworCXB0eXBlID0gY3VycmVudC0+cHJvbXB0ID8gY3VycmVudC0+cHJvbXB0LT50eXBlIDogUF9VTktOT1dOOworCWlmIChwdHlwZSAhPSBQX01FTlUpCisJCWN1cnJlbnQgPSBjdXJyZW50LT5wYXJlbnQ7CisJZGlzcGxheV90cmVlX3BhcnQoKTsKKworCWlmIChjdXJyZW50ID09ICZyb290bWVudSkKKwkJZ3RrX3dpZGdldF9zZXRfc2Vuc2l0aXZlKGJhY2tfYnRuLCBGQUxTRSk7Cit9CisKKwordm9pZCBvbl9sb2FkX3ByZXNzZWQoR3RrQnV0dG9uICogYnV0dG9uLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJb25fbG9hZDFfYWN0aXZhdGUoTlVMTCwgdXNlcl9kYXRhKTsKK30KKworCit2b2lkIG9uX3NhdmVfcHJlc3NlZChHdGtCdXR0b24gKiBidXR0b24sIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlvbl9zYXZlMV9hY3RpdmF0ZShOVUxMLCB1c2VyX2RhdGEpOworfQorCisKK3ZvaWQgb25fc2luZ2xlX2NsaWNrZWQoR3RrQnV0dG9uICogYnV0dG9uLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJdmlld19tb2RlID0gU0lOR0xFX1ZJRVc7CisJZ3RrX3BhbmVkX3NldF9wb3NpdGlvbihHVEtfUEFORUQoaHBhbmVkKSwgMCk7CisJZ3RrX3dpZGdldF9oaWRlKHRyZWUxX3cpOworCWN1cnJlbnQgPSAmcm9vdG1lbnU7CisJZGlzcGxheV90cmVlX3BhcnQoKTsKK30KKworCit2b2lkIG9uX3NwbGl0X2NsaWNrZWQoR3RrQnV0dG9uICogYnV0dG9uLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJZ2ludCB3LCBoOworCXZpZXdfbW9kZSA9IFNQTElUX1ZJRVc7CisJZ3RrX3dpZGdldF9zaG93KHRyZWUxX3cpOworCWd0a193aW5kb3dfZ2V0X2RlZmF1bHRfc2l6ZShHVEtfV0lORE9XKG1haW5fd25kKSwgJncsICZoKTsKKwlndGtfcGFuZWRfc2V0X3Bvc2l0aW9uKEdUS19QQU5FRChocGFuZWQpLCB3IC8gMik7CisJaWYgKHRyZWUyKQkKKwkJZ3RrX3RyZWVfc3RvcmVfY2xlYXIodHJlZTIpOworCWRpc3BsYXlfbGlzdCgpOworfQorCisKK3ZvaWQgb25fZnVsbF9jbGlja2VkKEd0a0J1dHRvbiAqIGJ1dHRvbiwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCXZpZXdfbW9kZSA9IEZVTExfVklFVzsKKwlndGtfcGFuZWRfc2V0X3Bvc2l0aW9uKEdUS19QQU5FRChocGFuZWQpLCAwKTsKKwlndGtfd2lkZ2V0X2hpZGUodHJlZTFfdyk7CisJaWYgKHRyZWUyKQorCQlndGtfdHJlZV9zdG9yZV9jbGVhcih0cmVlMik7CisJZGlzcGxheV90cmVlKCZyb290bWVudSk7CisJZ3RrX3dpZGdldF9zZXRfc2Vuc2l0aXZlKGJhY2tfYnRuLCBGQUxTRSk7Cit9CisKKwordm9pZCBvbl9jb2xsYXBzZV9wcmVzc2VkKEd0a0J1dHRvbiAqIGJ1dHRvbiwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCWd0a190cmVlX3ZpZXdfY29sbGFwc2VfYWxsKEdUS19UUkVFX1ZJRVcodHJlZTJfdykpOworfQorCisKK3ZvaWQgb25fZXhwYW5kX3ByZXNzZWQoR3RrQnV0dG9uICogYnV0dG9uLCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJZ3RrX3RyZWVfdmlld19leHBhbmRfYWxsKEdUS19UUkVFX1ZJRVcodHJlZTJfdykpOworfQorCisKKy8qIENUcmVlIENhbGxiYWNrcyAqLworCisvKiBDaGFuZ2UgaGV4L2ludC9zdHJpbmcgdmFsdWUgaW4gdGhlIGNlbGwgKi8KK3N0YXRpYyB2b2lkIHJlbmRlcmVyX2VkaXRlZChHdGtDZWxsUmVuZGVyZXJUZXh0ICogY2VsbCwKKwkJCSAgICBjb25zdCBnY2hhciAqIHBhdGhfc3RyaW5nLAorCQkJICAgIGNvbnN0IGdjaGFyICogbmV3X3RleHQsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlHdGtUcmVlUGF0aCAqcGF0aCA9IGd0a190cmVlX3BhdGhfbmV3X2Zyb21fc3RyaW5nKHBhdGhfc3RyaW5nKTsKKwlHdGtUcmVlSXRlciBpdGVyOworCWNvbnN0IGNoYXIgKm9sZF9kZWYsICpuZXdfZGVmOworCXN0cnVjdCBtZW51ICptZW51OworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKworCWlmICghZ3RrX3RyZWVfbW9kZWxfZ2V0X2l0ZXIobW9kZWwyLCAmaXRlciwgcGF0aCkpCisJCXJldHVybjsKKworCWd0a190cmVlX21vZGVsX2dldChtb2RlbDIsICZpdGVyLCBDT0xfTUVOVSwgJm1lbnUsIC0xKTsKKwlzeW0gPSBtZW51LT5zeW07CisKKwlndGtfdHJlZV9tb2RlbF9nZXQobW9kZWwyLCAmaXRlciwgQ09MX1ZBTFVFLCAmb2xkX2RlZiwgLTEpOworCW5ld19kZWYgPSBuZXdfdGV4dDsKKworCXN5bV9zZXRfc3RyaW5nX3ZhbHVlKHN5bSwgbmV3X2RlZik7CisKKwljb25maWdfY2hhbmdlZCA9IFRSVUU7CisJdXBkYXRlX3RyZWUoJnJvb3RtZW51LCBOVUxMKTsKKworCWd0a190cmVlX3BhdGhfZnJlZShwYXRoKTsKK30KKworLyogQ2hhbmdlIHRoZSB2YWx1ZSBvZiBhIHN5bWJvbCBhbmQgdXBkYXRlIHRoZSB0cmVlICovCitzdGF0aWMgdm9pZCBjaGFuZ2Vfc3ltX3ZhbHVlKHN0cnVjdCBtZW51ICptZW51LCBnaW50IGNvbCkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBtZW51LT5zeW07CisJdHJpc3RhdGUgb2xkdmFsLCBuZXd2YWw7CisKKwlpZiAoIXN5bSkKKwkJcmV0dXJuOworCisJaWYgKGNvbCA9PSBDT0xfTk8pCisJCW5ld3ZhbCA9IG5vOworCWVsc2UgaWYgKGNvbCA9PSBDT0xfTU9EKQorCQluZXd2YWwgPSBtb2Q7CisJZWxzZSBpZiAoY29sID09IENPTF9ZRVMpCisJCW5ld3ZhbCA9IHllczsKKwllbHNlCisJCXJldHVybjsKKworCXN3aXRjaCAoc3ltX2dldF90eXBlKHN5bSkpIHsKKwljYXNlIFNfQk9PTEVBTjoKKwljYXNlIFNfVFJJU1RBVEU6CisJCW9sZHZhbCA9IHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKTsKKwkJaWYgKCFzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgbmV3dmFsKSkKKwkJCW5ld3ZhbCA9IHllczsKKwkJc3ltX3NldF90cmlzdGF0ZV92YWx1ZShzeW0sIG5ld3ZhbCk7CisJCWNvbmZpZ19jaGFuZ2VkID0gVFJVRTsKKwkJaWYgKHZpZXdfbW9kZSA9PSBGVUxMX1ZJRVcpCisJCQl1cGRhdGVfdHJlZSgmcm9vdG1lbnUsIE5VTEwpOworCQllbHNlIGlmICh2aWV3X21vZGUgPT0gU1BMSVRfVklFVykgeworCQkJdXBkYXRlX3RyZWUoYnJvd3NlZCwgTlVMTCk7CisJCQlkaXNwbGF5X2xpc3QoKTsKKwkJfQorCQllbHNlIGlmICh2aWV3X21vZGUgPT0gU0lOR0xFX1ZJRVcpCisJCQlkaXNwbGF5X3RyZWVfcGFydCgpOwkvL2ZpeG1lOiBrZWVwIGV4cC9jb2xsCisJCWJyZWFrOworCWNhc2UgU19JTlQ6CisJY2FzZSBTX0hFWDoKKwljYXNlIFNfU1RSSU5HOgorCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgdG9nZ2xlX3N5bV92YWx1ZShzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlpZiAoIW1lbnUtPnN5bSkKKwkJcmV0dXJuOworCisJc3ltX3RvZ2dsZV90cmlzdGF0ZV92YWx1ZShtZW51LT5zeW0pOworCWlmICh2aWV3X21vZGUgPT0gRlVMTF9WSUVXKQorCQl1cGRhdGVfdHJlZSgmcm9vdG1lbnUsIE5VTEwpOworCWVsc2UgaWYgKHZpZXdfbW9kZSA9PSBTUExJVF9WSUVXKSB7CisJCXVwZGF0ZV90cmVlKGJyb3dzZWQsIE5VTEwpOworCQlkaXNwbGF5X2xpc3QoKTsKKwl9CisJZWxzZSBpZiAodmlld19tb2RlID09IFNJTkdMRV9WSUVXKQorCQlkaXNwbGF5X3RyZWVfcGFydCgpOwkvL2ZpeG1lOiBrZWVwIGV4cC9jb2xsCit9CisKK3N0YXRpYyB2b2lkIHJlbmRlcmVyX3RvZ2dsZWQoR3RrQ2VsbFJlbmRlcmVyVG9nZ2xlICogY2VsbCwKKwkJCSAgICAgZ2NoYXIgKiBwYXRoX3N0cmluZywgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCUd0a1RyZWVQYXRoICpwYXRoLCAqc2VsX3BhdGggPSBOVUxMOworCUd0a1RyZWVJdGVyIGl0ZXIsIHNlbF9pdGVyOworCUd0a1RyZWVTZWxlY3Rpb24gKnNlbDsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKworCXBhdGggPSBndGtfdHJlZV9wYXRoX25ld19mcm9tX3N0cmluZyhwYXRoX3N0cmluZyk7CisJaWYgKCFndGtfdHJlZV9tb2RlbF9nZXRfaXRlcihtb2RlbDIsICZpdGVyLCBwYXRoKSkKKwkJcmV0dXJuOworCisJc2VsID0gZ3RrX3RyZWVfdmlld19nZXRfc2VsZWN0aW9uKEdUS19UUkVFX1ZJRVcodHJlZTJfdykpOworCWlmIChndGtfdHJlZV9zZWxlY3Rpb25fZ2V0X3NlbGVjdGVkKHNlbCwgTlVMTCwgJnNlbF9pdGVyKSkKKwkJc2VsX3BhdGggPSBndGtfdHJlZV9tb2RlbF9nZXRfcGF0aChtb2RlbDIsICZzZWxfaXRlcik7CisJaWYgKCFzZWxfcGF0aCkKKwkJZ290byBvdXQxOworCWlmIChndGtfdHJlZV9wYXRoX2NvbXBhcmUocGF0aCwgc2VsX3BhdGgpKQorCQlnb3RvIG91dDI7CisKKwlndGtfdHJlZV9tb2RlbF9nZXQobW9kZWwyLCAmaXRlciwgQ09MX01FTlUsICZtZW51LCAtMSk7CisJdG9nZ2xlX3N5bV92YWx1ZShtZW51KTsKKworICAgICAgb3V0MjoKKwlndGtfdHJlZV9wYXRoX2ZyZWUoc2VsX3BhdGgpOworICAgICAgb3V0MToKKwlndGtfdHJlZV9wYXRoX2ZyZWUocGF0aCk7Cit9CisKK3N0YXRpYyBnaW50IGNvbHVtbjJpbmRleChHdGtUcmVlVmlld0NvbHVtbiAqIGNvbHVtbikKK3sKKwlnaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQ09MX05VTUJFUjsgaSsrKSB7CisJCUd0a1RyZWVWaWV3Q29sdW1uICpjb2w7CisKKwkJY29sID0gZ3RrX3RyZWVfdmlld19nZXRfY29sdW1uKEdUS19UUkVFX1ZJRVcodHJlZTJfdyksIGkpOworCQlpZiAoY29sID09IGNvbHVtbikKKwkJCXJldHVybiBpOworCX0KKworCXJldHVybiAtMTsKK30KKworCisvKiBVc2VyIGNsaWNrOiB1cGRhdGUgY2hvaWNlIChmdWxsKSBvciBnb2VzIGRvd24gKHNpbmdsZSkgKi8KK2dib29sZWFuCitvbl90cmVldmlldzJfYnV0dG9uX3ByZXNzX2V2ZW50KEd0a1dpZGdldCAqIHdpZGdldCwKKwkJCQlHZGtFdmVudEJ1dHRvbiAqIGV2ZW50LCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJR3RrVHJlZVZpZXcgKnZpZXcgPSBHVEtfVFJFRV9WSUVXKHdpZGdldCk7CisJR3RrVHJlZVBhdGggKnBhdGg7CisJR3RrVHJlZVZpZXdDb2x1bW4gKmNvbHVtbjsKKwlHdGtUcmVlSXRlciBpdGVyOworCXN0cnVjdCBtZW51ICptZW51OworCWdpbnQgY29sOworCisjaWYgR1RLX0NIRUNLX1ZFUlNJT04oMiwxLDQpIC8vIGJ1ZyBpbiBjdHJlZSB3aXRoIGVhcmxpZXIgdmVyc2lvbiBvZiBHVEsKKwlnaW50IHR4ID0gKGdpbnQpIGV2ZW50LT54OworCWdpbnQgdHkgPSAoZ2ludCkgZXZlbnQtPnk7CisJZ2ludCBjeCwgY3k7CisKKwlndGtfdHJlZV92aWV3X2dldF9wYXRoX2F0X3Bvcyh2aWV3LCB0eCwgdHksICZwYXRoLCAmY29sdW1uLCAmY3gsCisJCQkJICAgICAgJmN5KTsKKyNlbHNlCisJZ3RrX3RyZWVfdmlld19nZXRfY3Vyc29yKHZpZXcsICZwYXRoLCAmY29sdW1uKTsKKyNlbmRpZgorCWlmIChwYXRoID09IE5VTEwpCisJCXJldHVybiBGQUxTRTsKKworCWlmICghZ3RrX3RyZWVfbW9kZWxfZ2V0X2l0ZXIobW9kZWwyLCAmaXRlciwgcGF0aCkpCisJCXJldHVybiBGQUxTRTsKKwlndGtfdHJlZV9tb2RlbF9nZXQobW9kZWwyLCAmaXRlciwgQ09MX01FTlUsICZtZW51LCAtMSk7CisKKwljb2wgPSBjb2x1bW4yaW5kZXgoY29sdW1uKTsKKwlpZiAoZXZlbnQtPnR5cGUgPT0gR0RLXzJCVVRUT05fUFJFU1MpIHsKKwkJZW51bSBwcm9wX3R5cGUgcHR5cGU7CisJCXB0eXBlID0gbWVudS0+cHJvbXB0ID8gbWVudS0+cHJvbXB0LT50eXBlIDogUF9VTktOT1dOOworCisJCWlmIChwdHlwZSA9PSBQX01FTlUgJiYgdmlld19tb2RlICE9IEZVTExfVklFVyAmJiBjb2wgPT0gQ09MX09QVElPTikgeworCQkJLy8gZ29lcyBkb3duIGludG8gbWVudQorCQkJY3VycmVudCA9IG1lbnU7CisJCQlkaXNwbGF5X3RyZWVfcGFydCgpOworCQkJZ3RrX3dpZGdldF9zZXRfc2Vuc2l0aXZlKGJhY2tfYnRuLCBUUlVFKTsKKwkJfSBlbHNlIGlmICgoY29sID09IENPTF9PUFRJT04pKSB7CisJCQl0b2dnbGVfc3ltX3ZhbHVlKG1lbnUpOworCQkJZ3RrX3RyZWVfdmlld19leHBhbmRfcm93KHZpZXcsIHBhdGgsIFRSVUUpOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKGNvbCA9PSBDT0xfVkFMVUUpIHsKKwkJCXRvZ2dsZV9zeW1fdmFsdWUobWVudSk7CisJCQlndGtfdHJlZV92aWV3X2V4cGFuZF9yb3codmlldywgcGF0aCwgVFJVRSk7CisJCX0gZWxzZSBpZiAoY29sID09IENPTF9OTyB8fCBjb2wgPT0gQ09MX01PRAorCQkJICAgfHwgY29sID09IENPTF9ZRVMpIHsKKwkJCWNoYW5nZV9zeW1fdmFsdWUobWVudSwgY29sKTsKKwkJCWd0a190cmVlX3ZpZXdfZXhwYW5kX3Jvdyh2aWV3LCBwYXRoLCBUUlVFKTsKKwkJfQorCX0KKworCXJldHVybiBGQUxTRTsKK30KKworLyogS2V5IHByZXNzZWQ6IHVwZGF0ZSBjaG9pY2UgKi8KK2dib29sZWFuCitvbl90cmVldmlldzJfa2V5X3ByZXNzX2V2ZW50KEd0a1dpZGdldCAqIHdpZGdldCwKKwkJCSAgICAgR2RrRXZlbnRLZXkgKiBldmVudCwgZ3BvaW50ZXIgdXNlcl9kYXRhKQoreworCUd0a1RyZWVWaWV3ICp2aWV3ID0gR1RLX1RSRUVfVklFVyh3aWRnZXQpOworCUd0a1RyZWVQYXRoICpwYXRoOworCUd0a1RyZWVWaWV3Q29sdW1uICpjb2x1bW47CisJR3RrVHJlZUl0ZXIgaXRlcjsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKwlnaW50IGNvbDsKKworCWd0a190cmVlX3ZpZXdfZ2V0X2N1cnNvcih2aWV3LCAmcGF0aCwgJmNvbHVtbik7CisJaWYgKHBhdGggPT0gTlVMTCkKKwkJcmV0dXJuIEZBTFNFOworCisJaWYgKGV2ZW50LT5rZXl2YWwgPT0gR0RLX3NwYWNlKSB7CisJCWlmIChndGtfdHJlZV92aWV3X3Jvd19leHBhbmRlZCh2aWV3LCBwYXRoKSkKKwkJCWd0a190cmVlX3ZpZXdfY29sbGFwc2Vfcm93KHZpZXcsIHBhdGgpOworCQllbHNlCisJCQlndGtfdHJlZV92aWV3X2V4cGFuZF9yb3codmlldywgcGF0aCwgRkFMU0UpOworCQlyZXR1cm4gVFJVRTsKKwl9CisJaWYgKGV2ZW50LT5rZXl2YWwgPT0gR0RLX0tQX0VudGVyKSB7CisJfQorCWlmICh3aWRnZXQgPT0gdHJlZTFfdykKKwkJcmV0dXJuIEZBTFNFOworCisJZ3RrX3RyZWVfbW9kZWxfZ2V0X2l0ZXIobW9kZWwyLCAmaXRlciwgcGF0aCk7CisJZ3RrX3RyZWVfbW9kZWxfZ2V0KG1vZGVsMiwgJml0ZXIsIENPTF9NRU5VLCAmbWVudSwgLTEpOworCisJaWYgKCFzdHJjYXNlY21wKGV2ZW50LT5zdHJpbmcsICJuIikpCisJCWNvbCA9IENPTF9OTzsKKwllbHNlIGlmICghc3RyY2FzZWNtcChldmVudC0+c3RyaW5nLCAibSIpKQorCQljb2wgPSBDT0xfTU9EOworCWVsc2UgaWYgKCFzdHJjYXNlY21wKGV2ZW50LT5zdHJpbmcsICJ5IikpCisJCWNvbCA9IENPTF9ZRVM7CisJZWxzZQorCQljb2wgPSAtMTsKKwljaGFuZ2Vfc3ltX3ZhbHVlKG1lbnUsIGNvbCk7CisKKwlyZXR1cm4gRkFMU0U7Cit9CisKKworLyogUm93IHNlbGVjdGlvbiBjaGFuZ2VkOiB1cGRhdGUgaGVscCAqLwordm9pZAorb25fdHJlZXZpZXcyX2N1cnNvcl9jaGFuZ2VkKEd0a1RyZWVWaWV3ICogdHJlZXZpZXcsIGdwb2ludGVyIHVzZXJfZGF0YSkKK3sKKwlHdGtUcmVlU2VsZWN0aW9uICpzZWxlY3Rpb247CisJR3RrVHJlZUl0ZXIgaXRlcjsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKworCXNlbGVjdGlvbiA9IGd0a190cmVlX3ZpZXdfZ2V0X3NlbGVjdGlvbih0cmVldmlldyk7CisJaWYgKGd0a190cmVlX3NlbGVjdGlvbl9nZXRfc2VsZWN0ZWQoc2VsZWN0aW9uLCAmbW9kZWwyLCAmaXRlcikpIHsKKwkJZ3RrX3RyZWVfbW9kZWxfZ2V0KG1vZGVsMiwgJml0ZXIsIENPTF9NRU5VLCAmbWVudSwgLTEpOworCQl0ZXh0X2luc2VydF9oZWxwKG1lbnUpOworCX0KK30KKworCisvKiBVc2VyIGNsaWNrOiBkaXNwbGF5IHN1Yi10cmVlIGluIHRoZSByaWdodCBmcmFtZS4gKi8KK2dib29sZWFuCitvbl90cmVldmlldzFfYnV0dG9uX3ByZXNzX2V2ZW50KEd0a1dpZGdldCAqIHdpZGdldCwKKwkJCQlHZGtFdmVudEJ1dHRvbiAqIGV2ZW50LCBncG9pbnRlciB1c2VyX2RhdGEpCit7CisJR3RrVHJlZVZpZXcgKnZpZXcgPSBHVEtfVFJFRV9WSUVXKHdpZGdldCk7CisJR3RrVHJlZVBhdGggKnBhdGg7CisJR3RrVHJlZVZpZXdDb2x1bW4gKmNvbHVtbjsKKwlHdGtUcmVlSXRlciBpdGVyOworCXN0cnVjdCBtZW51ICptZW51OworCisJZ2ludCB0eCA9IChnaW50KSBldmVudC0+eDsKKwlnaW50IHR5ID0gKGdpbnQpIGV2ZW50LT55OworCWdpbnQgY3gsIGN5OworCisJZ3RrX3RyZWVfdmlld19nZXRfcGF0aF9hdF9wb3ModmlldywgdHgsIHR5LCAmcGF0aCwgJmNvbHVtbiwgJmN4LAorCQkJCSAgICAgICZjeSk7CisJaWYgKHBhdGggPT0gTlVMTCkKKwkJcmV0dXJuIEZBTFNFOworCisJZ3RrX3RyZWVfbW9kZWxfZ2V0X2l0ZXIobW9kZWwxLCAmaXRlciwgcGF0aCk7CisJZ3RrX3RyZWVfbW9kZWxfZ2V0KG1vZGVsMSwgJml0ZXIsIENPTF9NRU5VLCAmbWVudSwgLTEpOworCisJaWYgKGV2ZW50LT50eXBlID09IEdES18yQlVUVE9OX1BSRVNTKSB7CisJCXRvZ2dsZV9zeW1fdmFsdWUobWVudSk7CisJCWN1cnJlbnQgPSBtZW51OworCQlkaXNwbGF5X3RyZWVfcGFydCgpOworCX0gZWxzZSB7CisJCWJyb3dzZWQgPSBtZW51OworCQlkaXNwbGF5X3RyZWVfcGFydCgpOworCX0KKworCWd0a193aWRnZXRfcmVhbGl6ZSh0cmVlMl93KTsKKwlndGtfdHJlZV92aWV3X3NldF9jdXJzb3IodmlldywgcGF0aCwgTlVMTCwgRkFMU0UpOworCWd0a193aWRnZXRfZ3JhYl9mb2N1cyh0cmVlMl93KTsKKworCXJldHVybiBGQUxTRTsKK30KKworCisvKiBGaWxsIGEgcm93IG9mIHN0cmluZ3MgKi8KK3N0YXRpYyBnY2hhciAqKmZpbGxfcm93KHN0cnVjdCBtZW51ICptZW51KQoreworCXN0YXRpYyBnY2hhciAqcm93W0NPTF9OVU1CRVJdOworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IG1lbnUtPnN5bTsKKwljb25zdCBjaGFyICpkZWY7CisJaW50IHN0eXBlOworCXRyaXN0YXRlIHZhbDsKKwllbnVtIHByb3BfdHlwZSBwdHlwZTsKKwlpbnQgaTsKKworCWZvciAoaSA9IENPTF9PUFRJT047IGkgPD0gQ09MX0NPTE9SOyBpKyspCisJCWdfZnJlZShyb3dbaV0pOworCWJ6ZXJvKHJvdywgc2l6ZW9mKHJvdykpOworCisJcm93W0NPTF9PUFRJT05dID0KKwkgICAgZ19zdHJkdXBfcHJpbnRmKCIlcyAlcyIsIG1lbnVfZ2V0X3Byb21wdChtZW51KSwKKwkJCSAgICBzeW0gPyAoc3ltLT4KKwkJCQkgICBmbGFncyAmIFNZTUJPTF9ORVcgPyAiKE5FVykiIDogIiIpIDoKKwkJCSAgICAiIik7CisKKwlpZiAoc2hvd19hbGwgJiYgIW1lbnVfaXNfdmlzaWJsZShtZW51KSkKKwkJcm93W0NPTF9DT0xPUl0gPSBnX3N0cmR1cCgiRGFya0dyYXkiKTsKKwllbHNlCisJCXJvd1tDT0xfQ09MT1JdID0gZ19zdHJkdXAoIkJsYWNrIik7CisKKwlwdHlwZSA9IG1lbnUtPnByb21wdCA/IG1lbnUtPnByb21wdC0+dHlwZSA6IFBfVU5LTk9XTjsKKwlzd2l0Y2ggKHB0eXBlKSB7CisJY2FzZSBQX01FTlU6CisJCXJvd1tDT0xfUElYQlVGXSA9IChnY2hhciAqKSB4cG1fbWVudTsKKwkJaWYgKHZpZXdfbW9kZSA9PSBTSU5HTEVfVklFVykKKwkJCXJvd1tDT0xfUElYVklTXSA9IEdJTlRfVE9fUE9JTlRFUihUUlVFKTsKKwkJcm93W0NPTF9CVE5WSVNdID0gR0lOVF9UT19QT0lOVEVSKEZBTFNFKTsKKwkJYnJlYWs7CisJY2FzZSBQX0NPTU1FTlQ6CisJCXJvd1tDT0xfUElYQlVGXSA9IChnY2hhciAqKSB4cG1fdm9pZDsKKwkJcm93W0NPTF9QSVhWSVNdID0gR0lOVF9UT19QT0lOVEVSKEZBTFNFKTsKKwkJcm93W0NPTF9CVE5WSVNdID0gR0lOVF9UT19QT0lOVEVSKEZBTFNFKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcm93W0NPTF9QSVhCVUZdID0gKGdjaGFyICopIHhwbV92b2lkOworCQlyb3dbQ09MX1BJWFZJU10gPSBHSU5UX1RPX1BPSU5URVIoRkFMU0UpOworCQlyb3dbQ09MX0JUTlZJU10gPSBHSU5UX1RPX1BPSU5URVIoVFJVRSk7CisJCWJyZWFrOworCX0KKworCWlmICghc3ltKQorCQlyZXR1cm4gcm93OworCXJvd1tDT0xfTkFNRV0gPSBnX3N0cmR1cChzeW0tPm5hbWUpOworCisJc3ltX2NhbGNfdmFsdWUoc3ltKTsKKwlzeW0tPmZsYWdzICY9IH5TWU1CT0xfQ0hBTkdFRDsKKworCWlmIChzeW1faXNfY2hvaWNlKHN5bSkpIHsJLy8gcGFyc2UgY2hpbGRzIGZvciBnZXR0aW5nIGZpbmFsIHZhbHVlCisJCXN0cnVjdCBtZW51ICpjaGlsZDsKKwkJc3RydWN0IHN5bWJvbCAqZGVmX3N5bSA9IHN5bV9nZXRfY2hvaWNlX3ZhbHVlKHN5bSk7CisJCXN0cnVjdCBtZW51ICpkZWZfbWVudSA9IE5VTEw7CisKKwkJcm93W0NPTF9CVE5WSVNdID0gR0lOVF9UT19QT0lOVEVSKEZBTFNFKTsKKworCQlmb3IgKGNoaWxkID0gbWVudS0+bGlzdDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKwkJCWlmIChtZW51X2lzX3Zpc2libGUoY2hpbGQpCisJCQkgICAgJiYgY2hpbGQtPnN5bSA9PSBkZWZfc3ltKQorCQkJCWRlZl9tZW51ID0gY2hpbGQ7CisJCX0KKworCQlpZiAoZGVmX21lbnUpCisJCQlyb3dbQ09MX1ZBTFVFXSA9CisJCQkgICAgZ19zdHJkdXAobWVudV9nZXRfcHJvbXB0KGRlZl9tZW51KSk7CisJfQorCWlmKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfQ0hPSUNFVkFMKQorCQlyb3dbQ09MX0JUTlJBRF0gPSBHSU5UX1RPX1BPSU5URVIoVFJVRSk7CisKKwlzdHlwZSA9IHN5bV9nZXRfdHlwZShzeW0pOworCXN3aXRjaCAoc3R5cGUpIHsKKwljYXNlIFNfQk9PTEVBTjoKKwkJaWYoR1BPSU5URVJfVE9fSU5UKHJvd1tDT0xfUElYVklTXSkgPT0gRkFMU0UpCisJCQlyb3dbQ09MX0JUTlZJU10gPSBHSU5UX1RPX1BPSU5URVIoVFJVRSk7CisJCWlmIChzeW1faXNfY2hvaWNlKHN5bSkpCisJCQlicmVhazsKKwljYXNlIFNfVFJJU1RBVEU6CisJCXZhbCA9IHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKTsKKwkJc3dpdGNoICh2YWwpIHsKKwkJY2FzZSBubzoKKwkJCXJvd1tDT0xfTk9dID0gZ19zdHJkdXAoIk4iKTsKKwkJCXJvd1tDT0xfVkFMVUVdID0gZ19zdHJkdXAoIk4iKTsKKwkJCXJvd1tDT0xfQlROQUNUXSA9IEdJTlRfVE9fUE9JTlRFUihGQUxTRSk7CisJCQlyb3dbQ09MX0JUTklOQ10gPSBHSU5UX1RPX1BPSU5URVIoRkFMU0UpOworCQkJYnJlYWs7CisJCWNhc2UgbW9kOgorCQkJcm93W0NPTF9NT0RdID0gZ19zdHJkdXAoIk0iKTsKKwkJCXJvd1tDT0xfVkFMVUVdID0gZ19zdHJkdXAoIk0iKTsKKwkJCXJvd1tDT0xfQlROSU5DXSA9IEdJTlRfVE9fUE9JTlRFUihUUlVFKTsKKwkJCWJyZWFrOworCQljYXNlIHllczoKKwkJCXJvd1tDT0xfWUVTXSA9IGdfc3RyZHVwKCJZIik7CisJCQlyb3dbQ09MX1ZBTFVFXSA9IGdfc3RyZHVwKCJZIik7CisJCQlyb3dbQ09MX0JUTkFDVF0gPSBHSU5UX1RPX1BPSU5URVIoVFJVRSk7CisJCQlyb3dbQ09MX0JUTklOQ10gPSBHSU5UX1RPX1BPSU5URVIoRkFMU0UpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAodmFsICE9IG5vICYmIHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCBubykpCisJCQlyb3dbQ09MX05PXSA9IGdfc3RyZHVwKCJfIik7CisJCWlmICh2YWwgIT0gbW9kICYmIHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCBtb2QpKQorCQkJcm93W0NPTF9NT0RdID0gZ19zdHJkdXAoIl8iKTsKKwkJaWYgKHZhbCAhPSB5ZXMgJiYgc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIHllcykpCisJCQlyb3dbQ09MX1lFU10gPSBnX3N0cmR1cCgiXyIpOworCQlicmVhazsKKwljYXNlIFNfSU5UOgorCWNhc2UgU19IRVg6CisJY2FzZSBTX1NUUklORzoKKwkJZGVmID0gc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKTsKKwkJcm93W0NPTF9WQUxVRV0gPSBnX3N0cmR1cChkZWYpOworCQlyb3dbQ09MX0VESVRdID0gR0lOVF9UT19QT0lOVEVSKFRSVUUpOworCQlyb3dbQ09MX0JUTlZJU10gPSBHSU5UX1RPX1BPSU5URVIoRkFMU0UpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcm93OworfQorCisKKy8qIFNldCB0aGUgbm9kZSBjb250ZW50IHdpdGggYSByb3cgb2Ygc3RyaW5ncyAqLworc3RhdGljIHZvaWQgc2V0X25vZGUoR3RrVHJlZUl0ZXIgKiBub2RlLCBzdHJ1Y3QgbWVudSAqbWVudSwgZ2NoYXIgKiogcm93KQoreworCUdka0NvbG9yIGNvbG9yOworCWdib29sZWFuIHN1Y2Nlc3M7CisJR2RrUGl4YnVmICpwaXg7CisKKwlwaXggPSBnZGtfcGl4YnVmX25ld19mcm9tX3hwbV9kYXRhKChjb25zdCBjaGFyICoqKQorCQkJCQkgICByb3dbQ09MX1BJWEJVRl0pOworCisJZ2RrX2NvbG9yX3BhcnNlKHJvd1tDT0xfQ09MT1JdLCAmY29sb3IpOworCWdka19jb2xvcm1hcF9hbGxvY19jb2xvcnMoZ2RrX2NvbG9ybWFwX2dldF9zeXN0ZW0oKSwgJmNvbG9yLCAxLAorCQkJCSAgRkFMU0UsIEZBTFNFLCAmc3VjY2Vzcyk7CisKKwlndGtfdHJlZV9zdG9yZV9zZXQodHJlZSwgbm9kZSwKKwkJCSAgIENPTF9PUFRJT04sIHJvd1tDT0xfT1BUSU9OXSwKKwkJCSAgIENPTF9OQU1FLCByb3dbQ09MX05BTUVdLAorCQkJICAgQ09MX05PLCByb3dbQ09MX05PXSwKKwkJCSAgIENPTF9NT0QsIHJvd1tDT0xfTU9EXSwKKwkJCSAgIENPTF9ZRVMsIHJvd1tDT0xfWUVTXSwKKwkJCSAgIENPTF9WQUxVRSwgcm93W0NPTF9WQUxVRV0sCisJCQkgICBDT0xfTUVOVSwgKGdwb2ludGVyKSBtZW51LAorCQkJICAgQ09MX0NPTE9SLCAmY29sb3IsCisJCQkgICBDT0xfRURJVCwgR1BPSU5URVJfVE9fSU5UKHJvd1tDT0xfRURJVF0pLAorCQkJICAgQ09MX1BJWEJVRiwgcGl4LAorCQkJICAgQ09MX1BJWFZJUywgR1BPSU5URVJfVE9fSU5UKHJvd1tDT0xfUElYVklTXSksCisJCQkgICBDT0xfQlROVklTLCBHUE9JTlRFUl9UT19JTlQocm93W0NPTF9CVE5WSVNdKSwKKwkJCSAgIENPTF9CVE5BQ1QsIEdQT0lOVEVSX1RPX0lOVChyb3dbQ09MX0JUTkFDVF0pLAorCQkJICAgQ09MX0JUTklOQywgR1BPSU5URVJfVE9fSU5UKHJvd1tDT0xfQlROSU5DXSksCisJCQkgICBDT0xfQlROUkFELCBHUE9JTlRFUl9UT19JTlQocm93W0NPTF9CVE5SQURdKSwKKwkJCSAgIC0xKTsKKworCWdfb2JqZWN0X3VucmVmKHBpeCk7Cit9CisKKworLyogQWRkIGEgbm9kZSB0byB0aGUgdHJlZSAqLworc3RhdGljIHZvaWQgcGxhY2Vfbm9kZShzdHJ1Y3QgbWVudSAqbWVudSwgY2hhciAqKnJvdykKK3sKKwlHdGtUcmVlSXRlciAqcGFyZW50ID0gcGFyZW50c1tpbmRlbnQgLSAxXTsKKwlHdGtUcmVlSXRlciAqbm9kZSA9IHBhcmVudHNbaW5kZW50XTsKKworCWd0a190cmVlX3N0b3JlX2FwcGVuZCh0cmVlLCBub2RlLCBwYXJlbnQpOworCXNldF9ub2RlKG5vZGUsIG1lbnUsIHJvdyk7Cit9CisKKworLyogRmluZCBhIG5vZGUgaW4gdGhlIEdUSysgdHJlZSAqLworc3RhdGljIEd0a1RyZWVJdGVyIGZvdW5kOworCisvKgorICogRmluZCBhIG1lbnUgaW4gdGhlIEd0a1RyZWUgc3RhcnRpbmcgYXQgcGFyZW50LgorICovCitHdGtUcmVlSXRlciAqZ3RrdHJlZV9pdGVyX2ZpbmRfbm9kZShHdGtUcmVlSXRlciAqIHBhcmVudCwKKwkJCQkgICAgc3RydWN0IG1lbnUgKnRvZmluZCkKK3sKKwlHdGtUcmVlSXRlciBpdGVyOworCUd0a1RyZWVJdGVyICpjaGlsZCA9ICZpdGVyOworCWdib29sZWFuIHZhbGlkOworCUd0a1RyZWVJdGVyICpyZXQ7CisKKwl2YWxpZCA9IGd0a190cmVlX21vZGVsX2l0ZXJfY2hpbGRyZW4obW9kZWwyLCBjaGlsZCwgcGFyZW50KTsKKwl3aGlsZSAodmFsaWQpIHsKKwkJc3RydWN0IG1lbnUgKm1lbnU7CisKKwkJZ3RrX3RyZWVfbW9kZWxfZ2V0KG1vZGVsMiwgY2hpbGQsIDYsICZtZW51LCAtMSk7CisKKwkJaWYgKG1lbnUgPT0gdG9maW5kKSB7CisJCQltZW1jcHkoJmZvdW5kLCBjaGlsZCwgc2l6ZW9mKEd0a1RyZWVJdGVyKSk7CisJCQlyZXR1cm4gJmZvdW5kOworCQl9CisKKwkJcmV0ID0gZ3RrdHJlZV9pdGVyX2ZpbmRfbm9kZShjaGlsZCwgdG9maW5kKTsKKwkJaWYgKHJldCkKKwkJCXJldHVybiByZXQ7CisKKwkJdmFsaWQgPSBndGtfdHJlZV9tb2RlbF9pdGVyX25leHQobW9kZWwyLCBjaGlsZCk7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKworLyoKKyAqIFVwZGF0ZSB0aGUgdHJlZSBieSBhZGRpbmcvcmVtb3ZpbmcgZW50cmllcworICogRG9lcyBub3QgY2hhbmdlIG90aGVyIG5vZGVzCisgKi8KK3N0YXRpYyB2b2lkIHVwZGF0ZV90cmVlKHN0cnVjdCBtZW51ICpzcmMsIEd0a1RyZWVJdGVyICogZHN0KQoreworCXN0cnVjdCBtZW51ICpjaGlsZDE7CisJR3RrVHJlZUl0ZXIgaXRlciwgdG1wOworCUd0a1RyZWVJdGVyICpjaGlsZDIgPSAmaXRlcjsKKwlnYm9vbGVhbiB2YWxpZDsKKwlHdGtUcmVlSXRlciAqc2libGluZzsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXN0cnVjdCBtZW51ICptZW51MSwgKm1lbnUyOworCisJaWYgKHNyYyA9PSAmcm9vdG1lbnUpCisJCWluZGVudCA9IDE7CisKKwl2YWxpZCA9IGd0a190cmVlX21vZGVsX2l0ZXJfY2hpbGRyZW4obW9kZWwyLCBjaGlsZDIsIGRzdCk7CisJZm9yIChjaGlsZDEgPSBzcmMtPmxpc3Q7IGNoaWxkMTsgY2hpbGQxID0gY2hpbGQxLT5uZXh0KSB7CisKKwkJcHJvcCA9IGNoaWxkMS0+cHJvbXB0OworCQlzeW0gPSBjaGlsZDEtPnN5bTsKKworCSAgICAgIHJlcGFyc2U6CisJCW1lbnUxID0gY2hpbGQxOworCQlpZiAodmFsaWQpCisJCQlndGtfdHJlZV9tb2RlbF9nZXQobW9kZWwyLCBjaGlsZDIsIENPTF9NRU5VLAorCQkJCQkgICAmbWVudTIsIC0xKTsKKwkJZWxzZQorCQkJbWVudTIgPSBOVUxMOwkvLyBmb3JjZSBhZGRpbmcgb2YgYSBmaXJzdCBjaGlsZAorCisjaWZkZWYgREVCVUcKKwkJcHJpbnRmKCIlKmMlcyB8ICVzXG4iLCBpbmRlbnQsICcgJywKKwkJICAgICAgIG1lbnUxID8gbWVudV9nZXRfcHJvbXB0KG1lbnUxKSA6ICJuaWwiLAorCQkgICAgICAgbWVudTIgPyBtZW51X2dldF9wcm9tcHQobWVudTIpIDogIm5pbCIpOworI2VuZGlmCisKKwkJaWYgKCFtZW51X2lzX3Zpc2libGUoY2hpbGQxKSAmJiAhc2hvd19hbGwpIHsJLy8gcmVtb3ZlIG5vZGUKKwkJCWlmIChndGt0cmVlX2l0ZXJfZmluZF9ub2RlKGRzdCwgbWVudTEpICE9IE5VTEwpIHsKKwkJCQltZW1jcHkoJnRtcCwgY2hpbGQyLCBzaXplb2YoR3RrVHJlZUl0ZXIpKTsKKwkJCQl2YWxpZCA9IGd0a190cmVlX21vZGVsX2l0ZXJfbmV4dChtb2RlbDIsCisJCQkJCQkJCSBjaGlsZDIpOworCQkJCWd0a190cmVlX3N0b3JlX3JlbW92ZSh0cmVlMiwgJnRtcCk7CisJCQkJaWYgKCF2YWxpZCkKKwkJCQkJcmV0dXJuOwkvLyBuZXh0IHBhcmVudCAKKwkJCQllbHNlCisJCQkJCWdvdG8gcmVwYXJzZTsJLy8gbmV4dCBjaGlsZAorCQkJfSBlbHNlCisJCQkJY29udGludWU7CisJCX0KKworCQlpZiAobWVudTEgIT0gbWVudTIpIHsKKwkJCWlmIChndGt0cmVlX2l0ZXJfZmluZF9ub2RlKGRzdCwgbWVudTEpID09IE5VTEwpIHsJLy8gYWRkIG5vZGUKKwkJCQlpZiAoIXZhbGlkICYmICFtZW51MikKKwkJCQkJc2libGluZyA9IE5VTEw7CisJCQkJZWxzZQorCQkJCQlzaWJsaW5nID0gY2hpbGQyOworCQkJCWd0a190cmVlX3N0b3JlX2luc2VydF9iZWZvcmUodHJlZTIsCisJCQkJCQkJICAgICBjaGlsZDIsCisJCQkJCQkJICAgICBkc3QsIHNpYmxpbmcpOworCQkJCXNldF9ub2RlKGNoaWxkMiwgbWVudTEsIGZpbGxfcm93KG1lbnUxKSk7CisJCQkJaWYgKG1lbnUyID09IE5VTEwpCisJCQkJCXZhbGlkID0gVFJVRTsKKwkJCX0gZWxzZSB7CS8vIHJlbW92ZSBub2RlCisJCQkJbWVtY3B5KCZ0bXAsIGNoaWxkMiwgc2l6ZW9mKEd0a1RyZWVJdGVyKSk7CisJCQkJdmFsaWQgPSBndGtfdHJlZV9tb2RlbF9pdGVyX25leHQobW9kZWwyLAorCQkJCQkJCQkgY2hpbGQyKTsKKwkJCQlndGtfdHJlZV9zdG9yZV9yZW1vdmUodHJlZTIsICZ0bXApOworCQkJCWlmICghdmFsaWQpCisJCQkJCXJldHVybjsJLy8gbmV4dCBwYXJlbnQgCisJCQkJZWxzZQorCQkJCQlnb3RvIHJlcGFyc2U7CS8vIG5leHQgY2hpbGQKKwkJCX0KKwkJfSBlbHNlIGlmIChzeW0gJiYgKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfQ0hBTkdFRCkpIHsKKwkJCXNldF9ub2RlKGNoaWxkMiwgbWVudTEsIGZpbGxfcm93KG1lbnUxKSk7CisJCX0KKworCQlpbmRlbnQrKzsKKwkJdXBkYXRlX3RyZWUoY2hpbGQxLCBjaGlsZDIpOworCQlpbmRlbnQtLTsKKworCQl2YWxpZCA9IGd0a190cmVlX21vZGVsX2l0ZXJfbmV4dChtb2RlbDIsIGNoaWxkMik7CisJfQorfQorCisKKy8qIERpc3BsYXkgdGhlIHdob2xlIHRyZWUgKHNpbmdsZS9zcGxpdC9mdWxsIHZpZXcpICovCitzdGF0aWMgdm9pZCBkaXNwbGF5X3RyZWUoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3QgbWVudSAqY2hpbGQ7CisJZW51bSBwcm9wX3R5cGUgcHR5cGU7CisKKwlpZiAobWVudSA9PSAmcm9vdG1lbnUpIHsKKwkJaW5kZW50ID0gMTsKKwkJY3VycmVudCA9ICZyb290bWVudTsKKwl9CisKKwlmb3IgKGNoaWxkID0gbWVudS0+bGlzdDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKwkJcHJvcCA9IGNoaWxkLT5wcm9tcHQ7CisJCXN5bSA9IGNoaWxkLT5zeW07CisJCXB0eXBlID0gcHJvcCA/IHByb3AtPnR5cGUgOiBQX1VOS05PV047CisKKwkJaWYgKHN5bSkKKwkJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9DSEFOR0VEOworCisJCWlmICgodmlld19tb2RlID09IFNQTElUX1ZJRVcpICYmICEoY2hpbGQtPmZsYWdzICYgTUVOVV9ST09UKSAmJgorCQkgICAgKHRyZWUgPT0gdHJlZTEpKQorCQkJY29udGludWU7CisKKwkJaWYgKCh2aWV3X21vZGUgPT0gU1BMSVRfVklFVykgJiYgKGNoaWxkLT5mbGFncyAmIE1FTlVfUk9PVCkgJiYKKwkJICAgICh0cmVlID09IHRyZWUyKSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChtZW51X2lzX3Zpc2libGUoY2hpbGQpIHx8IHNob3dfYWxsKQorCQkJcGxhY2Vfbm9kZShjaGlsZCwgZmlsbF9yb3coY2hpbGQpKTsKKyNpZmRlZiBERUJVRworCQlwcmludGYoIiUqYyVzOiAiLCBpbmRlbnQsICcgJywgbWVudV9nZXRfcHJvbXB0KGNoaWxkKSk7CisJCXByaW50ZigiJXMiLCBjaGlsZC0+ZmxhZ3MgJiBNRU5VX1JPT1QgPyAicm9vdG1lbnUgfCAiIDogIiIpOworCQlkYmdfcHJpbnRfcHR5cGUocHR5cGUpOworCQlwcmludGYoIiB8ICIpOworCQlpZiAoc3ltKSB7CisJCQlkYmdfcHJpbnRfc3R5cGUoc3ltLT50eXBlKTsKKwkJCXByaW50ZigiIHwgIik7CisJCQlkYmdfcHJpbnRfZmxhZ3Moc3ltLT5mbGFncyk7CisJCQlwcmludGYoIlxuIik7CisJCX0gZWxzZQorCQkJcHJpbnRmKCJcbiIpOworI2VuZGlmCisJCWlmICgodmlld19tb2RlICE9IEZVTExfVklFVykgJiYgKHB0eXBlID09IFBfTUVOVSkKKwkJICAgICYmICh0cmVlID09IHRyZWUyKSkKKwkJCWNvbnRpbnVlOworLyoKKwkJaWYgKCgobWVudSAhPSAmcm9vdG1lbnUpICYmICEobWVudS0+ZmxhZ3MgJiBNRU5VX1JPT1QpKSB8fAorCQkgICAgKHZpZXdfbW9kZSA9PSBGVUxMX1ZJRVcpCisJCSAgICB8fCAodmlld19tb2RlID09IFNQTElUX1ZJRVcpKSovCisJCWlmICgoKHZpZXdfbW9kZSA9PSBTSU5HTEVfVklFVykgJiYgKG1lbnUtPmZsYWdzICYgTUVOVV9ST09UKSkKKwkJICAgIHx8ICh2aWV3X21vZGUgPT0gRlVMTF9WSUVXKSB8fCAodmlld19tb2RlID09IFNQTElUX1ZJRVcpKSB7CisJCQlpbmRlbnQrKzsKKwkJCWRpc3BsYXlfdHJlZShjaGlsZCk7CisJCQlpbmRlbnQtLTsKKwkJfQorCX0KK30KKworLyogRGlzcGxheSBhIHBhcnQgb2YgdGhlIHRyZWUgc3RhcnRpbmcgYXQgY3VycmVudCBub2RlIChzaW5nbGUvc3BsaXQgdmlldykgKi8KK3N0YXRpYyB2b2lkIGRpc3BsYXlfdHJlZV9wYXJ0KHZvaWQpCit7CisJaWYgKHRyZWUyKQorCQlndGtfdHJlZV9zdG9yZV9jbGVhcih0cmVlMik7CisJaWYodmlld19tb2RlID09IFNJTkdMRV9WSUVXKQorCQlkaXNwbGF5X3RyZWUoY3VycmVudCk7CisgCWVsc2UgaWYodmlld19tb2RlID09IFNQTElUX1ZJRVcpCisJCWRpc3BsYXlfdHJlZShicm93c2VkKTsKKwlndGtfdHJlZV92aWV3X2V4cGFuZF9hbGwoR1RLX1RSRUVfVklFVyh0cmVlMl93KSk7Cit9CisKKy8qIERpc3BsYXkgdGhlIGxpc3QgaW4gdGhlIGxlZnQgZnJhbWUgKHNwbGl0IHZpZXcpICovCitzdGF0aWMgdm9pZCBkaXNwbGF5X2xpc3Qodm9pZCkKK3sKKwlpZiAodHJlZTEpCisJCWd0a190cmVlX3N0b3JlX2NsZWFyKHRyZWUxKTsKKworCXRyZWUgPSB0cmVlMTsKKwlkaXNwbGF5X3RyZWUoJnJvb3RtZW51KTsKKwlndGtfdHJlZV92aWV3X2V4cGFuZF9hbGwoR1RLX1RSRUVfVklFVyh0cmVlMV93KSk7CisJdHJlZSA9IHRyZWUyOworfQorCit2b2lkIGZpeHVwX3Jvb3RtZW51KHN0cnVjdCBtZW51ICptZW51KQoreworICAgICAgICBzdHJ1Y3QgbWVudSAqY2hpbGQ7CisgICAgICAgIHN0YXRpYyBpbnQgbWVudV9jbnQgPSAwOworCisgICAgICAgIG1lbnUtPmZsYWdzIHw9IE1FTlVfUk9PVDsKKyAgICAgICAgZm9yIChjaGlsZCA9IG1lbnUtPmxpc3Q7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisgICAgICAgICAgICAgICAgaWYgKGNoaWxkLT5wcm9tcHQgJiYgY2hpbGQtPnByb21wdC0+dHlwZSA9PSBQX01FTlUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lbnVfY250Kys7CisgICAgICAgICAgICAgICAgICAgICAgICBmaXh1cF9yb290bWVudShjaGlsZCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW51X2NudC0tOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1lbnVfY250KQorICAgICAgICAgICAgICAgICAgICAgICAgZml4dXBfcm9vdG1lbnUoY2hpbGQpOworICAgICAgICB9Cit9CisKKworLyogTWFpbiAqLworCisKK2ludCBtYWluKGludCBhYywgY2hhciAqYXZbXSkKK3sKKwljb25zdCBjaGFyICpuYW1lOworCWNoYXIgKmVudjsKKwlnY2hhciAqZ2xhZGVfZmlsZTsKKworI2lmbmRlZiBMS0NfRElSRUNUX0xJTksKKwlrY29uZmlnX2xvYWQoKTsKKyNlbmRpZgorCisJLyogR1RLIHN0dWZmcyAqLworCWd0a19zZXRfbG9jYWxlKCk7CisJZ3RrX2luaXQoJmFjLCAmYXYpOworCWdsYWRlX2luaXQoKTsKKworCS8vYWRkX3BpeG1hcF9kaXJlY3RvcnkgKFBBQ0tBR0VfREFUQV9ESVIgIi8iIFBBQ0tBR0UgIi9waXhtYXBzIik7CisJLy9hZGRfcGl4bWFwX2RpcmVjdG9yeSAoUEFDS0FHRV9TT1VSQ0VfRElSICIvcGl4bWFwcyIpOworCisJLyogRGV0ZXJtaW5lIEdVSSBwYXRoICovCisJZW52ID0gZ2V0ZW52KFNSQ1RSRUUpOworCWlmIChlbnYpCisJCWdsYWRlX2ZpbGUgPSBnX3N0cmNvbmNhdChlbnYsICIvc2NyaXB0cy9rY29uZmlnL2djb25mLmdsYWRlIiwgTlVMTCk7CisJZWxzZSBpZiAoYXZbMF1bMF0gPT0gJy8nKQorCQlnbGFkZV9maWxlID0gZ19zdHJjb25jYXQoYXZbMF0sICIuZ2xhZGUiLCBOVUxMKTsKKwllbHNlCisJCWdsYWRlX2ZpbGUgPSBnX3N0cmNvbmNhdChnX2dldF9jdXJyZW50X2RpcigpLCAiLyIsIGF2WzBdLCAiLmdsYWRlIiwgTlVMTCk7CisKKwkvKiBMb2FkIHRoZSBpbnRlcmZhY2UgYW5kIGNvbm5lY3Qgc2lnbmFscyAqLworCWluaXRfbWFpbl93aW5kb3coZ2xhZGVfZmlsZSk7CisJaW5pdF90cmVlX21vZGVsKCk7CisJaW5pdF9sZWZ0X3RyZWUoKTsKKwlpbml0X3JpZ2h0X3RyZWUoKTsKKworCS8qIENvbmYgc3R1ZmZzICovCisJaWYgKGFjID4gMSAmJiBhdlsxXVswXSA9PSAnLScpIHsKKwkJc3dpdGNoIChhdlsxXVsxXSkgeworCQljYXNlICdhJzoKKwkJCS8vc2hvd0FsbCA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnaCc6CisJCWNhc2UgJz8nOgorCQkJcHJpbnRmKCIlcyA8Y29uZmlnPlxuIiwgYXZbMF0pOworCQkJZXhpdCgwKTsKKwkJfQorCQluYW1lID0gYXZbMl07CisJfSBlbHNlCisJCW5hbWUgPSBhdlsxXTsKKworCWNvbmZfcGFyc2UobmFtZSk7CisJZml4dXBfcm9vdG1lbnUoJnJvb3RtZW51KTsKKwljb25mX3JlYWQoTlVMTCk7CisKKwlzd2l0Y2ggKHZpZXdfbW9kZSkgeworCWNhc2UgU0lOR0xFX1ZJRVc6CisJCWRpc3BsYXlfdHJlZV9wYXJ0KCk7CisJCWJyZWFrOworCWNhc2UgU1BMSVRfVklFVzoKKwkJZGlzcGxheV9saXN0KCk7CisJCWJyZWFrOworCWNhc2UgRlVMTF9WSUVXOgorCQlkaXNwbGF5X3RyZWUoJnJvb3RtZW51KTsKKwkJYnJlYWs7CisJfQorCisJZ3RrX21haW4oKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2djb25mLmdsYWRlIGIvc2NyaXB0cy9rY29uZmlnL2djb25mLmdsYWRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMTczNmQKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvZ2NvbmYuZ2xhZGUKQEAgLTAsMCArMSw1NDMgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgc3RhbmRhbG9uZT0ibm8iPz4gPCEtLSotIG1vZGU6IHhtbCAtKi0tPgorPCFET0NUWVBFIGdsYWRlLWludGVyZmFjZSBTWVNURU0gImh0dHA6Ly9nbGFkZS5nbm9tZS5vcmcvZ2xhZGUtMi4wLmR0ZCI+CisKKzxnbGFkZS1pbnRlcmZhY2U+CisKKzx3aWRnZXQgY2xhc3M9Ikd0a1dpbmRvdyIgaWQ9IndpbmRvdzEiPgorICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBuYW1lPSJ0aXRsZSIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkd0ayBLZXJuZWwgQ29uZmlndXJhdG9yPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IG5hbWU9InR5cGUiPkdUS19XSU5ET1dfVE9QTEVWRUw8L3Byb3BlcnR5PgorICA8cHJvcGVydHkgbmFtZT0id2luZG93X3Bvc2l0aW9uIj5HVEtfV0lOX1BPU19OT05FPC9wcm9wZXJ0eT4KKyAgPHByb3BlcnR5IG5hbWU9Im1vZGFsIj5GYWxzZTwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBuYW1lPSJkZWZhdWx0X3dpZHRoIj42NDA8L3Byb3BlcnR5PgorICA8cHJvcGVydHkgbmFtZT0iZGVmYXVsdF9oZWlnaHQiPjQ4MDwvcHJvcGVydHk+CisgIDxwcm9wZXJ0eSBuYW1lPSJyZXNpemFibGUiPlRydWU8L3Byb3BlcnR5PgorICA8cHJvcGVydHkgbmFtZT0iZGVzdHJveV93aXRoX3BhcmVudCI+RmFsc2U8L3Byb3BlcnR5PgorICA8c2lnbmFsIG5hbWU9ImRlc3Ryb3kiIGhhbmRsZXI9Im9uX3dpbmRvdzFfZGVzdHJveSIgb2JqZWN0PSJ3aW5kb3cxIi8+CisgIDxzaWduYWwgbmFtZT0ic2l6ZV9yZXF1ZXN0IiBoYW5kbGVyPSJvbl93aW5kb3cxX3NpemVfcmVxdWVzdCIgb2JqZWN0PSJ2cGFuZWQxIiBsYXN0X21vZGlmaWNhdGlvbl90aW1lPSJGcmksIDExIEphbiAyMDAyIDE2OjE3OjExIEdNVCIvPgorICA8c2lnbmFsIG5hbWU9ImRlbGV0ZV9ldmVudCIgaGFuZGxlcj0ib25fd2luZG93MV9kZWxldGVfZXZlbnQiIG9iamVjdD0id2luZG93MSIgbGFzdF9tb2RpZmljYXRpb25fdGltZT0iU3VuLCAwOSBNYXIgMjAwMyAxOTo0Mjo0NiBHTVQiLz4KKworICA8Y2hpbGQ+CisgICAgPHdpZGdldCBjbGFzcz0iR3RrVkJveCIgaWQ9InZib3gxIj4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKyAgICAgIDxwcm9wZXJ0eSBuYW1lPSJob21vZ2VuZW91cyI+RmFsc2U8L3Byb3BlcnR5PgorICAgICAgPHByb3BlcnR5IG5hbWU9InNwYWNpbmciPjA8L3Byb3BlcnR5PgorCisgICAgICA8Y2hpbGQ+CisJPHdpZGdldCBjbGFzcz0iR3RrTWVudUJhciIgaWQ9Im1lbnViYXIxIj4KKwkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKworCSAgPGNoaWxkPgorCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtNZW51SXRlbSIgaWQ9ImZpbGUxIj4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+X0ZpbGU8L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iR3RrTWVudSIgaWQ9ImZpbGUxX21lbnUiPgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrSW1hZ2VNZW51SXRlbSIgaWQ9ImxvYWQxIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idG9vbHRpcCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkxvYWQgYSBjb25maWcgZmlsZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPl9Mb2FkPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImFjdGl2YXRlIiBoYW5kbGVyPSJvbl9sb2FkMV9hY3RpdmF0ZSIvPgorCQkgICAgICA8YWNjZWxlcmF0b3Iga2V5PSJMIiBtb2RpZmllcnM9IkdES19DT05UUk9MX01BU0siIHNpZ25hbD0iYWN0aXZhdGUiLz4KKworCQkgICAgICA8Y2hpbGQgaW50ZXJuYWwtY2hpbGQ9ImltYWdlIj4KKwkJCTx3aWRnZXQgY2xhc3M9Ikd0a0ltYWdlIiBpZD0iaW1hZ2UyNyI+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InN0b2NrIj5ndGstb3BlbjwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJpY29uX3NpemUiPjE8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieGFsaWduIj4wLjU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieWFsaWduIj4wLjU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieHBhZCI+MDwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ5cGFkIj4wPC9wcm9wZXJ0eT4KKwkJCTwvd2lkZ2V0PgorCQkgICAgICA8L2NoaWxkPgorCQkgICAgPC93aWRnZXQ+CisJCSAgPC9jaGlsZD4KKworCQkgIDxjaGlsZD4KKwkJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0ltYWdlTWVudUl0ZW0iIGlkPSJzYXZlMSI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXAiIHRyYW5zbGF0YWJsZT0ieWVzIj5TYXZlIHRoZSBjb25maWcgaW4gLmNvbmZpZzwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPl9TYXZlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImFjdGl2YXRlIiBoYW5kbGVyPSJvbl9zYXZlMV9hY3RpdmF0ZSIvPgorCQkgICAgICA8YWNjZWxlcmF0b3Iga2V5PSJTIiBtb2RpZmllcnM9IkdES19DT05UUk9MX01BU0siIHNpZ25hbD0iYWN0aXZhdGUiLz4KKworCQkgICAgICA8Y2hpbGQgaW50ZXJuYWwtY2hpbGQ9ImltYWdlIj4KKwkJCTx3aWRnZXQgY2xhc3M9Ikd0a0ltYWdlIiBpZD0iaW1hZ2UyOCI+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InN0b2NrIj5ndGstc2F2ZTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJpY29uX3NpemUiPjE8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieGFsaWduIj4wLjU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieWFsaWduIj4wLjU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieHBhZCI+MDwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ5cGFkIj4wPC9wcm9wZXJ0eT4KKwkJCTwvd2lkZ2V0PgorCQkgICAgICA8L2NoaWxkPgorCQkgICAgPC93aWRnZXQ+CisJCSAgPC9jaGlsZD4KKworCQkgIDxjaGlsZD4KKwkJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0ltYWdlTWVudUl0ZW0iIGlkPSJzYXZlX2FzMSI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXAiIHRyYW5zbGF0YWJsZT0ieWVzIj5TYXZlIHRoZSBjb25maWcgaW4gYSBmaWxlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+U2F2ZSBfYXM8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxzaWduYWwgbmFtZT0iYWN0aXZhdGUiIGhhbmRsZXI9Im9uX3NhdmVfYXMxX2FjdGl2YXRlIi8+CisKKwkJICAgICAgPGNoaWxkIGludGVybmFsLWNoaWxkPSJpbWFnZSI+CisJCQk8d2lkZ2V0IGNsYXNzPSJHdGtJbWFnZSIgaWQ9ImltYWdlMjkiPgorCQkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJzdG9jayI+Z3RrLXNhdmUtYXM8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0iaWNvbl9zaXplIj4xPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InhhbGlnbiI+MC41PC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InlhbGlnbiI+MC41PC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InhwYWQiPjA8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieXBhZCI+MDwvcHJvcGVydHk+CisJCQk8L3dpZGdldD4KKwkJICAgICAgPC9jaGlsZD4KKwkJICAgIDwvd2lkZ2V0PgorCQkgIDwvY2hpbGQ+CisKKwkJICA8Y2hpbGQ+CisJCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtNZW51SXRlbSIgaWQ9InNlcGFyYXRvcjEiPgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrSW1hZ2VNZW51SXRlbSIgaWQ9InF1aXQxIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5fUXVpdDwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHNpZ25hbCBuYW1lPSJhY3RpdmF0ZSIgaGFuZGxlcj0ib25fcXVpdDFfYWN0aXZhdGUiLz4KKwkJICAgICAgPGFjY2VsZXJhdG9yIGtleT0iUSIgbW9kaWZpZXJzPSJHREtfQ09OVFJPTF9NQVNLIiBzaWduYWw9ImFjdGl2YXRlIi8+CisKKwkJICAgICAgPGNoaWxkIGludGVybmFsLWNoaWxkPSJpbWFnZSI+CisJCQk8d2lkZ2V0IGNsYXNzPSJHdGtJbWFnZSIgaWQ9ImltYWdlMzAiPgorCQkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJzdG9jayI+Z3RrLXF1aXQ8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0iaWNvbl9zaXplIj4xPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InhhbGlnbiI+MC41PC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InlhbGlnbiI+MC41PC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InhwYWQiPjA8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieXBhZCI+MDwvcHJvcGVydHk+CisJCQk8L3dpZGdldD4KKwkJICAgICAgPC9jaGlsZD4KKwkJICAgIDwvd2lkZ2V0PgorCQkgIDwvY2hpbGQ+CisJCTwvd2lkZ2V0PgorCSAgICAgIDwvY2hpbGQ+CisJICAgIDwvd2lkZ2V0PgorCSAgPC9jaGlsZD4KKworCSAgPGNoaWxkPgorCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtNZW51SXRlbSIgaWQ9Im9wdGlvbnMxIj4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+X09wdGlvbnM8L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iR3RrTWVudSIgaWQ9Im9wdGlvbnMxX21lbnUiPgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrQ2hlY2tNZW51SXRlbSIgaWQ9InNob3dfbmFtZTEiPgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sdGlwIiB0cmFuc2xhdGFibGU9InllcyI+U2hvdyBuYW1lPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+U2hvdyBfbmFtZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImFjdGl2ZSI+RmFsc2U8L3Byb3BlcnR5PgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImFjdGl2YXRlIiBoYW5kbGVyPSJvbl9zaG93X25hbWUxX2FjdGl2YXRlIi8+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrQ2hlY2tNZW51SXRlbSIgaWQ9InNob3dfcmFuZ2UxIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idG9vbHRpcCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNob3cgcmFuZ2UgKFkvTS9OKTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNob3cgX3JhbmdlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0iYWN0aXZlIj5GYWxzZTwvcHJvcGVydHk+CisJCSAgICAgIDxzaWduYWwgbmFtZT0iYWN0aXZhdGUiIGhhbmRsZXI9Im9uX3Nob3dfcmFuZ2UxX2FjdGl2YXRlIi8+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrQ2hlY2tNZW51SXRlbSIgaWQ9InNob3dfZGF0YTEiPgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sdGlwIiB0cmFuc2xhdGFibGU9InllcyI+U2hvdyB2YWx1ZSBvZiB0aGUgb3B0aW9uPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+U2hvdyBfZGF0YTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImFjdGl2ZSI+RmFsc2U8L3Byb3BlcnR5PgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImFjdGl2YXRlIiBoYW5kbGVyPSJvbl9zaG93X2RhdGExX2FjdGl2YXRlIi8+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrTWVudUl0ZW0iIGlkPSJzZXBhcmF0b3IyIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgPC93aWRnZXQ+CisJCSAgPC9jaGlsZD4KKworCQkgIDxjaGlsZD4KKwkJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0NoZWNrTWVudUl0ZW0iIGlkPSJzaG93X2FsbF9vcHRpb25zMSI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXAiIHRyYW5zbGF0YWJsZT0ieWVzIj5TaG93IGFsbCBvcHRpb25zPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+U2hvdyBhbGwgX29wdGlvbnM8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhY3RpdmUiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHNpZ25hbCBuYW1lPSJhY3RpdmF0ZSIgaGFuZGxlcj0ib25fc2hvd19hbGxfb3B0aW9uczFfYWN0aXZhdGUiLz4KKwkJICAgIDwvd2lkZ2V0PgorCQkgIDwvY2hpbGQ+CisKKwkJICA8Y2hpbGQ+CisJCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtDaGVja01lbnVJdGVtIiBpZD0ic2hvd19kZWJ1Z19pbmZvMSI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXAiIHRyYW5zbGF0YWJsZT0ieWVzIj5TaG93IG1hc2tlZCBvcHRpb25zPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+U2hvdyBfZGVidWcgaW5mbzwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImFjdGl2ZSI+RmFsc2U8L3Byb3BlcnR5PgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImFjdGl2YXRlIiBoYW5kbGVyPSJvbl9zaG93X2RlYnVnX2luZm8xX2FjdGl2YXRlIi8+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCQk8L3dpZGdldD4KKwkgICAgICA8L2NoaWxkPgorCSAgICA8L3dpZGdldD4KKwkgIDwvY2hpbGQ+CisKKwkgIDxjaGlsZD4KKwkgICAgPHdpZGdldCBjbGFzcz0iR3RrTWVudUl0ZW0iIGlkPSJoZWxwMSI+CisJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPl9IZWxwPC9wcm9wZXJ0eT4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9Ikd0a01lbnUiIGlkPSJoZWxwMV9tZW51Ij4KKworCQkgIDxjaGlsZD4KKwkJICAgIDx3aWRnZXQgY2xhc3M9Ikd0a0ltYWdlTWVudUl0ZW0iIGlkPSJpbnRyb2R1Y3Rpb24xIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5fSW50cm9kdWN0aW9uPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImFjdGl2YXRlIiBoYW5kbGVyPSJvbl9pbnRyb2R1Y3Rpb24xX2FjdGl2YXRlIiBsYXN0X21vZGlmaWNhdGlvbl90aW1lPSJGcmksIDE1IE5vdiAyMDAyIDIwOjI2OjMwIEdNVCIvPgorCQkgICAgICA8YWNjZWxlcmF0b3Iga2V5PSJJIiBtb2RpZmllcnM9IkdES19DT05UUk9MX01BU0siIHNpZ25hbD0iYWN0aXZhdGUiLz4KKworCQkgICAgICA8Y2hpbGQgaW50ZXJuYWwtY2hpbGQ9ImltYWdlIj4KKwkJCTx3aWRnZXQgY2xhc3M9Ikd0a0ltYWdlIiBpZD0iaW1hZ2UzMSI+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InN0b2NrIj5ndGstZGlhbG9nLXF1ZXN0aW9uPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9Imljb25fc2l6ZSI+MTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ4YWxpZ24iPjAuNTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ5YWxpZ24iPjAuNTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ4cGFkIj4wPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InlwYWQiPjA8L3Byb3BlcnR5PgorCQkJPC93aWRnZXQ+CisJCSAgICAgIDwvY2hpbGQ+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrSW1hZ2VNZW51SXRlbSIgaWQ9ImFib3V0MSI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+X0Fib3V0PC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImFjdGl2YXRlIiBoYW5kbGVyPSJvbl9hYm91dDFfYWN0aXZhdGUiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IkZyaSwgMTUgTm92IDIwMDIgMjA6MjY6MzAgR01UIi8+CisJCSAgICAgIDxhY2NlbGVyYXRvciBrZXk9IkEiIG1vZGlmaWVycz0iR0RLX0NPTlRST0xfTUFTSyIgc2lnbmFsPSJhY3RpdmF0ZSIvPgorCisJCSAgICAgIDxjaGlsZCBpbnRlcm5hbC1jaGlsZD0iaW1hZ2UiPgorCQkJPHdpZGdldCBjbGFzcz0iR3RrSW1hZ2UiIGlkPSJpbWFnZTMyIj4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ic3RvY2siPmd0ay1wcm9wZXJ0aWVzPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9Imljb25fc2l6ZSI+MTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ4YWxpZ24iPjAuNTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ5YWxpZ24iPjAuNTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ4cGFkIj4wPC9wcm9wZXJ0eT4KKwkJCSAgPHByb3BlcnR5IG5hbWU9InlwYWQiPjA8L3Byb3BlcnR5PgorCQkJPC93aWRnZXQ+CisJCSAgICAgIDwvY2hpbGQ+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrSW1hZ2VNZW51SXRlbSIgaWQ9ImxpY2Vuc2UxIj4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5fTGljZW5zZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHNpZ25hbCBuYW1lPSJhY3RpdmF0ZSIgaGFuZGxlcj0ib25fbGljZW5zZTFfYWN0aXZhdGUiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IkZyaSwgMTUgTm92IDIwMDIgMjA6MjY6MzAgR01UIi8+CisKKwkJICAgICAgPGNoaWxkIGludGVybmFsLWNoaWxkPSJpbWFnZSI+CisJCQk8d2lkZ2V0IGNsYXNzPSJHdGtJbWFnZSIgaWQ9ImltYWdlMzMiPgorCQkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJzdG9jayI+Z3RrLWp1c3RpZnktZmlsbDwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJpY29uX3NpemUiPjE8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieGFsaWduIj4wLjU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieWFsaWduIj4wLjU8L3Byb3BlcnR5PgorCQkJICA8cHJvcGVydHkgbmFtZT0ieHBhZCI+MDwvcHJvcGVydHk+CisJCQkgIDxwcm9wZXJ0eSBuYW1lPSJ5cGFkIj4wPC9wcm9wZXJ0eT4KKwkJCTwvd2lkZ2V0PgorCQkgICAgICA8L2NoaWxkPgorCQkgICAgPC93aWRnZXQ+CisJCSAgPC9jaGlsZD4KKwkJPC93aWRnZXQ+CisJICAgICAgPC9jaGlsZD4KKwkgICAgPC93aWRnZXQ+CisJICA8L2NoaWxkPgorCTwvd2lkZ2V0PgorCTxwYWNraW5nPgorCSAgPHByb3BlcnR5IG5hbWU9InBhZGRpbmciPjA8L3Byb3BlcnR5PgorCSAgPHByb3BlcnR5IG5hbWU9ImV4cGFuZCI+RmFsc2U8L3Byb3BlcnR5PgorCSAgPHByb3BlcnR5IG5hbWU9ImZpbGwiPkZhbHNlPC9wcm9wZXJ0eT4KKwk8L3BhY2tpbmc+CisgICAgICA8L2NoaWxkPgorCisgICAgICA8Y2hpbGQ+CisJPHdpZGdldCBjbGFzcz0iR3RrSGFuZGxlQm94IiBpZD0iaGFuZGxlYm94MSI+CisJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJICA8cHJvcGVydHkgbmFtZT0ic2hhZG93X3R5cGUiPkdUS19TSEFET1dfT1VUPC9wcm9wZXJ0eT4KKwkgIDxwcm9wZXJ0eSBuYW1lPSJoYW5kbGVfcG9zaXRpb24iPkdUS19QT1NfTEVGVDwvcHJvcGVydHk+CisJICA8cHJvcGVydHkgbmFtZT0ic25hcF9lZGdlIj5HVEtfUE9TX1RPUDwvcHJvcGVydHk+CisKKwkgIDxjaGlsZD4KKwkgICAgPHdpZGdldCBjbGFzcz0iR3RrVG9vbGJhciIgaWQ9InRvb2xiYXIxIj4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJICAgICAgPHByb3BlcnR5IG5hbWU9Im9yaWVudGF0aW9uIj5HVEtfT1JJRU5UQVRJT05fSE9SSVpPTlRBTDwvcHJvcGVydHk+CisJICAgICAgPHByb3BlcnR5IG5hbWU9InRvb2xiYXJfc3R5bGUiPkdUS19UT09MQkFSX0JPVEg8L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sdGlwcyI+VHJ1ZTwvcHJvcGVydHk+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9ImJ1dHRvbiIgaWQ9ImJ1dHRvbjEiPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idG9vbHRpcCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkdvZXMgdXAgb2Ygb25lIGxldmVsIChzaW5nbGUgdmlldyk8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkJhY2s8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0ic3RvY2tfcGl4bWFwIj5ndGstdW5kbzwvcHJvcGVydHk+CisJCSAgPHNpZ25hbCBuYW1lPSJwcmVzc2VkIiBoYW5kbGVyPSJvbl9iYWNrX3ByZXNzZWQiLz4KKwkJPC93aWRnZXQ+CisJICAgICAgPC9jaGlsZD4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iR3RrVlNlcGFyYXRvciIgaWQ9InZzZXBhcmF0b3IxIj4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCTwvd2lkZ2V0PgorCSAgICAgIDwvY2hpbGQ+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9ImJ1dHRvbiIgaWQ9ImJ1dHRvbjIiPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idG9vbHRpcCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkxvYWQgYSBjb25maWcgZmlsZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+TG9hZDwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJzdG9ja19waXhtYXAiPmd0ay1vcGVuPC9wcm9wZXJ0eT4KKwkJICA8c2lnbmFsIG5hbWU9InByZXNzZWQiIGhhbmRsZXI9Im9uX2xvYWRfcHJlc3NlZCIvPgorCQk8L3dpZGdldD4KKwkgICAgICA8L2NoaWxkPgorCisJICAgICAgPGNoaWxkPgorCQk8d2lkZ2V0IGNsYXNzPSJidXR0b24iIGlkPSJidXR0b24zIj4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXAiIHRyYW5zbGF0YWJsZT0ieWVzIj5TYXZlIGEgY29uZmlnIGZpbGU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNhdmU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0ic3RvY2tfcGl4bWFwIj5ndGstc2F2ZTwvcHJvcGVydHk+CisJCSAgPHNpZ25hbCBuYW1lPSJwcmVzc2VkIiBoYW5kbGVyPSJvbl9zYXZlX3ByZXNzZWQiLz4KKwkJPC93aWRnZXQ+CisJICAgICAgPC9jaGlsZD4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iR3RrVlNlcGFyYXRvciIgaWQ9InZzZXBhcmF0b3IyIj4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCTwvd2lkZ2V0PgorCSAgICAgIDwvY2hpbGQ+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9ImJ1dHRvbiIgaWQ9ImJ1dHRvbjQiPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idG9vbHRpcCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNpbmdsZSB2aWV3PC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0ibGFiZWwiIHRyYW5zbGF0YWJsZT0ieWVzIj5TaW5nbGU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0ic3RvY2tfcGl4bWFwIj5ndGstbWlzc2luZy1pbWFnZTwvcHJvcGVydHk+CisJCSAgPHNpZ25hbCBuYW1lPSJjbGlja2VkIiBoYW5kbGVyPSJvbl9zaW5nbGVfY2xpY2tlZCIgbGFzdF9tb2RpZmljYXRpb25fdGltZT0iU3VuLCAxMiBKYW4gMjAwMyAxNDoyODozOSBHTVQiLz4KKwkJPC93aWRnZXQ+CisJICAgICAgPC9jaGlsZD4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iYnV0dG9uIiBpZD0iYnV0dG9uNSI+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ0b29sdGlwIiB0cmFuc2xhdGFibGU9InllcyI+U3BsaXQgdmlldzwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImxhYmVsIiB0cmFuc2xhdGFibGU9InllcyI+U3BsaXQ8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0ic3RvY2tfcGl4bWFwIj5ndGstbWlzc2luZy1pbWFnZTwvcHJvcGVydHk+CisJCSAgPHNpZ25hbCBuYW1lPSJjbGlja2VkIiBoYW5kbGVyPSJvbl9zcGxpdF9jbGlja2VkIiBsYXN0X21vZGlmaWNhdGlvbl90aW1lPSJTdW4sIDEyIEphbiAyMDAzIDE0OjI4OjQ1IEdNVCIvPgorCQk8L3dpZGdldD4KKwkgICAgICA8L2NoaWxkPgorCisJICAgICAgPGNoaWxkPgorCQk8d2lkZ2V0IGNsYXNzPSJidXR0b24iIGlkPSJidXR0b242Ij4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXAiIHRyYW5zbGF0YWJsZT0ieWVzIj5GdWxsIHZpZXc8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkZ1bGw8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ1c2VfdW5kZXJsaW5lIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0ic3RvY2tfcGl4bWFwIj5ndGstbWlzc2luZy1pbWFnZTwvcHJvcGVydHk+CisJCSAgPHNpZ25hbCBuYW1lPSJjbGlja2VkIiBoYW5kbGVyPSJvbl9mdWxsX2NsaWNrZWQiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IlN1biwgMTIgSmFuIDIwMDMgMTQ6Mjg6NTAgR01UIi8+CisJCTwvd2lkZ2V0PgorCSAgICAgIDwvY2hpbGQ+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9Ikd0a1ZTZXBhcmF0b3IiIGlkPSJ2c2VwYXJhdG9yMyI+CisJCSAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCQk8L3dpZGdldD4KKwkgICAgICA8L2NoaWxkPgorCisJICAgICAgPGNoaWxkPgorCQk8d2lkZ2V0IGNsYXNzPSJidXR0b24iIGlkPSJidXR0b243Ij4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InRvb2x0aXAiIHRyYW5zbGF0YWJsZT0ieWVzIj5Db2xsYXBzZSB0aGUgd2hvbGUgdHJlZSBpbiB0aGUgcmlnaHQgZnJhbWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkNvbGxhcHNlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idXNlX3VuZGVybGluZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHNpZ25hbCBuYW1lPSJwcmVzc2VkIiBoYW5kbGVyPSJvbl9jb2xsYXBzZV9wcmVzc2VkIi8+CisJCTwvd2lkZ2V0PgorCSAgICAgIDwvY2hpbGQ+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9ImJ1dHRvbiIgaWQ9ImJ1dHRvbjgiPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0idG9vbHRpcCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkV4cGFuZCB0aGUgd2hvbGUgdHJlZSBpbiB0aGUgcmlnaHQgZnJhbWU8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJsYWJlbCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPkV4cGFuZDwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InVzZV91bmRlcmxpbmUiPlRydWU8L3Byb3BlcnR5PgorCQkgIDxzaWduYWwgbmFtZT0icHJlc3NlZCIgaGFuZGxlcj0ib25fZXhwYW5kX3ByZXNzZWQiLz4KKwkJPC93aWRnZXQ+CisJICAgICAgPC9jaGlsZD4KKwkgICAgPC93aWRnZXQ+CisJICA8L2NoaWxkPgorCTwvd2lkZ2V0PgorCTxwYWNraW5nPgorCSAgPHByb3BlcnR5IG5hbWU9InBhZGRpbmciPjA8L3Byb3BlcnR5PgorCSAgPHByb3BlcnR5IG5hbWU9ImV4cGFuZCI+RmFsc2U8L3Byb3BlcnR5PgorCSAgPHByb3BlcnR5IG5hbWU9ImZpbGwiPkZhbHNlPC9wcm9wZXJ0eT4KKwk8L3BhY2tpbmc+CisgICAgICA8L2NoaWxkPgorCisgICAgICA8Y2hpbGQ+CisJPHdpZGdldCBjbGFzcz0iR3RrSFBhbmVkIiBpZD0iaHBhbmVkMSI+CisJICA8cHJvcGVydHkgbmFtZT0id2lkdGhfcmVxdWVzdCI+MTwvcHJvcGVydHk+CisJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJICA8cHJvcGVydHkgbmFtZT0iY2FuX2ZvY3VzIj5UcnVlPC9wcm9wZXJ0eT4KKwkgIDxwcm9wZXJ0eSBuYW1lPSJwb3NpdGlvbiI+MDwvcHJvcGVydHk+CisKKwkgIDxjaGlsZD4KKwkgICAgPHdpZGdldCBjbGFzcz0iR3RrU2Nyb2xsZWRXaW5kb3ciIGlkPSJzY3JvbGxlZHdpbmRvdzEiPgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0iaHNjcm9sbGJhcl9wb2xpY3kiPkdUS19QT0xJQ1lfQUxXQVlTPC9wcm9wZXJ0eT4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0idnNjcm9sbGJhcl9wb2xpY3kiPkdUS19QT0xJQ1lfQUxXQVlTPC9wcm9wZXJ0eT4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0ic2hhZG93X3R5cGUiPkdUS19TSEFET1dfSU48L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ3aW5kb3dfcGxhY2VtZW50Ij5HVEtfQ09STkVSX1RPUF9MRUZUPC9wcm9wZXJ0eT4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iR3RrVHJlZVZpZXciIGlkPSJ0cmVldmlldzEiPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iY2FuX2ZvY3VzIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iaGVhZGVyc192aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0icnVsZXNfaGludCI+RmFsc2U8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJyZW9yZGVyYWJsZSI+RmFsc2U8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJlbmFibGVfc2VhcmNoIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8c2lnbmFsIG5hbWU9ImN1cnNvcl9jaGFuZ2VkIiBoYW5kbGVyPSJvbl90cmVldmlldzJfY3Vyc29yX2NoYW5nZWQiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IlN1biwgMTIgSmFuIDIwMDMgMTU6NTg6MjIgR01UIi8+CisJCSAgPHNpZ25hbCBuYW1lPSJidXR0b25fcHJlc3NfZXZlbnQiIGhhbmRsZXI9Im9uX3RyZWV2aWV3MV9idXR0b25fcHJlc3NfZXZlbnQiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IlN1biwgMTIgSmFuIDIwMDMgMTY6MDM6NTIgR01UIi8+CisJCSAgPHNpZ25hbCBuYW1lPSJrZXlfcHJlc3NfZXZlbnQiIGhhbmRsZXI9Im9uX3RyZWV2aWV3Ml9rZXlfcHJlc3NfZXZlbnQiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IlN1biwgMTIgSmFuIDIwMDMgMTY6MTE6NDQgR01UIi8+CisJCTwvd2lkZ2V0PgorCSAgICAgIDwvY2hpbGQ+CisJICAgIDwvd2lkZ2V0PgorCSAgICA8cGFja2luZz4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0ic2hyaW5rIj5UcnVlPC9wcm9wZXJ0eT4KKwkgICAgICA8cHJvcGVydHkgbmFtZT0icmVzaXplIj5GYWxzZTwvcHJvcGVydHk+CisJICAgIDwvcGFja2luZz4KKwkgIDwvY2hpbGQ+CisKKwkgIDxjaGlsZD4KKwkgICAgPHdpZGdldCBjbGFzcz0iR3RrVlBhbmVkIiBpZD0idnBhbmVkMSI+CisJICAgICAgPHByb3BlcnR5IG5hbWU9InZpc2libGUiPlRydWU8L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYW5fZm9jdXMiPlRydWU8L3Byb3BlcnR5PgorCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwb3NpdGlvbiI+MDwvcHJvcGVydHk+CisKKwkgICAgICA8Y2hpbGQ+CisJCTx3aWRnZXQgY2xhc3M9Ikd0a1Njcm9sbGVkV2luZG93IiBpZD0ic2Nyb2xsZWR3aW5kb3cyIj4KKwkJICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9ImhzY3JvbGxiYXJfcG9saWN5Ij5HVEtfUE9MSUNZX0FMV0FZUzwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InZzY3JvbGxiYXJfcG9saWN5Ij5HVEtfUE9MSUNZX0FMV0FZUzwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InNoYWRvd190eXBlIj5HVEtfU0hBRE9XX0lOPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0id2luZG93X3BsYWNlbWVudCI+R1RLX0NPUk5FUl9UT1BfTEVGVDwvcHJvcGVydHk+CisKKwkJICA8Y2hpbGQ+CisJCSAgICA8d2lkZ2V0IGNsYXNzPSJHdGtUcmVlVmlldyIgaWQ9InRyZWV2aWV3MiI+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImNhbl9mb2N1cyI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoYXNfZm9jdXMiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0iaGVhZGVyc192aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InJ1bGVzX2hpbnQiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InJlb3JkZXJhYmxlIj5GYWxzZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJlbmFibGVfc2VhcmNoIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHNpZ25hbCBuYW1lPSJjdXJzb3JfY2hhbmdlZCIgaGFuZGxlcj0ib25fdHJlZXZpZXcyX2N1cnNvcl9jaGFuZ2VkIiBsYXN0X21vZGlmaWNhdGlvbl90aW1lPSJTdW4sIDEyIEphbiAyMDAzIDE1OjU3OjU1IEdNVCIvPgorCQkgICAgICA8c2lnbmFsIG5hbWU9ImJ1dHRvbl9wcmVzc19ldmVudCIgaGFuZGxlcj0ib25fdHJlZXZpZXcyX2J1dHRvbl9wcmVzc19ldmVudCIgbGFzdF9tb2RpZmljYXRpb25fdGltZT0iU3VuLCAxMiBKYW4gMjAwMyAxNTo1Nzo1OCBHTVQiLz4KKwkJICAgICAgPHNpZ25hbCBuYW1lPSJrZXlfcHJlc3NfZXZlbnQiIGhhbmRsZXI9Im9uX3RyZWV2aWV3Ml9rZXlfcHJlc3NfZXZlbnQiIGxhc3RfbW9kaWZpY2F0aW9uX3RpbWU9IlN1biwgMTIgSmFuIDIwMDMgMTU6NTg6MDEgR01UIi8+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCQk8L3dpZGdldD4KKwkJPHBhY2tpbmc+CisJCSAgPHByb3BlcnR5IG5hbWU9InNocmluayI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InJlc2l6ZSI+RmFsc2U8L3Byb3BlcnR5PgorCQk8L3BhY2tpbmc+CisJICAgICAgPC9jaGlsZD4KKworCSAgICAgIDxjaGlsZD4KKwkJPHdpZGdldCBjbGFzcz0iR3RrU2Nyb2xsZWRXaW5kb3ciIGlkPSJzY3JvbGxlZHdpbmRvdzMiPgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICA8cHJvcGVydHkgbmFtZT0iaHNjcm9sbGJhcl9wb2xpY3kiPkdUS19QT0xJQ1lfTkVWRVI8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJ2c2Nyb2xsYmFyX3BvbGljeSI+R1RLX1BPTElDWV9BTFdBWVM8L3Byb3BlcnR5PgorCQkgIDxwcm9wZXJ0eSBuYW1lPSJzaGFkb3dfdHlwZSI+R1RLX1NIQURPV19JTjwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9IndpbmRvd19wbGFjZW1lbnQiPkdUS19DT1JORVJfVE9QX0xFRlQ8L3Byb3BlcnR5PgorCisJCSAgPGNoaWxkPgorCQkgICAgPHdpZGdldCBjbGFzcz0iR3RrVGV4dFZpZXciIGlkPSJ0ZXh0dmlldzMiPgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idmlzaWJsZSI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYW5fZm9jdXMiPlRydWU8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0iZWRpdGFibGUiPkZhbHNlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9Imp1c3RpZmljYXRpb24iPkdUS19KVVNUSUZZX0xFRlQ8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0id3JhcF9tb2RlIj5HVEtfV1JBUF9XT1JEPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImN1cnNvcl92aXNpYmxlIj5UcnVlPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InBpeGVsc19hYm92ZV9saW5lcyI+MDwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJwaXhlbHNfYmVsb3dfbGluZXMiPjA8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0icGl4ZWxzX2luc2lkZV93cmFwIj4wPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9ImxlZnRfbWFyZ2luIj4wPC9wcm9wZXJ0eT4KKwkJICAgICAgPHByb3BlcnR5IG5hbWU9InJpZ2h0X21hcmdpbiI+MDwvcHJvcGVydHk+CisJCSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpbmRlbnQiPjA8L3Byb3BlcnR5PgorCQkgICAgICA8cHJvcGVydHkgbmFtZT0idGV4dCIgdHJhbnNsYXRhYmxlPSJ5ZXMiPlNvcnJ5LCBubyBoZWxwIGF2YWlsYWJsZSBmb3IgdGhpcyBvcHRpb24geWV0LjwvcHJvcGVydHk+CisJCSAgICA8L3dpZGdldD4KKwkJICA8L2NoaWxkPgorCQk8L3dpZGdldD4KKwkJPHBhY2tpbmc+CisJCSAgPHByb3BlcnR5IG5hbWU9InNocmluayI+VHJ1ZTwvcHJvcGVydHk+CisJCSAgPHByb3BlcnR5IG5hbWU9InJlc2l6ZSI+VHJ1ZTwvcHJvcGVydHk+CisJCTwvcGFja2luZz4KKwkgICAgICA8L2NoaWxkPgorCSAgICA8L3dpZGdldD4KKwkgICAgPHBhY2tpbmc+CisJICAgICAgPHByb3BlcnR5IG5hbWU9InNocmluayI+VHJ1ZTwvcHJvcGVydHk+CisJICAgICAgPHByb3BlcnR5IG5hbWU9InJlc2l6ZSI+VHJ1ZTwvcHJvcGVydHk+CisJICAgIDwvcGFja2luZz4KKwkgIDwvY2hpbGQ+CisJPC93aWRnZXQ+CisJPHBhY2tpbmc+CisJICA8cHJvcGVydHkgbmFtZT0icGFkZGluZyI+MDwvcHJvcGVydHk+CisJICA8cHJvcGVydHkgbmFtZT0iZXhwYW5kIj5UcnVlPC9wcm9wZXJ0eT4KKwkgIDxwcm9wZXJ0eSBuYW1lPSJmaWxsIj5UcnVlPC9wcm9wZXJ0eT4KKwk8L3BhY2tpbmc+CisgICAgICA8L2NoaWxkPgorICAgIDwvd2lkZ2V0PgorICA8L2NoaWxkPgorPC93aWRnZXQ+CisKKzwvZ2xhZGUtaW50ZXJmYWNlPgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2ltYWdlcy5jIGIvc2NyaXB0cy9rY29uZmlnL2ltYWdlcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ0Zjg0YmQKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvaW1hZ2VzLmMKQEAgLTAsMCArMSwzMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+CisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KKyAqLworCitzdGF0aWMgY29uc3QgY2hhciAqeHBtX2xvYWRbXSA9IHsKKyIyMiAyMiA1IDEiLAorIi4gYyBOb25lIiwKKyIjIGMgIzAwMDAwMCIsCisiYyBjICM4MzgxMDAiLAorImEgYyAjZmZmZjAwIiwKKyJiIGMgI2ZmZmZmZiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uIyMjIy4uLi4jLiIsCisiLi4uLi4uLi4uLi4jLi4uLiMjLiMjLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uIyMjLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4jIyMjLiIsCisiLiMjIyMuLi4uLi4uLi4uLiMjIyMjLiIsCisiI2FiYWIjIyMjIyMjIyMjLi4uLi4uLiIsCisiI2JhYmFiYWJhYmFiYWIjLi4uLi4uLiIsCisiI2FiYWJhYmFiYWJhYmEjLi4uLi4uLiIsCisiI2JhYmFiYWJhYmFiYWIjLi4uLi4uLiIsCisiI2FiYWJhYiMjIyMjIyMjIyMjIyMjIyIsCisiI2JhYmFiIyNjY2NjY2NjY2NjY2MjIyIsCisiI2FiYWIjI2NjY2NjY2NjY2NjYyMjLiIsCisiI2JhYiMjY2NjY2NjY2NjY2NjIyMuLiIsCisiI2FiIyNjY2NjY2NjY2NjY2MjIy4uLiIsCisiI2IjI2NjY2NjY2NjY2NjYyMjLi4uLiIsCisiIyMjY2NjY2NjY2NjY2NjIyMuLi4uLiIsCisiIyNjY2NjY2NjY2NjY2MjIy4uLi4uLiIsCisiIyMjIyMjIyMjIyMjIyMjLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiJ9OworCitzdGF0aWMgY29uc3QgY2hhciAqeHBtX3NhdmVbXSA9IHsKKyIyMiAyMiA1IDEiLAorIi4gYyBOb25lIiwKKyIjIGMgIzAwMDAwMCIsCisiYSBjICM4MzgxMDAiLAorImIgYyAjYzVjMmM1IiwKKyJjIGMgI2NkYjZkNSIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLiMjIyMjIyMjIyMjIyMjIyMjIyMjLiIsCisiLiNhYSNiYmJiYmJiYmJiYmIjYmIjLiIsCisiLiNhYSNiYmJiYmJiYmJiYmIjYmIjLiIsCisiLiNhYSNiYmJiYmJiYmJjYmIjIyMjLiIsCisiLiNhYSNiYmJjY2JiYmJiYmIjYWEjLiIsCisiLiNhYSNiYmJjY2JiYmJiYmIjYWEjLiIsCisiLiNhYSNiYmJiYmJiYmJiYmIjYWEjLiIsCisiLiNhYSNiYmJiYmJiYmJiYmIjYWEjLiIsCisiLiNhYSNiYmJiYmJiYmJiYmIjYWEjLiIsCisiLiNhYSNiYmJiYmJiYmJiYmIjYWEjLiIsCisiLiNhYWEjIyMjIyMjIyMjIyNhYWEjLiIsCisiLiNhYWFhYWFhYWFhYWFhYWFhYWEjLiIsCisiLiNhYWFhYWFhYWFhYWFhYWFhYWEjLiIsCisiLiNhYWEjIyMjIyMjIyMjIyMjYWEjLiIsCisiLiNhYWEjIyMjIyMjIyNiYmIjYWEjLiIsCisiLiNhYWEjIyMjIyMjIyNiYmIjYWEjLiIsCisiLiNhYWEjIyMjIyMjIyNiYmIjYWEjLiIsCisiLiNhYWEjIyMjIyMjIyNiYmIjYWEjLiIsCisiLiNhYWEjIyMjIyMjIyNiYmIjYWEjLiIsCisiLi4jIyMjIyMjIyMjIyMjIyMjIyMuLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiJ9OworCitzdGF0aWMgY29uc3QgY2hhciAqeHBtX2JhY2tbXSA9IHsKKyIyMiAyMiAzIDEiLAorIi4gYyBOb25lIiwKKyIjIGMgIzAwMDA4MyIsCisiYSBjICM4MzgxODMiLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uIyMjIyMjYS4uLi4iLAorIi4uIy4uLi4uLiMjIyMjIyMjIyMuLi4iLAorIi4uIyMuLi4jIyMjLi4uLi4uIyNhLi4iLAorIi4uIyMjLiMjIy4uLi4uLi4uLiMjLi4iLAorIi4uIyMjIyMjLi4uLi4uLi4uLiMjLi4iLAorIi4uIyMjIyMuLi4uLi4uLi4uLiMjLi4iLAorIi4uIyMjIyMjLi4uLi4uLi4uLiMjLi4iLAorIi4uIyMjIyMjIy4uLi4uLi4uLiMjLi4iLAorIi4uIyMjIyMjIyMuLi4uLi4uIyNhLi4iLAorIi4uLi4uLi4uLi4uLi4uLmEjIyMuLi4iLAorIi4uLi4uLi4uLi4uLi4uLiMjIy4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4ifTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnhwbV90cmVlX3ZpZXdbXSA9IHsKKyIyMiAyMiAyIDEiLAorIi4gYyBOb25lIiwKKyIjIGMgIzAwMDAwMCIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIyMjIyMjIyMuLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIyMjIyMjIyMuLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIy4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uIyMjIyMjIyMuLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiIsCisiLi4uLi4uLi4uLi4uLi4uLi4uLi4uLiJ9OworCitzdGF0aWMgY29uc3QgY2hhciAqeHBtX3NpbmdsZV92aWV3W10gPSB7CisiMjIgMjIgMiAxIiwKKyIuIGMgTm9uZSIsCisiIyBjICMwMDAwMDAiLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4jLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4ifTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnhwbV9zcGxpdF92aWV3W10gPSB7CisiMjIgMjIgMiAxIiwKKyIuIGMgTm9uZSIsCisiIyBjICMwMDAwMDAiLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLiMuLi4uLi4jLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4iLAorIi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4ifTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnhwbV9zeW1ib2xfbm9bXSA9IHsKKyIxMiAxMiAyIDEiLAorIiAgYyB3aGl0ZSIsCisiLiBjIGJsYWNrIiwKKyIgICAgICAgICAgICAiLAorIiAuLi4uLi4uLi4uICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuICAgICAgICAuICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuICAgICAgICAuICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuLi4uLi4uLi4uICIsCisiICAgICAgICAgICAgIn07CisKK3N0YXRpYyBjb25zdCBjaGFyICp4cG1fc3ltYm9sX21vZFtdID0geworIjEyIDEyIDIgMSIsCisiICBjIHdoaXRlIiwKKyIuIGMgYmxhY2siLAorIiAgICAgICAgICAgICIsCisiIC4uLi4uLi4uLi4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuICAgICAgICAuICIsCisiIC4gICAuLiAgIC4gIiwKKyIgLiAgLi4uLiAgLiAiLAorIiAuICAuLi4uICAuICIsCisiIC4gICAuLiAgIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuICAgICAgICAuICIsCisiIC4uLi4uLi4uLi4gIiwKKyIgICAgICAgICAgICAifTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnhwbV9zeW1ib2xfeWVzW10gPSB7CisiMTIgMTIgMiAxIiwKKyIgIGMgd2hpdGUiLAorIi4gYyBibGFjayIsCisiICAgICAgICAgICAgIiwKKyIgLi4uLi4uLi4uLiAiLAorIiAuICAgICAgICAuICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAgICAgIC4gLiAiLAorIiAuICAgICAuLiAuICIsCisiIC4gLiAgLi4gIC4gIiwKKyIgLiAuLi4uICAgLiAiLAorIiAuICAuLiAgICAuICIsCisiIC4gICAgICAgIC4gIiwKKyIgLi4uLi4uLi4uLiAiLAorIiAgICAgICAgICAgICJ9OworCitzdGF0aWMgY29uc3QgY2hhciAqeHBtX2Nob2ljZV9ub1tdID0geworIjEyIDEyIDIgMSIsCisiICBjIHdoaXRlIiwKKyIuIGMgYmxhY2siLAorIiAgICAgICAgICAgICIsCisiICAgIC4uLi4gICAgIiwKKyIgIC4uICAgIC4uICAiLAorIiAgLiAgICAgIC4gICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuICAgICAgICAuICIsCisiIC4gICAgICAgIC4gIiwKKyIgIC4gICAgICAuICAiLAorIiAgLi4gICAgLi4gICIsCisiICAgIC4uLi4gICAgIiwKKyIgICAgICAgICAgICAifTsKKworc3RhdGljIGNvbnN0IGNoYXIgKnhwbV9jaG9pY2VfeWVzW10gPSB7CisiMTIgMTIgMiAxIiwKKyIgIGMgd2hpdGUiLAorIi4gYyBibGFjayIsCisiICAgICAgICAgICAgIiwKKyIgICAgLi4uLiAgICAiLAorIiAgLi4gICAgLi4gICIsCisiICAuICAgICAgLiAgIiwKKyIgLiAgIC4uICAgLiAiLAorIiAuICAuLi4uICAuICIsCisiIC4gIC4uLi4gIC4gIiwKKyIgLiAgIC4uICAgLiAiLAorIiAgLiAgICAgIC4gICIsCisiICAuLiAgICAuLiAgIiwKKyIgICAgLi4uLiAgICAiLAorIiAgICAgICAgICAgICJ9OworCitzdGF0aWMgY29uc3QgY2hhciAqeHBtX21lbnVbXSA9IHsKKyIxMiAxMiAyIDEiLAorIiAgYyB3aGl0ZSIsCisiLiBjIGJsYWNrIiwKKyIgICAgICAgICAgICAiLAorIiAuLi4uLi4uLi4uICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAuLiAgICAgLiAiLAorIiAuIC4uLi4gICAuICIsCisiIC4gLi4uLi4uIC4gIiwKKyIgLiAuLi4uLi4gLiAiLAorIiAuIC4uLi4gICAuICIsCisiIC4gLi4gICAgIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuLi4uLi4uLi4uICIsCisiICAgICAgICAgICAgIn07CisKK3N0YXRpYyBjb25zdCBjaGFyICp4cG1fbWVudV9pbnZbXSA9IHsKKyIxMiAxMiAyIDEiLAorIiAgYyB3aGl0ZSIsCisiLiBjIGJsYWNrIiwKKyIgICAgICAgICAgICAiLAorIiAuLi4uLi4uLi4uICIsCisiIC4uLi4uLi4uLi4gIiwKKyIgLi4gIC4uLi4uLiAiLAorIiAuLiAgICAuLi4uICIsCisiIC4uICAgICAgLi4gIiwKKyIgLi4gICAgICAuLiAiLAorIiAuLiAgICAuLi4uICIsCisiIC4uICAuLi4uLi4gIiwKKyIgLi4uLi4uLi4uLiAiLAorIiAuLi4uLi4uLi4uICIsCisiICAgICAgICAgICAgIn07CisKK3N0YXRpYyBjb25zdCBjaGFyICp4cG1fbWVudWJhY2tbXSA9IHsKKyIxMiAxMiAyIDEiLAorIiAgYyB3aGl0ZSIsCisiLiBjIGJsYWNrIiwKKyIgICAgICAgICAgICAiLAorIiAuLi4uLi4uLi4uICIsCisiIC4gICAgICAgIC4gIiwKKyIgLiAgICAgLi4gLiAiLAorIiAuICAgLi4uLiAuICIsCisiIC4gLi4uLi4uIC4gIiwKKyIgLiAuLi4uLi4gLiAiLAorIiAuICAgLi4uLiAuICIsCisiIC4gICAgIC4uIC4gIiwKKyIgLiAgICAgICAgLiAiLAorIiAuLi4uLi4uLi4uICIsCisiICAgICAgICAgICAgIn07CisKK3N0YXRpYyBjb25zdCBjaGFyICp4cG1fdm9pZFtdID0geworIjEyIDEyIDIgMSIsCisiICBjIHdoaXRlIiwKKyIuIGMgYmxhY2siLAorIiAgICAgICAgICAgICIsCisiICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICIsCisiICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICIsCisiICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAiLAorIiAgICAgICAgICAgICIsCisiICAgICAgICAgICAgIiwKKyIgICAgICAgICAgICAifTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9rY29uZmlnX2xvYWQuYyBiL3NjcmlwdHMva2NvbmZpZy9rY29uZmlnX2xvYWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmRjYWFkCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL2tjb25maWdfbG9hZC5jCkBAIC0wLDAgKzEsMzUgQEAKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJsa2MuaCIKKworI2RlZmluZSBQKG5hbWUsdHlwZSxhcmcpCXR5cGUgKCpuYW1lICMjIF9wKSBhcmcKKyNpbmNsdWRlICJsa2NfcHJvdG8uaCIKKyN1bmRlZiBQCisKK3ZvaWQga2NvbmZpZ19sb2FkKHZvaWQpCit7CisJdm9pZCAqaGFuZGxlOworCWNoYXIgKmVycm9yOworCisJaGFuZGxlID0gZGxvcGVuKCIuL2xpYmtjb25maWcuc28iLCBSVExEX0xBWlkpOworCWlmICghaGFuZGxlKSB7CisJCWhhbmRsZSA9IGRsb3BlbigiLi9zY3JpcHRzL2tjb25maWcvbGlia2NvbmZpZy5zbyIsIFJUTERfTEFaWSk7CisJCWlmICghaGFuZGxlKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBkbGVycm9yKCkpOworCQkJZXhpdCgxKTsKKwkJfQorCX0KKworI2RlZmluZSBQKG5hbWUsdHlwZSxhcmcpCQkJXAorewkJCQkJCVwKKwluYW1lICMjIF9wID0gZGxzeW0oaGFuZGxlLCAjbmFtZSk7CVwKKyAgICAgICAgaWYgKChlcnJvciA9IGRsZXJyb3IoKSkpICB7CQlcCisgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgZXJyb3IpOwlcCisJCWV4aXQoMSk7CQkJXAorCX0JCQkJCVwKK30KKyNpbmNsdWRlICJsa2NfcHJvdG8uaCIKKyN1bmRlZiBQCit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbGV4Lnpjb25mLmNfc2hpcHBlZCBiL3NjcmlwdHMva2NvbmZpZy9sZXguemNvbmYuY19zaGlwcGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyZGRhMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvbGV4Lnpjb25mLmNfc2hpcHBlZApAQCAtMCwwICsxLDM2ODggQEAKKworI2xpbmUgMyAibGV4Lnpjb25mLmMiCisKKyNkZWZpbmUgIFlZX0lOVF9BTElHTkVEIHNob3J0IGludAorCisvKiBBIGxleGljYWwgc2Nhbm5lciBnZW5lcmF0ZWQgYnkgZmxleCAqLworCisjZGVmaW5lIEZMRVhfU0NBTk5FUgorI2RlZmluZSBZWV9GTEVYX01BSk9SX1ZFUlNJT04gMgorI2RlZmluZSBZWV9GTEVYX01JTk9SX1ZFUlNJT04gNQorI2RlZmluZSBZWV9GTEVYX1NVQk1JTk9SX1ZFUlNJT04gMzEKKyNpZiBZWV9GTEVYX1NVQk1JTk9SX1ZFUlNJT04gPiAwCisjZGVmaW5lIEZMRVhfQkVUQQorI2VuZGlmCisKKy8qIEZpcnN0LCB3ZSBkZWFsIHdpdGggIHBsYXRmb3JtLXNwZWNpZmljIG9yIGNvbXBpbGVyLXNwZWNpZmljIGlzc3Vlcy4gKi8KKworLyogYmVnaW4gc3RhbmRhcmQgQyBoZWFkZXJzLiAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworLyogZW5kIHN0YW5kYXJkIEMgaGVhZGVycy4gKi8KKworLyogZmxleCBpbnRlZ2VyIHR5cGUgZGVmaW5pdGlvbnMgKi8KKworI2lmbmRlZiBGTEVYSU5UX0gKKyNkZWZpbmUgRkxFWElOVF9ICisKKy8qIEM5OSBzeXN0ZW1zIGhhdmUgPGludHR5cGVzLmg+LiBOb24tQzk5IHN5c3RlbXMgbWF5IG9yIG1heSBub3QuICovCisKKyNpZiBkZWZpbmVkIF9fU1REQ19WRVJTSU9OX18gJiYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KK3R5cGVkZWYgaW50OF90IGZsZXhfaW50OF90OwordHlwZWRlZiB1aW50OF90IGZsZXhfdWludDhfdDsKK3R5cGVkZWYgaW50MTZfdCBmbGV4X2ludDE2X3Q7Cit0eXBlZGVmIHVpbnQxNl90IGZsZXhfdWludDE2X3Q7Cit0eXBlZGVmIGludDMyX3QgZmxleF9pbnQzMl90OwordHlwZWRlZiB1aW50MzJfdCBmbGV4X3VpbnQzMl90OworI2Vsc2UKK3R5cGVkZWYgc2lnbmVkIGNoYXIgZmxleF9pbnQ4X3Q7Cit0eXBlZGVmIHNob3J0IGludCBmbGV4X2ludDE2X3Q7Cit0eXBlZGVmIGludCBmbGV4X2ludDMyX3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgZmxleF91aW50OF90OyAKK3R5cGVkZWYgdW5zaWduZWQgc2hvcnQgaW50IGZsZXhfdWludDE2X3Q7Cit0eXBlZGVmIHVuc2lnbmVkIGludCBmbGV4X3VpbnQzMl90OworI2VuZGlmIC8qICEgQzk5ICovCisKKy8qIExpbWl0cyBvZiBpbnRlZ3JhbCB0eXBlcy4gKi8KKyNpZm5kZWYgSU5UOF9NSU4KKyNkZWZpbmUgSU5UOF9NSU4gICAgICAgICAgICAgICAoLTEyOCkKKyNlbmRpZgorI2lmbmRlZiBJTlQxNl9NSU4KKyNkZWZpbmUgSU5UMTZfTUlOICAgICAgICAgICAgICAoLTMyNzY3LTEpCisjZW5kaWYKKyNpZm5kZWYgSU5UMzJfTUlOCisjZGVmaW5lIElOVDMyX01JTiAgICAgICAgICAgICAgKC0yMTQ3NDgzNjQ3LTEpCisjZW5kaWYKKyNpZm5kZWYgSU5UOF9NQVgKKyNkZWZpbmUgSU5UOF9NQVggICAgICAgICAgICAgICAoMTI3KQorI2VuZGlmCisjaWZuZGVmIElOVDE2X01BWAorI2RlZmluZSBJTlQxNl9NQVggICAgICAgICAgICAgICgzMjc2NykKKyNlbmRpZgorI2lmbmRlZiBJTlQzMl9NQVgKKyNkZWZpbmUgSU5UMzJfTUFYICAgICAgICAgICAgICAoMjE0NzQ4MzY0NykKKyNlbmRpZgorI2lmbmRlZiBVSU5UOF9NQVgKKyNkZWZpbmUgVUlOVDhfTUFYICAgICAgICAgICAgICAoMjU1VSkKKyNlbmRpZgorI2lmbmRlZiBVSU5UMTZfTUFYCisjZGVmaW5lIFVJTlQxNl9NQVggICAgICAgICAgICAgKDY1NTM1VSkKKyNlbmRpZgorI2lmbmRlZiBVSU5UMzJfTUFYCisjZGVmaW5lIFVJTlQzMl9NQVggICAgICAgICAgICAgKDQyOTQ5NjcyOTVVKQorI2VuZGlmCisKKyNlbmRpZiAvKiAhIEZMRVhJTlRfSCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKKworLyogVGhlICJjb25zdCIgc3RvcmFnZS1jbGFzcy1tb2RpZmllciBpcyB2YWxpZC4gKi8KKyNkZWZpbmUgWVlfVVNFX0NPTlNUCisKKyNlbHNlCS8qICEgX19jcGx1c3BsdXMgKi8KKworI2lmIF9fU1REQ19fCisKKyNkZWZpbmUgWVlfVVNFX0NPTlNUCisKKyNlbmRpZgkvKiBfX1NURENfXyAqLworI2VuZGlmCS8qICEgX19jcGx1c3BsdXMgKi8KKworI2lmZGVmIFlZX1VTRV9DT05TVAorI2RlZmluZSB5eWNvbnN0IGNvbnN0CisjZWxzZQorI2RlZmluZSB5eWNvbnN0CisjZW5kaWYKKworLyogUmV0dXJuZWQgdXBvbiBlbmQtb2YtZmlsZS4gKi8KKyNkZWZpbmUgWVlfTlVMTCAwCisKKy8qIFByb21vdGVzIGEgcG9zc2libHkgbmVnYXRpdmUsIHBvc3NpYmx5IHNpZ25lZCBjaGFyIHRvIGFuIHVuc2lnbmVkCisgKiBpbnRlZ2VyIGZvciB1c2UgYXMgYW4gYXJyYXkgaW5kZXguICBJZiB0aGUgc2lnbmVkIGNoYXIgaXMgbmVnYXRpdmUsCisgKiB3ZSB3YW50IHRvIGluc3RlYWQgdHJlYXQgaXQgYXMgYW4gOC1iaXQgdW5zaWduZWQgY2hhciwgaGVuY2UgdGhlCisgKiBkb3VibGUgY2FzdC4KKyAqLworI2RlZmluZSBZWV9TQ19UT19VSShjKSAoKHVuc2lnbmVkIGludCkgKHVuc2lnbmVkIGNoYXIpIGMpCisKKy8qIEVudGVyIGEgc3RhcnQgY29uZGl0aW9uLiAgVGhpcyBtYWNybyByZWFsbHkgb3VnaHQgdG8gdGFrZSBhIHBhcmFtZXRlciwKKyAqIGJ1dCB3ZSBkbyBpdCB0aGUgZGlzZ3VzdGluZyBjcnVmdHkgd2F5IGZvcmNlZCBvbiB1cyBieSB0aGUgKCktbGVzcworICogZGVmaW5pdGlvbiBvZiBCRUdJTi4KKyAqLworI2RlZmluZSBCRUdJTiAoeXlfc3RhcnQpID0gMSArIDIgKgorCisvKiBUcmFuc2xhdGUgdGhlIGN1cnJlbnQgc3RhcnQgc3RhdGUgaW50byBhIHZhbHVlIHRoYXQgY2FuIGJlIGxhdGVyIGhhbmRlZAorICogdG8gQkVHSU4gdG8gcmV0dXJuIHRvIHRoZSBzdGF0ZS4gIFRoZSBZWVNUQVRFIGFsaWFzIGlzIGZvciBsZXgKKyAqIGNvbXBhdGliaWxpdHkuCisgKi8KKyNkZWZpbmUgWVlfU1RBUlQgKCgoeXlfc3RhcnQpIC0gMSkgLyAyKQorI2RlZmluZSBZWVNUQVRFIFlZX1NUQVJUCisKKy8qIEFjdGlvbiBudW1iZXIgZm9yIEVPRiBydWxlIG9mIGEgZ2l2ZW4gc3RhcnQgc3RhdGUuICovCisjZGVmaW5lIFlZX1NUQVRFX0VPRihzdGF0ZSkgKFlZX0VORF9PRl9CVUZGRVIgKyBzdGF0ZSArIDEpCisKKy8qIFNwZWNpYWwgYWN0aW9uIG1lYW5pbmcgInN0YXJ0IHByb2Nlc3NpbmcgYSBuZXcgZmlsZSIuICovCisjZGVmaW5lIFlZX05FV19GSUxFIHpjb25mcmVzdGFydCh6Y29uZmluICApCisKKyNkZWZpbmUgWVlfRU5EX09GX0JVRkZFUl9DSEFSIDAKKworLyogU2l6ZSBvZiBkZWZhdWx0IGlucHV0IGJ1ZmZlci4gKi8KKyNpZm5kZWYgWVlfQlVGX1NJWkUKKyNkZWZpbmUgWVlfQlVGX1NJWkUgMTYzODQKKyNlbmRpZgorCisjaWZuZGVmIFlZX1RZUEVERUZfWVlfQlVGRkVSX1NUQVRFCisjZGVmaW5lIFlZX1RZUEVERUZfWVlfQlVGRkVSX1NUQVRFCit0eXBlZGVmIHN0cnVjdCB5eV9idWZmZXJfc3RhdGUgKllZX0JVRkZFUl9TVEFURTsKKyNlbmRpZgorCitleHRlcm4gaW50IHpjb25mbGVuZzsKKworZXh0ZXJuIEZJTEUgKnpjb25maW4sICp6Y29uZm91dDsKKworI2RlZmluZSBFT0JfQUNUX0NPTlRJTlVFX1NDQU4gMAorI2RlZmluZSBFT0JfQUNUX0VORF9PRl9GSUxFIDEKKyNkZWZpbmUgRU9CX0FDVF9MQVNUX01BVENIIDIKKworICAgICNkZWZpbmUgWVlfTEVTU19MSU5FTk8obikKKyAgICAKKy8qIFJldHVybiBhbGwgYnV0IHRoZSBmaXJzdCAibiIgbWF0Y2hlZCBjaGFyYWN0ZXJzIGJhY2sgdG8gdGhlIGlucHV0IHN0cmVhbS4gKi8KKyNkZWZpbmUgeXlsZXNzKG4pIFwKKwlkbyBcCisJCXsgXAorCQkvKiBVbmRvIGVmZmVjdHMgb2Ygc2V0dGluZyB1cCB6Y29uZnRleHQuICovIFwKKyAgICAgICAgaW50IHl5bGVzc19tYWNyb19hcmcgPSAobik7IFwKKyAgICAgICAgWVlfTEVTU19MSU5FTk8oeXlsZXNzX21hY3JvX2FyZyk7XAorCQkqeXlfY3AgPSAoeXlfaG9sZF9jaGFyKTsgXAorCQlZWV9SRVNUT1JFX1lZX01PUkVfT0ZGU0VUIFwKKwkJKHl5X2NfYnVmX3ApID0geXlfY3AgPSB5eV9icCArIHl5bGVzc19tYWNyb19hcmcgLSBZWV9NT1JFX0FESjsgXAorCQlZWV9ET19CRUZPUkVfQUNUSU9OOyAvKiBzZXQgdXAgemNvbmZ0ZXh0IGFnYWluICovIFwKKwkJfSBcCisJd2hpbGUgKCAwICkKKworI2RlZmluZSB1bnB1dChjKSB5eXVucHV0KCBjLCAoeXl0ZXh0X3B0cikgICkKKworLyogVGhlIGZvbGxvd2luZyBpcyBiZWNhdXNlIHdlIGNhbm5vdCBwb3J0YWJseSBnZXQgb3VyIGhhbmRzIG9uIHNpemVfdAorICogKHdpdGhvdXQgYXV0b2NvbmYncyBoZWxwLCB3aGljaCBpc24ndCBhdmFpbGFibGUgYmVjYXVzZSB3ZSB3YW50CisgKiBmbGV4LWdlbmVyYXRlZCBzY2FubmVycyB0byBjb21waWxlIG9uIHRoZWlyIG93bikuCisgKi8KKworI2lmbmRlZiBZWV9UWVBFREVGX1lZX1NJWkVfVAorI2RlZmluZSBZWV9UWVBFREVGX1lZX1NJWkVfVAordHlwZWRlZiB1bnNpZ25lZCBpbnQgeXlfc2l6ZV90OworI2VuZGlmCisKKyNpZm5kZWYgWVlfU1RSVUNUX1lZX0JVRkZFUl9TVEFURQorI2RlZmluZSBZWV9TVFJVQ1RfWVlfQlVGRkVSX1NUQVRFCitzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlCisJeworCUZJTEUgKnl5X2lucHV0X2ZpbGU7CisKKwljaGFyICp5eV9jaF9idWY7CQkvKiBpbnB1dCBidWZmZXIgKi8KKwljaGFyICp5eV9idWZfcG9zOwkJLyogY3VycmVudCBwb3NpdGlvbiBpbiBpbnB1dCBidWZmZXIgKi8KKworCS8qIFNpemUgb2YgaW5wdXQgYnVmZmVyIGluIGJ5dGVzLCBub3QgaW5jbHVkaW5nIHJvb20gZm9yIEVPQgorCSAqIGNoYXJhY3RlcnMuCisJICovCisJeXlfc2l6ZV90IHl5X2J1Zl9zaXplOworCisJLyogTnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCBpbnRvIHl5X2NoX2J1Ziwgbm90IGluY2x1ZGluZyBFT0IKKwkgKiBjaGFyYWN0ZXJzLgorCSAqLworCWludCB5eV9uX2NoYXJzOworCisJLyogV2hldGhlciB3ZSAib3duIiB0aGUgYnVmZmVyIC0gaS5lLiwgd2Uga25vdyB3ZSBjcmVhdGVkIGl0LAorCSAqIGFuZCBjYW4gcmVhbGxvYygpIGl0IHRvIGdyb3cgaXQsIGFuZCBzaG91bGQgZnJlZSgpIGl0IHRvCisJICogZGVsZXRlIGl0LgorCSAqLworCWludCB5eV9pc19vdXJfYnVmZmVyOworCisJLyogV2hldGhlciB0aGlzIGlzIGFuICJpbnRlcmFjdGl2ZSIgaW5wdXQgc291cmNlOyBpZiBzbywgYW5kCisJICogaWYgd2UncmUgdXNpbmcgc3RkaW8gZm9yIGlucHV0LCB0aGVuIHdlIHdhbnQgdG8gdXNlIGdldGMoKQorCSAqIGluc3RlYWQgb2YgZnJlYWQoKSwgdG8gbWFrZSBzdXJlIHdlIHN0b3AgZmV0Y2hpbmcgaW5wdXQgYWZ0ZXIKKwkgKiBlYWNoIG5ld2xpbmUuCisJICovCisJaW50IHl5X2lzX2ludGVyYWN0aXZlOworCisJLyogV2hldGhlciB3ZSdyZSBjb25zaWRlcmVkIHRvIGJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBsaW5lLgorCSAqIElmIHNvLCAnXicgcnVsZXMgd2lsbCBiZSBhY3RpdmUgb24gdGhlIG5leHQgbWF0Y2gsIG90aGVyd2lzZQorCSAqIG5vdC4KKwkgKi8KKwlpbnQgeXlfYXRfYm9sOworCisgICAgaW50IHl5X2JzX2xpbmVubzsgLyoqPCBUaGUgbGluZSBjb3VudC4gKi8KKyAgICBpbnQgeXlfYnNfY29sdW1uOyAvKio8IFRoZSBjb2x1bW4gY291bnQuICovCisgICAgCisJLyogV2hldGhlciB0byB0cnkgdG8gZmlsbCB0aGUgaW5wdXQgYnVmZmVyIHdoZW4gd2UgcmVhY2ggdGhlCisJICogZW5kIG9mIGl0LgorCSAqLworCWludCB5eV9maWxsX2J1ZmZlcjsKKworCWludCB5eV9idWZmZXJfc3RhdHVzOworCisjZGVmaW5lIFlZX0JVRkZFUl9ORVcgMAorI2RlZmluZSBZWV9CVUZGRVJfTk9STUFMIDEKKwkvKiBXaGVuIGFuIEVPRidzIGJlZW4gc2VlbiBidXQgdGhlcmUncyBzdGlsbCBzb21lIHRleHQgdG8gcHJvY2VzcworCSAqIHRoZW4gd2UgbWFyayB0aGUgYnVmZmVyIGFzIFlZX0VPRl9QRU5ESU5HLCB0byBpbmRpY2F0ZSB0aGF0IHdlCisJICogc2hvdWxkbid0IHRyeSByZWFkaW5nIGZyb20gdGhlIGlucHV0IHNvdXJjZSBhbnkgbW9yZS4gIFdlIG1pZ2h0CisJICogc3RpbGwgaGF2ZSBhIGJ1bmNoIG9mIHRva2VucyB0byBtYXRjaCwgdGhvdWdoLCBiZWNhdXNlIG9mCisJICogcG9zc2libGUgYmFja2luZy11cC4KKwkgKgorCSAqIFdoZW4gd2UgYWN0dWFsbHkgc2VlIHRoZSBFT0YsIHdlIGNoYW5nZSB0aGUgc3RhdHVzIHRvICJuZXciCisJICogKHZpYSB6Y29uZnJlc3RhcnQoKSksIHNvIHRoYXQgdGhlIHVzZXIgY2FuIGNvbnRpbnVlIHNjYW5uaW5nIGJ5CisJICoganVzdCBwb2ludGluZyB6Y29uZmluIGF0IGEgbmV3IGlucHV0IGZpbGUuCisJICovCisjZGVmaW5lIFlZX0JVRkZFUl9FT0ZfUEVORElORyAyCisKKwl9OworI2VuZGlmIC8qICFZWV9TVFJVQ1RfWVlfQlVGRkVSX1NUQVRFICovCisKKy8qIFN0YWNrIG9mIGlucHV0IGJ1ZmZlcnMuICovCitzdGF0aWMgc2l6ZV90IHl5X2J1ZmZlcl9zdGFja190b3AgPSAwOyAvKio8IGluZGV4IG9mIHRvcCBvZiBzdGFjay4gKi8KK3N0YXRpYyBzaXplX3QgeXlfYnVmZmVyX3N0YWNrX21heCA9IDA7IC8qKjwgY2FwYWNpdHkgb2Ygc3RhY2suICovCitzdGF0aWMgWVlfQlVGRkVSX1NUQVRFICogeXlfYnVmZmVyX3N0YWNrID0gMDsgLyoqPCBTdGFjayBhcyBhbiBhcnJheS4gKi8KKworLyogV2UgcHJvdmlkZSBtYWNyb3MgZm9yIGFjY2Vzc2luZyBidWZmZXIgc3RhdGVzIGluIGNhc2UgaW4gdGhlCisgKiBmdXR1cmUgd2Ugd2FudCB0byBwdXQgdGhlIGJ1ZmZlciBzdGF0ZXMgaW4gYSBtb3JlIGdlbmVyYWwKKyAqICJzY2FubmVyIHN0YXRlIi4KKyAqCisgKiBSZXR1cm5zIHRoZSB0b3Agb2YgdGhlIHN0YWNrLCBvciBOVUxMLgorICovCisjZGVmaW5lIFlZX0NVUlJFTlRfQlVGRkVSICggKHl5X2J1ZmZlcl9zdGFjaykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICA/ICh5eV9idWZmZXJfc3RhY2spWyh5eV9idWZmZXJfc3RhY2tfdG9wKV0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEwpCisKKy8qIFNhbWUgYXMgcHJldmlvdXMgbWFjcm8sIGJ1dCB1c2VmdWwgd2hlbiB3ZSBrbm93IHRoYXQgdGhlIGJ1ZmZlciBzdGFjayBpcyBub3QKKyAqIE5VTEwgb3Igd2hlbiB3ZSBuZWVkIGFuIGx2YWx1ZS4gRm9yIGludGVybmFsIHVzZSBvbmx5LgorICovCisjZGVmaW5lIFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSAoeXlfYnVmZmVyX3N0YWNrKVsoeXlfYnVmZmVyX3N0YWNrX3RvcCldCisKKy8qIHl5X2hvbGRfY2hhciBob2xkcyB0aGUgY2hhcmFjdGVyIGxvc3Qgd2hlbiB6Y29uZnRleHQgaXMgZm9ybWVkLiAqLworc3RhdGljIGNoYXIgeXlfaG9sZF9jaGFyOworc3RhdGljIGludCB5eV9uX2NoYXJzOwkJLyogbnVtYmVyIG9mIGNoYXJhY3RlcnMgcmVhZCBpbnRvIHl5X2NoX2J1ZiAqLworaW50IHpjb25mbGVuZzsKKworLyogUG9pbnRzIHRvIGN1cnJlbnQgY2hhcmFjdGVyIGluIGJ1ZmZlci4gKi8KK3N0YXRpYyBjaGFyICp5eV9jX2J1Zl9wID0gKGNoYXIgKikgMDsKK3N0YXRpYyBpbnQgeXlfaW5pdCA9IDE7CQkvKiB3aGV0aGVyIHdlIG5lZWQgdG8gaW5pdGlhbGl6ZSAqLworc3RhdGljIGludCB5eV9zdGFydCA9IDA7CS8qIHN0YXJ0IHN0YXRlIG51bWJlciAqLworCisvKiBGbGFnIHdoaWNoIGlzIHVzZWQgdG8gYWxsb3cgemNvbmZ3cmFwKCkncyB0byBkbyBidWZmZXIgc3dpdGNoZXMKKyAqIGluc3RlYWQgb2Ygc2V0dGluZyB1cCBhIGZyZXNoIHpjb25maW4uICBBIGJpdCBvZiBhIGhhY2sgLi4uCisgKi8KK3N0YXRpYyBpbnQgeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mOworCit2b2lkIHpjb25mcmVzdGFydCAoRklMRSAqaW5wdXRfZmlsZSAgKTsKK3ZvaWQgemNvbmZfc3dpdGNoX3RvX2J1ZmZlciAoWVlfQlVGRkVSX1NUQVRFIG5ld19idWZmZXIgICk7CitZWV9CVUZGRVJfU1RBVEUgemNvbmZfY3JlYXRlX2J1ZmZlciAoRklMRSAqZmlsZSxpbnQgc2l6ZSAgKTsKK3ZvaWQgemNvbmZfZGVsZXRlX2J1ZmZlciAoWVlfQlVGRkVSX1NUQVRFIGIgICk7Cit2b2lkIHpjb25mX2ZsdXNoX2J1ZmZlciAoWVlfQlVGRkVSX1NUQVRFIGIgICk7Cit2b2lkIHpjb25mcHVzaF9idWZmZXJfc3RhdGUgKFlZX0JVRkZFUl9TVEFURSBuZXdfYnVmZmVyICApOwordm9pZCB6Y29uZnBvcF9idWZmZXJfc3RhdGUgKHZvaWQgKTsKKworc3RhdGljIHZvaWQgemNvbmZlbnN1cmVfYnVmZmVyX3N0YWNrICh2b2lkICk7CitzdGF0aWMgdm9pZCB6Y29uZl9sb2FkX2J1ZmZlcl9zdGF0ZSAodm9pZCApOworc3RhdGljIHZvaWQgemNvbmZfaW5pdF9idWZmZXIgKFlZX0JVRkZFUl9TVEFURSBiLEZJTEUgKmZpbGUgICk7CisKKyNkZWZpbmUgWVlfRkxVU0hfQlVGRkVSIHpjb25mX2ZsdXNoX2J1ZmZlcihZWV9DVVJSRU5UX0JVRkZFUiApCisKK1lZX0JVRkZFUl9TVEFURSB6Y29uZl9zY2FuX2J1ZmZlciAoY2hhciAqYmFzZSx5eV9zaXplX3Qgc2l6ZSAgKTsKK1lZX0JVRkZFUl9TVEFURSB6Y29uZl9zY2FuX3N0cmluZyAoeXljb25zdCBjaGFyICp5eV9zdHIgICk7CitZWV9CVUZGRVJfU1RBVEUgemNvbmZfc2Nhbl9ieXRlcyAoeXljb25zdCBjaGFyICpieXRlcyxpbnQgbGVuICApOworCit2b2lkICp6Y29uZmFsbG9jICh5eV9zaXplX3QgICk7Cit2b2lkICp6Y29uZnJlYWxsb2MgKHZvaWQgKix5eV9zaXplX3QgICk7Cit2b2lkIHpjb25mZnJlZSAodm9pZCAqICApOworCisjZGVmaW5lIHl5X25ld19idWZmZXIgemNvbmZfY3JlYXRlX2J1ZmZlcgorCisjZGVmaW5lIHl5X3NldF9pbnRlcmFjdGl2ZShpc19pbnRlcmFjdGl2ZSkgXAorCXsgXAorCWlmICggISBZWV9DVVJSRU5UX0JVRkZFUiApeyBcCisgICAgICAgIHpjb25mZW5zdXJlX2J1ZmZlcl9zdGFjayAoKTsgXAorCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPSAgICBcCisgICAgICAgICAgICB6Y29uZl9jcmVhdGVfYnVmZmVyKHpjb25maW4sWVlfQlVGX1NJWkUgKTsgXAorCX0gXAorCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfaXNfaW50ZXJhY3RpdmUgPSBpc19pbnRlcmFjdGl2ZTsgXAorCX0KKworI2RlZmluZSB5eV9zZXRfYm9sKGF0X2JvbCkgXAorCXsgXAorCWlmICggISBZWV9DVVJSRU5UX0JVRkZFUiApe1wKKyAgICAgICAgemNvbmZlbnN1cmVfYnVmZmVyX3N0YWNrICgpOyBcCisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9ICAgIFwKKyAgICAgICAgICAgIHpjb25mX2NyZWF0ZV9idWZmZXIoemNvbmZpbixZWV9CVUZfU0laRSApOyBcCisJfSBcCisJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9hdF9ib2wgPSBhdF9ib2w7IFwKKwl9CisKKyNkZWZpbmUgWVlfQVRfQk9MKCkgKFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYXRfYm9sKQorCisvKiBCZWdpbiB1c2VyIHNlY3QzICovCisKKyNkZWZpbmUgemNvbmZ3cmFwKG4pIDEKKyNkZWZpbmUgWVlfU0tJUF9ZWVdSQVAKKwordHlwZWRlZiB1bnNpZ25lZCBjaGFyIFlZX0NIQVI7CisKK0ZJTEUgKnpjb25maW4gPSAoRklMRSAqKSAwLCAqemNvbmZvdXQgPSAoRklMRSAqKSAwOworCit0eXBlZGVmIGludCB5eV9zdGF0ZV90eXBlOworCitleHRlcm4gaW50IHpjb25mbGluZW5vOworCitpbnQgemNvbmZsaW5lbm8gPSAxOworCitleHRlcm4gY2hhciAqemNvbmZ0ZXh0OworI2RlZmluZSB5eXRleHRfcHRyIHpjb25mdGV4dAorc3RhdGljIHl5Y29uc3QgZmxleF9pbnQxNl90IHl5X254dFtdWzM4XSA9CisgICAgeworICAgIHsKKyAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKKyAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKKyAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwKKyAgICAgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMCwgICAgMAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgMTIsICAgMTMsICAgMTQsICAgMTIsICAgMTIsICAgMTUsICAgMTIsICAgMTIsICAgMTIsCisgICAgICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsCisgICAgICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsCisgICAgICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDEyLCAgIDEzLCAgIDE0LCAgIDEyLCAgIDEyLCAgIDE1LCAgIDEyLCAgIDEyLCAgIDEyLAorICAgICAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLCAgIDEyLAorCisgICAgICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsCisgICAgICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIsICAgMTIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDE2LCAgIDE2LCAgIDE3LCAgIDE2LCAgIDE2LCAgIDE2LCAgIDE2LCAgIDE2LCAgIDE2LAorICAgICAgIDE2LCAgIDE2LCAgIDE2LCAgIDE4LCAgIDE2LCAgIDE2LCAgIDE4LCAgIDE4LCAgIDE5LCAgIDIwLAorICAgICAgIDIxLCAgIDIyLCAgIDE4LCAgIDE4LCAgIDIzLCAgIDI0LCAgIDE4LCAgIDI1LCAgIDE4LCAgIDI2LAorICAgICAgIDI3LCAgIDE4LCAgIDI4LCAgIDI5LCAgIDMwLCAgIDE4LCAgIDE4LCAgIDE2CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICAxNiwgICAxNiwgICAxNywgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwgICAxNiwKKyAgICAgICAxNiwgICAxNiwgICAxNiwgICAxOCwgICAxNiwgICAxNiwgICAxOCwgICAxOCwgICAxOSwgICAyMCwKKyAgICAgICAyMSwgICAyMiwgICAxOCwgICAxOCwgICAyMywgICAyNCwgICAxOCwgICAyNSwgICAxOCwgICAyNiwKKyAgICAgICAyNywgICAxOCwgICAyOCwgICAyOSwgICAzMCwgICAxOCwgICAxOCwgICAxNgorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICAzMSwgICAzMiwgICAzMywgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwKKyAgICAgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwKKyAgICAgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwKKyAgICAgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMSwgICAzMQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgMzEsICAgMzIsICAgMzMsICAgMzEsICAgMzEsICAgMzEsICAgMzEsICAgMzEsICAgMzEsCisgICAgICAgMzEsICAgMzEsICAgMzEsICAgMzEsICAgMzEsICAgMzEsICAgMzEsICAgMzEsICAgMzEsICAgMzEsCisgICAgICAgMzEsICAgMzEsICAgMzEsICAgMzEsICAgMzEsICAgMzEsICAgMzEsICAgMzEsICAgMzEsICAgMzEsCisgICAgICAgMzEsICAgMzEsICAgMzEsICAgMzEsICAgMzEsICAgMzEsICAgMzEsICAgMzEKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDM0LCAgIDM0LCAgIDM1LCAgIDM0LCAgIDM2LCAgIDM0LCAgIDM0LCAgIDM2LCAgIDM0LAorICAgICAgIDM0LCAgIDM0LCAgIDM0LCAgIDM0LCAgIDM0LCAgIDM3LCAgIDM0LCAgIDM0LCAgIDM0LCAgIDM0LAorCisgICAgICAgMzQsICAgMzQsICAgMzQsICAgMzQsICAgMzQsICAgMzQsICAgMzQsICAgMzQsICAgMzQsICAgMzQsCisgICAgICAgMzQsICAgMzQsICAgMzQsICAgMzQsICAgMzQsICAgMzQsICAgMzQsICAgMzQKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDM0LCAgIDM0LCAgIDM1LCAgIDM0LCAgIDM2LCAgIDM0LCAgIDM0LCAgIDM2LCAgIDM0LAorICAgICAgIDM0LCAgIDM0LCAgIDM0LCAgIDM0LCAgIDM0LCAgIDM3LCAgIDM0LCAgIDM0LCAgIDM0LCAgIDM0LAorICAgICAgIDM0LCAgIDM0LCAgIDM0LCAgIDM0LCAgIDM0LCAgIDM0LCAgIDM0LCAgIDM0LCAgIDM0LCAgIDM0LAorICAgICAgIDM0LCAgIDM0LCAgIDM0LCAgIDM0LCAgIDM0LCAgIDM0LCAgIDM0LCAgIDM0CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICAzOCwgICAzOCwgICAzOSwgICA0MCwgICA0MSwgICA0MiwgICA0MywgICA0MSwgICA0NCwKKyAgICAgICA0NSwgICA0NiwgICA0NywgICA0NywgICA0OCwgICA0OSwgICA0NywgICA0NywgICA0NywgICA0NywKKyAgICAgICA0NywgICA0NywgICA0NywgICA0NywgICA0NywgICA1MCwgICA0NywgICA0NywgICA0NywgICA1MSwKKyAgICAgICA0NywgICA0NywgICA0NywgICA0NywgICA0NywgICA0NywgICA0NywgICA1MgorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICAzOCwgICAzOCwgICAzOSwgICA0MCwgICA0MSwgICA0MiwgICA0MywgICA0MSwgICA0NCwKKyAgICAgICA0NSwgICA0NiwgICA0NywgICA0NywgICA0OCwgICA0OSwgICA0NywgICA0NywgICA0NywgICA0NywKKyAgICAgICA0NywgICA0NywgICA0NywgICA0NywgICA0NywgICA1MCwgICA0NywgICA0NywgICA0NywgICA1MSwKKyAgICAgICA0NywgICA0NywgICA0NywgICA0NywgICA0NywgICA0NywgICA0NywgICA1MgorICAgIH0sCisKKyAgICB7CisgICAgICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsCisgICAgICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsCisgICAgICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsCisgICAgICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEsICAtMTEKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLAorICAgICAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLCAgLTEyLAorCisgICAgICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsCisgICAgICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIsICAtMTIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTEzLCAgIDUzLCAgIDU0LCAgLTEzLCAgLTEzLCAgIDU1LCAgLTEzLCAgLTEzLCAgLTEzLAorICAgICAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzLAorICAgICAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzLAorICAgICAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzLCAgLTEzCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwKKyAgICAgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwKKyAgICAgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwKKyAgICAgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNCwgIC0xNAorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICA1NiwgICA1NiwgICA1NywgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwKKyAgICAgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwKKyAgICAgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwKKyAgICAgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsCisgICAgICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsCisgICAgICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsCisgICAgICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYsICAtMTYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LAorICAgICAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LCAgLTE3LAorCisgICAgICAtMTcsICAtMTcsICAtMTcsICAtMTcsICAtMTcsICAtMTcsICAtMTcsICAtMTcsICAtMTcsICAtMTcsCisgICAgICAtMTcsICAtMTcsICAtMTcsICAtMTcsICAtMTcsICAtMTcsICAtMTcsICAtMTcKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTE4LCAgLTE4LCAgLTE4LCAgLTE4LCAgLTE4LCAgLTE4LCAgLTE4LCAgLTE4LCAgLTE4LAorICAgICAgLTE4LCAgLTE4LCAgLTE4LCAgIDU4LCAgLTE4LCAgLTE4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgLTE4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0xOSwgIC0xOSwgIC0xOSwgIC0xOSwgIC0xOSwgIC0xOSwgIC0xOSwgIC0xOSwgIC0xOSwKKyAgICAgIC0xOSwgIC0xOSwgIC0xOSwgICA1OCwgIC0xOSwgIC0xOSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OSwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIC0xOQorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0yMCwgIC0yMCwgIC0yMCwgIC0yMCwgIC0yMCwgIC0yMCwgIC0yMCwgIC0yMCwgIC0yMCwKKyAgICAgIC0yMCwgIC0yMCwgIC0yMCwgICA1OCwgIC0yMCwgIC0yMCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA2MCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA2MSwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIC0yMAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMjEsICAtMjEsICAtMjEsICAtMjEsICAtMjEsICAtMjEsICAtMjEsICAtMjEsICAtMjEsCisgICAgICAtMjEsICAtMjEsICAtMjEsICAgNTgsICAtMjEsICAtMjEsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNjIsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAtMjEKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTIyLCAgLTIyLCAgLTIyLCAgLTIyLCAgLTIyLCAgLTIyLCAgLTIyLCAgLTIyLCAgLTIyLAorICAgICAgLTIyLCAgLTIyLCAgLTIyLCAgIDU4LCAgLTIyLCAgLTIyLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNjMsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAtMjIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTIzLCAgLTIzLCAgLTIzLCAgLTIzLCAgLTIzLCAgLTIzLCAgLTIzLCAgLTIzLCAgLTIzLAorICAgICAgLTIzLCAgLTIzLCAgLTIzLCAgIDU4LCAgLTIzLCAgLTIzLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDY0LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgLTIzCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0yNCwgIC0yNCwgIC0yNCwgIC0yNCwgIC0yNCwgIC0yNCwgIC0yNCwgIC0yNCwgIC0yNCwKKyAgICAgIC0yNCwgIC0yNCwgIC0yNCwgICA1OCwgIC0yNCwgIC0yNCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA2NSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA2NiwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIC0yNAorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0yNSwgIC0yNSwgIC0yNSwgIC0yNSwgIC0yNSwgIC0yNSwgIC0yNSwgIC0yNSwgIC0yNSwKKyAgICAgIC0yNSwgIC0yNSwgIC0yNSwgICA1OCwgIC0yNSwgIC0yNSwgICA1OCwgICA2NywgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA2OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIC0yNQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMjYsICAtMjYsICAtMjYsICAtMjYsICAtMjYsICAtMjYsICAtMjYsICAtMjYsICAtMjYsCisgICAgICAtMjYsICAtMjYsICAtMjYsICAgNTgsICAtMjYsICAtMjYsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNjksICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAtMjYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTI3LCAgLTI3LCAgLTI3LCAgLTI3LCAgLTI3LCAgLTI3LCAgLTI3LCAgLTI3LCAgLTI3LAorICAgICAgLTI3LCAgLTI3LCAgLTI3LCAgIDU4LCAgLTI3LCAgLTI3LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNzAsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAtMjcKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTI4LCAgLTI4LCAgLTI4LCAgLTI4LCAgLTI4LCAgLTI4LCAgLTI4LCAgLTI4LCAgLTI4LAorICAgICAgLTI4LCAgLTI4LCAgLTI4LCAgIDU4LCAgLTI4LCAgLTI4LCAgIDU4LCAgIDcxLCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDcyLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgLTI4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwgIC0yOSwKKyAgICAgIC0yOSwgIC0yOSwgIC0yOSwgICA1OCwgIC0yOSwgIC0yOSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA3MywgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA3NCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA3NSwgICA1OCwgICA1OCwgIC0yOQorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0zMCwgIC0zMCwgIC0zMCwgIC0zMCwgIC0zMCwgIC0zMCwgIC0zMCwgIC0zMCwgIC0zMCwKKyAgICAgIC0zMCwgIC0zMCwgIC0zMCwgICA1OCwgIC0zMCwgIC0zMCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA3NiwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIC0zMAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgNzcsICAgNzcsICAtMzEsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsCisgICAgICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsCisgICAgICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsCisgICAgICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTMyLCAgIDc4LCAgIDc5LCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLAorICAgICAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLCAgLTMyLAorCisgICAgICAtMzIsICAtMzIsICAtMzIsICAtMzIsICAtMzIsICAtMzIsICAtMzIsICAtMzIsICAtMzIsICAtMzIsCisgICAgICAtMzIsICAtMzIsICAtMzIsICAtMzIsICAtMzIsICAtMzIsICAtMzIsICAtMzIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDgwLCAgLTMzLCAgLTMzLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLAorICAgICAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLAorICAgICAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLAorICAgICAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwLCAgIDgwCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICA4MSwgICA4MSwgICA4MiwgICA4MSwgIC0zNCwgICA4MSwgICA4MSwgIC0zNCwgICA4MSwKKyAgICAgICA4MSwgICA4MSwgICA4MSwgICA4MSwgICA4MSwgIC0zNCwgICA4MSwgICA4MSwgICA4MSwgICA4MSwKKyAgICAgICA4MSwgICA4MSwgICA4MSwgICA4MSwgICA4MSwgICA4MSwgICA4MSwgICA4MSwgICA4MSwgICA4MSwKKyAgICAgICA4MSwgICA4MSwgICA4MSwgICA4MSwgICA4MSwgICA4MSwgICA4MSwgICA4MQorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNSwKKyAgICAgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNSwKKyAgICAgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNSwKKyAgICAgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNSwgIC0zNQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtMzYsICAtMzYsICAtMzYsICAtMzYsICAtMzYsICAtMzYsICAtMzYsICAtMzYsICAtMzYsCisgICAgICAtMzYsICAtMzYsICAtMzYsICAtMzYsICAtMzYsICAtMzYsICAtMzYsICAtMzYsICAtMzYsICAtMzYsCisgICAgICAtMzYsICAtMzYsICAtMzYsICAtMzYsICAtMzYsICAtMzYsICAtMzYsICAtMzYsICAtMzYsICAtMzYsCisgICAgICAtMzYsICAtMzYsICAtMzYsICAtMzYsICAtMzYsICAtMzYsICAtMzYsICAtMzYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDgzLCAgIDgzLCAgIDg0LCAgIDgzLCAgIDgzLCAgIDgzLCAgIDgzLCAgIDgzLCAgIDgzLAorICAgICAgIDgzLCAgIDgzLCAgIDgzLCAgIDgzLCAgIDgzLCAgIDgzLCAgIDgzLCAgIDgzLCAgIDgzLCAgIDgzLAorCisgICAgICAgODMsICAgODMsICAgODMsICAgODMsICAgODMsICAgODMsICAgODMsICAgODMsICAgODMsICAgODMsCisgICAgICAgODMsICAgODMsICAgODMsICAgODMsICAgODMsICAgODMsICAgODMsICAgODMKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LAorICAgICAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LAorICAgICAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LAorICAgICAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4LCAgLTM4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOSwKKyAgICAgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOSwKKyAgICAgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOSwKKyAgICAgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOSwgIC0zOQorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MCwKKyAgICAgIC00MCwgIC00MCwgIC00MCwgIC00MCwgICA4NSwgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MCwKKyAgICAgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MCwKKyAgICAgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MCwgIC00MAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNDEsICAtNDEsICAtNDEsICAtNDEsICAtNDEsICAtNDEsICAtNDEsICAtNDEsICAtNDEsCisgICAgICAtNDEsICAtNDEsICAtNDEsICAtNDEsICAtNDEsICAtNDEsICAtNDEsICAtNDEsICAtNDEsICAtNDEsCisgICAgICAtNDEsICAtNDEsICAtNDEsICAtNDEsICAtNDEsICAtNDEsICAtNDEsICAtNDEsICAtNDEsICAtNDEsCisgICAgICAtNDEsICAtNDEsICAtNDEsICAtNDEsICAtNDEsICAtNDEsICAtNDEsICAtNDEKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDg2LCAgIDg2LCAgLTQyLCAgIDg2LCAgIDg2LCAgIDg2LCAgIDg2LCAgIDg2LCAgIDg2LAorICAgICAgIDg2LCAgIDg2LCAgIDg2LCAgIDg2LCAgIDg2LCAgIDg2LCAgIDg2LCAgIDg2LCAgIDg2LCAgIDg2LAorCisgICAgICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsCisgICAgICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgIDg3LCAgLTQzLCAgLTQzLAorICAgICAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLAorICAgICAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLAorICAgICAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzLCAgLTQzCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwKKyAgICAgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwKKyAgICAgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwKKyAgICAgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NCwgIC00NAorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC00NSwgIC00NSwgIC00NSwgIC00NSwgIC00NSwgIC00NSwgIC00NSwgIC00NSwgIC00NSwKKyAgICAgIC00NSwgIC00NSwgIC00NSwgIC00NSwgIC00NSwgIC00NSwgIC00NSwgIC00NSwgIC00NSwgIC00NSwKKyAgICAgIC00NSwgIC00NSwgIC00NSwgIC00NSwgIC00NSwgIC00NSwgIC00NSwgIC00NSwgIC00NSwgIC00NSwKKyAgICAgIC00NSwgIC00NSwgIC00NSwgIC00NSwgIC00NSwgIC00NSwgIC00NSwgIC00NQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNDYsICAtNDYsICAtNDYsICAtNDYsICAtNDYsICAtNDYsICAtNDYsICAtNDYsICAtNDYsCisgICAgICAtNDYsICAgODgsICAgODksICAgODksICAtNDYsICAtNDYsICAgODksICAgODksICAgODksICAgODksCisgICAgICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksCisgICAgICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAtNDYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTQ3LCAgLTQ3LCAgLTQ3LCAgLTQ3LCAgLTQ3LCAgLTQ3LCAgLTQ3LCAgLTQ3LCAgLTQ3LAorICAgICAgLTQ3LCAgIDg5LCAgIDg5LCAgIDg5LCAgLTQ3LCAgLTQ3LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LAorCisgICAgICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksCisgICAgICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAtNDcKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LAorICAgICAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LAorICAgICAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LAorICAgICAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4LCAgLTQ4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC00OSwgIC00OSwgICA5MCwgIC00OSwgIC00OSwgIC00OSwgIC00OSwgIC00OSwgIC00OSwKKyAgICAgIC00OSwgIC00OSwgIC00OSwgIC00OSwgIC00OSwgIC00OSwgIC00OSwgIC00OSwgIC00OSwgIC00OSwKKyAgICAgIC00OSwgIC00OSwgIC00OSwgIC00OSwgIC00OSwgIC00OSwgIC00OSwgIC00OSwgIC00OSwgIC00OSwKKyAgICAgIC00OSwgIC00OSwgIC00OSwgIC00OSwgIC00OSwgIC00OSwgIC00OSwgIC00OQorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC01MCwgIC01MCwgIC01MCwgIC01MCwgIC01MCwgIC01MCwgIC01MCwgIC01MCwgIC01MCwKKyAgICAgIC01MCwgICA4OSwgICA4OSwgICA4OSwgIC01MCwgIC01MCwgICA4OSwgICA4OSwgICA4OSwgICA4OSwKKyAgICAgICA4OSwgICA4OSwgICA5MSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwKKyAgICAgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgIC01MAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNTEsICAtNTEsICAtNTEsICAtNTEsICAtNTEsICAtNTEsICAtNTEsICAtNTEsICAtNTEsCisgICAgICAtNTEsICAgODksICAgODksICAgODksICAtNTEsICAtNTEsICAgODksICAgODksICAgODksICAgODksCisgICAgICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAgOTIsICAgODksCisgICAgICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAtNTEKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTUyLCAgLTUyLCAgLTUyLCAgLTUyLCAgLTUyLCAgLTUyLCAgLTUyLCAgLTUyLCAgLTUyLAorICAgICAgLTUyLCAgLTUyLCAgLTUyLCAgLTUyLCAgLTUyLCAgLTUyLCAgLTUyLCAgLTUyLCAgLTUyLCAgLTUyLAorCisgICAgICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsCisgICAgICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAtNTIsICAgOTMKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTUzLCAgIDUzLCAgIDU0LCAgLTUzLCAgLTUzLCAgIDU1LCAgLTUzLCAgLTUzLCAgLTUzLAorICAgICAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLAorICAgICAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLAorICAgICAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzLCAgLTUzCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC01NCwgIC01NCwgIC01NCwgIC01NCwgIC01NCwgIC01NCwgIC01NCwgIC01NCwgIC01NCwKKyAgICAgIC01NCwgIC01NCwgIC01NCwgIC01NCwgIC01NCwgIC01NCwgIC01NCwgIC01NCwgIC01NCwgIC01NCwKKyAgICAgIC01NCwgIC01NCwgIC01NCwgIC01NCwgIC01NCwgIC01NCwgIC01NCwgIC01NCwgIC01NCwgIC01NCwKKyAgICAgIC01NCwgIC01NCwgIC01NCwgIC01NCwgIC01NCwgIC01NCwgIC01NCwgIC01NAorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICA1NiwgICA1NiwgICA1NywgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwKKyAgICAgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwKKyAgICAgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwKKyAgICAgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NiwgICA1NgorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgNTYsICAgNTYsICAgNTcsICAgNTYsICAgNTYsICAgNTYsICAgNTYsICAgNTYsICAgNTYsCisgICAgICAgNTYsICAgNTYsICAgNTYsICAgNTYsICAgNTYsICAgNTYsICAgNTYsICAgNTYsICAgNTYsICAgNTYsCisgICAgICAgNTYsICAgNTYsICAgNTYsICAgNTYsICAgNTYsICAgNTYsICAgNTYsICAgNTYsICAgNTYsICAgNTYsCisgICAgICAgNTYsICAgNTYsICAgNTYsICAgNTYsICAgNTYsICAgNTYsICAgNTYsICAgNTYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTU3LCAgLTU3LCAgLTU3LCAgLTU3LCAgLTU3LCAgLTU3LCAgLTU3LCAgLTU3LCAgLTU3LAorICAgICAgLTU3LCAgLTU3LCAgLTU3LCAgLTU3LCAgLTU3LCAgLTU3LCAgLTU3LCAgLTU3LCAgLTU3LCAgLTU3LAorCisgICAgICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsCisgICAgICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcsICAtNTcKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LCAgLTU4LAorICAgICAgLTU4LCAgLTU4LCAgLTU4LCAgIDU4LCAgLTU4LCAgLTU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgLTU4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC01OSwgIC01OSwgIC01OSwgIC01OSwgIC01OSwgIC01OSwgIC01OSwgIC01OSwgIC01OSwKKyAgICAgIC01OSwgIC01OSwgIC01OSwgICA1OCwgIC01OSwgIC01OSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA5NCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIC01OQorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC02MCwgIC02MCwgIC02MCwgIC02MCwgIC02MCwgIC02MCwgIC02MCwgIC02MCwgIC02MCwKKyAgICAgIC02MCwgIC02MCwgIC02MCwgICA1OCwgIC02MCwgIC02MCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA5NSwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIC02MAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNjEsICAtNjEsICAtNjEsICAtNjEsICAtNjEsICAtNjEsICAtNjEsICAtNjEsICAtNjEsCisgICAgICAtNjEsICAtNjEsICAtNjEsICAgNTgsICAtNjEsICAtNjEsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgOTYsICAgOTcsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAtNjEKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTYyLCAgLTYyLCAgLTYyLCAgLTYyLCAgLTYyLCAgLTYyLCAgLTYyLCAgLTYyLCAgLTYyLAorICAgICAgLTYyLCAgLTYyLCAgLTYyLCAgIDU4LCAgLTYyLCAgLTYyLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorCisgICAgICAgNTgsICAgNTgsICAgOTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgOTksICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAtNjIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTYzLCAgLTYzLCAgLTYzLCAgLTYzLCAgLTYzLCAgLTYzLCAgLTYzLCAgLTYzLCAgLTYzLAorICAgICAgLTYzLCAgLTYzLCAgLTYzLCAgIDU4LCAgLTYzLCAgLTYzLCAgIDU4LCAgMTAwLCAgIDU4LCAgIDU4LAorICAgICAgMTAxLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgLTYzCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC02NCwgIC02NCwgIC02NCwgIC02NCwgIC02NCwgIC02NCwgIC02NCwgIC02NCwgIC02NCwKKyAgICAgIC02NCwgIC02NCwgIC02NCwgICA1OCwgIC02NCwgIC02NCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDEwMiwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDEwMywgIC02NAorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC02NSwgIC02NSwgIC02NSwgIC02NSwgIC02NSwgIC02NSwgIC02NSwgIC02NSwgIC02NSwKKyAgICAgIC02NSwgIC02NSwgIC02NSwgICA1OCwgIC02NSwgIC02NSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIC02NQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNjYsICAtNjYsICAtNjYsICAtNjYsICAtNjYsICAtNjYsICAtNjYsICAtNjYsICAtNjYsCisgICAgICAtNjYsICAtNjYsICAtNjYsICAgNTgsICAtNjYsICAtNjYsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxMDQsICAgNTgsICAgNTgsICAtNjYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTY3LCAgLTY3LCAgLTY3LCAgLTY3LCAgLTY3LCAgLTY3LCAgLTY3LCAgLTY3LCAgLTY3LAorICAgICAgLTY3LCAgLTY3LCAgLTY3LCAgIDU4LCAgLTY3LCAgLTY3LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxMDUsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAtNjcKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTY4LCAgLTY4LCAgLTY4LCAgLTY4LCAgLTY4LCAgLTY4LCAgLTY4LCAgLTY4LCAgLTY4LAorICAgICAgLTY4LCAgLTY4LCAgLTY4LCAgIDU4LCAgLTY4LCAgLTY4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTA2LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgLTY4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC02OSwgIC02OSwgIC02OSwgIC02OSwgIC02OSwgIC02OSwgIC02OSwgIC02OSwgIC02OSwKKyAgICAgIC02OSwgIC02OSwgIC02OSwgICA1OCwgIC02OSwgIC02OSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDEwNywgICA1OCwgICA1OCwgIC02OQorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC03MCwgIC03MCwgIC03MCwgIC03MCwgIC03MCwgIC03MCwgIC03MCwgIC03MCwgIC03MCwKKyAgICAgIC03MCwgIC03MCwgIC03MCwgICA1OCwgIC03MCwgIC03MCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDEwOCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIC03MAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNzEsICAtNzEsICAtNzEsICAtNzEsICAtNzEsICAtNzEsICAtNzEsICAtNzEsICAtNzEsCisgICAgICAtNzEsICAtNzEsICAtNzEsICAgNTgsICAtNzEsICAtNzEsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxMDksICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAtNzEKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTcyLCAgLTcyLCAgLTcyLCAgLTcyLCAgLTcyLCAgLTcyLCAgLTcyLCAgLTcyLCAgLTcyLAorICAgICAgLTcyLCAgLTcyLCAgLTcyLCAgIDU4LCAgLTcyLCAgLTcyLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAxMTAsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAtNzIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTczLCAgLTczLCAgLTczLCAgLTczLCAgLTczLCAgLTczLCAgLTczLCAgLTczLCAgLTczLAorICAgICAgLTczLCAgLTczLCAgLTczLCAgIDU4LCAgLTczLCAgLTczLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTExLCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgLTczCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC03NCwgIC03NCwgIC03NCwgIC03NCwgIC03NCwgIC03NCwgIC03NCwgIC03NCwgIC03NCwKKyAgICAgIC03NCwgIC03NCwgIC03NCwgICA1OCwgIC03NCwgIC03NCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDExMiwgICA1OCwgIC03NAorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC03NSwgIC03NSwgIC03NSwgIC03NSwgIC03NSwgIC03NSwgIC03NSwgIC03NSwgIC03NSwKKyAgICAgIC03NSwgIC03NSwgIC03NSwgICA1OCwgIC03NSwgIC03NSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgIDExMywgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIC03NQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtNzYsICAtNzYsICAtNzYsICAtNzYsICAtNzYsICAtNzYsICAtNzYsICAtNzYsICAtNzYsCisgICAgICAtNzYsICAtNzYsICAtNzYsICAgNTgsICAtNzYsICAtNzYsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxMTQsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAtNzYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgIDc3LCAgIDc3LCAgLTc3LCAgIDc3LCAgIDc3LCAgIDc3LCAgIDc3LCAgIDc3LCAgIDc3LAorICAgICAgIDc3LCAgIDc3LCAgIDc3LCAgIDc3LCAgIDc3LCAgIDc3LCAgIDc3LCAgIDc3LCAgIDc3LCAgIDc3LAorCisgICAgICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsCisgICAgICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcsICAgNzcKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTc4LCAgIDc4LCAgIDc5LCAgLTc4LCAgLTc4LCAgLTc4LCAgLTc4LCAgLTc4LCAgLTc4LAorICAgICAgLTc4LCAgLTc4LCAgLTc4LCAgLTc4LCAgLTc4LCAgLTc4LCAgLTc4LCAgLTc4LCAgLTc4LCAgLTc4LAorICAgICAgLTc4LCAgLTc4LCAgLTc4LCAgLTc4LCAgLTc4LCAgLTc4LCAgLTc4LCAgLTc4LCAgLTc4LCAgLTc4LAorICAgICAgLTc4LCAgLTc4LCAgLTc4LCAgLTc4LCAgLTc4LCAgLTc4LCAgLTc4LCAgLTc4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgICA4MCwgIC03OSwgIC03OSwgICA4MCwgICA4MCwgICA4MCwgICA4MCwgICA4MCwgICA4MCwKKyAgICAgICA4MCwgICA4MCwgICA4MCwgICA4MCwgICA4MCwgICA4MCwgICA4MCwgICA4MCwgICA4MCwgICA4MCwKKyAgICAgICA4MCwgICA4MCwgICA4MCwgICA4MCwgICA4MCwgICA4MCwgICA4MCwgICA4MCwgICA4MCwgICA4MCwKKyAgICAgICA4MCwgICA4MCwgICA4MCwgICA4MCwgICA4MCwgICA4MCwgICA4MCwgICA4MAorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC04MCwgIC04MCwgIC04MCwgIC04MCwgIC04MCwgIC04MCwgIC04MCwgIC04MCwgIC04MCwKKyAgICAgIC04MCwgIC04MCwgIC04MCwgIC04MCwgIC04MCwgIC04MCwgIC04MCwgIC04MCwgIC04MCwgIC04MCwKKyAgICAgIC04MCwgIC04MCwgIC04MCwgIC04MCwgIC04MCwgIC04MCwgIC04MCwgIC04MCwgIC04MCwgIC04MCwKKyAgICAgIC04MCwgIC04MCwgIC04MCwgIC04MCwgIC04MCwgIC04MCwgIC04MCwgIC04MAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgODEsICAgODEsICAgODIsICAgODEsICAtODEsICAgODEsICAgODEsICAtODEsICAgODEsCisgICAgICAgODEsICAgODEsICAgODEsICAgODEsICAgODEsICAtODEsICAgODEsICAgODEsICAgODEsICAgODEsCisgICAgICAgODEsICAgODEsICAgODEsICAgODEsICAgODEsICAgODEsICAgODEsICAgODEsICAgODEsICAgODEsCisgICAgICAgODEsICAgODEsICAgODEsICAgODEsICAgODEsICAgODEsICAgODEsICAgODEKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTgyLCAgLTgyLCAgLTgyLCAgLTgyLCAgLTgyLCAgLTgyLCAgLTgyLCAgLTgyLCAgLTgyLAorICAgICAgLTgyLCAgLTgyLCAgLTgyLCAgLTgyLCAgLTgyLCAgLTgyLCAgLTgyLCAgLTgyLCAgLTgyLCAgLTgyLAorCisgICAgICAtODIsICAtODIsICAtODIsICAtODIsICAtODIsICAtODIsICAtODIsICAtODIsICAtODIsICAtODIsCisgICAgICAtODIsICAtODIsICAtODIsICAtODIsICAtODIsICAtODIsICAtODIsICAtODIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTgzLCAgLTgzLCAgIDg0LCAgLTgzLCAgLTgzLCAgLTgzLCAgLTgzLCAgLTgzLCAgLTgzLAorICAgICAgLTgzLCAgLTgzLCAgLTgzLCAgLTgzLCAgLTgzLCAgLTgzLCAgLTgzLCAgLTgzLCAgLTgzLCAgLTgzLAorICAgICAgLTgzLCAgLTgzLCAgLTgzLCAgLTgzLCAgLTgzLCAgLTgzLCAgLTgzLCAgLTgzLCAgLTgzLCAgLTgzLAorICAgICAgLTgzLCAgLTgzLCAgLTgzLCAgLTgzLCAgLTgzLCAgLTgzLCAgLTgzLCAgLTgzCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC04NCwgIC04NCwgIC04NCwgIC04NCwgIC04NCwgIC04NCwgIC04NCwgIC04NCwgIC04NCwKKyAgICAgIC04NCwgIC04NCwgIC04NCwgIC04NCwgIC04NCwgIC04NCwgIC04NCwgIC04NCwgIC04NCwgIC04NCwKKyAgICAgIC04NCwgIC04NCwgIC04NCwgIC04NCwgIC04NCwgIC04NCwgIC04NCwgIC04NCwgIC04NCwgIC04NCwKKyAgICAgIC04NCwgIC04NCwgIC04NCwgIC04NCwgIC04NCwgIC04NCwgIC04NCwgIC04NAorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC04NSwgIC04NSwgIC04NSwgIC04NSwgIC04NSwgIC04NSwgIC04NSwgIC04NSwgIC04NSwKKyAgICAgIC04NSwgIC04NSwgIC04NSwgIC04NSwgIC04NSwgIC04NSwgIC04NSwgIC04NSwgIC04NSwgIC04NSwKKyAgICAgIC04NSwgIC04NSwgIC04NSwgIC04NSwgIC04NSwgIC04NSwgIC04NSwgIC04NSwgIC04NSwgIC04NSwKKyAgICAgIC04NSwgIC04NSwgIC04NSwgIC04NSwgIC04NSwgIC04NSwgIC04NSwgIC04NQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAgODYsICAgODYsICAtODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsCisgICAgICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsCisgICAgICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsCisgICAgICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODYsICAgODYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTg3LCAgLTg3LCAgLTg3LCAgLTg3LCAgLTg3LCAgLTg3LCAgLTg3LCAgLTg3LCAgLTg3LAorICAgICAgLTg3LCAgLTg3LCAgLTg3LCAgLTg3LCAgLTg3LCAgLTg3LCAgLTg3LCAgLTg3LCAgLTg3LCAgLTg3LAorCisgICAgICAtODcsICAtODcsICAtODcsICAtODcsICAtODcsICAtODcsICAtODcsICAtODcsICAtODcsICAtODcsCisgICAgICAtODcsICAtODcsICAtODcsICAtODcsICAtODcsICAtODcsICAtODcsICAtODcKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTg4LCAgLTg4LCAgLTg4LCAgLTg4LCAgLTg4LCAgLTg4LCAgLTg4LCAgLTg4LCAgLTg4LAorICAgICAgLTg4LCAgMTE1LCAgIDg5LCAgIDg5LCAgLTg4LCAgLTg4LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LAorICAgICAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LAorICAgICAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LCAgLTg4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC04OSwgIC04OSwgIC04OSwgIC04OSwgIC04OSwgIC04OSwgIC04OSwgIC04OSwgIC04OSwKKyAgICAgIC04OSwgICA4OSwgICA4OSwgICA4OSwgIC04OSwgIC04OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwKKyAgICAgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwKKyAgICAgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgIC04OQorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC05MCwgIC05MCwgIC05MCwgIC05MCwgIC05MCwgIC05MCwgIC05MCwgIC05MCwgIC05MCwKKyAgICAgIC05MCwgIC05MCwgIC05MCwgIC05MCwgIC05MCwgIC05MCwgIC05MCwgIC05MCwgIC05MCwgIC05MCwKKyAgICAgIC05MCwgIC05MCwgIC05MCwgIC05MCwgIC05MCwgIC05MCwgIC05MCwgIC05MCwgIC05MCwgIC05MCwKKyAgICAgIC05MCwgIC05MCwgIC05MCwgIC05MCwgIC05MCwgIC05MCwgIC05MCwgIC05MAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtOTEsICAtOTEsICAtOTEsICAtOTEsICAtOTEsICAtOTEsICAtOTEsICAtOTEsICAtOTEsCisgICAgICAtOTEsICAgODksICAgODksICAgODksICAtOTEsICAtOTEsICAgODksICAgODksICAgODksICAgODksCisgICAgICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksCisgICAgICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAtOTEKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTkyLCAgLTkyLCAgLTkyLCAgLTkyLCAgLTkyLCAgLTkyLCAgLTkyLCAgLTkyLCAgLTkyLAorICAgICAgLTkyLCAgIDg5LCAgIDg5LCAgIDg5LCAgLTkyLCAgLTkyLCAgIDg5LCAgIDg5LCAgIDg5LCAgIDg5LAorCisgICAgICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksCisgICAgICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAgODksICAtOTIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTkzLCAgLTkzLCAgLTkzLCAgLTkzLCAgLTkzLCAgLTkzLCAgLTkzLCAgLTkzLCAgLTkzLAorICAgICAgLTkzLCAgLTkzLCAgLTkzLCAgLTkzLCAgLTkzLCAgLTkzLCAgLTkzLCAgLTkzLCAgLTkzLCAgLTkzLAorICAgICAgLTkzLCAgLTkzLCAgLTkzLCAgLTkzLCAgLTkzLCAgLTkzLCAgLTkzLCAgLTkzLCAgLTkzLCAgLTkzLAorICAgICAgLTkzLCAgLTkzLCAgLTkzLCAgLTkzLCAgLTkzLCAgLTkzLCAgLTkzLCAgLTkzCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC05NCwgIC05NCwgIC05NCwgIC05NCwgIC05NCwgIC05NCwgIC05NCwgIC05NCwgIC05NCwKKyAgICAgIC05NCwgIC05NCwgIC05NCwgICA1OCwgIC05NCwgIC05NCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDExNiwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIC05NAorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC05NSwgIC05NSwgIC05NSwgIC05NSwgIC05NSwgIC05NSwgIC05NSwgIC05NSwgIC05NSwKKyAgICAgIC05NSwgIC05NSwgIC05NSwgICA1OCwgIC05NSwgIC05NSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDExNywgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIC05NQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsICAtOTYsICAtOTYsICAtOTYsICAtOTYsICAtOTYsICAtOTYsICAtOTYsICAtOTYsICAtOTYsCisgICAgICAtOTYsICAtOTYsICAtOTYsICAgNTgsICAtOTYsICAtOTYsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxMTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAtOTYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTk3LCAgLTk3LCAgLTk3LCAgLTk3LCAgLTk3LCAgLTk3LCAgLTk3LCAgLTk3LCAgLTk3LAorICAgICAgLTk3LCAgLTk3LCAgLTk3LCAgIDU4LCAgLTk3LCAgLTk3LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorCisgICAgICAgNTgsICAgNTgsICAxMTksICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAtOTcKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAgLTk4LCAgLTk4LCAgLTk4LCAgLTk4LCAgLTk4LCAgLTk4LCAgLTk4LCAgLTk4LCAgLTk4LAorICAgICAgLTk4LCAgLTk4LCAgLTk4LCAgIDU4LCAgLTk4LCAgLTk4LCAgMTIwLCAgMTIxLCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgLTk4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgIC05OSwgIC05OSwgIC05OSwgIC05OSwgIC05OSwgIC05OSwgIC05OSwgIC05OSwgIC05OSwKKyAgICAgIC05OSwgIC05OSwgIC05OSwgICA1OCwgIC05OSwgIC05OSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgIDEyMiwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIC05OQorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTEwMCwgLTEwMCwgLTEwMCwgLTEwMCwgLTEwMCwgLTEwMCwgLTEwMCwgLTEwMCwgLTEwMCwKKyAgICAgLTEwMCwgLTEwMCwgLTEwMCwgICA1OCwgLTEwMCwgLTEwMCwgICA1OCwgICA1OCwgIDEyMywgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTEwMAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xMDEsIC0xMDEsIC0xMDEsIC0xMDEsIC0xMDEsIC0xMDEsIC0xMDEsIC0xMDEsIC0xMDEsCisgICAgIC0xMDEsIC0xMDEsIC0xMDEsICAgNTgsIC0xMDEsIC0xMDEsICAgNTgsICAgNTgsICAgNTgsICAxMjQsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxMjUsICAgNTgsICAxMjYsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xMDEKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTAyLCAtMTAyLCAtMTAyLCAtMTAyLCAtMTAyLCAtMTAyLCAtMTAyLCAtMTAyLCAtMTAyLAorICAgICAtMTAyLCAtMTAyLCAtMTAyLCAgIDU4LCAtMTAyLCAtMTAyLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAxMjcsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xMDIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTAzLCAtMTAzLCAtMTAzLCAtMTAzLCAtMTAzLCAtMTAzLCAtMTAzLCAtMTAzLCAtMTAzLAorICAgICAtMTAzLCAtMTAzLCAtMTAzLCAgIDU4LCAtMTAzLCAtMTAzLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTAzCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTEwNCwgLTEwNCwgLTEwNCwgLTEwNCwgLTEwNCwgLTEwNCwgLTEwNCwgLTEwNCwgLTEwNCwKKyAgICAgLTEwNCwgLTEwNCwgLTEwNCwgICA1OCwgLTEwNCwgLTEwNCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTEwNAorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTEwNSwgLTEwNSwgLTEwNSwgLTEwNSwgLTEwNSwgLTEwNSwgLTEwNSwgLTEwNSwgLTEwNSwKKyAgICAgLTEwNSwgLTEwNSwgLTEwNSwgICA1OCwgLTEwNSwgLTEwNSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDEyOCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTEwNQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xMDYsIC0xMDYsIC0xMDYsIC0xMDYsIC0xMDYsIC0xMDYsIC0xMDYsIC0xMDYsIC0xMDYsCisgICAgIC0xMDYsIC0xMDYsIC0xMDYsICAgNTgsIC0xMDYsIC0xMDYsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxMjksICAgNTgsIC0xMDYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTA3LCAtMTA3LCAtMTA3LCAtMTA3LCAtMTA3LCAtMTA3LCAtMTA3LCAtMTA3LCAtMTA3LAorICAgICAtMTA3LCAtMTA3LCAtMTA3LCAgIDU4LCAtMTA3LCAtMTA3LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxMzAsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xMDcKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTA4LCAtMTA4LCAtMTA4LCAtMTA4LCAtMTA4LCAtMTA4LCAtMTA4LCAtMTA4LCAtMTA4LAorICAgICAtMTA4LCAtMTA4LCAtMTA4LCAgIDU4LCAtMTA4LCAtMTA4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTMxLCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTA4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTEwOSwgLTEwOSwgLTEwOSwgLTEwOSwgLTEwOSwgLTEwOSwgLTEwOSwgLTEwOSwgLTEwOSwKKyAgICAgLTEwOSwgLTEwOSwgLTEwOSwgICA1OCwgLTEwOSwgLTEwOSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgIDEzMiwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTEwOQorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTExMCwgLTExMCwgLTExMCwgLTExMCwgLTExMCwgLTExMCwgLTExMCwgLTExMCwgLTExMCwKKyAgICAgLTExMCwgLTExMCwgLTExMCwgICA1OCwgLTExMCwgLTExMCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDEzMywgICA1OCwgLTExMAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xMTEsIC0xMTEsIC0xMTEsIC0xMTEsIC0xMTEsIC0xMTEsIC0xMTEsIC0xMTEsIC0xMTEsCisgICAgIC0xMTEsIC0xMTEsIC0xMTEsICAgNTgsIC0xMTEsIC0xMTEsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAxMzQsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xMTEKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTEyLCAtMTEyLCAtMTEyLCAtMTEyLCAtMTEyLCAtMTEyLCAtMTEyLCAtMTEyLCAtMTEyLAorICAgICAtMTEyLCAtMTEyLCAtMTEyLCAgIDU4LCAtMTEyLCAtMTEyLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAxMzUsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xMTIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTEzLCAtMTEzLCAtMTEzLCAtMTEzLCAtMTEzLCAtMTEzLCAtMTEzLCAtMTEzLCAtMTEzLAorICAgICAtMTEzLCAtMTEzLCAtMTEzLCAgIDU4LCAtMTEzLCAtMTEzLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTM2LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTEzCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTExNCwgLTExNCwgLTExNCwgLTExNCwgLTExNCwgLTExNCwgLTExNCwgLTExNCwgLTExNCwKKyAgICAgLTExNCwgLTExNCwgLTExNCwgICA1OCwgLTExNCwgLTExNCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgIDEzNywgICA1OCwgICA1OCwgICA1OCwgLTExNAorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTExNSwgLTExNSwgLTExNSwgLTExNSwgLTExNSwgLTExNSwgLTExNSwgLTExNSwgLTExNSwKKyAgICAgLTExNSwgICA4OSwgICA4OSwgICA4OSwgLTExNSwgLTExNSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwKKyAgICAgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwKKyAgICAgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgICA4OSwgLTExNQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xMTYsIC0xMTYsIC0xMTYsIC0xMTYsIC0xMTYsIC0xMTYsIC0xMTYsIC0xMTYsIC0xMTYsCisgICAgIC0xMTYsIC0xMTYsIC0xMTYsICAgNTgsIC0xMTYsIC0xMTYsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAxMzgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xMTYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTE3LCAtMTE3LCAtMTE3LCAtMTE3LCAtMTE3LCAtMTE3LCAtMTE3LCAtMTE3LCAtMTE3LAorICAgICAtMTE3LCAtMTE3LCAtMTE3LCAgIDU4LCAtMTE3LCAtMTE3LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTM5LAorCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xMTcKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTE4LCAtMTE4LCAtMTE4LCAtMTE4LCAtMTE4LCAtMTE4LCAtMTE4LCAtMTE4LCAtMTE4LAorICAgICAtMTE4LCAtMTE4LCAtMTE4LCAgIDU4LCAtMTE4LCAtMTE4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgMTQwLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTE4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTExOSwgLTExOSwgLTExOSwgLTExOSwgLTExOSwgLTExOSwgLTExOSwgLTExOSwgLTExOSwKKyAgICAgLTExOSwgLTExOSwgLTExOSwgICA1OCwgLTExOSwgLTExOSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDE0MSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTExOQorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTEyMCwgLTEyMCwgLTEyMCwgLTEyMCwgLTEyMCwgLTEyMCwgLTEyMCwgLTEyMCwgLTEyMCwKKyAgICAgLTEyMCwgLTEyMCwgLTEyMCwgICA1OCwgLTEyMCwgLTEyMCwgICA1OCwgICA1OCwgIDE0MiwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDE0MywgICA1OCwgICA1OCwgLTEyMAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xMjEsIC0xMjEsIC0xMjEsIC0xMjEsIC0xMjEsIC0xMjEsIC0xMjEsIC0xMjEsIC0xMjEsCisgICAgIC0xMjEsIC0xMjEsIC0xMjEsICAgNTgsIC0xMjEsIC0xMjEsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxNDQsICAgNTgsIC0xMjEKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTIyLCAtMTIyLCAtMTIyLCAtMTIyLCAtMTIyLCAtMTIyLCAtMTIyLCAtMTIyLCAtMTIyLAorICAgICAtMTIyLCAtMTIyLCAtMTIyLCAgIDU4LCAtMTIyLCAtMTIyLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxNDUsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xMjIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTIzLCAtMTIzLCAtMTIzLCAtMTIzLCAtMTIzLCAtMTIzLCAtMTIzLCAtMTIzLCAtMTIzLAorICAgICAtMTIzLCAtMTIzLCAtMTIzLCAgIDU4LCAtMTIzLCAtMTIzLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTQ2LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTIzCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTEyNCwgLTEyNCwgLTEyNCwgLTEyNCwgLTEyNCwgLTEyNCwgLTEyNCwgLTEyNCwgLTEyNCwKKyAgICAgLTEyNCwgLTEyNCwgLTEyNCwgICA1OCwgLTEyNCwgLTEyNCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDE0NywgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTEyNAorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTEyNSwgLTEyNSwgLTEyNSwgLTEyNSwgLTEyNSwgLTEyNSwgLTEyNSwgLTEyNSwgLTEyNSwKKyAgICAgLTEyNSwgLTEyNSwgLTEyNSwgICA1OCwgLTEyNSwgLTEyNSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgIDE0OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTEyNQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xMjYsIC0xMjYsIC0xMjYsIC0xMjYsIC0xMjYsIC0xMjYsIC0xMjYsIC0xMjYsIC0xMjYsCisgICAgIC0xMjYsIC0xMjYsIC0xMjYsICAgNTgsIC0xMjYsIC0xMjYsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAxNDksICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xMjYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTI3LCAtMTI3LCAtMTI3LCAtMTI3LCAtMTI3LCAtMTI3LCAtMTI3LCAtMTI3LCAtMTI3LAorICAgICAtMTI3LCAtMTI3LCAtMTI3LCAgIDU4LCAtMTI3LCAtMTI3LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xMjcKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LCAtMTI4LAorICAgICAtMTI4LCAtMTI4LCAtMTI4LCAgIDU4LCAtMTI4LCAtMTI4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTUwLCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTI4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTEyOSwgLTEyOSwgLTEyOSwgLTEyOSwgLTEyOSwgLTEyOSwgLTEyOSwgLTEyOSwgLTEyOSwKKyAgICAgLTEyOSwgLTEyOSwgLTEyOSwgICA1OCwgLTEyOSwgLTEyOSwgICA1OCwgICA1OCwgICA1OCwgIDE1MSwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTEyOQorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTEzMCwgLTEzMCwgLTEzMCwgLTEzMCwgLTEzMCwgLTEzMCwgLTEzMCwgLTEzMCwgLTEzMCwKKyAgICAgLTEzMCwgLTEzMCwgLTEzMCwgICA1OCwgLTEzMCwgLTEzMCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDE1MiwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTEzMAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xMzEsIC0xMzEsIC0xMzEsIC0xMzEsIC0xMzEsIC0xMzEsIC0xMzEsIC0xMzEsIC0xMzEsCisgICAgIC0xMzEsIC0xMzEsIC0xMzEsICAgNTgsIC0xMzEsIC0xMzEsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAxNTMsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xMzEKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTMyLCAtMTMyLCAtMTMyLCAtMTMyLCAtMTMyLCAtMTMyLCAtMTMyLCAtMTMyLCAtMTMyLAorICAgICAtMTMyLCAtMTMyLCAtMTMyLCAgIDU4LCAtMTMyLCAtMTMyLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorCisgICAgICAgNTgsICAxNTQsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xMzIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTMzLCAtMTMzLCAtMTMzLCAtMTMzLCAtMTMzLCAtMTMzLCAtMTMzLCAtMTMzLCAtMTMzLAorICAgICAtMTMzLCAtMTMzLCAtMTMzLCAgIDU4LCAtMTMzLCAtMTMzLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTU1LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTMzCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTEzNCwgLTEzNCwgLTEzNCwgLTEzNCwgLTEzNCwgLTEzNCwgLTEzNCwgLTEzNCwgLTEzNCwKKyAgICAgLTEzNCwgLTEzNCwgLTEzNCwgICA1OCwgLTEzNCwgLTEzNCwgICA1OCwgICA1OCwgICA1OCwgIDE1NiwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTEzNAorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTEzNSwgLTEzNSwgLTEzNSwgLTEzNSwgLTEzNSwgLTEzNSwgLTEzNSwgLTEzNSwgLTEzNSwKKyAgICAgLTEzNSwgLTEzNSwgLTEzNSwgICA1OCwgLTEzNSwgLTEzNSwgICA1OCwgICA1OCwgICA1OCwgIDE1NywKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTEzNQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xMzYsIC0xMzYsIC0xMzYsIC0xMzYsIC0xMzYsIC0xMzYsIC0xMzYsIC0xMzYsIC0xMzYsCisgICAgIC0xMzYsIC0xMzYsIC0xMzYsICAgNTgsIC0xMzYsIC0xMzYsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xMzYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTM3LCAtMTM3LCAtMTM3LCAtMTM3LCAtMTM3LCAtMTM3LCAtMTM3LCAtMTM3LCAtMTM3LAorICAgICAtMTM3LCAtMTM3LCAtMTM3LCAgIDU4LCAtMTM3LCAtMTM3LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxNTksICAgNTgsICAgNTgsIC0xMzcKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTM4LCAtMTM4LCAtMTM4LCAtMTM4LCAtMTM4LCAtMTM4LCAtMTM4LCAtMTM4LCAtMTM4LAorICAgICAtMTM4LCAtMTM4LCAtMTM4LCAgIDU4LCAtMTM4LCAtMTM4LCAgIDU4LCAgMTYwLCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTM4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTEzOSwgLTEzOSwgLTEzOSwgLTEzOSwgLTEzOSwgLTEzOSwgLTEzOSwgLTEzOSwgLTEzOSwKKyAgICAgLTEzOSwgLTEzOSwgLTEzOSwgICA1OCwgLTEzOSwgLTEzOSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgIDE2MSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTEzOQorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE0MCwgLTE0MCwgLTE0MCwgLTE0MCwgLTE0MCwgLTE0MCwgLTE0MCwgLTE0MCwgLTE0MCwKKyAgICAgLTE0MCwgLTE0MCwgLTE0MCwgICA1OCwgLTE0MCwgLTE0MCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDE2MiwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE0MAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xNDEsIC0xNDEsIC0xNDEsIC0xNDEsIC0xNDEsIC0xNDEsIC0xNDEsIC0xNDEsIC0xNDEsCisgICAgIC0xNDEsIC0xNDEsIC0xNDEsICAgNTgsIC0xNDEsIC0xNDEsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAxNjMsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xNDEKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTQyLCAtMTQyLCAtMTQyLCAtMTQyLCAtMTQyLCAtMTQyLCAtMTQyLCAtMTQyLCAtMTQyLAorICAgICAtMTQyLCAtMTQyLCAtMTQyLCAgIDU4LCAtMTQyLCAtMTQyLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxNjQsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xNDIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTQzLCAtMTQzLCAtMTQzLCAtMTQzLCAtMTQzLCAtMTQzLCAtMTQzLCAtMTQzLCAtMTQzLAorICAgICAtMTQzLCAtMTQzLCAtMTQzLCAgIDU4LCAtMTQzLCAtMTQzLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgMTY1LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTQzCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE0NCwgLTE0NCwgLTE0NCwgLTE0NCwgLTE0NCwgLTE0NCwgLTE0NCwgLTE0NCwgLTE0NCwKKyAgICAgLTE0NCwgLTE0NCwgLTE0NCwgICA1OCwgLTE0NCwgLTE0NCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDE2NiwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE0NAorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE0NSwgLTE0NSwgLTE0NSwgLTE0NSwgLTE0NSwgLTE0NSwgLTE0NSwgLTE0NSwgLTE0NSwKKyAgICAgLTE0NSwgLTE0NSwgLTE0NSwgICA1OCwgLTE0NSwgLTE0NSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgIDE2NywgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE0NQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xNDYsIC0xNDYsIC0xNDYsIC0xNDYsIC0xNDYsIC0xNDYsIC0xNDYsIC0xNDYsIC0xNDYsCisgICAgIC0xNDYsIC0xNDYsIC0xNDYsICAgNTgsIC0xNDYsIC0xNDYsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAxNjgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xNDYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTQ3LCAtMTQ3LCAtMTQ3LCAtMTQ3LCAtMTQ3LCAtMTQ3LCAtMTQ3LCAtMTQ3LCAtMTQ3LAorICAgICAtMTQ3LCAtMTQ3LCAtMTQ3LCAgIDU4LCAtMTQ3LCAtMTQ3LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxNjksCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xNDcKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTQ4LCAtMTQ4LCAtMTQ4LCAtMTQ4LCAtMTQ4LCAtMTQ4LCAtMTQ4LCAtMTQ4LCAtMTQ4LAorICAgICAtMTQ4LCAtMTQ4LCAtMTQ4LCAgIDU4LCAtMTQ4LCAtMTQ4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTQ4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE0OSwgLTE0OSwgLTE0OSwgLTE0OSwgLTE0OSwgLTE0OSwgLTE0OSwgLTE0OSwgLTE0OSwKKyAgICAgLTE0OSwgLTE0OSwgLTE0OSwgICA1OCwgLTE0OSwgLTE0OSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDE3MCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE0OQorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE1MCwgLTE1MCwgLTE1MCwgLTE1MCwgLTE1MCwgLTE1MCwgLTE1MCwgLTE1MCwgLTE1MCwKKyAgICAgLTE1MCwgLTE1MCwgLTE1MCwgICA1OCwgLTE1MCwgLTE1MCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgIDE3MSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE1MAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xNTEsIC0xNTEsIC0xNTEsIC0xNTEsIC0xNTEsIC0xNTEsIC0xNTEsIC0xNTEsIC0xNTEsCisgICAgIC0xNTEsIC0xNTEsIC0xNTEsICAgNTgsIC0xNTEsIC0xNTEsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxNzIsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xNTEKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTUyLCAtMTUyLCAtMTUyLCAtMTUyLCAtMTUyLCAtMTUyLCAtMTUyLCAtMTUyLCAtMTUyLAorICAgICAtMTUyLCAtMTUyLCAtMTUyLCAgIDU4LCAtMTUyLCAtMTUyLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxNzMsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xNTIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTUzLCAtMTUzLCAtMTUzLCAtMTUzLCAtMTUzLCAtMTUzLCAtMTUzLCAtMTUzLCAtMTUzLAorICAgICAtMTUzLCAtMTUzLCAtMTUzLCAgIDU4LCAtMTUzLCAtMTUzLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTc0LCAgIDU4LCAgIDU4LCAtMTUzCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE1NCwgLTE1NCwgLTE1NCwgLTE1NCwgLTE1NCwgLTE1NCwgLTE1NCwgLTE1NCwgLTE1NCwKKyAgICAgLTE1NCwgLTE1NCwgLTE1NCwgICA1OCwgLTE1NCwgLTE1NCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE1NAorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE1NSwgLTE1NSwgLTE1NSwgLTE1NSwgLTE1NSwgLTE1NSwgLTE1NSwgLTE1NSwgLTE1NSwKKyAgICAgLTE1NSwgLTE1NSwgLTE1NSwgICA1OCwgLTE1NSwgLTE1NSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgIDE3NSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE1NQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xNTYsIC0xNTYsIC0xNTYsIC0xNTYsIC0xNTYsIC0xNTYsIC0xNTYsIC0xNTYsIC0xNTYsCisgICAgIC0xNTYsIC0xNTYsIC0xNTYsICAgNTgsIC0xNTYsIC0xNTYsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxNzYsICAgNTgsICAgNTgsIC0xNTYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTU3LCAtMTU3LCAtMTU3LCAtMTU3LCAtMTU3LCAtMTU3LCAtMTU3LCAtMTU3LCAtMTU3LAorICAgICAtMTU3LCAtMTU3LCAtMTU3LCAgIDU4LCAtMTU3LCAtMTU3LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorCisgICAgICAgNTgsICAxNzcsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xNTcKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTU4LCAtMTU4LCAtMTU4LCAtMTU4LCAtMTU4LCAtMTU4LCAtMTU4LCAtMTU4LCAtMTU4LAorICAgICAtMTU4LCAtMTU4LCAtMTU4LCAgIDU4LCAtMTU4LCAtMTU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgMTc4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTU4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE1OSwgLTE1OSwgLTE1OSwgLTE1OSwgLTE1OSwgLTE1OSwgLTE1OSwgLTE1OSwgLTE1OSwKKyAgICAgLTE1OSwgLTE1OSwgLTE1OSwgICA1OCwgLTE1OSwgLTE1OSwgICA1OCwgIDE3OSwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE1OQorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE2MCwgLTE2MCwgLTE2MCwgLTE2MCwgLTE2MCwgLTE2MCwgLTE2MCwgLTE2MCwgLTE2MCwKKyAgICAgLTE2MCwgLTE2MCwgLTE2MCwgICA1OCwgLTE2MCwgLTE2MCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDE4MCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE2MAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xNjEsIC0xNjEsIC0xNjEsIC0xNjEsIC0xNjEsIC0xNjEsIC0xNjEsIC0xNjEsIC0xNjEsCisgICAgIC0xNjEsIC0xNjEsIC0xNjEsICAgNTgsIC0xNjEsIC0xNjEsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xNjEKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTYyLCAtMTYyLCAtMTYyLCAtMTYyLCAtMTYyLCAtMTYyLCAtMTYyLCAtMTYyLCAtMTYyLAorICAgICAtMTYyLCAtMTYyLCAtMTYyLCAgIDU4LCAtMTYyLCAtMTYyLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxODEsICAgNTgsICAgNTgsIC0xNjIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTYzLCAtMTYzLCAtMTYzLCAtMTYzLCAtMTYzLCAtMTYzLCAtMTYzLCAtMTYzLCAtMTYzLAorICAgICAtMTYzLCAtMTYzLCAtMTYzLCAgIDU4LCAtMTYzLCAtMTYzLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTYzCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE2NCwgLTE2NCwgLTE2NCwgLTE2NCwgLTE2NCwgLTE2NCwgLTE2NCwgLTE2NCwgLTE2NCwKKyAgICAgLTE2NCwgLTE2NCwgLTE2NCwgICA1OCwgLTE2NCwgLTE2NCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDE4MiwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE2NAorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE2NSwgLTE2NSwgLTE2NSwgLTE2NSwgLTE2NSwgLTE2NSwgLTE2NSwgLTE2NSwgLTE2NSwKKyAgICAgLTE2NSwgLTE2NSwgLTE2NSwgICA1OCwgLTE2NSwgLTE2NSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDE4MywgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE2NQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xNjYsIC0xNjYsIC0xNjYsIC0xNjYsIC0xNjYsIC0xNjYsIC0xNjYsIC0xNjYsIC0xNjYsCisgICAgIC0xNjYsIC0xNjYsIC0xNjYsICAgNTgsIC0xNjYsIC0xNjYsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxODQsICAgNTgsICAgNTgsIC0xNjYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTY3LCAtMTY3LCAtMTY3LCAtMTY3LCAtMTY3LCAtMTY3LCAtMTY3LCAtMTY3LCAtMTY3LAorICAgICAtMTY3LCAtMTY3LCAtMTY3LCAgIDU4LCAtMTY3LCAtMTY3LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAxODUsICAgNTgsICAgNTgsICAgNTgsIC0xNjcKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTY4LCAtMTY4LCAtMTY4LCAtMTY4LCAtMTY4LCAtMTY4LCAtMTY4LCAtMTY4LCAtMTY4LAorICAgICAtMTY4LCAtMTY4LCAtMTY4LCAgIDU4LCAtMTY4LCAtMTY4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTY4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE2OSwgLTE2OSwgLTE2OSwgLTE2OSwgLTE2OSwgLTE2OSwgLTE2OSwgLTE2OSwgLTE2OSwKKyAgICAgLTE2OSwgLTE2OSwgLTE2OSwgICA1OCwgLTE2OSwgLTE2OSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDE4NiwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE2OQorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE3MCwgLTE3MCwgLTE3MCwgLTE3MCwgLTE3MCwgLTE3MCwgLTE3MCwgLTE3MCwgLTE3MCwKKyAgICAgLTE3MCwgLTE3MCwgLTE3MCwgICA1OCwgLTE3MCwgLTE3MCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDE4NywgICA1OCwgLTE3MAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xNzEsIC0xNzEsIC0xNzEsIC0xNzEsIC0xNzEsIC0xNzEsIC0xNzEsIC0xNzEsIC0xNzEsCisgICAgIC0xNzEsIC0xNzEsIC0xNzEsICAgNTgsIC0xNzEsIC0xNzEsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxODgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xNzEKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTcyLCAtMTcyLCAtMTcyLCAtMTcyLCAtMTcyLCAtMTcyLCAtMTcyLCAtMTcyLCAtMTcyLAorICAgICAtMTcyLCAtMTcyLCAtMTcyLCAgIDU4LCAtMTcyLCAtMTcyLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxODksICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xNzIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTczLCAtMTczLCAtMTczLCAtMTczLCAtMTczLCAtMTczLCAtMTczLCAtMTczLCAtMTczLAorICAgICAtMTczLCAtMTczLCAtMTczLCAgIDU4LCAtMTczLCAtMTczLCAgIDU4LCAgMTkwLCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTczCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE3NCwgLTE3NCwgLTE3NCwgLTE3NCwgLTE3NCwgLTE3NCwgLTE3NCwgLTE3NCwgLTE3NCwKKyAgICAgLTE3NCwgLTE3NCwgLTE3NCwgICA1OCwgLTE3NCwgLTE3NCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE3NAorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE3NSwgLTE3NSwgLTE3NSwgLTE3NSwgLTE3NSwgLTE3NSwgLTE3NSwgLTE3NSwgLTE3NSwKKyAgICAgLTE3NSwgLTE3NSwgLTE3NSwgICA1OCwgLTE3NSwgLTE3NSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgIDE5MSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE3NQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xNzYsIC0xNzYsIC0xNzYsIC0xNzYsIC0xNzYsIC0xNzYsIC0xNzYsIC0xNzYsIC0xNzYsCisgICAgIC0xNzYsIC0xNzYsIC0xNzYsICAgNTgsIC0xNzYsIC0xNzYsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xNzYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTc3LCAtMTc3LCAtMTc3LCAtMTc3LCAtMTc3LCAtMTc3LCAtMTc3LCAtMTc3LCAtMTc3LAorICAgICAtMTc3LCAtMTc3LCAtMTc3LCAgIDU4LCAtMTc3LCAtMTc3LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xNzcKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTc4LCAtMTc4LCAtMTc4LCAtMTc4LCAtMTc4LCAtMTc4LCAtMTc4LCAtMTc4LCAtMTc4LAorICAgICAtMTc4LCAtMTc4LCAtMTc4LCAgIDU4LCAtMTc4LCAtMTc4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTc4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE3OSwgLTE3OSwgLTE3OSwgLTE3OSwgLTE3OSwgLTE3OSwgLTE3OSwgLTE3OSwgLTE3OSwKKyAgICAgLTE3OSwgLTE3OSwgLTE3OSwgICA1OCwgLTE3OSwgLTE3OSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDE5MiwgICA1OCwgICA1OCwgLTE3OQorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE4MCwgLTE4MCwgLTE4MCwgLTE4MCwgLTE4MCwgLTE4MCwgLTE4MCwgLTE4MCwgLTE4MCwKKyAgICAgLTE4MCwgLTE4MCwgLTE4MCwgICA1OCwgLTE4MCwgLTE4MCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE4MAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xODEsIC0xODEsIC0xODEsIC0xODEsIC0xODEsIC0xODEsIC0xODEsIC0xODEsIC0xODEsCisgICAgIC0xODEsIC0xODEsIC0xODEsICAgNTgsIC0xODEsIC0xODEsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xODEKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTgyLCAtMTgyLCAtMTgyLCAtMTgyLCAtMTgyLCAtMTgyLCAtMTgyLCAtMTgyLCAtMTgyLAorICAgICAtMTgyLCAtMTgyLCAtMTgyLCAgIDU4LCAtMTgyLCAtMTgyLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAxOTMsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xODIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTgzLCAtMTgzLCAtMTgzLCAtMTgzLCAtMTgzLCAtMTgzLCAtMTgzLCAtMTgzLCAtMTgzLAorICAgICAtMTgzLCAtMTgzLCAtMTgzLCAgIDU4LCAtMTgzLCAtMTgzLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgMTk0LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTgzCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE4NCwgLTE4NCwgLTE4NCwgLTE4NCwgLTE4NCwgLTE4NCwgLTE4NCwgLTE4NCwgLTE4NCwKKyAgICAgLTE4NCwgLTE4NCwgLTE4NCwgICA1OCwgLTE4NCwgLTE4NCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE4NAorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE4NSwgLTE4NSwgLTE4NSwgLTE4NSwgLTE4NSwgLTE4NSwgLTE4NSwgLTE4NSwgLTE4NSwKKyAgICAgLTE4NSwgLTE4NSwgLTE4NSwgICA1OCwgLTE4NSwgLTE4NSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE4NQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xODYsIC0xODYsIC0xODYsIC0xODYsIC0xODYsIC0xODYsIC0xODYsIC0xODYsIC0xODYsCisgICAgIC0xODYsIC0xODYsIC0xODYsICAgNTgsIC0xODYsIC0xODYsICAgNTgsICAgNTgsICAgNTgsICAxOTUsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xODYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTg3LCAtMTg3LCAtMTg3LCAtMTg3LCAtMTg3LCAtMTg3LCAtMTg3LCAtMTg3LCAtMTg3LAorICAgICAtMTg3LCAtMTg3LCAtMTg3LCAgIDU4LCAtMTg3LCAtMTg3LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xODcKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTg4LCAtMTg4LCAtMTg4LCAtMTg4LCAtMTg4LCAtMTg4LCAtMTg4LCAtMTg4LCAtMTg4LAorICAgICAtMTg4LCAtMTg4LCAtMTg4LCAgIDU4LCAtMTg4LCAtMTg4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgMTk2LCAgIDU4LCAtMTg4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE4OSwgLTE4OSwgLTE4OSwgLTE4OSwgLTE4OSwgLTE4OSwgLTE4OSwgLTE4OSwgLTE4OSwKKyAgICAgLTE4OSwgLTE4OSwgLTE4OSwgICA1OCwgLTE4OSwgLTE4OSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgIDE5NywgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE4OQorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE5MCwgLTE5MCwgLTE5MCwgLTE5MCwgLTE5MCwgLTE5MCwgLTE5MCwgLTE5MCwgLTE5MCwKKyAgICAgLTE5MCwgLTE5MCwgLTE5MCwgICA1OCwgLTE5MCwgLTE5MCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDE5OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE5MAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xOTEsIC0xOTEsIC0xOTEsIC0xOTEsIC0xOTEsIC0xOTEsIC0xOTEsIC0xOTEsIC0xOTEsCisgICAgIC0xOTEsIC0xOTEsIC0xOTEsICAgNTgsIC0xOTEsIC0xOTEsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAxOTksICAgNTgsICAgNTgsICAgNTgsIC0xOTEKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTkyLCAtMTkyLCAtMTkyLCAtMTkyLCAtMTkyLCAtMTkyLCAtMTkyLCAtMTkyLCAtMTkyLAorICAgICAtMTkyLCAtMTkyLCAtMTkyLCAgIDU4LCAtMTkyLCAtMTkyLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorCisgICAgICAgNTgsICAyMDAsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xOTIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTkzLCAtMTkzLCAtMTkzLCAtMTkzLCAtMTkzLCAtMTkzLCAtMTkzLCAtMTkzLCAtMTkzLAorICAgICAtMTkzLCAtMTkzLCAtMTkzLCAgIDU4LCAtMTkzLCAtMTkzLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgMjAxLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTkzCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE5NCwgLTE5NCwgLTE5NCwgLTE5NCwgLTE5NCwgLTE5NCwgLTE5NCwgLTE5NCwgLTE5NCwKKyAgICAgLTE5NCwgLTE5NCwgLTE5NCwgICA1OCwgLTE5NCwgLTE5NCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDIwMiwgICA1OCwgICA1OCwgLTE5NAorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE5NSwgLTE5NSwgLTE5NSwgLTE5NSwgLTE5NSwgLTE5NSwgLTE5NSwgLTE5NSwgLTE5NSwKKyAgICAgLTE5NSwgLTE5NSwgLTE5NSwgICA1OCwgLTE5NSwgLTE5NSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgIDIwMywgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE5NQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0xOTYsIC0xOTYsIC0xOTYsIC0xOTYsIC0xOTYsIC0xOTYsIC0xOTYsIC0xOTYsIC0xOTYsCisgICAgIC0xOTYsIC0xOTYsIC0xOTYsICAgNTgsIC0xOTYsIC0xOTYsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xOTYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTk3LCAtMTk3LCAtMTk3LCAtMTk3LCAtMTk3LCAtMTk3LCAtMTk3LCAtMTk3LCAtMTk3LAorICAgICAtMTk3LCAtMTk3LCAtMTk3LCAgIDU4LCAtMTk3LCAtMTk3LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAyMDQsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0xOTcKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMTk4LCAtMTk4LCAtMTk4LCAtMTk4LCAtMTk4LCAtMTk4LCAtMTk4LCAtMTk4LCAtMTk4LAorICAgICAtMTk4LCAtMTk4LCAtMTk4LCAgIDU4LCAtMTk4LCAtMTk4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMTk4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTE5OSwgLTE5OSwgLTE5OSwgLTE5OSwgLTE5OSwgLTE5OSwgLTE5OSwgLTE5OSwgLTE5OSwKKyAgICAgLTE5OSwgLTE5OSwgLTE5OSwgICA1OCwgLTE5OSwgLTE5OSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTE5OQorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTIwMCwgLTIwMCwgLTIwMCwgLTIwMCwgLTIwMCwgLTIwMCwgLTIwMCwgLTIwMCwgLTIwMCwKKyAgICAgLTIwMCwgLTIwMCwgLTIwMCwgICA1OCwgLTIwMCwgLTIwMCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTIwMAorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0yMDEsIC0yMDEsIC0yMDEsIC0yMDEsIC0yMDEsIC0yMDEsIC0yMDEsIC0yMDEsIC0yMDEsCisgICAgIC0yMDEsIC0yMDEsIC0yMDEsICAgNTgsIC0yMDEsIC0yMDEsICAgNTgsICAyMDUsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0yMDEKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMjAyLCAtMjAyLCAtMjAyLCAtMjAyLCAtMjAyLCAtMjAyLCAtMjAyLCAtMjAyLCAtMjAyLAorICAgICAtMjAyLCAtMjAyLCAtMjAyLCAgIDU4LCAtMjAyLCAtMjAyLCAgIDU4LCAgMjA2LCAgIDU4LCAgIDU4LAorCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0yMDIKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMjAzLCAtMjAzLCAtMjAzLCAtMjAzLCAtMjAzLCAtMjAzLCAtMjAzLCAtMjAzLCAtMjAzLAorICAgICAtMjAzLCAtMjAzLCAtMjAzLCAgIDU4LCAtMjAzLCAtMjAzLCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMjAzCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTIwNCwgLTIwNCwgLTIwNCwgLTIwNCwgLTIwNCwgLTIwNCwgLTIwNCwgLTIwNCwgLTIwNCwKKyAgICAgLTIwNCwgLTIwNCwgLTIwNCwgICA1OCwgLTIwNCwgLTIwNCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgIDIwNywgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTIwNAorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTIwNSwgLTIwNSwgLTIwNSwgLTIwNSwgLTIwNSwgLTIwNSwgLTIwNSwgLTIwNSwgLTIwNSwKKyAgICAgLTIwNSwgLTIwNSwgLTIwNSwgICA1OCwgLTIwNSwgLTIwNSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgIDIwOCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTIwNQorICAgIH0sCisKKyAgICB7CisgICAgICAgMTEsIC0yMDYsIC0yMDYsIC0yMDYsIC0yMDYsIC0yMDYsIC0yMDYsIC0yMDYsIC0yMDYsIC0yMDYsCisgICAgIC0yMDYsIC0yMDYsIC0yMDYsICAgNTgsIC0yMDYsIC0yMDYsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAyMDksICAgNTgsICAgNTgsIC0yMDYKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMjA3LCAtMjA3LCAtMjA3LCAtMjA3LCAtMjA3LCAtMjA3LCAtMjA3LCAtMjA3LCAtMjA3LAorICAgICAtMjA3LCAtMjA3LCAtMjA3LCAgIDU4LCAtMjA3LCAtMjA3LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsCisgICAgICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsICAgNTgsIC0yMDcKKyAgICB9LAorCisgICAgeworICAgICAgIDExLCAtMjA4LCAtMjA4LCAtMjA4LCAtMjA4LCAtMjA4LCAtMjA4LCAtMjA4LCAtMjA4LCAtMjA4LAorICAgICAtMjA4LCAtMjA4LCAtMjA4LCAgIDU4LCAtMjA4LCAtMjA4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LAorICAgICAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAgIDU4LCAtMjA4CisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTIwOSwgLTIwOSwgLTIwOSwgLTIwOSwgLTIwOSwgLTIwOSwgLTIwOSwgLTIwOSwgLTIwOSwKKyAgICAgLTIwOSwgLTIwOSwgLTIwOSwgICA1OCwgLTIwOSwgLTIwOSwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgIDIxMCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTIwOQorCisgICAgfSwKKworICAgIHsKKyAgICAgICAxMSwgLTIxMCwgLTIxMCwgLTIxMCwgLTIxMCwgLTIxMCwgLTIxMCwgLTIxMCwgLTIxMCwgLTIxMCwKKyAgICAgLTIxMCwgLTIxMCwgLTIxMCwgICA1OCwgLTIxMCwgLTIxMCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwKKyAgICAgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgICA1OCwgLTIxMAorICAgIH0sCisKKyAgICB9IDsKKworc3RhdGljIHl5X3N0YXRlX3R5cGUgeXlfZ2V0X3ByZXZpb3VzX3N0YXRlICh2b2lkICk7CitzdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV90cnlfTlVMX3RyYW5zICh5eV9zdGF0ZV90eXBlIGN1cnJlbnRfc3RhdGUgICk7CitzdGF0aWMgaW50IHl5X2dldF9uZXh0X2J1ZmZlciAodm9pZCApOworc3RhdGljIHZvaWQgeXlfZmF0YWxfZXJyb3IgKHl5Y29uc3QgY2hhciBtc2dbXSAgKTsKKworLyogRG9uZSBhZnRlciB0aGUgY3VycmVudCBwYXR0ZXJuIGhhcyBiZWVuIG1hdGNoZWQgYW5kIGJlZm9yZSB0aGUKKyAqIGNvcnJlc3BvbmRpbmcgYWN0aW9uIC0gc2V0cyB1cCB6Y29uZnRleHQuCisgKi8KKyNkZWZpbmUgWVlfRE9fQkVGT1JFX0FDVElPTiBcCisJKHl5dGV4dF9wdHIpID0geXlfYnA7IFwKKwl6Y29uZmxlbmcgPSAoc2l6ZV90KSAoeXlfY3AgLSB5eV9icCk7IFwKKwkoeXlfaG9sZF9jaGFyKSA9ICp5eV9jcDsgXAorCSp5eV9jcCA9ICdcMCc7IFwKKwkoeXlfY19idWZfcCkgPSB5eV9jcDsKKworI2RlZmluZSBZWV9OVU1fUlVMRVMgNjQKKyNkZWZpbmUgWVlfRU5EX09GX0JVRkZFUiA2NQorLyogVGhpcyBzdHJ1Y3QgaXMgbm90IHVzZWQgaW4gdGhpcyBzY2FubmVyLAorICAgYnV0IGl0cyBwcmVzZW5jZSBpcyBuZWNlc3NhcnkuICovCitzdHJ1Y3QgeXlfdHJhbnNfaW5mbworCXsKKwlmbGV4X2ludDMyX3QgeXlfdmVyaWZ5OworCWZsZXhfaW50MzJfdCB5eV9ueHQ7CisJfTsKK3N0YXRpYyB5eWNvbnN0IGZsZXhfaW50MTZfdCB5eV9hY2NlcHRbMjExXSA9CisgICAgeyAgIDAsCisgICAgICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsICAgIDAsCisgICAgICAgNjUsICAgIDUsICAgIDQsICAgIDMsICAgIDIsICAgMzYsICAgMzcsICAgMzUsICAgMzUsICAgMzUsCisgICAgICAgMzUsICAgMzUsICAgMzUsICAgMzUsICAgMzUsICAgMzUsICAgMzUsICAgMzUsICAgMzUsICAgMzUsCisgICAgICAgNjMsICAgNjAsICAgNjIsICAgNTUsICAgNTksICAgNTgsICAgNTcsICAgNTMsICAgNDgsICAgNDIsCisgICAgICAgNDcsICAgNTEsICAgNTMsICAgNDAsICAgNDEsICAgNTAsICAgNTAsICAgNDMsICAgNTMsICAgNTAsCisgICAgICAgNTAsICAgNTMsICAgIDQsICAgIDMsICAgIDIsICAgIDIsICAgIDEsICAgMzUsICAgMzUsICAgMzUsCisgICAgICAgMzUsICAgMzUsICAgMzUsICAgMzUsICAgMTYsICAgMzUsICAgMzUsICAgMzUsICAgMzUsICAgMzUsCisgICAgICAgMzUsICAgMzUsICAgMzUsICAgMzUsICAgMzUsICAgMzUsICAgNjMsICAgNjAsICAgNjIsICAgNjEsCisgICAgICAgNTUsICAgNTQsICAgNTcsICAgNTYsICAgNDQsICAgNTEsICAgMzgsICAgNTAsICAgNTAsICAgNTIsCisgICAgICAgNDUsICAgNDYsICAgMzksICAgMzUsICAgMzUsICAgMzUsICAgMzUsICAgMzUsICAgMzUsICAgMzUsCisKKyAgICAgICAzNSwgICAzNSwgICAzMCwgICAyOSwgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAzNSwKKyAgICAgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICA0OSwgICAyNSwgICAzNSwgICAzNSwgICAzNSwgICAzNSwKKyAgICAgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAxNSwgICAzNSwgICAgNywgICAzNSwKKyAgICAgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAzNSwKKyAgICAgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAxNywgICAzNSwgICAzNSwKKyAgICAgICAzNSwgICAzNSwgICAzNSwgICAzNCwgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAzNSwKKyAgICAgICAxMCwgICAzNSwgICAxMywgICAzNSwgICAzNSwgICAzNSwgICAzNSwgICAzMywgICAzNSwgICAzNSwKKyAgICAgICAzNSwgICAzNSwgICAzNSwgICAyMiwgICAzNSwgICAzMiwgICAgOSwgICAzMSwgICAzNSwgICAyNiwKKyAgICAgICAxMiwgICAzNSwgICAzNSwgICAyMSwgICAxOCwgICAzNSwgICAgOCwgICAzNSwgICAzNSwgICAzNSwKKyAgICAgICAzNSwgICAzNSwgICAyNywgICAzNSwgICAzNSwgICAgNiwgICAzNSwgICAyMCwgICAxOSwgICAyMywKKworICAgICAgIDM1LCAgIDM1LCAgIDExLCAgIDM1LCAgIDM1LCAgIDM1LCAgIDE0LCAgIDI4LCAgIDM1LCAgIDI0CisgICAgfSA7CisKK3N0YXRpYyB5eWNvbnN0IGZsZXhfaW50MzJfdCB5eV9lY1syNTZdID0KKyAgICB7ICAgMCwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMiwgICAgMywKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAgMSwgICAgMiwgICAgNCwgICAgNSwgICAgNiwgICAgMSwgICAgMSwgICAgNywgICAgOCwgICAgOSwKKyAgICAgICAxMCwgICAgMSwgICAgMSwgICAgMSwgICAxMSwgICAxMiwgICAxMiwgICAxMywgICAxMywgICAxMywKKyAgICAgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAgMSwgICAgMSwgICAgMSwKKyAgICAgICAxNCwgICAgMSwgICAgMSwgICAgMSwgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywKKyAgICAgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywKKyAgICAgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywgICAxMywKKyAgICAgICAgMSwgICAxNSwgICAgMSwgICAgMSwgICAxNiwgICAgMSwgICAxNywgICAxOCwgICAxOSwgICAyMCwKKworICAgICAgIDIxLCAgIDIyLCAgIDIzLCAgIDI0LCAgIDI1LCAgIDEzLCAgIDEzLCAgIDI2LCAgIDI3LCAgIDI4LAorICAgICAgIDI5LCAgIDMwLCAgIDMxLCAgIDMyLCAgIDMzLCAgIDM0LCAgIDM1LCAgIDEzLCAgIDEzLCAgIDM2LAorICAgICAgIDEzLCAgIDEzLCAgICAxLCAgIDM3LCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorICAgICAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLCAgICAxLAorCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEsCisgICAgICAgIDEsICAgIDEsICAgIDEsICAgIDEsICAgIDEKKyAgICB9IDsKKworZXh0ZXJuIGludCB6Y29uZl9mbGV4X2RlYnVnOworaW50IHpjb25mX2ZsZXhfZGVidWcgPSAwOworCisvKiBUaGUgaW50ZW50IGJlaGluZCB0aGlzIGRlZmluaXRpb24gaXMgdGhhdCBpdCdsbCBjYXRjaAorICogYW55IHVzZXMgb2YgUkVKRUNUIHdoaWNoIGZsZXggbWlzc2VkLgorICovCisjZGVmaW5lIFJFSkVDVCByZWplY3RfdXNlZF9idXRfbm90X2RldGVjdGVkCisjZGVmaW5lIHl5bW9yZSgpIHl5bW9yZV91c2VkX2J1dF9ub3RfZGV0ZWN0ZWQKKyNkZWZpbmUgWVlfTU9SRV9BREogMAorI2RlZmluZSBZWV9SRVNUT1JFX1lZX01PUkVfT0ZGU0VUCitjaGFyICp6Y29uZnRleHQ7CisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+CisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KKyAqLworCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2RlZmluZSBMS0NfRElSRUNUX0xJTksKKyNpbmNsdWRlICJsa2MuaCIKKworI2RlZmluZSBTVEFSVF9TVFJTSVpFCTE2CisKK2NoYXIgKnRleHQ7CitzdGF0aWMgY2hhciAqdGV4dF9wdHI7CitzdGF0aWMgaW50IHRleHRfc2l6ZSwgdGV4dF9hc2l6ZTsKKworc3RydWN0IGJ1ZmZlciB7CisgICAgICAgIHN0cnVjdCBidWZmZXIgKnBhcmVudDsKKyAgICAgICAgWVlfQlVGRkVSX1NUQVRFIHN0YXRlOworfTsKKworc3RydWN0IGJ1ZmZlciAqY3VycmVudF9idWY7CisKK3N0YXRpYyBpbnQgbGFzdF90cywgZmlyc3RfdHM7CisKK3N0YXRpYyB2b2lkIHpjb25mX2VuZGhlbHAodm9pZCk7CitzdGF0aWMgc3RydWN0IGJ1ZmZlciAqemNvbmZfZW5kZmlsZSh2b2lkKTsKKwordm9pZCBuZXdfc3RyaW5nKHZvaWQpCit7CisJdGV4dCA9IG1hbGxvYyhTVEFSVF9TVFJTSVpFKTsKKwl0ZXh0X2FzaXplID0gU1RBUlRfU1RSU0laRTsKKwl0ZXh0X3B0ciA9IHRleHQ7CisJdGV4dF9zaXplID0gMDsKKwkqdGV4dF9wdHIgPSAwOworfQorCit2b2lkIGFwcGVuZF9zdHJpbmcoY29uc3QgY2hhciAqc3RyLCBpbnQgc2l6ZSkKK3sKKwlpbnQgbmV3X3NpemUgPSB0ZXh0X3NpemUgKyBzaXplICsgMTsKKwlpZiAobmV3X3NpemUgPiB0ZXh0X2FzaXplKSB7CisJCXRleHQgPSByZWFsbG9jKHRleHQsIG5ld19zaXplKTsKKwkJdGV4dF9hc2l6ZSA9IG5ld19zaXplOworCQl0ZXh0X3B0ciA9IHRleHQgKyB0ZXh0X3NpemU7CisJfQorCW1lbWNweSh0ZXh0X3B0ciwgc3RyLCBzaXplKTsKKwl0ZXh0X3B0ciArPSBzaXplOworCXRleHRfc2l6ZSArPSBzaXplOworCSp0ZXh0X3B0ciA9IDA7Cit9CisKK3ZvaWQgYWxsb2Nfc3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgaW50IHNpemUpCit7CisJdGV4dCA9IG1hbGxvYyhzaXplICsgMSk7CisJbWVtY3B5KHRleHQsIHN0ciwgc2l6ZSk7CisJdGV4dFtzaXplXSA9IDA7Cit9CisKKyNkZWZpbmUgSU5JVElBTCAwCisjZGVmaW5lIENPTU1BTkQgMQorI2RlZmluZSBIRUxQIDIKKyNkZWZpbmUgU1RSSU5HIDMKKyNkZWZpbmUgUEFSQU0gNAorCisvKiBTcGVjaWFsIGNhc2UgZm9yICJ1bmlzdGQuaCIsIHNpbmNlIGl0IGlzIG5vbi1BTlNJLiBXZSBpbmNsdWRlIGl0IHdheQorICogZG93biBoZXJlIGJlY2F1c2Ugd2Ugd2FudCB0aGUgdXNlcidzIHNlY3Rpb24gMSB0byBoYXZlIGJlZW4gc2Nhbm5lZCBmaXJzdC4KKyAqIFRoZSB1c2VyIGhhcyBhIGNoYW5jZSB0byBvdmVycmlkZSBpdCB3aXRoIGFuIG9wdGlvbi4KKyAqLworI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZuZGVmIFlZX0VYVFJBX1RZUEUKKyNkZWZpbmUgWVlfRVhUUkFfVFlQRSB2b2lkICoKKyNlbmRpZgorCisvKiBNYWNyb3MgYWZ0ZXIgdGhpcyBwb2ludCBjYW4gYWxsIGJlIG92ZXJyaWRkZW4gYnkgdXNlciBkZWZpbml0aW9ucyBpbgorICogc2VjdGlvbiAxLgorICovCisKKyNpZm5kZWYgWVlfU0tJUF9ZWVdSQVAKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiBpbnQgemNvbmZ3cmFwICh2b2lkICk7CisjZWxzZQorZXh0ZXJuIGludCB6Y29uZndyYXAgKHZvaWQgKTsKKyNlbmRpZgorI2VuZGlmCisKKyAgICBzdGF0aWMgdm9pZCB5eXVucHV0IChpbnQgYyxjaGFyICpidWZfcHRyICApOworICAgIAorI2lmbmRlZiB5eXRleHRfcHRyCitzdGF0aWMgdm9pZCB5eV9mbGV4X3N0cm5jcHkgKGNoYXIgKix5eWNvbnN0IGNoYXIgKixpbnQgKTsKKyNlbmRpZgorCisjaWZkZWYgWVlfTkVFRF9TVFJMRU4KK3N0YXRpYyBpbnQgeXlfZmxleF9zdHJsZW4gKHl5Y29uc3QgY2hhciAqICk7CisjZW5kaWYKKworI2lmbmRlZiBZWV9OT19JTlBVVAorCisjaWZkZWYgX19jcGx1c3BsdXMKK3N0YXRpYyBpbnQgeXlpbnB1dCAodm9pZCApOworI2Vsc2UKK3N0YXRpYyBpbnQgaW5wdXQgKHZvaWQgKTsKKyNlbmRpZgorCisjZW5kaWYKKworLyogQW1vdW50IG9mIHN0dWZmIHRvIHNsdXJwIHVwIHdpdGggZWFjaCByZWFkLiAqLworI2lmbmRlZiBZWV9SRUFEX0JVRl9TSVpFCisjZGVmaW5lIFlZX1JFQURfQlVGX1NJWkUgODE5MgorI2VuZGlmCisKKy8qIENvcHkgd2hhdGV2ZXIgdGhlIGxhc3QgcnVsZSBtYXRjaGVkIHRvIHRoZSBzdGFuZGFyZCBvdXRwdXQuICovCisjaWZuZGVmIEVDSE8KKy8qIFRoaXMgdXNlZCB0byBiZSBhbiBmcHV0cygpLCBidXQgc2luY2UgdGhlIHN0cmluZyBtaWdodCBjb250YWluIE5VTCdzLAorICogd2Ugbm93IHVzZSBmd3JpdGUoKS4KKyAqLworI2RlZmluZSBFQ0hPICh2b2lkKSBmd3JpdGUoIHpjb25mdGV4dCwgemNvbmZsZW5nLCAxLCB6Y29uZm91dCApCisjZW5kaWYKKworLyogR2V0cyBpbnB1dCBhbmQgc3R1ZmZzIGl0IGludG8gImJ1ZiIuICBudW1iZXIgb2YgY2hhcmFjdGVycyByZWFkLCBvciBZWV9OVUxMLAorICogaXMgcmV0dXJuZWQgaW4gInJlc3VsdCIuCisgKi8KKyNpZm5kZWYgWVlfSU5QVVQKKyNkZWZpbmUgWVlfSU5QVVQoYnVmLHJlc3VsdCxtYXhfc2l6ZSkgXAorCWVycm5vPTA7IFwKKwl3aGlsZSAoIChyZXN1bHQgPSByZWFkKCBmaWxlbm8oemNvbmZpbiksIChjaGFyICopIGJ1ZiwgbWF4X3NpemUgKSkgPCAwICkgXAorCXsgXAorCQlpZiggZXJybm8gIT0gRUlOVFIpIFwKKwkJeyBcCisJCQlZWV9GQVRBTF9FUlJPUiggImlucHV0IGluIGZsZXggc2Nhbm5lciBmYWlsZWQiICk7IFwKKwkJCWJyZWFrOyBcCisJCX0gXAorCQllcnJubz0wOyBcCisJCWNsZWFyZXJyKHpjb25maW4pOyBcCisJfVwKK1wKKworI2VuZGlmCisKKy8qIE5vIHNlbWktY29sb24gYWZ0ZXIgcmV0dXJuOyBjb3JyZWN0IHVzYWdlIGlzIHRvIHdyaXRlICJ5eXRlcm1pbmF0ZSgpOyIgLQorICogd2UgZG9uJ3Qgd2FudCBhbiBleHRyYSAnOycgYWZ0ZXIgdGhlICJyZXR1cm4iIGJlY2F1c2UgdGhhdCB3aWxsIGNhdXNlCisgKiBzb21lIGNvbXBpbGVycyB0byBjb21wbGFpbiBhYm91dCB1bnJlYWNoYWJsZSBzdGF0ZW1lbnRzLgorICovCisjaWZuZGVmIHl5dGVybWluYXRlCisjZGVmaW5lIHl5dGVybWluYXRlKCkgcmV0dXJuIFlZX05VTEwKKyNlbmRpZgorCisvKiBOdW1iZXIgb2YgZW50cmllcyBieSB3aGljaCBzdGFydC1jb25kaXRpb24gc3RhY2sgZ3Jvd3MuICovCisjaWZuZGVmIFlZX1NUQVJUX1NUQUNLX0lOQ1IKKyNkZWZpbmUgWVlfU1RBUlRfU1RBQ0tfSU5DUiAyNQorI2VuZGlmCisKKy8qIFJlcG9ydCBhIGZhdGFsIGVycm9yLiAqLworI2lmbmRlZiBZWV9GQVRBTF9FUlJPUgorI2RlZmluZSBZWV9GQVRBTF9FUlJPUihtc2cpIHl5X2ZhdGFsX2Vycm9yKCBtc2cgKQorI2VuZGlmCisKKy8qIGVuZCB0YWJsZXMgc2VyaWFsaXphdGlvbiBzdHJ1Y3R1cmVzIGFuZCBwcm90b3R5cGVzICovCisKKy8qIERlZmF1bHQgZGVjbGFyYXRpb24gb2YgZ2VuZXJhdGVkIHNjYW5uZXIgLSBhIGRlZmluZSBzbyB0aGUgdXNlciBjYW4KKyAqIGVhc2lseSBhZGQgcGFyYW1ldGVycy4KKyAqLworI2lmbmRlZiBZWV9ERUNMCisjZGVmaW5lIFlZX0RFQ0xfSVNfT1VSUyAxCisKK2V4dGVybiBpbnQgemNvbmZsZXggKHZvaWQpOworCisjZGVmaW5lIFlZX0RFQ0wgaW50IHpjb25mbGV4ICh2b2lkKQorI2VuZGlmIC8qICFZWV9ERUNMICovCisKKy8qIENvZGUgZXhlY3V0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHJ1bGUsIGFmdGVyIHpjb25mdGV4dCBhbmQgemNvbmZsZW5nCisgKiBoYXZlIGJlZW4gc2V0IHVwLgorICovCisjaWZuZGVmIFlZX1VTRVJfQUNUSU9OCisjZGVmaW5lIFlZX1VTRVJfQUNUSU9OCisjZW5kaWYKKworLyogQ29kZSBleGVjdXRlZCBhdCB0aGUgZW5kIG9mIGVhY2ggcnVsZS4gKi8KKyNpZm5kZWYgWVlfQlJFQUsKKyNkZWZpbmUgWVlfQlJFQUsgYnJlYWs7CisjZW5kaWYKKworI2RlZmluZSBZWV9SVUxFX1NFVFVQIFwKKwlZWV9VU0VSX0FDVElPTgorCisvKiogVGhlIG1haW4gc2Nhbm5lciBmdW5jdGlvbiB3aGljaCBkb2VzIGFsbCB0aGUgd29yay4KKyAqLworWVlfREVDTAoreworCXJlZ2lzdGVyIHl5X3N0YXRlX3R5cGUgeXlfY3VycmVudF9zdGF0ZTsKKwlyZWdpc3RlciBjaGFyICp5eV9jcCwgKnl5X2JwOworCXJlZ2lzdGVyIGludCB5eV9hY3Q7CisgICAgCisJaW50IHN0ciA9IDA7CisJaW50IHRzLCBpOworCisJaWYgKCAoeXlfaW5pdCkgKQorCQl7CisJCSh5eV9pbml0KSA9IDA7CisKKyNpZmRlZiBZWV9VU0VSX0lOSVQKKwkJWVlfVVNFUl9JTklUOworI2VuZGlmCisKKwkJaWYgKCAhICh5eV9zdGFydCkgKQorCQkJKHl5X3N0YXJ0KSA9IDE7CS8qIGZpcnN0IHN0YXJ0IHN0YXRlICovCisKKwkJaWYgKCAhIHpjb25maW4gKQorCQkJemNvbmZpbiA9IHN0ZGluOworCisJCWlmICggISB6Y29uZm91dCApCisJCQl6Y29uZm91dCA9IHN0ZG91dDsKKworCQlpZiAoICEgWVlfQ1VSUkVOVF9CVUZGRVIgKSB7CisJCQl6Y29uZmVuc3VyZV9idWZmZXJfc3RhY2sgKCk7CisJCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPQorCQkJCXpjb25mX2NyZWF0ZV9idWZmZXIoemNvbmZpbixZWV9CVUZfU0laRSApOworCQl9CisKKwkJemNvbmZfbG9hZF9idWZmZXJfc3RhdGUoICk7CisJCX0KKworCXdoaWxlICggMSApCQkvKiBsb29wcyB1bnRpbCBlbmQtb2YtZmlsZSBpcyByZWFjaGVkICovCisJCXsKKwkJeXlfY3AgPSAoeXlfY19idWZfcCk7CisKKwkJLyogU3VwcG9ydCBvZiB6Y29uZnRleHQuICovCisJCSp5eV9jcCA9ICh5eV9ob2xkX2NoYXIpOworCisJCS8qIHl5X2JwIHBvaW50cyB0byB0aGUgcG9zaXRpb24gaW4geXlfY2hfYnVmIG9mIHRoZSBzdGFydCBvZgorCQkgKiB0aGUgY3VycmVudCBydW4uCisJCSAqLworCQl5eV9icCA9IHl5X2NwOworCisJCXl5X2N1cnJlbnRfc3RhdGUgPSAoeXlfc3RhcnQpOworeXlfbWF0Y2g6CisJCXdoaWxlICggKHl5X2N1cnJlbnRfc3RhdGUgPSB5eV9ueHRbeXlfY3VycmVudF9zdGF0ZV1bIHl5X2VjW1lZX1NDX1RPX1VJKCp5eV9jcCldICBdKSA+IDAgKQorCQkJKyt5eV9jcDsKKworCQl5eV9jdXJyZW50X3N0YXRlID0gLXl5X2N1cnJlbnRfc3RhdGU7CisKK3l5X2ZpbmRfYWN0aW9uOgorCQl5eV9hY3QgPSB5eV9hY2NlcHRbeXlfY3VycmVudF9zdGF0ZV07CisKKwkJWVlfRE9fQkVGT1JFX0FDVElPTjsKKworZG9fYWN0aW9uOgkvKiBUaGlzIGxhYmVsIGlzIHVzZWQgb25seSB0byBhY2Nlc3MgRU9GIGFjdGlvbnMuICovCisKKwkJc3dpdGNoICggeXlfYWN0ICkKKwl7IC8qIGJlZ2lubmluZyBvZiBhY3Rpb24gc3dpdGNoICovCitjYXNlIDE6CisvKiBydWxlIDEgY2FuIG1hdGNoIGVvbCAqLworWVlfUlVMRV9TRVRVUAorY3VycmVudF9maWxlLT5saW5lbm8rKzsKKwlZWV9CUkVBSworY2FzZSAyOgorWVlfUlVMRV9TRVRVUAorCisJWVlfQlJFQUsKK2Nhc2UgMzoKKy8qIHJ1bGUgMyBjYW4gbWF0Y2ggZW9sICovCitZWV9SVUxFX1NFVFVQCitjdXJyZW50X2ZpbGUtPmxpbmVubysrOyByZXR1cm4gVF9FT0w7CisJWVlfQlJFQUsKK2Nhc2UgNDoKK1lZX1JVTEVfU0VUVVAKK3sKKwlCRUdJTihDT01NQU5EKTsKK30KKwlZWV9CUkVBSworY2FzZSA1OgorWVlfUlVMRV9TRVRVUAoreworCXVucHV0KHpjb25mdGV4dFswXSk7CisJQkVHSU4oQ09NTUFORCk7Cit9CisJWVlfQlJFQUsKKworY2FzZSA2OgorWVlfUlVMRV9TRVRVUAorQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9NQUlOTUVOVTsKKwlZWV9CUkVBSworY2FzZSA3OgorWVlfUlVMRV9TRVRVUAorQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9NRU5VOworCVlZX0JSRUFLCitjYXNlIDg6CitZWV9SVUxFX1NFVFVQCitCRUdJTihQQVJBTSk7IHJldHVybiBUX0VORE1FTlU7CisJWVlfQlJFQUsKK2Nhc2UgOToKK1lZX1JVTEVfU0VUVVAKK0JFR0lOKFBBUkFNKTsgcmV0dXJuIFRfU09VUkNFOworCVlZX0JSRUFLCitjYXNlIDEwOgorWVlfUlVMRV9TRVRVUAorQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9DSE9JQ0U7CisJWVlfQlJFQUsKK2Nhc2UgMTE6CitZWV9SVUxFX1NFVFVQCitCRUdJTihQQVJBTSk7IHJldHVybiBUX0VORENIT0lDRTsKKwlZWV9CUkVBSworY2FzZSAxMjoKK1lZX1JVTEVfU0VUVVAKK0JFR0lOKFBBUkFNKTsgcmV0dXJuIFRfQ09NTUVOVDsKKwlZWV9CUkVBSworY2FzZSAxMzoKK1lZX1JVTEVfU0VUVVAKK0JFR0lOKFBBUkFNKTsgcmV0dXJuIFRfQ09ORklHOworCVlZX0JSRUFLCitjYXNlIDE0OgorWVlfUlVMRV9TRVRVUAorQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9NRU5VQ09ORklHOworCVlZX0JSRUFLCitjYXNlIDE1OgorWVlfUlVMRV9TRVRVUAorQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9IRUxQOworCVlZX0JSRUFLCitjYXNlIDE2OgorWVlfUlVMRV9TRVRVUAorQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9JRjsKKwlZWV9CUkVBSworY2FzZSAxNzoKK1lZX1JVTEVfU0VUVVAKK0JFR0lOKFBBUkFNKTsgcmV0dXJuIFRfRU5ESUY7CisJWVlfQlJFQUsKK2Nhc2UgMTg6CitZWV9SVUxFX1NFVFVQCitCRUdJTihQQVJBTSk7IHJldHVybiBUX0RFUEVORFM7CisJWVlfQlJFQUsKK2Nhc2UgMTk6CitZWV9SVUxFX1NFVFVQCitCRUdJTihQQVJBTSk7IHJldHVybiBUX1JFUVVJUkVTOworCVlZX0JSRUFLCitjYXNlIDIwOgorWVlfUlVMRV9TRVRVUAorQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9PUFRJT05BTDsKKwlZWV9CUkVBSworY2FzZSAyMToKK1lZX1JVTEVfU0VUVVAKK0JFR0lOKFBBUkFNKTsgcmV0dXJuIFRfREVGQVVMVDsKKwlZWV9CUkVBSworY2FzZSAyMjoKK1lZX1JVTEVfU0VUVVAKK0JFR0lOKFBBUkFNKTsgcmV0dXJuIFRfUFJPTVBUOworCVlZX0JSRUFLCitjYXNlIDIzOgorWVlfUlVMRV9TRVRVUAorQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9UUklTVEFURTsKKwlZWV9CUkVBSworY2FzZSAyNDoKK1lZX1JVTEVfU0VUVVAKK0JFR0lOKFBBUkFNKTsgcmV0dXJuIFRfREVGX1RSSVNUQVRFOworCVlZX0JSRUFLCitjYXNlIDI1OgorWVlfUlVMRV9TRVRVUAorQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9CT09MRUFOOworCVlZX0JSRUFLCitjYXNlIDI2OgorWVlfUlVMRV9TRVRVUAorQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9CT09MRUFOOworCVlZX0JSRUFLCitjYXNlIDI3OgorWVlfUlVMRV9TRVRVUAorQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9ERUZfQk9PTEVBTjsKKwlZWV9CUkVBSworY2FzZSAyODoKK1lZX1JVTEVfU0VUVVAKK0JFR0lOKFBBUkFNKTsgcmV0dXJuIFRfREVGX0JPT0xFQU47CisJWVlfQlJFQUsKK2Nhc2UgMjk6CitZWV9SVUxFX1NFVFVQCitCRUdJTihQQVJBTSk7IHJldHVybiBUX0lOVDsKKwlZWV9CUkVBSworY2FzZSAzMDoKK1lZX1JVTEVfU0VUVVAKK0JFR0lOKFBBUkFNKTsgcmV0dXJuIFRfSEVYOworCVlZX0JSRUFLCitjYXNlIDMxOgorWVlfUlVMRV9TRVRVUAorQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9TVFJJTkc7CisJWVlfQlJFQUsKK2Nhc2UgMzI6CitZWV9SVUxFX1NFVFVQCitCRUdJTihQQVJBTSk7IHJldHVybiBUX1NFTEVDVDsKKwlZWV9CUkVBSworY2FzZSAzMzoKK1lZX1JVTEVfU0VUVVAKK0JFR0lOKFBBUkFNKTsgcmV0dXJuIFRfU0VMRUNUOworCVlZX0JSRUFLCitjYXNlIDM0OgorWVlfUlVMRV9TRVRVUAorQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9SQU5HRTsKKwlZWV9CUkVBSworY2FzZSAzNToKK1lZX1JVTEVfU0VUVVAKK3sKKwkJYWxsb2Nfc3RyaW5nKHpjb25mdGV4dCwgemNvbmZsZW5nKTsKKwkJemNvbmZsdmFsLnN0cmluZyA9IHRleHQ7CisJCXJldHVybiBUX1dPUkQ7CisJfQorCVlZX0JSRUFLCitjYXNlIDM2OgorWVlfUlVMRV9TRVRVUAorCisJWVlfQlJFQUsKK2Nhc2UgMzc6CisvKiBydWxlIDM3IGNhbiBtYXRjaCBlb2wgKi8KK1lZX1JVTEVfU0VUVVAKK2N1cnJlbnRfZmlsZS0+bGluZW5vKys7IEJFR0lOKElOSVRJQUwpOworCVlZX0JSRUFLCisKK2Nhc2UgMzg6CitZWV9SVUxFX1NFVFVQCityZXR1cm4gVF9BTkQ7CisJWVlfQlJFQUsKK2Nhc2UgMzk6CitZWV9SVUxFX1NFVFVQCityZXR1cm4gVF9PUjsKKwlZWV9CUkVBSworY2FzZSA0MDoKK1lZX1JVTEVfU0VUVVAKK3JldHVybiBUX09QRU5fUEFSRU47CisJWVlfQlJFQUsKK2Nhc2UgNDE6CitZWV9SVUxFX1NFVFVQCityZXR1cm4gVF9DTE9TRV9QQVJFTjsKKwlZWV9CUkVBSworY2FzZSA0MjoKK1lZX1JVTEVfU0VUVVAKK3JldHVybiBUX05PVDsKKwlZWV9CUkVBSworY2FzZSA0MzoKK1lZX1JVTEVfU0VUVVAKK3JldHVybiBUX0VRVUFMOworCVlZX0JSRUFLCitjYXNlIDQ0OgorWVlfUlVMRV9TRVRVUAorcmV0dXJuIFRfVU5FUVVBTDsKKwlZWV9CUkVBSworY2FzZSA0NToKK1lZX1JVTEVfU0VUVVAKK3JldHVybiBUX0lGOworCVlZX0JSRUFLCitjYXNlIDQ2OgorWVlfUlVMRV9TRVRVUAorcmV0dXJuIFRfT047CisJWVlfQlJFQUsKK2Nhc2UgNDc6CitZWV9SVUxFX1NFVFVQCit7CisJCXN0ciA9IHpjb25mdGV4dFswXTsKKwkJbmV3X3N0cmluZygpOworCQlCRUdJTihTVFJJTkcpOworCX0KKwlZWV9CUkVBSworY2FzZSA0ODoKKy8qIHJ1bGUgNDggY2FuIG1hdGNoIGVvbCAqLworWVlfUlVMRV9TRVRVUAorQkVHSU4oSU5JVElBTCk7IGN1cnJlbnRfZmlsZS0+bGluZW5vKys7IHJldHVybiBUX0VPTDsKKwlZWV9CUkVBSworY2FzZSA0OToKK1lZX1JVTEVfU0VUVVAKKy8qIGlnbm9yZSAqLworCVlZX0JSRUFLCitjYXNlIDUwOgorWVlfUlVMRV9TRVRVUAoreworCQlhbGxvY19zdHJpbmcoemNvbmZ0ZXh0LCB6Y29uZmxlbmcpOworCQl6Y29uZmx2YWwuc3RyaW5nID0gdGV4dDsKKwkJcmV0dXJuIFRfV09SRDsKKwl9CisJWVlfQlJFQUsKK2Nhc2UgNTE6CitZWV9SVUxFX1NFVFVQCisvKiBjb21tZW50ICovCisJWVlfQlJFQUsKK2Nhc2UgNTI6CisvKiBydWxlIDUyIGNhbiBtYXRjaCBlb2wgKi8KK1lZX1JVTEVfU0VUVVAKK2N1cnJlbnRfZmlsZS0+bGluZW5vKys7CisJWVlfQlJFQUsKK2Nhc2UgNTM6CitZWV9SVUxFX1NFVFVQCisKKwlZWV9CUkVBSworY2FzZSBZWV9TVEFURV9FT0YoUEFSQU0pOgoreworCQlCRUdJTihJTklUSUFMKTsKKwl9CisJWVlfQlJFQUsKKworY2FzZSA1NDoKKy8qIHJ1bGUgNTQgY2FuIG1hdGNoIGVvbCAqLworKnl5X2NwID0gKHl5X2hvbGRfY2hhcik7IC8qIHVuZG8gZWZmZWN0cyBvZiBzZXR0aW5nIHVwIHpjb25mdGV4dCAqLworKHl5X2NfYnVmX3ApID0geXlfY3AgLT0gMTsKK1lZX0RPX0JFRk9SRV9BQ1RJT047IC8qIHNldCB1cCB6Y29uZnRleHQgYWdhaW4gKi8KK1lZX1JVTEVfU0VUVVAKK3sKKwkJYXBwZW5kX3N0cmluZyh6Y29uZnRleHQsIHpjb25mbGVuZyk7CisJCXpjb25mbHZhbC5zdHJpbmcgPSB0ZXh0OworCQlyZXR1cm4gVF9XT1JEX1FVT1RFOworCX0KKwlZWV9CUkVBSworY2FzZSA1NToKK1lZX1JVTEVfU0VUVVAKK3sKKwkJYXBwZW5kX3N0cmluZyh6Y29uZnRleHQsIHpjb25mbGVuZyk7CisJfQorCVlZX0JSRUFLCitjYXNlIDU2OgorLyogcnVsZSA1NiBjYW4gbWF0Y2ggZW9sICovCisqeXlfY3AgPSAoeXlfaG9sZF9jaGFyKTsgLyogdW5kbyBlZmZlY3RzIG9mIHNldHRpbmcgdXAgemNvbmZ0ZXh0ICovCisoeXlfY19idWZfcCkgPSB5eV9jcCAtPSAxOworWVlfRE9fQkVGT1JFX0FDVElPTjsgLyogc2V0IHVwIHpjb25mdGV4dCBhZ2FpbiAqLworWVlfUlVMRV9TRVRVUAoreworCQlhcHBlbmRfc3RyaW5nKHpjb25mdGV4dCArIDEsIHpjb25mbGVuZyAtIDEpOworCQl6Y29uZmx2YWwuc3RyaW5nID0gdGV4dDsKKwkJcmV0dXJuIFRfV09SRF9RVU9URTsKKwl9CisJWVlfQlJFQUsKK2Nhc2UgNTc6CitZWV9SVUxFX1NFVFVQCit7CisJCWFwcGVuZF9zdHJpbmcoemNvbmZ0ZXh0ICsgMSwgemNvbmZsZW5nIC0gMSk7CisJfQorCVlZX0JSRUFLCitjYXNlIDU4OgorWVlfUlVMRV9TRVRVUAoreworCQlpZiAoc3RyID09IHpjb25mdGV4dFswXSkgeworCQkJQkVHSU4oUEFSQU0pOworCQkJemNvbmZsdmFsLnN0cmluZyA9IHRleHQ7CisJCQlyZXR1cm4gVF9XT1JEX1FVT1RFOworCQl9IGVsc2UKKwkJCWFwcGVuZF9zdHJpbmcoemNvbmZ0ZXh0LCAxKTsKKwl9CisJWVlfQlJFQUsKK2Nhc2UgNTk6CisvKiBydWxlIDU5IGNhbiBtYXRjaCBlb2wgKi8KK1lZX1JVTEVfU0VUVVAKK3sKKwkJcHJpbnRmKCIlczolZDp3YXJuaW5nOiBtdWx0aS1saW5lIHN0cmluZ3Mgbm90IHN1cHBvcnRlZFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CisJCWN1cnJlbnRfZmlsZS0+bGluZW5vKys7CisJCUJFR0lOKElOSVRJQUwpOworCQlyZXR1cm4gVF9FT0w7CisJfQorCVlZX0JSRUFLCitjYXNlIFlZX1NUQVRFX0VPRihTVFJJTkcpOgoreworCQlCRUdJTihJTklUSUFMKTsKKwl9CisJWVlfQlJFQUsKKworY2FzZSA2MDoKK1lZX1JVTEVfU0VUVVAKK3sKKwkJdHMgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgemNvbmZsZW5nOyBpKyspIHsKKwkJCWlmICh6Y29uZnRleHRbaV0gPT0gJ1x0JykKKwkJCQl0cyA9ICh0cyAmIH43KSArIDg7CisJCQllbHNlCisJCQkJdHMrKzsKKwkJfQorCQlsYXN0X3RzID0gdHM7CisJCWlmIChmaXJzdF90cykgeworCQkJaWYgKHRzIDwgZmlyc3RfdHMpIHsKKwkJCQl6Y29uZl9lbmRoZWxwKCk7CisJCQkJcmV0dXJuIFRfSEVMUFRFWFQ7CisJCQl9CisJCQl0cyAtPSBmaXJzdF90czsKKwkJCXdoaWxlICh0cyA+IDgpIHsKKwkJCQlhcHBlbmRfc3RyaW5nKCIgICAgICAgICIsIDgpOworCQkJCXRzIC09IDg7CisJCQl9CisJCQlhcHBlbmRfc3RyaW5nKCIgICAgICAgICIsIHRzKTsKKwkJfQorCX0KKwlZWV9CUkVBSworY2FzZSA2MToKKy8qIHJ1bGUgNjEgY2FuIG1hdGNoIGVvbCAqLworKnl5X2NwID0gKHl5X2hvbGRfY2hhcik7IC8qIHVuZG8gZWZmZWN0cyBvZiBzZXR0aW5nIHVwIHpjb25mdGV4dCAqLworKHl5X2NfYnVmX3ApID0geXlfY3AgLT0gMTsKK1lZX0RPX0JFRk9SRV9BQ1RJT047IC8qIHNldCB1cCB6Y29uZnRleHQgYWdhaW4gKi8KK1lZX1JVTEVfU0VUVVAKK3sKKwkJY3VycmVudF9maWxlLT5saW5lbm8rKzsKKwkJemNvbmZfZW5kaGVscCgpOworCQlyZXR1cm4gVF9IRUxQVEVYVDsKKwl9CisJWVlfQlJFQUsKK2Nhc2UgNjI6CisvKiBydWxlIDYyIGNhbiBtYXRjaCBlb2wgKi8KK1lZX1JVTEVfU0VUVVAKK3sKKwkJY3VycmVudF9maWxlLT5saW5lbm8rKzsKKwkJYXBwZW5kX3N0cmluZygiXG4iLCAxKTsKKwl9CisJWVlfQlJFQUsKK2Nhc2UgNjM6CitZWV9SVUxFX1NFVFVQCit7CisJCWFwcGVuZF9zdHJpbmcoemNvbmZ0ZXh0LCB6Y29uZmxlbmcpOworCQlpZiAoIWZpcnN0X3RzKQorCQkJZmlyc3RfdHMgPSBsYXN0X3RzOworCX0KKwlZWV9CUkVBSworY2FzZSBZWV9TVEFURV9FT0YoSEVMUCk6Cit7CisJCXpjb25mX2VuZGhlbHAoKTsKKwkJcmV0dXJuIFRfSEVMUFRFWFQ7CisJfQorCVlZX0JSRUFLCisKK2Nhc2UgWVlfU1RBVEVfRU9GKElOSVRJQUwpOgorY2FzZSBZWV9TVEFURV9FT0YoQ09NTUFORCk6Cit7CisJaWYgKGN1cnJlbnRfYnVmKSB7CisJCXpjb25mX2VuZGZpbGUoKTsKKwkJcmV0dXJuIFRfRU9GOworCX0KKwlmY2xvc2UoemNvbmZpbik7CisJeXl0ZXJtaW5hdGUoKTsKK30KKwlZWV9CUkVBSworY2FzZSA2NDoKK1lZX1JVTEVfU0VUVVAKK1lZX0ZBVEFMX0VSUk9SKCAiZmxleCBzY2FubmVyIGphbW1lZCIgKTsKKwlZWV9CUkVBSworCisJY2FzZSBZWV9FTkRfT0ZfQlVGRkVSOgorCQl7CisJCS8qIEFtb3VudCBvZiB0ZXh0IG1hdGNoZWQgbm90IGluY2x1ZGluZyB0aGUgRU9CIGNoYXIuICovCisJCWludCB5eV9hbW91bnRfb2ZfbWF0Y2hlZF90ZXh0ID0gKGludCkgKHl5X2NwIC0gKHl5dGV4dF9wdHIpKSAtIDE7CisKKwkJLyogVW5kbyB0aGUgZWZmZWN0cyBvZiBZWV9ET19CRUZPUkVfQUNUSU9OLiAqLworCQkqeXlfY3AgPSAoeXlfaG9sZF9jaGFyKTsKKwkJWVlfUkVTVE9SRV9ZWV9NT1JFX09GRlNFVAorCisJCWlmICggWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZmZXJfc3RhdHVzID09IFlZX0JVRkZFUl9ORVcgKQorCQkJeworCQkJLyogV2UncmUgc2Nhbm5pbmcgYSBuZXcgZmlsZSBvciBpbnB1dCBzb3VyY2UuICBJdCdzCisJCQkgKiBwb3NzaWJsZSB0aGF0IHRoaXMgaGFwcGVuZWQgYmVjYXVzZSB0aGUgdXNlcgorCQkJICoganVzdCBwb2ludGVkIHpjb25maW4gYXQgYSBuZXcgc291cmNlIGFuZCBjYWxsZWQKKwkJCSAqIHpjb25mbGV4KCkuICBJZiBzbywgdGhlbiB3ZSBoYXZlIHRvIGFzc3VyZQorCQkJICogY29uc2lzdGVuY3kgYmV0d2VlbiBZWV9DVVJSRU5UX0JVRkZFUiBhbmQgb3VyCisJCQkgKiBnbG9iYWxzLiAgSGVyZSBpcyB0aGUgcmlnaHQgcGxhY2UgdG8gZG8gc28sIGJlY2F1c2UKKwkJCSAqIHRoaXMgaXMgdGhlIGZpcnN0IGFjdGlvbiAob3RoZXIgdGhhbiBwb3NzaWJseSBhCisJCQkgKiBiYWNrLXVwKSB0aGF0IHdpbGwgbWF0Y2ggZm9yIHRoZSBuZXcgaW5wdXQgc291cmNlLgorCQkJICovCisJCQkoeXlfbl9jaGFycykgPSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X25fY2hhcnM7CisJCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2lucHV0X2ZpbGUgPSB6Y29uZmluOworCQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZmZXJfc3RhdHVzID0gWVlfQlVGRkVSX05PUk1BTDsKKwkJCX0KKworCQkvKiBOb3RlIHRoYXQgaGVyZSB3ZSB0ZXN0IGZvciB5eV9jX2J1Zl9wICI8PSIgdG8gdGhlIHBvc2l0aW9uCisJCSAqIG9mIHRoZSBmaXJzdCBFT0IgaW4gdGhlIGJ1ZmZlciwgc2luY2UgeXlfY19idWZfcCB3aWxsCisJCSAqIGFscmVhZHkgaGF2ZSBiZWVuIGluY3JlbWVudGVkIHBhc3QgdGhlIE5VTCBjaGFyYWN0ZXIKKwkJICogKHNpbmNlIGFsbCBzdGF0ZXMgbWFrZSB0cmFuc2l0aW9ucyBvbiBFT0IgdG8gdGhlCisJCSAqIGVuZC1vZi1idWZmZXIgc3RhdGUpLiAgQ29udHJhc3QgdGhpcyB3aXRoIHRoZSB0ZXN0CisJCSAqIGluIGlucHV0KCkuCisJCSAqLworCQlpZiAoICh5eV9jX2J1Zl9wKSA8PSAmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbKHl5X25fY2hhcnMpXSApCisJCQl7IC8qIFRoaXMgd2FzIHJlYWxseSBhIE5VTC4gKi8KKwkJCXl5X3N0YXRlX3R5cGUgeXlfbmV4dF9zdGF0ZTsKKworCQkJKHl5X2NfYnVmX3ApID0gKHl5dGV4dF9wdHIpICsgeXlfYW1vdW50X29mX21hdGNoZWRfdGV4dDsKKworCQkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X2dldF9wcmV2aW91c19zdGF0ZSggICk7CisKKwkJCS8qIE9rYXksIHdlJ3JlIG5vdyBwb3NpdGlvbmVkIHRvIG1ha2UgdGhlIE5VTAorCQkJICogdHJhbnNpdGlvbi4gIFdlIGNvdWxkbid0IGhhdmUKKwkJCSAqIHl5X2dldF9wcmV2aW91c19zdGF0ZSgpIGdvIGFoZWFkIGFuZCBkbyBpdAorCQkJICogZm9yIHVzIGJlY2F1c2UgaXQgZG9lc24ndCBrbm93IGhvdyB0byBkZWFsCisJCQkgKiB3aXRoIHRoZSBwb3NzaWJpbGl0eSBvZiBqYW1taW5nIChhbmQgd2UgZG9uJ3QKKwkJCSAqIHdhbnQgdG8gYnVpbGQgamFtbWluZyBpbnRvIGl0IGJlY2F1c2UgdGhlbiBpdAorCQkJICogd2lsbCBydW4gbW9yZSBzbG93bHkpLgorCQkJICovCisKKwkJCXl5X25leHRfc3RhdGUgPSB5eV90cnlfTlVMX3RyYW5zKCB5eV9jdXJyZW50X3N0YXRlICk7CisKKwkJCXl5X2JwID0gKHl5dGV4dF9wdHIpICsgWVlfTU9SRV9BREo7CisKKwkJCWlmICggeXlfbmV4dF9zdGF0ZSApCisJCQkJeworCQkJCS8qIENvbnN1bWUgdGhlIE5VTC4gKi8KKwkJCQl5eV9jcCA9ICsrKHl5X2NfYnVmX3ApOworCQkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9uZXh0X3N0YXRlOworCQkJCWdvdG8geXlfbWF0Y2g7CisJCQkJfQorCisJCQllbHNlCisJCQkJeworCQkJCXl5X2NwID0gKHl5X2NfYnVmX3ApOworCQkJCWdvdG8geXlfZmluZF9hY3Rpb247CisJCQkJfQorCQkJfQorCisJCWVsc2Ugc3dpdGNoICggeXlfZ2V0X25leHRfYnVmZmVyKCAgKSApCisJCQl7CisJCQljYXNlIEVPQl9BQ1RfRU5EX09GX0ZJTEU6CisJCQkJeworCQkJCSh5eV9kaWRfYnVmZmVyX3N3aXRjaF9vbl9lb2YpID0gMDsKKworCQkJCWlmICggemNvbmZ3cmFwKCApICkKKwkJCQkJeworCQkJCQkvKiBOb3RlOiBiZWNhdXNlIHdlJ3ZlIHRha2VuIGNhcmUgaW4KKwkJCQkJICogeXlfZ2V0X25leHRfYnVmZmVyKCkgdG8gaGF2ZSBzZXQgdXAKKwkJCQkJICogemNvbmZ0ZXh0LCB3ZSBjYW4gbm93IHNldCB1cAorCQkJCQkgKiB5eV9jX2J1Zl9wIHNvIHRoYXQgaWYgc29tZSB0b3RhbAorCQkJCQkgKiBob3NlciAobGlrZSBmbGV4IGl0c2VsZikgd2FudHMgdG8KKwkJCQkJICogY2FsbCB0aGUgc2Nhbm5lciBhZnRlciB3ZSByZXR1cm4gdGhlCisJCQkJCSAqIFlZX05VTEwsIGl0J2xsIHN0aWxsIHdvcmsgLSBhbm90aGVyCisJCQkJCSAqIFlZX05VTEwgd2lsbCBnZXQgcmV0dXJuZWQuCisJCQkJCSAqLworCQkJCQkoeXlfY19idWZfcCkgPSAoeXl0ZXh0X3B0cikgKyBZWV9NT1JFX0FESjsKKworCQkJCQl5eV9hY3QgPSBZWV9TVEFURV9FT0YoWVlfU1RBUlQpOworCQkJCQlnb3RvIGRvX2FjdGlvbjsKKwkJCQkJfQorCisJCQkJZWxzZQorCQkJCQl7CisJCQkJCWlmICggISAoeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mKSApCisJCQkJCQlZWV9ORVdfRklMRTsKKwkJCQkJfQorCQkJCWJyZWFrOworCQkJCX0KKworCQkJY2FzZSBFT0JfQUNUX0NPTlRJTlVFX1NDQU46CisJCQkJKHl5X2NfYnVmX3ApID0KKwkJCQkJKHl5dGV4dF9wdHIpICsgeXlfYW1vdW50X29mX21hdGNoZWRfdGV4dDsKKworCQkJCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9nZXRfcHJldmlvdXNfc3RhdGUoICApOworCisJCQkJeXlfY3AgPSAoeXlfY19idWZfcCk7CisJCQkJeXlfYnAgPSAoeXl0ZXh0X3B0cikgKyBZWV9NT1JFX0FESjsKKwkJCQlnb3RvIHl5X21hdGNoOworCisJCQljYXNlIEVPQl9BQ1RfTEFTVF9NQVRDSDoKKwkJCQkoeXlfY19idWZfcCkgPQorCQkJCSZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlsoeXlfbl9jaGFycyldOworCisJCQkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X2dldF9wcmV2aW91c19zdGF0ZSggICk7CisKKwkJCQl5eV9jcCA9ICh5eV9jX2J1Zl9wKTsKKwkJCQl5eV9icCA9ICh5eXRleHRfcHRyKSArIFlZX01PUkVfQURKOworCQkJCWdvdG8geXlfZmluZF9hY3Rpb247CisJCQl9CisJCWJyZWFrOworCQl9CisKKwlkZWZhdWx0OgorCQlZWV9GQVRBTF9FUlJPUigKKwkJCSJmYXRhbCBmbGV4IHNjYW5uZXIgaW50ZXJuYWwgZXJyb3ItLW5vIGFjdGlvbiBmb3VuZCIgKTsKKwl9IC8qIGVuZCBvZiBhY3Rpb24gc3dpdGNoICovCisJCX0gLyogZW5kIG9mIHNjYW5uaW5nIG9uZSB0b2tlbiAqLworfSAvKiBlbmQgb2YgemNvbmZsZXggKi8KKworLyogeXlfZ2V0X25leHRfYnVmZmVyIC0gdHJ5IHRvIHJlYWQgaW4gYSBuZXcgYnVmZmVyCisgKgorICogUmV0dXJucyBhIGNvZGUgcmVwcmVzZW50aW5nIGFuIGFjdGlvbjoKKyAqCUVPQl9BQ1RfTEFTVF9NQVRDSCAtCisgKglFT0JfQUNUX0NPTlRJTlVFX1NDQU4gLSBjb250aW51ZSBzY2FubmluZyBmcm9tIGN1cnJlbnQgcG9zaXRpb24KKyAqCUVPQl9BQ1RfRU5EX09GX0ZJTEUgLSBlbmQgb2YgZmlsZQorICovCitzdGF0aWMgaW50IHl5X2dldF9uZXh0X2J1ZmZlciAodm9pZCkKK3sKKyAgICAJcmVnaXN0ZXIgY2hhciAqZGVzdCA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmOworCXJlZ2lzdGVyIGNoYXIgKnNvdXJjZSA9ICh5eXRleHRfcHRyKTsKKwlyZWdpc3RlciBpbnQgbnVtYmVyX3RvX21vdmUsIGk7CisJaW50IHJldF92YWw7CisKKwlpZiAoICh5eV9jX2J1Zl9wKSA+ICZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZlsoeXlfbl9jaGFycykgKyAxXSApCisJCVlZX0ZBVEFMX0VSUk9SKAorCQkiZmF0YWwgZmxleCBzY2FubmVyIGludGVybmFsIGVycm9yLS1lbmQgb2YgYnVmZmVyIG1pc3NlZCIgKTsKKworCWlmICggWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9maWxsX2J1ZmZlciA9PSAwICkKKwkJeyAvKiBEb24ndCB0cnkgdG8gZmlsbCB0aGUgYnVmZmVyLCBzbyB0aGlzIGlzIGFuIEVPRi4gKi8KKwkJaWYgKCAoeXlfY19idWZfcCkgLSAoeXl0ZXh0X3B0cikgLSBZWV9NT1JFX0FESiA9PSAxICkKKwkJCXsKKwkJCS8qIFdlIG1hdGNoZWQgYSBzaW5nbGUgY2hhcmFjdGVyLCB0aGUgRU9CLCBzbworCQkJICogdHJlYXQgdGhpcyBhcyBhIGZpbmFsIEVPRi4KKwkJCSAqLworCQkJcmV0dXJuIEVPQl9BQ1RfRU5EX09GX0ZJTEU7CisJCQl9CisKKwkJZWxzZQorCQkJeworCQkJLyogV2UgbWF0Y2hlZCBzb21lIHRleHQgcHJpb3IgdG8gdGhlIEVPQiwgZmlyc3QKKwkJCSAqIHByb2Nlc3MgaXQuCisJCQkgKi8KKwkJCXJldHVybiBFT0JfQUNUX0xBU1RfTUFUQ0g7CisJCQl9CisJCX0KKworCS8qIFRyeSB0byByZWFkIG1vcmUgZGF0YS4gKi8KKworCS8qIEZpcnN0IG1vdmUgbGFzdCBjaGFycyB0byBzdGFydCBvZiBidWZmZXIuICovCisJbnVtYmVyX3RvX21vdmUgPSAoaW50KSAoKHl5X2NfYnVmX3ApIC0gKHl5dGV4dF9wdHIpKSAtIDE7CisKKwlmb3IgKCBpID0gMDsgaSA8IG51bWJlcl90b19tb3ZlOyArK2kgKQorCQkqKGRlc3QrKykgPSAqKHNvdXJjZSsrKTsKKworCWlmICggWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZmZXJfc3RhdHVzID09IFlZX0JVRkZFUl9FT0ZfUEVORElORyApCisJCS8qIGRvbid0IGRvIHRoZSByZWFkLCBpdCdzIG5vdCBndWFyYW50ZWVkIHRvIHJldHVybiBhbiBFT0YsCisJCSAqIGp1c3QgZm9yY2UgYW4gRU9GCisJCSAqLworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X25fY2hhcnMgPSAoeXlfbl9jaGFycykgPSAwOworCisJZWxzZQorCQl7CisJCQlzaXplX3QgbnVtX3RvX3JlYWQgPQorCQkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9idWZfc2l6ZSAtIG51bWJlcl90b19tb3ZlIC0gMTsKKworCQl3aGlsZSAoIG51bV90b19yZWFkIDw9IDAgKQorCQkJeyAvKiBOb3QgZW5vdWdoIHJvb20gaW4gdGhlIGJ1ZmZlciAtIGdyb3cgaXQuICovCisKKwkJCS8qIGp1c3QgYSBzaG9ydGVyIG5hbWUgZm9yIHRoZSBjdXJyZW50IGJ1ZmZlciAqLworCQkJWVlfQlVGRkVSX1NUQVRFIGIgPSBZWV9DVVJSRU5UX0JVRkZFUjsKKworCQkJaW50IHl5X2NfYnVmX3Bfb2Zmc2V0ID0KKwkJCQkoaW50KSAoKHl5X2NfYnVmX3ApIC0gYi0+eXlfY2hfYnVmKTsKKworCQkJaWYgKCBiLT55eV9pc19vdXJfYnVmZmVyICkKKwkJCQl7CisJCQkJaW50IG5ld19zaXplID0gYi0+eXlfYnVmX3NpemUgKiAyOworCisJCQkJaWYgKCBuZXdfc2l6ZSA8PSAwICkKKwkJCQkJYi0+eXlfYnVmX3NpemUgKz0gYi0+eXlfYnVmX3NpemUgLyA4OworCQkJCWVsc2UKKwkJCQkJYi0+eXlfYnVmX3NpemUgKj0gMjsKKworCQkJCWItPnl5X2NoX2J1ZiA9IChjaGFyICopCisJCQkJCS8qIEluY2x1ZGUgcm9vbSBpbiBmb3IgMiBFT0IgY2hhcnMuICovCisJCQkJCXpjb25mcmVhbGxvYygodm9pZCAqKSBiLT55eV9jaF9idWYsYi0+eXlfYnVmX3NpemUgKyAyICApOworCQkJCX0KKwkJCWVsc2UKKwkJCQkvKiBDYW4ndCBncm93IGl0LCB3ZSBkb24ndCBvd24gaXQuICovCisJCQkJYi0+eXlfY2hfYnVmID0gMDsKKworCQkJaWYgKCAhIGItPnl5X2NoX2J1ZiApCisJCQkJWVlfRkFUQUxfRVJST1IoCisJCQkJImZhdGFsIGVycm9yIC0gc2Nhbm5lciBpbnB1dCBidWZmZXIgb3ZlcmZsb3ciICk7CisKKwkJCSh5eV9jX2J1Zl9wKSA9ICZiLT55eV9jaF9idWZbeXlfY19idWZfcF9vZmZzZXRdOworCisJCQludW1fdG9fcmVhZCA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3NpemUgLQorCQkJCQkJbnVtYmVyX3RvX21vdmUgLSAxOworCisJCQl9CisKKwkJaWYgKCBudW1fdG9fcmVhZCA+IFlZX1JFQURfQlVGX1NJWkUgKQorCQkJbnVtX3RvX3JlYWQgPSBZWV9SRUFEX0JVRl9TSVpFOworCisJCS8qIFJlYWQgaW4gbW9yZSBkYXRhLiAqLworCQlZWV9JTlBVVCggKCZZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2NoX2J1ZltudW1iZXJfdG9fbW92ZV0pLAorCQkJKHl5X25fY2hhcnMpLCBudW1fdG9fcmVhZCApOworCisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFycyA9ICh5eV9uX2NoYXJzKTsKKwkJfQorCisJaWYgKCAoeXlfbl9jaGFycykgPT0gMCApCisJCXsKKwkJaWYgKCBudW1iZXJfdG9fbW92ZSA9PSBZWV9NT1JFX0FESiApCisJCQl7CisJCQlyZXRfdmFsID0gRU9CX0FDVF9FTkRfT0ZfRklMRTsKKwkJCXpjb25mcmVzdGFydCh6Y29uZmluICApOworCQkJfQorCisJCWVsc2UKKwkJCXsKKwkJCXJldF92YWwgPSBFT0JfQUNUX0xBU1RfTUFUQ0g7CisJCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1ZmZlcl9zdGF0dXMgPQorCQkJCVlZX0JVRkZFUl9FT0ZfUEVORElORzsKKwkJCX0KKwkJfQorCisJZWxzZQorCQlyZXRfdmFsID0gRU9CX0FDVF9DT05USU5VRV9TQ0FOOworCisJKHl5X25fY2hhcnMpICs9IG51bWJlcl90b19tb3ZlOworCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmWyh5eV9uX2NoYXJzKV0gPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVI7CisJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbKHl5X25fY2hhcnMpICsgMV0gPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVI7CisKKwkoeXl0ZXh0X3B0cikgPSAmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbMF07CisKKwlyZXR1cm4gcmV0X3ZhbDsKK30KKworLyogeXlfZ2V0X3ByZXZpb3VzX3N0YXRlIC0gZ2V0IHRoZSBzdGF0ZSBqdXN0IGJlZm9yZSB0aGUgRU9CIGNoYXIgd2FzIHJlYWNoZWQgKi8KKworICAgIHN0YXRpYyB5eV9zdGF0ZV90eXBlIHl5X2dldF9wcmV2aW91c19zdGF0ZSAodm9pZCkKK3sKKwlyZWdpc3RlciB5eV9zdGF0ZV90eXBlIHl5X2N1cnJlbnRfc3RhdGU7CisJcmVnaXN0ZXIgY2hhciAqeXlfY3A7CisgICAgCisJeXlfY3VycmVudF9zdGF0ZSA9ICh5eV9zdGFydCk7CisKKwlmb3IgKCB5eV9jcCA9ICh5eXRleHRfcHRyKSArIFlZX01PUkVfQURKOyB5eV9jcCA8ICh5eV9jX2J1Zl9wKTsgKyt5eV9jcCApCisJCXsKKwkJeXlfY3VycmVudF9zdGF0ZSA9IHl5X254dFt5eV9jdXJyZW50X3N0YXRlXVsoKnl5X2NwID8geXlfZWNbWVlfU0NfVE9fVUkoKnl5X2NwKV0gOiAxKV07CisJCX0KKworCXJldHVybiB5eV9jdXJyZW50X3N0YXRlOworfQorCisvKiB5eV90cnlfTlVMX3RyYW5zIC0gdHJ5IHRvIG1ha2UgYSB0cmFuc2l0aW9uIG9uIHRoZSBOVUwgY2hhcmFjdGVyCisgKgorICogc3lub3BzaXMKKyAqCW5leHRfc3RhdGUgPSB5eV90cnlfTlVMX3RyYW5zKCBjdXJyZW50X3N0YXRlICk7CisgKi8KKyAgICBzdGF0aWMgeXlfc3RhdGVfdHlwZSB5eV90cnlfTlVMX3RyYW5zICAoeXlfc3RhdGVfdHlwZSB5eV9jdXJyZW50X3N0YXRlICkKK3sKKwlyZWdpc3RlciBpbnQgeXlfaXNfamFtOworICAgIAorCXl5X2N1cnJlbnRfc3RhdGUgPSB5eV9ueHRbeXlfY3VycmVudF9zdGF0ZV1bMV07CisJeXlfaXNfamFtID0gKHl5X2N1cnJlbnRfc3RhdGUgPD0gMCk7CisKKwlyZXR1cm4geXlfaXNfamFtID8gMCA6IHl5X2N1cnJlbnRfc3RhdGU7Cit9CisKKyAgICBzdGF0aWMgdm9pZCB5eXVucHV0IChpbnQgYywgcmVnaXN0ZXIgY2hhciAqIHl5X2JwICkKK3sKKwlyZWdpc3RlciBjaGFyICp5eV9jcDsKKyAgICAKKyAgICB5eV9jcCA9ICh5eV9jX2J1Zl9wKTsKKworCS8qIHVuZG8gZWZmZWN0cyBvZiBzZXR0aW5nIHVwIHpjb25mdGV4dCAqLworCSp5eV9jcCA9ICh5eV9ob2xkX2NoYXIpOworCisJaWYgKCB5eV9jcCA8IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmICsgMiApCisJCXsgLyogbmVlZCB0byBzaGlmdCB0aGluZ3MgdXAgdG8gbWFrZSByb29tICovCisJCS8qICsyIGZvciBFT0IgY2hhcnMuICovCisJCXJlZ2lzdGVyIGludCBudW1iZXJfdG9fbW92ZSA9ICh5eV9uX2NoYXJzKSArIDI7CisJCXJlZ2lzdGVyIGNoYXIgKmRlc3QgPSAmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbCisJCQkJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3NpemUgKyAyXTsKKwkJcmVnaXN0ZXIgY2hhciAqc291cmNlID0KKwkJCQkmWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWZbbnVtYmVyX3RvX21vdmVdOworCisJCXdoaWxlICggc291cmNlID4gWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9jaF9idWYgKQorCQkJKi0tZGVzdCA9ICotLXNvdXJjZTsKKworCQl5eV9jcCArPSAoaW50KSAoZGVzdCAtIHNvdXJjZSk7CisJCXl5X2JwICs9IChpbnQpIChkZXN0IC0gc291cmNlKTsKKwkJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFLT55eV9uX2NoYXJzID0KKwkJCSh5eV9uX2NoYXJzKSA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfYnVmX3NpemU7CisKKwkJaWYgKCB5eV9jcCA8IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmICsgMiApCisJCQlZWV9GQVRBTF9FUlJPUiggImZsZXggc2Nhbm5lciBwdXNoLWJhY2sgb3ZlcmZsb3ciICk7CisJCX0KKworCSotLXl5X2NwID0gKGNoYXIpIGM7CisKKwkoeXl0ZXh0X3B0cikgPSB5eV9icDsKKwkoeXlfaG9sZF9jaGFyKSA9ICp5eV9jcDsKKwkoeXlfY19idWZfcCkgPSB5eV9jcDsKK30KKworI2lmbmRlZiBZWV9OT19JTlBVVAorI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgc3RhdGljIGludCB5eWlucHV0ICh2b2lkKQorI2Vsc2UKKyAgICBzdGF0aWMgaW50IGlucHV0ICAodm9pZCkKKyNlbmRpZgorCit7CisJaW50IGM7CisgICAgCisJKih5eV9jX2J1Zl9wKSA9ICh5eV9ob2xkX2NoYXIpOworCisJaWYgKCAqKHl5X2NfYnVmX3ApID09IFlZX0VORF9PRl9CVUZGRVJfQ0hBUiApCisJCXsKKwkJLyogeXlfY19idWZfcCBub3cgcG9pbnRzIHRvIHRoZSBjaGFyYWN0ZXIgd2Ugd2FudCB0byByZXR1cm4uCisJCSAqIElmIHRoaXMgb2NjdXJzICpiZWZvcmUqIHRoZSBFT0IgY2hhcmFjdGVycywgdGhlbiBpdCdzIGEKKwkJICogdmFsaWQgTlVMOyBpZiBub3QsIHRoZW4gd2UndmUgaGl0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKwkJICovCisJCWlmICggKHl5X2NfYnVmX3ApIDwgJllZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfY2hfYnVmWyh5eV9uX2NoYXJzKV0gKQorCQkJLyogVGhpcyB3YXMgcmVhbGx5IGEgTlVMLiAqLworCQkJKih5eV9jX2J1Zl9wKSA9ICdcMCc7CisKKwkJZWxzZQorCQkJeyAvKiBuZWVkIG1vcmUgaW5wdXQgKi8KKwkJCWludCBvZmZzZXQgPSAoeXlfY19idWZfcCkgLSAoeXl0ZXh0X3B0cik7CisJCQkrKyh5eV9jX2J1Zl9wKTsKKworCQkJc3dpdGNoICggeXlfZ2V0X25leHRfYnVmZmVyKCAgKSApCisJCQkJeworCQkJCWNhc2UgRU9CX0FDVF9MQVNUX01BVENIOgorCQkJCQkvKiBUaGlzIGhhcHBlbnMgYmVjYXVzZSB5eV9nX25fYigpCisJCQkJCSAqIHNlZXMgdGhhdCB3ZSd2ZSBhY2N1bXVsYXRlZCBhCisJCQkJCSAqIHRva2VuIGFuZCBmbGFncyB0aGF0IHdlIG5lZWQgdG8KKwkJCQkJICogdHJ5IG1hdGNoaW5nIHRoZSB0b2tlbiBiZWZvcmUKKwkJCQkJICogcHJvY2VlZGluZy4gIEJ1dCBmb3IgaW5wdXQoKSwKKwkJCQkJICogdGhlcmUncyBubyBtYXRjaGluZyB0byBjb25zaWRlci4KKwkJCQkJICogU28gY29udmVydCB0aGUgRU9CX0FDVF9MQVNUX01BVENICisJCQkJCSAqIHRvIEVPQl9BQ1RfRU5EX09GX0ZJTEUuCisJCQkJCSAqLworCisJCQkJCS8qIFJlc2V0IGJ1ZmZlciBzdGF0dXMuICovCisJCQkJCXpjb25mcmVzdGFydCh6Y29uZmluICk7CisKKwkJCQkJLypGQUxMVEhST1VHSCovCisKKwkJCQljYXNlIEVPQl9BQ1RfRU5EX09GX0ZJTEU6CisJCQkJCXsKKwkJCQkJaWYgKCB6Y29uZndyYXAoICkgKQorCQkJCQkJcmV0dXJuIEVPRjsKKworCQkJCQlpZiAoICEgKHl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZikgKQorCQkJCQkJWVlfTkVXX0ZJTEU7CisjaWZkZWYgX19jcGx1c3BsdXMKKwkJCQkJcmV0dXJuIHl5aW5wdXQoKTsKKyNlbHNlCisJCQkJCXJldHVybiBpbnB1dCgpOworI2VuZGlmCisJCQkJCX0KKworCQkJCWNhc2UgRU9CX0FDVF9DT05USU5VRV9TQ0FOOgorCQkJCQkoeXlfY19idWZfcCkgPSAoeXl0ZXh0X3B0cikgKyBvZmZzZXQ7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJfQorCisJYyA9ICoodW5zaWduZWQgY2hhciAqKSAoeXlfY19idWZfcCk7CS8qIGNhc3QgZm9yIDgtYml0IGNoYXIncyAqLworCSooeXlfY19idWZfcCkgPSAnXDAnOwkvKiBwcmVzZXJ2ZSB6Y29uZnRleHQgKi8KKwkoeXlfaG9sZF9jaGFyKSA9ICorKyh5eV9jX2J1Zl9wKTsKKworCXJldHVybiBjOworfQorI2VuZGlmCS8qIGlmbmRlZiBZWV9OT19JTlBVVCAqLworCisvKiogSW1tZWRpYXRlbHkgc3dpdGNoIHRvIGEgZGlmZmVyZW50IGlucHV0IHN0cmVhbS4KKyAqIEBwYXJhbSBpbnB1dF9maWxlIEEgcmVhZGFibGUgc3RyZWFtLgorICogCisgKiBAbm90ZSBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJlc2V0IHRoZSBzdGFydCBjb25kaXRpb24gdG8gQGMgSU5JVElBTCAuCisgKi8KKyAgICB2b2lkIHpjb25mcmVzdGFydCAgKEZJTEUgKiBpbnB1dF9maWxlICkKK3sKKyAgICAKKwlpZiAoICEgWVlfQ1VSUkVOVF9CVUZGRVIgKXsKKyAgICAgICAgemNvbmZlbnN1cmVfYnVmZmVyX3N0YWNrICgpOworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPQorICAgICAgICAgICAgemNvbmZfY3JlYXRlX2J1ZmZlcih6Y29uZmluLFlZX0JVRl9TSVpFICk7CisJfQorCisJemNvbmZfaW5pdF9idWZmZXIoWVlfQ1VSUkVOVF9CVUZGRVIsaW5wdXRfZmlsZSApOworCXpjb25mX2xvYWRfYnVmZmVyX3N0YXRlKCApOworfQorCisvKiogU3dpdGNoIHRvIGEgZGlmZmVyZW50IGlucHV0IGJ1ZmZlci4KKyAqIEBwYXJhbSBuZXdfYnVmZmVyIFRoZSBuZXcgaW5wdXQgYnVmZmVyLgorICogCisgKi8KKyAgICB2b2lkIHpjb25mX3N3aXRjaF90b19idWZmZXIgIChZWV9CVUZGRVJfU1RBVEUgIG5ld19idWZmZXIgKQoreworICAgIAorCS8qIFRPRE8uIFdlIHNob3VsZCBiZSBhYmxlIHRvIHJlcGxhY2UgdGhpcyBlbnRpcmUgZnVuY3Rpb24gYm9keQorCSAqIHdpdGgKKwkgKgkJemNvbmZwb3BfYnVmZmVyX3N0YXRlKCk7CisJICoJCXpjb25mcHVzaF9idWZmZXJfc3RhdGUobmV3X2J1ZmZlcik7CisgICAgICovCisJemNvbmZlbnN1cmVfYnVmZmVyX3N0YWNrICgpOworCWlmICggWVlfQ1VSUkVOVF9CVUZGRVIgPT0gbmV3X2J1ZmZlciApCisJCXJldHVybjsKKworCWlmICggWVlfQ1VSUkVOVF9CVUZGRVIgKQorCQl7CisJCS8qIEZsdXNoIG91dCBpbmZvcm1hdGlvbiBmb3Igb2xkIGJ1ZmZlci4gKi8KKwkJKih5eV9jX2J1Zl9wKSA9ICh5eV9ob2xkX2NoYXIpOworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9wb3MgPSAoeXlfY19idWZfcCk7CisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFycyA9ICh5eV9uX2NoYXJzKTsKKwkJfQorCisJWVlfQ1VSUkVOVF9CVUZGRVJfTFZBTFVFID0gbmV3X2J1ZmZlcjsKKwl6Y29uZl9sb2FkX2J1ZmZlcl9zdGF0ZSggKTsKKworCS8qIFdlIGRvbid0IGFjdHVhbGx5IGtub3cgd2hldGhlciB3ZSBkaWQgdGhpcyBzd2l0Y2ggZHVyaW5nCisJICogRU9GICh6Y29uZndyYXAoKSkgcHJvY2Vzc2luZywgYnV0IHRoZSBvbmx5IHRpbWUgdGhpcyBmbGFnCisJICogaXMgbG9va2VkIGF0IGlzIGFmdGVyIHpjb25md3JhcCgpIGlzIGNhbGxlZCwgc28gaXQncyBzYWZlCisJICogdG8gZ28gYWhlYWQgYW5kIGFsd2F5cyBzZXQgaXQuCisJICovCisJKHl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZikgPSAxOworfQorCitzdGF0aWMgdm9pZCB6Y29uZl9sb2FkX2J1ZmZlcl9zdGF0ZSAgKHZvaWQpCit7CisgICAgCSh5eV9uX2NoYXJzKSA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFyczsKKwkoeXl0ZXh0X3B0cikgPSAoeXlfY19idWZfcCkgPSBZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9wb3M7CisJemNvbmZpbiA9IFlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfaW5wdXRfZmlsZTsKKwkoeXlfaG9sZF9jaGFyKSA9ICooeXlfY19idWZfcCk7Cit9CisKKy8qKiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhbiBpbnB1dCBidWZmZXIgc3RhdGUuCisgKiBAcGFyYW0gZmlsZSBBIHJlYWRhYmxlIHN0cmVhbS4KKyAqIEBwYXJhbSBzaXplIFRoZSBjaGFyYWN0ZXIgYnVmZmVyIHNpemUgaW4gYnl0ZXMuIFdoZW4gaW4gZG91YnQsIHVzZSBAYyBZWV9CVUZfU0laRS4KKyAqIAorICogQHJldHVybiB0aGUgYWxsb2NhdGVkIGJ1ZmZlciBzdGF0ZS4KKyAqLworICAgIFlZX0JVRkZFUl9TVEFURSB6Y29uZl9jcmVhdGVfYnVmZmVyICAoRklMRSAqIGZpbGUsIGludCAgc2l6ZSApCit7CisJWVlfQlVGRkVSX1NUQVRFIGI7CisgICAgCisJYiA9IChZWV9CVUZGRVJfU1RBVEUpIHpjb25mYWxsb2Moc2l6ZW9mKCBzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlICkgICk7CisJaWYgKCAhIGIgKQorCQlZWV9GQVRBTF9FUlJPUiggIm91dCBvZiBkeW5hbWljIG1lbW9yeSBpbiB6Y29uZl9jcmVhdGVfYnVmZmVyKCkiICk7CisKKwliLT55eV9idWZfc2l6ZSA9IHNpemU7CisKKwkvKiB5eV9jaF9idWYgaGFzIHRvIGJlIDIgY2hhcmFjdGVycyBsb25nZXIgdGhhbiB0aGUgc2l6ZSBnaXZlbiBiZWNhdXNlCisJICogd2UgbmVlZCB0byBwdXQgaW4gMiBlbmQtb2YtYnVmZmVyIGNoYXJhY3RlcnMuCisJICovCisJYi0+eXlfY2hfYnVmID0gKGNoYXIgKikgemNvbmZhbGxvYyhiLT55eV9idWZfc2l6ZSArIDIgICk7CisJaWYgKCAhIGItPnl5X2NoX2J1ZiApCisJCVlZX0ZBVEFMX0VSUk9SKCAib3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHpjb25mX2NyZWF0ZV9idWZmZXIoKSIgKTsKKworCWItPnl5X2lzX291cl9idWZmZXIgPSAxOworCisJemNvbmZfaW5pdF9idWZmZXIoYixmaWxlICk7CisKKwlyZXR1cm4gYjsKK30KKworLyoqIERlc3Ryb3kgdGhlIGJ1ZmZlci4KKyAqIEBwYXJhbSBiIGEgYnVmZmVyIGNyZWF0ZWQgd2l0aCB6Y29uZl9jcmVhdGVfYnVmZmVyKCkKKyAqIAorICovCisgICAgdm9pZCB6Y29uZl9kZWxldGVfYnVmZmVyIChZWV9CVUZGRVJfU1RBVEUgIGIgKQoreworICAgIAorCWlmICggISBiICkKKwkJcmV0dXJuOworCisJaWYgKCBiID09IFlZX0NVUlJFTlRfQlVGRkVSICkgLyogTm90IHN1cmUgaWYgd2Ugc2hvdWxkIHBvcCBoZXJlLiAqLworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPSAoWVlfQlVGRkVSX1NUQVRFKSAwOworCisJaWYgKCBiLT55eV9pc19vdXJfYnVmZmVyICkKKwkJemNvbmZmcmVlKCh2b2lkICopIGItPnl5X2NoX2J1ZiAgKTsKKworCXpjb25mZnJlZSgodm9pZCAqKSBiICApOworfQorCisvKiBJbml0aWFsaXplcyBvciByZWluaXRpYWxpemVzIGEgYnVmZmVyLgorICogVGhpcyBmdW5jdGlvbiBpcyBzb21ldGltZXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlIG9uIHRoZSBzYW1lIGJ1ZmZlciwKKyAqIHN1Y2ggYXMgZHVyaW5nIGEgemNvbmZyZXN0YXJ0KCkgb3IgYXQgRU9GLgorICovCisgICAgc3RhdGljIHZvaWQgemNvbmZfaW5pdF9idWZmZXIgIChZWV9CVUZGRVJfU1RBVEUgIGIsIEZJTEUgKiBmaWxlICkKKworeworCWludCBvZXJybm8gPSBlcnJubzsKKyAgICAKKwl6Y29uZl9mbHVzaF9idWZmZXIoYiApOworCisJYi0+eXlfaW5wdXRfZmlsZSA9IGZpbGU7CisJYi0+eXlfZmlsbF9idWZmZXIgPSAxOworCisgICAgLyogSWYgYiBpcyB0aGUgY3VycmVudCBidWZmZXIsIHRoZW4gemNvbmZfaW5pdF9idWZmZXIgd2FzIF9wcm9iYWJseV8KKyAgICAgKiBjYWxsZWQgZnJvbSB6Y29uZnJlc3RhcnQoKSBvciB0aHJvdWdoIHl5X2dldF9uZXh0X2J1ZmZlci4KKyAgICAgKiBJbiB0aGF0IGNhc2UsIHdlIGRvbid0IHdhbnQgdG8gcmVzZXQgdGhlIGxpbmVubyBvciBjb2x1bW4uCisgICAgICovCisgICAgaWYgKGIgIT0gWVlfQ1VSUkVOVF9CVUZGRVIpeworICAgICAgICBiLT55eV9ic19saW5lbm8gPSAxOworICAgICAgICBiLT55eV9ic19jb2x1bW4gPSAwOworICAgIH0KKworICAgICAgICBiLT55eV9pc19pbnRlcmFjdGl2ZSA9IDA7CisgICAgCisJZXJybm8gPSBvZXJybm87Cit9CisKKy8qKiBEaXNjYXJkIGFsbCBidWZmZXJlZCBjaGFyYWN0ZXJzLiBPbiB0aGUgbmV4dCBzY2FuLCBZWV9JTlBVVCB3aWxsIGJlIGNhbGxlZC4KKyAqIEBwYXJhbSBiIHRoZSBidWZmZXIgc3RhdGUgdG8gYmUgZmx1c2hlZCwgdXN1YWxseSBAYyBZWV9DVVJSRU5UX0JVRkZFUi4KKyAqIAorICovCisgICAgdm9pZCB6Y29uZl9mbHVzaF9idWZmZXIgKFlZX0JVRkZFUl9TVEFURSAgYiApCit7CisgICAgCWlmICggISBiICkKKwkJcmV0dXJuOworCisJYi0+eXlfbl9jaGFycyA9IDA7CisKKwkvKiBXZSBhbHdheXMgbmVlZCB0d28gZW5kLW9mLWJ1ZmZlciBjaGFyYWN0ZXJzLiAgVGhlIGZpcnN0IGNhdXNlcworCSAqIGEgdHJhbnNpdGlvbiB0byB0aGUgZW5kLW9mLWJ1ZmZlciBzdGF0ZS4gIFRoZSBzZWNvbmQgY2F1c2VzCisJICogYSBqYW0gaW4gdGhhdCBzdGF0ZS4KKwkgKi8KKwliLT55eV9jaF9idWZbMF0gPSBZWV9FTkRfT0ZfQlVGRkVSX0NIQVI7CisJYi0+eXlfY2hfYnVmWzFdID0gWVlfRU5EX09GX0JVRkZFUl9DSEFSOworCisJYi0+eXlfYnVmX3BvcyA9ICZiLT55eV9jaF9idWZbMF07CisKKwliLT55eV9hdF9ib2wgPSAxOworCWItPnl5X2J1ZmZlcl9zdGF0dXMgPSBZWV9CVUZGRVJfTkVXOworCisJaWYgKCBiID09IFlZX0NVUlJFTlRfQlVGRkVSICkKKwkJemNvbmZfbG9hZF9idWZmZXJfc3RhdGUoICk7Cit9CisKKy8qKiBQdXNoZXMgdGhlIG5ldyBzdGF0ZSBvbnRvIHRoZSBzdGFjay4gVGhlIG5ldyBzdGF0ZSBiZWNvbWVzCisgKiAgdGhlIGN1cnJlbnQgc3RhdGUuIFRoaXMgZnVuY3Rpb24gd2lsbCBhbGxvY2F0ZSB0aGUgc3RhY2sKKyAqICBpZiBuZWNlc3NhcnkuCisgKiAgQHBhcmFtIG5ld19idWZmZXIgVGhlIG5ldyBzdGF0ZS4KKyAqICAKKyAqLwordm9pZCB6Y29uZnB1c2hfYnVmZmVyX3N0YXRlIChZWV9CVUZGRVJfU1RBVEUgbmV3X2J1ZmZlciApCit7CisgICAgCWlmIChuZXdfYnVmZmVyID09IE5VTEwpCisJCXJldHVybjsKKworCXpjb25mZW5zdXJlX2J1ZmZlcl9zdGFjaygpOworCisJLyogVGhpcyBibG9jayBpcyBjb3BpZWQgZnJvbSB6Y29uZl9zd2l0Y2hfdG9fYnVmZmVyLiAqLworCWlmICggWVlfQ1VSUkVOVF9CVUZGRVIgKQorCQl7CisJCS8qIEZsdXNoIG91dCBpbmZvcm1hdGlvbiBmb3Igb2xkIGJ1ZmZlci4gKi8KKwkJKih5eV9jX2J1Zl9wKSA9ICh5eV9ob2xkX2NoYXIpOworCQlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUtPnl5X2J1Zl9wb3MgPSAoeXlfY19idWZfcCk7CisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRS0+eXlfbl9jaGFycyA9ICh5eV9uX2NoYXJzKTsKKwkJfQorCisJLyogT25seSBwdXNoIGlmIHRvcCBleGlzdHMuIE90aGVyd2lzZSwgcmVwbGFjZSB0b3AuICovCisJaWYgKFlZX0NVUlJFTlRfQlVGRkVSKQorCQkoeXlfYnVmZmVyX3N0YWNrX3RvcCkrKzsKKwlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPSBuZXdfYnVmZmVyOworCisJLyogY29waWVkIGZyb20gemNvbmZfc3dpdGNoX3RvX2J1ZmZlci4gKi8KKwl6Y29uZl9sb2FkX2J1ZmZlcl9zdGF0ZSggKTsKKwkoeXlfZGlkX2J1ZmZlcl9zd2l0Y2hfb25fZW9mKSA9IDE7Cit9CisKKy8qKiBSZW1vdmVzIGFuZCBkZWxldGVzIHRoZSB0b3Agb2YgdGhlIHN0YWNrLCBpZiBwcmVzZW50LgorICogIFRoZSBuZXh0IGVsZW1lbnQgYmVjb21lcyB0aGUgbmV3IHRvcC4KKyAqICAKKyAqLwordm9pZCB6Y29uZnBvcF9idWZmZXJfc3RhdGUgKHZvaWQpCit7CisgICAgCWlmICghWVlfQ1VSUkVOVF9CVUZGRVIpCisJCXJldHVybjsKKworCXpjb25mX2RlbGV0ZV9idWZmZXIoWVlfQ1VSUkVOVF9CVUZGRVIgKTsKKwlZWV9DVVJSRU5UX0JVRkZFUl9MVkFMVUUgPSBOVUxMOworCWlmICgoeXlfYnVmZmVyX3N0YWNrX3RvcCkgPiAwKQorCQktLSh5eV9idWZmZXJfc3RhY2tfdG9wKTsKKworCWlmIChZWV9DVVJSRU5UX0JVRkZFUikgeworCQl6Y29uZl9sb2FkX2J1ZmZlcl9zdGF0ZSggKTsKKwkJKHl5X2RpZF9idWZmZXJfc3dpdGNoX29uX2VvZikgPSAxOworCX0KK30KKworLyogQWxsb2NhdGVzIHRoZSBzdGFjayBpZiBpdCBkb2VzIG5vdCBleGlzdC4KKyAqICBHdWFyYW50ZWVzIHNwYWNlIGZvciBhdCBsZWFzdCBvbmUgcHVzaC4KKyAqLworc3RhdGljIHZvaWQgemNvbmZlbnN1cmVfYnVmZmVyX3N0YWNrICh2b2lkKQoreworCWludCBudW1fdG9fYWxsb2M7CisgICAgCisJaWYgKCEoeXlfYnVmZmVyX3N0YWNrKSkgeworCisJCS8qIEZpcnN0IGFsbG9jYXRpb24gaXMganVzdCBmb3IgMiBlbGVtZW50cywgc2luY2Ugd2UgZG9uJ3Qga25vdyBpZiB0aGlzCisJCSAqIHNjYW5uZXIgd2lsbCBldmVuIG5lZWQgYSBzdGFjay4gV2UgdXNlIDIgaW5zdGVhZCBvZiAxIHRvIGF2b2lkIGFuCisJCSAqIGltbWVkaWF0ZSByZWFsbG9jIG9uIHRoZSBuZXh0IGNhbGwuCisgICAgICAgICAqLworCQludW1fdG9fYWxsb2MgPSAxOworCQkoeXlfYnVmZmVyX3N0YWNrKSA9IChzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlKiopemNvbmZhbGxvYworCQkJCQkJCQkobnVtX3RvX2FsbG9jICogc2l6ZW9mKHN0cnVjdCB5eV9idWZmZXJfc3RhdGUqKQorCQkJCQkJCQkpOworCQkKKwkJbWVtc2V0KCh5eV9idWZmZXJfc3RhY2spLCAwLCBudW1fdG9fYWxsb2MgKiBzaXplb2Yoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSopKTsKKwkJCQkKKwkJKHl5X2J1ZmZlcl9zdGFja19tYXgpID0gbnVtX3RvX2FsbG9jOworCQkoeXlfYnVmZmVyX3N0YWNrX3RvcCkgPSAwOworCQlyZXR1cm47CisJfQorCisJaWYgKCh5eV9idWZmZXJfc3RhY2tfdG9wKSA+PSAoKHl5X2J1ZmZlcl9zdGFja19tYXgpKSAtIDEpeworCisJCS8qIEluY3JlYXNlIHRoZSBidWZmZXIgdG8gcHJlcGFyZSBmb3IgYSBwb3NzaWJsZSBwdXNoLiAqLworCQlpbnQgZ3Jvd19zaXplID0gOCAvKiBhcmJpdHJhcnkgZ3JvdyBzaXplICovOworCisJCW51bV90b19hbGxvYyA9ICh5eV9idWZmZXJfc3RhY2tfbWF4KSArIGdyb3dfc2l6ZTsKKwkJKHl5X2J1ZmZlcl9zdGFjaykgPSAoc3RydWN0IHl5X2J1ZmZlcl9zdGF0ZSoqKXpjb25mcmVhbGxvYworCQkJCQkJCQkoKHl5X2J1ZmZlcl9zdGFjayksCisJCQkJCQkJCW51bV90b19hbGxvYyAqIHNpemVvZihzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlKikKKwkJCQkJCQkJKTsKKworCQkvKiB6ZXJvIG9ubHkgdGhlIG5ldyBzbG90cy4qLworCQltZW1zZXQoKHl5X2J1ZmZlcl9zdGFjaykgKyAoeXlfYnVmZmVyX3N0YWNrX21heCksIDAsIGdyb3dfc2l6ZSAqIHNpemVvZihzdHJ1Y3QgeXlfYnVmZmVyX3N0YXRlKikpOworCQkoeXlfYnVmZmVyX3N0YWNrX21heCkgPSBudW1fdG9fYWxsb2M7CisJfQorfQorCisvKiogU2V0dXAgdGhlIGlucHV0IGJ1ZmZlciBzdGF0ZSB0byBzY2FuIGRpcmVjdGx5IGZyb20gYSB1c2VyLXNwZWNpZmllZCBjaGFyYWN0ZXIgYnVmZmVyLgorICogQHBhcmFtIGJhc2UgdGhlIGNoYXJhY3RlciBidWZmZXIKKyAqIEBwYXJhbSBzaXplIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBjaGFyYWN0ZXIgYnVmZmVyCisgKiAKKyAqIEByZXR1cm4gdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIgc3RhdGUgb2JqZWN0LiAKKyAqLworWVlfQlVGRkVSX1NUQVRFIHpjb25mX3NjYW5fYnVmZmVyICAoY2hhciAqIGJhc2UsIHl5X3NpemVfdCAgc2l6ZSApCit7CisJWVlfQlVGRkVSX1NUQVRFIGI7CisgICAgCisJaWYgKCBzaXplIDwgMiB8fAorCSAgICAgYmFzZVtzaXplLTJdICE9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUiB8fAorCSAgICAgYmFzZVtzaXplLTFdICE9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUiApCisJCS8qIFRoZXkgZm9yZ290IHRvIGxlYXZlIHJvb20gZm9yIHRoZSBFT0Incy4gKi8KKwkJcmV0dXJuIDA7CisKKwliID0gKFlZX0JVRkZFUl9TVEFURSkgemNvbmZhbGxvYyhzaXplb2YoIHN0cnVjdCB5eV9idWZmZXJfc3RhdGUgKSAgKTsKKwlpZiAoICEgYiApCisJCVlZX0ZBVEFMX0VSUk9SKCAib3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHpjb25mX3NjYW5fYnVmZmVyKCkiICk7CisKKwliLT55eV9idWZfc2l6ZSA9IHNpemUgLSAyOwkvKiAiLSAyIiB0byB0YWtlIGNhcmUgb2YgRU9CJ3MgKi8KKwliLT55eV9idWZfcG9zID0gYi0+eXlfY2hfYnVmID0gYmFzZTsKKwliLT55eV9pc19vdXJfYnVmZmVyID0gMDsKKwliLT55eV9pbnB1dF9maWxlID0gMDsKKwliLT55eV9uX2NoYXJzID0gYi0+eXlfYnVmX3NpemU7CisJYi0+eXlfaXNfaW50ZXJhY3RpdmUgPSAwOworCWItPnl5X2F0X2JvbCA9IDE7CisJYi0+eXlfZmlsbF9idWZmZXIgPSAwOworCWItPnl5X2J1ZmZlcl9zdGF0dXMgPSBZWV9CVUZGRVJfTkVXOworCisJemNvbmZfc3dpdGNoX3RvX2J1ZmZlcihiICApOworCisJcmV0dXJuIGI7Cit9CisKKy8qKiBTZXR1cCB0aGUgaW5wdXQgYnVmZmVyIHN0YXRlIHRvIHNjYW4gYSBzdHJpbmcuIFRoZSBuZXh0IGNhbGwgdG8gemNvbmZsZXgoKSB3aWxsCisgKiBzY2FuIGZyb20gYSBAZSBjb3B5IG9mIEBhIHN0ci4KKyAqIEBwYXJhbSBzdHIgYSBOVUwtdGVybWluYXRlZCBzdHJpbmcgdG8gc2NhbgorICogCisgKiBAcmV0dXJuIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyIHN0YXRlIG9iamVjdC4KKyAqIEBub3RlIElmIHlvdSB3YW50IHRvIHNjYW4gYnl0ZXMgdGhhdCBtYXkgY29udGFpbiBOVUwgdmFsdWVzLCB0aGVuIHVzZQorICogICAgICAgemNvbmZfc2Nhbl9ieXRlcygpIGluc3RlYWQuCisgKi8KK1lZX0JVRkZFUl9TVEFURSB6Y29uZl9zY2FuX3N0cmluZyAoeXljb25zdCBjaGFyICogc3RyICkKK3sKKyAgICAKKwlyZXR1cm4gemNvbmZfc2Nhbl9ieXRlcyhzdHIsc3RybGVuKHN0cikgKTsKK30KKworLyoqIFNldHVwIHRoZSBpbnB1dCBidWZmZXIgc3RhdGUgdG8gc2NhbiB0aGUgZ2l2ZW4gYnl0ZXMuIFRoZSBuZXh0IGNhbGwgdG8gemNvbmZsZXgoKSB3aWxsCisgKiBzY2FuIGZyb20gYSBAZSBjb3B5IG9mIEBhIGJ5dGVzLgorICogQHBhcmFtIGJ5dGVzIHRoZSBieXRlIGJ1ZmZlciB0byBzY2FuCisgKiBAcGFyYW0gbGVuIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IEBhIGJ5dGVzLgorICogCisgKiBAcmV0dXJuIHRoZSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyIHN0YXRlIG9iamVjdC4KKyAqLworWVlfQlVGRkVSX1NUQVRFIHpjb25mX3NjYW5fYnl0ZXMgICh5eWNvbnN0IGNoYXIgKiBieXRlcywgaW50ICBsZW4gKQoreworCVlZX0JVRkZFUl9TVEFURSBiOworCWNoYXIgKmJ1ZjsKKwl5eV9zaXplX3QgbjsKKwlpbnQgaTsKKyAgICAKKwkvKiBHZXQgbWVtb3J5IGZvciBmdWxsIGJ1ZmZlciwgaW5jbHVkaW5nIHNwYWNlIGZvciB0cmFpbGluZyBFT0Incy4gKi8KKwluID0gbGVuICsgMjsKKwlidWYgPSAoY2hhciAqKSB6Y29uZmFsbG9jKG4gICk7CisJaWYgKCAhIGJ1ZiApCisJCVlZX0ZBVEFMX0VSUk9SKCAib3V0IG9mIGR5bmFtaWMgbWVtb3J5IGluIHpjb25mX3NjYW5fYnl0ZXMoKSIgKTsKKworCWZvciAoIGkgPSAwOyBpIDwgbGVuOyArK2kgKQorCQlidWZbaV0gPSBieXRlc1tpXTsKKworCWJ1ZltsZW5dID0gYnVmW2xlbisxXSA9IFlZX0VORF9PRl9CVUZGRVJfQ0hBUjsKKworCWIgPSB6Y29uZl9zY2FuX2J1ZmZlcihidWYsbiApOworCWlmICggISBiICkKKwkJWVlfRkFUQUxfRVJST1IoICJiYWQgYnVmZmVyIGluIHpjb25mX3NjYW5fYnl0ZXMoKSIgKTsKKworCS8qIEl0J3Mgb2theSB0byBncm93IGV0Yy4gdGhpcyBidWZmZXIsIGFuZCB3ZSBzaG91bGQgdGhyb3cgaXQKKwkgKiBhd2F5IHdoZW4gd2UncmUgZG9uZS4KKwkgKi8KKwliLT55eV9pc19vdXJfYnVmZmVyID0gMTsKKworCXJldHVybiBiOworfQorCisjaWZuZGVmIFlZX0VYSVRfRkFJTFVSRQorI2RlZmluZSBZWV9FWElUX0ZBSUxVUkUgMgorI2VuZGlmCisKK3N0YXRpYyB2b2lkIHl5X2ZhdGFsX2Vycm9yICh5eWNvbnN0IGNoYXIqIG1zZyApCit7CisgICAgCSh2b2lkKSBmcHJpbnRmKCBzdGRlcnIsICIlc1xuIiwgbXNnICk7CisJZXhpdCggWVlfRVhJVF9GQUlMVVJFICk7Cit9CisKKy8qIFJlZGVmaW5lIHl5bGVzcygpIHNvIGl0IHdvcmtzIGluIHNlY3Rpb24gMyBjb2RlLiAqLworCisjdW5kZWYgeXlsZXNzCisjZGVmaW5lIHl5bGVzcyhuKSBcCisJZG8gXAorCQl7IFwKKwkJLyogVW5kbyBlZmZlY3RzIG9mIHNldHRpbmcgdXAgemNvbmZ0ZXh0LiAqLyBcCisgICAgICAgIGludCB5eWxlc3NfbWFjcm9fYXJnID0gKG4pOyBcCisgICAgICAgIFlZX0xFU1NfTElORU5PKHl5bGVzc19tYWNyb19hcmcpO1wKKwkJemNvbmZ0ZXh0W3pjb25mbGVuZ10gPSAoeXlfaG9sZF9jaGFyKTsgXAorCQkoeXlfY19idWZfcCkgPSB6Y29uZnRleHQgKyB5eWxlc3NfbWFjcm9fYXJnOyBcCisJCSh5eV9ob2xkX2NoYXIpID0gKih5eV9jX2J1Zl9wKTsgXAorCQkqKHl5X2NfYnVmX3ApID0gJ1wwJzsgXAorCQl6Y29uZmxlbmcgPSB5eWxlc3NfbWFjcm9fYXJnOyBcCisJCX0gXAorCXdoaWxlICggMCApCisKKy8qIEFjY2Vzc29yICBtZXRob2RzIChnZXQvc2V0IGZ1bmN0aW9ucykgdG8gc3RydWN0IG1lbWJlcnMuICovCisKKy8qKiBHZXQgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIuCisgKiAKKyAqLworaW50IHpjb25mZ2V0X2xpbmVubyAgKHZvaWQpCit7CisgICAgICAgIAorICAgIHJldHVybiB6Y29uZmxpbmVubzsKK30KKworLyoqIEdldCB0aGUgaW5wdXQgc3RyZWFtLgorICogCisgKi8KK0ZJTEUgKnpjb25mZ2V0X2luICAodm9pZCkKK3sKKyAgICAgICAgcmV0dXJuIHpjb25maW47Cit9CisKKy8qKiBHZXQgdGhlIG91dHB1dCBzdHJlYW0uCisgKiAKKyAqLworRklMRSAqemNvbmZnZXRfb3V0ICAodm9pZCkKK3sKKyAgICAgICAgcmV0dXJuIHpjb25mb3V0OworfQorCisvKiogR2V0IHRoZSBsZW5ndGggb2YgdGhlIGN1cnJlbnQgdG9rZW4uCisgKiAKKyAqLworaW50IHpjb25mZ2V0X2xlbmcgICh2b2lkKQoreworICAgICAgICByZXR1cm4gemNvbmZsZW5nOworfQorCisvKiogR2V0IHRoZSBjdXJyZW50IHRva2VuLgorICogCisgKi8KKworY2hhciAqemNvbmZnZXRfdGV4dCAgKHZvaWQpCit7CisgICAgICAgIHJldHVybiB6Y29uZnRleHQ7Cit9CisKKy8qKiBTZXQgdGhlIGN1cnJlbnQgbGluZSBudW1iZXIuCisgKiBAcGFyYW0gbGluZV9udW1iZXIKKyAqIAorICovCit2b2lkIHpjb25mc2V0X2xpbmVubyAoaW50ICBsaW5lX251bWJlciApCit7CisgICAgCisgICAgemNvbmZsaW5lbm8gPSBsaW5lX251bWJlcjsKK30KKworLyoqIFNldCB0aGUgaW5wdXQgc3RyZWFtLiBUaGlzIGRvZXMgbm90IGRpc2NhcmQgdGhlIGN1cnJlbnQKKyAqIGlucHV0IGJ1ZmZlci4KKyAqIEBwYXJhbSBpbl9zdHIgQSByZWFkYWJsZSBzdHJlYW0uCisgKiAKKyAqIEBzZWUgemNvbmZfc3dpdGNoX3RvX2J1ZmZlcgorICovCit2b2lkIHpjb25mc2V0X2luIChGSUxFICogIGluX3N0ciApCit7CisgICAgICAgIHpjb25maW4gPSBpbl9zdHIgOworfQorCit2b2lkIHpjb25mc2V0X291dCAoRklMRSAqICBvdXRfc3RyICkKK3sKKyAgICAgICAgemNvbmZvdXQgPSBvdXRfc3RyIDsKK30KKworaW50IHpjb25mZ2V0X2RlYnVnICAodm9pZCkKK3sKKyAgICAgICAgcmV0dXJuIHpjb25mX2ZsZXhfZGVidWc7Cit9CisKK3ZvaWQgemNvbmZzZXRfZGVidWcgKGludCAgYmRlYnVnICkKK3sKKyAgICAgICAgemNvbmZfZmxleF9kZWJ1ZyA9IGJkZWJ1ZyA7Cit9CisKKy8qIHpjb25mbGV4X2Rlc3Ryb3kgaXMgZm9yIGJvdGggcmVlbnRyYW50IGFuZCBub24tcmVlbnRyYW50IHNjYW5uZXJzLiAqLworaW50IHpjb25mbGV4X2Rlc3Ryb3kgICh2b2lkKQoreworICAgIAorICAgIC8qIFBvcCB0aGUgYnVmZmVyIHN0YWNrLCBkZXN0cm95aW5nIGVhY2ggZWxlbWVudC4gKi8KKwl3aGlsZShZWV9DVVJSRU5UX0JVRkZFUil7CisJCXpjb25mX2RlbGV0ZV9idWZmZXIoWVlfQ1VSUkVOVF9CVUZGRVIgICk7CisJCVlZX0NVUlJFTlRfQlVGRkVSX0xWQUxVRSA9IE5VTEw7CisJCXpjb25mcG9wX2J1ZmZlcl9zdGF0ZSgpOworCX0KKworCS8qIERlc3Ryb3kgdGhlIHN0YWNrIGl0c2VsZi4gKi8KKwl6Y29uZmZyZWUoKHl5X2J1ZmZlcl9zdGFjaykgKTsKKwkoeXlfYnVmZmVyX3N0YWNrKSA9IE5VTEw7CisKKyAgICByZXR1cm4gMDsKK30KKworLyoKKyAqIEludGVybmFsIHV0aWxpdHkgcm91dGluZXMuCisgKi8KKworI2lmbmRlZiB5eXRleHRfcHRyCitzdGF0aWMgdm9pZCB5eV9mbGV4X3N0cm5jcHkgKGNoYXIqIHMxLCB5eWNvbnN0IGNoYXIgKiBzMiwgaW50IG4gKQoreworCXJlZ2lzdGVyIGludCBpOworICAgIAlmb3IgKCBpID0gMDsgaSA8IG47ICsraSApCisJCXMxW2ldID0gczJbaV07Cit9CisjZW5kaWYKKworI2lmZGVmIFlZX05FRURfU1RSTEVOCitzdGF0aWMgaW50IHl5X2ZsZXhfc3RybGVuICh5eWNvbnN0IGNoYXIgKiBzICkKK3sKKwlyZWdpc3RlciBpbnQgbjsKKyAgICAJZm9yICggbiA9IDA7IHNbbl07ICsrbiApCisJCTsKKworCXJldHVybiBuOworfQorI2VuZGlmCisKK3ZvaWQgKnpjb25mYWxsb2MgKHl5X3NpemVfdCAgc2l6ZSApCit7CisJcmV0dXJuICh2b2lkICopIG1hbGxvYyggc2l6ZSApOworfQorCit2b2lkICp6Y29uZnJlYWxsb2MgICh2b2lkICogcHRyLCB5eV9zaXplX3QgIHNpemUgKQoreworCS8qIFRoZSBjYXN0IHRvIChjaGFyICopIGluIHRoZSBmb2xsb3dpbmcgYWNjb21tb2RhdGVzIGJvdGgKKwkgKiBpbXBsZW1lbnRhdGlvbnMgdGhhdCB1c2UgY2hhciogZ2VuZXJpYyBwb2ludGVycywgYW5kIHRob3NlCisJICogdGhhdCB1c2Ugdm9pZCogZ2VuZXJpYyBwb2ludGVycy4gIEl0IHdvcmtzIHdpdGggdGhlIGxhdHRlcgorCSAqIGJlY2F1c2UgYm90aCBBTlNJIEMgYW5kIEMrKyBhbGxvdyBjYXN0bGVzcyBhc3NpZ25tZW50IGZyb20KKwkgKiBhbnkgcG9pbnRlciB0eXBlIHRvIHZvaWQqLCBhbmQgZGVhbCB3aXRoIGFyZ3VtZW50IGNvbnZlcnNpb25zCisJICogYXMgdGhvdWdoIGRvaW5nIGFuIGFzc2lnbm1lbnQuCisJICovCisJcmV0dXJuICh2b2lkICopIHJlYWxsb2MoIChjaGFyICopIHB0ciwgc2l6ZSApOworfQorCit2b2lkIHpjb25mZnJlZSAodm9pZCAqIHB0ciApCit7CisJZnJlZSggKGNoYXIgKikgcHRyICk7CS8qIHNlZSB6Y29uZnJlYWxsb2MoKSBmb3IgKGNoYXIgKikgY2FzdCAqLworfQorCisjZGVmaW5lIFlZVEFCTEVTX05BTUUgInl5dGFibGVzIgorCisjdW5kZWYgWVlfTkVXX0ZJTEUKKyN1bmRlZiBZWV9GTFVTSF9CVUZGRVIKKyN1bmRlZiB5eV9zZXRfYm9sCisjdW5kZWYgeXlfbmV3X2J1ZmZlcgorI3VuZGVmIHl5X3NldF9pbnRlcmFjdGl2ZQorI3VuZGVmIHl5dGV4dF9wdHIKKyN1bmRlZiBZWV9ET19CRUZPUkVfQUNUSU9OCisKKyNpZmRlZiBZWV9ERUNMX0lTX09VUlMKKyN1bmRlZiBZWV9ERUNMX0lTX09VUlMKKyN1bmRlZiBZWV9ERUNMCisjZW5kaWYKKwordm9pZCB6Y29uZl9zdGFydGhlbHAodm9pZCkKK3sKKwluZXdfc3RyaW5nKCk7CisJbGFzdF90cyA9IGZpcnN0X3RzID0gMDsKKwlCRUdJTihIRUxQKTsKK30KKworc3RhdGljIHZvaWQgemNvbmZfZW5kaGVscCh2b2lkKQoreworCXpjb25mbHZhbC5zdHJpbmcgPSB0ZXh0OworCUJFR0lOKElOSVRJQUwpOworfQorCisvKgorICogVHJ5IHRvIG9wZW4gc3BlY2lmaWVkIGZpbGUgd2l0aCBmb2xsb3dpbmcgbmFtZXM6CisgKiAuL25hbWUKKyAqICQoc3JjdHJlZSkvbmFtZQorICogVGhlIGxhdHRlciBpcyB1c2VkIHdoZW4gc3JjdHJlZSBpcyBzZXBhcmF0ZSBmcm9tIG9ianRyZWUKKyAqIHdoZW4gY29tcGlsaW5nIHRoZSBrZXJuZWwuCisgKiBSZXR1cm4gTlVMTCBpZiBmaWxlIGlzIG5vdCBmb3VuZC4KKyAqLworRklMRSAqemNvbmZfZm9wZW4oY29uc3QgY2hhciAqbmFtZSkKK3sKKwljaGFyICplbnYsIGZ1bGxuYW1lW1BBVEhfTUFYKzFdOworCUZJTEUgKmY7CisKKwlmID0gZm9wZW4obmFtZSwgInIiKTsKKwlpZiAoIWYgJiYgbmFtZVswXSAhPSAnLycpIHsKKwkJZW52ID0gZ2V0ZW52KFNSQ1RSRUUpOworCQlpZiAoZW52KSB7CisJCQlzcHJpbnRmKGZ1bGxuYW1lLCAiJXMvJXMiLCBlbnYsIG5hbWUpOworCQkJZiA9IGZvcGVuKGZ1bGxuYW1lLCAiciIpOworCQl9CisJfQorCXJldHVybiBmOworfQorCit2b2lkIHpjb25mX2luaXRzY2FuKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJemNvbmZpbiA9IHpjb25mX2ZvcGVuKG5hbWUpOworCWlmICghemNvbmZpbikgeworCQlwcmludGYoImNhbid0IGZpbmQgZmlsZSAlc1xuIiwgbmFtZSk7CisJCWV4aXQoMSk7CisJfQorCisJY3VycmVudF9idWYgPSBtYWxsb2Moc2l6ZW9mKCpjdXJyZW50X2J1ZikpOworCW1lbXNldChjdXJyZW50X2J1ZiwgMCwgc2l6ZW9mKCpjdXJyZW50X2J1ZikpOworCisJY3VycmVudF9maWxlID0gZmlsZV9sb29rdXAobmFtZSk7CisJY3VycmVudF9maWxlLT5saW5lbm8gPSAxOworCWN1cnJlbnRfZmlsZS0+ZmxhZ3MgPSBGSUxFX0JVU1k7Cit9CisKK3ZvaWQgemNvbmZfbmV4dGZpbGUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGZpbGVfbG9va3VwKG5hbWUpOworCXN0cnVjdCBidWZmZXIgKmJ1ZiA9IG1hbGxvYyhzaXplb2YoKmJ1ZikpOworCW1lbXNldChidWYsIDAsIHNpemVvZigqYnVmKSk7CisKKwljdXJyZW50X2J1Zi0+c3RhdGUgPSBZWV9DVVJSRU5UX0JVRkZFUjsKKwl6Y29uZmluID0gemNvbmZfZm9wZW4obmFtZSk7CisJaWYgKCF6Y29uZmluKSB7CisJCXByaW50ZigiJXM6JWQ6IGNhbid0IG9wZW4gZmlsZSBcIiVzXCJcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCksIG5hbWUpOworCQlleGl0KDEpOworCX0KKwl6Y29uZl9zd2l0Y2hfdG9fYnVmZmVyKHpjb25mX2NyZWF0ZV9idWZmZXIoemNvbmZpbixZWV9CVUZfU0laRSkpOworCWJ1Zi0+cGFyZW50ID0gY3VycmVudF9idWY7CisJY3VycmVudF9idWYgPSBidWY7CisKKwlpZiAoZmlsZS0+ZmxhZ3MgJiBGSUxFX0JVU1kpIHsKKwkJcHJpbnRmKCJyZWN1cnNpdmUgc2NhbiAoJXMpP1xuIiwgbmFtZSk7CisJCWV4aXQoMSk7CisJfQorCWlmIChmaWxlLT5mbGFncyAmIEZJTEVfU0NBTk5FRCkgeworCQlwcmludGYoImZpbGUgJXMgYWxyZWFkeSBzY2FubmVkP1xuIiwgbmFtZSk7CisJCWV4aXQoMSk7CisJfQorCWZpbGUtPmZsYWdzIHw9IEZJTEVfQlVTWTsKKwlmaWxlLT5saW5lbm8gPSAxOworCWZpbGUtPnBhcmVudCA9IGN1cnJlbnRfZmlsZTsKKwljdXJyZW50X2ZpbGUgPSBmaWxlOworfQorCitzdGF0aWMgc3RydWN0IGJ1ZmZlciAqemNvbmZfZW5kZmlsZSh2b2lkKQoreworCXN0cnVjdCBidWZmZXIgKnBhcmVudDsKKworCWN1cnJlbnRfZmlsZS0+ZmxhZ3MgfD0gRklMRV9TQ0FOTkVEOworCWN1cnJlbnRfZmlsZS0+ZmxhZ3MgJj0gfkZJTEVfQlVTWTsKKwljdXJyZW50X2ZpbGUgPSBjdXJyZW50X2ZpbGUtPnBhcmVudDsKKworCXBhcmVudCA9IGN1cnJlbnRfYnVmLT5wYXJlbnQ7CisJaWYgKHBhcmVudCkgeworCQlmY2xvc2UoemNvbmZpbik7CisJCXpjb25mX2RlbGV0ZV9idWZmZXIoWVlfQ1VSUkVOVF9CVUZGRVIpOworCQl6Y29uZl9zd2l0Y2hfdG9fYnVmZmVyKHBhcmVudC0+c3RhdGUpOworCX0KKwlmcmVlKGN1cnJlbnRfYnVmKTsKKwljdXJyZW50X2J1ZiA9IHBhcmVudDsKKworCXJldHVybiBwYXJlbnQ7Cit9CisKK2ludCB6Y29uZl9saW5lbm8odm9pZCkKK3sKKwlpZiAoY3VycmVudF9idWYpCisJCXJldHVybiBjdXJyZW50X2ZpbGUtPmxpbmVubyAtIDE7CisJZWxzZQorCQlyZXR1cm4gMDsKK30KKworY2hhciAqemNvbmZfY3VybmFtZSh2b2lkKQoreworCWlmIChjdXJyZW50X2J1ZikKKwkJcmV0dXJuIGN1cnJlbnRfZmlsZS0+bmFtZTsKKwllbHNlCisJCXJldHVybiAiPG5vbmU+IjsKK30KKwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2xrYy5oIGIvc2NyaXB0cy9rY29uZmlnL2xrYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YTY3ZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvbGtjLmgKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+CisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KKyAqLworCisjaWZuZGVmIExLQ19ICisjZGVmaW5lIExLQ19ICisKKyNpbmNsdWRlICJleHByLmgiCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2lmZGVmIExLQ19ESVJFQ1RfTElOSworI2RlZmluZSBQKG5hbWUsdHlwZSxhcmcpCWV4dGVybiB0eXBlIG5hbWUgYXJnCisjZWxzZQorI2luY2x1ZGUgImxrY19kZWZzLmgiCisjZGVmaW5lIFAobmFtZSx0eXBlLGFyZykJZXh0ZXJuIHR5cGUgKCpuYW1lICMjIF9wKSBhcmcKKyNlbmRpZgorI2luY2x1ZGUgImxrY19wcm90by5oIgorI3VuZGVmIFAKKworI2RlZmluZSBTUkNUUkVFICJzcmN0cmVlIgorCitpbnQgemNvbmZwYXJzZSh2b2lkKTsKK3ZvaWQgemNvbmZkdW1wKEZJTEUgKm91dCk7CisKK2V4dGVybiBpbnQgemNvbmZkZWJ1ZzsKK3ZvaWQgemNvbmZfc3RhcnRoZWxwKHZvaWQpOworRklMRSAqemNvbmZfZm9wZW4oY29uc3QgY2hhciAqbmFtZSk7Cit2b2lkIHpjb25mX2luaXRzY2FuKGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCB6Y29uZl9uZXh0ZmlsZShjb25zdCBjaGFyICpuYW1lKTsKK2ludCB6Y29uZl9saW5lbm8odm9pZCk7CitjaGFyICp6Y29uZl9jdXJuYW1lKHZvaWQpOworCisvKiBjb25mZGF0YS5jICovCitleHRlcm4gY29uc3QgY2hhciBjb25mX2RlZl9maWxlbmFtZVtdOworZXh0ZXJuIGNoYXIgY29uZl9maWxlbmFtZVtdOworCitjaGFyICpjb25mX2dldF9kZWZhdWx0X2NvbmZuYW1lKHZvaWQpOworCisvKiBrY29uZmlnX2xvYWQuYyAqLwordm9pZCBrY29uZmlnX2xvYWQodm9pZCk7CisKKy8qIG1lbnUuYyAqLwordm9pZCBtZW51X2luaXQodm9pZCk7Cit2b2lkIG1lbnVfYWRkX21lbnUodm9pZCk7Cit2b2lkIG1lbnVfZW5kX21lbnUodm9pZCk7Cit2b2lkIG1lbnVfYWRkX2VudHJ5KHN0cnVjdCBzeW1ib2wgKnN5bSk7Cit2b2lkIG1lbnVfZW5kX2VudHJ5KHZvaWQpOwordm9pZCBtZW51X2FkZF9kZXAoc3RydWN0IGV4cHIgKmRlcCk7CitzdHJ1Y3QgcHJvcGVydHkgKm1lbnVfYWRkX3Byb3AoZW51bSBwcm9wX3R5cGUgdHlwZSwgY2hhciAqcHJvbXB0LCBzdHJ1Y3QgZXhwciAqZXhwciwgc3RydWN0IGV4cHIgKmRlcCk7Cit2b2lkIG1lbnVfYWRkX3Byb21wdChlbnVtIHByb3BfdHlwZSB0eXBlLCBjaGFyICpwcm9tcHQsIHN0cnVjdCBleHByICpkZXApOwordm9pZCBtZW51X2FkZF9leHByKGVudW0gcHJvcF90eXBlIHR5cGUsIHN0cnVjdCBleHByICpleHByLCBzdHJ1Y3QgZXhwciAqZGVwKTsKK3ZvaWQgbWVudV9hZGRfc3ltYm9sKGVudW0gcHJvcF90eXBlIHR5cGUsIHN0cnVjdCBzeW1ib2wgKnN5bSwgc3RydWN0IGV4cHIgKmRlcCk7Cit2b2lkIG1lbnVfZmluYWxpemUoc3RydWN0IG1lbnUgKnBhcmVudCk7Cit2b2lkIG1lbnVfc2V0X3R5cGUoaW50IHR5cGUpOworCisvKiB1dGlsLmMgKi8KK3N0cnVjdCBmaWxlICpmaWxlX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKTsKK2ludCBmaWxlX3dyaXRlX2RlcChjb25zdCBjaGFyICpuYW1lKTsKKworc3RydWN0IGdzdHIgeworCXNpemVfdCBsZW47CisJY2hhciAgKnM7Cit9Oworc3RydWN0IGdzdHIgc3RyX25ldyh2b2lkKTsKK3N0cnVjdCBnc3RyIHN0cl9hc3NpZ24oY29uc3QgY2hhciAqcyk7Cit2b2lkIHN0cl9mcmVlKHN0cnVjdCBnc3RyICpncyk7Cit2b2lkIHN0cl9hcHBlbmQoc3RydWN0IGdzdHIgKmdzLCBjb25zdCBjaGFyICpzKTsKK3ZvaWQgc3RyX3ByaW50ZihzdHJ1Y3QgZ3N0ciAqZ3MsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK2NvbnN0IGNoYXIgKnN0cl9nZXQoc3RydWN0IGdzdHIgKmdzKTsKKworLyogc3ltYm9sLmMgKi8KK3ZvaWQgc3ltX2luaXQodm9pZCk7Cit2b2lkIHN5bV9jbGVhcl9hbGxfdmFsaWQodm9pZCk7Cit2b2lkIHN5bV9zZXRfY2hhbmdlZChzdHJ1Y3Qgc3ltYm9sICpzeW0pOworc3RydWN0IHN5bWJvbCAqc3ltX2NoZWNrX2RlcHMoc3RydWN0IHN5bWJvbCAqc3ltKTsKK3N0cnVjdCBwcm9wZXJ0eSAqcHJvcF9hbGxvYyhlbnVtIHByb3BfdHlwZSB0eXBlLCBzdHJ1Y3Qgc3ltYm9sICpzeW0pOworc3RydWN0IHN5bWJvbCAqcHJvcF9nZXRfc3ltYm9sKHN0cnVjdCBwcm9wZXJ0eSAqcHJvcCk7CisKK3N0YXRpYyBpbmxpbmUgdHJpc3RhdGUgc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJcmV0dXJuIHN5bS0+Y3Vyci50cmk7Cit9CisKKworc3RhdGljIGlubGluZSBzdHJ1Y3Qgc3ltYm9sICpzeW1fZ2V0X2Nob2ljZV92YWx1ZShzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJcmV0dXJuIChzdHJ1Y3Qgc3ltYm9sICopc3ltLT5jdXJyLnZhbDsKK30KKworc3RhdGljIGlubGluZSBib29sIHN5bV9zZXRfY2hvaWNlX3ZhbHVlKHN0cnVjdCBzeW1ib2wgKmNoLCBzdHJ1Y3Qgc3ltYm9sICpjaHZhbCkKK3sKKwlyZXR1cm4gc3ltX3NldF90cmlzdGF0ZV92YWx1ZShjaHZhbCwgeWVzKTsKK30KKworc3RhdGljIGlubGluZSBib29sIHN5bV9pc19jaG9pY2Uoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXJldHVybiBzeW0tPmZsYWdzICYgU1lNQk9MX0NIT0lDRSA/IHRydWUgOiBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSBib29sIHN5bV9pc19jaG9pY2VfdmFsdWUoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXJldHVybiBzeW0tPmZsYWdzICYgU1lNQk9MX0NIT0lDRVZBTCA/IHRydWUgOiBmYWxzZTsKK30KKworc3RhdGljIGlubGluZSBib29sIHN5bV9pc19vcHRpb25hbChzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJcmV0dXJuIHN5bS0+ZmxhZ3MgJiBTWU1CT0xfT1BUSU9OQUwgPyB0cnVlIDogZmFsc2U7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBzeW1faGFzX3ZhbHVlKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlyZXR1cm4gc3ltLT5mbGFncyAmIFNZTUJPTF9ORVcgPyBmYWxzZSA6IHRydWU7Cit9CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBMS0NfSCAqLwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL2xrY19wcm90by5oIGIvc2NyaXB0cy9rY29uZmlnL2xrY19wcm90by5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYzZkMGMKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvbGtjX3Byb3RvLmgKQEAgLTAsMCArMSw0MCBAQAorCisvKiBjb25mZGF0YS5jICovCitQKGNvbmZfcGFyc2Usdm9pZCwoY29uc3QgY2hhciAqbmFtZSkpOworUChjb25mX3JlYWQsaW50LChjb25zdCBjaGFyICpuYW1lKSk7CitQKGNvbmZfd3JpdGUsaW50LChjb25zdCBjaGFyICpuYW1lKSk7CisKKy8qIG1lbnUuYyAqLworUChyb290bWVudSxzdHJ1Y3QgbWVudSwpOworCitQKG1lbnVfaXNfdmlzaWJsZSxib29sLChzdHJ1Y3QgbWVudSAqbWVudSkpOworUChtZW51X2dldF9wcm9tcHQsY29uc3QgY2hhciAqLChzdHJ1Y3QgbWVudSAqbWVudSkpOworUChtZW51X2dldF9yb290X21lbnUsc3RydWN0IG1lbnUgKiwoc3RydWN0IG1lbnUgKm1lbnUpKTsKK1AobWVudV9nZXRfcGFyZW50X21lbnUsc3RydWN0IG1lbnUgKiwoc3RydWN0IG1lbnUgKm1lbnUpKTsKKworLyogc3ltYm9sLmMgKi8KK1Aoc3ltYm9sX2hhc2gsc3RydWN0IHN5bWJvbCAqLFtTWU1CT0xfSEFTSFNJWkVdKTsKK1Aoc3ltX2NoYW5nZV9jb3VudCxpbnQsKTsKKworUChzeW1fbG9va3VwLHN0cnVjdCBzeW1ib2wgKiwoY29uc3QgY2hhciAqbmFtZSwgaW50IGlzY29uc3QpKTsKK1Aoc3ltX2ZpbmQsc3RydWN0IHN5bWJvbCAqLChjb25zdCBjaGFyICpuYW1lKSk7CitQKHN5bV9yZV9zZWFyY2gsc3RydWN0IHN5bWJvbCAqKiwoY29uc3QgY2hhciAqcGF0dGVybikpOworUChzeW1fdHlwZV9uYW1lLGNvbnN0IGNoYXIgKiwoZW51bSBzeW1ib2xfdHlwZSB0eXBlKSk7CitQKHN5bV9jYWxjX3ZhbHVlLHZvaWQsKHN0cnVjdCBzeW1ib2wgKnN5bSkpOworUChzeW1fZ2V0X3R5cGUsZW51bSBzeW1ib2xfdHlwZSwoc3RydWN0IHN5bWJvbCAqc3ltKSk7CitQKHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2UsYm9vbCwoc3RydWN0IHN5bWJvbCAqc3ltLHRyaXN0YXRlIHRyaSkpOworUChzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlLGJvb2wsKHN0cnVjdCBzeW1ib2wgKnN5bSx0cmlzdGF0ZSB0cmkpKTsKK1Aoc3ltX3RvZ2dsZV90cmlzdGF0ZV92YWx1ZSx0cmlzdGF0ZSwoc3RydWN0IHN5bWJvbCAqc3ltKSk7CitQKHN5bV9zdHJpbmdfdmFsaWQsYm9vbCwoc3RydWN0IHN5bWJvbCAqc3ltLCBjb25zdCBjaGFyICpuZXd2YWwpKTsKK1Aoc3ltX3N0cmluZ193aXRoaW5fcmFuZ2UsYm9vbCwoc3RydWN0IHN5bWJvbCAqc3ltLCBjb25zdCBjaGFyICpzdHIpKTsKK1Aoc3ltX3NldF9zdHJpbmdfdmFsdWUsYm9vbCwoc3RydWN0IHN5bWJvbCAqc3ltLCBjb25zdCBjaGFyICpuZXd2YWwpKTsKK1Aoc3ltX2lzX2NoYW5nYWJsZSxib29sLChzdHJ1Y3Qgc3ltYm9sICpzeW0pKTsKK1Aoc3ltX2dldF9jaG9pY2VfcHJvcCxzdHJ1Y3QgcHJvcGVydHkgKiwoc3RydWN0IHN5bWJvbCAqc3ltKSk7CitQKHN5bV9nZXRfZGVmYXVsdF9wcm9wLHN0cnVjdCBwcm9wZXJ0eSAqLChzdHJ1Y3Qgc3ltYm9sICpzeW0pKTsKK1Aoc3ltX2dldF9zdHJpbmdfdmFsdWUsY29uc3QgY2hhciAqLChzdHJ1Y3Qgc3ltYm9sICpzeW0pKTsKKworUChwcm9wX2dldF90eXBlX25hbWUsY29uc3QgY2hhciAqLChlbnVtIHByb3BfdHlwZSB0eXBlKSk7CisKKy8qIGV4cHIuYyAqLworUChleHByX2NvbXBhcmVfdHlwZSxpbnQsKGVudW0gZXhwcl90eXBlIHQxLCBlbnVtIGV4cHJfdHlwZSB0MikpOworUChleHByX3ByaW50LHZvaWQsKHN0cnVjdCBleHByICplLCB2b2lkICgqZm4pKHZvaWQgKiwgY29uc3QgY2hhciAqKSwgdm9pZCAqZGF0YSwgaW50IHByZXZ0b2tlbikpOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL21jb25mLmMgYi9zY3JpcHRzL2tjb25maWcvbWNvbmYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzBkMzE2Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL21jb25mLmMKQEAgLTAsMCArMSwxMDkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCisgKgorICogSW50cm9kdWNlZCBzaW5nbGUgbWVudSBtb2RlIChzaG93IGFsbCBzdWItbWVudXMgaW4gb25lIGxhcmdlIHRyZWUpLgorICogMjAwMi0xMS0wNiBQZXRyIEJhdWRpcyA8cGFza3lAdWN3LmN6PgorICovCisKKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRlcm1pb3MuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2RlZmluZSBMS0NfRElSRUNUX0xJTksKKyNpbmNsdWRlICJsa2MuaCIKKworc3RhdGljIGNoYXIgbWVudV9iYWNrdGl0bGVbMTI4XTsKK3N0YXRpYyBjb25zdCBjaGFyIG1jb25mX3JlYWRtZVtdID0KKyJPdmVydmlld1xuIgorIi0tLS0tLS0tXG4iCisiU29tZSBrZXJuZWwgZmVhdHVyZXMgbWF5IGJlIGJ1aWx0IGRpcmVjdGx5IGludG8gdGhlIGtlcm5lbC5cbiIKKyJTb21lIG1heSBiZSBtYWRlIGludG8gbG9hZGFibGUgcnVudGltZSBtb2R1bGVzLiAgU29tZSBmZWF0dXJlc1xuIgorIm1heSBiZSBjb21wbGV0ZWx5IHJlbW92ZWQgYWx0b2dldGhlci4gIFRoZXJlIGFyZSBhbHNvIGNlcnRhaW5cbiIKKyJrZXJuZWwgcGFyYW1ldGVycyB3aGljaCBhcmUgbm90IHJlYWxseSBmZWF0dXJlcywgYnV0IG11c3QgYmVcbiIKKyJlbnRlcmVkIGluIGFzIGRlY2ltYWwgb3IgaGV4YWRlY2ltYWwgbnVtYmVycyBvciBwb3NzaWJseSB0ZXh0LlxuIgorIlxuIgorIk1lbnUgaXRlbXMgYmVnaW5uaW5nIHdpdGggWypdLCA8TT4gb3IgWyBdIHJlcHJlc2VudCBmZWF0dXJlc1xuIgorImNvbmZpZ3VyZWQgdG8gYmUgYnVpbHQgaW4sIG1vZHVsYXJpemVkIG9yIHJlbW92ZWQgcmVzcGVjdGl2ZWx5LlxuIgorIlBvaW50ZWQgYnJhY2tldHMgPD4gcmVwcmVzZW50IG1vZHVsZSBjYXBhYmxlIGZlYXR1cmVzLlxuIgorIlxuIgorIlRvIGNoYW5nZSBhbnkgb2YgdGhlc2UgZmVhdHVyZXMsIGhpZ2hsaWdodCBpdCB3aXRoIHRoZSBjdXJzb3JcbiIKKyJrZXlzIGFuZCBwcmVzcyA8WT4gdG8gYnVpbGQgaXQgaW4sIDxNPiB0byBtYWtlIGl0IGEgbW9kdWxlIG9yXG4iCisiPE4+IHRvIHJlbW92ZWQgaXQuICBZb3UgbWF5IGFsc28gcHJlc3MgdGhlIDxTcGFjZSBCYXI+IHRvIGN5Y2xlXG4iCisidGhyb3VnaCB0aGUgYXZhaWxhYmxlIG9wdGlvbnMgKGllLiBZLT5OLT5NLT5ZKS5cbiIKKyJcbiIKKyJTb21lIGFkZGl0aW9uYWwga2V5Ym9hcmQgaGludHM6XG4iCisiXG4iCisiTWVudXNcbiIKKyItLS0tLS0tLS0tXG4iCisibyAgVXNlIHRoZSBVcC9Eb3duIGFycm93IGtleXMgKGN1cnNvciBrZXlzKSB0byBoaWdobGlnaHQgdGhlIGl0ZW1cbiIKKyIgICB5b3Ugd2lzaCB0byBjaGFuZ2Ugb3Igc3VibWVudSB3aXNoIHRvIHNlbGVjdCBhbmQgcHJlc3MgPEVudGVyPi5cbiIKKyIgICBTdWJtZW51cyBhcmUgZGVzaWduYXRlZCBieSBcIi0tLT5cIi5cbiIKKyJcbiIKKyIgICBTaG9ydGN1dDogUHJlc3MgdGhlIG9wdGlvbidzIGhpZ2hsaWdodGVkIGxldHRlciAoaG90a2V5KS5cbiIKKyIgICAgICAgICAgICAgUHJlc3NpbmcgYSBob3RrZXkgbW9yZSB0aGFuIG9uY2Ugd2lsbCBzZXF1ZW5jZVxuIgorIiAgICAgICAgICAgICB0aHJvdWdoIGFsbCB2aXNpYmxlIGl0ZW1zIHdoaWNoIHVzZSB0aGF0IGhvdGtleS5cbiIKKyJcbiIKKyIgICBZb3UgbWF5IGFsc28gdXNlIHRoZSA8UEFHRSBVUD4gYW5kIDxQQUdFIERPV04+IGtleXMgdG8gc2Nyb2xsXG4iCisiICAgdW5zZWVuIG9wdGlvbnMgaW50byB2aWV3LlxuIgorIlxuIgorIm8gIFRvIGV4aXQgYSBtZW51IHVzZSB0aGUgY3Vyc29yIGtleXMgdG8gaGlnaGxpZ2h0IHRoZSA8RXhpdD4gYnV0dG9uXG4iCisiICAgYW5kIHByZXNzIDxFTlRFUj4uXG4iCisiXG4iCisiICAgU2hvcnRjdXQ6IFByZXNzIDxFU0M+PEVTQz4gb3IgPEU+IG9yIDxYPiBpZiB0aGVyZSBpcyBubyBob3RrZXlcbiIKKyIgICAgICAgICAgICAgdXNpbmcgdGhvc2UgbGV0dGVycy4gIFlvdSBtYXkgcHJlc3MgYSBzaW5nbGUgPEVTQz4sIGJ1dFxuIgorIiAgICAgICAgICAgICB0aGVyZSBpcyBhIGRlbGF5ZWQgcmVzcG9uc2Ugd2hpY2ggeW91IG1heSBmaW5kIGFubm95aW5nLlxuIgorIlxuIgorIiAgIEFsc28sIHRoZSA8VEFCPiBhbmQgY3Vyc29yIGtleXMgd2lsbCBjeWNsZSBiZXR3ZWVuIDxTZWxlY3Q+LFxuIgorIiAgIDxFeGl0PiBhbmQgPEhlbHA+XG4iCisiXG4iCisibyAgVG8gZ2V0IGhlbHAgd2l0aCBhbiBpdGVtLCB1c2UgdGhlIGN1cnNvciBrZXlzIHRvIGhpZ2hsaWdodCA8SGVscD5cbiIKKyIgICBhbmQgUHJlc3MgPEVOVEVSPi5cbiIKKyJcbiIKKyIgICBTaG9ydGN1dDogUHJlc3MgPEg+IG9yIDw/Pi5cbiIKKyJcbiIKKyJcbiIKKyJSYWRpb2xpc3RzICAoQ2hvaWNlIGxpc3RzKVxuIgorIi0tLS0tLS0tLS0tXG4iCisibyAgVXNlIHRoZSBjdXJzb3Iga2V5cyB0byBzZWxlY3QgdGhlIG9wdGlvbiB5b3Ugd2lzaCB0byBzZXQgYW5kIHByZXNzXG4iCisiICAgPFM+IG9yIHRoZSA8U1BBQ0UgQkFSPi5cbiIKKyJcbiIKKyIgICBTaG9ydGN1dDogUHJlc3MgdGhlIGZpcnN0IGxldHRlciBvZiB0aGUgb3B0aW9uIHlvdSB3aXNoIHRvIHNldCB0aGVuXG4iCisiICAgICAgICAgICAgIHByZXNzIDxTPiBvciA8U1BBQ0UgQkFSPi5cbiIKKyJcbiIKKyJvICBUbyBzZWUgYXZhaWxhYmxlIGhlbHAgZm9yIHRoZSBpdGVtLCB1c2UgdGhlIGN1cnNvciBrZXlzIHRvIGhpZ2hsaWdodFxuIgorIiAgIDxIZWxwPiBhbmQgUHJlc3MgPEVOVEVSPi5cbiIKKyJcbiIKKyIgICBTaG9ydGN1dDogUHJlc3MgPEg+IG9yIDw/Pi5cbiIKKyJcbiIKKyIgICBBbHNvLCB0aGUgPFRBQj4gYW5kIGN1cnNvciBrZXlzIHdpbGwgY3ljbGUgYmV0d2VlbiA8U2VsZWN0PiBhbmRcbiIKKyIgICA8SGVscD5cbiIKKyJcbiIKKyJcbiIKKyJEYXRhIEVudHJ5XG4iCisiLS0tLS0tLS0tLS1cbiIKKyJvICBFbnRlciB0aGUgcmVxdWVzdGVkIGluZm9ybWF0aW9uIGFuZCBwcmVzcyA8RU5URVI+XG4iCisiICAgSWYgeW91IGFyZSBlbnRlcmluZyBoZXhhZGVjaW1hbCB2YWx1ZXMsIGl0IGlzIG5vdCBuZWNlc3NhcnkgdG9cbiIKKyIgICBhZGQgdGhlICcweCcgcHJlZml4IHRvIHRoZSBlbnRyeS5cbiIKKyJcbiIKKyJvICBGb3IgaGVscCwgdXNlIHRoZSA8VEFCPiBvciBjdXJzb3Iga2V5cyB0byBoaWdobGlnaHQgdGhlIGhlbHAgb3B0aW9uXG4iCisiICAgYW5kIHByZXNzIDxFTlRFUj4uICBZb3UgY2FuIHRyeSA8VEFCPjxIPiBhcyB3ZWxsLlxuIgorIlxuIgorIlxuIgorIlRleHQgQm94ICAgIChIZWxwIFdpbmRvdylcbiIKKyItLS0tLS0tLVxuIgorIm8gIFVzZSB0aGUgY3Vyc29yIGtleXMgdG8gc2Nyb2xsIHVwL2Rvd24vbGVmdC9yaWdodC4gIFRoZSBWSSBlZGl0b3JcbiIKKyIgICBrZXlzIGgsaixrLGwgZnVuY3Rpb24gaGVyZSBhcyBkbyA8U1BBQ0UgQkFSPiBhbmQgPEI+IGZvciB0aG9zZVxuIgorIiAgIHdobyBhcmUgZmFtaWxpYXIgd2l0aCBsZXNzIGFuZCBseW54LlxuIgorIlxuIgorIm8gIFByZXNzIDxFPiwgPFg+LCA8RW50ZXI+IG9yIDxFc2M+PEVzYz4gdG8gZXhpdC5cbiIKKyJcbiIKKyJcbiIKKyJBbHRlcm5hdGUgQ29uZmlndXJhdGlvbiBGaWxlc1xuIgorIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisiTWVudWNvbmZpZyBzdXBwb3J0cyB0aGUgdXNlIG9mIGFsdGVybmF0ZSBjb25maWd1cmF0aW9uIGZpbGVzIGZvclxuIgorInRob3NlIHdobywgZm9yIHZhcmlvdXMgcmVhc29ucywgZmluZCBpdCBuZWNlc3NhcnkgdG8gc3dpdGNoXG4iCisiYmV0d2VlbiBkaWZmZXJlbnQga2VybmVsIGNvbmZpZ3VyYXRpb25zLlxuIgorIlxuIgorIkF0IHRoZSBlbmQgb2YgdGhlIG1haW4gbWVudSB5b3Ugd2lsbCBmaW5kIHR3byBvcHRpb25zLiAgT25lIGlzXG4iCisiZm9yIHNhdmluZyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uIHRvIGEgZmlsZSBvZiB5b3VyIGNob29zaW5nLlxuIgorIlRoZSBvdGhlciBvcHRpb24gaXMgZm9yIGxvYWRpbmcgYSBwcmV2aW91c2x5IHNhdmVkIGFsdGVybmF0ZVxuIgorImNvbmZpZ3VyYXRpb24uXG4iCisiXG4iCisiRXZlbiBpZiB5b3UgZG9uJ3QgdXNlIGFsdGVybmF0ZSBjb25maWd1cmF0aW9uIGZpbGVzLCBidXQgeW91XG4iCisiZmluZCBkdXJpbmcgYSBNZW51Y29uZmlnIHNlc3Npb24gdGhhdCB5b3UgaGF2ZSBjb21wbGV0ZWx5IG1lc3NlZFxuIgorInVwIHlvdXIgc2V0dGluZ3MsIHlvdSBtYXkgdXNlIHRoZSBcIkxvYWQgQWx0ZXJuYXRlLi4uXCIgb3B0aW9uIHRvXG4iCisicmVzdG9yZSB5b3VyIHByZXZpb3VzbHkgc2F2ZWQgc2V0dGluZ3MgZnJvbSBcIi5jb25maWdcIiB3aXRob3V0XG4iCisicmVzdGFydGluZyBNZW51Y29uZmlnLlxuIgorIlxuIgorIk90aGVyIGluZm9ybWF0aW9uXG4iCisiLS0tLS0tLS0tLS0tLS0tLS1cbiIKKyJJZiB5b3UgdXNlIE1lbnVjb25maWcgaW4gYW4gWFRFUk0gd2luZG93IG1ha2Ugc3VyZSB5b3UgaGF2ZSB5b3VyXG4iCisiJFRFUk0gdmFyaWFibGUgc2V0IHRvIHBvaW50IHRvIGEgeHRlcm0gZGVmaW5pdGlvbiB3aGljaCBzdXBwb3J0cyBjb2xvci5cbiIKKyJPdGhlcndpc2UsIE1lbnVjb25maWcgd2lsbCBsb29rIHJhdGhlciBiYWQuICBNZW51Y29uZmlnIHdpbGwgbm90XG4iCisiZGlzcGxheSBjb3JyZWN0bHkgaW4gYSBSWFZUIHdpbmRvdyBiZWNhdXNlIHJ4dnQgZGlzcGxheXMgb25seSBvbmVcbiIKKyJpbnRlbnNpdHkgb2YgY29sb3IsIGJyaWdodC5cbiIKKyJcbiIKKyJNZW51Y29uZmlnIHdpbGwgZGlzcGxheSBsYXJnZXIgbWVudXMgb24gc2NyZWVucyBvciB4dGVybXMgd2hpY2ggYXJlXG4iCisic2V0IHRvIGRpc3BsYXkgbW9yZSB0aGFuIHRoZSBzdGFuZGFyZCAyNSByb3cgYnkgODAgY29sdW1uIGdlb21ldHJ5LlxuIgorIkluIG9yZGVyIGZvciB0aGlzIHRvIHdvcmssIHRoZSBcInN0dHkgc2l6ZVwiIGNvbW1hbmQgbXVzdCBiZSBhYmxlIHRvXG4iCisiZGlzcGxheSB0aGUgc2NyZWVuJ3MgY3VycmVudCByb3cgYW5kIGNvbHVtbiBnZW9tZXRyeS4gIEkgU1RST05HTFlcbiIKKyJSRUNPTU1FTkQgdGhhdCB5b3UgbWFrZSBzdXJlIHlvdSBkbyBOT1QgaGF2ZSB0aGUgc2hlbGwgdmFyaWFibGVzXG4iCisiTElORVMgYW5kIENPTFVNTlMgZXhwb3J0ZWQgaW50byB5b3VyIGVudmlyb25tZW50LiAgU29tZSBkaXN0cmlidXRpb25zXG4iCisiZXhwb3J0IHRob3NlIHZhcmlhYmxlcyB2aWEgL2V0Yy9wcm9maWxlLiAgU29tZSBuY3Vyc2VzIHByb2dyYW1zIGNhblxuIgorImJlY29tZSBjb25mdXNlZCB3aGVuIHRob3NlIHZhcmlhYmxlcyAoTElORVMgJiBDT0xVTU5TKSBkb24ndCByZWZsZWN0XG4iCisidGhlIHRydWUgc2NyZWVuIHNpemUuXG4iCisiXG4iCisiT3B0aW9uYWwgcGVyc29uYWxpdHkgYXZhaWxhYmxlXG4iCisiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisiSWYgeW91IHByZWZlciB0byBoYXZlIGFsbCBvZiB0aGUga2VybmVsIG9wdGlvbnMgbGlzdGVkIGluIGEgc2luZ2xlXG4iCisibWVudSwgcmF0aGVyIHRoYW4gdGhlIGRlZmF1bHQgbXVsdGltZW51IGhpZXJhcmNoeSwgcnVuIHRoZSBtZW51Y29uZmlnXG4iCisid2l0aCBNRU5VQ09ORklHX01PREUgZW52aXJvbm1lbnQgdmFyaWFibGUgc2V0IHRvIHNpbmdsZV9tZW51LiBFeGFtcGxlOlxuIgorIlxuIgorIm1ha2UgTUVOVUNPTkZJR19NT0RFPXNpbmdsZV9tZW51IG1lbnVjb25maWdcbiIKKyJcbiIKKyI8RW50ZXI+IHdpbGwgdGhlbiB1bnJvbGwgdGhlIGFwcHJvcHJpYXRlIGNhdGVnb3J5LCBvciBlbmZvbGQgaXQgaWYgaXRcbiIKKyJpcyBhbHJlYWR5IHVucm9sbGVkLlxuIgorIlxuIgorIk5vdGUgdGhhdCB0aGlzIG1vZGUgY2FuIGV2ZW50dWFsbHkgYmUgYSBsaXR0bGUgbW9yZSBDUFUgZXhwZW5zaXZlXG4iCisiKGVzcGVjaWFsbHkgd2l0aCBhIGxhcmdlciBudW1iZXIgb2YgdW5yb2xsZWQgY2F0ZWdvcmllcykgdGhhbiB0aGVcbiIKKyJkZWZhdWx0IG1vZGUuXG4iLAorbWVudV9pbnN0cnVjdGlvbnNbXSA9CisJIkFycm93IGtleXMgbmF2aWdhdGUgdGhlIG1lbnUuICAiCisJIjxFbnRlcj4gc2VsZWN0cyBzdWJtZW51cyAtLS0+LiAgIgorCSJIaWdobGlnaHRlZCBsZXR0ZXJzIGFyZSBob3RrZXlzLiAgIgorCSJQcmVzc2luZyA8WT4gaW5jbHVkZXMsIDxOPiBleGNsdWRlcywgPE0+IG1vZHVsYXJpemVzIGZlYXR1cmVzLiAgIgorCSJQcmVzcyA8RXNjPjxFc2M+IHRvIGV4aXQsIDw/PiBmb3IgSGVscCwgPC8+IGZvciBTZWFyY2guICAiCisJIkxlZ2VuZDogWypdIGJ1aWx0LWluICBbIF0gZXhjbHVkZWQgIDxNPiBtb2R1bGUgIDwgPiBtb2R1bGUgY2FwYWJsZSIsCityYWRpb2xpc3RfaW5zdHJ1Y3Rpb25zW10gPQorCSJVc2UgdGhlIGFycm93IGtleXMgdG8gbmF2aWdhdGUgdGhpcyB3aW5kb3cgb3IgIgorCSJwcmVzcyB0aGUgaG90a2V5IG9mIHRoZSBpdGVtIHlvdSB3aXNoIHRvIHNlbGVjdCAiCisJImZvbGxvd2VkIGJ5IHRoZSA8U1BBQ0UgQkFSPi4gIgorCSJQcmVzcyA8Pz4gZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBvcHRpb24uIiwKK2lucHV0Ym94X2luc3RydWN0aW9uc19pbnRbXSA9CisJIlBsZWFzZSBlbnRlciBhIGRlY2ltYWwgdmFsdWUuICIKKwkiRnJhY3Rpb25zIHdpbGwgbm90IGJlIGFjY2VwdGVkLiAgIgorCSJVc2UgdGhlIDxUQUI+IGtleSB0byBtb3ZlIGZyb20gdGhlIGlucHV0IGZpZWxkIHRvIHRoZSBidXR0b25zIGJlbG93IGl0LiIsCitpbnB1dGJveF9pbnN0cnVjdGlvbnNfaGV4W10gPQorCSJQbGVhc2UgZW50ZXIgYSBoZXhhZGVjaW1hbCB2YWx1ZS4gIgorCSJVc2UgdGhlIDxUQUI+IGtleSB0byBtb3ZlIGZyb20gdGhlIGlucHV0IGZpZWxkIHRvIHRoZSBidXR0b25zIGJlbG93IGl0LiIsCitpbnB1dGJveF9pbnN0cnVjdGlvbnNfc3RyaW5nW10gPQorCSJQbGVhc2UgZW50ZXIgYSBzdHJpbmcgdmFsdWUuICIKKwkiVXNlIHRoZSA8VEFCPiBrZXkgdG8gbW92ZSBmcm9tIHRoZSBpbnB1dCBmaWVsZCB0byB0aGUgYnV0dG9ucyBiZWxvdyBpdC4iLAorc2V0bW9kX3RleHRbXSA9CisJIlRoaXMgZmVhdHVyZSBkZXBlbmRzIG9uIGFub3RoZXIgd2hpY2ggaGFzIGJlZW4gY29uZmlndXJlZCBhcyBhIG1vZHVsZS5cbiIKKwkiQXMgYSByZXN1bHQsIHRoaXMgZmVhdHVyZSB3aWxsIGJlIGJ1aWx0IGFzIGEgbW9kdWxlLiIsCitub2hlbHBfdGV4dFtdID0KKwkiVGhlcmUgaXMgbm8gaGVscCBhdmFpbGFibGUgZm9yIHRoaXMga2VybmVsIG9wdGlvbi5cbiIsCitsb2FkX2NvbmZpZ190ZXh0W10gPQorCSJFbnRlciB0aGUgbmFtZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlIHlvdSB3aXNoIHRvIGxvYWQuICAiCisJIkFjY2VwdCB0aGUgbmFtZSBzaG93biB0byByZXN0b3JlIHRoZSBjb25maWd1cmF0aW9uIHlvdSAiCisJImxhc3QgcmV0cmlldmVkLiAgTGVhdmUgYmxhbmsgdG8gYWJvcnQuIiwKK2xvYWRfY29uZmlnX2hlbHBbXSA9CisJIlxuIgorCSJGb3IgdmFyaW91cyByZWFzb25zLCBvbmUgbWF5IHdpc2ggdG8ga2VlcCBzZXZlcmFsIGRpZmZlcmVudCBrZXJuZWxcbiIKKwkiY29uZmlndXJhdGlvbnMgYXZhaWxhYmxlIG9uIGEgc2luZ2xlIG1hY2hpbmUuXG4iCisJIlxuIgorCSJJZiB5b3UgaGF2ZSBzYXZlZCBhIHByZXZpb3VzIGNvbmZpZ3VyYXRpb24gaW4gYSBmaWxlIG90aGVyIHRoYW4gdGhlXG4iCisJImtlcm5lbCdzIGRlZmF1bHQsIGVudGVyaW5nIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGhlcmUgd2lsbCBhbGxvdyB5b3VcbiIKKwkidG8gbW9kaWZ5IHRoYXQgY29uZmlndXJhdGlvbi5cbiIKKwkiXG4iCisJIklmIHlvdSBhcmUgdW5jZXJ0YWluLCB0aGVuIHlvdSBoYXZlIHByb2JhYmx5IG5ldmVyIHVzZWQgYWx0ZXJuYXRlXG4iCisJImNvbmZpZ3VyYXRpb24gZmlsZXMuICBZb3Ugc2hvdWxkIHRoZXJlZm9yIGxlYXZlIHRoaXMgYmxhbmsgdG8gYWJvcnQuXG4iLAorc2F2ZV9jb25maWdfdGV4dFtdID0KKwkiRW50ZXIgYSBmaWxlbmFtZSB0byB3aGljaCB0aGlzIGNvbmZpZ3VyYXRpb24gc2hvdWxkIGJlIHNhdmVkICIKKwkiYXMgYW4gYWx0ZXJuYXRlLiAgTGVhdmUgYmxhbmsgdG8gYWJvcnQuIiwKK3NhdmVfY29uZmlnX2hlbHBbXSA9CisJIlxuIgorCSJGb3IgdmFyaW91cyByZWFzb25zLCBvbmUgbWF5IHdpc2ggdG8ga2VlcCBkaWZmZXJlbnQga2VybmVsXG4iCisJImNvbmZpZ3VyYXRpb25zIGF2YWlsYWJsZSBvbiBhIHNpbmdsZSBtYWNoaW5lLlxuIgorCSJcbiIKKwkiRW50ZXJpbmcgYSBmaWxlIG5hbWUgaGVyZSB3aWxsIGFsbG93IHlvdSB0byBsYXRlciByZXRyaWV2ZSwgbW9kaWZ5XG4iCisJImFuZCB1c2UgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBhcyBhbiBhbHRlcm5hdGUgdG8gd2hhdGV2ZXJcbiIKKwkiY29uZmlndXJhdGlvbiBvcHRpb25zIHlvdSBoYXZlIHNlbGVjdGVkIGF0IHRoYXQgdGltZS5cbiIKKwkiXG4iCisJIklmIHlvdSBhcmUgdW5jZXJ0YWluIHdoYXQgYWxsIHRoaXMgbWVhbnMgdGhlbiB5b3Ugc2hvdWxkIHByb2JhYmx5XG4iCisJImxlYXZlIHRoaXMgYmxhbmsuXG4iLAorc2VhcmNoX2hlbHBbXSA9CisJIlxuIgorCSJTZWFyY2ggZm9yIENPTkZJR18gc3ltYm9scyBhbmQgZGlzcGxheSB0aGVpciByZWxhdGlvbnMuXG4iCisJIkV4YW1wbGU6IHNlYXJjaCBmb3IgXCJeRk9PXCJcbiIKKwkiUmVzdWx0OlxuIgorCSItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorCSJTeW1ib2w6IEZPTyBbPW1dXG4iCisJIlByb21wdDogRm9vIGJ1cyBpcyB1c2VkIHRvIGRyaXZlIHRoZSBiYXIgSFdcbiIKKwkiRGVmaW5lZCBhdCBkcml2ZXJzL3BjaS9LY29uZmlnOjQ3XG4iCisJIkRlcGVuZHMgb246IFg4Nl9MT0NBTF9BUElDICYmIFg4Nl9JT19BUElDIHx8IElBNjRcbiIKKwkiTG9jYXRpb246XG4iCisJIiAgLT4gQnVzIG9wdGlvbnMgKFBDSSwgUENNQ0lBLCBFSVNBLCBNQ0EsIElTQSlcbiIKKwkiICAgIC0+IFBDSSBzdXBwb3J0IChQQ0kgWz15XSlcbiIKKwkiICAgICAgLT4gUENJIGFjY2VzcyBtb2RlICg8Y2hvaWNlPiBbPXldKVxuIgorCSJTZWxlY3RzOiBMSUJDUkMzMlxuIgorCSJTZWxlY3RlZCBieTogQkFSXG4iCisJIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisJIm8gVGhlIGxpbmUgJ1Byb21wdDonIHNob3dzIHRoZSB0ZXh0IHVzZWQgaW4gdGhlIG1lbnUgc3RydWN0dXJlIGZvclxuIgorCSIgIHRoaXMgQ09ORklHXyBzeW1ib2xcbiIKKwkibyBUaGUgJ0RlZmluZWQgYXQnIGxpbmUgdGVsbCBhdCB3aGF0IGZpbGUgLyBsaW5lIG51bWJlciB0aGUgc3ltYm9sXG4iCisJIiAgaXMgZGVmaW5lZFxuIgorCSJvIFRoZSAnRGVwZW5kcyBvbjonIGxpbmUgdGVsbCB3aGF0IHN5bWJvbHMgbmVlZHMgdG8gYmUgZGVmaW5lZCBmb3JcbiIKKwkiICB0aGlzIHN5bWJvbCB0byBiZSB2aXNpYmxlIGluIHRoZSBtZW51IChzZWxlY3RhYmxlKVxuIgorCSJvIFRoZSAnTG9jYXRpb246JyBsaW5lcyB0ZWxsIHdoZXJlIGluIHRoZSBtZW51IHN0cnVjdHVyZSB0aGlzIHN5bWJvbFxuIgorCSIgIGlzIGxvY2F0ZWRcbiIKKwkiICAgIEEgbG9jYXRpb24gZm9sbG93ZWQgYnkgYSBbPXldIGluZGljYXRlIHRoYXQgdGhpcyBpcyBhIHNlbGVjdGFibGVcbiIKKwkiICAgIG1lbnUgaXRlbSAtIGFuZCBjdXJyZW50IHZhbHVlIGlzIGRpc3BsYXllZCBpbnNpZGUgYnJhY2tldHMuXG4iCisJIm8gVGhlICdTZWxlY3RzOicgbGluZSB0ZWxsIHdoYXQgc3ltYm9sIHdpbGwgYmUgYXV0b21hdGljYWxseVxuIgorCSIgIHNlbGVjdGVkIGlmIHRoaXMgc3ltYm9sIGlzIHNlbGVjdGVkICh5IG9yIG0pXG4iCisJIm8gVGhlICdTZWxlY3RlZCBieScgbGluZSB0ZWxsIHdoYXQgc3ltYm9sIGhhcyBzZWxlY3RlZCB0aGlzIHN5bWJvbFxuIgorCSJcbiIKKwkiT25seSByZWxldmFudCBsaW5lcyBhcmUgc2hvd24uXG4iCisJIlxuXG4iCisJIlNlYXJjaCBleGFtcGxlczpcbiIKKwkiRXhhbXBsZXM6IFVTQgk9PiBmaW5kIGFsbCBDT05GSUdfIHN5bWJvbHMgY29udGFpbmluZyBVU0JcbiIKKwkiICAgICAgICAgIF5VU0IgPT4gZmluZCBhbGwgQ09ORklHXyBzeW1ib2xzIHN0YXJ0aW5nIHdpdGggVVNCXG4iCisJIiAgICAgICAgICBVU0IkID0+IGZpbmQgYWxsIENPTkZJR18gc3ltYm9scyBlbmRpbmcgd2l0aCBVU0JcbiIKKwkiXG4iOworCitzdGF0aWMgc2lnbmVkIGNoYXIgYnVmWzQwOTZdLCAqYnVmcHRyID0gYnVmOworc3RhdGljIHNpZ25lZCBjaGFyIGlucHV0X2J1Zls0MDk2XTsKK3N0YXRpYyBjaGFyIGZpbGVuYW1lW1BBVEhfTUFYKzFdID0gIi5jb25maWciOworc3RhdGljIGNoYXIgKmFyZ3NbMTAyNF0sICoqYXJncHRyID0gYXJnczsKK3N0YXRpYyBpbnQgaW5kZW50Oworc3RhdGljIHN0cnVjdCB0ZXJtaW9zIGlvc19vcmc7CitzdGF0aWMgaW50IHJvd3MgPSAwLCBjb2xzID0gMDsKK3N0YXRpYyBzdHJ1Y3QgbWVudSAqY3VycmVudF9tZW51Oworc3RhdGljIGludCBjaGlsZF9jb3VudDsKK3N0YXRpYyBpbnQgZG9fcmVzaXplOworc3RhdGljIGludCBzaW5nbGVfbWVudV9tb2RlOworCitzdGF0aWMgdm9pZCBjb25mKHN0cnVjdCBtZW51ICptZW51KTsKK3N0YXRpYyB2b2lkIGNvbmZfY2hvaWNlKHN0cnVjdCBtZW51ICptZW51KTsKK3N0YXRpYyB2b2lkIGNvbmZfc3RyaW5nKHN0cnVjdCBtZW51ICptZW51KTsKK3N0YXRpYyB2b2lkIGNvbmZfbG9hZCh2b2lkKTsKK3N0YXRpYyB2b2lkIGNvbmZfc2F2ZSh2b2lkKTsKK3N0YXRpYyB2b2lkIHNob3dfdGV4dGJveChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqdGV4dCwgaW50IHIsIGludCBjKTsKK3N0YXRpYyB2b2lkIHNob3dfaGVscHRleHQoY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKnRleHQpOworc3RhdGljIHZvaWQgc2hvd19oZWxwKHN0cnVjdCBtZW51ICptZW51KTsKK3N0YXRpYyB2b2lkIHNob3dfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqdGl0bGUsIGludCByLCBpbnQgYyk7CisKK3N0YXRpYyB2b2lkIGNwcmludF9pbml0KHZvaWQpOworc3RhdGljIGludCBjcHJpbnQxKGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKK3N0YXRpYyB2b2lkIGNwcmludF9kb25lKHZvaWQpOworc3RhdGljIGludCBjcHJpbnQoY29uc3QgY2hhciAqZm10LCAuLi4pOworCitzdGF0aWMgdm9pZCBpbml0X3dzaXplKHZvaWQpCit7CisJc3RydWN0IHdpbnNpemUgd3M7CisJY2hhciAqZW52OworCisJaWYgKCFpb2N0bChTVERJTl9GSUxFTk8sIFRJT0NHV0lOU1osICZ3cykpIHsKKwkJcm93cyA9IHdzLndzX3JvdzsKKwkJY29scyA9IHdzLndzX2NvbDsKKwl9CisKKwlpZiAoIXJvd3MpIHsKKwkJZW52ID0gZ2V0ZW52KCJMSU5FUyIpOworCQlpZiAoZW52KQorCQkJcm93cyA9IGF0b2koZW52KTsKKwkJaWYgKCFyb3dzKQorCQkJcm93cyA9IDI0OworCX0KKwlpZiAoIWNvbHMpIHsKKwkJZW52ID0gZ2V0ZW52KCJDT0xVTU5TIik7CisJCWlmIChlbnYpCisJCQljb2xzID0gYXRvaShlbnYpOworCQlpZiAoIWNvbHMpCisJCQljb2xzID0gODA7CisJfQorCisJaWYgKHJvd3MgPCAxOSB8fCBjb2xzIDwgODApIHsKKwkJZnByaW50ZihzdGRlcnIsICJZb3VyIGRpc3BsYXkgaXMgdG9vIHNtYWxsIHRvIHJ1biBNZW51Y29uZmlnIVxuIik7CisJCWZwcmludGYoc3RkZXJyLCAiSXQgbXVzdCBiZSBhdCBsZWFzdCAxOSBsaW5lcyBieSA4MCBjb2x1bW5zLlxuIik7CisJCWV4aXQoMSk7CisJfQorCisJcm93cyAtPSA0OworCWNvbHMgLT0gNTsKK30KKworc3RhdGljIHZvaWQgY3ByaW50X2luaXQodm9pZCkKK3sKKwlidWZwdHIgPSBidWY7CisJYXJncHRyID0gYXJnczsKKwltZW1zZXQoYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKKwlpbmRlbnQgPSAwOworCWNoaWxkX2NvdW50ID0gMDsKKwljcHJpbnQoIi4vc2NyaXB0cy9seGRpYWxvZy9seGRpYWxvZyIpOworCWNwcmludCgiLS1iYWNrdGl0bGUiKTsKKwljcHJpbnQobWVudV9iYWNrdGl0bGUpOworfQorCitzdGF0aWMgaW50IGNwcmludDEoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwlpbnQgcmVzOworCisJaWYgKCEqYXJncHRyKQorCQkqYXJncHRyID0gYnVmcHRyOworCXZhX3N0YXJ0KGFwLCBmbXQpOworCXJlcyA9IHZzcHJpbnRmKGJ1ZnB0ciwgZm10LCBhcCk7CisJdmFfZW5kKGFwKTsKKwlidWZwdHIgKz0gcmVzOworCisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgY3ByaW50X2RvbmUodm9pZCkKK3sKKwkqYnVmcHRyKysgPSAwOworCWFyZ3B0cisrOworfQorCitzdGF0aWMgaW50IGNwcmludChjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCWludCByZXM7CisKKwkqYXJncHRyKysgPSBidWZwdHI7CisJdmFfc3RhcnQoYXAsIGZtdCk7CisJcmVzID0gdnNwcmludGYoYnVmcHRyLCBmbXQsIGFwKTsKKwl2YV9lbmQoYXApOworCWJ1ZnB0ciArPSByZXM7CisJKmJ1ZnB0cisrID0gMDsKKworCXJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIGdldF9wcm9tcHRfc3RyKHN0cnVjdCBnc3RyICpyLCBzdHJ1Y3QgcHJvcGVydHkgKnByb3ApCit7CisJaW50IGksIGo7CisJc3RydWN0IG1lbnUgKnN1Ym1lbnVbOF0sICptZW51OworCisJc3RyX3ByaW50ZihyLCAiUHJvbXB0OiAlc1xuIiwgcHJvcC0+dGV4dCk7CisJc3RyX3ByaW50ZihyLCAiICBEZWZpbmVkIGF0ICVzOiVkXG4iLCBwcm9wLT5tZW51LT5maWxlLT5uYW1lLAorCQlwcm9wLT5tZW51LT5saW5lbm8pOworCWlmICghZXhwcl9pc195ZXMocHJvcC0+dmlzaWJsZS5leHByKSkgeworCQlzdHJfYXBwZW5kKHIsICIgIERlcGVuZHMgb246ICIpOworCQlleHByX2dzdHJfcHJpbnQocHJvcC0+dmlzaWJsZS5leHByLCByKTsKKwkJc3RyX2FwcGVuZChyLCAiXG4iKTsKKwl9CisJbWVudSA9IHByb3AtPm1lbnUtPnBhcmVudDsKKwlmb3IgKGkgPSAwOyBtZW51ICE9ICZyb290bWVudSAmJiBpIDwgODsgbWVudSA9IG1lbnUtPnBhcmVudCkKKwkJc3VibWVudVtpKytdID0gbWVudTsKKwlpZiAoaSA+IDApIHsKKwkJc3RyX3ByaW50ZihyLCAiICBMb2NhdGlvbjpcbiIpOworCQlmb3IgKGogPSA0OyAtLWkgPj0gMDsgaiArPSAyKSB7CisJCQltZW51ID0gc3VibWVudVtpXTsKKwkJCXN0cl9wcmludGYociwgIiUqYy0+ICVzIiwgaiwgJyAnLCBtZW51X2dldF9wcm9tcHQobWVudSkpOworCQkJaWYgKG1lbnUtPnN5bSkgeworCQkJCXN0cl9wcmludGYociwgIiAoJXMgWz0lc10pIiwgbWVudS0+c3ltLT5uYW1lID8KKwkJCQkJbWVudS0+c3ltLT5uYW1lIDogIjxjaG9pY2U+IiwKKwkJCQkJc3ltX2dldF9zdHJpbmdfdmFsdWUobWVudS0+c3ltKSk7CisJCQl9CisJCQlzdHJfYXBwZW5kKHIsICJcbiIpOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBnZXRfc3ltYm9sX3N0cihzdHJ1Y3QgZ3N0ciAqciwgc3RydWN0IHN5bWJvbCAqc3ltKQoreworCWJvb2wgaGl0OworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKworCXN0cl9wcmludGYociwgIlN5bWJvbDogJXMgWz0lc11cbiIsIHN5bS0+bmFtZSwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltX2dldF9zdHJpbmdfdmFsdWUoc3ltKSk7CisJZm9yX2FsbF9wcm9tcHRzKHN5bSwgcHJvcCkKKwkJZ2V0X3Byb21wdF9zdHIociwgcHJvcCk7CisJaGl0ID0gZmFsc2U7CisJZm9yX2FsbF9wcm9wZXJ0aWVzKHN5bSwgcHJvcCwgUF9TRUxFQ1QpIHsKKwkJaWYgKCFoaXQpIHsKKwkJCXN0cl9hcHBlbmQociwgIiAgU2VsZWN0czogIik7CisJCQloaXQgPSB0cnVlOworCQl9IGVsc2UKKwkJCXN0cl9wcmludGYociwgIiAmJiAiKTsKKwkJZXhwcl9nc3RyX3ByaW50KHByb3AtPmV4cHIsIHIpOworCX0KKwlpZiAoaGl0KQorCQlzdHJfYXBwZW5kKHIsICJcbiIpOworCWlmIChzeW0tPnJldl9kZXAuZXhwcikgeworCQlzdHJfYXBwZW5kKHIsICIgIFNlbGVjdGVkIGJ5OiAiKTsKKwkJZXhwcl9nc3RyX3ByaW50KHN5bS0+cmV2X2RlcC5leHByLCByKTsKKwkJc3RyX2FwcGVuZChyLCAiXG4iKTsKKwl9CisJc3RyX2FwcGVuZChyLCAiXG5cbiIpOworfQorCitzdGF0aWMgc3RydWN0IGdzdHIgZ2V0X3JlbGF0aW9uc19zdHIoc3RydWN0IHN5bWJvbCAqKnN5bV9hcnIpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXN0cnVjdCBnc3RyIHJlcyA9IHN0cl9uZXcoKTsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IHN5bV9hcnIgJiYgKHN5bSA9IHN5bV9hcnJbaV0pOyBpKyspCisJCWdldF9zeW1ib2xfc3RyKCZyZXMsIHN5bSk7CisJaWYgKCFpKQorCQlzdHJfYXBwZW5kKCZyZXMsICJObyBtYXRjaGVzIGZvdW5kLlxuIik7CisJcmV0dXJuIHJlczsKK30KKworcGlkX3QgcGlkOworCitzdGF0aWMgdm9pZCB3aW5jaF9oYW5kbGVyKGludCBzaWcpCit7CisJaWYgKCFkb19yZXNpemUpIHsKKwkJa2lsbChwaWQsIFNJR0lOVCk7CisJCWRvX3Jlc2l6ZSA9IDE7CisJfQorfQorCitzdGF0aWMgaW50IGV4ZWNfY29uZih2b2lkKQoreworCWludCBwaXBlZmRbMl0sIHN0YXQsIHNpemU7CisJc3RydWN0IHNpZ2FjdGlvbiBzYTsKKwlzaWdzZXRfdCBzc2V0LCBvc3NldDsKKworCXNpZ2VtcHR5c2V0KCZzc2V0KTsKKwlzaWdhZGRzZXQoJnNzZXQsIFNJR0lOVCk7CisJc2lncHJvY21hc2soU0lHX0JMT0NLLCAmc3NldCwgJm9zc2V0KTsKKworCXNpZ25hbChTSUdJTlQsIFNJR19ERkwpOworCisJc2Euc2FfaGFuZGxlciA9IHdpbmNoX2hhbmRsZXI7CisJc2lnZW1wdHlzZXQoJnNhLnNhX21hc2spOworCXNhLnNhX2ZsYWdzID0gU0FfUkVTVEFSVDsKKwlzaWdhY3Rpb24oU0lHV0lOQ0gsICZzYSwgTlVMTCk7CisKKwkqYXJncHRyKysgPSBOVUxMOworCisJcGlwZShwaXBlZmQpOworCXBpZCA9IGZvcmsoKTsKKwlpZiAocGlkID09IDApIHsKKwkJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvc3NldCwgTlVMTCk7CisJCWR1cDIocGlwZWZkWzFdLCAyKTsKKwkJY2xvc2UocGlwZWZkWzBdKTsKKwkJY2xvc2UocGlwZWZkWzFdKTsKKwkJZXhlY3YoYXJnc1swXSwgYXJncyk7CisJCV9leGl0KEVYSVRfRkFJTFVSRSk7CisJfQorCisJY2xvc2UocGlwZWZkWzFdKTsKKwlidWZwdHIgPSBpbnB1dF9idWY7CisJd2hpbGUgKDEpIHsKKwkJc2l6ZSA9IGlucHV0X2J1ZiArIHNpemVvZihpbnB1dF9idWYpIC0gYnVmcHRyOworCQlzaXplID0gcmVhZChwaXBlZmRbMF0sIGJ1ZnB0ciwgc2l6ZSk7CisJCWlmIChzaXplIDw9IDApIHsKKwkJCWlmIChzaXplIDwgMCkgeworCQkJCWlmIChlcnJubyA9PSBFSU5UUiB8fCBlcnJubyA9PSBFQUdBSU4pCisJCQkJCWNvbnRpbnVlOworCQkJCXBlcnJvcigicmVhZCIpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJYnVmcHRyICs9IHNpemU7CisJfQorCSpidWZwdHIrKyA9IDA7CisJY2xvc2UocGlwZWZkWzBdKTsKKwl3YWl0cGlkKHBpZCwgJnN0YXQsIDApOworCisJaWYgKGRvX3Jlc2l6ZSkgeworCQlpbml0X3dzaXplKCk7CisJCWRvX3Jlc2l6ZSA9IDA7CisJCXNpZ3Byb2NtYXNrKFNJR19TRVRNQVNLLCAmb3NzZXQsIE5VTEwpOworCQlyZXR1cm4gLTE7CisJfQorCWlmIChXSUZTSUdOQUxFRChzdGF0KSkgeworCQlwcmludGYoIlxmaW50ZXJydXB0ZWQoJWQpXG4iLCBXVEVSTVNJRyhzdGF0KSk7CisJCWV4aXQoMSk7CisJfQorI2lmIDAKKwlwcmludGYoIlxmZXhpdCBzdGF0ZTogJWRcbmV4aXQgZGF0YTogJyVzJ1xuIiwgV0VYSVRTVEFUVVMoc3RhdCksIGlucHV0X2J1Zik7CisJc2xlZXAoMSk7CisjZW5kaWYKKwlzaWdwZW5kaW5nKCZzc2V0KTsKKwlpZiAoc2lnaXNtZW1iZXIoJnNzZXQsIFNJR0lOVCkpIHsKKwkJcHJpbnRmKCJcZmludGVycnVwdGVkXG4iKTsKKwkJZXhpdCgxKTsKKwl9CisJc2lncHJvY21hc2soU0lHX1NFVE1BU0ssICZvc3NldCwgTlVMTCk7CisKKwlyZXR1cm4gV0VYSVRTVEFUVVMoc3RhdCk7Cit9CisKK3N0YXRpYyB2b2lkIHNlYXJjaF9jb25mKHZvaWQpCit7CisJc3RydWN0IHN5bWJvbCAqKnN5bV9hcnI7CisJaW50IHN0YXQ7CisJc3RydWN0IGdzdHIgcmVzOworCithZ2FpbjoKKwljcHJpbnRfaW5pdCgpOworCWNwcmludCgiLS10aXRsZSIpOworCWNwcmludCgiU2VhcmNoIENvbmZpZ3VyYXRpb24gUGFyYW1ldGVyIik7CisJY3ByaW50KCItLWlucHV0Ym94Iik7CisJY3ByaW50KCJFbnRlciBLZXl3b3JkIik7CisJY3ByaW50KCIxMCIpOworCWNwcmludCgiNzUiKTsKKwljcHJpbnQoIiIpOworCXN0YXQgPSBleGVjX2NvbmYoKTsKKwlpZiAoc3RhdCA8IDApCisJCWdvdG8gYWdhaW47CisJc3dpdGNoIChzdGF0KSB7CisJY2FzZSAwOgorCQlicmVhazsKKwljYXNlIDE6CisJCXNob3dfaGVscHRleHQoIlNlYXJjaCBDb25maWd1cmF0aW9uIiwgc2VhcmNoX2hlbHApOworCQlnb3RvIGFnYWluOworCWRlZmF1bHQ6CisJCXJldHVybjsKKwl9CisKKwlzeW1fYXJyID0gc3ltX3JlX3NlYXJjaChpbnB1dF9idWYpOworCXJlcyA9IGdldF9yZWxhdGlvbnNfc3RyKHN5bV9hcnIpOworCWZyZWUoc3ltX2Fycik7CisJc2hvd190ZXh0Ym94KCJTZWFyY2ggUmVzdWx0cyIsIHN0cl9nZXQoJnJlcyksIDAsIDApOworCXN0cl9mcmVlKCZyZXMpOworfQorCitzdGF0aWMgdm9pZCBidWlsZF9jb25mKHN0cnVjdCBtZW51ICptZW51KQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IG1lbnUgKmNoaWxkOworCWludCB0eXBlLCB0bXAsIGRvaW50ID0gMjsKKwl0cmlzdGF0ZSB2YWw7CisJY2hhciBjaDsKKworCWlmICghbWVudV9pc192aXNpYmxlKG1lbnUpKQorCQlyZXR1cm47CisKKwlzeW0gPSBtZW51LT5zeW07CisJcHJvcCA9IG1lbnUtPnByb21wdDsKKwlpZiAoIXN5bSkgeworCQlpZiAocHJvcCAmJiBtZW51ICE9IGN1cnJlbnRfbWVudSkgeworCQkJY29uc3QgY2hhciAqcHJvbXB0ID0gbWVudV9nZXRfcHJvbXB0KG1lbnUpOworCQkJc3dpdGNoIChwcm9wLT50eXBlKSB7CisJCQljYXNlIFBfTUVOVToKKwkJCQljaGlsZF9jb3VudCsrOworCQkJCWNwcmludCgibSVwIiwgbWVudSk7CisKKwkJCQlpZiAoc2luZ2xlX21lbnVfbW9kZSkgeworCQkJCQljcHJpbnQxKCIlcyUqYyVzIiwKKwkJCQkJCW1lbnUtPmRhdGEgPyAiLS0+IiA6ICIrKz4iLAorCQkJCQkJaW5kZW50ICsgMSwgJyAnLCBwcm9tcHQpOworCQkJCX0gZWxzZQorCQkJCQljcHJpbnQxKCIgICAlKmMlcyAgLS0tPiIsIGluZGVudCArIDEsICcgJywgcHJvbXB0KTsKKworCQkJCWNwcmludF9kb25lKCk7CisJCQkJaWYgKHNpbmdsZV9tZW51X21vZGUgJiYgbWVudS0+ZGF0YSkKKwkJCQkJZ290byBjb25mX2NoaWxkczsKKwkJCQlyZXR1cm47CisJCQlkZWZhdWx0OgorCQkJCWlmIChwcm9tcHQpIHsKKwkJCQkJY2hpbGRfY291bnQrKzsKKwkJCQkJY3ByaW50KCI6JXAiLCBtZW51KTsKKwkJCQkJY3ByaW50KCItLS0lKmMlcyIsIGluZGVudCArIDEsICcgJywgcHJvbXB0KTsKKwkJCQl9CisJCQl9CisJCX0gZWxzZQorCQkJZG9pbnQgPSAwOworCQlnb3RvIGNvbmZfY2hpbGRzOworCX0KKworCXR5cGUgPSBzeW1fZ2V0X3R5cGUoc3ltKTsKKwlpZiAoc3ltX2lzX2Nob2ljZShzeW0pKSB7CisJCXN0cnVjdCBzeW1ib2wgKmRlZl9zeW0gPSBzeW1fZ2V0X2Nob2ljZV92YWx1ZShzeW0pOworCQlzdHJ1Y3QgbWVudSAqZGVmX21lbnUgPSBOVUxMOworCisJCWNoaWxkX2NvdW50Kys7CisJCWZvciAoY2hpbGQgPSBtZW51LT5saXN0OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworCQkJaWYgKG1lbnVfaXNfdmlzaWJsZShjaGlsZCkgJiYgY2hpbGQtPnN5bSA9PSBkZWZfc3ltKQorCQkJCWRlZl9tZW51ID0gY2hpbGQ7CisJCX0KKworCQl2YWwgPSBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSk7CisJCWlmIChzeW1faXNfY2hhbmdhYmxlKHN5bSkpIHsKKwkJCWNwcmludCgidCVwIiwgbWVudSk7CisJCQlzd2l0Y2ggKHR5cGUpIHsKKwkJCWNhc2UgU19CT09MRUFOOgorCQkJCWNwcmludDEoIlslY10iLCB2YWwgPT0gbm8gPyAnICcgOiAnKicpOworCQkJCWJyZWFrOworCQkJY2FzZSBTX1RSSVNUQVRFOgorCQkJCXN3aXRjaCAodmFsKSB7CisJCQkJY2FzZSB5ZXM6IGNoID0gJyonOyBicmVhazsKKwkJCQljYXNlIG1vZDogY2ggPSAnTSc7IGJyZWFrOworCQkJCWRlZmF1bHQ6ICBjaCA9ICcgJzsgYnJlYWs7CisJCQkJfQorCQkJCWNwcmludDEoIjwlYz4iLCBjaCk7CisJCQkJYnJlYWs7CisJCQl9CisJCX0gZWxzZSB7CisJCQljcHJpbnQoIiVjJXAiLCBkZWZfbWVudSA/ICd0JyA6ICc6JywgbWVudSk7CisJCQljcHJpbnQxKCIgICAiKTsKKwkJfQorCisJCWNwcmludDEoIiUqYyVzIiwgaW5kZW50ICsgMSwgJyAnLCBtZW51X2dldF9wcm9tcHQobWVudSkpOworCQlpZiAodmFsID09IHllcykgeworCQkJaWYgKGRlZl9tZW51KSB7CisJCQkJY3ByaW50MSgiICglcykiLCBtZW51X2dldF9wcm9tcHQoZGVmX21lbnUpKTsKKwkJCQljcHJpbnQxKCIgIC0tLT4iKTsKKwkJCQljcHJpbnRfZG9uZSgpOworCQkJCWlmIChkZWZfbWVudS0+bGlzdCkgeworCQkJCQlpbmRlbnQgKz0gMjsKKwkJCQkJYnVpbGRfY29uZihkZWZfbWVudSk7CisJCQkJCWluZGVudCAtPSAyOworCQkJCX0KKwkJCX0gZWxzZQorCQkJCWNwcmludF9kb25lKCk7CisJCQlyZXR1cm47CisJCX0KKwkJY3ByaW50X2RvbmUoKTsKKwl9IGVsc2UgeworCQlpZiAobWVudSA9PSBjdXJyZW50X21lbnUpIHsKKwkJCWNwcmludCgiOiVwIiwgbWVudSk7CisJCQljcHJpbnQoIi0tLSUqYyVzIiwgaW5kZW50ICsgMSwgJyAnLCBtZW51X2dldF9wcm9tcHQobWVudSkpOworCQkJZ290byBjb25mX2NoaWxkczsKKwkJfQorCQljaGlsZF9jb3VudCsrOworCQl2YWwgPSBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSk7CisJCWlmIChzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkgJiYgdmFsID09IHllcykgeworCQkJY3ByaW50KCI6JXAiLCBtZW51KTsKKwkJCWNwcmludDEoIiAgICIpOworCQl9IGVsc2UgeworCQkJc3dpdGNoICh0eXBlKSB7CisJCQljYXNlIFNfQk9PTEVBTjoKKwkJCQljcHJpbnQoInQlcCIsIG1lbnUpOworCQkJCWlmIChzeW1faXNfY2hhbmdhYmxlKHN5bSkpCisJCQkJCWNwcmludDEoIlslY10iLCB2YWwgPT0gbm8gPyAnICcgOiAnKicpOworCQkJCWVsc2UKKwkJCQkJY3ByaW50MSgiLS0tIik7CisJCQkJYnJlYWs7CisJCQljYXNlIFNfVFJJU1RBVEU6CisJCQkJY3ByaW50KCJ0JXAiLCBtZW51KTsKKwkJCQlzd2l0Y2ggKHZhbCkgeworCQkJCWNhc2UgeWVzOiBjaCA9ICcqJzsgYnJlYWs7CisJCQkJY2FzZSBtb2Q6IGNoID0gJ00nOyBicmVhazsKKwkJCQlkZWZhdWx0OiAgY2ggPSAnICc7IGJyZWFrOworCQkJCX0KKwkJCQlpZiAoc3ltX2lzX2NoYW5nYWJsZShzeW0pKQorCQkJCQljcHJpbnQxKCI8JWM+IiwgY2gpOworCQkJCWVsc2UKKwkJCQkJY3ByaW50MSgiLS0tIik7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWNwcmludCgicyVwIiwgbWVudSk7CisJCQkJdG1wID0gY3ByaW50MSgiKCVzKSIsIHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSkpOworCQkJCXRtcCA9IGluZGVudCAtIHRtcCArIDQ7CisJCQkJaWYgKHRtcCA8IDApCisJCQkJCXRtcCA9IDA7CisJCQkJY3ByaW50MSgiJSpjJXMlcyIsIHRtcCwgJyAnLCBtZW51X2dldF9wcm9tcHQobWVudSksCisJCQkJCShzeW1faGFzX3ZhbHVlKHN5bSkgfHwgIXN5bV9pc19jaGFuZ2FibGUoc3ltKSkgPworCQkJCQkiIiA6ICIgKE5FVykiKTsKKwkJCQljcHJpbnRfZG9uZSgpOworCQkJCWdvdG8gY29uZl9jaGlsZHM7CisJCQl9CisJCX0KKwkJY3ByaW50MSgiJSpjJXMlcyIsIGluZGVudCArIDEsICcgJywgbWVudV9nZXRfcHJvbXB0KG1lbnUpLAorCQkJKHN5bV9oYXNfdmFsdWUoc3ltKSB8fCAhc3ltX2lzX2NoYW5nYWJsZShzeW0pKSA/CisJCQkiIiA6ICIgKE5FVykiKTsKKwkJaWYgKG1lbnUtPnByb21wdC0+dHlwZSA9PSBQX01FTlUpIHsKKwkJCWNwcmludDEoIiAgLS0tPiIpOworCQkJY3ByaW50X2RvbmUoKTsKKwkJCXJldHVybjsKKwkJfQorCQljcHJpbnRfZG9uZSgpOworCX0KKworY29uZl9jaGlsZHM6CisJaW5kZW50ICs9IGRvaW50OworCWZvciAoY2hpbGQgPSBtZW51LT5saXN0OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkKKwkJYnVpbGRfY29uZihjaGlsZCk7CisJaW5kZW50IC09IGRvaW50OworfQorCitzdGF0aWMgdm9pZCBjb25mKHN0cnVjdCBtZW51ICptZW51KQoreworCXN0cnVjdCBtZW51ICpzdWJtZW51OworCWNvbnN0IGNoYXIgKnByb21wdCA9IG1lbnVfZ2V0X3Byb21wdChtZW51KTsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJY2hhciBhY3RpdmVfZW50cnlbNDBdOworCWludCBzdGF0LCB0eXBlLCBpOworCisJdW5saW5rKCJseGRpYWxvZy5zY3JsdG1wIik7CisJYWN0aXZlX2VudHJ5WzBdID0gMDsKKwl3aGlsZSAoMSkgeworCQljcHJpbnRfaW5pdCgpOworCQljcHJpbnQoIi0tdGl0bGUiKTsKKwkJY3ByaW50KCIlcyIsIHByb21wdCA/IHByb21wdCA6ICJNYWluIE1lbnUiKTsKKwkJY3ByaW50KCItLW1lbnUiKTsKKwkJY3ByaW50KG1lbnVfaW5zdHJ1Y3Rpb25zKTsKKwkJY3ByaW50KCIlZCIsIHJvd3MpOworCQljcHJpbnQoIiVkIiwgY29scyk7CisJCWNwcmludCgiJWQiLCByb3dzIC0gMTApOworCQljcHJpbnQoIiVzIiwgYWN0aXZlX2VudHJ5KTsKKwkJY3VycmVudF9tZW51ID0gbWVudTsKKwkJYnVpbGRfY29uZihtZW51KTsKKwkJaWYgKCFjaGlsZF9jb3VudCkKKwkJCWJyZWFrOworCQlpZiAobWVudSA9PSAmcm9vdG1lbnUpIHsKKwkJCWNwcmludCgiOiIpOworCQkJY3ByaW50KCItLS0gIik7CisJCQljcHJpbnQoIkwiKTsKKwkJCWNwcmludCgiICAgIExvYWQgYW4gQWx0ZXJuYXRlIENvbmZpZ3VyYXRpb24gRmlsZSIpOworCQkJY3ByaW50KCJTIik7CisJCQljcHJpbnQoIiAgICBTYXZlIENvbmZpZ3VyYXRpb24gdG8gYW4gQWx0ZXJuYXRlIEZpbGUiKTsKKwkJfQorCQlzdGF0ID0gZXhlY19jb25mKCk7CisJCWlmIChzdGF0IDwgMCkKKwkJCWNvbnRpbnVlOworCisJCWlmIChzdGF0ID09IDEgfHwgc3RhdCA9PSAyNTUpCisJCQlicmVhazsKKworCQl0eXBlID0gaW5wdXRfYnVmWzBdOworCQlpZiAoIXR5cGUpCisJCQljb250aW51ZTsKKworCQlmb3IgKGkgPSAwOyBpbnB1dF9idWZbaV0gJiYgIWlzc3BhY2UoaW5wdXRfYnVmW2ldKTsgaSsrKQorCQkJOworCQlpZiAoaSA+PSBzaXplb2YoYWN0aXZlX2VudHJ5KSkKKwkJCWkgPSBzaXplb2YoYWN0aXZlX2VudHJ5KSAtIDE7CisJCWlucHV0X2J1ZltpXSA9IDA7CisJCXN0cmNweShhY3RpdmVfZW50cnksIGlucHV0X2J1Zik7CisKKwkJc3ltID0gTlVMTDsKKwkJc3VibWVudSA9IE5VTEw7CisJCWlmIChzc2NhbmYoaW5wdXRfYnVmICsgMSwgIiVwIiwgJnN1Ym1lbnUpID09IDEpCisJCQlzeW0gPSBzdWJtZW51LT5zeW07CisKKwkJc3dpdGNoIChzdGF0KSB7CisJCWNhc2UgMDoKKwkJCXN3aXRjaCAodHlwZSkgeworCQkJY2FzZSAnbSc6CisJCQkJaWYgKHNpbmdsZV9tZW51X21vZGUpCisJCQkJCXN1Ym1lbnUtPmRhdGEgPSAodm9pZCAqKSAobG9uZykgIXN1Ym1lbnUtPmRhdGE7CisJCQkJZWxzZQorCQkJCQljb25mKHN1Ym1lbnUpOworCQkJCWJyZWFrOworCQkJY2FzZSAndCc6CisJCQkJaWYgKHN5bV9pc19jaG9pY2Uoc3ltKSAmJiBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSkgPT0geWVzKQorCQkJCQljb25mX2Nob2ljZShzdWJtZW51KTsKKwkJCQllbHNlIGlmIChzdWJtZW51LT5wcm9tcHQtPnR5cGUgPT0gUF9NRU5VKQorCQkJCQljb25mKHN1Ym1lbnUpOworCQkJCWJyZWFrOworCQkJY2FzZSAncyc6CisJCQkJY29uZl9zdHJpbmcoc3VibWVudSk7CisJCQkJYnJlYWs7CisJCQljYXNlICdMJzoKKwkJCQljb25mX2xvYWQoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ1MnOgorCQkJCWNvbmZfc2F2ZSgpOworCQkJCWJyZWFrOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJCWlmIChzeW0pCisJCQkJc2hvd19oZWxwKHN1Ym1lbnUpOworCQkJZWxzZQorCQkJCXNob3dfaGVscHRleHQoIlJFQURNRSIsIG1jb25mX3JlYWRtZSk7CisJCQlicmVhazsKKwkJY2FzZSAzOgorCQkJaWYgKHR5cGUgPT0gJ3QnKSB7CisJCQkJaWYgKHN5bV9zZXRfdHJpc3RhdGVfdmFsdWUoc3ltLCB5ZXMpKQorCQkJCQlicmVhazsKKwkJCQlpZiAoc3ltX3NldF90cmlzdGF0ZV92YWx1ZShzeW0sIG1vZCkpCisJCQkJCXNob3dfdGV4dGJveChOVUxMLCBzZXRtb2RfdGV4dCwgNiwgNzQpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgNDoKKwkJCWlmICh0eXBlID09ICd0JykKKwkJCQlzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSwgbm8pOworCQkJYnJlYWs7CisJCWNhc2UgNToKKwkJCWlmICh0eXBlID09ICd0JykKKwkJCQlzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSwgbW9kKTsKKwkJCWJyZWFrOworCQljYXNlIDY6CisJCQlpZiAodHlwZSA9PSAndCcpCisJCQkJc3ltX3RvZ2dsZV90cmlzdGF0ZV92YWx1ZShzeW0pOworCQkJZWxzZSBpZiAodHlwZSA9PSAnbScpCisJCQkJY29uZihzdWJtZW51KTsKKwkJCWJyZWFrOworCQljYXNlIDc6CisJCQlzZWFyY2hfY29uZigpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfdGV4dGJveChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqdGV4dCwgaW50IHIsIGludCBjKQoreworCWludCBmZDsKKworCWZkID0gY3JlYXQoIi5oZWxwLnRtcCIsIDA3NzcpOworCXdyaXRlKGZkLCB0ZXh0LCBzdHJsZW4odGV4dCkpOworCWNsb3NlKGZkKTsKKwlzaG93X2ZpbGUoIi5oZWxwLnRtcCIsIHRpdGxlLCByLCBjKTsKKwl1bmxpbmsoIi5oZWxwLnRtcCIpOworfQorCitzdGF0aWMgdm9pZCBzaG93X2hlbHB0ZXh0KGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICp0ZXh0KQoreworCXNob3dfdGV4dGJveCh0aXRsZSwgdGV4dCwgMCwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIHNob3dfaGVscChzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlzdHJ1Y3QgZ3N0ciBoZWxwID0gc3RyX25ldygpOworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IG1lbnUtPnN5bTsKKworCWlmIChzeW0tPmhlbHApCisJeworCQlpZiAoc3ltLT5uYW1lKSB7CisJCQlzdHJfcHJpbnRmKCZoZWxwLCAiQ09ORklHXyVzOlxuXG4iLCBzeW0tPm5hbWUpOworCQkJc3RyX2FwcGVuZCgmaGVscCwgc3ltLT5oZWxwKTsKKwkJCXN0cl9hcHBlbmQoJmhlbHAsICJcbiIpOworCQl9CisJfSBlbHNlIHsKKwkJc3RyX2FwcGVuZCgmaGVscCwgbm9oZWxwX3RleHQpOworCX0KKwlnZXRfc3ltYm9sX3N0cigmaGVscCwgc3ltKTsKKwlzaG93X2hlbHB0ZXh0KG1lbnVfZ2V0X3Byb21wdChtZW51KSwgc3RyX2dldCgmaGVscCkpOworCXN0cl9mcmVlKCZoZWxwKTsKK30KKworc3RhdGljIHZvaWQgc2hvd19maWxlKGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBjb25zdCBjaGFyICp0aXRsZSwgaW50IHIsIGludCBjKQoreworCWRvIHsKKwkJY3ByaW50X2luaXQoKTsKKwkJaWYgKHRpdGxlKSB7CisJCQljcHJpbnQoIi0tdGl0bGUiKTsKKwkJCWNwcmludCgiJXMiLCB0aXRsZSk7CisJCX0KKwkJY3ByaW50KCItLXRleHRib3giKTsKKwkJY3ByaW50KCIlcyIsIGZpbGVuYW1lKTsKKwkJY3ByaW50KCIlZCIsIHIgPyByIDogcm93cyk7CisJCWNwcmludCgiJWQiLCBjID8gYyA6IGNvbHMpOworCX0gd2hpbGUgKGV4ZWNfY29uZigpIDwgMCk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZfY2hvaWNlKHN0cnVjdCBtZW51ICptZW51KQoreworCWNvbnN0IGNoYXIgKnByb21wdCA9IG1lbnVfZ2V0X3Byb21wdChtZW51KTsKKwlzdHJ1Y3QgbWVudSAqY2hpbGQ7CisJc3RydWN0IHN5bWJvbCAqYWN0aXZlOworCWludCBzdGF0OworCisJYWN0aXZlID0gc3ltX2dldF9jaG9pY2VfdmFsdWUobWVudS0+c3ltKTsKKwl3aGlsZSAoMSkgeworCQljcHJpbnRfaW5pdCgpOworCQljcHJpbnQoIi0tdGl0bGUiKTsKKwkJY3ByaW50KCIlcyIsIHByb21wdCA/IHByb21wdCA6ICJNYWluIE1lbnUiKTsKKwkJY3ByaW50KCItLXJhZGlvbGlzdCIpOworCQljcHJpbnQocmFkaW9saXN0X2luc3RydWN0aW9ucyk7CisJCWNwcmludCgiMTUiKTsKKwkJY3ByaW50KCI3MCIpOworCQljcHJpbnQoIjYiKTsKKworCQljdXJyZW50X21lbnUgPSBtZW51OworCQlmb3IgKGNoaWxkID0gbWVudS0+bGlzdDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKwkJCWlmICghbWVudV9pc192aXNpYmxlKGNoaWxkKSkKKwkJCQljb250aW51ZTsKKwkJCWNwcmludCgiJXAiLCBjaGlsZCk7CisJCQljcHJpbnQoIiVzIiwgbWVudV9nZXRfcHJvbXB0KGNoaWxkKSk7CisJCQlpZiAoY2hpbGQtPnN5bSA9PSBzeW1fZ2V0X2Nob2ljZV92YWx1ZShtZW51LT5zeW0pKQorCQkJCWNwcmludCgiT04iKTsKKwkJCWVsc2UgaWYgKGNoaWxkLT5zeW0gPT0gYWN0aXZlKQorCQkJCWNwcmludCgiU0VMRUNURUQiKTsKKwkJCWVsc2UKKwkJCQljcHJpbnQoIk9GRiIpOworCQl9CisKKwkJc3RhdCA9IGV4ZWNfY29uZigpOworCQlzd2l0Y2ggKHN0YXQpIHsKKwkJY2FzZSAwOgorCQkJaWYgKHNzY2FuZihpbnB1dF9idWYsICIlcCIsICZjaGlsZCkgIT0gMSkKKwkJCQlicmVhazsKKwkJCXN5bV9zZXRfdHJpc3RhdGVfdmFsdWUoY2hpbGQtPnN5bSwgeWVzKTsKKwkJCXJldHVybjsKKwkJY2FzZSAxOgorCQkJaWYgKHNzY2FuZihpbnB1dF9idWYsICIlcCIsICZjaGlsZCkgPT0gMSkgeworCQkJCXNob3dfaGVscChjaGlsZCk7CisJCQkJYWN0aXZlID0gY2hpbGQtPnN5bTsKKwkJCX0gZWxzZQorCQkJCXNob3dfaGVscChtZW51KTsKKwkJCWJyZWFrOworCQljYXNlIDI1NToKKwkJCXJldHVybjsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgY29uZl9zdHJpbmcoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJY29uc3QgY2hhciAqcHJvbXB0ID0gbWVudV9nZXRfcHJvbXB0KG1lbnUpOworCWludCBzdGF0OworCisJd2hpbGUgKDEpIHsKKwkJY3ByaW50X2luaXQoKTsKKwkJY3ByaW50KCItLXRpdGxlIik7CisJCWNwcmludCgiJXMiLCBwcm9tcHQgPyBwcm9tcHQgOiAiTWFpbiBNZW51Iik7CisJCWNwcmludCgiLS1pbnB1dGJveCIpOworCQlzd2l0Y2ggKHN5bV9nZXRfdHlwZShtZW51LT5zeW0pKSB7CisJCWNhc2UgU19JTlQ6CisJCQljcHJpbnQoaW5wdXRib3hfaW5zdHJ1Y3Rpb25zX2ludCk7CisJCQlicmVhazsKKwkJY2FzZSBTX0hFWDoKKwkJCWNwcmludChpbnB1dGJveF9pbnN0cnVjdGlvbnNfaGV4KTsKKwkJCWJyZWFrOworCQljYXNlIFNfU1RSSU5HOgorCQkJY3ByaW50KGlucHV0Ym94X2luc3RydWN0aW9uc19zdHJpbmcpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQkvKiBwYW5pYz8gKi87CisJCX0KKwkJY3ByaW50KCIxMCIpOworCQljcHJpbnQoIjc1Iik7CisJCWNwcmludCgiJXMiLCBzeW1fZ2V0X3N0cmluZ192YWx1ZShtZW51LT5zeW0pKTsKKwkJc3RhdCA9IGV4ZWNfY29uZigpOworCQlzd2l0Y2ggKHN0YXQpIHsKKwkJY2FzZSAwOgorCQkJaWYgKHN5bV9zZXRfc3RyaW5nX3ZhbHVlKG1lbnUtPnN5bSwgaW5wdXRfYnVmKSkKKwkJCQlyZXR1cm47CisJCQlzaG93X3RleHRib3goTlVMTCwgIllvdSBoYXZlIG1hZGUgYW4gaW52YWxpZCBlbnRyeS4iLCA1LCA0Myk7CisJCQlicmVhazsKKwkJY2FzZSAxOgorCQkJc2hvd19oZWxwKG1lbnUpOworCQkJYnJlYWs7CisJCWNhc2UgMjU1OgorCQkJcmV0dXJuOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBjb25mX2xvYWQodm9pZCkKK3sKKwlpbnQgc3RhdDsKKworCXdoaWxlICgxKSB7CisJCWNwcmludF9pbml0KCk7CisJCWNwcmludCgiLS1pbnB1dGJveCIpOworCQljcHJpbnQobG9hZF9jb25maWdfdGV4dCk7CisJCWNwcmludCgiMTEiKTsKKwkJY3ByaW50KCI1NSIpOworCQljcHJpbnQoIiVzIiwgZmlsZW5hbWUpOworCQlzdGF0ID0gZXhlY19jb25mKCk7CisJCXN3aXRjaChzdGF0KSB7CisJCWNhc2UgMDoKKwkJCWlmICghaW5wdXRfYnVmWzBdKQorCQkJCXJldHVybjsKKwkJCWlmICghY29uZl9yZWFkKGlucHV0X2J1ZikpCisJCQkJcmV0dXJuOworCQkJc2hvd190ZXh0Ym94KE5VTEwsICJGaWxlIGRvZXMgbm90IGV4aXN0ISIsIDUsIDM4KTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlzaG93X2hlbHB0ZXh0KCJMb2FkIEFsdGVybmF0ZSBDb25maWd1cmF0aW9uIiwgbG9hZF9jb25maWdfaGVscCk7CisJCQlicmVhazsKKwkJY2FzZSAyNTU6CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZfc2F2ZSh2b2lkKQoreworCWludCBzdGF0OworCisJd2hpbGUgKDEpIHsKKwkJY3ByaW50X2luaXQoKTsKKwkJY3ByaW50KCItLWlucHV0Ym94Iik7CisJCWNwcmludChzYXZlX2NvbmZpZ190ZXh0KTsKKwkJY3ByaW50KCIxMSIpOworCQljcHJpbnQoIjU1Iik7CisJCWNwcmludCgiJXMiLCBmaWxlbmFtZSk7CisJCXN0YXQgPSBleGVjX2NvbmYoKTsKKwkJc3dpdGNoKHN0YXQpIHsKKwkJY2FzZSAwOgorCQkJaWYgKCFpbnB1dF9idWZbMF0pCisJCQkJcmV0dXJuOworCQkJaWYgKCFjb25mX3dyaXRlKGlucHV0X2J1ZikpCisJCQkJcmV0dXJuOworCQkJc2hvd190ZXh0Ym94KE5VTEwsICJDYW4ndCBjcmVhdGUgZmlsZSEgIFByb2JhYmx5IGEgbm9uZXhpc3RlbnQgZGlyZWN0b3J5LiIsIDUsIDYwKTsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlzaG93X2hlbHB0ZXh0KCJTYXZlIEFsdGVybmF0ZSBDb25maWd1cmF0aW9uIiwgc2F2ZV9jb25maWdfaGVscCk7CisJCQlicmVhazsKKwkJY2FzZSAyNTU6CisJCQlyZXR1cm47CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZfY2xlYW51cCh2b2lkKQoreworCXRjc2V0YXR0cigxLCBUQ1NBRkxVU0gsICZpb3Nfb3JnKTsKKwl1bmxpbmsoIi5oZWxwLnRtcCIpOworCXVubGluaygibHhkaWFsb2cuc2NybHRtcCIpOworfQorCitpbnQgbWFpbihpbnQgYWMsIGNoYXIgKiphdikKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJY2hhciAqbW9kZTsKKwlpbnQgc3RhdDsKKworCWNvbmZfcGFyc2UoYXZbMV0pOworCWNvbmZfcmVhZChOVUxMKTsKKworCXN5bSA9IHN5bV9sb29rdXAoIktFUk5FTFJFTEVBU0UiLCAwKTsKKwlzeW1fY2FsY192YWx1ZShzeW0pOworCXNwcmludGYobWVudV9iYWNrdGl0bGUsICJMaW51eCBLZXJuZWwgdiVzIENvbmZpZ3VyYXRpb24iLAorCQlzeW1fZ2V0X3N0cmluZ192YWx1ZShzeW0pKTsKKworCW1vZGUgPSBnZXRlbnYoIk1FTlVDT05GSUdfTU9ERSIpOworCWlmIChtb2RlKSB7CisJCWlmICghc3RyY2FzZWNtcChtb2RlLCAic2luZ2xlX21lbnUiKSkKKwkJCXNpbmdsZV9tZW51X21vZGUgPSAxOworCX0KKworCXRjZ2V0YXR0cigxLCAmaW9zX29yZyk7CisJYXRleGl0KGNvbmZfY2xlYW51cCk7CisJaW5pdF93c2l6ZSgpOworCWNvbmYoJnJvb3RtZW51KTsKKworCWRvIHsKKwkJY3ByaW50X2luaXQoKTsKKwkJY3ByaW50KCItLXllc25vIik7CisJCWNwcmludCgiRG8geW91IHdpc2ggdG8gc2F2ZSB5b3VyIG5ldyBrZXJuZWwgY29uZmlndXJhdGlvbj8iKTsKKwkJY3ByaW50KCI1Iik7CisJCWNwcmludCgiNjAiKTsKKwkJc3RhdCA9IGV4ZWNfY29uZigpOworCX0gd2hpbGUgKHN0YXQgPCAwKTsKKworCWlmIChzdGF0ID09IDApIHsKKwkJaWYgKGNvbmZfd3JpdGUoTlVMTCkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiXG5cbiIKKwkJCQkiRXJyb3IgZHVyaW5nIHdyaXRpbmcgb2YgdGhlIGtlcm5lbCBjb25maWd1cmF0aW9uLlxuIgorCQkJCSJZb3VyIGtlcm5lbCBjb25maWd1cmF0aW9uIGNoYW5nZXMgd2VyZSBOT1Qgc2F2ZWQuIgorCQkJCSJcblxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlwcmludGYoIlxuXG4iCisJCQkiKioqIEVuZCBvZiBMaW51eCBrZXJuZWwgY29uZmlndXJhdGlvbi5cbiIKKwkJCSIqKiogRXhlY3V0ZSAnbWFrZScgdG8gYnVpbGQgdGhlIGtlcm5lbCBvciB0cnkgJ21ha2UgaGVscCcuIgorCQkJIlxuXG4iKTsKKwl9IGVsc2UgeworCQlmcHJpbnRmKHN0ZGVyciwgIlxuXG4iCisJCQkiWW91ciBrZXJuZWwgY29uZmlndXJhdGlvbiBjaGFuZ2VzIHdlcmUgTk9UIHNhdmVkLiIKKwkJCSJcblxuIik7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvbWVudS5jIGIvc2NyaXB0cy9rY29uZmlnL21lbnUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzEzMTU2Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL21lbnUuYwpAQCAtMCwwICsxLDM5MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBMS0NfRElSRUNUX0xJTksKKyNpbmNsdWRlICJsa2MuaCIKKworc3RydWN0IG1lbnUgcm9vdG1lbnU7CitzdGF0aWMgc3RydWN0IG1lbnUgKipsYXN0X2VudHJ5X3B0cjsKKworc3RydWN0IGZpbGUgKmZpbGVfbGlzdDsKK3N0cnVjdCBmaWxlICpjdXJyZW50X2ZpbGU7CisKK3N0YXRpYyB2b2lkIG1lbnVfd2FybihzdHJ1Y3QgbWVudSAqbWVudSwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwl2YV9zdGFydChhcCwgZm10KTsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOndhcm5pbmc6ICIsIG1lbnUtPmZpbGUtPm5hbWUsIG1lbnUtPmxpbmVubyk7CisJdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJdmFfZW5kKGFwKTsKK30KKworc3RhdGljIHZvaWQgcHJvcF93YXJuKHN0cnVjdCBwcm9wZXJ0eSAqcHJvcCwgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwl2YV9zdGFydChhcCwgZm10KTsKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOndhcm5pbmc6ICIsIHByb3AtPmZpbGUtPm5hbWUsIHByb3AtPmxpbmVubyk7CisJdmZwcmludGYoc3RkZXJyLCBmbXQsIGFwKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7CisJdmFfZW5kKGFwKTsKK30KKwordm9pZCBtZW51X2luaXQodm9pZCkKK3sKKwljdXJyZW50X2VudHJ5ID0gY3VycmVudF9tZW51ID0gJnJvb3RtZW51OworCWxhc3RfZW50cnlfcHRyID0gJnJvb3RtZW51Lmxpc3Q7Cit9CisKK3ZvaWQgbWVudV9hZGRfZW50cnkoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBtZW51ICptZW51OworCisJbWVudSA9IG1hbGxvYyhzaXplb2YoKm1lbnUpKTsKKwltZW1zZXQobWVudSwgMCwgc2l6ZW9mKCptZW51KSk7CisJbWVudS0+c3ltID0gc3ltOworCW1lbnUtPnBhcmVudCA9IGN1cnJlbnRfbWVudTsKKwltZW51LT5maWxlID0gY3VycmVudF9maWxlOworCW1lbnUtPmxpbmVubyA9IHpjb25mX2xpbmVubygpOworCisJKmxhc3RfZW50cnlfcHRyID0gbWVudTsKKwlsYXN0X2VudHJ5X3B0ciA9ICZtZW51LT5uZXh0OworCWN1cnJlbnRfZW50cnkgPSBtZW51OworfQorCit2b2lkIG1lbnVfZW5kX2VudHJ5KHZvaWQpCit7Cit9CisKK3ZvaWQgbWVudV9hZGRfbWVudSh2b2lkKQoreworCWN1cnJlbnRfbWVudSA9IGN1cnJlbnRfZW50cnk7CisJbGFzdF9lbnRyeV9wdHIgPSAmY3VycmVudF9lbnRyeS0+bGlzdDsKK30KKwordm9pZCBtZW51X2VuZF9tZW51KHZvaWQpCit7CisJbGFzdF9lbnRyeV9wdHIgPSAmY3VycmVudF9tZW51LT5uZXh0OworCWN1cnJlbnRfbWVudSA9IGN1cnJlbnRfbWVudS0+cGFyZW50OworfQorCitzdHJ1Y3QgZXhwciAqbWVudV9jaGVja19kZXAoc3RydWN0IGV4cHIgKmUpCit7CisJaWYgKCFlKQorCQlyZXR1cm4gZTsKKworCXN3aXRjaCAoZS0+dHlwZSkgeworCWNhc2UgRV9OT1Q6CisJCWUtPmxlZnQuZXhwciA9IG1lbnVfY2hlY2tfZGVwKGUtPmxlZnQuZXhwcik7CisJCWJyZWFrOworCWNhc2UgRV9PUjoKKwljYXNlIEVfQU5EOgorCQllLT5sZWZ0LmV4cHIgPSBtZW51X2NoZWNrX2RlcChlLT5sZWZ0LmV4cHIpOworCQllLT5yaWdodC5leHByID0gbWVudV9jaGVja19kZXAoZS0+cmlnaHQuZXhwcik7CisJCWJyZWFrOworCWNhc2UgRV9TWU1CT0w6CisJCS8qIGNoYW5nZSAnbScgaW50byAnbScgJiYgTU9EVUxFUyAqLworCQlpZiAoZS0+bGVmdC5zeW0gPT0gJnN5bWJvbF9tb2QpCisJCQlyZXR1cm4gZXhwcl9hbGxvY19hbmQoZSwgZXhwcl9hbGxvY19zeW1ib2wobW9kdWxlc19zeW0pKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiBlOworfQorCit2b2lkIG1lbnVfYWRkX2RlcChzdHJ1Y3QgZXhwciAqZGVwKQoreworCWN1cnJlbnRfZW50cnktPmRlcCA9IGV4cHJfYWxsb2NfYW5kKGN1cnJlbnRfZW50cnktPmRlcCwgbWVudV9jaGVja19kZXAoZGVwKSk7Cit9CisKK3ZvaWQgbWVudV9zZXRfdHlwZShpbnQgdHlwZSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBjdXJyZW50X2VudHJ5LT5zeW07CisKKwlpZiAoc3ltLT50eXBlID09IHR5cGUpCisJCXJldHVybjsKKwlpZiAoc3ltLT50eXBlID09IFNfVU5LTk9XTikgeworCQlzeW0tPnR5cGUgPSB0eXBlOworCQlyZXR1cm47CisJfQorCW1lbnVfd2FybihjdXJyZW50X2VudHJ5LCAidHlwZSBvZiAnJXMnIHJlZGVmaW5lZCBmcm9tICclcycgdG8gJyVzJ1xuIiwKKwkgICAgc3ltLT5uYW1lID8gc3ltLT5uYW1lIDogIjxjaG9pY2U+IiwKKwkgICAgc3ltX3R5cGVfbmFtZShzeW0tPnR5cGUpLCBzeW1fdHlwZV9uYW1lKHR5cGUpKTsKK30KKworc3RydWN0IHByb3BlcnR5ICptZW51X2FkZF9wcm9wKGVudW0gcHJvcF90eXBlIHR5cGUsIGNoYXIgKnByb21wdCwgc3RydWN0IGV4cHIgKmV4cHIsIHN0cnVjdCBleHByICpkZXApCit7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wID0gcHJvcF9hbGxvYyh0eXBlLCBjdXJyZW50X2VudHJ5LT5zeW0pOworCisJcHJvcC0+bWVudSA9IGN1cnJlbnRfZW50cnk7CisJcHJvcC0+dGV4dCA9IHByb21wdDsKKwlwcm9wLT5leHByID0gZXhwcjsKKwlwcm9wLT52aXNpYmxlLmV4cHIgPSBtZW51X2NoZWNrX2RlcChkZXApOworCisJaWYgKHByb21wdCkgeworCQlpZiAoY3VycmVudF9lbnRyeS0+cHJvbXB0KQorCQkJbWVudV93YXJuKGN1cnJlbnRfZW50cnksICJwcm9tcHQgcmVkZWZpbmVkXG4iKTsKKwkJY3VycmVudF9lbnRyeS0+cHJvbXB0ID0gcHJvcDsKKwl9CisKKwlyZXR1cm4gcHJvcDsKK30KKwordm9pZCBtZW51X2FkZF9wcm9tcHQoZW51bSBwcm9wX3R5cGUgdHlwZSwgY2hhciAqcHJvbXB0LCBzdHJ1Y3QgZXhwciAqZGVwKQoreworCW1lbnVfYWRkX3Byb3AodHlwZSwgcHJvbXB0LCBOVUxMLCBkZXApOworfQorCit2b2lkIG1lbnVfYWRkX2V4cHIoZW51bSBwcm9wX3R5cGUgdHlwZSwgc3RydWN0IGV4cHIgKmV4cHIsIHN0cnVjdCBleHByICpkZXApCit7CisJbWVudV9hZGRfcHJvcCh0eXBlLCBOVUxMLCBleHByLCBkZXApOworfQorCit2b2lkIG1lbnVfYWRkX3N5bWJvbChlbnVtIHByb3BfdHlwZSB0eXBlLCBzdHJ1Y3Qgc3ltYm9sICpzeW0sIHN0cnVjdCBleHByICpkZXApCit7CisJbWVudV9hZGRfcHJvcCh0eXBlLCBOVUxMLCBleHByX2FsbG9jX3N5bWJvbChzeW0pLCBkZXApOworfQorCit2b2lkIHN5bV9jaGVja19wcm9wKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IHN5bWJvbCAqc3ltMjsKKwlmb3IgKHByb3AgPSBzeW0tPnByb3A7IHByb3A7IHByb3AgPSBwcm9wLT5uZXh0KSB7CisJCXN3aXRjaCAocHJvcC0+dHlwZSkgeworCQljYXNlIFBfREVGQVVMVDoKKwkJCWlmICgoc3ltLT50eXBlID09IFNfU1RSSU5HIHx8IHN5bS0+dHlwZSA9PSBTX0lOVCB8fCBzeW0tPnR5cGUgPT0gU19IRVgpICYmCisJCQkgICAgcHJvcC0+ZXhwci0+dHlwZSAhPSBFX1NZTUJPTCkKKwkJCQlwcm9wX3dhcm4ocHJvcCwKKwkJCQkgICAgImRlZmF1bHQgZm9yIGNvbmZpZyBzeW1ib2wgJyUnIgorCQkJCSAgICAiIG11c3QgYmUgYSBzaW5nbGUgc3ltYm9sIiwgc3ltLT5uYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIFBfU0VMRUNUOgorCQkJc3ltMiA9IHByb3BfZ2V0X3N5bWJvbChwcm9wKTsKKwkJCWlmIChzeW0tPnR5cGUgIT0gU19CT09MRUFOICYmIHN5bS0+dHlwZSAhPSBTX1RSSVNUQVRFKQorCQkJCXByb3Bfd2Fybihwcm9wLAorCQkJCSAgICAiY29uZmlnIHN5bWJvbCAnJXMnIHVzZXMgc2VsZWN0LCBidXQgaXMgIgorCQkJCSAgICAibm90IGJvb2xlYW4gb3IgdHJpc3RhdGUiLCBzeW0tPm5hbWUpOworCQkJZWxzZSBpZiAoc3ltMi0+dHlwZSA9PSBTX1VOS05PV04pCisJCQkJcHJvcF93YXJuKHByb3AsCisJCQkJICAgICInc2VsZWN0JyB1c2VkIGJ5IGNvbmZpZyBzeW1ib2wgJyVzJyAiCisJCQkJICAgICJyZWZlciB0byB1bmRlZmluZWQgc3ltYm9sICclcyciLAorCQkJCSAgICBzeW0tPm5hbWUsIHN5bTItPm5hbWUpOworCQkJZWxzZSBpZiAoc3ltMi0+dHlwZSAhPSBTX0JPT0xFQU4gJiYgc3ltMi0+dHlwZSAhPSBTX1RSSVNUQVRFKQorCQkJCXByb3Bfd2Fybihwcm9wLAorCQkJCSAgICAiJyVzJyBoYXMgd3JvbmcgdHlwZS4gJ3NlbGVjdCcgb25seSAiCisJCQkJICAgICJhY2NlcHQgYXJndW1lbnRzIG9mIGJvb2xlYW4gYW5kICIKKwkJCQkgICAgInRyaXN0YXRlIHR5cGUiLCBzeW0yLT5uYW1lKTsKKwkJCWJyZWFrOworCQljYXNlIFBfUkFOR0U6CisJCQlpZiAoc3ltLT50eXBlICE9IFNfSU5UICYmIHN5bS0+dHlwZSAhPSBTX0hFWCkKKwkJCQlwcm9wX3dhcm4ocHJvcCwgInJhbmdlIGlzIG9ubHkgYWxsb3dlZCAiCisJCQkJICAgICAgICAgICAgICAgICJmb3IgaW50IG9yIGhleCBzeW1ib2xzIik7CisJCQlpZiAoIXN5bV9zdHJpbmdfdmFsaWQoc3ltLCBwcm9wLT5leHByLT5sZWZ0LnN5bS0+bmFtZSkgfHwKKwkJCSAgICAhc3ltX3N0cmluZ192YWxpZChzeW0sIHByb3AtPmV4cHItPnJpZ2h0LnN5bS0+bmFtZSkpCisJCQkJcHJvcF93YXJuKHByb3AsICJyYW5nZSBpcyBpbnZhbGlkIik7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCTsKKwkJfQorCX0KK30KKwordm9pZCBtZW51X2ZpbmFsaXplKHN0cnVjdCBtZW51ICpwYXJlbnQpCit7CisJc3RydWN0IG1lbnUgKm1lbnUsICpsYXN0X21lbnU7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3QgZXhwciAqcGFyZW50ZGVwLCAqYmFzZWRlcCwgKmRlcCwgKmRlcDIsICoqZXA7CisKKwlzeW0gPSBwYXJlbnQtPnN5bTsKKwlpZiAocGFyZW50LT5saXN0KSB7CisJCWlmIChzeW0gJiYgc3ltX2lzX2Nob2ljZShzeW0pKSB7CisJCQkvKiBmaW5kIHRoZSBmaXJzdCBjaG9pY2UgdmFsdWUgYW5kIGZpbmQgb3V0IGNob2ljZSB0eXBlICovCisJCQlmb3IgKG1lbnUgPSBwYXJlbnQtPmxpc3Q7IG1lbnU7IG1lbnUgPSBtZW51LT5uZXh0KSB7CisJCQkJaWYgKG1lbnUtPnN5bSkgeworCQkJCQljdXJyZW50X2VudHJ5ID0gcGFyZW50OworCQkJCQltZW51X3NldF90eXBlKG1lbnUtPnN5bS0+dHlwZSk7CisJCQkJCWN1cnJlbnRfZW50cnkgPSBtZW51OworCQkJCQltZW51X3NldF90eXBlKHN5bS0+dHlwZSk7CisJCQkJCWJyZWFrOworCQkJCX0KKwkJCX0KKwkJCXBhcmVudGRlcCA9IGV4cHJfYWxsb2Nfc3ltYm9sKHN5bSk7CisJCX0gZWxzZSBpZiAocGFyZW50LT5wcm9tcHQpCisJCQlwYXJlbnRkZXAgPSBwYXJlbnQtPnByb21wdC0+dmlzaWJsZS5leHByOworCQllbHNlCisJCQlwYXJlbnRkZXAgPSBwYXJlbnQtPmRlcDsKKworCQlmb3IgKG1lbnUgPSBwYXJlbnQtPmxpc3Q7IG1lbnU7IG1lbnUgPSBtZW51LT5uZXh0KSB7CisJCQliYXNlZGVwID0gZXhwcl90cmFuc2Zvcm0obWVudS0+ZGVwKTsKKwkJCWJhc2VkZXAgPSBleHByX2FsbG9jX2FuZChleHByX2NvcHkocGFyZW50ZGVwKSwgYmFzZWRlcCk7CisJCQliYXNlZGVwID0gZXhwcl9lbGltaW5hdGVfZHVwcyhiYXNlZGVwKTsKKwkJCW1lbnUtPmRlcCA9IGJhc2VkZXA7CisJCQlpZiAobWVudS0+c3ltKQorCQkJCXByb3AgPSBtZW51LT5zeW0tPnByb3A7CisJCQllbHNlCisJCQkJcHJvcCA9IG1lbnUtPnByb21wdDsKKwkJCWZvciAoOyBwcm9wOyBwcm9wID0gcHJvcC0+bmV4dCkgeworCQkJCWlmIChwcm9wLT5tZW51ICE9IG1lbnUpCisJCQkJCWNvbnRpbnVlOworCQkJCWRlcCA9IGV4cHJfdHJhbnNmb3JtKHByb3AtPnZpc2libGUuZXhwcik7CisJCQkJZGVwID0gZXhwcl9hbGxvY19hbmQoZXhwcl9jb3B5KGJhc2VkZXApLCBkZXApOworCQkJCWRlcCA9IGV4cHJfZWxpbWluYXRlX2R1cHMoZGVwKTsKKwkJCQlpZiAobWVudS0+c3ltICYmIG1lbnUtPnN5bS0+dHlwZSAhPSBTX1RSSVNUQVRFKQorCQkJCQlkZXAgPSBleHByX3RyYW5zX2Jvb2woZGVwKTsKKwkJCQlwcm9wLT52aXNpYmxlLmV4cHIgPSBkZXA7CisJCQkJaWYgKHByb3AtPnR5cGUgPT0gUF9TRUxFQ1QpIHsKKwkJCQkJc3RydWN0IHN5bWJvbCAqZXMgPSBwcm9wX2dldF9zeW1ib2wocHJvcCk7CisJCQkJCWVzLT5yZXZfZGVwLmV4cHIgPSBleHByX2FsbG9jX29yKGVzLT5yZXZfZGVwLmV4cHIsCisJCQkJCQkJZXhwcl9hbGxvY19hbmQoZXhwcl9hbGxvY19zeW1ib2wobWVudS0+c3ltKSwgZXhwcl9jb3B5KGRlcCkpKTsKKwkJCQl9CisJCQl9CisJCX0KKwkJZm9yIChtZW51ID0gcGFyZW50LT5saXN0OyBtZW51OyBtZW51ID0gbWVudS0+bmV4dCkKKwkJCW1lbnVfZmluYWxpemUobWVudSk7CisJfSBlbHNlIGlmIChzeW0pIHsKKwkJYmFzZWRlcCA9IHBhcmVudC0+cHJvbXB0ID8gcGFyZW50LT5wcm9tcHQtPnZpc2libGUuZXhwciA6IE5VTEw7CisJCWJhc2VkZXAgPSBleHByX3RyYW5zX2NvbXBhcmUoYmFzZWRlcCwgRV9VTkVRVUFMLCAmc3ltYm9sX25vKTsKKwkJYmFzZWRlcCA9IGV4cHJfZWxpbWluYXRlX2R1cHMoZXhwcl90cmFuc2Zvcm0oYmFzZWRlcCkpOworCQlsYXN0X21lbnUgPSBOVUxMOworCQlmb3IgKG1lbnUgPSBwYXJlbnQtPm5leHQ7IG1lbnU7IG1lbnUgPSBtZW51LT5uZXh0KSB7CisJCQlkZXAgPSBtZW51LT5wcm9tcHQgPyBtZW51LT5wcm9tcHQtPnZpc2libGUuZXhwciA6IG1lbnUtPmRlcDsKKwkJCWlmICghZXhwcl9jb250YWluc19zeW1ib2woZGVwLCBzeW0pKQorCQkJCWJyZWFrOworCQkJaWYgKGV4cHJfZGVwZW5kc19zeW1ib2woZGVwLCBzeW0pKQorCQkJCWdvdG8gbmV4dDsKKwkJCWRlcCA9IGV4cHJfdHJhbnNfY29tcGFyZShkZXAsIEVfVU5FUVVBTCwgJnN5bWJvbF9ubyk7CisJCQlkZXAgPSBleHByX2VsaW1pbmF0ZV9kdXBzKGV4cHJfdHJhbnNmb3JtKGRlcCkpOworCQkJZGVwMiA9IGV4cHJfY29weShiYXNlZGVwKTsKKwkJCWV4cHJfZWxpbWluYXRlX2VxKCZkZXAsICZkZXAyKTsKKwkJCWV4cHJfZnJlZShkZXApOworCQkJaWYgKCFleHByX2lzX3llcyhkZXAyKSkgeworCQkJCWV4cHJfZnJlZShkZXAyKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWV4cHJfZnJlZShkZXAyKTsKKwkJbmV4dDoKKwkJCW1lbnVfZmluYWxpemUobWVudSk7CisJCQltZW51LT5wYXJlbnQgPSBwYXJlbnQ7CisJCQlsYXN0X21lbnUgPSBtZW51OworCQl9CisJCWlmIChsYXN0X21lbnUpIHsKKwkJCXBhcmVudC0+bGlzdCA9IHBhcmVudC0+bmV4dDsKKwkJCXBhcmVudC0+bmV4dCA9IGxhc3RfbWVudS0+bmV4dDsKKwkJCWxhc3RfbWVudS0+bmV4dCA9IE5VTEw7CisJCX0KKwl9CisJZm9yIChtZW51ID0gcGFyZW50LT5saXN0OyBtZW51OyBtZW51ID0gbWVudS0+bmV4dCkgeworCQlpZiAoc3ltICYmIHN5bV9pc19jaG9pY2Uoc3ltKSAmJiBtZW51LT5zeW0pIHsKKwkJCW1lbnUtPnN5bS0+ZmxhZ3MgfD0gU1lNQk9MX0NIT0lDRVZBTDsKKwkJCWlmICghbWVudS0+cHJvbXB0KQorCQkJCW1lbnVfd2FybihtZW51LCAiY2hvaWNlIHZhbHVlIG11c3QgaGF2ZSBhIHByb21wdCIpOworCQkJZm9yIChwcm9wID0gbWVudS0+c3ltLT5wcm9wOyBwcm9wOyBwcm9wID0gcHJvcC0+bmV4dCkgeworCQkJCWlmIChwcm9wLT50eXBlID09IFBfUFJPTVBUICYmIHByb3AtPm1lbnUgIT0gbWVudSkgeworCQkJCQlwcm9wX3dhcm4ocHJvcCwgImNob2ljZSB2YWx1ZXMgIgorCQkJCQkgICAgImN1cnJlbnRseSBvbmx5IHN1cHBvcnQgYSAiCisJCQkJCSAgICAic2luZ2xlIHByb21wdCIpOworCQkJCX0KKwkJCQlpZiAocHJvcC0+dHlwZSA9PSBQX0RFRkFVTFQpCisJCQkJCXByb3Bfd2Fybihwcm9wLCAiZGVmYXVsdHMgZm9yIGNob2ljZSAiCisJCQkJCSAgICAidmFsdWVzIG5vdCBzdXBwb3J0ZWQiKTsKKwkJCX0KKwkJCWN1cnJlbnRfZW50cnkgPSBtZW51OworCQkJbWVudV9zZXRfdHlwZShzeW0tPnR5cGUpOworCQkJbWVudV9hZGRfc3ltYm9sKFBfQ0hPSUNFLCBzeW0sIE5VTEwpOworCQkJcHJvcCA9IHN5bV9nZXRfY2hvaWNlX3Byb3Aoc3ltKTsKKwkJCWZvciAoZXAgPSAmcHJvcC0+ZXhwcjsgKmVwOyBlcCA9ICYoKmVwKS0+bGVmdC5leHByKQorCQkJCTsKKwkJCSplcCA9IGV4cHJfYWxsb2Nfb25lKEVfQ0hPSUNFLCBOVUxMKTsKKwkJCSgqZXApLT5yaWdodC5zeW0gPSBtZW51LT5zeW07CisJCX0KKwkJaWYgKG1lbnUtPmxpc3QgJiYgKCFtZW51LT5wcm9tcHQgfHwgIW1lbnUtPnByb21wdC0+dGV4dCkpIHsKKwkJCWZvciAobGFzdF9tZW51ID0gbWVudS0+bGlzdDsgOyBsYXN0X21lbnUgPSBsYXN0X21lbnUtPm5leHQpIHsKKwkJCQlsYXN0X21lbnUtPnBhcmVudCA9IHBhcmVudDsKKwkJCQlpZiAoIWxhc3RfbWVudS0+bmV4dCkKKwkJCQkJYnJlYWs7CisJCQl9CisJCQlsYXN0X21lbnUtPm5leHQgPSBtZW51LT5uZXh0OworCQkJbWVudS0+bmV4dCA9IG1lbnUtPmxpc3Q7CisJCQltZW51LT5saXN0ID0gTlVMTDsKKwkJfQorCX0KKworCWlmIChzeW0gJiYgIShzeW0tPmZsYWdzICYgU1lNQk9MX1dBUk5FRCkpIHsKKwkJaWYgKHN5bS0+dHlwZSA9PSBTX1VOS05PV04pCisJCQltZW51X3dhcm4ocGFyZW50LCAiY29uZmlnIHN5bWJvbCBkZWZpbmVkICIKKwkJCSAgICAid2l0aG91dCB0eXBlXG4iKTsKKworCQlpZiAoc3ltX2lzX2Nob2ljZShzeW0pICYmICFwYXJlbnQtPnByb21wdCkKKwkJCW1lbnVfd2FybihwYXJlbnQsICJjaG9pY2UgbXVzdCBoYXZlIGEgcHJvbXB0XG4iKTsKKworCQkvKiBDaGVjayBwcm9wZXJ0aWVzIGNvbm5lY3RlZCB0byB0aGlzIHN5bWJvbCAqLworCQlzeW1fY2hlY2tfcHJvcChzeW0pOworCQlzeW0tPmZsYWdzIHw9IFNZTUJPTF9XQVJORUQ7CisJfQorCisJaWYgKHN5bSAmJiAhc3ltX2lzX29wdGlvbmFsKHN5bSkgJiYgcGFyZW50LT5wcm9tcHQpIHsKKwkJc3ltLT5yZXZfZGVwLmV4cHIgPSBleHByX2FsbG9jX29yKHN5bS0+cmV2X2RlcC5leHByLAorCQkJCWV4cHJfYWxsb2NfYW5kKHBhcmVudC0+cHJvbXB0LT52aXNpYmxlLmV4cHIsCisJCQkJCWV4cHJfYWxsb2Nfc3ltYm9sKCZzeW1ib2xfbW9kKSkpOworCX0KK30KKworYm9vbCBtZW51X2lzX3Zpc2libGUoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJc3RydWN0IG1lbnUgKmNoaWxkOworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwl0cmlzdGF0ZSB2aXNpYmxlOworCisJaWYgKCFtZW51LT5wcm9tcHQpCisJCXJldHVybiBmYWxzZTsKKwlzeW0gPSBtZW51LT5zeW07CisJaWYgKHN5bSkgeworCQlzeW1fY2FsY192YWx1ZShzeW0pOworCQl2aXNpYmxlID0gbWVudS0+cHJvbXB0LT52aXNpYmxlLnRyaTsKKwl9IGVsc2UKKwkJdmlzaWJsZSA9IG1lbnUtPnByb21wdC0+dmlzaWJsZS50cmkgPSBleHByX2NhbGNfdmFsdWUobWVudS0+cHJvbXB0LT52aXNpYmxlLmV4cHIpOworCisJaWYgKHZpc2libGUgIT0gbm8pCisJCXJldHVybiB0cnVlOworCWlmICghc3ltIHx8IHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUobWVudS0+c3ltKSA9PSBubykKKwkJcmV0dXJuIGZhbHNlOworCisJZm9yIChjaGlsZCA9IG1lbnUtPmxpc3Q7IGNoaWxkOyBjaGlsZCA9IGNoaWxkLT5uZXh0KQorCQlpZiAobWVudV9pc192aXNpYmxlKGNoaWxkKSkKKwkJCXJldHVybiB0cnVlOworCXJldHVybiBmYWxzZTsKK30KKworY29uc3QgY2hhciAqbWVudV9nZXRfcHJvbXB0KHN0cnVjdCBtZW51ICptZW51KQoreworCWlmIChtZW51LT5wcm9tcHQpCisJCXJldHVybiBtZW51LT5wcm9tcHQtPnRleHQ7CisJZWxzZSBpZiAobWVudS0+c3ltKQorCQlyZXR1cm4gbWVudS0+c3ltLT5uYW1lOworCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgbWVudSAqbWVudV9nZXRfcm9vdF9tZW51KHN0cnVjdCBtZW51ICptZW51KQoreworCXJldHVybiAmcm9vdG1lbnU7Cit9CisKK3N0cnVjdCBtZW51ICptZW51X2dldF9wYXJlbnRfbWVudShzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwllbnVtIHByb3BfdHlwZSB0eXBlOworCisJZm9yICg7IG1lbnUgIT0gJnJvb3RtZW51OyBtZW51ID0gbWVudS0+cGFyZW50KSB7CisJCXR5cGUgPSBtZW51LT5wcm9tcHQgPyBtZW51LT5wcm9tcHQtPnR5cGUgOiAwOworCQlpZiAodHlwZSA9PSBQX01FTlUpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIG1lbnU7Cit9CisKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy9xY29uZi5jYyBiL3NjcmlwdHMva2NvbmZpZy9xY29uZi5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2RiZjlkCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmNjCkBAIC0wLDAgKzEsMTQwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKKyNpbmNsdWRlIDxxYXBwbGljYXRpb24uaD4KKyNpbmNsdWRlIDxxbWFpbndpbmRvdy5oPgorI2luY2x1ZGUgPHF0b29sYmFyLmg+CisjaW5jbHVkZSA8cXZib3guaD4KKyNpbmNsdWRlIDxxc3BsaXR0ZXIuaD4KKyNpbmNsdWRlIDxxbGlzdHZpZXcuaD4KKyNpbmNsdWRlIDxxdGV4dHZpZXcuaD4KKyNpbmNsdWRlIDxxbGluZWVkaXQuaD4KKyNpbmNsdWRlIDxxbWVudWJhci5oPgorI2luY2x1ZGUgPHFtZXNzYWdlYm94Lmg+CisjaW5jbHVkZSA8cWFjdGlvbi5oPgorI2luY2x1ZGUgPHFoZWFkZXIuaD4KKyNpbmNsdWRlIDxxZmlsZWRpYWxvZy5oPgorI2luY2x1ZGUgPHFyZWdleHAuaD4KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAibGtjLmgiCisjaW5jbHVkZSAicWNvbmYuaCIKKworI2luY2x1ZGUgInFjb25mLm1vYyIKKyNpbmNsdWRlICJpbWFnZXMuYyIKKworc3RhdGljIFFBcHBsaWNhdGlvbiAqY29uZmlnQXBwOworCitDb25maWdTZXR0aW5nczo6Q29uZmlnU2V0dGluZ3MoKQorCTogc2hvd0FsbChmYWxzZSksIHNob3dOYW1lKGZhbHNlKSwgc2hvd1JhbmdlKGZhbHNlKSwgc2hvd0RhdGEoZmFsc2UpCit7Cit9CisKKyNpZiBRVF9WRVJTSU9OID49IDMwMAorLyoqCisgKiBSZWFkcyB0aGUgbGlzdCBjb2x1bW4gc2V0dGluZ3MgZnJvbSB0aGUgYXBwbGljYXRpb24gc2V0dGluZ3MuCisgKi8KK3ZvaWQgQ29uZmlnU2V0dGluZ3M6OnJlYWRMaXN0U2V0dGluZ3MoKQoreworCXNob3dBbGwgPSByZWFkQm9vbEVudHJ5KCIva2NvbmZpZy9xY29uZi9zaG93QWxsIiwgZmFsc2UpOworCXNob3dOYW1lID0gcmVhZEJvb2xFbnRyeSgiL2tjb25maWcvcWNvbmYvc2hvd05hbWUiLCBmYWxzZSk7CisJc2hvd1JhbmdlID0gcmVhZEJvb2xFbnRyeSgiL2tjb25maWcvcWNvbmYvc2hvd1JhbmdlIiwgZmFsc2UpOworCXNob3dEYXRhID0gcmVhZEJvb2xFbnRyeSgiL2tjb25maWcvcWNvbmYvc2hvd0RhdGEiLCBmYWxzZSk7Cit9CisKKy8qKgorICogUmVhZHMgYSBsaXN0IG9mIGludGVnZXIgdmFsdWVzIGZyb20gdGhlIGFwcGxpY2F0aW9uIHNldHRpbmdzLgorICovCitRVmFsdWVMaXN0PGludD4gQ29uZmlnU2V0dGluZ3M6OnJlYWRTaXplcyhjb25zdCBRU3RyaW5nJiBrZXksIGJvb2wgKm9rKQoreworCVFWYWx1ZUxpc3Q8aW50PiByZXN1bHQ7CisJUVN0cmluZ0xpc3QgZW50cnlMaXN0ID0gcmVhZExpc3RFbnRyeShrZXksIG9rKTsKKwlpZiAob2spIHsKKwkJUVN0cmluZ0xpc3Q6Okl0ZXJhdG9yIGl0OworCQlmb3IgKGl0ID0gZW50cnlMaXN0LmJlZ2luKCk7IGl0ICE9IGVudHJ5TGlzdC5lbmQoKTsgKytpdCkKKwkJCXJlc3VsdC5wdXNoX2JhY2soKCppdCkudG9JbnQoKSk7CisJfQorCisJcmV0dXJuIHJlc3VsdDsKK30KKworLyoqCisgKiBXcml0ZXMgYSBsaXN0IG9mIGludGVnZXIgdmFsdWVzIHRvIHRoZSBhcHBsaWNhdGlvbiBzZXR0aW5ncy4KKyAqLworYm9vbCBDb25maWdTZXR0aW5nczo6d3JpdGVTaXplcyhjb25zdCBRU3RyaW5nJiBrZXksIGNvbnN0IFFWYWx1ZUxpc3Q8aW50PiYgdmFsdWUpCit7CisJUVN0cmluZ0xpc3Qgc3RyaW5nTGlzdDsKKwlRVmFsdWVMaXN0PGludD46OkNvbnN0SXRlcmF0b3IgaXQ7CisKKwlmb3IgKGl0ID0gdmFsdWUuYmVnaW4oKTsgaXQgIT0gdmFsdWUuZW5kKCk7ICsraXQpCisJCXN0cmluZ0xpc3QucHVzaF9iYWNrKFFTdHJpbmc6Om51bWJlcigqaXQpKTsKKwlyZXR1cm4gd3JpdGVFbnRyeShrZXksIHN0cmluZ0xpc3QpOworfQorI2VuZGlmCisKKworLyoKKyAqIHVwZGF0ZSBhbGwgdGhlIGNoaWxkcmVuIG9mIGEgbWVudSBlbnRyeQorICogICByZW1vdmVzL2FkZHMgdGhlIGVudHJpZXMgZnJvbSB0aGUgcGFyZW50IHdpZGdldCBhcyBuZWNlc3NhcnkKKyAqCisgKiBwYXJlbnQ6IGVpdGhlciB0aGUgbWVudSBsaXN0IHdpZGdldCBvciBhIG1lbnUgZW50cnkgd2lkZ2V0CisgKiBtZW51OiBlbnRyeSB0byBiZSB1cGRhdGVkCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBQPgordm9pZCBDb25maWdMaXN0Ojp1cGRhdGVNZW51TGlzdChQKiBwYXJlbnQsIHN0cnVjdCBtZW51KiBtZW51KQoreworCXN0cnVjdCBtZW51KiBjaGlsZDsKKwlDb25maWdJdGVtKiBpdGVtOworCUNvbmZpZ0l0ZW0qIGxhc3Q7CisJYm9vbCB2aXNpYmxlOworCWVudW0gcHJvcF90eXBlIHR5cGU7CisKKwlpZiAoIW1lbnUpIHsKKwkJd2hpbGUgKChpdGVtID0gcGFyZW50LT5maXJzdENoaWxkKCkpKQorCQkJZGVsZXRlIGl0ZW07CisJCXJldHVybjsKKwl9CisKKwlsYXN0ID0gcGFyZW50LT5maXJzdENoaWxkKCk7CisJaWYgKGxhc3QgJiYgIWxhc3QtPmdvUGFyZW50KQorCQlsYXN0ID0gMDsKKwlmb3IgKGNoaWxkID0gbWVudS0+bGlzdDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKwkJaXRlbSA9IGxhc3QgPyBsYXN0LT5uZXh0U2libGluZygpIDogcGFyZW50LT5maXJzdENoaWxkKCk7CisJCXR5cGUgPSBjaGlsZC0+cHJvbXB0ID8gY2hpbGQtPnByb21wdC0+dHlwZSA6IFBfVU5LTk9XTjsKKworCQlzd2l0Y2ggKG1vZGUpIHsKKwkJY2FzZSBtZW51TW9kZToKKwkJCWlmICghKGNoaWxkLT5mbGFncyAmIE1FTlVfUk9PVCkpCisJCQkJZ290byBoaWRlOworCQkJYnJlYWs7CisJCWNhc2Ugc3ltYm9sTW9kZToKKwkJCWlmIChjaGlsZC0+ZmxhZ3MgJiBNRU5VX1JPT1QpCisJCQkJZ290byBoaWRlOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCXZpc2libGUgPSBtZW51X2lzX3Zpc2libGUoY2hpbGQpOworCQlpZiAoc2hvd0FsbCB8fCB2aXNpYmxlKSB7CisJCQlpZiAoIWl0ZW0gfHwgaXRlbS0+bWVudSAhPSBjaGlsZCkKKwkJCQlpdGVtID0gbmV3IENvbmZpZ0l0ZW0ocGFyZW50LCBsYXN0LCBjaGlsZCwgdmlzaWJsZSk7CisJCQllbHNlCisJCQkJaXRlbS0+dGVzdFVwZGF0ZU1lbnUodmlzaWJsZSk7CisKKwkJCWlmIChtb2RlID09IGZ1bGxNb2RlIHx8IG1vZGUgPT0gbWVudU1vZGUgfHwgdHlwZSAhPSBQX01FTlUpCisJCQkJdXBkYXRlTWVudUxpc3QoaXRlbSwgY2hpbGQpOworCQkJZWxzZQorCQkJCXVwZGF0ZU1lbnVMaXN0KGl0ZW0sIDApOworCQkJbGFzdCA9IGl0ZW07CisJCQljb250aW51ZTsKKwkJfQorCWhpZGU6CisJCWlmIChpdGVtICYmIGl0ZW0tPm1lbnUgPT0gY2hpbGQpIHsKKwkJCWxhc3QgPSBwYXJlbnQtPmZpcnN0Q2hpbGQoKTsKKwkJCWlmIChsYXN0ID09IGl0ZW0pCisJCQkJbGFzdCA9IDA7CisJCQllbHNlIHdoaWxlIChsYXN0LT5uZXh0U2libGluZygpICE9IGl0ZW0pCisJCQkJbGFzdCA9IGxhc3QtPm5leHRTaWJsaW5nKCk7CisJCQlkZWxldGUgaXRlbTsKKwkJfQorCX0KK30KKworI2lmIFFUX1ZFUlNJT04gPj0gMzAwCisvKgorICogc2V0IHRoZSBuZXcgZGF0YQorICogVE9ETyBjaGVjayB0aGUgdmFsdWUKKyAqLwordm9pZCBDb25maWdJdGVtOjpva1JlbmFtZShpbnQgY29sKQoreworCVBhcmVudDo6b2tSZW5hbWUoY29sKTsKKwlzeW1fc2V0X3N0cmluZ192YWx1ZShtZW51LT5zeW0sIHRleHQoZGF0YUNvbElkeCkubGF0aW4xKCkpOworfQorI2VuZGlmCisKKy8qCisgKiB1cGRhdGUgdGhlIGRpc3BsYXllZCBvZiBhIG1lbnUgZW50cnkKKyAqLwordm9pZCBDb25maWdJdGVtOjp1cGRhdGVNZW51KHZvaWQpCit7CisJQ29uZmlnTGlzdCogbGlzdDsKKwlzdHJ1Y3Qgc3ltYm9sKiBzeW07CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCVFTdHJpbmcgcHJvbXB0OworCWludCB0eXBlOworCXRyaXN0YXRlIGV4cHI7CisKKwlsaXN0ID0gbGlzdFZpZXcoKTsKKwlpZiAoZ29QYXJlbnQpIHsKKwkJc2V0UGl4bWFwKHByb21wdENvbElkeCwgbGlzdC0+bWVudUJhY2tQaXgpOworCQlwcm9tcHQgPSAiLi4iOworCQlnb3RvIHNldF9wcm9tcHQ7CisJfQorCisJc3ltID0gbWVudS0+c3ltOworCXByb3AgPSBtZW51LT5wcm9tcHQ7CisJcHJvbXB0ID0gbWVudV9nZXRfcHJvbXB0KG1lbnUpOworCisJaWYgKHByb3ApIHN3aXRjaCAocHJvcC0+dHlwZSkgeworCWNhc2UgUF9NRU5VOgorCQlpZiAobGlzdC0+bW9kZSA9PSBzaW5nbGVNb2RlIHx8IGxpc3QtPm1vZGUgPT0gc3ltYm9sTW9kZSkgeworCQkJLyogYSBtZW51Y29uZmlnIGVudHJ5IGlzIGRpc3BsYXllZCBkaWZmZXJlbnRseQorCQkJICogZGVwZW5kaW5nIHdoZXRoZXIgaXQncyBhdCB0aGUgdmlldyByb290IG9yIGEgY2hpbGQuCisJCQkgKi8KKwkJCWlmIChzeW0gJiYgbGlzdC0+cm9vdEVudHJ5ID09IG1lbnUpCisJCQkJYnJlYWs7CisJCQlzZXRQaXhtYXAocHJvbXB0Q29sSWR4LCBsaXN0LT5tZW51UGl4KTsKKwkJfSBlbHNlIHsKKwkJCWlmIChzeW0pCisJCQkJYnJlYWs7CisJCQlzZXRQaXhtYXAocHJvbXB0Q29sSWR4LCAwKTsKKwkJfQorCQlnb3RvIHNldF9wcm9tcHQ7CisJY2FzZSBQX0NPTU1FTlQ6CisJCXNldFBpeG1hcChwcm9tcHRDb2xJZHgsIDApOworCQlnb3RvIHNldF9wcm9tcHQ7CisJZGVmYXVsdDoKKwkJOworCX0KKwlpZiAoIXN5bSkKKwkJZ290byBzZXRfcHJvbXB0OworCisJc2V0VGV4dChuYW1lQ29sSWR4LCBzeW0tPm5hbWUpOworCisJdHlwZSA9IHN5bV9nZXRfdHlwZShzeW0pOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU19CT09MRUFOOgorCWNhc2UgU19UUklTVEFURToKKwkJY2hhciBjaDsKKworCQlpZiAoIXN5bV9pc19jaGFuZ2FibGUoc3ltKSAmJiAhbGlzdC0+c2hvd0FsbCkgeworCQkJc2V0UGl4bWFwKHByb21wdENvbElkeCwgMCk7CisJCQlzZXRUZXh0KG5vQ29sSWR4LCAwKTsKKwkJCXNldFRleHQobW9kQ29sSWR4LCAwKTsKKwkJCXNldFRleHQoeWVzQ29sSWR4LCAwKTsKKwkJCWJyZWFrOworCQl9CisJCWV4cHIgPSBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSk7CisJCXN3aXRjaCAoZXhwcikgeworCQljYXNlIHllczoKKwkJCWlmIChzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkgJiYgdHlwZSA9PSBTX0JPT0xFQU4pCisJCQkJc2V0UGl4bWFwKHByb21wdENvbElkeCwgbGlzdC0+Y2hvaWNlWWVzUGl4KTsKKwkJCWVsc2UKKwkJCQlzZXRQaXhtYXAocHJvbXB0Q29sSWR4LCBsaXN0LT5zeW1ib2xZZXNQaXgpOworCQkJc2V0VGV4dCh5ZXNDb2xJZHgsICJZIik7CisJCQljaCA9ICdZJzsKKwkJCWJyZWFrOworCQljYXNlIG1vZDoKKwkJCXNldFBpeG1hcChwcm9tcHRDb2xJZHgsIGxpc3QtPnN5bWJvbE1vZFBpeCk7CisJCQlzZXRUZXh0KG1vZENvbElkeCwgIk0iKTsKKwkJCWNoID0gJ00nOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAoc3ltX2lzX2Nob2ljZV92YWx1ZShzeW0pICYmIHR5cGUgPT0gU19CT09MRUFOKQorCQkJCXNldFBpeG1hcChwcm9tcHRDb2xJZHgsIGxpc3QtPmNob2ljZU5vUGl4KTsKKwkJCWVsc2UKKwkJCQlzZXRQaXhtYXAocHJvbXB0Q29sSWR4LCBsaXN0LT5zeW1ib2xOb1BpeCk7CisJCQlzZXRUZXh0KG5vQ29sSWR4LCAiTiIpOworCQkJY2ggPSAnTic7CisJCQlicmVhazsKKwkJfQorCQlpZiAoZXhwciAhPSBubykKKwkJCXNldFRleHQobm9Db2xJZHgsIHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCBubykgPyAiXyIgOiAwKTsKKwkJaWYgKGV4cHIgIT0gbW9kKQorCQkJc2V0VGV4dChtb2RDb2xJZHgsIHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCBtb2QpID8gIl8iIDogMCk7CisJCWlmIChleHByICE9IHllcykKKwkJCXNldFRleHQoeWVzQ29sSWR4LCBzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgeWVzKSA/ICJfIiA6IDApOworCisJCXNldFRleHQoZGF0YUNvbElkeCwgUUNoYXIoY2gpKTsKKwkJYnJlYWs7CisJY2FzZSBTX0lOVDoKKwljYXNlIFNfSEVYOgorCWNhc2UgU19TVFJJTkc6CisJCWNvbnN0IGNoYXIqIGRhdGE7CisKKwkJZGF0YSA9IHN5bV9nZXRfc3RyaW5nX3ZhbHVlKHN5bSk7CisjaWYgUVRfVkVSU0lPTiA+PSAzMDAKKwkJaW50IGkgPSBsaXN0LT5tYXBJZHgoZGF0YUNvbElkeCk7CisJCWlmIChpID49IDApCisJCQlzZXRSZW5hbWVFbmFibGVkKGksIFRSVUUpOworI2VuZGlmCisJCXNldFRleHQoZGF0YUNvbElkeCwgZGF0YSk7CisJCWlmICh0eXBlID09IFNfU1RSSU5HKQorCQkJcHJvbXB0LnNwcmludGYoIiVzOiAlcyIsIHByb21wdC5sYXRpbjEoKSwgZGF0YSk7CisJCWVsc2UKKwkJCXByb21wdC5zcHJpbnRmKCIoJXMpICVzIiwgZGF0YSwgcHJvbXB0LmxhdGluMSgpKTsKKwkJYnJlYWs7CisJfQorCWlmICghc3ltX2hhc192YWx1ZShzeW0pICYmIHZpc2libGUpCisJCXByb21wdCArPSAiIChORVcpIjsKK3NldF9wcm9tcHQ6CisJc2V0VGV4dChwcm9tcHRDb2xJZHgsIHByb21wdCk7Cit9CisKK3ZvaWQgQ29uZmlnSXRlbTo6dGVzdFVwZGF0ZU1lbnUoYm9vbCB2KQoreworCUNvbmZpZ0l0ZW0qIGk7CisKKwl2aXNpYmxlID0gdjsKKwlpZiAoIW1lbnUpCisJCXJldHVybjsKKworCXN5bV9jYWxjX3ZhbHVlKG1lbnUtPnN5bSk7CisJaWYgKG1lbnUtPmZsYWdzICYgTUVOVV9DSEFOR0VEKSB7CisJCS8qIHRoZSBtZW51IGVudHJ5IGNoYW5nZWQsIHNvIHVwZGF0ZSBhbGwgbGlzdCBpdGVtcyAqLworCQltZW51LT5mbGFncyAmPSB+TUVOVV9DSEFOR0VEOworCQlmb3IgKGkgPSAoQ29uZmlnSXRlbSopbWVudS0+ZGF0YTsgaTsgaSA9IGktPm5leHRJdGVtKQorCQkJaS0+dXBkYXRlTWVudSgpOworCX0gZWxzZSBpZiAobGlzdFZpZXcoKS0+dXBkYXRlQWxsKQorCQl1cGRhdGVNZW51KCk7Cit9CisKK3ZvaWQgQ29uZmlnSXRlbTo6cGFpbnRDZWxsKFFQYWludGVyKiBwLCBjb25zdCBRQ29sb3JHcm91cCYgY2csIGludCBjb2x1bW4sIGludCB3aWR0aCwgaW50IGFsaWduKQoreworCUNvbmZpZ0xpc3QqIGxpc3QgPSBsaXN0VmlldygpOworCisJaWYgKHZpc2libGUpIHsKKwkJaWYgKGlzU2VsZWN0ZWQoKSAmJiAhbGlzdC0+aGFzRm9jdXMoKSAmJiBsaXN0LT5tb2RlID09IG1lbnVNb2RlKQorCQkJUGFyZW50OjpwYWludENlbGwocCwgbGlzdC0+aW5hY3RpdmVkQ29sb3JHcm91cCwgY29sdW1uLCB3aWR0aCwgYWxpZ24pOworCQllbHNlCisJCQlQYXJlbnQ6OnBhaW50Q2VsbChwLCBjZywgY29sdW1uLCB3aWR0aCwgYWxpZ24pOworCX0gZWxzZQorCQlQYXJlbnQ6OnBhaW50Q2VsbChwLCBsaXN0LT5kaXNhYmxlZENvbG9yR3JvdXAsIGNvbHVtbiwgd2lkdGgsIGFsaWduKTsKK30KKworLyoKKyAqIGNvbnN0cnVjdCBhIG1lbnUgZW50cnkKKyAqLwordm9pZCBDb25maWdJdGVtOjppbml0KHZvaWQpCit7CisJaWYgKG1lbnUpIHsKKwkJQ29uZmlnTGlzdCogbGlzdCA9IGxpc3RWaWV3KCk7CisJCW5leHRJdGVtID0gKENvbmZpZ0l0ZW0qKW1lbnUtPmRhdGE7CisJCW1lbnUtPmRhdGEgPSB0aGlzOworCisJCWlmIChsaXN0LT5tb2RlICE9IGZ1bGxNb2RlKQorCQkJc2V0T3BlbihUUlVFKTsKKwkJc3ltX2NhbGNfdmFsdWUobWVudS0+c3ltKTsKKwl9CisJdXBkYXRlTWVudSgpOworfQorCisvKgorICogZGVzdHJ1Y3QgYSBtZW51IGVudHJ5CisgKi8KK0NvbmZpZ0l0ZW06On5Db25maWdJdGVtKHZvaWQpCit7CisJaWYgKG1lbnUpIHsKKwkJQ29uZmlnSXRlbSoqIGlwID0gKENvbmZpZ0l0ZW0qKikmbWVudS0+ZGF0YTsKKwkJZm9yICg7ICppcDsgaXAgPSAmKCppcCktPm5leHRJdGVtKSB7CisJCQlpZiAoKmlwID09IHRoaXMpIHsKKwkJCQkqaXAgPSBuZXh0SXRlbTsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KKwordm9pZCBDb25maWdMaW5lRWRpdDo6c2hvdyhDb25maWdJdGVtKiBpKQoreworCWl0ZW0gPSBpOworCWlmIChzeW1fZ2V0X3N0cmluZ192YWx1ZShpdGVtLT5tZW51LT5zeW0pKQorCQlzZXRUZXh0KHN5bV9nZXRfc3RyaW5nX3ZhbHVlKGl0ZW0tPm1lbnUtPnN5bSkpOworCWVsc2UKKwkJc2V0VGV4dCgwKTsKKwlQYXJlbnQ6OnNob3coKTsKKwlzZXRGb2N1cygpOworfQorCit2b2lkIENvbmZpZ0xpbmVFZGl0OjprZXlQcmVzc0V2ZW50KFFLZXlFdmVudCogZSkKK3sKKwlzd2l0Y2ggKGUtPmtleSgpKSB7CisJY2FzZSBLZXlfRXNjYXBlOgorCQlicmVhazsKKwljYXNlIEtleV9SZXR1cm46CisJY2FzZSBLZXlfRW50ZXI6CisJCXN5bV9zZXRfc3RyaW5nX3ZhbHVlKGl0ZW0tPm1lbnUtPnN5bSwgdGV4dCgpLmxhdGluMSgpKTsKKwkJcGFyZW50KCktPnVwZGF0ZUxpc3QoaXRlbSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCVBhcmVudDo6a2V5UHJlc3NFdmVudChlKTsKKwkJcmV0dXJuOworCX0KKwllLT5hY2NlcHQoKTsKKwlwYXJlbnQoKS0+bGlzdC0+c2V0Rm9jdXMoKTsKKwloaWRlKCk7Cit9CisKK0NvbmZpZ0xpc3Q6OkNvbmZpZ0xpc3QoQ29uZmlnVmlldyogcCwgQ29uZmlnTWFpbldpbmRvdyogY3YsIENvbmZpZ1NldHRpbmdzKiBjb25maWdTZXR0aW5ncykKKwk6IFBhcmVudChwKSwgY3ZpZXcoY3YpLAorCSAgdXBkYXRlQWxsKGZhbHNlKSwKKwkgIHN5bWJvbFllc1BpeCh4cG1fc3ltYm9sX3llcyksIHN5bWJvbE1vZFBpeCh4cG1fc3ltYm9sX21vZCksIHN5bWJvbE5vUGl4KHhwbV9zeW1ib2xfbm8pLAorCSAgY2hvaWNlWWVzUGl4KHhwbV9jaG9pY2VfeWVzKSwgY2hvaWNlTm9QaXgoeHBtX2Nob2ljZV9ubyksCisJICBtZW51UGl4KHhwbV9tZW51KSwgbWVudUludlBpeCh4cG1fbWVudV9pbnYpLCBtZW51QmFja1BpeCh4cG1fbWVudWJhY2spLCB2b2lkUGl4KHhwbV92b2lkKSwKKwkgIHNob3dBbGwoZmFsc2UpLCBzaG93TmFtZShmYWxzZSksIHNob3dSYW5nZShmYWxzZSksIHNob3dEYXRhKGZhbHNlKSwKKwkgIHJvb3RFbnRyeSgwKQoreworCWludCBpOworCisJc2V0U29ydGluZygtMSk7CisJc2V0Um9vdElzRGVjb3JhdGVkKFRSVUUpOworCWRpc2FibGVkQ29sb3JHcm91cCA9IHBhbGV0dGUoKS5hY3RpdmUoKTsKKwlkaXNhYmxlZENvbG9yR3JvdXAuc2V0Q29sb3IoUUNvbG9yR3JvdXA6OlRleHQsIHBhbGV0dGUoKS5kaXNhYmxlZCgpLnRleHQoKSk7CisJaW5hY3RpdmVkQ29sb3JHcm91cCA9IHBhbGV0dGUoKS5hY3RpdmUoKTsKKwlpbmFjdGl2ZWRDb2xvckdyb3VwLnNldENvbG9yKFFDb2xvckdyb3VwOjpIaWdobGlnaHQsIHBhbGV0dGUoKS5kaXNhYmxlZCgpLmhpZ2hsaWdodCgpKTsKKworCWNvbm5lY3QodGhpcywgU0lHTkFMKHNlbGVjdGlvbkNoYW5nZWQodm9pZCkpLAorCQlTTE9UKHVwZGF0ZVNlbGVjdGlvbih2b2lkKSkpOworCisJaWYgKGNvbmZpZ1NldHRpbmdzKSB7CisJCXNob3dBbGwgPSBjb25maWdTZXR0aW5ncy0+c2hvd0FsbDsKKwkJc2hvd05hbWUgPSBjb25maWdTZXR0aW5ncy0+c2hvd05hbWU7CisJCXNob3dSYW5nZSA9IGNvbmZpZ1NldHRpbmdzLT5zaG93UmFuZ2U7CisJCXNob3dEYXRhID0gY29uZmlnU2V0dGluZ3MtPnNob3dEYXRhOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBjb2xOcjsgaSsrKQorCQljb2xNYXBbaV0gPSBjb2xSZXZNYXBbaV0gPSAtMTsKKwlhZGRDb2x1bW4ocHJvbXB0Q29sSWR4LCAiT3B0aW9uIik7CisKKwlyZWluaXQoKTsKK30KKwordm9pZCBDb25maWdMaXN0OjpyZWluaXQodm9pZCkKK3sKKwlyZW1vdmVDb2x1bW4oZGF0YUNvbElkeCk7CisJcmVtb3ZlQ29sdW1uKHllc0NvbElkeCk7CisJcmVtb3ZlQ29sdW1uKG1vZENvbElkeCk7CisJcmVtb3ZlQ29sdW1uKG5vQ29sSWR4KTsKKwlyZW1vdmVDb2x1bW4obmFtZUNvbElkeCk7CisKKwlpZiAoc2hvd05hbWUpCisJCWFkZENvbHVtbihuYW1lQ29sSWR4LCAiTmFtZSIpOworCWlmIChzaG93UmFuZ2UpIHsKKwkJYWRkQ29sdW1uKG5vQ29sSWR4LCAiTiIpOworCQlhZGRDb2x1bW4obW9kQ29sSWR4LCAiTSIpOworCQlhZGRDb2x1bW4oeWVzQ29sSWR4LCAiWSIpOworCX0KKwlpZiAoc2hvd0RhdGEpCisJCWFkZENvbHVtbihkYXRhQ29sSWR4LCAiVmFsdWUiKTsKKworCXVwZGF0ZUxpc3RBbGwoKTsKK30KKwordm9pZCBDb25maWdMaXN0Ojp1cGRhdGVTZWxlY3Rpb24odm9pZCkKK3sKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKwllbnVtIHByb3BfdHlwZSB0eXBlOworCisJQ29uZmlnSXRlbSogaXRlbSA9IChDb25maWdJdGVtKilzZWxlY3RlZEl0ZW0oKTsKKwlpZiAoIWl0ZW0pCisJCXJldHVybjsKKworCWN2aWV3LT5zZXRIZWxwKGl0ZW0pOworCisJbWVudSA9IGl0ZW0tPm1lbnU7CisJaWYgKCFtZW51KQorCQlyZXR1cm47CisJdHlwZSA9IG1lbnUtPnByb21wdCA/IG1lbnUtPnByb21wdC0+dHlwZSA6IFBfVU5LTk9XTjsKKwlpZiAobW9kZSA9PSBtZW51TW9kZSAmJiB0eXBlID09IFBfTUVOVSkKKwkJZW1pdCBtZW51U2VsZWN0ZWQobWVudSk7Cit9CisKK3ZvaWQgQ29uZmlnTGlzdDo6dXBkYXRlTGlzdChDb25maWdJdGVtKiBpdGVtKQoreworCUNvbmZpZ0l0ZW0qIGxhc3QgPSAwOworCisJaWYgKCFyb290RW50cnkpCisJCWdvdG8gdXBkYXRlOworCisJaWYgKHJvb3RFbnRyeSAhPSAmcm9vdG1lbnUgJiYgKG1vZGUgPT0gc2luZ2xlTW9kZSB8fAorCSAgICAobW9kZSA9PSBzeW1ib2xNb2RlICYmIHJvb3RFbnRyeS0+cGFyZW50ICE9ICZyb290bWVudSkpKSB7CisJCWl0ZW0gPSBmaXJzdENoaWxkKCk7CisJCWlmICghaXRlbSkKKwkJCWl0ZW0gPSBuZXcgQ29uZmlnSXRlbSh0aGlzLCAwLCB0cnVlKTsKKwkJbGFzdCA9IGl0ZW07CisJfQorCWlmICgobW9kZSA9PSBzaW5nbGVNb2RlIHx8IChtb2RlID09IHN5bWJvbE1vZGUgJiYgIShyb290RW50cnktPmZsYWdzICYgTUVOVV9ST09UKSkpICYmCisJICAgIHJvb3RFbnRyeS0+c3ltICYmIHJvb3RFbnRyeS0+cHJvbXB0KSB7CisJCWl0ZW0gPSBsYXN0ID8gbGFzdC0+bmV4dFNpYmxpbmcoKSA6IGZpcnN0Q2hpbGQoKTsKKwkJaWYgKCFpdGVtKQorCQkJaXRlbSA9IG5ldyBDb25maWdJdGVtKHRoaXMsIGxhc3QsIHJvb3RFbnRyeSwgdHJ1ZSk7CisJCWVsc2UKKwkJCWl0ZW0tPnRlc3RVcGRhdGVNZW51KHRydWUpOworCisJCXVwZGF0ZU1lbnVMaXN0KGl0ZW0sIHJvb3RFbnRyeSk7CisJCXRyaWdnZXJVcGRhdGUoKTsKKwkJcmV0dXJuOworCX0KK3VwZGF0ZToKKwl1cGRhdGVNZW51TGlzdCh0aGlzLCByb290RW50cnkpOworCXRyaWdnZXJVcGRhdGUoKTsKK30KKwordm9pZCBDb25maWdMaXN0OjpzZXRBbGxPcGVuKGJvb2wgb3BlbikKK3sKKwlRTGlzdFZpZXdJdGVtSXRlcmF0b3IgaXQodGhpcyk7CisKKwlmb3IgKDsgaXQuY3VycmVudCgpOyBpdCsrKQorCQlpdC5jdXJyZW50KCktPnNldE9wZW4ob3Blbik7Cit9CisKK3ZvaWQgQ29uZmlnTGlzdDo6c2V0VmFsdWUoQ29uZmlnSXRlbSogaXRlbSwgdHJpc3RhdGUgdmFsKQoreworCXN0cnVjdCBzeW1ib2wqIHN5bTsKKwlpbnQgdHlwZTsKKwl0cmlzdGF0ZSBvbGR2YWw7CisKKwlzeW0gPSBpdGVtLT5tZW51ID8gaXRlbS0+bWVudS0+c3ltIDogMDsKKwlpZiAoIXN5bSkKKwkJcmV0dXJuOworCisJdHlwZSA9IHN5bV9nZXRfdHlwZShzeW0pOworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgU19CT09MRUFOOgorCWNhc2UgU19UUklTVEFURToKKwkJb2xkdmFsID0gc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzeW0pOworCisJCWlmICghc3ltX3NldF90cmlzdGF0ZV92YWx1ZShzeW0sIHZhbCkpCisJCQlyZXR1cm47CisJCWlmIChvbGR2YWwgPT0gbm8gJiYgaXRlbS0+bWVudS0+bGlzdCkKKwkJCWl0ZW0tPnNldE9wZW4oVFJVRSk7CisJCXBhcmVudCgpLT51cGRhdGVMaXN0KGl0ZW0pOworCQlicmVhazsKKwl9Cit9CisKK3ZvaWQgQ29uZmlnTGlzdDo6Y2hhbmdlVmFsdWUoQ29uZmlnSXRlbSogaXRlbSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sKiBzeW07CisJc3RydWN0IG1lbnUqIG1lbnU7CisJaW50IHR5cGUsIG9sZGV4cHIsIG5ld2V4cHI7CisKKwltZW51ID0gaXRlbS0+bWVudTsKKwlpZiAoIW1lbnUpCisJCXJldHVybjsKKwlzeW0gPSBtZW51LT5zeW07CisJaWYgKCFzeW0pIHsKKwkJaWYgKGl0ZW0tPm1lbnUtPmxpc3QpCisJCQlpdGVtLT5zZXRPcGVuKCFpdGVtLT5pc09wZW4oKSk7CisJCXJldHVybjsKKwl9CisKKwl0eXBlID0gc3ltX2dldF90eXBlKHN5bSk7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBTX0JPT0xFQU46CisJY2FzZSBTX1RSSVNUQVRFOgorCQlvbGRleHByID0gc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzeW0pOworCQluZXdleHByID0gc3ltX3RvZ2dsZV90cmlzdGF0ZV92YWx1ZShzeW0pOworCQlpZiAoaXRlbS0+bWVudS0+bGlzdCkgeworCQkJaWYgKG9sZGV4cHIgPT0gbmV3ZXhwcikKKwkJCQlpdGVtLT5zZXRPcGVuKCFpdGVtLT5pc09wZW4oKSk7CisJCQllbHNlIGlmIChvbGRleHByID09IG5vKQorCQkJCWl0ZW0tPnNldE9wZW4oVFJVRSk7CisJCX0KKwkJaWYgKG9sZGV4cHIgIT0gbmV3ZXhwcikKKwkJCXBhcmVudCgpLT51cGRhdGVMaXN0KGl0ZW0pOworCQlicmVhazsKKwljYXNlIFNfSU5UOgorCWNhc2UgU19IRVg6CisJY2FzZSBTX1NUUklORzoKKyNpZiBRVF9WRVJTSU9OID49IDMwMAorCQlpZiAoY29sTWFwW2RhdGFDb2xJZHhdID49IDApCisJCQlpdGVtLT5zdGFydFJlbmFtZShjb2xNYXBbZGF0YUNvbElkeF0pOworCQllbHNlCisjZW5kaWYKKwkJCXBhcmVudCgpLT5saW5lRWRpdC0+c2hvdyhpdGVtKTsKKwkJYnJlYWs7CisJfQorfQorCit2b2lkIENvbmZpZ0xpc3Q6OnNldFJvb3RNZW51KHN0cnVjdCBtZW51ICptZW51KQoreworCWVudW0gcHJvcF90eXBlIHR5cGU7CisKKwlpZiAocm9vdEVudHJ5ID09IG1lbnUpCisJCXJldHVybjsKKwl0eXBlID0gbWVudSAmJiBtZW51LT5wcm9tcHQgPyBtZW51LT5wcm9tcHQtPnR5cGUgOiBQX1VOS05PV047CisJaWYgKHR5cGUgIT0gUF9NRU5VKQorCQlyZXR1cm47CisJdXBkYXRlTWVudUxpc3QodGhpcywgMCk7CisJcm9vdEVudHJ5ID0gbWVudTsKKwl1cGRhdGVMaXN0QWxsKCk7CisJc2V0U2VsZWN0ZWQoY3VycmVudEl0ZW0oKSwgaGFzRm9jdXMoKSk7Cit9CisKK3ZvaWQgQ29uZmlnTGlzdDo6c2V0UGFyZW50TWVudSh2b2lkKQoreworCUNvbmZpZ0l0ZW0qIGl0ZW07CisJc3RydWN0IG1lbnUgKm9sZHJvb3Q7CisKKwlvbGRyb290ID0gcm9vdEVudHJ5OworCWlmIChyb290RW50cnkgPT0gJnJvb3RtZW51KQorCQlyZXR1cm47CisJc2V0Um9vdE1lbnUobWVudV9nZXRfcGFyZW50X21lbnUocm9vdEVudHJ5LT5wYXJlbnQpKTsKKworCVFMaXN0Vmlld0l0ZW1JdGVyYXRvciBpdCh0aGlzKTsKKwlmb3IgKDsgKGl0ZW0gPSAoQ29uZmlnSXRlbSopaXQuY3VycmVudCgpKTsgaXQrKykgeworCQlpZiAoaXRlbS0+bWVudSA9PSBvbGRyb290KSB7CisJCQlzZXRDdXJyZW50SXRlbShpdGVtKTsKKwkJCWVuc3VyZUl0ZW1WaXNpYmxlKGl0ZW0pOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK3ZvaWQgQ29uZmlnTGlzdDo6a2V5UHJlc3NFdmVudChRS2V5RXZlbnQqIGV2KQoreworCVFMaXN0Vmlld0l0ZW0qIGkgPSBjdXJyZW50SXRlbSgpOworCUNvbmZpZ0l0ZW0qIGl0ZW07CisJc3RydWN0IG1lbnUgKm1lbnU7CisJZW51bSBwcm9wX3R5cGUgdHlwZTsKKworCWlmIChldi0+a2V5KCkgPT0gS2V5X0VzY2FwZSAmJiBtb2RlICE9IGZ1bGxNb2RlKSB7CisJCWVtaXQgcGFyZW50U2VsZWN0ZWQoKTsKKwkJZXYtPmFjY2VwdCgpOworCQlyZXR1cm47CisJfQorCisJaWYgKCFpKSB7CisJCVBhcmVudDo6a2V5UHJlc3NFdmVudChldik7CisJCXJldHVybjsKKwl9CisJaXRlbSA9IChDb25maWdJdGVtKilpOworCisJc3dpdGNoIChldi0+a2V5KCkpIHsKKwljYXNlIEtleV9SZXR1cm46CisJY2FzZSBLZXlfRW50ZXI6CisJCWlmIChpdGVtLT5nb1BhcmVudCkgeworCQkJZW1pdCBwYXJlbnRTZWxlY3RlZCgpOworCQkJYnJlYWs7CisJCX0KKwkJbWVudSA9IGl0ZW0tPm1lbnU7CisJCWlmICghbWVudSkKKwkJCWJyZWFrOworCQl0eXBlID0gbWVudS0+cHJvbXB0ID8gbWVudS0+cHJvbXB0LT50eXBlIDogUF9VTktOT1dOOworCQlpZiAodHlwZSA9PSBQX01FTlUgJiYgcm9vdEVudHJ5ICE9IG1lbnUgJiYKKwkJICAgIG1vZGUgIT0gZnVsbE1vZGUgJiYgbW9kZSAhPSBtZW51TW9kZSkgeworCQkJZW1pdCBtZW51U2VsZWN0ZWQobWVudSk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgS2V5X1NwYWNlOgorCQljaGFuZ2VWYWx1ZShpdGVtKTsKKwkJYnJlYWs7CisJY2FzZSBLZXlfTjoKKwkJc2V0VmFsdWUoaXRlbSwgbm8pOworCQlicmVhazsKKwljYXNlIEtleV9NOgorCQlzZXRWYWx1ZShpdGVtLCBtb2QpOworCQlicmVhazsKKwljYXNlIEtleV9ZOgorCQlzZXRWYWx1ZShpdGVtLCB5ZXMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlQYXJlbnQ6OmtleVByZXNzRXZlbnQoZXYpOworCQlyZXR1cm47CisJfQorCWV2LT5hY2NlcHQoKTsKK30KKwordm9pZCBDb25maWdMaXN0Ojpjb250ZW50c01vdXNlUHJlc3NFdmVudChRTW91c2VFdmVudCogZSkKK3sKKwkvL1FQb2ludCBwKGNvbnRlbnRzVG9WaWV3cG9ydChlLT5wb3MoKSkpOworCS8vcHJpbnRmKCJjb250ZW50c01vdXNlUHJlc3NFdmVudDogJWQsJWRcbiIsIHAueCgpLCBwLnkoKSk7CisJUGFyZW50Ojpjb250ZW50c01vdXNlUHJlc3NFdmVudChlKTsKK30KKwordm9pZCBDb25maWdMaXN0Ojpjb250ZW50c01vdXNlUmVsZWFzZUV2ZW50KFFNb3VzZUV2ZW50KiBlKQoreworCVFQb2ludCBwKGNvbnRlbnRzVG9WaWV3cG9ydChlLT5wb3MoKSkpOworCUNvbmZpZ0l0ZW0qIGl0ZW0gPSAoQ29uZmlnSXRlbSopaXRlbUF0KHApOworCXN0cnVjdCBtZW51ICptZW51OworCWVudW0gcHJvcF90eXBlIHB0eXBlOworCWNvbnN0IFFQaXhtYXAqIHBtOworCWludCBpZHgsIHg7CisKKwlpZiAoIWl0ZW0pCisJCWdvdG8gc2tpcDsKKworCW1lbnUgPSBpdGVtLT5tZW51OworCXggPSBoZWFkZXIoKS0+b2Zmc2V0KCkgKyBwLngoKTsKKwlpZHggPSBjb2xSZXZNYXBbaGVhZGVyKCktPnNlY3Rpb25BdCh4KV07CisJc3dpdGNoIChpZHgpIHsKKwljYXNlIHByb21wdENvbElkeDoKKwkJcG0gPSBpdGVtLT5waXhtYXAocHJvbXB0Q29sSWR4KTsKKwkJaWYgKHBtKSB7CisJCQlpbnQgb2ZmID0gaGVhZGVyKCktPnNlY3Rpb25Qb3MoMCkgKyBpdGVtTWFyZ2luKCkgKworCQkJCXRyZWVTdGVwU2l6ZSgpICogKGl0ZW0tPmRlcHRoKCkgKyAocm9vdElzRGVjb3JhdGVkKCkgPyAxIDogMCkpOworCQkJaWYgKHggPj0gb2ZmICYmIHggPCBvZmYgKyBwbS0+d2lkdGgoKSkgeworCQkJCWlmIChpdGVtLT5nb1BhcmVudCkgeworCQkJCQllbWl0IHBhcmVudFNlbGVjdGVkKCk7CisJCQkJCWJyZWFrOworCQkJCX0gZWxzZSBpZiAoIW1lbnUpCisJCQkJCWJyZWFrOworCQkJCXB0eXBlID0gbWVudS0+cHJvbXB0ID8gbWVudS0+cHJvbXB0LT50eXBlIDogUF9VTktOT1dOOworCQkJCWlmIChwdHlwZSA9PSBQX01FTlUgJiYgcm9vdEVudHJ5ICE9IG1lbnUgJiYKKwkJCQkgICAgbW9kZSAhPSBmdWxsTW9kZSAmJiBtb2RlICE9IG1lbnVNb2RlKQorCQkJCQllbWl0IG1lbnVTZWxlY3RlZChtZW51KTsKKwkJCQllbHNlCisJCQkJCWNoYW5nZVZhbHVlKGl0ZW0pOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2Ugbm9Db2xJZHg6CisJCXNldFZhbHVlKGl0ZW0sIG5vKTsKKwkJYnJlYWs7CisJY2FzZSBtb2RDb2xJZHg6CisJCXNldFZhbHVlKGl0ZW0sIG1vZCk7CisJCWJyZWFrOworCWNhc2UgeWVzQ29sSWR4OgorCQlzZXRWYWx1ZShpdGVtLCB5ZXMpOworCQlicmVhazsKKwljYXNlIGRhdGFDb2xJZHg6CisJCWNoYW5nZVZhbHVlKGl0ZW0pOworCQlicmVhazsKKwl9CisKK3NraXA6CisJLy9wcmludGYoImNvbnRlbnRzTW91c2VSZWxlYXNlRXZlbnQ6ICVkLCVkXG4iLCBwLngoKSwgcC55KCkpOworCVBhcmVudDo6Y29udGVudHNNb3VzZVJlbGVhc2VFdmVudChlKTsKK30KKwordm9pZCBDb25maWdMaXN0Ojpjb250ZW50c01vdXNlTW92ZUV2ZW50KFFNb3VzZUV2ZW50KiBlKQoreworCS8vUVBvaW50IHAoY29udGVudHNUb1ZpZXdwb3J0KGUtPnBvcygpKSk7CisJLy9wcmludGYoImNvbnRlbnRzTW91c2VNb3ZlRXZlbnQ6ICVkLCVkXG4iLCBwLngoKSwgcC55KCkpOworCVBhcmVudDo6Y29udGVudHNNb3VzZU1vdmVFdmVudChlKTsKK30KKwordm9pZCBDb25maWdMaXN0Ojpjb250ZW50c01vdXNlRG91YmxlQ2xpY2tFdmVudChRTW91c2VFdmVudCogZSkKK3sKKwlRUG9pbnQgcChjb250ZW50c1RvVmlld3BvcnQoZS0+cG9zKCkpKTsKKwlDb25maWdJdGVtKiBpdGVtID0gKENvbmZpZ0l0ZW0qKWl0ZW1BdChwKTsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKwllbnVtIHByb3BfdHlwZSBwdHlwZTsKKworCWlmICghaXRlbSkKKwkJZ290byBza2lwOworCWlmIChpdGVtLT5nb1BhcmVudCkgeworCQllbWl0IHBhcmVudFNlbGVjdGVkKCk7CisJCWdvdG8gc2tpcDsKKwl9CisJbWVudSA9IGl0ZW0tPm1lbnU7CisJaWYgKCFtZW51KQorCQlnb3RvIHNraXA7CisJcHR5cGUgPSBtZW51LT5wcm9tcHQgPyBtZW51LT5wcm9tcHQtPnR5cGUgOiBQX1VOS05PV047CisJaWYgKHB0eXBlID09IFBfTUVOVSAmJiAobW9kZSA9PSBzaW5nbGVNb2RlIHx8IG1vZGUgPT0gc3ltYm9sTW9kZSkpCisJCWVtaXQgbWVudVNlbGVjdGVkKG1lbnUpOworCWVsc2UgaWYgKG1lbnUtPnN5bSkKKwkJY2hhbmdlVmFsdWUoaXRlbSk7CisKK3NraXA6CisJLy9wcmludGYoImNvbnRlbnRzTW91c2VEb3VibGVDbGlja0V2ZW50OiAlZCwlZFxuIiwgcC54KCksIHAueSgpKTsKKwlQYXJlbnQ6OmNvbnRlbnRzTW91c2VEb3VibGVDbGlja0V2ZW50KGUpOworfQorCit2b2lkIENvbmZpZ0xpc3Q6OmZvY3VzSW5FdmVudChRRm9jdXNFdmVudCAqZSkKK3sKKwlQYXJlbnQ6OmZvY3VzSW5FdmVudChlKTsKKworCVFMaXN0Vmlld0l0ZW0qIGl0ZW0gPSBjdXJyZW50SXRlbSgpOworCWlmICghaXRlbSkKKwkJcmV0dXJuOworCisJc2V0U2VsZWN0ZWQoaXRlbSwgVFJVRSk7CisJZW1pdCBnb3RGb2N1cygpOworfQorCitDb25maWdWaWV3KiBDb25maWdWaWV3Ojp2aWV3TGlzdDsKKworQ29uZmlnVmlldzo6Q29uZmlnVmlldyhRV2lkZ2V0KiBwYXJlbnQsIENvbmZpZ01haW5XaW5kb3cqIGN2aWV3LAorCQkgICAgICAgQ29uZmlnU2V0dGluZ3MgKmNvbmZpZ1NldHRpbmdzKQorCTogUGFyZW50KHBhcmVudCkKK3sKKwlsaXN0ID0gbmV3IENvbmZpZ0xpc3QodGhpcywgY3ZpZXcsIGNvbmZpZ1NldHRpbmdzKTsKKwlsaW5lRWRpdCA9IG5ldyBDb25maWdMaW5lRWRpdCh0aGlzKTsKKwlsaW5lRWRpdC0+aGlkZSgpOworCisJdGhpcy0+bmV4dFZpZXcgPSB2aWV3TGlzdDsKKwl2aWV3TGlzdCA9IHRoaXM7Cit9CisKK0NvbmZpZ1ZpZXc6On5Db25maWdWaWV3KHZvaWQpCit7CisJQ29uZmlnVmlldyoqIHZwOworCisJZm9yICh2cCA9ICZ2aWV3TGlzdDsgKnZwOyB2cCA9ICYoKnZwKS0+bmV4dFZpZXcpIHsKKwkJaWYgKCp2cCA9PSB0aGlzKSB7CisJCQkqdnAgPSBuZXh0VmlldzsKKwkJCWJyZWFrOworCQl9CisJfQorfQorCit2b2lkIENvbmZpZ1ZpZXc6OnVwZGF0ZUxpc3QoQ29uZmlnSXRlbSogaXRlbSkKK3sKKwlDb25maWdWaWV3KiB2OworCisJZm9yICh2ID0gdmlld0xpc3Q7IHY7IHYgPSB2LT5uZXh0VmlldykKKwkJdi0+bGlzdC0+dXBkYXRlTGlzdChpdGVtKTsKK30KKwordm9pZCBDb25maWdWaWV3Ojp1cGRhdGVMaXN0QWxsKHZvaWQpCit7CisJQ29uZmlnVmlldyogdjsKKworCWZvciAodiA9IHZpZXdMaXN0OyB2OyB2ID0gdi0+bmV4dFZpZXcpCisJCXYtPmxpc3QtPnVwZGF0ZUxpc3RBbGwoKTsKK30KKworLyoKKyAqIENvbnN0cnVjdCB0aGUgY29tcGxldGUgY29uZmlnIHdpZGdldAorICovCitDb25maWdNYWluV2luZG93OjpDb25maWdNYWluV2luZG93KHZvaWQpCit7CisJUU1lbnVCYXIqIG1lbnU7CisJYm9vbCBvazsKKwlpbnQgeCwgeSwgd2lkdGgsIGhlaWdodDsKKworCVFXaWRnZXQgKmQgPSBjb25maWdBcHAtPmRlc2t0b3AoKTsKKworCUNvbmZpZ1NldHRpbmdzKiBjb25maWdTZXR0aW5ncyA9IG5ldyBDb25maWdTZXR0aW5ncygpOworI2lmIFFUX1ZFUlNJT04gPj0gMzAwCisJd2lkdGggPSBjb25maWdTZXR0aW5ncy0+cmVhZE51bUVudHJ5KCIva2NvbmZpZy9xY29uZi93aW5kb3cgd2lkdGgiLCBkLT53aWR0aCgpIC0gNjQpOworCWhlaWdodCA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkTnVtRW50cnkoIi9rY29uZmlnL3Fjb25mL3dpbmRvdyBoZWlnaHQiLCBkLT5oZWlnaHQoKSAtIDY0KTsKKwlyZXNpemUod2lkdGgsIGhlaWdodCk7CisJeCA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkTnVtRW50cnkoIi9rY29uZmlnL3Fjb25mL3dpbmRvdyB4IiwgMCwgJm9rKTsKKwlpZiAob2spCisJCXkgPSBjb25maWdTZXR0aW5ncy0+cmVhZE51bUVudHJ5KCIva2NvbmZpZy9xY29uZi93aW5kb3cgeSIsIDAsICZvayk7CisJaWYgKG9rKQorCQltb3ZlKHgsIHkpOworCXNob3dEZWJ1ZyA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkQm9vbEVudHJ5KCIva2NvbmZpZy9xY29uZi9zaG93RGVidWciLCBmYWxzZSk7CisKKwkvLyByZWFkIGxpc3Qgc2V0dGluZ3MgaW50byBjb25maWdTZXR0aW5ncywgd2lsbCBiZSB1c2VkIGxhdGVyIGZvciBDb25maWdMaXN0IHNldHVwCisJY29uZmlnU2V0dGluZ3MtPnJlYWRMaXN0U2V0dGluZ3MoKTsKKyNlbHNlCisJd2lkdGggPSBkLT53aWR0aCgpIC0gNjQ7CisJaGVpZ2h0ID0gZC0+aGVpZ2h0KCkgLSA2NDsKKwlyZXNpemUod2lkdGgsIGhlaWdodCk7CisJc2hvd0RlYnVnID0gZmFsc2U7CisjZW5kaWYKKworCXNwbGl0MSA9IG5ldyBRU3BsaXR0ZXIodGhpcyk7CisJc3BsaXQxLT5zZXRPcmllbnRhdGlvbihRU3BsaXR0ZXI6Okhvcml6b250YWwpOworCXNldENlbnRyYWxXaWRnZXQoc3BsaXQxKTsKKworCW1lbnVWaWV3ID0gbmV3IENvbmZpZ1ZpZXcoc3BsaXQxLCB0aGlzLCBjb25maWdTZXR0aW5ncyk7CisJbWVudUxpc3QgPSBtZW51Vmlldy0+bGlzdDsKKworCXNwbGl0MiA9IG5ldyBRU3BsaXR0ZXIoc3BsaXQxKTsKKwlzcGxpdDItPnNldE9yaWVudGF0aW9uKFFTcGxpdHRlcjo6VmVydGljYWwpOworCisJLy8gY3JlYXRlIGNvbmZpZyB0cmVlCisJY29uZmlnVmlldyA9IG5ldyBDb25maWdWaWV3KHNwbGl0MiwgdGhpcywgY29uZmlnU2V0dGluZ3MpOworCWNvbmZpZ0xpc3QgPSBjb25maWdWaWV3LT5saXN0OworCisJaGVscFRleHQgPSBuZXcgUVRleHRWaWV3KHNwbGl0Mik7CisJaGVscFRleHQtPnNldFRleHRGb3JtYXQoUXQ6OlJpY2hUZXh0KTsKKworCXNldFRhYk9yZGVyKGNvbmZpZ0xpc3QsIGhlbHBUZXh0KTsKKwljb25maWdMaXN0LT5zZXRGb2N1cygpOworCisJbWVudSA9IG1lbnVCYXIoKTsKKwl0b29sQmFyID0gbmV3IFFUb29sQmFyKCJUb29scyIsIHRoaXMpOworCisJYmFja0FjdGlvbiA9IG5ldyBRQWN0aW9uKCJCYWNrIiwgUVBpeG1hcCh4cG1fYmFjayksICJCYWNrIiwgMCwgdGhpcyk7CisJICBjb25uZWN0KGJhY2tBY3Rpb24sIFNJR05BTChhY3RpdmF0ZWQoKSksIFNMT1QoZ29CYWNrKCkpKTsKKwkgIGJhY2tBY3Rpb24tPnNldEVuYWJsZWQoRkFMU0UpOworCVFBY3Rpb24gKnF1aXRBY3Rpb24gPSBuZXcgUUFjdGlvbigiUXVpdCIsICImUXVpdCIsIENUUkwrS2V5X1EsIHRoaXMpOworCSAgY29ubmVjdChxdWl0QWN0aW9uLCBTSUdOQUwoYWN0aXZhdGVkKCkpLCBTTE9UKGNsb3NlKCkpKTsKKwlRQWN0aW9uICpsb2FkQWN0aW9uID0gbmV3IFFBY3Rpb24oIkxvYWQiLCBRUGl4bWFwKHhwbV9sb2FkKSwgIiZMb2FkIiwgQ1RSTCtLZXlfTCwgdGhpcyk7CisJICBjb25uZWN0KGxvYWRBY3Rpb24sIFNJR05BTChhY3RpdmF0ZWQoKSksIFNMT1QobG9hZENvbmZpZygpKSk7CisJUUFjdGlvbiAqc2F2ZUFjdGlvbiA9IG5ldyBRQWN0aW9uKCJTYXZlIiwgUVBpeG1hcCh4cG1fc2F2ZSksICImU2F2ZSIsIENUUkwrS2V5X1MsIHRoaXMpOworCSAgY29ubmVjdChzYXZlQWN0aW9uLCBTSUdOQUwoYWN0aXZhdGVkKCkpLCBTTE9UKHNhdmVDb25maWcoKSkpOworCVFBY3Rpb24gKnNhdmVBc0FjdGlvbiA9IG5ldyBRQWN0aW9uKCJTYXZlIEFzLi4uIiwgIlNhdmUgJkFzLi4uIiwgMCwgdGhpcyk7CisJICBjb25uZWN0KHNhdmVBc0FjdGlvbiwgU0lHTkFMKGFjdGl2YXRlZCgpKSwgU0xPVChzYXZlQ29uZmlnQXMoKSkpOworCVFBY3Rpb24gKnNpbmdsZVZpZXdBY3Rpb24gPSBuZXcgUUFjdGlvbigiU2luZ2xlIFZpZXciLCBRUGl4bWFwKHhwbV9zaW5nbGVfdmlldyksICJTcGxpdCBWaWV3IiwgMCwgdGhpcyk7CisJICBjb25uZWN0KHNpbmdsZVZpZXdBY3Rpb24sIFNJR05BTChhY3RpdmF0ZWQoKSksIFNMT1Qoc2hvd1NpbmdsZVZpZXcoKSkpOworCVFBY3Rpb24gKnNwbGl0Vmlld0FjdGlvbiA9IG5ldyBRQWN0aW9uKCJTcGxpdCBWaWV3IiwgUVBpeG1hcCh4cG1fc3BsaXRfdmlldyksICJTcGxpdCBWaWV3IiwgMCwgdGhpcyk7CisJICBjb25uZWN0KHNwbGl0Vmlld0FjdGlvbiwgU0lHTkFMKGFjdGl2YXRlZCgpKSwgU0xPVChzaG93U3BsaXRWaWV3KCkpKTsKKwlRQWN0aW9uICpmdWxsVmlld0FjdGlvbiA9IG5ldyBRQWN0aW9uKCJGdWxsIFZpZXciLCBRUGl4bWFwKHhwbV90cmVlX3ZpZXcpLCAiRnVsbCBWaWV3IiwgMCwgdGhpcyk7CisJICBjb25uZWN0KGZ1bGxWaWV3QWN0aW9uLCBTSUdOQUwoYWN0aXZhdGVkKCkpLCBTTE9UKHNob3dGdWxsVmlldygpKSk7CisKKwlRQWN0aW9uICpzaG93TmFtZUFjdGlvbiA9IG5ldyBRQWN0aW9uKE5VTEwsICJTaG93IE5hbWUiLCAwLCB0aGlzKTsKKwkgIHNob3dOYW1lQWN0aW9uLT5zZXRUb2dnbGVBY3Rpb24oVFJVRSk7CisJICBzaG93TmFtZUFjdGlvbi0+c2V0T24oY29uZmlnTGlzdC0+c2hvd05hbWUpOworCSAgY29ubmVjdChzaG93TmFtZUFjdGlvbiwgU0lHTkFMKHRvZ2dsZWQoYm9vbCkpLCBTTE9UKHNldFNob3dOYW1lKGJvb2wpKSk7CisJUUFjdGlvbiAqc2hvd1JhbmdlQWN0aW9uID0gbmV3IFFBY3Rpb24oTlVMTCwgIlNob3cgUmFuZ2UiLCAwLCB0aGlzKTsKKwkgIHNob3dSYW5nZUFjdGlvbi0+c2V0VG9nZ2xlQWN0aW9uKFRSVUUpOworCSAgc2hvd1JhbmdlQWN0aW9uLT5zZXRPbihjb25maWdMaXN0LT5zaG93UmFuZ2UpOworCSAgY29ubmVjdChzaG93UmFuZ2VBY3Rpb24sIFNJR05BTCh0b2dnbGVkKGJvb2wpKSwgU0xPVChzZXRTaG93UmFuZ2UoYm9vbCkpKTsKKwlRQWN0aW9uICpzaG93RGF0YUFjdGlvbiA9IG5ldyBRQWN0aW9uKE5VTEwsICJTaG93IERhdGEiLCAwLCB0aGlzKTsKKwkgIHNob3dEYXRhQWN0aW9uLT5zZXRUb2dnbGVBY3Rpb24oVFJVRSk7CisJICBzaG93RGF0YUFjdGlvbi0+c2V0T24oY29uZmlnTGlzdC0+c2hvd0RhdGEpOworCSAgY29ubmVjdChzaG93RGF0YUFjdGlvbiwgU0lHTkFMKHRvZ2dsZWQoYm9vbCkpLCBTTE9UKHNldFNob3dEYXRhKGJvb2wpKSk7CisJUUFjdGlvbiAqc2hvd0FsbEFjdGlvbiA9IG5ldyBRQWN0aW9uKE5VTEwsICJTaG93IEFsbCBPcHRpb25zIiwgMCwgdGhpcyk7CisJICBzaG93QWxsQWN0aW9uLT5zZXRUb2dnbGVBY3Rpb24oVFJVRSk7CisJICBzaG93QWxsQWN0aW9uLT5zZXRPbihjb25maWdMaXN0LT5zaG93QWxsKTsKKwkgIGNvbm5lY3Qoc2hvd0FsbEFjdGlvbiwgU0lHTkFMKHRvZ2dsZWQoYm9vbCkpLCBTTE9UKHNldFNob3dBbGwoYm9vbCkpKTsKKwlRQWN0aW9uICpzaG93RGVidWdBY3Rpb24gPSBuZXcgUUFjdGlvbihOVUxMLCAiU2hvdyBEZWJ1ZyBJbmZvIiwgMCwgdGhpcyk7CisJICBzaG93RGVidWdBY3Rpb24tPnNldFRvZ2dsZUFjdGlvbihUUlVFKTsKKwkgIHNob3dEZWJ1Z0FjdGlvbi0+c2V0T24oc2hvd0RlYnVnKTsKKwkgIGNvbm5lY3Qoc2hvd0RlYnVnQWN0aW9uLCBTSUdOQUwodG9nZ2xlZChib29sKSksIFNMT1Qoc2V0U2hvd0RlYnVnKGJvb2wpKSk7CisKKwlRQWN0aW9uICpzaG93SW50cm9BY3Rpb24gPSBuZXcgUUFjdGlvbihOVUxMLCAiSW50cm9kdWN0aW9uIiwgMCwgdGhpcyk7CisJICBjb25uZWN0KHNob3dJbnRyb0FjdGlvbiwgU0lHTkFMKGFjdGl2YXRlZCgpKSwgU0xPVChzaG93SW50cm8oKSkpOworCVFBY3Rpb24gKnNob3dBYm91dEFjdGlvbiA9IG5ldyBRQWN0aW9uKE5VTEwsICJBYm91dCIsIDAsIHRoaXMpOworCSAgY29ubmVjdChzaG93QWJvdXRBY3Rpb24sIFNJR05BTChhY3RpdmF0ZWQoKSksIFNMT1Qoc2hvd0Fib3V0KCkpKTsKKworCS8vIGluaXQgdG9vbCBiYXIKKwliYWNrQWN0aW9uLT5hZGRUbyh0b29sQmFyKTsKKwl0b29sQmFyLT5hZGRTZXBhcmF0b3IoKTsKKwlsb2FkQWN0aW9uLT5hZGRUbyh0b29sQmFyKTsKKwlzYXZlQWN0aW9uLT5hZGRUbyh0b29sQmFyKTsKKwl0b29sQmFyLT5hZGRTZXBhcmF0b3IoKTsKKwlzaW5nbGVWaWV3QWN0aW9uLT5hZGRUbyh0b29sQmFyKTsKKwlzcGxpdFZpZXdBY3Rpb24tPmFkZFRvKHRvb2xCYXIpOworCWZ1bGxWaWV3QWN0aW9uLT5hZGRUbyh0b29sQmFyKTsKKworCS8vIGNyZWF0ZSBjb25maWcgbWVudQorCVFQb3B1cE1lbnUqIGNvbmZpZyA9IG5ldyBRUG9wdXBNZW51KHRoaXMpOworCW1lbnUtPmluc2VydEl0ZW0oIiZGaWxlIiwgY29uZmlnKTsKKwlsb2FkQWN0aW9uLT5hZGRUbyhjb25maWcpOworCXNhdmVBY3Rpb24tPmFkZFRvKGNvbmZpZyk7CisJc2F2ZUFzQWN0aW9uLT5hZGRUbyhjb25maWcpOworCWNvbmZpZy0+aW5zZXJ0U2VwYXJhdG9yKCk7CisJcXVpdEFjdGlvbi0+YWRkVG8oY29uZmlnKTsKKworCS8vIGNyZWF0ZSBvcHRpb25zIG1lbnUKKwlRUG9wdXBNZW51KiBvcHRpb25NZW51ID0gbmV3IFFQb3B1cE1lbnUodGhpcyk7CisJbWVudS0+aW5zZXJ0SXRlbSgiJk9wdGlvbiIsIG9wdGlvbk1lbnUpOworCXNob3dOYW1lQWN0aW9uLT5hZGRUbyhvcHRpb25NZW51KTsKKwlzaG93UmFuZ2VBY3Rpb24tPmFkZFRvKG9wdGlvbk1lbnUpOworCXNob3dEYXRhQWN0aW9uLT5hZGRUbyhvcHRpb25NZW51KTsKKwlvcHRpb25NZW51LT5pbnNlcnRTZXBhcmF0b3IoKTsKKwlzaG93QWxsQWN0aW9uLT5hZGRUbyhvcHRpb25NZW51KTsKKwlzaG93RGVidWdBY3Rpb24tPmFkZFRvKG9wdGlvbk1lbnUpOworCisJLy8gY3JlYXRlIGhlbHAgbWVudQorCVFQb3B1cE1lbnUqIGhlbHBNZW51ID0gbmV3IFFQb3B1cE1lbnUodGhpcyk7CisJbWVudS0+aW5zZXJ0U2VwYXJhdG9yKCk7CisJbWVudS0+aW5zZXJ0SXRlbSgiJkhlbHAiLCBoZWxwTWVudSk7CisJc2hvd0ludHJvQWN0aW9uLT5hZGRUbyhoZWxwTWVudSk7CisJc2hvd0Fib3V0QWN0aW9uLT5hZGRUbyhoZWxwTWVudSk7CisKKwljb25uZWN0KGNvbmZpZ0xpc3QsIFNJR05BTChtZW51U2VsZWN0ZWQoc3RydWN0IG1lbnUgKikpLAorCQlTTE9UKGNoYW5nZU1lbnUoc3RydWN0IG1lbnUgKikpKTsKKwljb25uZWN0KGNvbmZpZ0xpc3QsIFNJR05BTChwYXJlbnRTZWxlY3RlZCgpKSwKKwkJU0xPVChnb0JhY2soKSkpOworCWNvbm5lY3QobWVudUxpc3QsIFNJR05BTChtZW51U2VsZWN0ZWQoc3RydWN0IG1lbnUgKikpLAorCQlTTE9UKGNoYW5nZU1lbnUoc3RydWN0IG1lbnUgKikpKTsKKworCWNvbm5lY3QoY29uZmlnTGlzdCwgU0lHTkFMKGdvdEZvY3VzKHZvaWQpKSwKKwkJU0xPVChsaXN0Rm9jdXNDaGFuZ2VkKHZvaWQpKSk7CisJY29ubmVjdChtZW51TGlzdCwgU0lHTkFMKGdvdEZvY3VzKHZvaWQpKSwKKwkJU0xPVChsaXN0Rm9jdXNDaGFuZ2VkKHZvaWQpKSk7CisKKyNpZiBRVF9WRVJTSU9OID49IDMwMAorCVFTdHJpbmcgbGlzdE1vZGUgPSBjb25maWdTZXR0aW5ncy0+cmVhZEVudHJ5KCIva2NvbmZpZy9xY29uZi9saXN0TW9kZSIsICJzeW1ib2wiKTsKKwlpZiAobGlzdE1vZGUgPT0gInNpbmdsZSIpCisJCXNob3dTaW5nbGVWaWV3KCk7CisJZWxzZSBpZiAobGlzdE1vZGUgPT0gImZ1bGwiKQorCQlzaG93RnVsbFZpZXcoKTsKKwllbHNlIC8qaWYgKGxpc3RNb2RlID09ICJzcGxpdCIpKi8KKwkJc2hvd1NwbGl0VmlldygpOworCisJLy8gVUkgc2V0dXAgZG9uZSwgcmVzdG9yZSBzcGxpdHRlciBwb3NpdGlvbnMKKwlRVmFsdWVMaXN0PGludD4gc2l6ZXMgPSBjb25maWdTZXR0aW5ncy0+cmVhZFNpemVzKCIva2NvbmZpZy9xY29uZi9zcGxpdDEiLCAmb2spOworCWlmIChvaykKKwkJc3BsaXQxLT5zZXRTaXplcyhzaXplcyk7CisKKwlzaXplcyA9IGNvbmZpZ1NldHRpbmdzLT5yZWFkU2l6ZXMoIi9rY29uZmlnL3Fjb25mL3NwbGl0MiIsICZvayk7CisJaWYgKG9rKQorCQlzcGxpdDItPnNldFNpemVzKHNpemVzKTsKKyNlbHNlCisJc2hvd1NwbGl0VmlldygpOworI2VuZGlmCisJZGVsZXRlIGNvbmZpZ1NldHRpbmdzOworfQorCitzdGF0aWMgUVN0cmluZyBwcmludF9maWx0ZXIoY29uc3QgY2hhciAqc3RyKQoreworCVFSZWdFeHAgcmUoIls8PiZcIlxcbl0iKTsKKwlRU3RyaW5nIHJlcyA9IHN0cjsKKwlmb3IgKGludCBpID0gMDsgKGkgPSByZXMuZmluZChyZSwgaSkpID49IDA7KSB7CisJCXN3aXRjaCAocmVzW2ldLmxhdGluMSgpKSB7CisJCWNhc2UgJzwnOgorCQkJcmVzLnJlcGxhY2UoaSwgMSwgIiZsdDsiKTsKKwkJCWkgKz0gNDsKKwkJCWJyZWFrOworCQljYXNlICc+JzoKKwkJCXJlcy5yZXBsYWNlKGksIDEsICImZ3Q7Iik7CisJCQlpICs9IDQ7CisJCQlicmVhazsKKwkJY2FzZSAnJic6CisJCQlyZXMucmVwbGFjZShpLCAxLCAiJmFtcDsiKTsKKwkJCWkgKz0gNTsKKwkJCWJyZWFrOworCQljYXNlICciJzoKKwkJCXJlcy5yZXBsYWNlKGksIDEsICImcXVvdDsiKTsKKwkJCWkgKz0gNjsKKwkJCWJyZWFrOworCQljYXNlICdcbic6CisJCQlyZXMucmVwbGFjZShpLCAxLCAiPGJyPiIpOworCQkJaSArPSA0OworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHZvaWQgZXhwcl9wcmludF9oZWxwKHZvaWQgKmRhdGEsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwkoKFFTdHJpbmcqKWRhdGEpLT5hcHBlbmQocHJpbnRfZmlsdGVyKHN0cikpOworfQorCisvKgorICogZGlzcGxheSBhIG5ldyBoZWxwIGVudHJ5IGFzIHNvb24gYXMgYSBuZXcgbWVudSBlbnRyeSBpcyBzZWxlY3RlZAorICovCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OnNldEhlbHAoUUxpc3RWaWV3SXRlbSogaXRlbSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sKiBzeW07CisJc3RydWN0IG1lbnUqIG1lbnUgPSAwOworCisJY29uZmlnTGlzdC0+cGFyZW50KCktPmxpbmVFZGl0LT5oaWRlKCk7CisJaWYgKGl0ZW0pCisJCW1lbnUgPSAoKENvbmZpZ0l0ZW0qKWl0ZW0pLT5tZW51OworCWlmICghbWVudSkgeworCQloZWxwVGV4dC0+c2V0VGV4dChOVUxMKTsKKwkJcmV0dXJuOworCX0KKworCVFTdHJpbmcgaGVhZCwgZGVidWcsIGhlbHA7CisJbWVudSA9ICgoQ29uZmlnSXRlbSopaXRlbSktPm1lbnU7CisJc3ltID0gbWVudS0+c3ltOworCWlmIChzeW0pIHsKKwkJaWYgKG1lbnUtPnByb21wdCkgeworCQkJaGVhZCArPSAiPGJpZz48Yj4iOworCQkJaGVhZCArPSBwcmludF9maWx0ZXIobWVudS0+cHJvbXB0LT50ZXh0KTsKKwkJCWhlYWQgKz0gIjwvYj48L2JpZz4iOworCQkJaWYgKHN5bS0+bmFtZSkgeworCQkJCWhlYWQgKz0gIiAoIjsKKwkJCQloZWFkICs9IHByaW50X2ZpbHRlcihzeW0tPm5hbWUpOworCQkJCWhlYWQgKz0gIikiOworCQkJfQorCQl9IGVsc2UgaWYgKHN5bS0+bmFtZSkgeworCQkJaGVhZCArPSAiPGJpZz48Yj4iOworCQkJaGVhZCArPSBwcmludF9maWx0ZXIoc3ltLT5uYW1lKTsKKwkJCWhlYWQgKz0gIjwvYj48L2JpZz4iOworCQl9CisJCWhlYWQgKz0gIjxicj48YnI+IjsKKworCQlpZiAoc2hvd0RlYnVnKSB7CisJCQlkZWJ1ZyArPSAidHlwZTogIjsKKwkJCWRlYnVnICs9IHByaW50X2ZpbHRlcihzeW1fdHlwZV9uYW1lKHN5bS0+dHlwZSkpOworCQkJaWYgKHN5bV9pc19jaG9pY2Uoc3ltKSkKKwkJCQlkZWJ1ZyArPSAiIChjaG9pY2UpIjsKKwkJCWRlYnVnICs9ICI8YnI+IjsKKwkJCWlmIChzeW0tPnJldl9kZXAuZXhwcikgeworCQkJCWRlYnVnICs9ICJyZXZlcnNlIGRlcDogIjsKKwkJCQlleHByX3ByaW50KHN5bS0+cmV2X2RlcC5leHByLCBleHByX3ByaW50X2hlbHAsICZkZWJ1ZywgRV9OT05FKTsKKwkJCQlkZWJ1ZyArPSAiPGJyPiI7CisJCQl9CisJCQlmb3IgKHN0cnVjdCBwcm9wZXJ0eSAqcHJvcCA9IHN5bS0+cHJvcDsgcHJvcDsgcHJvcCA9IHByb3AtPm5leHQpIHsKKwkJCQlzd2l0Y2ggKHByb3AtPnR5cGUpIHsKKwkJCQljYXNlIFBfUFJPTVBUOgorCQkJCWNhc2UgUF9NRU5VOgorCQkJCQlkZWJ1ZyArPSAicHJvbXB0OiAiOworCQkJCQlkZWJ1ZyArPSBwcmludF9maWx0ZXIocHJvcC0+dGV4dCk7CisJCQkJCWRlYnVnICs9ICI8YnI+IjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBQX0RFRkFVTFQ6CisJCQkJCWRlYnVnICs9ICJkZWZhdWx0OiAiOworCQkJCQlleHByX3ByaW50KHByb3AtPmV4cHIsIGV4cHJfcHJpbnRfaGVscCwgJmRlYnVnLCBFX05PTkUpOworCQkJCQlkZWJ1ZyArPSAiPGJyPiI7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUF9DSE9JQ0U6CisJCQkJCWlmIChzeW1faXNfY2hvaWNlKHN5bSkpIHsKKwkJCQkJCWRlYnVnICs9ICJjaG9pY2U6ICI7CisJCQkJCQlleHByX3ByaW50KHByb3AtPmV4cHIsIGV4cHJfcHJpbnRfaGVscCwgJmRlYnVnLCBFX05PTkUpOworCQkJCQkJZGVidWcgKz0gIjxicj4iOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgUF9TRUxFQ1Q6CisJCQkJCWRlYnVnICs9ICJzZWxlY3Q6ICI7CisJCQkJCWV4cHJfcHJpbnQocHJvcC0+ZXhwciwgZXhwcl9wcmludF9oZWxwLCAmZGVidWcsIEVfTk9ORSk7CisJCQkJCWRlYnVnICs9ICI8YnI+IjsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBQX1JBTkdFOgorCQkJCQlkZWJ1ZyArPSAicmFuZ2U6ICI7CisJCQkJCWV4cHJfcHJpbnQocHJvcC0+ZXhwciwgZXhwcl9wcmludF9oZWxwLCAmZGVidWcsIEVfTk9ORSk7CisJCQkJCWRlYnVnICs9ICI8YnI+IjsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJZGVidWcgKz0gInVua25vd24gcHJvcGVydHk6ICI7CisJCQkJCWRlYnVnICs9IHByb3BfZ2V0X3R5cGVfbmFtZShwcm9wLT50eXBlKTsKKwkJCQkJZGVidWcgKz0gIjxicj4iOworCQkJCX0KKwkJCQlpZiAocHJvcC0+dmlzaWJsZS5leHByKSB7CisJCQkJCWRlYnVnICs9ICImbmJzcDsmbmJzcDsmbmJzcDsmbmJzcDtkZXA6ICI7CisJCQkJCWV4cHJfcHJpbnQocHJvcC0+dmlzaWJsZS5leHByLCBleHByX3ByaW50X2hlbHAsICZkZWJ1ZywgRV9OT05FKTsKKwkJCQkJZGVidWcgKz0gIjxicj4iOworCQkJCX0KKwkJCX0KKwkJCWRlYnVnICs9ICI8YnI+IjsKKwkJfQorCisJCWhlbHAgPSBwcmludF9maWx0ZXIoc3ltLT5oZWxwKTsKKwl9IGVsc2UgaWYgKG1lbnUtPnByb21wdCkgeworCQloZWFkICs9ICI8YmlnPjxiPiI7CisJCWhlYWQgKz0gcHJpbnRfZmlsdGVyKG1lbnUtPnByb21wdC0+dGV4dCk7CisJCWhlYWQgKz0gIjwvYj48L2JpZz48YnI+PGJyPiI7CisJCWlmIChzaG93RGVidWcpIHsKKwkJCWlmIChtZW51LT5wcm9tcHQtPnZpc2libGUuZXhwcikgeworCQkJCWRlYnVnICs9ICImbmJzcDsmbmJzcDtkZXA6ICI7CisJCQkJZXhwcl9wcmludChtZW51LT5wcm9tcHQtPnZpc2libGUuZXhwciwgZXhwcl9wcmludF9oZWxwLCAmZGVidWcsIEVfTk9ORSk7CisJCQkJZGVidWcgKz0gIjxicj48YnI+IjsKKwkJCX0KKwkJfQorCX0KKwlpZiAoc2hvd0RlYnVnKQorCQlkZWJ1ZyArPSBRU3RyaW5nKCkuc3ByaW50ZigiZGVmaW5lZCBhdCAlczolZDxicj48YnI+IiwgbWVudS0+ZmlsZS0+bmFtZSwgbWVudS0+bGluZW5vKTsKKwloZWxwVGV4dC0+c2V0VGV4dChoZWFkICsgZGVidWcgKyBoZWxwKTsKK30KKwordm9pZCBDb25maWdNYWluV2luZG93Ojpsb2FkQ29uZmlnKHZvaWQpCit7CisJUVN0cmluZyBzID0gUUZpbGVEaWFsb2c6OmdldE9wZW5GaWxlTmFtZSgiLmNvbmZpZyIsIE5VTEwsIHRoaXMpOworCWlmIChzLmlzTnVsbCgpKQorCQlyZXR1cm47CisJaWYgKGNvbmZfcmVhZChzLmxhdGluMSgpKSkKKwkJUU1lc3NhZ2VCb3g6OmluZm9ybWF0aW9uKHRoaXMsICJxY29uZiIsICJVbmFibGUgdG8gbG9hZCBjb25maWd1cmF0aW9uISIpOworCUNvbmZpZ1ZpZXc6OnVwZGF0ZUxpc3RBbGwoKTsKK30KKwordm9pZCBDb25maWdNYWluV2luZG93OjpzYXZlQ29uZmlnKHZvaWQpCit7CisJaWYgKGNvbmZfd3JpdGUoTlVMTCkpCisJCVFNZXNzYWdlQm94OjppbmZvcm1hdGlvbih0aGlzLCAicWNvbmYiLCAiVW5hYmxlIHRvIHNhdmUgY29uZmlndXJhdGlvbiEiKTsKK30KKwordm9pZCBDb25maWdNYWluV2luZG93OjpzYXZlQ29uZmlnQXModm9pZCkKK3sKKwlRU3RyaW5nIHMgPSBRRmlsZURpYWxvZzo6Z2V0U2F2ZUZpbGVOYW1lKCIuY29uZmlnIiwgTlVMTCwgdGhpcyk7CisJaWYgKHMuaXNOdWxsKCkpCisJCXJldHVybjsKKwlpZiAoY29uZl93cml0ZShzLmxhdGluMSgpKSkKKwkJUU1lc3NhZ2VCb3g6OmluZm9ybWF0aW9uKHRoaXMsICJxY29uZiIsICJVbmFibGUgdG8gc2F2ZSBjb25maWd1cmF0aW9uISIpOworfQorCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OmNoYW5nZU1lbnUoc3RydWN0IG1lbnUgKm1lbnUpCit7CisJY29uZmlnTGlzdC0+c2V0Um9vdE1lbnUobWVudSk7CisJYmFja0FjdGlvbi0+c2V0RW5hYmxlZChUUlVFKTsKK30KKwordm9pZCBDb25maWdNYWluV2luZG93OjpsaXN0Rm9jdXNDaGFuZ2VkKHZvaWQpCit7CisJaWYgKG1lbnVMaXN0LT5oYXNGb2N1cygpKSB7CisJCWlmIChtZW51TGlzdC0+bW9kZSA9PSBtZW51TW9kZSkKKwkJCWNvbmZpZ0xpc3QtPmNsZWFyU2VsZWN0aW9uKCk7CisJCXNldEhlbHAobWVudUxpc3QtPnNlbGVjdGVkSXRlbSgpKTsKKwl9IGVsc2UgaWYgKGNvbmZpZ0xpc3QtPmhhc0ZvY3VzKCkpIHsKKwkJc2V0SGVscChjb25maWdMaXN0LT5zZWxlY3RlZEl0ZW0oKSk7CisJfQorfQorCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OmdvQmFjayh2b2lkKQoreworCUNvbmZpZ0l0ZW0qIGl0ZW07CisKKwljb25maWdMaXN0LT5zZXRQYXJlbnRNZW51KCk7CisJaWYgKGNvbmZpZ0xpc3QtPnJvb3RFbnRyeSA9PSAmcm9vdG1lbnUpCisJCWJhY2tBY3Rpb24tPnNldEVuYWJsZWQoRkFMU0UpOworCWl0ZW0gPSAoQ29uZmlnSXRlbSopbWVudUxpc3QtPnNlbGVjdGVkSXRlbSgpOworCXdoaWxlIChpdGVtKSB7CisJCWlmIChpdGVtLT5tZW51ID09IGNvbmZpZ0xpc3QtPnJvb3RFbnRyeSkgeworCQkJbWVudUxpc3QtPnNldFNlbGVjdGVkKGl0ZW0sIFRSVUUpOworCQkJYnJlYWs7CisJCX0KKwkJaXRlbSA9IChDb25maWdJdGVtKilpdGVtLT5wYXJlbnQoKTsKKwl9Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6c2hvd1NpbmdsZVZpZXcodm9pZCkKK3sKKwltZW51Vmlldy0+aGlkZSgpOworCW1lbnVMaXN0LT5zZXRSb290TWVudSgwKTsKKwljb25maWdMaXN0LT5tb2RlID0gc2luZ2xlTW9kZTsKKwlpZiAoY29uZmlnTGlzdC0+cm9vdEVudHJ5ID09ICZyb290bWVudSkKKwkJY29uZmlnTGlzdC0+dXBkYXRlTGlzdEFsbCgpOworCWVsc2UKKwkJY29uZmlnTGlzdC0+c2V0Um9vdE1lbnUoJnJvb3RtZW51KTsKKwljb25maWdMaXN0LT5zZXRBbGxPcGVuKFRSVUUpOworCWNvbmZpZ0xpc3QtPnNldEZvY3VzKCk7Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6c2hvd1NwbGl0Vmlldyh2b2lkKQoreworCWNvbmZpZ0xpc3QtPm1vZGUgPSBzeW1ib2xNb2RlOworCWlmIChjb25maWdMaXN0LT5yb290RW50cnkgPT0gJnJvb3RtZW51KQorCQljb25maWdMaXN0LT51cGRhdGVMaXN0QWxsKCk7CisJZWxzZQorCQljb25maWdMaXN0LT5zZXRSb290TWVudSgmcm9vdG1lbnUpOworCWNvbmZpZ0xpc3QtPnNldEFsbE9wZW4oVFJVRSk7CisJY29uZmlnQXBwLT5wcm9jZXNzRXZlbnRzKCk7CisJbWVudUxpc3QtPm1vZGUgPSBtZW51TW9kZTsKKwltZW51TGlzdC0+c2V0Um9vdE1lbnUoJnJvb3RtZW51KTsKKwltZW51TGlzdC0+c2V0QWxsT3BlbihUUlVFKTsKKwltZW51Vmlldy0+c2hvdygpOworCW1lbnVMaXN0LT5zZXRGb2N1cygpOworfQorCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OnNob3dGdWxsVmlldyh2b2lkKQoreworCW1lbnVWaWV3LT5oaWRlKCk7CisJbWVudUxpc3QtPnNldFJvb3RNZW51KDApOworCWNvbmZpZ0xpc3QtPm1vZGUgPSBmdWxsTW9kZTsKKwlpZiAoY29uZmlnTGlzdC0+cm9vdEVudHJ5ID09ICZyb290bWVudSkKKwkJY29uZmlnTGlzdC0+dXBkYXRlTGlzdEFsbCgpOworCWVsc2UKKwkJY29uZmlnTGlzdC0+c2V0Um9vdE1lbnUoJnJvb3RtZW51KTsKKwljb25maWdMaXN0LT5zZXRBbGxPcGVuKEZBTFNFKTsKKwljb25maWdMaXN0LT5zZXRGb2N1cygpOworfQorCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OnNldFNob3dBbGwoYm9vbCBiKQoreworCWlmIChjb25maWdMaXN0LT5zaG93QWxsID09IGIpCisJCXJldHVybjsKKwljb25maWdMaXN0LT5zaG93QWxsID0gYjsKKwljb25maWdMaXN0LT51cGRhdGVMaXN0QWxsKCk7CisJbWVudUxpc3QtPnNob3dBbGwgPSBiOworCW1lbnVMaXN0LT51cGRhdGVMaXN0QWxsKCk7Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6c2V0U2hvd0RlYnVnKGJvb2wgYikKK3sKKwlpZiAoc2hvd0RlYnVnID09IGIpCisJCXJldHVybjsKKwlzaG93RGVidWcgPSBiOworfQorCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OnNldFNob3dOYW1lKGJvb2wgYikKK3sKKwlpZiAoY29uZmlnTGlzdC0+c2hvd05hbWUgPT0gYikKKwkJcmV0dXJuOworCWNvbmZpZ0xpc3QtPnNob3dOYW1lID0gYjsKKwljb25maWdMaXN0LT5yZWluaXQoKTsKKwltZW51TGlzdC0+c2hvd05hbWUgPSBiOworCW1lbnVMaXN0LT5yZWluaXQoKTsKK30KKwordm9pZCBDb25maWdNYWluV2luZG93OjpzZXRTaG93UmFuZ2UoYm9vbCBiKQoreworCWlmIChjb25maWdMaXN0LT5zaG93UmFuZ2UgPT0gYikKKwkJcmV0dXJuOworCWNvbmZpZ0xpc3QtPnNob3dSYW5nZSA9IGI7CisJY29uZmlnTGlzdC0+cmVpbml0KCk7CisJbWVudUxpc3QtPnNob3dSYW5nZSA9IGI7CisJbWVudUxpc3QtPnJlaW5pdCgpOworfQorCit2b2lkIENvbmZpZ01haW5XaW5kb3c6OnNldFNob3dEYXRhKGJvb2wgYikKK3sKKwlpZiAoY29uZmlnTGlzdC0+c2hvd0RhdGEgPT0gYikKKwkJcmV0dXJuOworCWNvbmZpZ0xpc3QtPnNob3dEYXRhID0gYjsKKwljb25maWdMaXN0LT5yZWluaXQoKTsKKwltZW51TGlzdC0+c2hvd0RhdGEgPSBiOworCW1lbnVMaXN0LT5yZWluaXQoKTsKK30KKworLyoKKyAqIGFzayBmb3Igc2F2aW5nIGNvbmZpZ3VyYXRpb24gYmVmb3JlIHF1aXR0aW5nCisgKiBUT0RPIGFzayBvbmx5IHdoZW4gc29tZXRoaW5nIGNoYW5nZWQKKyAqLwordm9pZCBDb25maWdNYWluV2luZG93OjpjbG9zZUV2ZW50KFFDbG9zZUV2ZW50KiBlKQoreworCWlmICghc3ltX2NoYW5nZV9jb3VudCkgeworCQllLT5hY2NlcHQoKTsKKwkJcmV0dXJuOworCX0KKwlRTWVzc2FnZUJveCBtYigicWNvbmYiLCAiU2F2ZSBjb25maWd1cmF0aW9uPyIsIFFNZXNzYWdlQm94OjpXYXJuaW5nLAorCQkJUU1lc3NhZ2VCb3g6OlllcyB8IFFNZXNzYWdlQm94OjpEZWZhdWx0LCBRTWVzc2FnZUJveDo6Tm8sIFFNZXNzYWdlQm94OjpDYW5jZWwgfCBRTWVzc2FnZUJveDo6RXNjYXBlKTsKKwltYi5zZXRCdXR0b25UZXh0KFFNZXNzYWdlQm94OjpZZXMsICImU2F2ZSBDaGFuZ2VzIik7CisJbWIuc2V0QnV0dG9uVGV4dChRTWVzc2FnZUJveDo6Tm8sICImRGlzY2FyZCBDaGFuZ2VzIik7CisJbWIuc2V0QnV0dG9uVGV4dChRTWVzc2FnZUJveDo6Q2FuY2VsLCAiQ2FuY2VsIEV4aXQiKTsKKwlzd2l0Y2ggKG1iLmV4ZWMoKSkgeworCWNhc2UgUU1lc3NhZ2VCb3g6OlllczoKKwkJY29uZl93cml0ZShOVUxMKTsKKwljYXNlIFFNZXNzYWdlQm94OjpObzoKKwkJZS0+YWNjZXB0KCk7CisJCWJyZWFrOworCWNhc2UgUU1lc3NhZ2VCb3g6OkNhbmNlbDoKKwkJZS0+aWdub3JlKCk7CisJCWJyZWFrOworCX0KK30KKwordm9pZCBDb25maWdNYWluV2luZG93OjpzaG93SW50cm8odm9pZCkKK3sKKwlzdGF0aWMgY2hhciBzdHJbXSA9ICJXZWxjb21lIHRvIHRoZSBxY29uZiBncmFwaGljYWwga2VybmVsIGNvbmZpZ3VyYXRpb24gdG9vbCBmb3IgTGludXguXG5cbiIKKwkJIkZvciBlYWNoIG9wdGlvbiwgYSBibGFuayBib3ggaW5kaWNhdGVzIHRoZSBmZWF0dXJlIGlzIGRpc2FibGVkLCBhIGNoZWNrXG4iCisJCSJpbmRpY2F0ZXMgaXQgaXMgZW5hYmxlZCwgYW5kIGEgZG90IGluZGljYXRlcyB0aGF0IGl0IGlzIHRvIGJlIGNvbXBpbGVkXG4iCisJCSJhcyBhIG1vZHVsZS4gIENsaWNraW5nIG9uIHRoZSBib3ggd2lsbCBjeWNsZSB0aHJvdWdoIHRoZSB0aHJlZSBzdGF0ZXMuXG5cbiIKKwkJIklmIHlvdSBkbyBub3Qgc2VlIGFuIG9wdGlvbiAoZS5nLiwgYSBkZXZpY2UgZHJpdmVyKSB0aGF0IHlvdSBiZWxpZXZlXG4iCisJCSJzaG91bGQgYmUgcHJlc2VudCwgdHJ5IHR1cm5pbmcgb24gU2hvdyBBbGwgT3B0aW9ucyB1bmRlciB0aGUgT3B0aW9ucyBtZW51LlxuIgorCQkiQWx0aG91Z2ggdGhlcmUgaXMgbm8gY3Jvc3MgcmVmZXJlbmNlIHlldCB0byBoZWxwIHlvdSBmaWd1cmUgb3V0IHdoYXQgb3RoZXJcbiIKKwkJIm9wdGlvbnMgbXVzdCBiZSBlbmFibGVkIHRvIHN1cHBvcnQgdGhlIG9wdGlvbiB5b3UgYXJlIGludGVyZXN0ZWQgaW4sIHlvdSBjYW5cbiIKKwkJInN0aWxsIHZpZXcgdGhlIGhlbHAgb2YgYSBncmF5ZWQtb3V0IG9wdGlvbi5cblxuIgorCQkiVG9nZ2xpbmcgU2hvdyBEZWJ1ZyBJbmZvIHVuZGVyIHRoZSBPcHRpb25zIG1lbnUgd2lsbCBzaG93IHRoZSBkZXBlbmRlbmNpZXMsXG4iCisJCSJ3aGljaCB5b3UgY2FuIHRoZW4gbWF0Y2ggYnkgZXhhbWluaW5nIG90aGVyIG9wdGlvbnMuXG5cbiI7CisKKwlRTWVzc2FnZUJveDo6aW5mb3JtYXRpb24odGhpcywgInFjb25mIiwgc3RyKTsKK30KKwordm9pZCBDb25maWdNYWluV2luZG93OjpzaG93QWJvdXQodm9pZCkKK3sKKwlzdGF0aWMgY2hhciBzdHJbXSA9ICJxY29uZiBpcyBDb3B5cmlnaHQgKEMpIDIwMDIgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+LlxuXG4iCisJCSJCdWcgcmVwb3J0cyBhbmQgZmVhdHVyZSByZXF1ZXN0IGNhbiBhbHNvIGJlIGVudGVyZWQgYXQgaHR0cDovL2J1Z3ppbGxhLmtlcm5lbC5vcmcvXG4iOworCisJUU1lc3NhZ2VCb3g6OmluZm9ybWF0aW9uKHRoaXMsICJxY29uZiIsIHN0cik7Cit9CisKK3ZvaWQgQ29uZmlnTWFpbldpbmRvdzo6c2F2ZVNldHRpbmdzKHZvaWQpCit7CisjaWYgUVRfVkVSU0lPTiA+PSAzMDAKKwlDb25maWdTZXR0aW5ncyAqY29uZmlnU2V0dGluZ3MgPSBuZXcgQ29uZmlnU2V0dGluZ3M7CisJY29uZmlnU2V0dGluZ3MtPndyaXRlRW50cnkoIi9rY29uZmlnL3Fjb25mL3dpbmRvdyB4IiwgcG9zKCkueCgpKTsKKwljb25maWdTZXR0aW5ncy0+d3JpdGVFbnRyeSgiL2tjb25maWcvcWNvbmYvd2luZG93IHkiLCBwb3MoKS55KCkpOworCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIva2NvbmZpZy9xY29uZi93aW5kb3cgd2lkdGgiLCBzaXplKCkud2lkdGgoKSk7CisJY29uZmlnU2V0dGluZ3MtPndyaXRlRW50cnkoIi9rY29uZmlnL3Fjb25mL3dpbmRvdyBoZWlnaHQiLCBzaXplKCkuaGVpZ2h0KCkpOworCWNvbmZpZ1NldHRpbmdzLT53cml0ZUVudHJ5KCIva2NvbmZpZy9xY29uZi9zaG93TmFtZSIsIGNvbmZpZ0xpc3QtPnNob3dOYW1lKTsKKwljb25maWdTZXR0aW5ncy0+d3JpdGVFbnRyeSgiL2tjb25maWcvcWNvbmYvc2hvd1JhbmdlIiwgY29uZmlnTGlzdC0+c2hvd1JhbmdlKTsKKwljb25maWdTZXR0aW5ncy0+d3JpdGVFbnRyeSgiL2tjb25maWcvcWNvbmYvc2hvd0RhdGEiLCBjb25maWdMaXN0LT5zaG93RGF0YSk7CisJY29uZmlnU2V0dGluZ3MtPndyaXRlRW50cnkoIi9rY29uZmlnL3Fjb25mL3Nob3dBbGwiLCBjb25maWdMaXN0LT5zaG93QWxsKTsKKwljb25maWdTZXR0aW5ncy0+d3JpdGVFbnRyeSgiL2tjb25maWcvcWNvbmYvc2hvd0RlYnVnIiwgc2hvd0RlYnVnKTsKKworCVFTdHJpbmcgZW50cnk7CisJc3dpdGNoKGNvbmZpZ0xpc3QtPm1vZGUpIHsKKwljYXNlIHNpbmdsZU1vZGUgOgorCQllbnRyeSA9ICJzaW5nbGUiOworCQlicmVhazsKKworCWNhc2Ugc3ltYm9sTW9kZSA6CisJCWVudHJ5ID0gInNwbGl0IjsKKwkJYnJlYWs7CisKKwljYXNlIGZ1bGxNb2RlIDoKKwkJZW50cnkgPSAiZnVsbCI7CisJCWJyZWFrOworCX0KKwljb25maWdTZXR0aW5ncy0+d3JpdGVFbnRyeSgiL2tjb25maWcvcWNvbmYvbGlzdE1vZGUiLCBlbnRyeSk7CisKKwljb25maWdTZXR0aW5ncy0+d3JpdGVTaXplcygiL2tjb25maWcvcWNvbmYvc3BsaXQxIiwgc3BsaXQxLT5zaXplcygpKTsKKwljb25maWdTZXR0aW5ncy0+d3JpdGVTaXplcygiL2tjb25maWcvcWNvbmYvc3BsaXQyIiwgc3BsaXQyLT5zaXplcygpKTsKKworCWRlbGV0ZSBjb25maWdTZXR0aW5nczsKKyNlbmRpZgorfQorCit2b2lkIGZpeHVwX3Jvb3RtZW51KHN0cnVjdCBtZW51ICptZW51KQoreworCXN0cnVjdCBtZW51ICpjaGlsZDsKKwlzdGF0aWMgaW50IG1lbnVfY250ID0gMDsKKworCW1lbnUtPmZsYWdzIHw9IE1FTlVfUk9PVDsKKwlmb3IgKGNoaWxkID0gbWVudS0+bGlzdDsgY2hpbGQ7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKwkJaWYgKGNoaWxkLT5wcm9tcHQgJiYgY2hpbGQtPnByb21wdC0+dHlwZSA9PSBQX01FTlUpIHsKKwkJCW1lbnVfY250Kys7CisJCQlmaXh1cF9yb290bWVudShjaGlsZCk7CisJCQltZW51X2NudC0tOworCQl9IGVsc2UgaWYgKCFtZW51X2NudCkKKwkJCWZpeHVwX3Jvb3RtZW51KGNoaWxkKTsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpwcm9nbmFtZTsKKworc3RhdGljIHZvaWQgdXNhZ2Uodm9pZCkKK3sKKwlwcmludGYoIiVzIDxjb25maWc+XG4iLCBwcm9nbmFtZSk7CisJZXhpdCgwKTsKK30KKworaW50IG1haW4oaW50IGFjLCBjaGFyKiogYXYpCit7CisJQ29uZmlnTWFpbldpbmRvdyogdjsKKwljb25zdCBjaGFyICpuYW1lOworCisjaWZuZGVmIExLQ19ESVJFQ1RfTElOSworCWtjb25maWdfbG9hZCgpOworI2VuZGlmCisKKwlwcm9nbmFtZSA9IGF2WzBdOworCWNvbmZpZ0FwcCA9IG5ldyBRQXBwbGljYXRpb24oYWMsIGF2KTsKKwlpZiAoYWMgPiAxICYmIGF2WzFdWzBdID09ICctJykgeworCQlzd2l0Y2ggKGF2WzFdWzFdKSB7CisJCWNhc2UgJ2gnOgorCQljYXNlICc/JzoKKwkJCXVzYWdlKCk7CisJCX0KKwkJbmFtZSA9IGF2WzJdOworCX0gZWxzZQorCQluYW1lID0gYXZbMV07CisJaWYgKCFuYW1lKQorCQl1c2FnZSgpOworCisJY29uZl9wYXJzZShuYW1lKTsKKwlmaXh1cF9yb290bWVudSgmcm9vdG1lbnUpOworCWNvbmZfcmVhZChOVUxMKTsKKwkvL3pjb25mZHVtcChzdGRvdXQpOworCisJdiA9IG5ldyBDb25maWdNYWluV2luZG93KCk7CisKKwkvL3pjb25mZHVtcChzdGRvdXQpOworCXYtPnNob3coKTsKKwljb25maWdBcHAtPmNvbm5lY3QoY29uZmlnQXBwLCBTSUdOQUwobGFzdFdpbmRvd0Nsb3NlZCgpKSwgU0xPVChxdWl0KCkpKTsKKwljb25maWdBcHAtPmNvbm5lY3QoY29uZmlnQXBwLCBTSUdOQUwoYWJvdXRUb1F1aXQoKSksIHYsIFNMT1Qoc2F2ZVNldHRpbmdzKCkpKTsKKwljb25maWdBcHAtPmV4ZWMoKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmggYi9zY3JpcHRzL2tjb25maWcvcWNvbmYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzAzOTI3Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL3Fjb25mLmgKQEAgLTAsMCArMSwyNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+CisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KKyAqLworCisjaW5jbHVkZSA8cWxpc3R2aWV3Lmg+CisjaWYgUVRfVkVSU0lPTiA+PSAzMDAKKyNpbmNsdWRlIDxxc2V0dGluZ3MuaD4KKyNlbHNlCitjbGFzcyBRU2V0dGluZ3MgeyB9OworI2VuZGlmCisKK2NsYXNzIENvbmZpZ0xpc3Q7CitjbGFzcyBDb25maWdJdGVtOworY2xhc3MgQ29uZmlnTGluZUVkaXQ7CitjbGFzcyBDb25maWdNYWluV2luZG93OworCisKK2NsYXNzIENvbmZpZ1NldHRpbmdzIDogcHVibGljIFFTZXR0aW5ncyB7CitwdWJsaWM6CisJQ29uZmlnU2V0dGluZ3MoKTsKKworI2lmIFFUX1ZFUlNJT04gPj0gMzAwCisJdm9pZCByZWFkTGlzdFNldHRpbmdzKCk7CisJUVZhbHVlTGlzdDxpbnQ+IENvbmZpZ1NldHRpbmdzOjpyZWFkU2l6ZXMoY29uc3QgUVN0cmluZyYga2V5LCBib29sICpvayk7CisJYm9vbCBDb25maWdTZXR0aW5nczo6d3JpdGVTaXplcyhjb25zdCBRU3RyaW5nJiBrZXksIGNvbnN0IFFWYWx1ZUxpc3Q8aW50PiYgdmFsdWUpOworI2VuZGlmCisKKwlib29sIHNob3dBbGw7CisJYm9vbCBzaG93TmFtZTsKKwlib29sIHNob3dSYW5nZTsKKwlib29sIHNob3dEYXRhOworfTsKKworY2xhc3MgQ29uZmlnVmlldyA6IHB1YmxpYyBRVkJveCB7CisJUV9PQkpFQ1QKKwl0eXBlZGVmIGNsYXNzIFFWQm94IFBhcmVudDsKK3B1YmxpYzoKKwlDb25maWdWaWV3KFFXaWRnZXQqIHBhcmVudCwgQ29uZmlnTWFpbldpbmRvdyogY3ZpZXcsIENvbmZpZ1NldHRpbmdzKiBjb25maWdTZXR0aW5ncyk7CisJfkNvbmZpZ1ZpZXcodm9pZCk7CisJc3RhdGljIHZvaWQgdXBkYXRlTGlzdChDb25maWdJdGVtKiBpdGVtKTsKKwlzdGF0aWMgdm9pZCB1cGRhdGVMaXN0QWxsKHZvaWQpOworCitwdWJsaWM6CisJQ29uZmlnTGlzdCogbGlzdDsKKwlDb25maWdMaW5lRWRpdCogbGluZUVkaXQ7CisKKwlzdGF0aWMgQ29uZmlnVmlldyogdmlld0xpc3Q7CisJQ29uZmlnVmlldyogbmV4dFZpZXc7Cit9OworCitlbnVtIGNvbElkeCB7CisJcHJvbXB0Q29sSWR4LCBuYW1lQ29sSWR4LCBub0NvbElkeCwgbW9kQ29sSWR4LCB5ZXNDb2xJZHgsIGRhdGFDb2xJZHgsIGNvbE5yCit9OworZW51bSBsaXN0TW9kZSB7CisJc2luZ2xlTW9kZSwgbWVudU1vZGUsIHN5bWJvbE1vZGUsIGZ1bGxNb2RlCit9OworCitjbGFzcyBDb25maWdMaXN0IDogcHVibGljIFFMaXN0VmlldyB7CisJUV9PQkpFQ1QKKwl0eXBlZGVmIGNsYXNzIFFMaXN0VmlldyBQYXJlbnQ7CitwdWJsaWM6CisJQ29uZmlnTGlzdChDb25maWdWaWV3KiBwLCBDb25maWdNYWluV2luZG93KiBjdmlldywgQ29uZmlnU2V0dGluZ3MgKmNvbmZpZ1NldHRpbmdzKTsKKwl2b2lkIHJlaW5pdCh2b2lkKTsKKwlDb25maWdWaWV3KiBwYXJlbnQodm9pZCkgY29uc3QKKwl7CisJCXJldHVybiAoQ29uZmlnVmlldyopUGFyZW50OjpwYXJlbnQoKTsKKwl9CisKK3Byb3RlY3RlZDoKKwlDb25maWdNYWluV2luZG93KiBjdmlldzsKKworCXZvaWQga2V5UHJlc3NFdmVudChRS2V5RXZlbnQgKmUpOworCXZvaWQgY29udGVudHNNb3VzZVByZXNzRXZlbnQoUU1vdXNlRXZlbnQgKmUpOworCXZvaWQgY29udGVudHNNb3VzZVJlbGVhc2VFdmVudChRTW91c2VFdmVudCAqZSk7CisJdm9pZCBjb250ZW50c01vdXNlTW92ZUV2ZW50KFFNb3VzZUV2ZW50ICplKTsKKwl2b2lkIGNvbnRlbnRzTW91c2VEb3VibGVDbGlja0V2ZW50KFFNb3VzZUV2ZW50ICplKTsKKwl2b2lkIGZvY3VzSW5FdmVudChRRm9jdXNFdmVudCAqZSk7CitwdWJsaWMgc2xvdHM6CisJdm9pZCBzZXRSb290TWVudShzdHJ1Y3QgbWVudSAqbWVudSk7CisKKwl2b2lkIHVwZGF0ZUxpc3QoQ29uZmlnSXRlbSAqaXRlbSk7CisJdm9pZCBzZXRWYWx1ZShDb25maWdJdGVtKiBpdGVtLCB0cmlzdGF0ZSB2YWwpOworCXZvaWQgY2hhbmdlVmFsdWUoQ29uZmlnSXRlbSogaXRlbSk7CisJdm9pZCB1cGRhdGVTZWxlY3Rpb24odm9pZCk7CitzaWduYWxzOgorCXZvaWQgbWVudVNlbGVjdGVkKHN0cnVjdCBtZW51ICptZW51KTsKKwl2b2lkIHBhcmVudFNlbGVjdGVkKHZvaWQpOworCXZvaWQgZ290Rm9jdXModm9pZCk7CisKK3B1YmxpYzoKKwl2b2lkIHVwZGF0ZUxpc3RBbGwodm9pZCkKKwl7CisJCXVwZGF0ZUFsbCA9IHRydWU7CisJCXVwZGF0ZUxpc3QoTlVMTCk7CisJCXVwZGF0ZUFsbCA9IGZhbHNlOworCX0KKwlDb25maWdMaXN0KiBsaXN0VmlldygpCisJeworCQlyZXR1cm4gdGhpczsKKwl9CisJQ29uZmlnSXRlbSogZmlyc3RDaGlsZCgpIGNvbnN0CisJeworCQlyZXR1cm4gKENvbmZpZ0l0ZW0gKilQYXJlbnQ6OmZpcnN0Q2hpbGQoKTsKKwl9CisJaW50IG1hcElkeChjb2xJZHggaWR4KQorCXsKKwkJcmV0dXJuIGNvbE1hcFtpZHhdOworCX0KKwl2b2lkIGFkZENvbHVtbihjb2xJZHggaWR4LCBjb25zdCBRU3RyaW5nJiBsYWJlbCkKKwl7CisJCWNvbE1hcFtpZHhdID0gUGFyZW50OjphZGRDb2x1bW4obGFiZWwpOworCQljb2xSZXZNYXBbY29sTWFwW2lkeF1dID0gaWR4OworCX0KKwl2b2lkIHJlbW92ZUNvbHVtbihjb2xJZHggaWR4KQorCXsKKwkJaW50IGNvbCA9IGNvbE1hcFtpZHhdOworCQlpZiAoY29sID49IDApIHsKKwkJCVBhcmVudDo6cmVtb3ZlQ29sdW1uKGNvbCk7CisJCQljb2xSZXZNYXBbY29sXSA9IGNvbE1hcFtpZHhdID0gLTE7CisJCX0KKwl9CisJdm9pZCBzZXRBbGxPcGVuKGJvb2wgb3Blbik7CisJdm9pZCBzZXRQYXJlbnRNZW51KHZvaWQpOworCisJdGVtcGxhdGUgPGNsYXNzIFA+CisJdm9pZCBDb25maWdMaXN0Ojp1cGRhdGVNZW51TGlzdChQKiwgc3RydWN0IG1lbnUqKTsKKworCWJvb2wgdXBkYXRlQWxsOworCisJUVBpeG1hcCBzeW1ib2xZZXNQaXgsIHN5bWJvbE1vZFBpeCwgc3ltYm9sTm9QaXg7CisJUVBpeG1hcCBjaG9pY2VZZXNQaXgsIGNob2ljZU5vUGl4OworCVFQaXhtYXAgbWVudVBpeCwgbWVudUludlBpeCwgbWVudUJhY2tQaXgsIHZvaWRQaXg7CisKKwlib29sIHNob3dBbGwsIHNob3dOYW1lLCBzaG93UmFuZ2UsIHNob3dEYXRhOworCWVudW0gbGlzdE1vZGUgbW9kZTsKKwlzdHJ1Y3QgbWVudSAqcm9vdEVudHJ5OworCVFDb2xvckdyb3VwIGRpc2FibGVkQ29sb3JHcm91cDsKKwlRQ29sb3JHcm91cCBpbmFjdGl2ZWRDb2xvckdyb3VwOworCitwcml2YXRlOgorCWludCBjb2xNYXBbY29sTnJdOworCWludCBjb2xSZXZNYXBbY29sTnJdOworfTsKKworY2xhc3MgQ29uZmlnSXRlbSA6IHB1YmxpYyBRTGlzdFZpZXdJdGVtIHsKKwl0eXBlZGVmIGNsYXNzIFFMaXN0Vmlld0l0ZW0gUGFyZW50OworcHVibGljOgorCUNvbmZpZ0l0ZW0oUUxpc3RWaWV3ICpwYXJlbnQsIENvbmZpZ0l0ZW0gKmFmdGVyLCBzdHJ1Y3QgbWVudSAqbSwgYm9vbCB2KQorCTogUGFyZW50KHBhcmVudCwgYWZ0ZXIpLCBtZW51KG0pLCB2aXNpYmxlKHYpLCBnb1BhcmVudChmYWxzZSkKKwl7CisJCWluaXQoKTsKKwl9CisJQ29uZmlnSXRlbShDb25maWdJdGVtICpwYXJlbnQsIENvbmZpZ0l0ZW0gKmFmdGVyLCBzdHJ1Y3QgbWVudSAqbSwgYm9vbCB2KQorCTogUGFyZW50KHBhcmVudCwgYWZ0ZXIpLCBtZW51KG0pLCB2aXNpYmxlKHYpLCBnb1BhcmVudChmYWxzZSkKKwl7CisJCWluaXQoKTsKKwl9CisJQ29uZmlnSXRlbShRTGlzdFZpZXcgKnBhcmVudCwgQ29uZmlnSXRlbSAqYWZ0ZXIsIGJvb2wgdikKKwk6IFBhcmVudChwYXJlbnQsIGFmdGVyKSwgbWVudSgwKSwgdmlzaWJsZSh2KSwgZ29QYXJlbnQodHJ1ZSkKKwl7CisJCWluaXQoKTsKKwl9CisJfkNvbmZpZ0l0ZW0odm9pZCk7CisJdm9pZCBpbml0KHZvaWQpOworI2lmIFFUX1ZFUlNJT04gPj0gMzAwCisJdm9pZCBva1JlbmFtZShpbnQgY29sKTsKKyNlbmRpZgorCXZvaWQgdXBkYXRlTWVudSh2b2lkKTsKKwl2b2lkIHRlc3RVcGRhdGVNZW51KGJvb2wgdik7CisJQ29uZmlnTGlzdCogbGlzdFZpZXcoKSBjb25zdAorCXsKKwkJcmV0dXJuIChDb25maWdMaXN0KilQYXJlbnQ6Omxpc3RWaWV3KCk7CisJfQorCUNvbmZpZ0l0ZW0qIGZpcnN0Q2hpbGQoKSBjb25zdAorCXsKKwkJcmV0dXJuIChDb25maWdJdGVtICopUGFyZW50OjpmaXJzdENoaWxkKCk7CisJfQorCUNvbmZpZ0l0ZW0qIG5leHRTaWJsaW5nKCkgY29uc3QKKwl7CisJCXJldHVybiAoQ29uZmlnSXRlbSAqKVBhcmVudDo6bmV4dFNpYmxpbmcoKTsKKwl9CisJdm9pZCBzZXRUZXh0KGNvbElkeCBpZHgsIGNvbnN0IFFTdHJpbmcmIHRleHQpCisJeworCQlQYXJlbnQ6OnNldFRleHQobGlzdFZpZXcoKS0+bWFwSWR4KGlkeCksIHRleHQpOworCX0KKwlRU3RyaW5nIHRleHQoY29sSWR4IGlkeCkgY29uc3QKKwl7CisJCXJldHVybiBQYXJlbnQ6OnRleHQobGlzdFZpZXcoKS0+bWFwSWR4KGlkeCkpOworCX0KKwl2b2lkIHNldFBpeG1hcChjb2xJZHggaWR4LCBjb25zdCBRUGl4bWFwJiBwbSkKKwl7CisJCVBhcmVudDo6c2V0UGl4bWFwKGxpc3RWaWV3KCktPm1hcElkeChpZHgpLCBwbSk7CisJfQorCWNvbnN0IFFQaXhtYXAqIHBpeG1hcChjb2xJZHggaWR4KSBjb25zdAorCXsKKwkJcmV0dXJuIFBhcmVudDo6cGl4bWFwKGxpc3RWaWV3KCktPm1hcElkeChpZHgpKTsKKwl9CisJdm9pZCBwYWludENlbGwoUVBhaW50ZXIqIHAsIGNvbnN0IFFDb2xvckdyb3VwJiBjZywgaW50IGNvbHVtbiwgaW50IHdpZHRoLCBpbnQgYWxpZ24pOworCisJQ29uZmlnSXRlbSogbmV4dEl0ZW07CisJc3RydWN0IG1lbnUgKm1lbnU7CisJYm9vbCB2aXNpYmxlOworCWJvb2wgZ29QYXJlbnQ7Cit9OworCitjbGFzcyBDb25maWdMaW5lRWRpdCA6IHB1YmxpYyBRTGluZUVkaXQgeworCVFfT0JKRUNUCisJdHlwZWRlZiBjbGFzcyBRTGluZUVkaXQgUGFyZW50OworcHVibGljOgorCUNvbmZpZ0xpbmVFZGl0KENvbmZpZ1ZpZXcqIHBhcmVudCkKKwk6IFBhcmVudChwYXJlbnQpCisJeyB9CisJQ29uZmlnVmlldyogcGFyZW50KHZvaWQpIGNvbnN0CisJeworCQlyZXR1cm4gKENvbmZpZ1ZpZXcqKVBhcmVudDo6cGFyZW50KCk7CisJfQorCXZvaWQgc2hvdyhDb25maWdJdGVtICppKTsKKwl2b2lkIGtleVByZXNzRXZlbnQoUUtleUV2ZW50ICplKTsKKworcHVibGljOgorCUNvbmZpZ0l0ZW0gKml0ZW07Cit9OworCitjbGFzcyBDb25maWdNYWluV2luZG93IDogcHVibGljIFFNYWluV2luZG93IHsKKwlRX09CSkVDVAorcHVibGljOgorCUNvbmZpZ01haW5XaW5kb3codm9pZCk7CitwdWJsaWMgc2xvdHM6CisJdm9pZCBzZXRIZWxwKFFMaXN0Vmlld0l0ZW0qIGl0ZW0pOworCXZvaWQgY2hhbmdlTWVudShzdHJ1Y3QgbWVudSAqKTsKKwl2b2lkIGxpc3RGb2N1c0NoYW5nZWQodm9pZCk7CisJdm9pZCBnb0JhY2sodm9pZCk7CisJdm9pZCBsb2FkQ29uZmlnKHZvaWQpOworCXZvaWQgc2F2ZUNvbmZpZyh2b2lkKTsKKwl2b2lkIHNhdmVDb25maWdBcyh2b2lkKTsKKwl2b2lkIHNob3dTaW5nbGVWaWV3KHZvaWQpOworCXZvaWQgc2hvd1NwbGl0Vmlldyh2b2lkKTsKKwl2b2lkIHNob3dGdWxsVmlldyh2b2lkKTsKKwl2b2lkIHNldFNob3dBbGwoYm9vbCk7CisJdm9pZCBzZXRTaG93RGVidWcoYm9vbCk7CisJdm9pZCBzZXRTaG93UmFuZ2UoYm9vbCk7CisJdm9pZCBzZXRTaG93TmFtZShib29sKTsKKwl2b2lkIHNldFNob3dEYXRhKGJvb2wpOworCXZvaWQgc2hvd0ludHJvKHZvaWQpOworCXZvaWQgc2hvd0Fib3V0KHZvaWQpOworCXZvaWQgc2F2ZVNldHRpbmdzKHZvaWQpOworCitwcm90ZWN0ZWQ6CisJdm9pZCBjbG9zZUV2ZW50KFFDbG9zZUV2ZW50ICplKTsKKworCUNvbmZpZ1ZpZXcgKm1lbnVWaWV3OworCUNvbmZpZ0xpc3QgKm1lbnVMaXN0OworCUNvbmZpZ1ZpZXcgKmNvbmZpZ1ZpZXc7CisJQ29uZmlnTGlzdCAqY29uZmlnTGlzdDsKKwlRVGV4dFZpZXcgKmhlbHBUZXh0OworCVFUb29sQmFyICp0b29sQmFyOworCVFBY3Rpb24gKmJhY2tBY3Rpb247CisJUVNwbGl0dGVyKiBzcGxpdDE7CisJUVNwbGl0dGVyKiBzcGxpdDI7CisKKwlib29sIHNob3dEZWJ1ZzsKK307CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvc3ltYm9sLmMgYi9zY3JpcHRzL2tjb25maWcvc3ltYm9sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWZmYTUyZgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy9zeW1ib2wuYwpAQCAtMCwwICsxLDgxNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHJlZ2V4Lmg+CisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKworI2RlZmluZSBMS0NfRElSRUNUX0xJTksKKyNpbmNsdWRlICJsa2MuaCIKKworc3RydWN0IHN5bWJvbCBzeW1ib2xfeWVzID0geworCS5uYW1lID0gInkiLAorCS5jdXJyID0geyAieSIsIHllcyB9LAorCS5mbGFncyA9IFNZTUJPTF9ZRVN8U1lNQk9MX1ZBTElELAorfSwgc3ltYm9sX21vZCA9IHsKKwkubmFtZSA9ICJtIiwKKwkuY3VyciA9IHsgIm0iLCBtb2QgfSwKKwkuZmxhZ3MgPSBTWU1CT0xfTU9EfFNZTUJPTF9WQUxJRCwKK30sIHN5bWJvbF9ubyA9IHsKKwkubmFtZSA9ICJuIiwKKwkuY3VyciA9IHsgIm4iLCBubyB9LAorCS5mbGFncyA9IFNZTUJPTF9OT3xTWU1CT0xfVkFMSUQsCit9LCBzeW1ib2xfZW1wdHkgPSB7CisJLm5hbWUgPSAiIiwKKwkuY3VyciA9IHsgIiIsIG5vIH0sCisJLmZsYWdzID0gU1lNQk9MX1ZBTElELAorfTsKKworaW50IHN5bV9jaGFuZ2VfY291bnQ7CitzdHJ1Y3Qgc3ltYm9sICptb2R1bGVzX3N5bTsKK3RyaXN0YXRlIG1vZHVsZXNfdmFsOworCit2b2lkIHN5bV9hZGRfZGVmYXVsdChzdHJ1Y3Qgc3ltYm9sICpzeW0sIGNvbnN0IGNoYXIgKmRlZikKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3AgPSBwcm9wX2FsbG9jKFBfREVGQVVMVCwgc3ltKTsKKworCXByb3AtPmV4cHIgPSBleHByX2FsbG9jX3N5bWJvbChzeW1fbG9va3VwKGRlZiwgMSkpOworfQorCit2b2lkIHN5bV9pbml0KHZvaWQpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCXN0cnVjdCB1dHNuYW1lIHV0czsKKwljaGFyICpwOworCXN0YXRpYyBib29sIGluaXRlZCA9IGZhbHNlOworCisJaWYgKGluaXRlZCkKKwkJcmV0dXJuOworCWluaXRlZCA9IHRydWU7CisKKwl1bmFtZSgmdXRzKTsKKworCXN5bSA9IHN5bV9sb29rdXAoIkFSQ0giLCAwKTsKKwlzeW0tPnR5cGUgPSBTX1NUUklORzsKKwlzeW0tPmZsYWdzIHw9IFNZTUJPTF9BVVRPOworCXAgPSBnZXRlbnYoIkFSQ0giKTsKKwlpZiAocCkKKwkJc3ltX2FkZF9kZWZhdWx0KHN5bSwgcCk7CisKKwlzeW0gPSBzeW1fbG9va3VwKCJLRVJORUxSRUxFQVNFIiwgMCk7CisJc3ltLT50eXBlID0gU19TVFJJTkc7CisJc3ltLT5mbGFncyB8PSBTWU1CT0xfQVVUTzsKKwlwID0gZ2V0ZW52KCJLRVJORUxSRUxFQVNFIik7CisJaWYgKHApCisJCXN5bV9hZGRfZGVmYXVsdChzeW0sIHApOworCisJc3ltID0gc3ltX2xvb2t1cCgiVU5BTUVfUkVMRUFTRSIsIDApOworCXN5bS0+dHlwZSA9IFNfU1RSSU5HOworCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX0FVVE87CisJc3ltX2FkZF9kZWZhdWx0KHN5bSwgdXRzLnJlbGVhc2UpOworfQorCitlbnVtIHN5bWJvbF90eXBlIHN5bV9nZXRfdHlwZShzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJZW51bSBzeW1ib2xfdHlwZSB0eXBlID0gc3ltLT50eXBlOworCisJaWYgKHR5cGUgPT0gU19UUklTVEFURSkgeworCQlpZiAoc3ltX2lzX2Nob2ljZV92YWx1ZShzeW0pICYmIHN5bS0+dmlzaWJsZSA9PSB5ZXMpCisJCQl0eXBlID0gU19CT09MRUFOOworCQllbHNlIGlmIChtb2R1bGVzX3ZhbCA9PSBubykKKwkJCXR5cGUgPSBTX0JPT0xFQU47CisJfQorCXJldHVybiB0eXBlOworfQorCitjb25zdCBjaGFyICpzeW1fdHlwZV9uYW1lKGVudW0gc3ltYm9sX3R5cGUgdHlwZSkKK3sKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFNfQk9PTEVBTjoKKwkJcmV0dXJuICJib29sZWFuIjsKKwljYXNlIFNfVFJJU1RBVEU6CisJCXJldHVybiAidHJpc3RhdGUiOworCWNhc2UgU19JTlQ6CisJCXJldHVybiAiaW50ZWdlciI7CisJY2FzZSBTX0hFWDoKKwkJcmV0dXJuICJoZXgiOworCWNhc2UgU19TVFJJTkc6CisJCXJldHVybiAic3RyaW5nIjsKKwljYXNlIFNfVU5LTk9XTjoKKwkJcmV0dXJuICJ1bmtub3duIjsKKwljYXNlIFNfT1RIRVI6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gIj8/PyI7Cit9CisKK3N0cnVjdCBwcm9wZXJ0eSAqc3ltX2dldF9jaG9pY2VfcHJvcChzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCisJZm9yX2FsbF9jaG9pY2VzKHN5bSwgcHJvcCkKKwkJcmV0dXJuIHByb3A7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBwcm9wZXJ0eSAqc3ltX2dldF9kZWZhdWx0X3Byb3Aoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKworCWZvcl9hbGxfZGVmYXVsdHMoc3ltLCBwcm9wKSB7CisJCXByb3AtPnZpc2libGUudHJpID0gZXhwcl9jYWxjX3ZhbHVlKHByb3AtPnZpc2libGUuZXhwcik7CisJCWlmIChwcm9wLT52aXNpYmxlLnRyaSAhPSBubykKKwkJCXJldHVybiBwcm9wOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IHByb3BlcnR5ICpzeW1fZ2V0X3JhbmdlX3Byb3Aoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKworCWZvcl9hbGxfcHJvcGVydGllcyhzeW0sIHByb3AsIFBfUkFOR0UpIHsKKwkJcHJvcC0+dmlzaWJsZS50cmkgPSBleHByX2NhbGNfdmFsdWUocHJvcC0+dmlzaWJsZS5leHByKTsKKwkJaWYgKHByb3AtPnZpc2libGUudHJpICE9IG5vKQorCQkJcmV0dXJuIHByb3A7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBzeW1fY2FsY192aXNpYmlsaXR5KHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJdHJpc3RhdGUgdHJpOworCisJLyogYW55IHByb21wdCB2aXNpYmxlPyAqLworCXRyaSA9IG5vOworCWZvcl9hbGxfcHJvbXB0cyhzeW0sIHByb3ApIHsKKwkJcHJvcC0+dmlzaWJsZS50cmkgPSBleHByX2NhbGNfdmFsdWUocHJvcC0+dmlzaWJsZS5leHByKTsKKwkJdHJpID0gRV9PUih0cmksIHByb3AtPnZpc2libGUudHJpKTsKKwl9CisJaWYgKHRyaSA9PSBtb2QgJiYgKHN5bS0+dHlwZSAhPSBTX1RSSVNUQVRFIHx8IG1vZHVsZXNfdmFsID09IG5vKSkKKwkJdHJpID0geWVzOworCWlmIChzeW0tPnZpc2libGUgIT0gdHJpKSB7CisJCXN5bS0+dmlzaWJsZSA9IHRyaTsKKwkJc3ltX3NldF9jaGFuZ2VkKHN5bSk7CisJfQorCWlmIChzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkpCisJCXJldHVybjsKKwl0cmkgPSBubzsKKwlpZiAoc3ltLT5yZXZfZGVwLmV4cHIpCisJCXRyaSA9IGV4cHJfY2FsY192YWx1ZShzeW0tPnJldl9kZXAuZXhwcik7CisJaWYgKHRyaSA9PSBtb2QgJiYgc3ltX2dldF90eXBlKHN5bSkgPT0gU19CT09MRUFOKQorCQl0cmkgPSB5ZXM7CisJaWYgKHN5bS0+cmV2X2RlcC50cmkgIT0gdHJpKSB7CisJCXN5bS0+cmV2X2RlcC50cmkgPSB0cmk7CisJCXN5bV9zZXRfY2hhbmdlZChzeW0pOworCX0KK30KKworc3RhdGljIHN0cnVjdCBzeW1ib2wgKnN5bV9jYWxjX2Nob2ljZShzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJc3RydWN0IHN5bWJvbCAqZGVmX3N5bTsKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IGV4cHIgKmU7CisKKwkvKiBpcyB0aGUgdXNlciBjaG9pY2UgdmlzaWJsZT8gKi8KKwlkZWZfc3ltID0gc3ltLT51c2VyLnZhbDsKKwlpZiAoZGVmX3N5bSkgeworCQlzeW1fY2FsY192aXNpYmlsaXR5KGRlZl9zeW0pOworCQlpZiAoZGVmX3N5bS0+dmlzaWJsZSAhPSBubykKKwkJCXJldHVybiBkZWZfc3ltOworCX0KKworCS8qIGFueSBvZiB0aGUgZGVmYXVsdHMgdmlzaWJsZT8gKi8KKwlmb3JfYWxsX2RlZmF1bHRzKHN5bSwgcHJvcCkgeworCQlwcm9wLT52aXNpYmxlLnRyaSA9IGV4cHJfY2FsY192YWx1ZShwcm9wLT52aXNpYmxlLmV4cHIpOworCQlpZiAocHJvcC0+dmlzaWJsZS50cmkgPT0gbm8pCisJCQljb250aW51ZTsKKwkJZGVmX3N5bSA9IHByb3BfZ2V0X3N5bWJvbChwcm9wKTsKKwkJc3ltX2NhbGNfdmlzaWJpbGl0eShkZWZfc3ltKTsKKwkJaWYgKGRlZl9zeW0tPnZpc2libGUgIT0gbm8pCisJCQlyZXR1cm4gZGVmX3N5bTsKKwl9CisKKwkvKiBqdXN0IGdldCB0aGUgZmlyc3QgdmlzaWJsZSB2YWx1ZSAqLworCXByb3AgPSBzeW1fZ2V0X2Nob2ljZV9wcm9wKHN5bSk7CisJZm9yIChlID0gcHJvcC0+ZXhwcjsgZTsgZSA9IGUtPmxlZnQuZXhwcikgeworCQlkZWZfc3ltID0gZS0+cmlnaHQuc3ltOworCQlzeW1fY2FsY192aXNpYmlsaXR5KGRlZl9zeW0pOworCQlpZiAoZGVmX3N5bS0+dmlzaWJsZSAhPSBubykKKwkJCXJldHVybiBkZWZfc3ltOworCX0KKworCS8qIG5vIGNob2ljZT8gcmVzZXQgdHJpc3RhdGUgdmFsdWUgKi8KKwlzeW0tPmN1cnIudHJpID0gbm87CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgc3ltX2NhbGNfdmFsdWUoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXN0cnVjdCBzeW1ib2xfdmFsdWUgbmV3dmFsLCBvbGR2YWw7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXN0cnVjdCBleHByICplOworCisJaWYgKCFzeW0pCisJCXJldHVybjsKKworCWlmIChzeW0tPmZsYWdzICYgU1lNQk9MX1ZBTElEKQorCQlyZXR1cm47CisJc3ltLT5mbGFncyB8PSBTWU1CT0xfVkFMSUQ7CisKKwlvbGR2YWwgPSBzeW0tPmN1cnI7CisKKwlzd2l0Y2ggKHN5bS0+dHlwZSkgeworCWNhc2UgU19JTlQ6CisJY2FzZSBTX0hFWDoKKwljYXNlIFNfU1RSSU5HOgorCQluZXd2YWwgPSBzeW1ib2xfZW1wdHkuY3VycjsKKwkJYnJlYWs7CisJY2FzZSBTX0JPT0xFQU46CisJY2FzZSBTX1RSSVNUQVRFOgorCQluZXd2YWwgPSBzeW1ib2xfbm8uY3VycjsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJc3ltLT5jdXJyLnZhbCA9IHN5bS0+bmFtZTsKKwkJc3ltLT5jdXJyLnRyaSA9IG5vOworCQlyZXR1cm47CisJfQorCWlmICghc3ltX2lzX2Nob2ljZV92YWx1ZShzeW0pKQorCQlzeW0tPmZsYWdzICY9IH5TWU1CT0xfV1JJVEU7CisKKwlzeW1fY2FsY192aXNpYmlsaXR5KHN5bSk7CisKKwkvKiBzZXQgZGVmYXVsdCBpZiByZWN1cnNpdmVseSBjYWxsZWQgKi8KKwlzeW0tPmN1cnIgPSBuZXd2YWw7CisKKwlzd2l0Y2ggKHN5bV9nZXRfdHlwZShzeW0pKSB7CisJY2FzZSBTX0JPT0xFQU46CisJY2FzZSBTX1RSSVNUQVRFOgorCQlpZiAoc3ltX2lzX2Nob2ljZV92YWx1ZShzeW0pICYmIHN5bS0+dmlzaWJsZSA9PSB5ZXMpIHsKKwkJCXByb3AgPSBzeW1fZ2V0X2Nob2ljZV9wcm9wKHN5bSk7CisJCQluZXd2YWwudHJpID0gKHByb3BfZ2V0X3N5bWJvbChwcm9wKS0+Y3Vyci52YWwgPT0gc3ltKSA/IHllcyA6IG5vOworCQl9IGVsc2UgaWYgKEVfT1Ioc3ltLT52aXNpYmxlLCBzeW0tPnJldl9kZXAudHJpKSAhPSBubykgeworCQkJc3ltLT5mbGFncyB8PSBTWU1CT0xfV1JJVEU7CisJCQlpZiAoc3ltX2hhc192YWx1ZShzeW0pKQorCQkJCW5ld3ZhbC50cmkgPSBzeW0tPnVzZXIudHJpOworCQkJZWxzZSBpZiAoIXN5bV9pc19jaG9pY2Uoc3ltKSkgeworCQkJCXByb3AgPSBzeW1fZ2V0X2RlZmF1bHRfcHJvcChzeW0pOworCQkJCWlmIChwcm9wKQorCQkJCQluZXd2YWwudHJpID0gZXhwcl9jYWxjX3ZhbHVlKHByb3AtPmV4cHIpOworCQkJfQorCQkJbmV3dmFsLnRyaSA9IEVfT1IoRV9BTkQobmV3dmFsLnRyaSwgc3ltLT52aXNpYmxlKSwgc3ltLT5yZXZfZGVwLnRyaSk7CisJCX0gZWxzZSBpZiAoIXN5bV9pc19jaG9pY2Uoc3ltKSkgeworCQkJcHJvcCA9IHN5bV9nZXRfZGVmYXVsdF9wcm9wKHN5bSk7CisJCQlpZiAocHJvcCkgeworCQkJCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX1dSSVRFOworCQkJCW5ld3ZhbC50cmkgPSBleHByX2NhbGNfdmFsdWUocHJvcC0+ZXhwcik7CisJCQl9CisJCX0KKwkJaWYgKG5ld3ZhbC50cmkgPT0gbW9kICYmIHN5bV9nZXRfdHlwZShzeW0pID09IFNfQk9PTEVBTikKKwkJCW5ld3ZhbC50cmkgPSB5ZXM7CisJCWJyZWFrOworCWNhc2UgU19TVFJJTkc6CisJY2FzZSBTX0hFWDoKKwljYXNlIFNfSU5UOgorCQlpZiAoc3ltLT52aXNpYmxlICE9IG5vKSB7CisJCQlzeW0tPmZsYWdzIHw9IFNZTUJPTF9XUklURTsKKwkJCWlmIChzeW1faGFzX3ZhbHVlKHN5bSkpIHsKKwkJCQluZXd2YWwudmFsID0gc3ltLT51c2VyLnZhbDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCQlwcm9wID0gc3ltX2dldF9kZWZhdWx0X3Byb3Aoc3ltKTsKKwkJaWYgKHByb3ApIHsKKwkJCXN0cnVjdCBzeW1ib2wgKmRzID0gcHJvcF9nZXRfc3ltYm9sKHByb3ApOworCQkJaWYgKGRzKSB7CisJCQkJc3ltLT5mbGFncyB8PSBTWU1CT0xfV1JJVEU7CisJCQkJc3ltX2NhbGNfdmFsdWUoZHMpOworCQkJCW5ld3ZhbC52YWwgPSBkcy0+Y3Vyci52YWw7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJOworCX0KKworCXN5bS0+Y3VyciA9IG5ld3ZhbDsKKwlpZiAoc3ltX2lzX2Nob2ljZShzeW0pICYmIG5ld3ZhbC50cmkgPT0geWVzKQorCQlzeW0tPmN1cnIudmFsID0gc3ltX2NhbGNfY2hvaWNlKHN5bSk7CisKKwlpZiAobWVtY21wKCZvbGR2YWwsICZzeW0tPmN1cnIsIHNpemVvZihvbGR2YWwpKSkKKwkJc3ltX3NldF9jaGFuZ2VkKHN5bSk7CisJaWYgKG1vZHVsZXNfc3ltID09IHN5bSkKKwkJbW9kdWxlc192YWwgPSBtb2R1bGVzX3N5bS0+Y3Vyci50cmk7CisKKwlpZiAoc3ltX2lzX2Nob2ljZShzeW0pKSB7CisJCWludCBmbGFncyA9IHN5bS0+ZmxhZ3MgJiAoU1lNQk9MX0NIQU5HRUQgfCBTWU1CT0xfV1JJVEUpOworCQlwcm9wID0gc3ltX2dldF9jaG9pY2VfcHJvcChzeW0pOworCQlmb3IgKGUgPSBwcm9wLT5leHByOyBlOyBlID0gZS0+bGVmdC5leHByKSB7CisJCQllLT5yaWdodC5zeW0tPmZsYWdzIHw9IGZsYWdzOworCQkJaWYgKGZsYWdzICYgU1lNQk9MX0NIQU5HRUQpCisJCQkJc3ltX3NldF9jaGFuZ2VkKGUtPnJpZ2h0LnN5bSk7CisJCX0KKwl9Cit9CisKK3ZvaWQgc3ltX2NsZWFyX2FsbF92YWxpZCh2b2lkKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlpbnQgaTsKKworCWZvcl9hbGxfc3ltYm9scyhpLCBzeW0pCisJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9WQUxJRDsKKwlzeW1fY2hhbmdlX2NvdW50Kys7CisJaWYgKG1vZHVsZXNfc3ltKQorCQlzeW1fY2FsY192YWx1ZShtb2R1bGVzX3N5bSk7Cit9CisKK3ZvaWQgc3ltX3NldF9jaGFuZ2VkKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisKKwlzeW0tPmZsYWdzIHw9IFNZTUJPTF9DSEFOR0VEOworCWZvciAocHJvcCA9IHN5bS0+cHJvcDsgcHJvcDsgcHJvcCA9IHByb3AtPm5leHQpIHsKKwkJaWYgKHByb3AtPm1lbnUpCisJCQlwcm9wLT5tZW51LT5mbGFncyB8PSBNRU5VX0NIQU5HRUQ7CisJfQorfQorCit2b2lkIHN5bV9zZXRfYWxsX2NoYW5nZWQodm9pZCkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJaW50IGk7CisKKwlmb3JfYWxsX3N5bWJvbHMoaSwgc3ltKQorCQlzeW1fc2V0X2NoYW5nZWQoc3ltKTsKK30KKworYm9vbCBzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN0cnVjdCBzeW1ib2wgKnN5bSwgdHJpc3RhdGUgdmFsKQoreworCWludCB0eXBlID0gc3ltX2dldF90eXBlKHN5bSk7CisKKwlpZiAoc3ltLT52aXNpYmxlID09IG5vKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAodHlwZSAhPSBTX0JPT0xFQU4gJiYgdHlwZSAhPSBTX1RSSVNUQVRFKQorCQlyZXR1cm4gZmFsc2U7CisKKwlpZiAodHlwZSA9PSBTX0JPT0xFQU4gJiYgdmFsID09IG1vZCkKKwkJcmV0dXJuIGZhbHNlOworCWlmIChzeW0tPnZpc2libGUgPD0gc3ltLT5yZXZfZGVwLnRyaSkKKwkJcmV0dXJuIGZhbHNlOworCWlmIChzeW1faXNfY2hvaWNlX3ZhbHVlKHN5bSkgJiYgc3ltLT52aXNpYmxlID09IHllcykKKwkJcmV0dXJuIHZhbCA9PSB5ZXM7CisJcmV0dXJuIHZhbCA+PSBzeW0tPnJldl9kZXAudHJpICYmIHZhbCA8PSBzeW0tPnZpc2libGU7Cit9CisKK2Jvb2wgc3ltX3NldF90cmlzdGF0ZV92YWx1ZShzdHJ1Y3Qgc3ltYm9sICpzeW0sIHRyaXN0YXRlIHZhbCkKK3sKKwl0cmlzdGF0ZSBvbGR2YWwgPSBzeW1fZ2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSk7CisKKwlpZiAob2xkdmFsICE9IHZhbCAmJiAhc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIHZhbCkpCisJCXJldHVybiBmYWxzZTsKKworCWlmIChzeW0tPmZsYWdzICYgU1lNQk9MX05FVykgeworCQlzeW0tPmZsYWdzICY9IH5TWU1CT0xfTkVXOworCQlzeW1fc2V0X2NoYW5nZWQoc3ltKTsKKwl9CisJaWYgKHN5bV9pc19jaG9pY2VfdmFsdWUoc3ltKSAmJiB2YWwgPT0geWVzKSB7CisJCXN0cnVjdCBzeW1ib2wgKmNzID0gcHJvcF9nZXRfc3ltYm9sKHN5bV9nZXRfY2hvaWNlX3Byb3Aoc3ltKSk7CisKKwkJY3MtPnVzZXIudmFsID0gc3ltOworCQljcy0+ZmxhZ3MgJj0gflNZTUJPTF9ORVc7CisJfQorCisJc3ltLT51c2VyLnRyaSA9IHZhbDsKKwlpZiAob2xkdmFsICE9IHZhbCkgeworCQlzeW1fY2xlYXJfYWxsX3ZhbGlkKCk7CisJCWlmIChzeW0gPT0gbW9kdWxlc19zeW0pCisJCQlzeW1fc2V0X2FsbF9jaGFuZ2VkKCk7CisJfQorCisJcmV0dXJuIHRydWU7Cit9CisKK3RyaXN0YXRlIHN5bV90b2dnbGVfdHJpc3RhdGVfdmFsdWUoc3RydWN0IHN5bWJvbCAqc3ltKQoreworCXRyaXN0YXRlIG9sZHZhbCwgbmV3dmFsOworCisJb2xkdmFsID0gbmV3dmFsID0gc3ltX2dldF90cmlzdGF0ZV92YWx1ZShzeW0pOworCWRvIHsKKwkJc3dpdGNoIChuZXd2YWwpIHsKKwkJY2FzZSBubzoKKwkJCW5ld3ZhbCA9IG1vZDsKKwkJCWJyZWFrOworCQljYXNlIG1vZDoKKwkJCW5ld3ZhbCA9IHllczsKKwkJCWJyZWFrOworCQljYXNlIHllczoKKwkJCW5ld3ZhbCA9IG5vOworCQkJYnJlYWs7CisJCX0KKwkJaWYgKHN5bV9zZXRfdHJpc3RhdGVfdmFsdWUoc3ltLCBuZXd2YWwpKQorCQkJYnJlYWs7CisJfSB3aGlsZSAob2xkdmFsICE9IG5ld3ZhbCk7CisJcmV0dXJuIG5ld3ZhbDsKK30KKworYm9vbCBzeW1fc3RyaW5nX3ZhbGlkKHN0cnVjdCBzeW1ib2wgKnN5bSwgY29uc3QgY2hhciAqc3RyKQoreworCXNpZ25lZCBjaGFyIGNoOworCisJc3dpdGNoIChzeW0tPnR5cGUpIHsKKwljYXNlIFNfU1RSSU5HOgorCQlyZXR1cm4gdHJ1ZTsKKwljYXNlIFNfSU5UOgorCQljaCA9ICpzdHIrKzsKKwkJaWYgKGNoID09ICctJykKKwkJCWNoID0gKnN0cisrOworCQlpZiAoIWlzZGlnaXQoY2gpKQorCQkJcmV0dXJuIGZhbHNlOworCQlpZiAoY2ggPT0gJzAnICYmICpzdHIgIT0gMCkKKwkJCXJldHVybiBmYWxzZTsKKwkJd2hpbGUgKChjaCA9ICpzdHIrKykpIHsKKwkJCWlmICghaXNkaWdpdChjaCkpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9CisJCXJldHVybiB0cnVlOworCWNhc2UgU19IRVg6CisJCWlmIChzdHJbMF0gPT0gJzAnICYmIChzdHJbMV0gPT0gJ3gnIHx8IHN0clsxXSA9PSAnWCcpKQorCQkJc3RyICs9IDI7CisJCWNoID0gKnN0cisrOworCQlkbyB7CisJCQlpZiAoIWlzeGRpZ2l0KGNoKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisJCX0gd2hpbGUgKChjaCA9ICpzdHIrKykpOworCQlyZXR1cm4gdHJ1ZTsKKwljYXNlIFNfQk9PTEVBTjoKKwljYXNlIFNfVFJJU1RBVEU6CisJCXN3aXRjaCAoc3RyWzBdKSB7CisJCWNhc2UgJ3knOiBjYXNlICdZJzoKKwkJY2FzZSAnbSc6IGNhc2UgJ00nOgorCQljYXNlICduJzogY2FzZSAnTic6CisJCQlyZXR1cm4gdHJ1ZTsKKwkJfQorCQlyZXR1cm4gZmFsc2U7CisJZGVmYXVsdDoKKwkJcmV0dXJuIGZhbHNlOworCX0KK30KKworYm9vbCBzeW1fc3RyaW5nX3dpdGhpbl9yYW5nZShzdHJ1Y3Qgc3ltYm9sICpzeW0sIGNvbnN0IGNoYXIgKnN0cikKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJaW50IHZhbDsKKworCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJY2FzZSBTX1NUUklORzoKKwkJcmV0dXJuIHN5bV9zdHJpbmdfdmFsaWQoc3ltLCBzdHIpOworCWNhc2UgU19JTlQ6CisJCWlmICghc3ltX3N0cmluZ192YWxpZChzeW0sIHN0cikpCisJCQlyZXR1cm4gZmFsc2U7CisJCXByb3AgPSBzeW1fZ2V0X3JhbmdlX3Byb3Aoc3ltKTsKKwkJaWYgKCFwcm9wKQorCQkJcmV0dXJuIHRydWU7CisJCXZhbCA9IHN0cnRvbChzdHIsIE5VTEwsIDEwKTsKKwkJcmV0dXJuIHZhbCA+PSBzdHJ0b2wocHJvcC0+ZXhwci0+bGVmdC5zeW0tPm5hbWUsIE5VTEwsIDEwKSAmJgorCQkgICAgICAgdmFsIDw9IHN0cnRvbChwcm9wLT5leHByLT5yaWdodC5zeW0tPm5hbWUsIE5VTEwsIDEwKTsKKwljYXNlIFNfSEVYOgorCQlpZiAoIXN5bV9zdHJpbmdfdmFsaWQoc3ltLCBzdHIpKQorCQkJcmV0dXJuIGZhbHNlOworCQlwcm9wID0gc3ltX2dldF9yYW5nZV9wcm9wKHN5bSk7CisJCWlmICghcHJvcCkKKwkJCXJldHVybiB0cnVlOworCQl2YWwgPSBzdHJ0b2woc3RyLCBOVUxMLCAxNik7CisJCXJldHVybiB2YWwgPj0gc3RydG9sKHByb3AtPmV4cHItPmxlZnQuc3ltLT5uYW1lLCBOVUxMLCAxNikgJiYKKwkJICAgICAgIHZhbCA8PSBzdHJ0b2wocHJvcC0+ZXhwci0+cmlnaHQuc3ltLT5uYW1lLCBOVUxMLCAxNik7CisJY2FzZSBTX0JPT0xFQU46CisJY2FzZSBTX1RSSVNUQVRFOgorCQlzd2l0Y2ggKHN0clswXSkgeworCQljYXNlICd5JzogY2FzZSAnWSc6CisJCQlyZXR1cm4gc3ltX3RyaXN0YXRlX3dpdGhpbl9yYW5nZShzeW0sIHllcyk7CisJCWNhc2UgJ20nOiBjYXNlICdNJzoKKwkJCXJldHVybiBzeW1fdHJpc3RhdGVfd2l0aGluX3JhbmdlKHN5bSwgbW9kKTsKKwkJY2FzZSAnbic6IGNhc2UgJ04nOgorCQkJcmV0dXJuIHN5bV90cmlzdGF0ZV93aXRoaW5fcmFuZ2Uoc3ltLCBubyk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCWRlZmF1bHQ6CisJCXJldHVybiBmYWxzZTsKKwl9Cit9CisKK2Jvb2wgc3ltX3NldF9zdHJpbmdfdmFsdWUoc3RydWN0IHN5bWJvbCAqc3ltLCBjb25zdCBjaGFyICpuZXd2YWwpCit7CisJY29uc3QgY2hhciAqb2xkdmFsOworCWNoYXIgKnZhbDsKKwlpbnQgc2l6ZTsKKworCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJY2FzZSBTX0JPT0xFQU46CisJY2FzZSBTX1RSSVNUQVRFOgorCQlzd2l0Y2ggKG5ld3ZhbFswXSkgeworCQljYXNlICd5JzogY2FzZSAnWSc6CisJCQlyZXR1cm4gc3ltX3NldF90cmlzdGF0ZV92YWx1ZShzeW0sIHllcyk7CisJCWNhc2UgJ20nOiBjYXNlICdNJzoKKwkJCXJldHVybiBzeW1fc2V0X3RyaXN0YXRlX3ZhbHVlKHN5bSwgbW9kKTsKKwkJY2FzZSAnbic6IGNhc2UgJ04nOgorCQkJcmV0dXJuIHN5bV9zZXRfdHJpc3RhdGVfdmFsdWUoc3ltLCBubyk7CisJCX0KKwkJcmV0dXJuIGZhbHNlOworCWRlZmF1bHQ6CisJCTsKKwl9CisKKwlpZiAoIXN5bV9zdHJpbmdfd2l0aGluX3JhbmdlKHN5bSwgbmV3dmFsKSkKKwkJcmV0dXJuIGZhbHNlOworCisJaWYgKHN5bS0+ZmxhZ3MgJiBTWU1CT0xfTkVXKSB7CisJCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9ORVc7CisJCXN5bV9zZXRfY2hhbmdlZChzeW0pOworCX0KKworCW9sZHZhbCA9IHN5bS0+dXNlci52YWw7CisJc2l6ZSA9IHN0cmxlbihuZXd2YWwpICsgMTsKKwlpZiAoc3ltLT50eXBlID09IFNfSEVYICYmIChuZXd2YWxbMF0gIT0gJzAnIHx8IChuZXd2YWxbMV0gIT0gJ3gnICYmIG5ld3ZhbFsxXSAhPSAnWCcpKSkgeworCQlzaXplICs9IDI7CisJCXN5bS0+dXNlci52YWwgPSB2YWwgPSBtYWxsb2Moc2l6ZSk7CisJCSp2YWwrKyA9ICcwJzsKKwkJKnZhbCsrID0gJ3gnOworCX0gZWxzZSBpZiAoIW9sZHZhbCB8fCBzdHJjbXAob2xkdmFsLCBuZXd2YWwpKQorCQlzeW0tPnVzZXIudmFsID0gdmFsID0gbWFsbG9jKHNpemUpOworCWVsc2UKKwkJcmV0dXJuIHRydWU7CisKKwlzdHJjcHkodmFsLCBuZXd2YWwpOworCWZyZWUoKHZvaWQgKilvbGR2YWwpOworCXN5bV9jbGVhcl9hbGxfdmFsaWQoKTsKKworCXJldHVybiB0cnVlOworfQorCitjb25zdCBjaGFyICpzeW1fZ2V0X3N0cmluZ192YWx1ZShzdHJ1Y3Qgc3ltYm9sICpzeW0pCit7CisJdHJpc3RhdGUgdmFsOworCisJc3dpdGNoIChzeW0tPnR5cGUpIHsKKwljYXNlIFNfQk9PTEVBTjoKKwljYXNlIFNfVFJJU1RBVEU6CisJCXZhbCA9IHN5bV9nZXRfdHJpc3RhdGVfdmFsdWUoc3ltKTsKKwkJc3dpdGNoICh2YWwpIHsKKwkJY2FzZSBubzoKKwkJCXJldHVybiAibiI7CisJCWNhc2UgbW9kOgorCQkJcmV0dXJuICJtIjsKKwkJY2FzZSB5ZXM6CisJCQlyZXR1cm4gInkiOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCTsKKwl9CisJcmV0dXJuIChjb25zdCBjaGFyICopc3ltLT5jdXJyLnZhbDsKK30KKworYm9vbCBzeW1faXNfY2hhbmdhYmxlKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlyZXR1cm4gc3ltLT52aXNpYmxlID4gc3ltLT5yZXZfZGVwLnRyaTsKK30KKworc3RydWN0IHN5bWJvbCAqc3ltX2xvb2t1cChjb25zdCBjaGFyICpuYW1lLCBpbnQgaXNjb25zdCkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW1ib2w7CisJY29uc3QgY2hhciAqcHRyOworCWNoYXIgKm5ld19uYW1lOworCWludCBoYXNoID0gMDsKKworCWlmIChuYW1lKSB7CisJCWlmIChuYW1lWzBdICYmICFuYW1lWzFdKSB7CisJCQlzd2l0Y2ggKG5hbWVbMF0pIHsKKwkJCWNhc2UgJ3knOiByZXR1cm4gJnN5bWJvbF95ZXM7CisJCQljYXNlICdtJzogcmV0dXJuICZzeW1ib2xfbW9kOworCQkJY2FzZSAnbic6IHJldHVybiAmc3ltYm9sX25vOworCQkJfQorCQl9CisJCWZvciAocHRyID0gbmFtZTsgKnB0cjsgcHRyKyspCisJCQloYXNoICs9ICpwdHI7CisJCWhhc2ggJj0gMHhmZjsKKworCQlmb3IgKHN5bWJvbCA9IHN5bWJvbF9oYXNoW2hhc2hdOyBzeW1ib2w7IHN5bWJvbCA9IHN5bWJvbC0+bmV4dCkgeworCQkJaWYgKCFzdHJjbXAoc3ltYm9sLT5uYW1lLCBuYW1lKSkgeworCQkJCWlmICgoaXNjb25zdCAmJiBzeW1ib2wtPmZsYWdzICYgU1lNQk9MX0NPTlNUKSB8fAorCQkJCSAgICAoIWlzY29uc3QgJiYgIShzeW1ib2wtPmZsYWdzICYgU1lNQk9MX0NPTlNUKSkpCisJCQkJCXJldHVybiBzeW1ib2w7CisJCQl9CisJCX0KKwkJbmV3X25hbWUgPSBzdHJkdXAobmFtZSk7CisJfSBlbHNlIHsKKwkJbmV3X25hbWUgPSBOVUxMOworCQloYXNoID0gMjU2OworCX0KKworCXN5bWJvbCA9IG1hbGxvYyhzaXplb2YoKnN5bWJvbCkpOworCW1lbXNldChzeW1ib2wsIDAsIHNpemVvZigqc3ltYm9sKSk7CisJc3ltYm9sLT5uYW1lID0gbmV3X25hbWU7CisJc3ltYm9sLT50eXBlID0gU19VTktOT1dOOworCXN5bWJvbC0+ZmxhZ3MgPSBTWU1CT0xfTkVXOworCWlmIChpc2NvbnN0KQorCQlzeW1ib2wtPmZsYWdzIHw9IFNZTUJPTF9DT05TVDsKKworCXN5bWJvbC0+bmV4dCA9IHN5bWJvbF9oYXNoW2hhc2hdOworCXN5bWJvbF9oYXNoW2hhc2hdID0gc3ltYm9sOworCisJcmV0dXJuIHN5bWJvbDsKK30KKworc3RydWN0IHN5bWJvbCAqc3ltX2ZpbmQoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW1ib2wgPSBOVUxMOworCWNvbnN0IGNoYXIgKnB0cjsKKwlpbnQgaGFzaCA9IDA7CisKKwlpZiAoIW5hbWUpCisJCXJldHVybiBOVUxMOworCisJaWYgKG5hbWVbMF0gJiYgIW5hbWVbMV0pIHsKKwkJc3dpdGNoIChuYW1lWzBdKSB7CisJCWNhc2UgJ3knOiByZXR1cm4gJnN5bWJvbF95ZXM7CisJCWNhc2UgJ20nOiByZXR1cm4gJnN5bWJvbF9tb2Q7CisJCWNhc2UgJ24nOiByZXR1cm4gJnN5bWJvbF9ubzsKKwkJfQorCX0KKwlmb3IgKHB0ciA9IG5hbWU7ICpwdHI7IHB0cisrKQorCQloYXNoICs9ICpwdHI7CisJaGFzaCAmPSAweGZmOworCisJZm9yIChzeW1ib2wgPSBzeW1ib2xfaGFzaFtoYXNoXTsgc3ltYm9sOyBzeW1ib2wgPSBzeW1ib2wtPm5leHQpIHsKKwkJaWYgKCFzdHJjbXAoc3ltYm9sLT5uYW1lLCBuYW1lKSAmJgorCQkgICAgIShzeW1ib2wtPmZsYWdzICYgU1lNQk9MX0NPTlNUKSkKKwkJCQlicmVhazsKKwl9CisKKwlyZXR1cm4gc3ltYm9sOworfQorCitzdHJ1Y3Qgc3ltYm9sICoqc3ltX3JlX3NlYXJjaChjb25zdCBjaGFyICpwYXR0ZXJuKQoreworCXN0cnVjdCBzeW1ib2wgKnN5bSwgKipzeW1fYXJyID0gTlVMTDsKKwlpbnQgaSwgY250LCBzaXplOworCXJlZ2V4X3QgcmU7CisKKwljbnQgPSBzaXplID0gMDsKKwkvKiBTa2lwIGlmIGVtcHR5ICovCisJaWYgKHN0cmxlbihwYXR0ZXJuKSA9PSAwKQorCQlyZXR1cm4gTlVMTDsKKwlpZiAocmVnY29tcCgmcmUsIHBhdHRlcm4sIFJFR19FWFRFTkRFRHxSRUdfTk9TVUJ8UkVHX0lDQVNFKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3JfYWxsX3N5bWJvbHMoaSwgc3ltKSB7CisJCWlmIChzeW0tPmZsYWdzICYgU1lNQk9MX0NPTlNUIHx8ICFzeW0tPm5hbWUpCisJCQljb250aW51ZTsKKwkJaWYgKHJlZ2V4ZWMoJnJlLCBzeW0tPm5hbWUsIDAsIE5VTEwsIDApKQorCQkJY29udGludWU7CisJCWlmIChjbnQgKyAxID49IHNpemUpIHsKKwkJCXZvaWQgKnRtcCA9IHN5bV9hcnI7CisJCQlzaXplICs9IDE2OworCQkJc3ltX2FyciA9IHJlYWxsb2Moc3ltX2Fyciwgc2l6ZSAqIHNpemVvZihzdHJ1Y3Qgc3ltYm9sICopKTsKKwkJCWlmICghc3ltX2FycikgeworCQkJCWZyZWUodG1wKTsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJfQorCQlzeW1fYXJyW2NudCsrXSA9IHN5bTsKKwl9CisJaWYgKHN5bV9hcnIpCisJCXN5bV9hcnJbY250XSA9IE5VTEw7CisJcmVnZnJlZSgmcmUpOworCisJcmV0dXJuIHN5bV9hcnI7Cit9CisKKworc3RydWN0IHN5bWJvbCAqc3ltX2NoZWNrX2RlcHMoc3RydWN0IHN5bWJvbCAqc3ltKTsKKworc3RhdGljIHN0cnVjdCBzeW1ib2wgKnN5bV9jaGVja19leHByX2RlcHMoc3RydWN0IGV4cHIgKmUpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCisJaWYgKCFlKQorCQlyZXR1cm4gTlVMTDsKKwlzd2l0Y2ggKGUtPnR5cGUpIHsKKwljYXNlIEVfT1I6CisJY2FzZSBFX0FORDoKKwkJc3ltID0gc3ltX2NoZWNrX2V4cHJfZGVwcyhlLT5sZWZ0LmV4cHIpOworCQlpZiAoc3ltKQorCQkJcmV0dXJuIHN5bTsKKwkJcmV0dXJuIHN5bV9jaGVja19leHByX2RlcHMoZS0+cmlnaHQuZXhwcik7CisJY2FzZSBFX05PVDoKKwkJcmV0dXJuIHN5bV9jaGVja19leHByX2RlcHMoZS0+bGVmdC5leHByKTsKKwljYXNlIEVfRVFVQUw6CisJY2FzZSBFX1VORVFVQUw6CisJCXN5bSA9IHN5bV9jaGVja19kZXBzKGUtPmxlZnQuc3ltKTsKKwkJaWYgKHN5bSkKKwkJCXJldHVybiBzeW07CisJCXJldHVybiBzeW1fY2hlY2tfZGVwcyhlLT5yaWdodC5zeW0pOworCWNhc2UgRV9TWU1CT0w6CisJCXJldHVybiBzeW1fY2hlY2tfZGVwcyhlLT5sZWZ0LnN5bSk7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXByaW50ZigiT29wcyEgSG93IHRvIGNoZWNrICVkP1xuIiwgZS0+dHlwZSk7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBzeW1ib2wgKnN5bV9jaGVja19kZXBzKHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0yOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKworCWlmIChzeW0tPmZsYWdzICYgU1lNQk9MX0NIRUNLX0RPTkUpCisJCXJldHVybiBOVUxMOworCWlmIChzeW0tPmZsYWdzICYgU1lNQk9MX0NIRUNLKSB7CisJCXByaW50ZigiV2FybmluZyEgRm91bmQgcmVjdXJzaXZlIGRlcGVuZGVuY3k6ICVzIiwgc3ltLT5uYW1lKTsKKwkJcmV0dXJuIHN5bTsKKwl9CisKKwlzeW0tPmZsYWdzIHw9IChTWU1CT0xfQ0hFQ0sgfCBTWU1CT0xfQ0hFQ0tFRCk7CisJc3ltMiA9IHN5bV9jaGVja19leHByX2RlcHMoc3ltLT5yZXZfZGVwLmV4cHIpOworCWlmIChzeW0yKQorCQlnb3RvIG91dDsKKworCWZvciAocHJvcCA9IHN5bS0+cHJvcDsgcHJvcDsgcHJvcCA9IHByb3AtPm5leHQpIHsKKwkJaWYgKHByb3AtPnR5cGUgPT0gUF9DSE9JQ0UgfHwgcHJvcC0+dHlwZSA9PSBQX1NFTEVDVCkKKwkJCWNvbnRpbnVlOworCQlzeW0yID0gc3ltX2NoZWNrX2V4cHJfZGVwcyhwcm9wLT52aXNpYmxlLmV4cHIpOworCQlpZiAoc3ltMikKKwkJCWdvdG8gb3V0OworCQlpZiAocHJvcC0+dHlwZSAhPSBQX0RFRkFVTFQgfHwgc3ltX2lzX2Nob2ljZShzeW0pKQorCQkJY29udGludWU7CisJCXN5bTIgPSBzeW1fY2hlY2tfZXhwcl9kZXBzKHByb3AtPmV4cHIpOworCQlpZiAoc3ltMikKKwkJCWdvdG8gb3V0OworCX0KK291dDoKKwlpZiAoc3ltMikKKwkJcHJpbnRmKCIgJXMiLCBzeW0tPm5hbWUpOworCXN5bS0+ZmxhZ3MgJj0gflNZTUJPTF9DSEVDSzsKKwlyZXR1cm4gc3ltMjsKK30KKworc3RydWN0IHByb3BlcnR5ICpwcm9wX2FsbG9jKGVudW0gcHJvcF90eXBlIHR5cGUsIHN0cnVjdCBzeW1ib2wgKnN5bSkKK3sKKwlzdHJ1Y3QgcHJvcGVydHkgKnByb3A7CisJc3RydWN0IHByb3BlcnR5ICoqcHJvcHA7CisKKwlwcm9wID0gbWFsbG9jKHNpemVvZigqcHJvcCkpOworCW1lbXNldChwcm9wLCAwLCBzaXplb2YoKnByb3ApKTsKKwlwcm9wLT50eXBlID0gdHlwZTsKKwlwcm9wLT5zeW0gPSBzeW07CisJcHJvcC0+ZmlsZSA9IGN1cnJlbnRfZmlsZTsKKwlwcm9wLT5saW5lbm8gPSB6Y29uZl9saW5lbm8oKTsKKworCS8qIGFwcGVuZCBwcm9wZXJ0eSB0byB0aGUgcHJvcCBsaXN0IG9mIHN5bWJvbCAqLworCWlmIChzeW0pIHsKKwkJZm9yIChwcm9wcCA9ICZzeW0tPnByb3A7ICpwcm9wcDsgcHJvcHAgPSAmKCpwcm9wcCktPm5leHQpCisJCQk7CisJCSpwcm9wcCA9IHByb3A7CisJfQorCisJcmV0dXJuIHByb3A7Cit9CisKK3N0cnVjdCBzeW1ib2wgKnByb3BfZ2V0X3N5bWJvbChzdHJ1Y3QgcHJvcGVydHkgKnByb3ApCit7CisJaWYgKHByb3AtPmV4cHIgJiYgKHByb3AtPmV4cHItPnR5cGUgPT0gRV9TWU1CT0wgfHwKKwkJCSAgIHByb3AtPmV4cHItPnR5cGUgPT0gRV9DSE9JQ0UpKQorCQlyZXR1cm4gcHJvcC0+ZXhwci0+bGVmdC5zeW07CisJcmV0dXJuIE5VTEw7Cit9CisKK2NvbnN0IGNoYXIgKnByb3BfZ2V0X3R5cGVfbmFtZShlbnVtIHByb3BfdHlwZSB0eXBlKQoreworCXN3aXRjaCAodHlwZSkgeworCWNhc2UgUF9QUk9NUFQ6CisJCXJldHVybiAicHJvbXB0IjsKKwljYXNlIFBfQ09NTUVOVDoKKwkJcmV0dXJuICJjb21tZW50IjsKKwljYXNlIFBfTUVOVToKKwkJcmV0dXJuICJtZW51IjsKKwljYXNlIFBfREVGQVVMVDoKKwkJcmV0dXJuICJkZWZhdWx0IjsKKwljYXNlIFBfQ0hPSUNFOgorCQlyZXR1cm4gImNob2ljZSI7CisJY2FzZSBQX1NFTEVDVDoKKwkJcmV0dXJuICJzZWxlY3QiOworCWNhc2UgUF9SQU5HRToKKwkJcmV0dXJuICJyYW5nZSI7CisJY2FzZSBQX1VOS05PV046CisJCWJyZWFrOworCX0KKwlyZXR1cm4gInVua25vd24iOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3V0aWwuYyBiL3NjcmlwdHMva2NvbmZpZy91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZhNGMwYgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy91dGlsLmMKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDItMjAwNSBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIENvcHlyaWdodCAoQykgMjAwMi0yMDA1IFNhbSBSYXZuYm9yZyA8c2FtQHJhdm5ib3JnLm9yZz4KKyAqCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSAibGtjLmgiCisKKy8qIGZpbGUgYWxyZWFkeSBwcmVzZW50IGluIGxpc3Q/IElmIG5vdCBhZGQgaXQgKi8KK3N0cnVjdCBmaWxlICpmaWxlX2xvb2t1cChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBmaWxlICpmaWxlOworCisJZm9yIChmaWxlID0gZmlsZV9saXN0OyBmaWxlOyBmaWxlID0gZmlsZS0+bmV4dCkgeworCQlpZiAoIXN0cmNtcChuYW1lLCBmaWxlLT5uYW1lKSkKKwkJCXJldHVybiBmaWxlOworCX0KKworCWZpbGUgPSBtYWxsb2Moc2l6ZW9mKCpmaWxlKSk7CisJbWVtc2V0KGZpbGUsIDAsIHNpemVvZigqZmlsZSkpOworCWZpbGUtPm5hbWUgPSBzdHJkdXAobmFtZSk7CisJZmlsZS0+bmV4dCA9IGZpbGVfbGlzdDsKKwlmaWxlX2xpc3QgPSBmaWxlOworCXJldHVybiBmaWxlOworfQorCisvKiB3cml0ZSBhIGRlcGVuZGVuY3kgZmlsZSBhcyB1c2VkIGJ5IGtidWlsZCB0byB0cmFjayBkZXBlbmRlbmNpZXMgKi8KK2ludCBmaWxlX3dyaXRlX2RlcChjb25zdCBjaGFyICpuYW1lKQoreworCXN0cnVjdCBmaWxlICpmaWxlOworCUZJTEUgKm91dDsKKworCWlmICghbmFtZSkKKwkJbmFtZSA9ICIuY29uZmlnLmNtZCI7CisJb3V0ID0gZm9wZW4oIi4uY29uZmlnLnRtcCIsICJ3Iik7CisJaWYgKCFvdXQpCisJCXJldHVybiAxOworCWZwcmludGYob3V0LCAiZGVwc19jb25maWcgOj0gXFxcbiIpOworCWZvciAoZmlsZSA9IGZpbGVfbGlzdDsgZmlsZTsgZmlsZSA9IGZpbGUtPm5leHQpIHsKKwkJaWYgKGZpbGUtPm5leHQpCisJCQlmcHJpbnRmKG91dCwgIlx0JXMgXFxcbiIsIGZpbGUtPm5hbWUpOworCQllbHNlCisJCQlmcHJpbnRmKG91dCwgIlx0JXNcbiIsIGZpbGUtPm5hbWUpOworCX0KKwlmcHJpbnRmKG91dCwgIlxuLmNvbmZpZyBpbmNsdWRlL2xpbnV4L2F1dG9jb25mLmg6ICQoZGVwc19jb25maWcpXG5cbiQoZGVwc19jb25maWcpOlxuIik7CisJZmNsb3NlKG91dCk7CisJcmVuYW1lKCIuLmNvbmZpZy50bXAiLCBuYW1lKTsKKwlyZXR1cm4gMDsKK30KKworCisvKiBBbGxvY2F0ZSBpbml0aWFsIGdyb3dhYmxlIHN0aW5nICovCitzdHJ1Y3QgZ3N0ciBzdHJfbmV3KHZvaWQpCit7CisJc3RydWN0IGdzdHIgZ3M7CisJZ3MucyA9IG1hbGxvYyhzaXplb2YoY2hhcikgKiA2NCk7CisJZ3MubGVuID0gMTY7CisJc3RyY3B5KGdzLnMsICJcMCIpOworCXJldHVybiBnczsKK30KKworLyogQWxsb2NhdGUgYW5kIGFzc2lnbiBncm93YWJsZSBzdHJpbmcgKi8KK3N0cnVjdCBnc3RyIHN0cl9hc3NpZ24oY29uc3QgY2hhciAqcykKK3sKKwlzdHJ1Y3QgZ3N0ciBnczsKKwlncy5zID0gc3RyZHVwKHMpOworCWdzLmxlbiA9IHN0cmxlbihzKSArIDE7CisJcmV0dXJuIGdzOworfQorCisvKiBGcmVlIHN0b3JhZ2UgZm9yIGdyb3dhYmxlIHN0cmluZyAqLwordm9pZCBzdHJfZnJlZShzdHJ1Y3QgZ3N0ciAqZ3MpCit7CisJaWYgKGdzLT5zKQorCQlmcmVlKGdzLT5zKTsKKwlncy0+cyA9IE5VTEw7CisJZ3MtPmxlbiA9IDA7Cit9CisKKy8qIEFwcGVuZCB0byBncm93YWJsZSBzdHJpbmcgKi8KK3ZvaWQgc3RyX2FwcGVuZChzdHJ1Y3QgZ3N0ciAqZ3MsIGNvbnN0IGNoYXIgKnMpCit7CisJc2l6ZV90IGwgPSBzdHJsZW4oZ3MtPnMpICsgc3RybGVuKHMpICsgMTsKKwlpZiAobCA+IGdzLT5sZW4pIHsKKwkJZ3MtPnMgICA9IHJlYWxsb2MoZ3MtPnMsIGwpOworCQlncy0+bGVuID0gbDsKKwl9CisJc3RyY2F0KGdzLT5zLCBzKTsKK30KKworLyogQXBwZW5kIHByaW50ZiBmb3JtYXR0ZWQgc3RyaW5nIHRvIGdyb3dhYmxlIHN0cmluZyAqLwordm9pZCBzdHJfcHJpbnRmKHN0cnVjdCBnc3RyICpncywgY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKwljaGFyIHNbMTAwMDBdOyAvKiBiaWcgZW5vdWdoLi4uICovCisJdmFfc3RhcnQoYXAsIGZtdCk7CisJdnNucHJpbnRmKHMsIHNpemVvZihzKSwgZm10LCBhcCk7CisJc3RyX2FwcGVuZChncywgcyk7CisJdmFfZW5kKGFwKTsKK30KKworLyogUmV0cmVpdmUgdmFsdWUgb2YgZ3Jvd2FibGUgc3RyaW5nICovCitjb25zdCBjaGFyICpzdHJfZ2V0KHN0cnVjdCBnc3RyICpncykKK3sKKwlyZXR1cm4gZ3MtPnM7Cit9CisKZGlmZiAtLWdpdCBhL3NjcmlwdHMva2NvbmZpZy96Y29uZi5sIGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU1MTdiMgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMva2NvbmZpZy96Y29uZi5sCkBAIC0wLDAgKzEsMzY2IEBACislb3B0aW9uIGJhY2t1cCBub3N0ZGluaXQgbm95eXdyYXAgbmV2ZXItaW50ZXJhY3RpdmUgZnVsbCBlY3MKKyVvcHRpb24gOGJpdCBiYWNrdXAgbm9kZWZhdWx0IHBlcmYtcmVwb3J0IHBlcmYtcmVwb3J0CisleCBDT01NQU5EIEhFTFAgU1RSSU5HIFBBUkFNCisleworLyoKKyAqIENvcHlyaWdodCAoQykgMjAwMiBSb21hbiBaaXBwZWwgPHppcHBlbEBsaW51eC1tNjhrLm9yZz4KKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTCB2Mi4wLgorICovCisKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjZGVmaW5lIExLQ19ESVJFQ1RfTElOSworI2luY2x1ZGUgImxrYy5oIgorCisjZGVmaW5lIFNUQVJUX1NUUlNJWkUJMTYKKworY2hhciAqdGV4dDsKK3N0YXRpYyBjaGFyICp0ZXh0X3B0cjsKK3N0YXRpYyBpbnQgdGV4dF9zaXplLCB0ZXh0X2FzaXplOworCitzdHJ1Y3QgYnVmZmVyIHsKKyAgICAgICAgc3RydWN0IGJ1ZmZlciAqcGFyZW50OworICAgICAgICBZWV9CVUZGRVJfU1RBVEUgc3RhdGU7Cit9OworCitzdHJ1Y3QgYnVmZmVyICpjdXJyZW50X2J1ZjsKKworc3RhdGljIGludCBsYXN0X3RzLCBmaXJzdF90czsKKworc3RhdGljIHZvaWQgemNvbmZfZW5kaGVscCh2b2lkKTsKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyICp6Y29uZl9lbmRmaWxlKHZvaWQpOworCit2b2lkIG5ld19zdHJpbmcodm9pZCkKK3sKKwl0ZXh0ID0gbWFsbG9jKFNUQVJUX1NUUlNJWkUpOworCXRleHRfYXNpemUgPSBTVEFSVF9TVFJTSVpFOworCXRleHRfcHRyID0gdGV4dDsKKwl0ZXh0X3NpemUgPSAwOworCSp0ZXh0X3B0ciA9IDA7Cit9CisKK3ZvaWQgYXBwZW5kX3N0cmluZyhjb25zdCBjaGFyICpzdHIsIGludCBzaXplKQoreworCWludCBuZXdfc2l6ZSA9IHRleHRfc2l6ZSArIHNpemUgKyAxOworCWlmIChuZXdfc2l6ZSA+IHRleHRfYXNpemUpIHsKKwkJdGV4dCA9IHJlYWxsb2ModGV4dCwgbmV3X3NpemUpOworCQl0ZXh0X2FzaXplID0gbmV3X3NpemU7CisJCXRleHRfcHRyID0gdGV4dCArIHRleHRfc2l6ZTsKKwl9CisJbWVtY3B5KHRleHRfcHRyLCBzdHIsIHNpemUpOworCXRleHRfcHRyICs9IHNpemU7CisJdGV4dF9zaXplICs9IHNpemU7CisJKnRleHRfcHRyID0gMDsKK30KKwordm9pZCBhbGxvY19zdHJpbmcoY29uc3QgY2hhciAqc3RyLCBpbnQgc2l6ZSkKK3sKKwl0ZXh0ID0gbWFsbG9jKHNpemUgKyAxKTsKKwltZW1jcHkodGV4dCwgc3RyLCBzaXplKTsKKwl0ZXh0W3NpemVdID0gMDsKK30KKyV9CisKK3dzCVsgXG5cdF0KK24JW0EtWmEtejAtOV9dCisKKyUlCisJaW50IHN0ciA9IDA7CisJaW50IHRzLCBpOworCitbIFx0XSojLipcbgljdXJyZW50X2ZpbGUtPmxpbmVubysrOworWyBcdF0qIy4qCisKK1sgXHRdKlxuCWN1cnJlbnRfZmlsZS0+bGluZW5vKys7IHJldHVybiBUX0VPTDsKKworWyBcdF0rCXsKKwlCRUdJTihDT01NQU5EKTsKK30KKworLgl7CisJdW5wdXQoeXl0ZXh0WzBdKTsKKwlCRUdJTihDT01NQU5EKTsKK30KKworCis8Q09NTUFORD57CisJIm1haW5tZW51IgkJQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9NQUlOTUVOVTsKKwkibWVudSIJCQlCRUdJTihQQVJBTSk7IHJldHVybiBUX01FTlU7CisJImVuZG1lbnUiCQlCRUdJTihQQVJBTSk7IHJldHVybiBUX0VORE1FTlU7CisJInNvdXJjZSIJCUJFR0lOKFBBUkFNKTsgcmV0dXJuIFRfU09VUkNFOworCSJjaG9pY2UiCQlCRUdJTihQQVJBTSk7IHJldHVybiBUX0NIT0lDRTsKKwkiZW5kY2hvaWNlIgkJQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9FTkRDSE9JQ0U7CisJImNvbW1lbnQiCQlCRUdJTihQQVJBTSk7IHJldHVybiBUX0NPTU1FTlQ7CisJImNvbmZpZyIJCUJFR0lOKFBBUkFNKTsgcmV0dXJuIFRfQ09ORklHOworCSJtZW51Y29uZmlnIgkJQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9NRU5VQ09ORklHOworCSJoZWxwIgkJCUJFR0lOKFBBUkFNKTsgcmV0dXJuIFRfSEVMUDsKKwkiaWYiCQkJQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9JRjsKKwkiZW5kaWYiCQkJQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9FTkRJRjsKKwkiZGVwZW5kcyIJCUJFR0lOKFBBUkFNKTsgcmV0dXJuIFRfREVQRU5EUzsKKwkicmVxdWlyZXMiCQlCRUdJTihQQVJBTSk7IHJldHVybiBUX1JFUVVJUkVTOworCSJvcHRpb25hbCIJCUJFR0lOKFBBUkFNKTsgcmV0dXJuIFRfT1BUSU9OQUw7CisJImRlZmF1bHQiCQlCRUdJTihQQVJBTSk7IHJldHVybiBUX0RFRkFVTFQ7CisJInByb21wdCIJCUJFR0lOKFBBUkFNKTsgcmV0dXJuIFRfUFJPTVBUOworCSJ0cmlzdGF0ZSIJCUJFR0lOKFBBUkFNKTsgcmV0dXJuIFRfVFJJU1RBVEU7CisJImRlZl90cmlzdGF0ZSIJCUJFR0lOKFBBUkFNKTsgcmV0dXJuIFRfREVGX1RSSVNUQVRFOworCSJib29sIgkJCUJFR0lOKFBBUkFNKTsgcmV0dXJuIFRfQk9PTEVBTjsKKwkiYm9vbGVhbiIJCUJFR0lOKFBBUkFNKTsgcmV0dXJuIFRfQk9PTEVBTjsKKwkiZGVmX2Jvb2wiCQlCRUdJTihQQVJBTSk7IHJldHVybiBUX0RFRl9CT09MRUFOOworCSJkZWZfYm9vbGVhbiIJCUJFR0lOKFBBUkFNKTsgcmV0dXJuIFRfREVGX0JPT0xFQU47CisJImludCIJCQlCRUdJTihQQVJBTSk7IHJldHVybiBUX0lOVDsKKwkiaGV4IgkJCUJFR0lOKFBBUkFNKTsgcmV0dXJuIFRfSEVYOworCSJzdHJpbmciCQlCRUdJTihQQVJBTSk7IHJldHVybiBUX1NUUklORzsKKwkic2VsZWN0IgkJQkVHSU4oUEFSQU0pOyByZXR1cm4gVF9TRUxFQ1Q7CisJImVuYWJsZSIJCUJFR0lOKFBBUkFNKTsgcmV0dXJuIFRfU0VMRUNUOworCSJyYW5nZSIJCQlCRUdJTihQQVJBTSk7IHJldHVybiBUX1JBTkdFOworCXtufSsJeworCQlhbGxvY19zdHJpbmcoeXl0ZXh0LCB5eWxlbmcpOworCQl6Y29uZmx2YWwuc3RyaW5nID0gdGV4dDsKKwkJcmV0dXJuIFRfV09SRDsKKwl9CisJLgorCVxuCWN1cnJlbnRfZmlsZS0+bGluZW5vKys7IEJFR0lOKElOSVRJQUwpOworfQorCis8UEFSQU0+eworCSImJiIJcmV0dXJuIFRfQU5EOworCSJ8fCIJcmV0dXJuIFRfT1I7CisJIigiCXJldHVybiBUX09QRU5fUEFSRU47CisJIikiCXJldHVybiBUX0NMT1NFX1BBUkVOOworCSIhIglyZXR1cm4gVF9OT1Q7CisJIj0iCXJldHVybiBUX0VRVUFMOworCSIhPSIJcmV0dXJuIFRfVU5FUVVBTDsKKwkiaWYiCXJldHVybiBUX0lGOworCSJvbiIJcmV0dXJuIFRfT047CisJXCJ8XCcJeworCQlzdHIgPSB5eXRleHRbMF07CisJCW5ld19zdHJpbmcoKTsKKwkJQkVHSU4oU1RSSU5HKTsKKwl9CisJXG4JQkVHSU4oSU5JVElBTCk7IGN1cnJlbnRfZmlsZS0+bGluZW5vKys7IHJldHVybiBUX0VPTDsKKwktLS0JLyogaWdub3JlICovCisJKHtufXxbLS8uXSkrCXsKKwkJYWxsb2Nfc3RyaW5nKHl5dGV4dCwgeXlsZW5nKTsKKwkJemNvbmZsdmFsLnN0cmluZyA9IHRleHQ7CisJCXJldHVybiBUX1dPUkQ7CisJfQorCSMuKgkvKiBjb21tZW50ICovCisJXFxcbgljdXJyZW50X2ZpbGUtPmxpbmVubysrOworCS4KKwk8PEVPRj4+IHsKKwkJQkVHSU4oSU5JVElBTCk7CisJfQorfQorCis8U1RSSU5HPnsKKwlbXiciXFxcbl0rL1xuCXsKKwkJYXBwZW5kX3N0cmluZyh5eXRleHQsIHl5bGVuZyk7CisJCXpjb25mbHZhbC5zdHJpbmcgPSB0ZXh0OworCQlyZXR1cm4gVF9XT1JEX1FVT1RFOworCX0KKwlbXiciXFxcbl0rCXsKKwkJYXBwZW5kX3N0cmluZyh5eXRleHQsIHl5bGVuZyk7CisJfQorCVxcLj8vXG4JeworCQlhcHBlbmRfc3RyaW5nKHl5dGV4dCArIDEsIHl5bGVuZyAtIDEpOworCQl6Y29uZmx2YWwuc3RyaW5nID0gdGV4dDsKKwkJcmV0dXJuIFRfV09SRF9RVU9URTsKKwl9CisJXFwuPwl7CisJCWFwcGVuZF9zdHJpbmcoeXl0ZXh0ICsgMSwgeXlsZW5nIC0gMSk7CisJfQorCVwnfFwiCXsKKwkJaWYgKHN0ciA9PSB5eXRleHRbMF0pIHsKKwkJCUJFR0lOKFBBUkFNKTsKKwkJCXpjb25mbHZhbC5zdHJpbmcgPSB0ZXh0OworCQkJcmV0dXJuIFRfV09SRF9RVU9URTsKKwkJfSBlbHNlCisJCQlhcHBlbmRfc3RyaW5nKHl5dGV4dCwgMSk7CisJfQorCVxuCXsKKwkJcHJpbnRmKCIlczolZDp3YXJuaW5nOiBtdWx0aS1saW5lIHN0cmluZ3Mgbm90IHN1cHBvcnRlZFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CisJCWN1cnJlbnRfZmlsZS0+bGluZW5vKys7CisJCUJFR0lOKElOSVRJQUwpOworCQlyZXR1cm4gVF9FT0w7CisJfQorCTw8RU9GPj4JeworCQlCRUdJTihJTklUSUFMKTsKKwl9Cit9CisKKzxIRUxQPnsKKwlbIFx0XSsJeworCQl0cyA9IDA7CisJCWZvciAoaSA9IDA7IGkgPCB5eWxlbmc7IGkrKykgeworCQkJaWYgKHl5dGV4dFtpXSA9PSAnXHQnKQorCQkJCXRzID0gKHRzICYgfjcpICsgODsKKwkJCWVsc2UKKwkJCQl0cysrOworCQl9CisJCWxhc3RfdHMgPSB0czsKKwkJaWYgKGZpcnN0X3RzKSB7CisJCQlpZiAodHMgPCBmaXJzdF90cykgeworCQkJCXpjb25mX2VuZGhlbHAoKTsKKwkJCQlyZXR1cm4gVF9IRUxQVEVYVDsKKwkJCX0KKwkJCXRzIC09IGZpcnN0X3RzOworCQkJd2hpbGUgKHRzID4gOCkgeworCQkJCWFwcGVuZF9zdHJpbmcoIiAgICAgICAgIiwgOCk7CisJCQkJdHMgLT0gODsKKwkJCX0KKwkJCWFwcGVuZF9zdHJpbmcoIiAgICAgICAgIiwgdHMpOworCQl9CisJfQorCVsgXHRdKlxuL1teIFx0XG5dIHsKKwkJY3VycmVudF9maWxlLT5saW5lbm8rKzsKKwkJemNvbmZfZW5kaGVscCgpOworCQlyZXR1cm4gVF9IRUxQVEVYVDsKKwl9CisJWyBcdF0qXG4JeworCQljdXJyZW50X2ZpbGUtPmxpbmVubysrOworCQlhcHBlbmRfc3RyaW5nKCJcbiIsIDEpOworCX0KKwlbXiBcdFxuXS4qIHsKKwkJYXBwZW5kX3N0cmluZyh5eXRleHQsIHl5bGVuZyk7CisJCWlmICghZmlyc3RfdHMpCisJCQlmaXJzdF90cyA9IGxhc3RfdHM7CisJfQorCTw8RU9GPj4JeworCQl6Y29uZl9lbmRoZWxwKCk7CisJCXJldHVybiBUX0hFTFBURVhUOworCX0KK30KKworPDxFT0Y+Pgl7CisJaWYgKGN1cnJlbnRfYnVmKSB7CisJCXpjb25mX2VuZGZpbGUoKTsKKwkJcmV0dXJuIFRfRU9GOworCX0KKwlmY2xvc2UoeXlpbik7CisJeXl0ZXJtaW5hdGUoKTsKK30KKworJSUKK3ZvaWQgemNvbmZfc3RhcnRoZWxwKHZvaWQpCit7CisJbmV3X3N0cmluZygpOworCWxhc3RfdHMgPSBmaXJzdF90cyA9IDA7CisJQkVHSU4oSEVMUCk7Cit9CisKK3N0YXRpYyB2b2lkIHpjb25mX2VuZGhlbHAodm9pZCkKK3sKKwl6Y29uZmx2YWwuc3RyaW5nID0gdGV4dDsKKwlCRUdJTihJTklUSUFMKTsKK30KKworCisvKgorICogVHJ5IHRvIG9wZW4gc3BlY2lmaWVkIGZpbGUgd2l0aCBmb2xsb3dpbmcgbmFtZXM6CisgKiAuL25hbWUKKyAqICQoc3JjdHJlZSkvbmFtZQorICogVGhlIGxhdHRlciBpcyB1c2VkIHdoZW4gc3JjdHJlZSBpcyBzZXBhcmF0ZSBmcm9tIG9ianRyZWUKKyAqIHdoZW4gY29tcGlsaW5nIHRoZSBrZXJuZWwuCisgKiBSZXR1cm4gTlVMTCBpZiBmaWxlIGlzIG5vdCBmb3VuZC4KKyAqLworRklMRSAqemNvbmZfZm9wZW4oY29uc3QgY2hhciAqbmFtZSkKK3sKKwljaGFyICplbnYsIGZ1bGxuYW1lW1BBVEhfTUFYKzFdOworCUZJTEUgKmY7CisKKwlmID0gZm9wZW4obmFtZSwgInIiKTsKKwlpZiAoIWYgJiYgbmFtZVswXSAhPSAnLycpIHsKKwkJZW52ID0gZ2V0ZW52KFNSQ1RSRUUpOworCQlpZiAoZW52KSB7CisJCQlzcHJpbnRmKGZ1bGxuYW1lLCAiJXMvJXMiLCBlbnYsIG5hbWUpOworCQkJZiA9IGZvcGVuKGZ1bGxuYW1lLCAiciIpOworCQl9CisJfQorCXJldHVybiBmOworfQorCit2b2lkIHpjb25mX2luaXRzY2FuKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJeXlpbiA9IHpjb25mX2ZvcGVuKG5hbWUpOworCWlmICgheXlpbikgeworCQlwcmludGYoImNhbid0IGZpbmQgZmlsZSAlc1xuIiwgbmFtZSk7CisJCWV4aXQoMSk7CisJfQorCisJY3VycmVudF9idWYgPSBtYWxsb2Moc2l6ZW9mKCpjdXJyZW50X2J1ZikpOworCW1lbXNldChjdXJyZW50X2J1ZiwgMCwgc2l6ZW9mKCpjdXJyZW50X2J1ZikpOworCisJY3VycmVudF9maWxlID0gZmlsZV9sb29rdXAobmFtZSk7CisJY3VycmVudF9maWxlLT5saW5lbm8gPSAxOworCWN1cnJlbnRfZmlsZS0+ZmxhZ3MgPSBGSUxFX0JVU1k7Cit9CisKK3ZvaWQgemNvbmZfbmV4dGZpbGUoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3QgZmlsZSAqZmlsZSA9IGZpbGVfbG9va3VwKG5hbWUpOworCXN0cnVjdCBidWZmZXIgKmJ1ZiA9IG1hbGxvYyhzaXplb2YoKmJ1ZikpOworCW1lbXNldChidWYsIDAsIHNpemVvZigqYnVmKSk7CisKKwljdXJyZW50X2J1Zi0+c3RhdGUgPSBZWV9DVVJSRU5UX0JVRkZFUjsKKwl5eWluID0gemNvbmZfZm9wZW4obmFtZSk7CisJaWYgKCF5eWluKSB7CisJCXByaW50ZigiJXM6JWQ6IGNhbid0IG9wZW4gZmlsZSBcIiVzXCJcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCksIG5hbWUpOworCQlleGl0KDEpOworCX0KKwl5eV9zd2l0Y2hfdG9fYnVmZmVyKHl5X2NyZWF0ZV9idWZmZXIoeXlpbiwgWVlfQlVGX1NJWkUpKTsKKwlidWYtPnBhcmVudCA9IGN1cnJlbnRfYnVmOworCWN1cnJlbnRfYnVmID0gYnVmOworCisJaWYgKGZpbGUtPmZsYWdzICYgRklMRV9CVVNZKSB7CisJCXByaW50ZigicmVjdXJzaXZlIHNjYW4gKCVzKT9cbiIsIG5hbWUpOworCQlleGl0KDEpOworCX0KKwlpZiAoZmlsZS0+ZmxhZ3MgJiBGSUxFX1NDQU5ORUQpIHsKKwkJcHJpbnRmKCJmaWxlICVzIGFscmVhZHkgc2Nhbm5lZD9cbiIsIG5hbWUpOworCQlleGl0KDEpOworCX0KKwlmaWxlLT5mbGFncyB8PSBGSUxFX0JVU1k7CisJZmlsZS0+bGluZW5vID0gMTsKKwlmaWxlLT5wYXJlbnQgPSBjdXJyZW50X2ZpbGU7CisJY3VycmVudF9maWxlID0gZmlsZTsKK30KKworc3RhdGljIHN0cnVjdCBidWZmZXIgKnpjb25mX2VuZGZpbGUodm9pZCkKK3sKKwlzdHJ1Y3QgYnVmZmVyICpwYXJlbnQ7CisKKwljdXJyZW50X2ZpbGUtPmZsYWdzIHw9IEZJTEVfU0NBTk5FRDsKKwljdXJyZW50X2ZpbGUtPmZsYWdzICY9IH5GSUxFX0JVU1k7CisJY3VycmVudF9maWxlID0gY3VycmVudF9maWxlLT5wYXJlbnQ7CisKKwlwYXJlbnQgPSBjdXJyZW50X2J1Zi0+cGFyZW50OworCWlmIChwYXJlbnQpIHsKKwkJZmNsb3NlKHl5aW4pOworCQl5eV9kZWxldGVfYnVmZmVyKFlZX0NVUlJFTlRfQlVGRkVSKTsKKwkJeXlfc3dpdGNoX3RvX2J1ZmZlcihwYXJlbnQtPnN0YXRlKTsKKwl9CisJZnJlZShjdXJyZW50X2J1Zik7CisJY3VycmVudF9idWYgPSBwYXJlbnQ7CisKKwlyZXR1cm4gcGFyZW50OworfQorCitpbnQgemNvbmZfbGluZW5vKHZvaWQpCit7CisJaWYgKGN1cnJlbnRfYnVmKQorCQlyZXR1cm4gY3VycmVudF9maWxlLT5saW5lbm8gLSAxOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK2NoYXIgKnpjb25mX2N1cm5hbWUodm9pZCkKK3sKKwlpZiAoY3VycmVudF9idWYpCisJCXJldHVybiBjdXJyZW50X2ZpbGUtPm5hbWU7CisJZWxzZQorCQlyZXR1cm4gIjxub25lPiI7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvemNvbmYudGFiLmNfc2hpcHBlZCBiL3NjcmlwdHMva2NvbmZpZy96Y29uZi50YWIuY19zaGlwcGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxNjNkOGQKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvemNvbmYudGFiLmNfc2hpcHBlZApAQCAtMCwwICsxLDIxMzAgQEAKKy8qIEEgQmlzb24gcGFyc2VyLCBtYWRlIGJ5IEdOVSBCaXNvbiAxLjg3NWEuICAqLworCisvKiBTa2VsZXRvbiBwYXJzZXIgZm9yIFlhY2MtbGlrZSBwYXJzaW5nIHdpdGggQmlzb24sCisgICBDb3B5cmlnaHQgKEMpIDE5ODQsIDE5ODksIDE5OTAsIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB3aGVuIHRoaXMgZmlsZSBpcyBjb3BpZWQgYnkgQmlzb24gaW50byBhCisgICBCaXNvbiBvdXRwdXQgZmlsZSwgeW91IG1heSB1c2UgdGhhdCBvdXRwdXQgZmlsZSB3aXRob3V0IHJlc3RyaWN0aW9uLgorICAgVGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiB3YXMgYWRkZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICAgaW4gdmVyc2lvbiAxLjI0IG9mIEJpc29uLiAgKi8KKworLyogV3JpdHRlbiBieSBSaWNoYXJkIFN0YWxsbWFuIGJ5IHNpbXBsaWZ5aW5nIHRoZSBvcmlnaW5hbCBzbyBjYWxsZWQKKyAgIGBgc2VtYW50aWMnJyBwYXJzZXIuICAqLworCisvKiBBbGwgc3ltYm9scyBkZWZpbmVkIGJlbG93IHNob3VsZCBiZWdpbiB3aXRoIHl5IG9yIFlZLCB0byBhdm9pZAorICAgaW5mcmluZ2luZyBvbiB1c2VyIG5hbWUgc3BhY2UuICBUaGlzIHNob3VsZCBiZSBkb25lIGV2ZW4gZm9yIGxvY2FsCisgICB2YXJpYWJsZXMsIGFzIHRoZXkgbWlnaHQgb3RoZXJ3aXNlIGJlIGV4cGFuZGVkIGJ5IHVzZXIgbWFjcm9zLgorICAgVGhlcmUgYXJlIHNvbWUgdW5hdm9pZGFibGUgZXhjZXB0aW9ucyB3aXRoaW4gaW5jbHVkZSBmaWxlcyB0bworICAgZGVmaW5lIG5lY2Vzc2FyeSBsaWJyYXJ5IHN5bWJvbHM7IHRoZXkgYXJlIG5vdGVkICJJTkZSSU5HRVMgT04KKyAgIFVTRVIgTkFNRSBTUEFDRSIgYmVsb3cuICAqLworCisvKiBJZGVudGlmeSBCaXNvbiBvdXRwdXQuICAqLworI2RlZmluZSBZWUJJU09OIDEKKworLyogU2tlbGV0b24gbmFtZS4gICovCisjZGVmaW5lIFlZU0tFTEVUT05fTkFNRSAieWFjYy5jIgorCisvKiBQdXJlIHBhcnNlcnMuICAqLworI2RlZmluZSBZWVBVUkUgMAorCisvKiBVc2luZyBsb2NhdGlvbnMuICAqLworI2RlZmluZSBZWUxTUF9ORUVERUQgMAorCisvKiBJZiBOQU1FX1BSRUZJWCBpcyBzcGVjaWZpZWQgc3Vic3RpdHV0ZSB0aGUgdmFyaWFibGVzIGFuZCBmdW5jdGlvbnMKKyAgIG5hbWVzLiAgKi8KKyNkZWZpbmUgeXlwYXJzZSB6Y29uZnBhcnNlCisjZGVmaW5lIHl5bGV4ICAgemNvbmZsZXgKKyNkZWZpbmUgeXllcnJvciB6Y29uZmVycm9yCisjZGVmaW5lIHl5bHZhbCAgemNvbmZsdmFsCisjZGVmaW5lIHl5Y2hhciAgemNvbmZjaGFyCisjZGVmaW5lIHl5ZGVidWcgemNvbmZkZWJ1ZworI2RlZmluZSB5eW5lcnJzIHpjb25mbmVycnMKKworCisvKiBUb2tlbnMuICAqLworI2lmbmRlZiBZWVRPS0VOVFlQRQorIyBkZWZpbmUgWVlUT0tFTlRZUEUKKyAgIC8qIFB1dCB0aGUgdG9rZW5zIGludG8gdGhlIHN5bWJvbCB0YWJsZSwgc28gdGhhdCBHREIgYW5kIG90aGVyIGRlYnVnZ2VycworICAgICAga25vdyBhYm91dCB0aGVtLiAgKi8KKyAgIGVudW0geXl0b2tlbnR5cGUgeworICAgICBUX01BSU5NRU5VID0gMjU4LAorICAgICBUX01FTlUgPSAyNTksCisgICAgIFRfRU5ETUVOVSA9IDI2MCwKKyAgICAgVF9TT1VSQ0UgPSAyNjEsCisgICAgIFRfQ0hPSUNFID0gMjYyLAorICAgICBUX0VORENIT0lDRSA9IDI2MywKKyAgICAgVF9DT01NRU5UID0gMjY0LAorICAgICBUX0NPTkZJRyA9IDI2NSwKKyAgICAgVF9NRU5VQ09ORklHID0gMjY2LAorICAgICBUX0hFTFAgPSAyNjcsCisgICAgIFRfSEVMUFRFWFQgPSAyNjgsCisgICAgIFRfSUYgPSAyNjksCisgICAgIFRfRU5ESUYgPSAyNzAsCisgICAgIFRfREVQRU5EUyA9IDI3MSwKKyAgICAgVF9SRVFVSVJFUyA9IDI3MiwKKyAgICAgVF9PUFRJT05BTCA9IDI3MywKKyAgICAgVF9QUk9NUFQgPSAyNzQsCisgICAgIFRfREVGQVVMVCA9IDI3NSwKKyAgICAgVF9UUklTVEFURSA9IDI3NiwKKyAgICAgVF9ERUZfVFJJU1RBVEUgPSAyNzcsCisgICAgIFRfQk9PTEVBTiA9IDI3OCwKKyAgICAgVF9ERUZfQk9PTEVBTiA9IDI3OSwKKyAgICAgVF9TVFJJTkcgPSAyODAsCisgICAgIFRfSU5UID0gMjgxLAorICAgICBUX0hFWCA9IDI4MiwKKyAgICAgVF9XT1JEID0gMjgzLAorICAgICBUX1dPUkRfUVVPVEUgPSAyODQsCisgICAgIFRfVU5FUVVBTCA9IDI4NSwKKyAgICAgVF9FT0YgPSAyODYsCisgICAgIFRfRU9MID0gMjg3LAorICAgICBUX0NMT1NFX1BBUkVOID0gMjg4LAorICAgICBUX09QRU5fUEFSRU4gPSAyODksCisgICAgIFRfT04gPSAyOTAsCisgICAgIFRfU0VMRUNUID0gMjkxLAorICAgICBUX1JBTkdFID0gMjkyLAorICAgICBUX09SID0gMjkzLAorICAgICBUX0FORCA9IDI5NCwKKyAgICAgVF9FUVVBTCA9IDI5NSwKKyAgICAgVF9OT1QgPSAyOTYKKyAgIH07CisjZW5kaWYKKyNkZWZpbmUgVF9NQUlOTUVOVSAyNTgKKyNkZWZpbmUgVF9NRU5VIDI1OQorI2RlZmluZSBUX0VORE1FTlUgMjYwCisjZGVmaW5lIFRfU09VUkNFIDI2MQorI2RlZmluZSBUX0NIT0lDRSAyNjIKKyNkZWZpbmUgVF9FTkRDSE9JQ0UgMjYzCisjZGVmaW5lIFRfQ09NTUVOVCAyNjQKKyNkZWZpbmUgVF9DT05GSUcgMjY1CisjZGVmaW5lIFRfTUVOVUNPTkZJRyAyNjYKKyNkZWZpbmUgVF9IRUxQIDI2NworI2RlZmluZSBUX0hFTFBURVhUIDI2OAorI2RlZmluZSBUX0lGIDI2OQorI2RlZmluZSBUX0VORElGIDI3MAorI2RlZmluZSBUX0RFUEVORFMgMjcxCisjZGVmaW5lIFRfUkVRVUlSRVMgMjcyCisjZGVmaW5lIFRfT1BUSU9OQUwgMjczCisjZGVmaW5lIFRfUFJPTVBUIDI3NAorI2RlZmluZSBUX0RFRkFVTFQgMjc1CisjZGVmaW5lIFRfVFJJU1RBVEUgMjc2CisjZGVmaW5lIFRfREVGX1RSSVNUQVRFIDI3NworI2RlZmluZSBUX0JPT0xFQU4gMjc4CisjZGVmaW5lIFRfREVGX0JPT0xFQU4gMjc5CisjZGVmaW5lIFRfU1RSSU5HIDI4MAorI2RlZmluZSBUX0lOVCAyODEKKyNkZWZpbmUgVF9IRVggMjgyCisjZGVmaW5lIFRfV09SRCAyODMKKyNkZWZpbmUgVF9XT1JEX1FVT1RFIDI4NAorI2RlZmluZSBUX1VORVFVQUwgMjg1CisjZGVmaW5lIFRfRU9GIDI4NgorI2RlZmluZSBUX0VPTCAyODcKKyNkZWZpbmUgVF9DTE9TRV9QQVJFTiAyODgKKyNkZWZpbmUgVF9PUEVOX1BBUkVOIDI4OQorI2RlZmluZSBUX09OIDI5MAorI2RlZmluZSBUX1NFTEVDVCAyOTEKKyNkZWZpbmUgVF9SQU5HRSAyOTIKKyNkZWZpbmUgVF9PUiAyOTMKKyNkZWZpbmUgVF9BTkQgMjk0CisjZGVmaW5lIFRfRVFVQUwgMjk1CisjZGVmaW5lIFRfTk9UIDI5NgorCisKKworCisvKiBDb3B5IHRoZSBmaXJzdCBwYXJ0IG9mIHVzZXIgZGVjbGFyYXRpb25zLiAgKi8KKworCisvKgorICogQ29weXJpZ2h0IChDKSAyMDAyIFJvbWFuIFppcHBlbCA8emlwcGVsQGxpbnV4LW02OGsub3JnPgorICogUmVsZWFzZWQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR1BMIHYyLjAuCisgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKyNkZWZpbmUgcHJpbnRkKG1hc2ssIGZtdC4uLikgaWYgKGNkZWJ1ZyAmIChtYXNrKSkgcHJpbnRmKGZtdCkKKworI2RlZmluZSBQUklOVEQJCTB4MDAwMQorI2RlZmluZSBERUJVR19QQVJTRQkweDAwMDIKKworaW50IGNkZWJ1ZyA9IFBSSU5URDsKKworZXh0ZXJuIGludCB6Y29uZmxleCh2b2lkKTsKK3N0YXRpYyB2b2lkIHpjb25mcHJpbnQoY29uc3QgY2hhciAqZXJyLCAuLi4pOworc3RhdGljIHZvaWQgemNvbmZlcnJvcihjb25zdCBjaGFyICplcnIpOworc3RhdGljIGJvb2wgemNvbmZfZW5kdG9rZW4oaW50IHRva2VuLCBpbnQgc3RhcnR0b2tlbiwgaW50IGVuZHRva2VuKTsKKworc3RydWN0IHN5bWJvbCAqc3ltYm9sX2hhc2hbMjU3XTsKKworc3RhdGljIHN0cnVjdCBtZW51ICpjdXJyZW50X21lbnUsICpjdXJyZW50X2VudHJ5OworCisjZGVmaW5lIFlZRVJST1JfVkVSQk9TRQorCisKKy8qIEVuYWJsaW5nIHRyYWNlcy4gICovCisjaWZuZGVmIFlZREVCVUcKKyMgZGVmaW5lIFlZREVCVUcgMAorI2VuZGlmCisKKy8qIEVuYWJsaW5nIHZlcmJvc2UgZXJyb3IgbWVzc2FnZXMuICAqLworI2lmZGVmIFlZRVJST1JfVkVSQk9TRQorIyB1bmRlZiBZWUVSUk9SX1ZFUkJPU0UKKyMgZGVmaW5lIFlZRVJST1JfVkVSQk9TRSAxCisjZWxzZQorIyBkZWZpbmUgWVlFUlJPUl9WRVJCT1NFIDAKKyNlbmRpZgorCisjaWYgISBkZWZpbmVkIChZWVNUWVBFKSAmJiAhIGRlZmluZWQgKFlZU1RZUEVfSVNfREVDTEFSRUQpCisKK3R5cGVkZWYgdW5pb24gWVlTVFlQRSB7CisJaW50IHRva2VuOworCWNoYXIgKnN0cmluZzsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW1ib2w7CisJc3RydWN0IGV4cHIgKmV4cHI7CisJc3RydWN0IG1lbnUgKm1lbnU7Cit9IFlZU1RZUEU7CisvKiBMaW5lIDE5MSBvZiB5YWNjLmMuICAqLworCisjIGRlZmluZSB5eXN0eXBlIFlZU1RZUEUgLyogb2Jzb2xlc2NlbnQ7IHdpbGwgYmUgd2l0aGRyYXduICovCisjIGRlZmluZSBZWVNUWVBFX0lTX0RFQ0xBUkVEIDEKKyMgZGVmaW5lIFlZU1RZUEVfSVNfVFJJVklBTCAxCisjZW5kaWYKKworCisKKy8qIENvcHkgdGhlIHNlY29uZCBwYXJ0IG9mIHVzZXIgZGVjbGFyYXRpb25zLiAgKi8KKworCisjZGVmaW5lIExLQ19ESVJFQ1RfTElOSworI2luY2x1ZGUgImxrYy5oIgorCisKKy8qIExpbmUgMjE0IG9mIHlhY2MuYy4gICovCisKKworI2lmICEgZGVmaW5lZCAoeXlvdmVyZmxvdykgfHwgWVlFUlJPUl9WRVJCT1NFCisKKy8qIFRoZSBwYXJzZXIgaW52b2tlcyBhbGxvY2Egb3IgbWFsbG9jOyBkZWZpbmUgdGhlIG5lY2Vzc2FyeSBzeW1ib2xzLiAgKi8KKworIyBpZiBZWVNUQUNLX1VTRV9BTExPQ0EKKyMgIGRlZmluZSBZWVNUQUNLX0FMTE9DIGFsbG9jYQorIyBlbHNlCisjICBpZm5kZWYgWVlTVEFDS19VU0VfQUxMT0NBCisjICAgaWYgZGVmaW5lZCAoYWxsb2NhKSB8fCBkZWZpbmVkIChfQUxMT0NBX0gpCisjICAgIGRlZmluZSBZWVNUQUNLX0FMTE9DIGFsbG9jYQorIyAgIGVsc2UKKyMgICAgaWZkZWYgX19HTlVDX18KKyMgICAgIGRlZmluZSBZWVNUQUNLX0FMTE9DIF9fYnVpbHRpbl9hbGxvY2EKKyMgICAgZW5kaWYKKyMgICBlbmRpZgorIyAgZW5kaWYKKyMgZW5kaWYKKworIyBpZmRlZiBZWVNUQUNLX0FMTE9DCisgICAvKiBQYWNpZnkgR0NDJ3MgYGVtcHR5IGlmLWJvZHknIHdhcm5pbmcuICovCisjICBkZWZpbmUgWVlTVEFDS19GUkVFKFB0cikgZG8geyAvKiBlbXB0eSAqLzsgfSB3aGlsZSAoMCkKKyMgZWxzZQorIyAgaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQorIyAgIGluY2x1ZGUgPHN0ZGxpYi5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCisjICAgZGVmaW5lIFlZU0laRV9UIHNpemVfdAorIyAgZW5kaWYKKyMgIGRlZmluZSBZWVNUQUNLX0FMTE9DIG1hbGxvYworIyAgZGVmaW5lIFlZU1RBQ0tfRlJFRSBmcmVlCisjIGVuZGlmCisjZW5kaWYgLyogISBkZWZpbmVkICh5eW92ZXJmbG93KSB8fCBZWUVSUk9SX1ZFUkJPU0UgKi8KKworCisjaWYgKCEgZGVmaW5lZCAoeXlvdmVyZmxvdykgXAorICAgICAmJiAoISBkZWZpbmVkIChfX2NwbHVzcGx1cykgXAorCSB8fCAoWVlTVFlQRV9JU19UUklWSUFMKSkpCisKKy8qIEEgdHlwZSB0aGF0IGlzIHByb3Blcmx5IGFsaWduZWQgZm9yIGFueSBzdGFjayBtZW1iZXIuICAqLwordW5pb24geXlhbGxvYworeworICBzaG9ydCB5eXNzOworICBZWVNUWVBFIHl5dnM7CisgIH07CisKKy8qIFRoZSBzaXplIG9mIHRoZSBtYXhpbXVtIGdhcCBiZXR3ZWVuIG9uZSBhbGlnbmVkIHN0YWNrIGFuZCB0aGUgbmV4dC4gICovCisjIGRlZmluZSBZWVNUQUNLX0dBUF9NQVhJTVVNIChzaXplb2YgKHVuaW9uIHl5YWxsb2MpIC0gMSkKKworLyogVGhlIHNpemUgb2YgYW4gYXJyYXkgbGFyZ2UgdG8gZW5vdWdoIHRvIGhvbGQgYWxsIHN0YWNrcywgZWFjaCB3aXRoCisgICBOIGVsZW1lbnRzLiAgKi8KKyMgZGVmaW5lIFlZU1RBQ0tfQllURVMoTikgXAorICAgICAoKE4pICogKHNpemVvZiAoc2hvcnQpICsgc2l6ZW9mIChZWVNUWVBFKSkJCQkJXAorICAgICAgKyBZWVNUQUNLX0dBUF9NQVhJTVVNKQorCisvKiBDb3B5IENPVU5UIG9iamVjdHMgZnJvbSBGUk9NIHRvIFRPLiAgVGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gZG8KKyAgIG5vdCBvdmVybGFwLiAgKi8KKyMgaWZuZGVmIFlZQ09QWQorIyAgaWYgMSA8IF9fR05VQ19fCisjICAgZGVmaW5lIFlZQ09QWShUbywgRnJvbSwgQ291bnQpIFwKKyAgICAgIF9fYnVpbHRpbl9tZW1jcHkgKFRvLCBGcm9tLCAoQ291bnQpICogc2l6ZW9mICgqKEZyb20pKSkKKyMgIGVsc2UKKyMgICBkZWZpbmUgWVlDT1BZKFRvLCBGcm9tLCBDb3VudCkJCVwKKyAgICAgIGRvCQkJCQlcCisJewkJCQkJXAorCSAgcmVnaXN0ZXIgWVlTSVpFX1QgeXlpOwkJXAorCSAgZm9yICh5eWkgPSAwOyB5eWkgPCAoQ291bnQpOyB5eWkrKykJXAorCSAgICAoVG8pW3l5aV0gPSAoRnJvbSlbeXlpXTsJCVwKKwl9CQkJCQlcCisgICAgICB3aGlsZSAoMCkKKyMgIGVuZGlmCisjIGVuZGlmCisKKy8qIFJlbG9jYXRlIFNUQUNLIGZyb20gaXRzIG9sZCBsb2NhdGlvbiB0byB0aGUgbmV3IG9uZS4gIFRoZQorICAgbG9jYWwgdmFyaWFibGVzIFlZU0laRSBhbmQgWVlTVEFDS1NJWkUgZ2l2ZSB0aGUgb2xkIGFuZCBuZXcgbnVtYmVyIG9mCisgICBlbGVtZW50cyBpbiB0aGUgc3RhY2ssIGFuZCBZWVBUUiBnaXZlcyB0aGUgbmV3IGxvY2F0aW9uIG9mIHRoZQorICAgc3RhY2suICBBZHZhbmNlIFlZUFRSIHRvIGEgcHJvcGVybHkgYWxpZ25lZCBsb2NhdGlvbiBmb3IgdGhlIG5leHQKKyAgIHN0YWNrLiAgKi8KKyMgZGVmaW5lIFlZU1RBQ0tfUkVMT0NBVEUoU3RhY2spCQkJCQlcCisgICAgZG8JCQkJCQkJCQlcCisgICAgICB7CQkJCQkJCQkJXAorCVlZU0laRV9UIHl5bmV3Ynl0ZXM7CQkJCQkJXAorCVlZQ09QWSAoJnl5cHRyLT5TdGFjaywgU3RhY2ssIHl5c2l6ZSk7CQkJCVwKKwlTdGFjayA9ICZ5eXB0ci0+U3RhY2s7CQkJCQkJXAorCXl5bmV3Ynl0ZXMgPSB5eXN0YWNrc2l6ZSAqIHNpemVvZiAoKlN0YWNrKSArIFlZU1RBQ0tfR0FQX01BWElNVU07IFwKKwl5eXB0ciArPSB5eW5ld2J5dGVzIC8gc2l6ZW9mICgqeXlwdHIpOwkJCQlcCisgICAgICB9CQkJCQkJCQkJXAorICAgIHdoaWxlICgwKQorCisjZW5kaWYKKworI2lmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKKyAgIHR5cGVkZWYgc2lnbmVkIGNoYXIgeXlzaWduZWRfY2hhcjsKKyNlbHNlCisgICB0eXBlZGVmIHNob3J0IHl5c2lnbmVkX2NoYXI7CisjZW5kaWYKKworLyogWVlGSU5BTCAtLSBTdGF0ZSBudW1iZXIgb2YgdGhlIHRlcm1pbmF0aW9uIHN0YXRlLiAqLworI2RlZmluZSBZWUZJTkFMICAyCisvKiBZWUxBU1QgLS0gTGFzdCBpbmRleCBpbiBZWVRBQkxFLiAgKi8KKyNkZWZpbmUgWVlMQVNUICAgMjAxCisKKy8qIFlZTlRPS0VOUyAtLSBOdW1iZXIgb2YgdGVybWluYWxzLiAqLworI2RlZmluZSBZWU5UT0tFTlMgIDQyCisvKiBZWU5OVFMgLS0gTnVtYmVyIG9mIG5vbnRlcm1pbmFscy4gKi8KKyNkZWZpbmUgWVlOTlRTICA0MQorLyogWVlOUlVMRVMgLS0gTnVtYmVyIG9mIHJ1bGVzLiAqLworI2RlZmluZSBZWU5SVUxFUyAgMTA0CisvKiBZWU5SVUxFUyAtLSBOdW1iZXIgb2Ygc3RhdGVzLiAqLworI2RlZmluZSBZWU5TVEFURVMgIDE4MgorCisvKiBZWVRSQU5TTEFURShZWUxFWCkgLS0gQmlzb24gc3ltYm9sIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIFlZTEVYLiAgKi8KKyNkZWZpbmUgWVlVTkRFRlRPSyAgMgorI2RlZmluZSBZWU1BWFVUT0sgICAyOTYKKworI2RlZmluZSBZWVRSQU5TTEFURShZWVgpIAkJCQkJCVwKKyAgKCh1bnNpZ25lZCBpbnQpIChZWVgpIDw9IFlZTUFYVVRPSyA/IHl5dHJhbnNsYXRlW1lZWF0gOiBZWVVOREVGVE9LKQorCisvKiBZWVRSQU5TTEFURVtZWUxFWF0gLS0gQmlzb24gc3ltYm9sIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIFlZTEVYLiAgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHl5dHJhbnNsYXRlW10gPQoreworICAgICAgIDAsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLAorICAgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMSwgICAgIDIsICAgICAzLCAgICAgNCwKKyAgICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwgICAgMTAsICAgIDExLCAgICAxMiwgICAgMTMsICAgIDE0LAorICAgICAgMTUsICAgIDE2LCAgICAxNywgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIyLCAgICAyMywgICAgMjQsCisgICAgICAyNSwgICAgMjYsICAgIDI3LCAgICAyOCwgICAgMjksICAgIDMwLCAgICAzMSwgICAgMzIsICAgIDMzLCAgICAzNCwKKyAgICAgIDM1LCAgICAzNiwgICAgMzcsICAgIDM4LCAgICAzOSwgICAgNDAsICAgIDQxCit9OworCisjaWYgWVlERUJVRworLyogWVlQUkhTW1lZTl0gLS0gSW5kZXggb2YgdGhlIGZpcnN0IFJIUyBzeW1ib2wgb2YgcnVsZSBudW1iZXIgWVlOIGluCisgICBZWVJIUy4gICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgeXlwcmhzW10gPQoreworICAgICAgIDAsICAgICAwLCAgICAgMywgICAgIDQsICAgICA3LCAgICAgOSwgICAgMTEsICAgIDEzLCAgICAxNywgICAgMTksCisgICAgICAyMSwgICAgMjMsICAgIDI2LCAgICAyOCwgICAgMzAsICAgIDMyLCAgICAzNCwgICAgMzYsICAgIDM4LCAgICA0MiwKKyAgICAgIDQ1LCAgICA0OSwgICAgNTIsICAgIDUzLCAgICA1NiwgICAgNTksICAgIDYyLCAgICA2NSwgICAgNjksICAgIDc0LAorICAgICAgNzgsICAgIDgzLCAgICA4NywgICAgOTEsICAgIDk1LCAgIDEwMCwgICAxMDUsICAgMTEwLCAgIDExNiwgICAxMTksCisgICAgIDEyMiwgICAxMjQsICAgMTI4LCAgIDEzMSwgICAxMzIsICAgMTM1LCAgIDEzOCwgICAxNDEsICAgMTQ0LCAgIDE0OSwKKyAgICAgMTUzLCAgIDE1NywgICAxNjAsICAgMTY1LCAgIDE2NiwgICAxNjksICAgMTczLCAgIDE3NSwgICAxNzksICAgMTgyLAorICAgICAxODMsICAgMTg2LCAgIDE4OSwgICAxOTIsICAgMTk2LCAgIDE5OSwgICAyMDEsICAgMjA1LCAgIDIwOCwgICAyMDksCisgICAgIDIxMiwgICAyMTUsICAgMjE4LCAgIDIyMiwgICAyMjYsICAgMjI4LCAgIDIzMiwgICAyMzUsICAgMjM4LCAgIDI0MSwKKyAgICAgMjQyLCAgIDI0NSwgICAyNDgsICAgMjUzLCAgIDI1NywgICAyNjEsICAgMjYyLCAgIDI2NSwgICAyNjcsICAgMjY5LAorICAgICAyNzIsICAgMjc1LCAgIDI3OCwgICAyODAsICAgMjgyLCAgIDI4MywgICAyODYsICAgMjg4LCAgIDI5MiwgICAyOTYsCisgICAgIDMwMCwgICAzMDMsICAgMzA3LCAgIDMxMSwgICAzMTMKK307CisKKy8qIFlZUkhTIC0tIEEgYC0xJy1zZXBhcmF0ZWQgbGlzdCBvZiB0aGUgcnVsZXMnIFJIUy4gKi8KK3N0YXRpYyBjb25zdCB5eXNpZ25lZF9jaGFyIHl5cmhzW10gPQoreworICAgICAgNDMsICAgICAwLCAgICAtMSwgICAgLTEsICAgIDQzLCAgICA0NCwgICAgLTEsICAgIDQ1LCAgICAtMSwgICAgNTUsCisgICAgICAtMSwgICAgNjYsICAgIC0xLCAgICAgMywgICAgNzcsICAgIDc5LCAgICAtMSwgICAgIDUsICAgIC0xLCAgICAxNSwKKyAgICAgIC0xLCAgICAgOCwgICAgLTEsICAgICAxLCAgICA3OSwgICAgLTEsICAgIDYxLCAgICAtMSwgICAgNzEsICAgIC0xLAorICAgICAgNDcsICAgIC0xLCAgICA0OSwgICAgLTEsICAgIDY5LCAgICAtMSwgICAgNzksICAgIC0xLCAgICAxMCwgICAgMjgsCisgICAgICAzMiwgICAgLTEsICAgIDQ2LCAgICA1MCwgICAgLTEsICAgIDExLCAgICAyOCwgICAgMzIsICAgIC0xLCAgICA0OCwKKyAgICAgIDUwLCAgICAtMSwgICAgLTEsICAgIDUwLCAgICA1MSwgICAgLTEsICAgIDUwLCAgICA3NSwgICAgLTEsICAgIDUwLAorICAgICAgNzMsICAgIC0xLCAgICA1MCwgICAgMzIsICAgIC0xLCAgICAyMSwgICAgNzYsICAgIDMyLCAgICAtMSwgICAgMjIsCisgICAgICA4MSwgICAgODAsICAgIDMyLCAgICAtMSwgICAgMjMsICAgIDc2LCAgICAzMiwgICAgLTEsICAgIDI0LCAgICA4MSwKKyAgICAgIDgwLCAgICAzMiwgICAgLTEsICAgIDI2LCAgICA3NiwgICAgMzIsICAgIC0xLCAgICAyNywgICAgNzYsICAgIDMyLAorICAgICAgLTEsICAgIDI1LCAgICA3NiwgICAgMzIsICAgIC0xLCAgICAxOSwgICAgNzcsICAgIDgwLCAgICAzMiwgICAgLTEsCisgICAgICAyMCwgICAgODEsICAgIDgwLCAgICAzMiwgICAgLTEsICAgIDM2LCAgICAyOCwgICAgODAsICAgIDMyLCAgICAtMSwKKyAgICAgIDM3LCAgICA4MiwgICAgODIsICAgIDgwLCAgICAzMiwgICAgLTEsICAgICA3LCAgICAzMiwgICAgLTEsICAgIDUyLAorICAgICAgNTYsICAgIC0xLCAgICA3OCwgICAgLTEsICAgIDUzLCAgICA1OCwgICAgNTQsICAgIC0xLCAgICA1MywgICAgNTgsCisgICAgICAtMSwgICAgLTEsICAgIDU2LCAgICA1NywgICAgLTEsICAgIDU2LCAgICA3NSwgICAgLTEsICAgIDU2LCAgICA3MywKKyAgICAgIC0xLCAgICA1NiwgICAgMzIsICAgIC0xLCAgICAxOSwgICAgNzcsICAgIDgwLCAgICAzMiwgICAgLTEsICAgIDIxLAorICAgICAgNzYsICAgIDMyLCAgICAtMSwgICAgMjMsICAgIDc2LCAgICAzMiwgICAgLTEsICAgIDE4LCAgICAzMiwgICAgLTEsCisgICAgICAyMCwgICAgMjgsICAgIDgwLCAgICAzMiwgICAgLTEsICAgIC0xLCAgICA1OCwgICAgNDUsICAgIC0xLCAgICAxNCwKKyAgICAgIDgxLCAgICAzMiwgICAgLTEsICAgIDc4LCAgICAtMSwgICAgNTksICAgIDYyLCAgICA2MCwgICAgLTEsICAgIDU5LAorICAgICAgNjIsICAgIC0xLCAgICAtMSwgICAgNjIsICAgIDQ1LCAgICAtMSwgICAgNjIsICAgIDY2LCAgICAtMSwgICAgNjIsCisgICAgICA1NSwgICAgLTEsICAgICA0LCAgICA3NywgICAgMzIsICAgIC0xLCAgICA2MywgICAgNzQsICAgIC0xLCAgICA3OCwKKyAgICAgIC0xLCAgICA2NCwgICAgNjcsICAgIDY1LCAgICAtMSwgICAgNjQsICAgIDY3LCAgICAtMSwgICAgLTEsICAgIDY3LAorICAgICAgNDUsICAgIC0xLCAgICA2NywgICAgNjYsICAgIC0xLCAgICA2NywgICAgNTUsICAgIC0xLCAgICA2NywgICAgIDEsCisgICAgICAzMiwgICAgLTEsICAgICA2LCAgICA3NywgICAgMzIsICAgIC0xLCAgICA2OCwgICAgLTEsICAgICA5LCAgICA3NywKKyAgICAgIDMyLCAgICAtMSwgICAgNzAsICAgIDc0LCAgICAtMSwgICAgMTIsICAgIDMyLCAgICAtMSwgICAgNzIsICAgIDEzLAorICAgICAgLTEsICAgIC0xLCAgICA3NCwgICAgNzUsICAgIC0xLCAgICA3NCwgICAgMzIsICAgIC0xLCAgICAxNiwgICAgMzUsCisgICAgICA4MSwgICAgMzIsICAgIC0xLCAgICAxNiwgICAgODEsICAgIDMyLCAgICAtMSwgICAgMTcsICAgIDgxLCAgICAzMiwKKyAgICAgIC0xLCAgICAtMSwgICAgNzcsICAgIDgwLCAgICAtMSwgICAgMjgsICAgIC0xLCAgICAyOSwgICAgLTEsICAgICA1LAorICAgICAgNzksICAgIC0xLCAgICAgOCwgICAgNzksICAgIC0xLCAgICAxNSwgICAgNzksICAgIC0xLCAgICAzMiwgICAgLTEsCisgICAgICAzMSwgICAgLTEsICAgIC0xLCAgICAxNCwgICAgODEsICAgIC0xLCAgICA4MiwgICAgLTEsICAgIDgyLCAgICA0MCwKKyAgICAgIDgyLCAgICAtMSwgICAgODIsICAgIDMwLCAgICA4MiwgICAgLTEsICAgIDM0LCAgICA4MSwgICAgMzMsICAgIC0xLAorICAgICAgNDEsICAgIDgxLCAgICAtMSwgICAgODEsICAgIDM4LCAgICA4MSwgICAgLTEsICAgIDgxLCAgICAzOSwgICAgODEsCisgICAgICAtMSwgICAgMjgsICAgIC0xLCAgICAyOSwgICAgLTEKK307CisKKy8qIFlZUkxJTkVbWVlOXSAtLSBzb3VyY2UgbGluZSB3aGVyZSBydWxlIG51bWJlciBZWU4gd2FzIGRlZmluZWQuICAqLworc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNob3J0IHl5cmxpbmVbXSA9Cit7CisgICAgICAgMCwgICAgOTQsICAgIDk0LCAgICA5NSwgICAgOTgsICAgIDk5LCAgIDEwMCwgICAxMDEsICAgMTAyLCAgIDEwMywKKyAgICAgMTA0LCAgIDEwNSwgICAxMDksICAgMTEwLCAgIDExMSwgICAxMTIsICAgMTEzLCAgIDExNCwgICAxMjAsICAgMTI4LAorICAgICAxMzQsICAgMTQyLCAgIDE1MiwgICAxNTQsICAgMTU1LCAgIDE1NiwgICAxNTcsICAgMTYwLCAgIDE2NiwgICAxNzMsCisgICAgIDE3OSwgICAxODYsICAgMTkyLCAgIDE5OCwgICAyMDQsICAgMjEwLCAgIDIxNiwgICAyMjIsICAgMjMwLCAgIDIzOSwKKyAgICAgMjQ1LCAgIDI1NCwgICAyNTUsICAgMjYxLCAgIDI2MywgICAyNjQsICAgMjY1LCAgIDI2NiwgICAyNjksICAgMjc1LAorICAgICAyODEsICAgMjg3LCAgIDI5MywgICAyOTksICAgMzAxLCAgIDMwNiwgICAzMTUsICAgMzI0LCAgIDMyNSwgICAzMzEsCisgICAgIDMzMywgICAzMzQsICAgMzM1LCAgIDM0MCwgICAzNDcsICAgMzUzLCAgIDM2MiwgICAzNjMsICAgMzY5LCAgIDM3MSwKKyAgICAgMzcyLCAgIDM3MywgICAzNzQsICAgMzc3LCAgIDM4MywgICAzOTAsICAgMzk3LCAgIDQwNCwgICA0MTAsICAgNDE3LAorICAgICA0MTgsICAgNDE5LCAgIDQyMiwgICA0MjcsICAgNDMyLCAgIDQ0MCwgICA0NDIsICAgNDQ3LCAgIDQ0OCwgICA0NTEsCisgICAgIDQ1MiwgICA0NTMsICAgNDU3LCAgIDQ1NywgICA0NTksICAgNDYwLCAgIDQ2MywgICA0NjQsICAgNDY1LCAgIDQ2NiwKKyAgICAgNDY3LCAgIDQ2OCwgICA0NjksICAgNDcyLCAgIDQ3MworfTsKKyNlbmRpZgorCisjaWYgWVlERUJVRyB8fCBZWUVSUk9SX1ZFUkJPU0UKKy8qIFlZVE5NRVtTWU1CT0wtTlVNXSAtLSBTdHJpbmcgbmFtZSBvZiB0aGUgc3ltYm9sIFNZTUJPTC1OVU0uCisgICBGaXJzdCwgdGhlIHRlcm1pbmFscywgdGhlbiwgc3RhcnRpbmcgYXQgWVlOVE9LRU5TLCBub250ZXJtaW5hbHMuICovCitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgeXl0bmFtZVtdID0KK3sKKyAgIiRlbmQiLCAiZXJyb3IiLCAiJHVuZGVmaW5lZCIsICJUX01BSU5NRU5VIiwgIlRfTUVOVSIsICJUX0VORE1FTlUiLCAKKyAgIlRfU09VUkNFIiwgIlRfQ0hPSUNFIiwgIlRfRU5EQ0hPSUNFIiwgIlRfQ09NTUVOVCIsICJUX0NPTkZJRyIsIAorICAiVF9NRU5VQ09ORklHIiwgIlRfSEVMUCIsICJUX0hFTFBURVhUIiwgIlRfSUYiLCAiVF9FTkRJRiIsICJUX0RFUEVORFMiLCAKKyAgIlRfUkVRVUlSRVMiLCAiVF9PUFRJT05BTCIsICJUX1BST01QVCIsICJUX0RFRkFVTFQiLCAiVF9UUklTVEFURSIsIAorICAiVF9ERUZfVFJJU1RBVEUiLCAiVF9CT09MRUFOIiwgIlRfREVGX0JPT0xFQU4iLCAiVF9TVFJJTkciLCAiVF9JTlQiLCAKKyAgIlRfSEVYIiwgIlRfV09SRCIsICJUX1dPUkRfUVVPVEUiLCAiVF9VTkVRVUFMIiwgIlRfRU9GIiwgIlRfRU9MIiwgCisgICJUX0NMT1NFX1BBUkVOIiwgIlRfT1BFTl9QQVJFTiIsICJUX09OIiwgIlRfU0VMRUNUIiwgIlRfUkFOR0UiLCAiVF9PUiIsIAorICAiVF9BTkQiLCAiVF9FUVVBTCIsICJUX05PVCIsICIkYWNjZXB0IiwgImlucHV0IiwgImJsb2NrIiwgCisgICJjb21tb25fYmxvY2siLCAiY29uZmlnX2VudHJ5X3N0YXJ0IiwgImNvbmZpZ19zdG10IiwgCisgICJtZW51Y29uZmlnX2VudHJ5X3N0YXJ0IiwgIm1lbnVjb25maWdfc3RtdCIsICJjb25maWdfb3B0aW9uX2xpc3QiLCAKKyAgImNvbmZpZ19vcHRpb24iLCAiY2hvaWNlIiwgImNob2ljZV9lbnRyeSIsICJjaG9pY2VfZW5kIiwgImNob2ljZV9zdG10IiwgCisgICJjaG9pY2Vfb3B0aW9uX2xpc3QiLCAiY2hvaWNlX29wdGlvbiIsICJjaG9pY2VfYmxvY2siLCAiaWYiLCAiaWZfZW5kIiwgCisgICJpZl9zdG10IiwgImlmX2Jsb2NrIiwgIm1lbnUiLCAibWVudV9lbnRyeSIsICJtZW51X2VuZCIsICJtZW51X3N0bXQiLCAKKyAgIm1lbnVfYmxvY2siLCAic291cmNlIiwgInNvdXJjZV9zdG10IiwgImNvbW1lbnQiLCAiY29tbWVudF9zdG10IiwgCisgICJoZWxwX3N0YXJ0IiwgImhlbHAiLCAiZGVwZW5kc19saXN0IiwgImRlcGVuZHMiLCAicHJvbXB0X3N0bXRfb3B0IiwgCisgICJwcm9tcHQiLCAiZW5kIiwgIm5sX29yX2VvZiIsICJpZl9leHByIiwgImV4cHIiLCAic3ltYm9sIiwgMAorfTsKKyNlbmRpZgorCisjIGlmZGVmIFlZUFJJTlQKKy8qIFlZVE9LTlVNW1lZTEVYLU5VTV0gLS0gSW50ZXJuYWwgdG9rZW4gbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8KKyAgIHRva2VuIFlZTEVYLU5VTS4gICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgeXl0b2tudW1bXSA9Cit7CisgICAgICAgMCwgICAyNTYsICAgMjU3LCAgIDI1OCwgICAyNTksICAgMjYwLCAgIDI2MSwgICAyNjIsICAgMjYzLCAgIDI2NCwKKyAgICAgMjY1LCAgIDI2NiwgICAyNjcsICAgMjY4LCAgIDI2OSwgICAyNzAsICAgMjcxLCAgIDI3MiwgICAyNzMsICAgMjc0LAorICAgICAyNzUsICAgMjc2LCAgIDI3NywgICAyNzgsICAgMjc5LCAgIDI4MCwgICAyODEsICAgMjgyLCAgIDI4MywgICAyODQsCisgICAgIDI4NSwgICAyODYsICAgMjg3LCAgIDI4OCwgICAyODksICAgMjkwLCAgIDI5MSwgICAyOTIsICAgMjkzLCAgIDI5NCwKKyAgICAgMjk1LCAgIDI5NgorfTsKKyMgZW5kaWYKKworLyogWVlSMVtZWU5dIC0tIFN5bWJvbCBudW1iZXIgb2Ygc3ltYm9sIHRoYXQgcnVsZSBZWU4gZGVyaXZlcy4gICovCitzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciB5eXIxW10gPQoreworICAgICAgIDAsICAgIDQyLCAgICA0MywgICAgNDMsICAgIDQ0LCAgICA0NCwgICAgNDQsICAgIDQ0LCAgICA0NCwgICAgNDQsCisgICAgICA0NCwgICAgNDQsICAgIDQ1LCAgICA0NSwgICAgNDUsICAgIDQ1LCAgICA0NSwgICAgNDUsICAgIDQ2LCAgICA0NywKKyAgICAgIDQ4LCAgICA0OSwgICAgNTAsICAgIDUwLCAgICA1MCwgICAgNTAsICAgIDUwLCAgICA1MSwgICAgNTEsICAgIDUxLAorICAgICAgNTEsICAgIDUxLCAgICA1MSwgICAgNTEsICAgIDUxLCAgICA1MSwgICAgNTEsICAgIDUxLCAgICA1MiwgICAgNTMsCisgICAgICA1NCwgICAgNTUsICAgIDU1LCAgICA1NiwgICAgNTYsICAgIDU2LCAgICA1NiwgICAgNTYsICAgIDU3LCAgICA1NywKKyAgICAgIDU3LCAgICA1NywgICAgNTcsICAgIDU4LCAgICA1OCwgICAgNTksICAgIDYwLCAgICA2MSwgICAgNjEsICAgIDYyLAorICAgICAgNjIsICAgIDYyLCAgICA2MiwgICAgNjMsICAgIDY0LCAgICA2NSwgICAgNjYsICAgIDY2LCAgICA2NywgICAgNjcsCisgICAgICA2NywgICAgNjcsICAgIDY3LCAgICA2OCwgICAgNjksICAgIDcwLCAgICA3MSwgICAgNzIsICAgIDczLCAgICA3NCwKKyAgICAgIDc0LCAgICA3NCwgICAgNzUsICAgIDc1LCAgICA3NSwgICAgNzYsICAgIDc2LCAgICA3NywgICAgNzcsICAgIDc4LAorICAgICAgNzgsICAgIDc4LCAgICA3OSwgICAgNzksICAgIDgwLCAgICA4MCwgICAgODEsICAgIDgxLCAgICA4MSwgICAgODEsCisgICAgICA4MSwgICAgODEsICAgIDgxLCAgICA4MiwgICAgODIKK307CisKKy8qIFlZUjJbWVlOXSAtLSBOdW1iZXIgb2Ygc3ltYm9scyBjb21wb3NpbmcgcmlnaHQgaGFuZCBzaWRlIG9mIHJ1bGUgWVlOLiAgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHl5cjJbXSA9Cit7CisgICAgICAgMCwgICAgIDIsICAgICAwLCAgICAgMiwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDMsICAgICAxLCAgICAgMSwKKyAgICAgICAxLCAgICAgMiwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDMsICAgICAyLAorICAgICAgIDMsICAgICAyLCAgICAgMCwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAzLCAgICAgNCwgICAgIDMsCisgICAgICAgNCwgICAgIDMsICAgICAzLCAgICAgMywgICAgIDQsICAgICA0LCAgICAgNCwgICAgIDUsICAgICAyLCAgICAgMiwKKyAgICAgICAxLCAgICAgMywgICAgIDIsICAgICAwLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMiwgICAgIDQsICAgICAzLAorICAgICAgIDMsICAgICAyLCAgICAgNCwgICAgIDAsICAgICAyLCAgICAgMywgICAgIDEsICAgICAzLCAgICAgMiwgICAgIDAsCisgICAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMywgICAgIDIsICAgICAxLCAgICAgMywgICAgIDIsICAgICAwLCAgICAgMiwKKyAgICAgICAyLCAgICAgMiwgICAgIDMsICAgICAzLCAgICAgMSwgICAgIDMsICAgICAyLCAgICAgMiwgICAgIDIsICAgICAwLAorICAgICAgIDIsICAgICAyLCAgICAgNCwgICAgIDMsICAgICAzLCAgICAgMCwgICAgIDIsICAgICAxLCAgICAgMSwgICAgIDIsCisgICAgICAgMiwgICAgIDIsICAgICAxLCAgICAgMSwgICAgIDAsICAgICAyLCAgICAgMSwgICAgIDMsICAgICAzLCAgICAgMywKKyAgICAgICAyLCAgICAgMywgICAgIDMsICAgICAxLCAgICAgMQorfTsKKworLyogWVlERUZBQ1RbU1RBVEUtTkFNRV0gLS0gRGVmYXVsdCBydWxlIHRvIHJlZHVjZSB3aXRoIGluIHN0YXRlCisgICBTVEFURS1OVU0gd2hlbiBZWVRBQkxFIGRvZXNuJ3Qgc3BlY2lmeSBzb21ldGhpbmcgZWxzZSB0byBkby4gIFplcm8KKyAgIG1lYW5zIHRoZSBkZWZhdWx0IGlzIGFuIGVycm9yLiAgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHl5ZGVmYWN0W10gPQoreworICAgICAgIDIsICAgICAwLCAgICAgMSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDgsICAgICAwLCAgICAgMCwgICAgMTAsCisgICAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDksICAgIDkzLCAgICA5MiwgICAgIDMsICAgICA0LCAgICAyMiwKKyAgICAgIDE0LCAgICAyMiwgICAgMTUsICAgIDQzLCAgICA1MywgICAgIDUsICAgIDU5LCAgICAxMiwgICAgNzksICAgIDY4LAorICAgICAgIDYsICAgIDc0LCAgICAxNiwgICAgNzksICAgIDEzLCAgICAxNywgICAgMTEsICAgIDg3LCAgICA4OCwgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgIDM4LCAgICAgMCwgICAgIDAsICAgICAwLCAgIDEwMywgICAxMDQsICAgICAwLCAgICAgMCwKKyAgICAgICAwLCAgICA5NiwgICAgMTksICAgIDIxLCAgICAzOSwgICAgNDIsICAgIDU4LCAgICA2NCwgICAgIDAsICAgIDc2LAorICAgICAgIDcsICAgIDYzLCAgICA3MywgICAgNzUsICAgIDE4LCAgICAyMCwgICAgIDAsICAgMTAwLCAgICA1NSwgICAgIDAsCisgICAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDg1LCAgICAgMCwKKyAgICAgIDg1LCAgICAgMCwgICAgODUsICAgIDg1LCAgICA4NSwgICAgMjYsICAgICAwLCAgICAgMCwgICAgMjMsICAgICAwLAorICAgICAgMjUsICAgIDI0LCAgICAgMCwgICAgIDAsICAgICAwLCAgICA4NSwgICAgODUsICAgIDQ3LCAgICA0NCwgICAgNDYsCisgICAgICA0NSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgNTQsICAgIDQxLCAgICA0MCwgICAgNjAsICAgIDYyLCAgICA1NywKKyAgICAgIDYxLCAgICA1NiwgICAgODEsICAgIDgwLCAgICAgMCwgICAgNjksICAgIDcxLCAgICA2NiwgICAgNzAsICAgIDY1LAorICAgICAgOTksICAgMTAxLCAgIDEwMiwgICAgOTgsICAgIDk3LCAgICA3NywgICAgIDAsICAgICAwLCAgICAgMCwgICAgOTQsCisgICAgICA5NCwgICAgIDAsICAgIDk0LCAgICA5NCwgICAgIDAsICAgIDk0LCAgICAgMCwgICAgIDAsICAgICAwLCAgICA5NCwKKyAgICAgICAwLCAgICA3OCwgICAgNTEsICAgIDk0LCAgICA5NCwgICAgIDAsICAgICAwLCAgICA4OSwgICAgOTAsICAgIDkxLAorICAgICAgNzIsICAgICAwLCAgICA4MywgICAgODQsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDI3LCAgICA4NiwgICAgIDAsCisgICAgICAyOSwgICAgIDAsICAgIDMzLCAgICAzMSwgICAgMzIsICAgICAwLCAgICA5NCwgICAgIDAsICAgICAwLCAgICA0OSwKKyAgICAgIDUwLCAgICA4MiwgICAgOTUsICAgIDM0LCAgICAzNSwgICAgMjgsICAgIDMwLCAgICAzNiwgICAgIDAsICAgIDQ4LAorICAgICAgNTIsICAgIDM3Cit9OworCisvKiBZWURFRkdPVE9bTlRFUk0tTlVNXS4gKi8KK3N0YXRpYyBjb25zdCBzaG9ydCB5eWRlZmdvdG9bXSA9Cit7CisgICAgICAtMSwgICAgIDEsICAgIDE3LCAgICAxOCwgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsICAgIDUyLCAgICA4OCwKKyAgICAgIDIzLCAgICAyNCwgICAxMDUsICAgIDI1LCAgICA1NCwgICAgOTgsICAgIDU1LCAgICAyNiwgICAxMDksICAgIDI3LAorICAgICAgNTYsICAgIDI4LCAgICAyOSwgICAxMTcsICAgIDMwLCAgICA1OCwgICAgMzEsICAgIDMyLCAgICAzMywgICAgMzQsCisgICAgICA4OSwgICAgOTAsICAgIDU3LCAgICA5MSwgICAxMzEsICAgMTMyLCAgIDEwNiwgICAgMzUsICAgMTU1LCAgICA1MCwKKyAgICAgIDUxCit9OworCisvKiBZWVBBQ1RbU1RBVEUtTlVNXSAtLSBJbmRleCBpbiBZWVRBQkxFIG9mIHRoZSBwb3J0aW9uIGRlc2NyaWJpbmcKKyAgIFNUQVRFLU5VTS4gICovCisjZGVmaW5lIFlZUEFDVF9OSU5GIC05OQorc3RhdGljIGNvbnN0IHNob3J0IHl5cGFjdFtdID0KK3sKKyAgICAgLTk5LCAgICA0OCwgICAtOTksICAgIDM4LCAgICA0NiwgICAgNDYsICAgLTk5LCAgICA0NiwgICAtMjksICAgLTk5LAorICAgICAgNDYsICAgLTE3LCAgICAtMywgICAtMTEsICAgLTk5LCAgIC05OSwgICAtOTksICAgLTk5LCAgIC05OSwgICAtOTksCisgICAgIC05OSwgICAtOTksICAgLTk5LCAgIC05OSwgICAtOTksICAgLTk5LCAgIC05OSwgICAtOTksICAgLTk5LCAgIC05OSwKKyAgICAgLTk5LCAgIC05OSwgICAtOTksICAgLTk5LCAgIC05OSwgICAtOTksICAgLTk5LCAgIC05OSwgICAtOTksICAgIDM4LAorICAgICAgMTIsICAgIDE1LCAgIC05OSwgICAgMTgsICAgIDUxLCAgICA2MiwgICAtOTksICAgLTk5LCAgIC0xMSwgICAtMTEsCisgICAgICAgNCwgICAtMjQsICAgMTM4LCAgIDEzOCwgICAxNjAsICAgMTIxLCAgIDExMCwgICAgLTQsICAgIDgxLCAgICAtNCwKKyAgICAgLTk5LCAgIC05OSwgICAtOTksICAgLTk5LCAgIC05OSwgICAtOTksICAgLTE5LCAgIC05OSwgICAtOTksICAgLTExLAorICAgICAtMTEsICAgIDcwLCAgICA3MCwgICAgNzMsICAgIDMyLCAgIC0xMSwgICAgNDYsICAgLTExLCAgICA0NiwgICAtMTEsCisgICAgICA0NiwgICAtMTEsICAgIDQ2LCAgICA0NiwgICAgNDYsICAgLTk5LCAgICAzNiwgICAgNzAsICAgLTk5LCAgICA5NSwKKyAgICAgLTk5LCAgIC05OSwgICAgOTYsICAgIDQ2LCAgIDEwNiwgICAgNDYsICAgIDQ2LCAgIC05OSwgICAtOTksICAgLTk5LAorICAgICAtOTksICAgIDM4LCAgICAzOCwgICAgMzgsICAgLTk5LCAgIC05OSwgICAtOTksICAgLTk5LCAgIC05OSwgICAtOTksCisgICAgIC05OSwgICAtOTksICAgLTk5LCAgIC05OSwgICAxMTIsICAgLTk5LCAgIC05OSwgICAtOTksICAgLTk5LCAgIC05OSwKKyAgICAgLTk5LCAgIDExNywgICAtOTksICAgLTk5LCAgIC05OSwgICAtOTksICAgLTExLCAgICAzMywgICAgNjUsICAgMTMxLAorICAgICAgIDEsICAgMTE5LCAgIDEzMSwgICAgIDEsICAgMTM2LCAgICAgMSwgICAxNTMsICAgMTU0LCAgIDE1NSwgICAxMzEsCisgICAgICA3MCwgICAtOTksICAgLTk5LCAgIDEzMSwgICAxMzEsICAgMTU2LCAgIDE1NywgICAtOTksICAgLTk5LCAgIC05OSwKKyAgICAgLTk5LCAgIDEwMSwgICAtOTksICAgLTk5LCAgIC0xMSwgICAxNTgsICAgMTU5LCAgIC05OSwgICAtOTksICAgMTYxLAorICAgICAtOTksICAgMTYyLCAgIC05OSwgICAtOTksICAgLTk5LCAgIDE2MywgICAxMzEsICAgMTY0LCAgIDE2NSwgICAtOTksCisgICAgIC05OSwgICAtOTksICAgIDk5LCAgIC05OSwgICAtOTksICAgLTk5LCAgIC05OSwgICAtOTksICAgMTY2LCAgIC05OSwKKyAgICAgLTk5LCAgIC05OQorfTsKKworLyogWVlQR09UT1tOVEVSTS1OVU1dLiAgKi8KK3N0YXRpYyBjb25zdCBzaG9ydCB5eXBnb3RvW10gPQoreworICAgICAtOTksICAgLTk5LCAgIC05OSwgICAxMTEsICAgLTk5LCAgIC05OSwgICAtOTksICAgLTk5LCAgIDE3OCwgICAtOTksCisgICAgIC05OSwgICAtOTksICAgLTk5LCAgICA5MSwgICAtOTksICAgLTk5LCAgIC05OSwgICAtOTksICAgLTk5LCAgIC05OSwKKyAgICAgLTk5LCAgIC05OSwgICAtOTksICAgLTk5LCAgIDExNSwgICAtOTksICAgLTk5LCAgIC05OSwgICAtOTksICAgLTk5LAorICAgICAtOTksICAgMTQ2LCAgIDE2OCwgICAgODksICAgIDI3LCAgICAgMCwgICAxMjYsICAgIC0xLCAgIC05OCwgICAtNDgsCisgICAgIC02MworfTsKKworLyogWVlUQUJMRVtZWVBBQ1RbU1RBVEUtTlVNXV0uICBXaGF0IHRvIGRvIGluIHN0YXRlIFNUQVRFLU5VTS4gIElmCisgICBwb3NpdGl2ZSwgc2hpZnQgdGhhdCB0b2tlbi4gIElmIG5lZ2F0aXZlLCByZWR1Y2UgdGhlIHJ1bGUgd2hpY2gKKyAgIG51bWJlciBpcyB0aGUgb3Bwb3NpdGUuICBJZiB6ZXJvLCBkbyB3aGF0IFlZREVGQUNUIHNheXMuCisgICBJZiBZWVRBQkxFX05JTkYsIHN5bnRheCBlcnJvci4gICovCisjZGVmaW5lIFlZVEFCTEVfTklORiAtNjgKK3N0YXRpYyBjb25zdCBzaG9ydCB5eXRhYmxlW10gPQoreworICAgICAgNjYsICAgIDY3LCAgICAzNiwgICAgNDIsICAgIDM5LCAgICA0MCwgICAgNzEsICAgIDQxLCAgIDEyMywgICAxMjQsCisgICAgICA0MywgICAgNDQsICAgIDc0LCAgICA3NSwgICAxMjAsICAgMTU0LCAgICA3MiwgICAgNDYsICAgIDQ3LCAgICA2OSwKKyAgICAgIDcwLCAgIDEyMSwgICAxMjIsICAgIDQ4LCAgIDE0MCwgICAgNDUsICAgMTI3LCAgIDEyOCwgICAxMTIsICAgMTMwLAorICAgICAgNDksICAgMTMzLCAgIDE1NiwgICAxMzUsICAgMTU4LCAgIDE1OSwgICAgNjgsICAgMTYxLCAgICA2MCwgICAgNjksCisgICAgICA3MCwgICAxNjUsICAgIDY5LCAgICA3MCwgICAgNjEsICAgMTY3LCAgIDE2OCwgICAgNjIsICAgICAyLCAgICAgMywKKyAgICAgIDYzLCAgICAgNCwgICAgIDUsICAgICA2LCAgICAgNywgICAgIDgsICAgICA5LCAgICAxMCwgICAgMTEsICAgIDEyLAorICAgICAgNDYsICAgIDQ3LCAgICAxMywgICAgMTQsICAgMTM5LCAgIDE1MiwgICAgNDgsICAgMTI2LCAgIDE3OCwgICAgMTUsCisgICAgICAxNiwgICAgNjksICAgIDcwLCAgICA0OSwgICAgMzcsICAgIDM4LCAgIDEyOSwgICAxNjYsICAgMTUxLCAgICAxNSwKKyAgICAgIDE2LCAgIC02NywgICAxMTQsICAgIDY0LCAgIC02NywgICAgIDUsICAgMTAxLCAgICAgNywgICAgIDgsICAgMTAyLAorICAgICAgMTAsICAgIDExLCAgICAxMiwgICAxNDMsICAgIDY1LCAgICAxMywgICAxMDMsICAgMTUzLCAgICA0NiwgICAgNDcsCisgICAgIDE0NywgICAxNDgsICAgMTQ5LCAgICA2OSwgICAgNzAsICAgMTI1LCAgIDE3MiwgICAxMzQsICAgMTQxLCAgIDEzNiwKKyAgICAgMTM3LCAgIDEzOCwgICAgMTUsICAgIDE2LCAgICAgNSwgICAxMDEsICAgICA3LCAgICAgOCwgICAxMDIsICAgIDEwLAorICAgICAgMTEsICAgIDEyLCAgIDE0NSwgICAxNDYsICAgIDEzLCAgIDEwMywgICAxMDEsICAgICA3LCAgIDE0MiwgICAxMDIsCisgICAgICAxMCwgICAgMTEsICAgIDEyLCAgIDE3MSwgICAxNDQsICAgIDEzLCAgIDEwMywgICAgNjksICAgIDcwLCAgICA2OSwKKyAgICAgIDcwLCAgICAxNSwgICAgMTYsICAgMTAwLCAgIDE1MCwgICAxNTQsICAgMTEzLCAgIDEwOCwgICAxMTMsICAgMTE2LAorICAgICAgNzMsICAgMTU3LCAgICAxNSwgICAgMTYsICAgIDc0LCAgICA3NSwgICAgNzAsICAgIDc2LCAgICA3NywgICAgNzgsCisgICAgICA3OSwgICAgODAsICAgIDgxLCAgICA4MiwgICAgODMsICAgIDg0LCAgIDEwNCwgICAxMDcsICAgMTYwLCAgIDExNSwKKyAgICAgIDg1LCAgIDExMCwgICAgNzMsICAgMTE4LCAgICA4NiwgICAgODcsICAgIDc0LCAgICA3NSwgICAgOTIsICAgIDkzLAorICAgICAgOTQsICAgIDk1LCAgIDExMSwgICAgOTYsICAgMTE5LCAgIDE2MiwgICAxNjMsICAgMTY0LCAgIDE2OSwgICAxNzAsCisgICAgIDE3MywgICAxNzQsICAgIDk3LCAgIDE3NSwgICAxNzYsICAgMTc3LCAgIDE3OSwgICAxODAsICAgMTgxLCAgICA1MywKKyAgICAgIDk5LCAgICA1OQorfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgeXljaGVja1tdID0KK3sKKyAgICAgIDQ4LCAgICA0OSwgICAgIDMsICAgIDMyLCAgICAgNCwgICAgIDUsICAgIDMwLCAgICAgNywgICAgNzEsICAgIDcyLAorICAgICAgMTAsICAgIDI4LCAgICAxNiwgICAgMTcsICAgIDMzLCAgICAxNCwgICAgNDAsICAgIDI4LCAgICAyOSwgICAgMzgsCisgICAgICAzOSwgICAgNjksICAgIDcwLCAgICAzNCwgICAgODcsICAgIDI4LCAgICA3NCwgICAgNzUsICAgIDMyLCAgICA3NywKKyAgICAgIDQxLCAgICA3OSwgICAxMzAsICAgIDgxLCAgIDEzMiwgICAxMzMsICAgIDMyLCAgIDEzNSwgICAgMzksICAgIDM4LAorICAgICAgMzksICAgMTM5LCAgICAzOCwgICAgMzksICAgIDMyLCAgIDE0MywgICAxNDQsICAgIDMyLCAgICAgMCwgICAgIDEsCisgICAgICAzMiwgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwgICAgIDksICAgIDEwLCAgICAxMSwKKyAgICAgIDI4LCAgICAyOSwgICAgMTQsICAgIDE1LCAgICAyOCwgICAgMzIsICAgIDM0LCAgICAzNSwgICAxNjYsICAgIDMxLAorICAgICAgMzIsICAgIDM4LCAgICAzOSwgICAgNDEsICAgIDI4LCAgICAyOSwgICAgNzYsICAgMTQwLCAgIDEyNiwgICAgMzEsCisgICAgICAzMiwgICAgIDAsICAgICAxLCAgICAzMiwgICAgIDMsICAgICA0LCAgICAgNSwgICAgIDYsICAgICA3LCAgICAgOCwKKyAgICAgICA5LCAgICAxMCwgICAgMTEsICAgIDkzLCAgICAzMiwgICAgMTQsICAgIDE1LCAgICAzMiwgICAgMjgsICAgIDI5LAorICAgICAxMDEsICAgMTAyLCAgIDEwMywgICAgMzgsICAgIDM5LCAgICAzMiwgICAxNTQsICAgIDgwLCAgICAxMywgICAgODIsCisgICAgICA4MywgICAgODQsICAgIDMxLCAgICAzMiwgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LCAgICAgOSwKKyAgICAgIDEwLCAgICAxMSwgICAgOTUsICAgIDk2LCAgICAxNCwgICAgMTUsICAgICA1LCAgICAgNiwgICAgMzIsICAgICA4LAorICAgICAgIDksICAgIDEwLCAgICAxMSwgICAgMzIsICAgIDI4LCAgICAxNCwgICAgMTUsICAgIDM4LCAgICAzOSwgICAgMzgsCisgICAgICAzOSwgICAgMzEsICAgIDMyLCAgICA1NCwgICAgMzIsICAgIDE0LCAgICA1NywgICAgNTYsICAgIDU5LCAgICA1OCwKKyAgICAgIDEyLCAgICAzMiwgICAgMzEsICAgIDMyLCAgICAxNiwgICAgMTcsICAgIDM5LCAgICAxOSwgICAgMjAsICAgIDIxLAorICAgICAgMjIsICAgIDIzLCAgICAyNCwgICAgMjUsICAgIDI2LCAgICAyNywgICAgNTUsICAgIDU2LCAgICAzMiwgICAgNTgsCisgICAgICAzMiwgICAgNTYsICAgIDEyLCAgICA1OCwgICAgMzYsICAgIDM3LCAgICAxNiwgICAgMTcsICAgIDE4LCAgICAxOSwKKyAgICAgIDIwLCAgICAyMSwgICAgNTYsICAgIDIzLCAgICA1OCwgICAgMzIsICAgIDMyLCAgICAzMiwgICAgMzIsICAgIDMyLAorICAgICAgMzIsICAgIDMyLCAgICAzMiwgICAgMzIsICAgIDMyLCAgICAzMiwgICAgMzIsICAgIDMyLCAgICAzMiwgICAgMjEsCisgICAgICA1NCwgICAgMzMKK307CisKKy8qIFlZU1RPU1tTVEFURS1OVU1dIC0tIFRoZSAoaW50ZXJuYWwgbnVtYmVyIG9mIHRoZSkgYWNjZXNzaW5nCisgICBzeW1ib2wgb2Ygc3RhdGUgU1RBVEUtTlVNLiAgKi8KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHl5c3Rvc1tdID0KK3sKKyAgICAgICAwLCAgICA0MywgICAgIDAsICAgICAxLCAgICAgMywgICAgIDQsICAgICA1LCAgICAgNiwgICAgIDcsICAgICA4LAorICAgICAgIDksICAgIDEwLCAgICAxMSwgICAgMTQsICAgIDE1LCAgICAzMSwgICAgMzIsICAgIDQ0LCAgICA0NSwgICAgNDYsCisgICAgICA0NywgICAgNDgsICAgIDQ5LCAgICA1MiwgICAgNTMsICAgIDU1LCAgICA1OSwgICAgNjEsICAgIDYzLCAgICA2NCwKKyAgICAgIDY2LCAgICA2OCwgICAgNjksICAgIDcwLCAgICA3MSwgICAgNzksICAgIDc5LCAgICAyOCwgICAgMjksICAgIDc3LAorICAgICAgNzcsICAgIDc3LCAgICAzMiwgICAgNzcsICAgIDI4LCAgICAyOCwgICAgMjgsICAgIDI5LCAgICAzNCwgICAgNDEsCisgICAgICA4MSwgICAgODIsICAgIDUwLCAgICA1MCwgICAgNTYsICAgIDU4LCAgICA2MiwgICAgNzQsICAgIDY3LCAgICA3NCwKKyAgICAgIDc5LCAgICAzMiwgICAgMzIsICAgIDMyLCAgICAzMiwgICAgMzIsICAgIDgxLCAgICA4MSwgICAgMzIsICAgIDM4LAorICAgICAgMzksICAgIDMwLCAgICA0MCwgICAgMTIsICAgIDE2LCAgICAxNywgICAgMTksICAgIDIwLCAgICAyMSwgICAgMjIsCisgICAgICAyMywgICAgMjQsICAgIDI1LCAgICAyNiwgICAgMjcsICAgIDMyLCAgICAzNiwgICAgMzcsICAgIDUxLCAgICA3MiwKKyAgICAgIDczLCAgICA3NSwgICAgMTgsICAgIDE5LCAgICAyMCwgICAgMjEsICAgIDIzLCAgICAzMiwgICAgNTcsICAgIDczLAorICAgICAgNzUsICAgICA1LCAgICAgOCwgICAgMTUsICAgIDQ1LCAgICA1NCwgICAgNzgsICAgIDQ1LCAgICA1NSwgICAgNjAsCisgICAgICA2NiwgICAgNzgsICAgIDMyLCAgICA3NSwgICAgIDEsICAgIDQ1LCAgICA1NSwgICAgNjUsICAgIDY2LCAgICA3OCwKKyAgICAgIDMzLCAgICA4MSwgICAgODEsICAgIDgyLCAgICA4MiwgICAgMzIsICAgIDM1LCAgICA4MSwgICAgODEsICAgIDc3LAorICAgICAgODEsICAgIDc2LCAgICA3NywgICAgODEsICAgIDc2LCAgICA4MSwgICAgNzYsICAgIDc2LCAgICA3NiwgICAgMjgsCisgICAgICA4MiwgICAgMTMsICAgIDMyLCAgICA3NywgICAgMjgsICAgIDc2LCAgICA3NiwgICAgNzksICAgIDc5LCAgICA3OSwKKyAgICAgIDMyLCAgICA4MSwgICAgMzIsICAgIDMyLCAgICAxNCwgICAgODAsICAgIDgwLCAgICAzMiwgICAgODAsICAgIDgwLAorICAgICAgMzIsICAgIDgwLCAgICAzMiwgICAgMzIsICAgIDMyLCAgICA4MCwgICAgODIsICAgIDgwLCAgICA4MCwgICAgMzIsCisgICAgICAzMiwgICAgMzIsICAgIDgxLCAgICAzMiwgICAgMzIsICAgIDMyLCAgICAzMiwgICAgMzIsICAgIDgwLCAgICAzMiwKKyAgICAgIDMyLCAgICAzMgorfTsKKworI2lmICEgZGVmaW5lZCAoWVlTSVpFX1QpICYmIGRlZmluZWQgKF9fU0laRV9UWVBFX18pCisjIGRlZmluZSBZWVNJWkVfVCBfX1NJWkVfVFlQRV9fCisjZW5kaWYKKyNpZiAhIGRlZmluZWQgKFlZU0laRV9UKSAmJiBkZWZpbmVkIChzaXplX3QpCisjIGRlZmluZSBZWVNJWkVfVCBzaXplX3QKKyNlbmRpZgorI2lmICEgZGVmaW5lZCAoWVlTSVpFX1QpCisjIGlmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKKyMgIGluY2x1ZGUgPHN0ZGRlZi5oPiAvKiBJTkZSSU5HRVMgT04gVVNFUiBOQU1FIFNQQUNFICovCisjICBkZWZpbmUgWVlTSVpFX1Qgc2l6ZV90CisjIGVuZGlmCisjZW5kaWYKKyNpZiAhIGRlZmluZWQgKFlZU0laRV9UKQorIyBkZWZpbmUgWVlTSVpFX1QgdW5zaWduZWQgaW50CisjZW5kaWYKKworI2RlZmluZSB5eWVycm9rCQkoeXllcnJzdGF0dXMgPSAwKQorI2RlZmluZSB5eWNsZWFyaW4JKHl5Y2hhciA9IFlZRU1QVFkpCisjZGVmaW5lIFlZRU1QVFkJCSgtMikKKyNkZWZpbmUgWVlFT0YJCTAKKworI2RlZmluZSBZWUFDQ0VQVAlnb3RvIHl5YWNjZXB0bGFiCisjZGVmaW5lIFlZQUJPUlQJCWdvdG8geXlhYm9ydGxhYgorI2RlZmluZSBZWUVSUk9SCQlnb3RvIHl5ZXJybGFiMQorCisKKy8qIExpa2UgWVlFUlJPUiBleGNlcHQgZG8gY2FsbCB5eWVycm9yLiAgVGhpcyByZW1haW5zIGhlcmUgdGVtcG9yYXJpbHkKKyAgIHRvIGVhc2UgdGhlIHRyYW5zaXRpb24gdG8gdGhlIG5ldyBtZWFuaW5nIG9mIFlZRVJST1IsIGZvciBHQ0MuCisgICBPbmNlIEdDQyB2ZXJzaW9uIDIgaGFzIHN1cHBsYW50ZWQgdmVyc2lvbiAxLCB0aGlzIGNhbiBnby4gICovCisKKyNkZWZpbmUgWVlGQUlMCQlnb3RvIHl5ZXJybGFiCisKKyNkZWZpbmUgWVlSRUNPVkVSSU5HKCkgICghIXl5ZXJyc3RhdHVzKQorCisjZGVmaW5lIFlZQkFDS1VQKFRva2VuLCBWYWx1ZSkJCQkJCVwKK2RvCQkJCQkJCQlcCisgIGlmICh5eWNoYXIgPT0gWVlFTVBUWSAmJiB5eWxlbiA9PSAxKQkJCQlcCisgICAgewkJCQkJCQkJXAorICAgICAgeXljaGFyID0gKFRva2VuKTsJCQkJCQlcCisgICAgICB5eWx2YWwgPSAoVmFsdWUpOwkJCQkJCVwKKyAgICAgIHl5dG9rZW4gPSBZWVRSQU5TTEFURSAoeXljaGFyKTsJCQkJXAorICAgICAgWVlQT1BTVEFDSzsJCQkJCQlcCisgICAgICBnb3RvIHl5YmFja3VwOwkJCQkJCVwKKyAgICB9CQkJCQkJCQlcCisgIGVsc2UJCQkJCQkJCVwKKyAgICB7IAkJCQkJCQkJXAorICAgICAgeXllcnJvciAoInN5bnRheCBlcnJvcjogY2Fubm90IGJhY2sgdXAiKTtcCisgICAgICBZWUVSUk9SOwkJCQkJCQlcCisgICAgfQkJCQkJCQkJXAord2hpbGUgKDApCisKKyNkZWZpbmUgWVlURVJST1IJMQorI2RlZmluZSBZWUVSUkNPREUJMjU2CisKKy8qIFlZTExPQ19ERUZBVUxUIC0tIENvbXB1dGUgdGhlIGRlZmF1bHQgbG9jYXRpb24gKGJlZm9yZSB0aGUgYWN0aW9ucworICAgYXJlIHJ1bikuICAqLworCisjaWZuZGVmIFlZTExPQ19ERUZBVUxUCisjIGRlZmluZSBZWUxMT0NfREVGQVVMVChDdXJyZW50LCBSaHMsIE4pICAgICAgICAgXAorICBDdXJyZW50LmZpcnN0X2xpbmUgICA9IFJoc1sxXS5maXJzdF9saW5lOyAgICAgIFwKKyAgQ3VycmVudC5maXJzdF9jb2x1bW4gPSBSaHNbMV0uZmlyc3RfY29sdW1uOyAgICBcCisgIEN1cnJlbnQubGFzdF9saW5lICAgID0gUmhzW05dLmxhc3RfbGluZTsgICAgICAgXAorICBDdXJyZW50Lmxhc3RfY29sdW1uICA9IFJoc1tOXS5sYXN0X2NvbHVtbjsKKyNlbmRpZgorCisvKiBZWUxFWCAtLSBjYWxsaW5nIGB5eWxleCcgd2l0aCB0aGUgcmlnaHQgYXJndW1lbnRzLiAgKi8KKworI2lmZGVmIFlZTEVYX1BBUkFNCisjIGRlZmluZSBZWUxFWCB5eWxleCAoWVlMRVhfUEFSQU0pCisjZWxzZQorIyBkZWZpbmUgWVlMRVggeXlsZXggKCkKKyNlbmRpZgorCisvKiBFbmFibGUgZGVidWdnaW5nIGlmIHJlcXVlc3RlZC4gICovCisjaWYgWVlERUJVRworCisjIGlmbmRlZiBZWUZQUklOVEYKKyMgIGluY2x1ZGUgPHN0ZGlvLmg+IC8qIElORlJJTkdFUyBPTiBVU0VSIE5BTUUgU1BBQ0UgKi8KKyMgIGRlZmluZSBZWUZQUklOVEYgZnByaW50ZgorIyBlbmRpZgorCisjIGRlZmluZSBZWURQUklOVEYoQXJncykJCQlcCitkbyB7CQkJCQkJXAorICBpZiAoeXlkZWJ1ZykJCQkJCVwKKyAgICBZWUZQUklOVEYgQXJnczsJCQkJXAorfSB3aGlsZSAoMCkKKworIyBkZWZpbmUgWVlEU1lNUFJJTlQoQXJncykJCQlcCitkbyB7CQkJCQkJXAorICBpZiAoeXlkZWJ1ZykJCQkJCVwKKyAgICB5eXN5bXByaW50IEFyZ3M7CQkJCVwKK30gd2hpbGUgKDApCisKKyMgZGVmaW5lIFlZRFNZTVBSSU5URihUaXRsZSwgVG9rZW4sIFZhbHVlLCBMb2NhdGlvbikJCVwKK2RvIHsJCQkJCQkJCVwKKyAgaWYgKHl5ZGVidWcpCQkJCQkJCVwKKyAgICB7CQkJCQkJCQlcCisgICAgICBZWUZQUklOVEYgKHN0ZGVyciwgIiVzICIsIFRpdGxlKTsJCQkJXAorICAgICAgeXlzeW1wcmludCAoc3RkZXJyLCAJCQkJCVwKKyAgICAgICAgICAgICAgICAgIFRva2VuLCBWYWx1ZSk7CVwKKyAgICAgIFlZRlBSSU5URiAoc3RkZXJyLCAiXG4iKTsJCQkJCVwKKyAgICB9CQkJCQkJCQlcCit9IHdoaWxlICgwKQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlfc3RhY2tfcHJpbnQgLS0gUHJpbnQgdGhlIHN0YXRlIHN0YWNrIGZyb20gaXRzIEJPVFRPTSB1cCB0byBpdHMgfAorfCBUT1AgKGNpbmx1ZGVkKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKK3N0YXRpYyB2b2lkCit5eV9zdGFja19wcmludCAoc2hvcnQgKmJvdHRvbSwgc2hvcnQgKnRvcCkKKyNlbHNlCitzdGF0aWMgdm9pZAoreXlfc3RhY2tfcHJpbnQgKGJvdHRvbSwgdG9wKQorICAgIHNob3J0ICpib3R0b207CisgICAgc2hvcnQgKnRvcDsKKyNlbmRpZgoreworICBZWUZQUklOVEYgKHN0ZGVyciwgIlN0YWNrIG5vdyIpOworICBmb3IgKC8qIE5vdGhpbmcuICovOyBib3R0b20gPD0gdG9wOyArK2JvdHRvbSkKKyAgICBZWUZQUklOVEYgKHN0ZGVyciwgIiAlZCIsICpib3R0b20pOworICBZWUZQUklOVEYgKHN0ZGVyciwgIlxuIik7Cit9CisKKyMgZGVmaW5lIFlZX1NUQUNLX1BSSU5UKEJvdHRvbSwgVG9wKQkJCQlcCitkbyB7CQkJCQkJCQlcCisgIGlmICh5eWRlYnVnKQkJCQkJCQlcCisgICAgeXlfc3RhY2tfcHJpbnQgKChCb3R0b20pLCAoVG9wKSk7CQkJCVwKK30gd2hpbGUgKDApCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IFJlcG9ydCB0aGF0IHRoZSBZWVJVTEUgaXMgZ29pbmcgdG8gYmUgcmVkdWNlZC4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQorc3RhdGljIHZvaWQKK3l5X3JlZHVjZV9wcmludCAoaW50IHl5cnVsZSkKKyNlbHNlCitzdGF0aWMgdm9pZAoreXlfcmVkdWNlX3ByaW50ICh5eXJ1bGUpCisgICAgaW50IHl5cnVsZTsKKyNlbmRpZgoreworICBpbnQgeXlpOworICB1bnNpZ25lZCBpbnQgeXlsaW5lbm8gPSB5eXJsaW5lW3l5cnVsZV07CisgIFlZRlBSSU5URiAoc3RkZXJyLCAiUmVkdWNpbmcgc3RhY2sgYnkgcnVsZSAlZCAobGluZSAldSksICIsCisgICAgICAgICAgICAgeXlydWxlIC0gMSwgeXlsaW5lbm8pOworICAvKiBQcmludCB0aGUgc3ltYm9scyBiZWluZyByZWR1Y2VkLCBhbmQgdGhlaXIgcmVzdWx0LiAgKi8KKyAgZm9yICh5eWkgPSB5eXByaHNbeXlydWxlXTsgMCA8PSB5eXJoc1t5eWldOyB5eWkrKykKKyAgICBZWUZQUklOVEYgKHN0ZGVyciwgIiVzICIsIHl5dG5hbWUgW3l5cmhzW3l5aV1dKTsKKyAgWVlGUFJJTlRGIChzdGRlcnIsICItPiAlc1xuIiwgeXl0bmFtZSBbeXlyMVt5eXJ1bGVdXSk7Cit9CisKKyMgZGVmaW5lIFlZX1JFRFVDRV9QUklOVChSdWxlKQkJXAorZG8gewkJCQkJXAorICBpZiAoeXlkZWJ1ZykJCQkJXAorICAgIHl5X3JlZHVjZV9wcmludCAoUnVsZSk7CQlcCit9IHdoaWxlICgwKQorCisvKiBOb256ZXJvIG1lYW5zIHByaW50IHBhcnNlIHRyYWNlLiAgSXQgaXMgbGVmdCB1bmluaXRpYWxpemVkIHNvIHRoYXQKKyAgIG11bHRpcGxlIHBhcnNlcnMgY2FuIGNvZXhpc3QuICAqLworaW50IHl5ZGVidWc7CisjZWxzZSAvKiAhWVlERUJVRyAqLworIyBkZWZpbmUgWVlEUFJJTlRGKEFyZ3MpCisjIGRlZmluZSBZWURTWU1QUklOVChBcmdzKQorIyBkZWZpbmUgWVlEU1lNUFJJTlRGKFRpdGxlLCBUb2tlbiwgVmFsdWUsIExvY2F0aW9uKQorIyBkZWZpbmUgWVlfU1RBQ0tfUFJJTlQoQm90dG9tLCBUb3ApCisjIGRlZmluZSBZWV9SRURVQ0VfUFJJTlQoUnVsZSkKKyNlbmRpZiAvKiAhWVlERUJVRyAqLworCisKKy8qIFlZSU5JVERFUFRIIC0tIGluaXRpYWwgc2l6ZSBvZiB0aGUgcGFyc2VyJ3Mgc3RhY2tzLiAgKi8KKyNpZm5kZWYJWVlJTklUREVQVEgKKyMgZGVmaW5lIFlZSU5JVERFUFRIIDIwMAorI2VuZGlmCisKKy8qIFlZTUFYREVQVEggLS0gbWF4aW11bSBzaXplIHRoZSBzdGFja3MgY2FuIGdyb3cgdG8gKGVmZmVjdGl2ZSBvbmx5CisgICBpZiB0aGUgYnVpbHQtaW4gc3RhY2sgZXh0ZW5zaW9uIG1ldGhvZCBpcyB1c2VkKS4KKworICAgRG8gbm90IG1ha2UgdGhpcyB2YWx1ZSB0b28gbGFyZ2U7IHRoZSByZXN1bHRzIGFyZSB1bmRlZmluZWQgaWYKKyAgIFNJWkVfTUFYIDwgWVlTVEFDS19CWVRFUyAoWVlNQVhERVBUSCkKKyAgIGV2YWx1YXRlZCB3aXRoIGluZmluaXRlLXByZWNpc2lvbiBpbnRlZ2VyIGFyaXRobWV0aWMuICAqLworCisjaWYgWVlNQVhERVBUSCA9PSAwCisjIHVuZGVmIFlZTUFYREVQVEgKKyNlbmRpZgorCisjaWZuZGVmIFlZTUFYREVQVEgKKyMgZGVmaW5lIFlZTUFYREVQVEggMTAwMDAKKyNlbmRpZgorCisMCisKKyNpZiBZWUVSUk9SX1ZFUkJPU0UKKworIyBpZm5kZWYgeXlzdHJsZW4KKyMgIGlmIGRlZmluZWQgKF9fR0xJQkNfXykgJiYgZGVmaW5lZCAoX1NUUklOR19IKQorIyAgIGRlZmluZSB5eXN0cmxlbiBzdHJsZW4KKyMgIGVsc2UKKy8qIFJldHVybiB0aGUgbGVuZ3RoIG9mIFlZU1RSLiAgKi8KK3N0YXRpYyBZWVNJWkVfVAorIyAgIGlmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKK3l5c3RybGVuIChjb25zdCBjaGFyICp5eXN0cikKKyMgICBlbHNlCit5eXN0cmxlbiAoeXlzdHIpCisgICAgIGNvbnN0IGNoYXIgKnl5c3RyOworIyAgIGVuZGlmCit7CisgIHJlZ2lzdGVyIGNvbnN0IGNoYXIgKnl5cyA9IHl5c3RyOworCisgIHdoaWxlICgqeXlzKysgIT0gJ1wwJykKKyAgICBjb250aW51ZTsKKworICByZXR1cm4geXlzIC0geXlzdHIgLSAxOworfQorIyAgZW5kaWYKKyMgZW5kaWYKKworIyBpZm5kZWYgeXlzdHBjcHkKKyMgIGlmIGRlZmluZWQgKF9fR0xJQkNfXykgJiYgZGVmaW5lZCAoX1NUUklOR19IKSAmJiBkZWZpbmVkIChfR05VX1NPVVJDRSkKKyMgICBkZWZpbmUgeXlzdHBjcHkgc3RwY3B5CisjICBlbHNlCisvKiBDb3B5IFlZU1JDIHRvIFlZREVTVCwgcmV0dXJuaW5nIHRoZSBhZGRyZXNzIG9mIHRoZSB0ZXJtaW5hdGluZyAnXDAnIGluCisgICBZWURFU1QuICAqLworc3RhdGljIGNoYXIgKgorIyAgIGlmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKK3l5c3RwY3B5IChjaGFyICp5eWRlc3QsIGNvbnN0IGNoYXIgKnl5c3JjKQorIyAgIGVsc2UKK3l5c3RwY3B5ICh5eWRlc3QsIHl5c3JjKQorICAgICBjaGFyICp5eWRlc3Q7CisgICAgIGNvbnN0IGNoYXIgKnl5c3JjOworIyAgIGVuZGlmCit7CisgIHJlZ2lzdGVyIGNoYXIgKnl5ZCA9IHl5ZGVzdDsKKyAgcmVnaXN0ZXIgY29uc3QgY2hhciAqeXlzID0geXlzcmM7CisKKyAgd2hpbGUgKCgqeXlkKysgPSAqeXlzKyspICE9ICdcMCcpCisgICAgY29udGludWU7CisKKyAgcmV0dXJuIHl5ZCAtIDE7Cit9CisjICBlbmRpZgorIyBlbmRpZgorCisjZW5kaWYgLyogIVlZRVJST1JfVkVSQk9TRSAqLworCisMCisKKyNpZiBZWURFQlVHCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCBQcmludCB0aGlzIHN5bWJvbCBvbiBZWU9VVFBVVC4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCitzdGF0aWMgdm9pZAoreXlzeW1wcmludCAoRklMRSAqeXlvdXRwdXQsIGludCB5eXR5cGUsIFlZU1RZUEUgKnl5dmFsdWVwKQorI2Vsc2UKK3N0YXRpYyB2b2lkCit5eXN5bXByaW50ICh5eW91dHB1dCwgeXl0eXBlLCB5eXZhbHVlcCkKKyAgICBGSUxFICp5eW91dHB1dDsKKyAgICBpbnQgeXl0eXBlOworICAgIFlZU1RZUEUgKnl5dmFsdWVwOworI2VuZGlmCit7CisgIC8qIFBhY2lmeSBgYHVudXNlZCB2YXJpYWJsZScnIHdhcm5pbmdzLiAgKi8KKyAgKHZvaWQpIHl5dmFsdWVwOworCisgIGlmICh5eXR5cGUgPCBZWU5UT0tFTlMpCisgICAgeworICAgICAgWVlGUFJJTlRGICh5eW91dHB1dCwgInRva2VuICVzICgiLCB5eXRuYW1lW3l5dHlwZV0pOworIyBpZmRlZiBZWVBSSU5UCisgICAgICBZWVBSSU5UICh5eW91dHB1dCwgeXl0b2tudW1beXl0eXBlXSwgKnl5dmFsdWVwKTsKKyMgZW5kaWYKKyAgICB9CisgIGVsc2UKKyAgICBZWUZQUklOVEYgKHl5b3V0cHV0LCAibnRlcm0gJXMgKCIsIHl5dG5hbWVbeXl0eXBlXSk7CisKKyAgc3dpdGNoICh5eXR5cGUpCisgICAgeworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICBZWUZQUklOVEYgKHl5b3V0cHV0LCAiKSIpOworfQorCisjZW5kaWYgLyogISBZWURFQlVHICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCBSZWxlYXNlIHRoZSBtZW1vcnkgYXNzb2NpYXRlZCB0byB0aGlzIHN5bWJvbC4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZiBkZWZpbmVkIChfX1NURENfXykgfHwgZGVmaW5lZCAoX19jcGx1c3BsdXMpCitzdGF0aWMgdm9pZAoreXlkZXN0cnVjdCAoaW50IHl5dHlwZSwgWVlTVFlQRSAqeXl2YWx1ZXApCisjZWxzZQorc3RhdGljIHZvaWQKK3l5ZGVzdHJ1Y3QgKHl5dHlwZSwgeXl2YWx1ZXApCisgICAgaW50IHl5dHlwZTsKKyAgICBZWVNUWVBFICp5eXZhbHVlcDsKKyNlbmRpZgoreworICAvKiBQYWNpZnkgYGB1bnVzZWQgdmFyaWFibGUnJyB3YXJuaW5ncy4gICovCisgICh2b2lkKSB5eXZhbHVlcDsKKworICBzd2l0Y2ggKHl5dHlwZSkKKyAgICB7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKwwKKworLyogUHJldmVudCB3YXJuaW5ncyBmcm9tIC1XbWlzc2luZy1wcm90b3R5cGVzLiAgKi8KKworI2lmZGVmIFlZUEFSU0VfUEFSQU0KKyMgaWYgZGVmaW5lZCAoX19TVERDX18pIHx8IGRlZmluZWQgKF9fY3BsdXNwbHVzKQoraW50IHl5cGFyc2UgKHZvaWQgKllZUEFSU0VfUEFSQU0pOworIyBlbHNlCitpbnQgeXlwYXJzZSAoKTsKKyMgZW5kaWYKKyNlbHNlIC8qICEgWVlQQVJTRV9QQVJBTSAqLworI2lmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKK2ludCB5eXBhcnNlICh2b2lkKTsKKyNlbHNlCitpbnQgeXlwYXJzZSAoKTsKKyNlbmRpZgorI2VuZGlmIC8qICEgWVlQQVJTRV9QQVJBTSAqLworCisKKworLyogVGhlIGxvb2thaGVhZCBzeW1ib2wuICAqLworaW50IHl5Y2hhcjsKKworLyogVGhlIHNlbWFudGljIHZhbHVlIG9mIHRoZSBsb29rYWhlYWQgc3ltYm9sLiAgKi8KK1lZU1RZUEUgeXlsdmFsOworCisvKiBOdW1iZXIgb2Ygc3ludGF4IGVycm9ycyBzbyBmYXIuICAqLworaW50IHl5bmVycnM7CisKKworCisvKi0tLS0tLS0tLS0uCit8IHl5cGFyc2UuICB8CitgLS0tLS0tLS0tLSovCisKKyNpZmRlZiBZWVBBUlNFX1BBUkFNCisjIGlmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKK2ludCB5eXBhcnNlICh2b2lkICpZWVBBUlNFX1BBUkFNKQorIyBlbHNlCitpbnQgeXlwYXJzZSAoWVlQQVJTRV9QQVJBTSkKKyAgdm9pZCAqWVlQQVJTRV9QQVJBTTsKKyMgZW5kaWYKKyNlbHNlIC8qICEgWVlQQVJTRV9QQVJBTSAqLworI2lmIGRlZmluZWQgKF9fU1REQ19fKSB8fCBkZWZpbmVkIChfX2NwbHVzcGx1cykKK2ludAoreXlwYXJzZSAodm9pZCkKKyNlbHNlCitpbnQKK3l5cGFyc2UgKCkKKworI2VuZGlmCisjZW5kaWYKK3sKKyAgCisgIHJlZ2lzdGVyIGludCB5eXN0YXRlOworICByZWdpc3RlciBpbnQgeXluOworICBpbnQgeXlyZXN1bHQ7CisgIC8qIE51bWJlciBvZiB0b2tlbnMgdG8gc2hpZnQgYmVmb3JlIGVycm9yIG1lc3NhZ2VzIGVuYWJsZWQuICAqLworICBpbnQgeXllcnJzdGF0dXM7CisgIC8qIExvb2thaGVhZCB0b2tlbiBhcyBhbiBpbnRlcm5hbCAodHJhbnNsYXRlZCkgdG9rZW4gbnVtYmVyLiAgKi8KKyAgaW50IHl5dG9rZW4gPSAwOworCisgIC8qIFRocmVlIHN0YWNrcyBhbmQgdGhlaXIgdG9vbHM6CisgICAgIGB5eXNzJzogcmVsYXRlZCB0byBzdGF0ZXMsCisgICAgIGB5eXZzJzogcmVsYXRlZCB0byBzZW1hbnRpYyB2YWx1ZXMsCisgICAgIGB5eWxzJzogcmVsYXRlZCB0byBsb2NhdGlvbnMuCisKKyAgICAgUmVmZXIgdG8gdGhlIHN0YWNrcyB0aHJ1IHNlcGFyYXRlIHBvaW50ZXJzLCB0byBhbGxvdyB5eW92ZXJmbG93CisgICAgIHRvIHJlYWxsb2NhdGUgdGhlbSBlbHNld2hlcmUuICAqLworCisgIC8qIFRoZSBzdGF0ZSBzdGFjay4gICovCisgIHNob3J0CXl5c3NhW1lZSU5JVERFUFRIXTsKKyAgc2hvcnQgKnl5c3MgPSB5eXNzYTsKKyAgcmVnaXN0ZXIgc2hvcnQgKnl5c3NwOworCisgIC8qIFRoZSBzZW1hbnRpYyB2YWx1ZSBzdGFjay4gICovCisgIFlZU1RZUEUgeXl2c2FbWVlJTklUREVQVEhdOworICBZWVNUWVBFICp5eXZzID0geXl2c2E7CisgIHJlZ2lzdGVyIFlZU1RZUEUgKnl5dnNwOworCisKKworI2RlZmluZSBZWVBPUFNUQUNLICAgKHl5dnNwLS0sIHl5c3NwLS0pCisKKyAgWVlTSVpFX1QgeXlzdGFja3NpemUgPSBZWUlOSVRERVBUSDsKKworICAvKiBUaGUgdmFyaWFibGVzIHVzZWQgdG8gcmV0dXJuIHNlbWFudGljIHZhbHVlIGFuZCBsb2NhdGlvbiBmcm9tIHRoZQorICAgICBhY3Rpb24gcm91dGluZXMuICAqLworICBZWVNUWVBFIHl5dmFsOworCisKKyAgLyogV2hlbiByZWR1Y2luZywgdGhlIG51bWJlciBvZiBzeW1ib2xzIG9uIHRoZSBSSFMgb2YgdGhlIHJlZHVjZWQKKyAgICAgcnVsZS4gICovCisgIGludCB5eWxlbjsKKworICBZWURQUklOVEYgKChzdGRlcnIsICJTdGFydGluZyBwYXJzZVxuIikpOworCisgIHl5c3RhdGUgPSAwOworICB5eWVycnN0YXR1cyA9IDA7CisgIHl5bmVycnMgPSAwOworICB5eWNoYXIgPSBZWUVNUFRZOwkJLyogQ2F1c2UgYSB0b2tlbiB0byBiZSByZWFkLiAgKi8KKworICAvKiBJbml0aWFsaXplIHN0YWNrIHBvaW50ZXJzLgorICAgICBXYXN0ZSBvbmUgZWxlbWVudCBvZiB2YWx1ZSBhbmQgbG9jYXRpb24gc3RhY2sKKyAgICAgc28gdGhhdCB0aGV5IHN0YXkgb24gdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIHN0YXRlIHN0YWNrLgorICAgICBUaGUgd2FzdGVkIGVsZW1lbnRzIGFyZSBuZXZlciBpbml0aWFsaXplZC4gICovCisKKyAgeXlzc3AgPSB5eXNzOworICB5eXZzcCA9IHl5dnM7CisKKyAgZ290byB5eXNldHN0YXRlOworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXluZXdzdGF0ZSAtLSBQdXNoIGEgbmV3IHN0YXRlLCB3aGljaCBpcyBmb3VuZCBpbiB5eXN0YXRlLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisgeXluZXdzdGF0ZToKKyAgLyogSW4gYWxsIGNhc2VzLCB3aGVuIHlvdSBnZXQgaGVyZSwgdGhlIHZhbHVlIGFuZCBsb2NhdGlvbiBzdGFja3MKKyAgICAgaGF2ZSBqdXN0IGJlZW4gcHVzaGVkLiBzbyBwdXNoaW5nIGEgc3RhdGUgaGVyZSBldmVucyB0aGUgc3RhY2tzLgorICAgICAqLworICB5eXNzcCsrOworCisgeXlzZXRzdGF0ZToKKyAgKnl5c3NwID0geXlzdGF0ZTsKKworICBpZiAoeXlzcyArIHl5c3RhY2tzaXplIC0gMSA8PSB5eXNzcCkKKyAgICB7CisgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgdXNlZCBzaXplIG9mIHRoZSB0aHJlZSBzdGFja3MsIGluIGVsZW1lbnRzLiAgKi8KKyAgICAgIFlZU0laRV9UIHl5c2l6ZSA9IHl5c3NwIC0geXlzcyArIDE7CisKKyNpZmRlZiB5eW92ZXJmbG93CisgICAgICB7CisJLyogR2l2ZSB1c2VyIGEgY2hhbmNlIHRvIHJlYWxsb2NhdGUgdGhlIHN0YWNrLiBVc2UgY29waWVzIG9mCisJICAgdGhlc2Ugc28gdGhhdCB0aGUgJidzIGRvbid0IGZvcmNlIHRoZSByZWFsIG9uZXMgaW50bworCSAgIG1lbW9yeS4gICovCisJWVlTVFlQRSAqeXl2czEgPSB5eXZzOworCXNob3J0ICp5eXNzMSA9IHl5c3M7CisKKworCS8qIEVhY2ggc3RhY2sgcG9pbnRlciBhZGRyZXNzIGlzIGZvbGxvd2VkIGJ5IHRoZSBzaXplIG9mIHRoZQorCSAgIGRhdGEgaW4gdXNlIGluIHRoYXQgc3RhY2ssIGluIGJ5dGVzLiAgVGhpcyB1c2VkIHRvIGJlIGEKKwkgICBjb25kaXRpb25hbCBhcm91bmQganVzdCB0aGUgdHdvIGV4dHJhIGFyZ3MsIGJ1dCB0aGF0IG1pZ2h0CisJICAgYmUgdW5kZWZpbmVkIGlmIHl5b3ZlcmZsb3cgaXMgYSBtYWNyby4gICovCisJeXlvdmVyZmxvdyAoInBhcnNlciBzdGFjayBvdmVyZmxvdyIsCisJCSAgICAmeXlzczEsIHl5c2l6ZSAqIHNpemVvZiAoKnl5c3NwKSwKKwkJICAgICZ5eXZzMSwgeXlzaXplICogc2l6ZW9mICgqeXl2c3ApLAorCisJCSAgICAmeXlzdGFja3NpemUpOworCisJeXlzcyA9IHl5c3MxOworCXl5dnMgPSB5eXZzMTsKKyAgICAgIH0KKyNlbHNlIC8qIG5vIHl5b3ZlcmZsb3cgKi8KKyMgaWZuZGVmIFlZU1RBQ0tfUkVMT0NBVEUKKyAgICAgIGdvdG8geXlvdmVyZmxvd2xhYjsKKyMgZWxzZQorICAgICAgLyogRXh0ZW5kIHRoZSBzdGFjayBvdXIgb3duIHdheS4gICovCisgICAgICBpZiAoWVlNQVhERVBUSCA8PSB5eXN0YWNrc2l6ZSkKKwlnb3RvIHl5b3ZlcmZsb3dsYWI7CisgICAgICB5eXN0YWNrc2l6ZSAqPSAyOworICAgICAgaWYgKFlZTUFYREVQVEggPCB5eXN0YWNrc2l6ZSkKKwl5eXN0YWNrc2l6ZSA9IFlZTUFYREVQVEg7CisKKyAgICAgIHsKKwlzaG9ydCAqeXlzczEgPSB5eXNzOworCXVuaW9uIHl5YWxsb2MgKnl5cHRyID0KKwkgICh1bmlvbiB5eWFsbG9jICopIFlZU1RBQ0tfQUxMT0MgKFlZU1RBQ0tfQllURVMgKHl5c3RhY2tzaXplKSk7CisJaWYgKCEgeXlwdHIpCisJICBnb3RvIHl5b3ZlcmZsb3dsYWI7CisJWVlTVEFDS19SRUxPQ0FURSAoeXlzcyk7CisJWVlTVEFDS19SRUxPQ0FURSAoeXl2cyk7CisKKyMgIHVuZGVmIFlZU1RBQ0tfUkVMT0NBVEUKKwlpZiAoeXlzczEgIT0geXlzc2EpCisJICBZWVNUQUNLX0ZSRUUgKHl5c3MxKTsKKyAgICAgIH0KKyMgZW5kaWYKKyNlbmRpZiAvKiBubyB5eW92ZXJmbG93ICovCisKKyAgICAgIHl5c3NwID0geXlzcyArIHl5c2l6ZSAtIDE7CisgICAgICB5eXZzcCA9IHl5dnMgKyB5eXNpemUgLSAxOworCisKKyAgICAgIFlZRFBSSU5URiAoKHN0ZGVyciwgIlN0YWNrIHNpemUgaW5jcmVhc2VkIHRvICVsdVxuIiwKKwkJICAodW5zaWduZWQgbG9uZyBpbnQpIHl5c3RhY2tzaXplKSk7CisKKyAgICAgIGlmICh5eXNzICsgeXlzdGFja3NpemUgLSAxIDw9IHl5c3NwKQorCVlZQUJPUlQ7CisgICAgfQorCisgIFlZRFBSSU5URiAoKHN0ZGVyciwgIkVudGVyaW5nIHN0YXRlICVkXG4iLCB5eXN0YXRlKSk7CisKKyAgZ290byB5eWJhY2t1cDsKKworLyotLS0tLS0tLS0tLS4KK3wgeXliYWNrdXAuICB8CitgLS0tLS0tLS0tLS0qLworeXliYWNrdXA6CisKKy8qIERvIGFwcHJvcHJpYXRlIHByb2Nlc3NpbmcgZ2l2ZW4gdGhlIGN1cnJlbnQgc3RhdGUuICAqLworLyogUmVhZCBhIGxvb2thaGVhZCB0b2tlbiBpZiB3ZSBuZWVkIG9uZSBhbmQgZG9uJ3QgYWxyZWFkeSBoYXZlIG9uZS4gICovCisvKiB5eXJlc3VtZTogKi8KKworICAvKiBGaXJzdCB0cnkgdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aG91dCByZWZlcmVuY2UgdG8gbG9va2FoZWFkIHRva2VuLiAgKi8KKworICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07CisgIGlmICh5eW4gPT0gWVlQQUNUX05JTkYpCisgICAgZ290byB5eWRlZmF1bHQ7CisKKyAgLyogTm90IGtub3duID0+IGdldCBhIGxvb2thaGVhZCB0b2tlbiBpZiBkb24ndCBhbHJlYWR5IGhhdmUgb25lLiAgKi8KKworICAvKiBZWUNIQVIgaXMgZWl0aGVyIFlZRU1QVFkgb3IgWVlFT0Ygb3IgYSB2YWxpZCBsb29rYWhlYWQgc3ltYm9sLiAgKi8KKyAgaWYgKHl5Y2hhciA9PSBZWUVNUFRZKQorICAgIHsKKyAgICAgIFlZRFBSSU5URiAoKHN0ZGVyciwgIlJlYWRpbmcgYSB0b2tlbjogIikpOworICAgICAgeXljaGFyID0gWVlMRVg7CisgICAgfQorCisgIGlmICh5eWNoYXIgPD0gWVlFT0YpCisgICAgeworICAgICAgeXljaGFyID0geXl0b2tlbiA9IFlZRU9GOworICAgICAgWVlEUFJJTlRGICgoc3RkZXJyLCAiTm93IGF0IGVuZCBvZiBpbnB1dC5cbiIpKTsKKyAgICB9CisgIGVsc2UKKyAgICB7CisgICAgICB5eXRva2VuID0gWVlUUkFOU0xBVEUgKHl5Y2hhcik7CisgICAgICBZWURTWU1QUklOVEYgKCJOZXh0IHRva2VuIGlzIiwgeXl0b2tlbiwgJnl5bHZhbCwgJnl5bGxvYyk7CisgICAgfQorCisgIC8qIElmIHRoZSBwcm9wZXIgYWN0aW9uIG9uIHNlZWluZyB0b2tlbiBZWVRPS0VOIGlzIHRvIHJlZHVjZSBvciB0bworICAgICBkZXRlY3QgYW4gZXJyb3IsIHRha2UgdGhhdCBhY3Rpb24uICAqLworICB5eW4gKz0geXl0b2tlbjsKKyAgaWYgKHl5biA8IDAgfHwgWVlMQVNUIDwgeXluIHx8IHl5Y2hlY2tbeXluXSAhPSB5eXRva2VuKQorICAgIGdvdG8geXlkZWZhdWx0OworICB5eW4gPSB5eXRhYmxlW3l5bl07CisgIGlmICh5eW4gPD0gMCkKKyAgICB7CisgICAgICBpZiAoeXluID09IDAgfHwgeXluID09IFlZVEFCTEVfTklORikKKwlnb3RvIHl5ZXJybGFiOworICAgICAgeXluID0gLXl5bjsKKyAgICAgIGdvdG8geXlyZWR1Y2U7CisgICAgfQorCisgIGlmICh5eW4gPT0gWVlGSU5BTCkKKyAgICBZWUFDQ0VQVDsKKworICAvKiBTaGlmdCB0aGUgbG9va2FoZWFkIHRva2VuLiAgKi8KKyAgWVlEUFJJTlRGICgoc3RkZXJyLCAiU2hpZnRpbmcgdG9rZW4gJXMsICIsIHl5dG5hbWVbeXl0b2tlbl0pKTsKKworICAvKiBEaXNjYXJkIHRoZSB0b2tlbiBiZWluZyBzaGlmdGVkIHVubGVzcyBpdCBpcyBlb2YuICAqLworICBpZiAoeXljaGFyICE9IFlZRU9GKQorICAgIHl5Y2hhciA9IFlZRU1QVFk7CisKKyAgKisreXl2c3AgPSB5eWx2YWw7CisKKworICAvKiBDb3VudCB0b2tlbnMgc2hpZnRlZCBzaW5jZSBlcnJvcjsgYWZ0ZXIgdGhyZWUsIHR1cm4gb2ZmIGVycm9yCisgICAgIHN0YXR1cy4gICovCisgIGlmICh5eWVycnN0YXR1cykKKyAgICB5eWVycnN0YXR1cy0tOworCisgIHl5c3RhdGUgPSB5eW47CisgIGdvdG8geXluZXdzdGF0ZTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eWRlZmF1bHQgLS0gZG8gdGhlIGRlZmF1bHQgYWN0aW9uIGZvciB0aGUgY3VycmVudCBzdGF0ZS4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit5eWRlZmF1bHQ6CisgIHl5biA9IHl5ZGVmYWN0W3l5c3RhdGVdOworICBpZiAoeXluID09IDApCisgICAgZ290byB5eWVycmxhYjsKKyAgZ290byB5eXJlZHVjZTsKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eXJlZHVjZSAtLSBEbyBhIHJlZHVjdGlvbi4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit5eXJlZHVjZToKKyAgLyogeXluIGlzIHRoZSBudW1iZXIgb2YgYSBydWxlIHRvIHJlZHVjZSB3aXRoLiAgKi8KKyAgeXlsZW4gPSB5eXIyW3l5bl07CisKKyAgLyogSWYgWVlMRU4gaXMgbm9uemVybywgaW1wbGVtZW50IHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBhY3Rpb246CisgICAgIGAkJCA9ICQxJy4KKworICAgICBPdGhlcndpc2UsIHRoZSBmb2xsb3dpbmcgbGluZSBzZXRzIFlZVkFMIHRvIGdhcmJhZ2UuCisgICAgIFRoaXMgYmVoYXZpb3IgaXMgdW5kb2N1bWVudGVkIGFuZCBCaXNvbgorICAgICB1c2VycyBzaG91bGQgbm90IHJlbHkgdXBvbiBpdC4gIEFzc2lnbmluZyB0byBZWVZBTAorICAgICB1bmNvbmRpdGlvbmFsbHkgbWFrZXMgdGhlIHBhcnNlciBhIGJpdCBzbWFsbGVyLCBhbmQgaXQgYXZvaWRzIGEKKyAgICAgR0NDIHdhcm5pbmcgdGhhdCBZWVZBTCBtYXkgYmUgdXNlZCB1bmluaXRpYWxpemVkLiAgKi8KKyAgeXl2YWwgPSB5eXZzcFsxLXl5bGVuXTsKKworCisgIFlZX1JFRFVDRV9QUklOVCAoeXluKTsKKyAgc3dpdGNoICh5eW4pCisgICAgeworICAgICAgICBjYXNlIDg6CisKKyAgICB7IHpjb25mcHJpbnQoInVuZXhwZWN0ZWQgJ2VuZG1lbnUnIHN0YXRlbWVudCIpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgOToKKworICAgIHsgemNvbmZwcmludCgidW5leHBlY3RlZCAnZW5kaWYnIHN0YXRlbWVudCIpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTA6CisKKyAgICB7IHpjb25mcHJpbnQoInVuZXhwZWN0ZWQgJ2VuZGNob2ljZScgc3RhdGVtZW50Iik7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMToKKworICAgIHsgemNvbmZwcmludCgic3ludGF4IGVycm9yIik7IHl5ZXJyb2s7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxODoKKworICAgIHsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBzeW1fbG9va3VwKHl5dnNwWy0xXS5zdHJpbmcsIDApOworCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX09QVElPTkFMOworCW1lbnVfYWRkX2VudHJ5KHN5bSk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6Y29uZmlnICVzXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpLCB5eXZzcFstMV0uc3RyaW5nKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxOToKKworICAgIHsKKwltZW51X2VuZF9lbnRyeSgpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmVuZGNvbmZpZ1xuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgMjA6CisKKyAgICB7CisJc3RydWN0IHN5bWJvbCAqc3ltID0gc3ltX2xvb2t1cCh5eXZzcFstMV0uc3RyaW5nLCAwKTsKKwlzeW0tPmZsYWdzIHw9IFNZTUJPTF9PUFRJT05BTDsKKwltZW51X2FkZF9lbnRyeShzeW0pOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOm1lbnVjb25maWcgJXNcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCksIHl5dnNwWy0xXS5zdHJpbmcpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDIxOgorCisgICAgeworCWlmIChjdXJyZW50X2VudHJ5LT5wcm9tcHQpCisJCWN1cnJlbnRfZW50cnktPnByb21wdC0+dHlwZSA9IFBfTUVOVTsKKwllbHNlCisJCXpjb25mcHJpbnQoIndhcm5pbmc6IG1lbnVjb25maWcgc3RhdGVtZW50IHdpdGhvdXQgcHJvbXB0Iik7CisJbWVudV9lbmRfZW50cnkoKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDplbmRjb25maWdcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDI3OgorCisgICAgeworCW1lbnVfc2V0X3R5cGUoU19UUklTVEFURSk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6dHJpc3RhdGVcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDI4OgorCisgICAgeworCW1lbnVfYWRkX2V4cHIoUF9ERUZBVUxULCB5eXZzcFstMl0uZXhwciwgeXl2c3BbLTFdLmV4cHIpOworCW1lbnVfc2V0X3R5cGUoU19UUklTVEFURSk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZGVmX2Jvb2xlYW5cbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDI5OgorCisgICAgeworCW1lbnVfc2V0X3R5cGUoU19CT09MRUFOKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpib29sZWFuXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAzMDoKKworICAgIHsKKwltZW51X2FkZF9leHByKFBfREVGQVVMVCwgeXl2c3BbLTJdLmV4cHIsIHl5dnNwWy0xXS5leHByKTsKKwltZW51X3NldF90eXBlKFNfQk9PTEVBTik7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZGVmX2Jvb2xlYW5cbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDMxOgorCisgICAgeworCW1lbnVfc2V0X3R5cGUoU19JTlQpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmludFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgMzI6CisKKyAgICB7CisJbWVudV9zZXRfdHlwZShTX0hFWCk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6aGV4XG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAzMzoKKworICAgIHsKKwltZW51X3NldF90eXBlKFNfU1RSSU5HKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpzdHJpbmdcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDM0OgorCisgICAgeworCW1lbnVfYWRkX3Byb21wdChQX1BST01QVCwgeXl2c3BbLTJdLnN0cmluZywgeXl2c3BbLTFdLmV4cHIpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOnByb21wdFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgMzU6CisKKyAgICB7CisJbWVudV9hZGRfZXhwcihQX0RFRkFVTFQsIHl5dnNwWy0yXS5leHByLCB5eXZzcFstMV0uZXhwcik7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZGVmYXVsdFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgMzY6CisKKyAgICB7CisJbWVudV9hZGRfc3ltYm9sKFBfU0VMRUNULCBzeW1fbG9va3VwKHl5dnNwWy0yXS5zdHJpbmcsIDApLCB5eXZzcFstMV0uZXhwcik7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6c2VsZWN0XG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAzNzoKKworICAgIHsKKwltZW51X2FkZF9leHByKFBfUkFOR0UsIGV4cHJfYWxsb2NfY29tcChFX1JBTkdFLHl5dnNwWy0zXS5zeW1ib2wsIHl5dnNwWy0yXS5zeW1ib2wpLCB5eXZzcFstMV0uZXhwcik7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6cmFuZ2VcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDM4OgorCisgICAgeworCXN0cnVjdCBzeW1ib2wgKnN5bSA9IHN5bV9sb29rdXAoTlVMTCwgMCk7CisJc3ltLT5mbGFncyB8PSBTWU1CT0xfQ0hPSUNFOworCW1lbnVfYWRkX2VudHJ5KHN5bSk7CisJbWVudV9hZGRfZXhwcihQX0NIT0lDRSwgTlVMTCwgTlVMTCk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6Y2hvaWNlXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAzOToKKworICAgIHsKKwltZW51X2VuZF9lbnRyeSgpOworCW1lbnVfYWRkX21lbnUoKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA0MDoKKworICAgIHsKKwlpZiAoemNvbmZfZW5kdG9rZW4oeXl2c3BbMF0udG9rZW4sIFRfQ0hPSUNFLCBUX0VORENIT0lDRSkpIHsKKwkJbWVudV9lbmRfbWVudSgpOworCQlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDplbmRjaG9pY2VcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworCX0KKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA0MjoKKworICAgIHsKKwlwcmludGYoIiVzOiVkOiBtaXNzaW5nICdlbmRjaG9pY2UnIGZvciB0aGlzICdjaG9pY2UnIHN0YXRlbWVudFxuIiwgY3VycmVudF9tZW51LT5maWxlLT5uYW1lLCBjdXJyZW50X21lbnUtPmxpbmVubyk7CisJemNvbmZuZXJycysrOworO30KKyAgICBicmVhazsKKworICBjYXNlIDQ4OgorCisgICAgeworCW1lbnVfYWRkX3Byb21wdChQX1BST01QVCwgeXl2c3BbLTJdLnN0cmluZywgeXl2c3BbLTFdLmV4cHIpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOnByb21wdFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNDk6CisKKyAgICB7CisJbWVudV9zZXRfdHlwZShTX1RSSVNUQVRFKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDp0cmlzdGF0ZVxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNTA6CisKKyAgICB7CisJbWVudV9zZXRfdHlwZShTX0JPT0xFQU4pOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmJvb2xlYW5cbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDUxOgorCisgICAgeworCWN1cnJlbnRfZW50cnktPnN5bS0+ZmxhZ3MgfD0gU1lNQk9MX09QVElPTkFMOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOm9wdGlvbmFsXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA1MjoKKworICAgIHsKKwltZW51X2FkZF9zeW1ib2woUF9ERUZBVUxULCBzeW1fbG9va3VwKHl5dnNwWy0yXS5zdHJpbmcsIDApLCB5eXZzcFstMV0uZXhwcik7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZGVmYXVsdFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNTU6CisKKyAgICB7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6aWZcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworCW1lbnVfYWRkX2VudHJ5KE5VTEwpOworCW1lbnVfYWRkX2RlcCh5eXZzcFstMV0uZXhwcik7CisJbWVudV9lbmRfZW50cnkoKTsKKwltZW51X2FkZF9tZW51KCk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNTY6CisKKyAgICB7CisJaWYgKHpjb25mX2VuZHRva2VuKHl5dnNwWzBdLnRva2VuLCBUX0lGLCBUX0VORElGKSkgeworCQltZW51X2VuZF9tZW51KCk7CisJCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmVuZGlmXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKwl9Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNTg6CisKKyAgICB7CisJcHJpbnRmKCIlczolZDogbWlzc2luZyAnZW5kaWYnIGZvciB0aGlzICdpZicgc3RhdGVtZW50XG4iLCBjdXJyZW50X21lbnUtPmZpbGUtPm5hbWUsIGN1cnJlbnRfbWVudS0+bGluZW5vKTsKKwl6Y29uZm5lcnJzKys7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNjM6CisKKyAgICB7CisJbWVudV9hZGRfZW50cnkoTlVMTCk7CisJbWVudV9hZGRfcHJvcChQX01FTlUsIHl5dnNwWy0xXS5zdHJpbmcsIE5VTEwsIE5VTEwpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOm1lbnVcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDY0OgorCisgICAgeworCW1lbnVfZW5kX2VudHJ5KCk7CisJbWVudV9hZGRfbWVudSgpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDY1OgorCisgICAgeworCWlmICh6Y29uZl9lbmR0b2tlbih5eXZzcFswXS50b2tlbiwgVF9NRU5VLCBUX0VORE1FTlUpKSB7CisJCW1lbnVfZW5kX21lbnUoKTsKKwkJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZW5kbWVudVxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CisJfQorO30KKyAgICBicmVhazsKKworICBjYXNlIDY3OgorCisgICAgeworCXByaW50ZigiJXM6JWQ6IG1pc3NpbmcgJ2VuZG1lbnUnIGZvciB0aGlzICdtZW51JyBzdGF0ZW1lbnRcbiIsIGN1cnJlbnRfbWVudS0+ZmlsZS0+bmFtZSwgY3VycmVudF9tZW51LT5saW5lbm8pOworCXpjb25mbmVycnMrKzsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA3MjoKKworICAgIHsgemNvbmZwcmludCgiaW52YWxpZCBtZW51IG9wdGlvbiIpOyB5eWVycm9rOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgNzM6CisKKyAgICB7CisJeXl2YWwuc3RyaW5nID0geXl2c3BbLTFdLnN0cmluZzsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpzb3VyY2UgJXNcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCksIHl5dnNwWy0xXS5zdHJpbmcpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDc0OgorCisgICAgeworCXpjb25mX25leHRmaWxlKHl5dnNwWzBdLnN0cmluZyk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNzU6CisKKyAgICB7CisJbWVudV9hZGRfZW50cnkoTlVMTCk7CisJbWVudV9hZGRfcHJvcChQX0NPTU1FTlQsIHl5dnNwWy0xXS5zdHJpbmcsIE5VTEwsIE5VTEwpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmNvbW1lbnRcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworO30KKyAgICBicmVhazsKKworICBjYXNlIDc2OgorCisgICAgeworCW1lbnVfZW5kX2VudHJ5KCk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNzc6CisKKyAgICB7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6aGVscFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CisJemNvbmZfc3RhcnRoZWxwKCk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgNzg6CisKKyAgICB7CisJY3VycmVudF9lbnRyeS0+c3ltLT5oZWxwID0geXl2c3BbMF0uc3RyaW5nOworO30KKyAgICBicmVhazsKKworICBjYXNlIDgyOgorCisgICAgeworCW1lbnVfYWRkX2RlcCh5eXZzcFstMV0uZXhwcik7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZGVwZW5kcyBvblxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cis7fQorICAgIGJyZWFrOworCisgIGNhc2UgODM6CisKKyAgICB7CisJbWVudV9hZGRfZGVwKHl5dnNwWy0xXS5leHByKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpkZXBlbmRzXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA4NDoKKworICAgIHsKKwltZW51X2FkZF9kZXAoeXl2c3BbLTFdLmV4cHIpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOnJlcXVpcmVzXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA4NjoKKworICAgIHsKKwltZW51X2FkZF9wcm9wKFBfUFJPTVBULCB5eXZzcFstMV0uc3RyaW5nLCBOVUxMLCB5eXZzcFswXS5leHByKTsKKzt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA4OToKKworICAgIHsgeXl2YWwudG9rZW4gPSBUX0VORE1FTlU7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA5MDoKKworICAgIHsgeXl2YWwudG9rZW4gPSBUX0VORENIT0lDRTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDkxOgorCisgICAgeyB5eXZhbC50b2tlbiA9IFRfRU5ESUY7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA5NDoKKworICAgIHsgeXl2YWwuZXhwciA9IE5VTEw7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA5NToKKworICAgIHsgeXl2YWwuZXhwciA9IHl5dnNwWzBdLmV4cHI7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA5NjoKKworICAgIHsgeXl2YWwuZXhwciA9IGV4cHJfYWxsb2Nfc3ltYm9sKHl5dnNwWzBdLnN5bWJvbCk7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSA5NzoKKworICAgIHsgeXl2YWwuZXhwciA9IGV4cHJfYWxsb2NfY29tcChFX0VRVUFMLCB5eXZzcFstMl0uc3ltYm9sLCB5eXZzcFswXS5zeW1ib2wpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgOTg6CisKKyAgICB7IHl5dmFsLmV4cHIgPSBleHByX2FsbG9jX2NvbXAoRV9VTkVRVUFMLCB5eXZzcFstMl0uc3ltYm9sLCB5eXZzcFswXS5zeW1ib2wpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgOTk6CisKKyAgICB7IHl5dmFsLmV4cHIgPSB5eXZzcFstMV0uZXhwcjsgO30KKyAgICBicmVhazsKKworICBjYXNlIDEwMDoKKworICAgIHsgeXl2YWwuZXhwciA9IGV4cHJfYWxsb2Nfb25lKEVfTk9ULCB5eXZzcFswXS5leHByKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDEwMToKKworICAgIHsgeXl2YWwuZXhwciA9IGV4cHJfYWxsb2NfdHdvKEVfT1IsIHl5dnNwWy0yXS5leHByLCB5eXZzcFswXS5leHByKTsgO30KKyAgICBicmVhazsKKworICBjYXNlIDEwMjoKKworICAgIHsgeXl2YWwuZXhwciA9IGV4cHJfYWxsb2NfdHdvKEVfQU5ELCB5eXZzcFstMl0uZXhwciwgeXl2c3BbMF0uZXhwcik7IDt9CisgICAgYnJlYWs7CisKKyAgY2FzZSAxMDM6CisKKyAgICB7IHl5dmFsLnN5bWJvbCA9IHN5bV9sb29rdXAoeXl2c3BbMF0uc3RyaW5nLCAwKTsgZnJlZSh5eXZzcFswXS5zdHJpbmcpOyA7fQorICAgIGJyZWFrOworCisgIGNhc2UgMTA0OgorCisgICAgeyB5eXZhbC5zeW1ib2wgPSBzeW1fbG9va3VwKHl5dnNwWzBdLnN0cmluZywgMSk7IGZyZWUoeXl2c3BbMF0uc3RyaW5nKTsgO30KKyAgICBicmVhazsKKworCisgICAgfQorCisvKiBMaW5lIDk5OSBvZiB5YWNjLmMuICAqLworCisMCisgIHl5dnNwIC09IHl5bGVuOworICB5eXNzcCAtPSB5eWxlbjsKKworCisgIFlZX1NUQUNLX1BSSU5UICh5eXNzLCB5eXNzcCk7CisKKyAgKisreXl2c3AgPSB5eXZhbDsKKworCisgIC8qIE5vdyBgc2hpZnQnIHRoZSByZXN1bHQgb2YgdGhlIHJlZHVjdGlvbi4gIERldGVybWluZSB3aGF0IHN0YXRlCisgICAgIHRoYXQgZ29lcyB0bywgYmFzZWQgb24gdGhlIHN0YXRlIHdlIHBvcHBlZCBiYWNrIHRvIGFuZCB0aGUgcnVsZQorICAgICBudW1iZXIgcmVkdWNlZCBieS4gICovCisKKyAgeXluID0geXlyMVt5eW5dOworCisgIHl5c3RhdGUgPSB5eXBnb3RvW3l5biAtIFlZTlRPS0VOU10gKyAqeXlzc3A7CisgIGlmICgwIDw9IHl5c3RhdGUgJiYgeXlzdGF0ZSA8PSBZWUxBU1QgJiYgeXljaGVja1t5eXN0YXRlXSA9PSAqeXlzc3ApCisgICAgeXlzdGF0ZSA9IHl5dGFibGVbeXlzdGF0ZV07CisgIGVsc2UKKyAgICB5eXN0YXRlID0geXlkZWZnb3RvW3l5biAtIFlZTlRPS0VOU107CisKKyAgZ290byB5eW5ld3N0YXRlOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eWVycmxhYiAtLSBoZXJlIG9uIGRldGVjdGluZyBlcnJvciB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5ZXJybGFiOgorICAvKiBJZiBub3QgYWxyZWFkeSByZWNvdmVyaW5nIGZyb20gYW4gZXJyb3IsIHJlcG9ydCB0aGlzIGVycm9yLiAgKi8KKyAgaWYgKCF5eWVycnN0YXR1cykKKyAgICB7CisgICAgICArK3l5bmVycnM7CisjaWYgWVlFUlJPUl9WRVJCT1NFCisgICAgICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07CisKKyAgICAgIGlmIChZWVBBQ1RfTklORiA8IHl5biAmJiB5eW4gPCBZWUxBU1QpCisJeworCSAgWVlTSVpFX1QgeXlzaXplID0gMDsKKwkgIGludCB5eXR5cGUgPSBZWVRSQU5TTEFURSAoeXljaGFyKTsKKwkgIGNoYXIgKnl5bXNnOworCSAgaW50IHl5eCwgeXljb3VudDsKKworCSAgeXljb3VudCA9IDA7CisJICAvKiBTdGFydCBZWVggYXQgLVlZTiBpZiBuZWdhdGl2ZSB0byBhdm9pZCBuZWdhdGl2ZSBpbmRleGVzIGluCisJICAgICBZWUNIRUNLLiAgKi8KKwkgIGZvciAoeXl4ID0geXluIDwgMCA/IC15eW4gOiAwOworCSAgICAgICB5eXggPCAoaW50KSAoc2l6ZW9mICh5eXRuYW1lKSAvIHNpemVvZiAoY2hhciAqKSk7IHl5eCsrKQorCSAgICBpZiAoeXljaGVja1t5eXggKyB5eW5dID09IHl5eCAmJiB5eXggIT0gWVlURVJST1IpCisJICAgICAgeXlzaXplICs9IHl5c3RybGVuICh5eXRuYW1lW3l5eF0pICsgMTUsIHl5Y291bnQrKzsKKwkgIHl5c2l6ZSArPSB5eXN0cmxlbiAoInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAiKSArIDE7CisJICB5eXNpemUgKz0geXlzdHJsZW4gKHl5dG5hbWVbeXl0eXBlXSk7CisJICB5eW1zZyA9IChjaGFyICopIFlZU1RBQ0tfQUxMT0MgKHl5c2l6ZSk7CisJICBpZiAoeXltc2cgIT0gMCkKKwkgICAgeworCSAgICAgIGNoYXIgKnl5cCA9IHl5c3RwY3B5ICh5eW1zZywgInN5bnRheCBlcnJvciwgdW5leHBlY3RlZCAiKTsKKwkgICAgICB5eXAgPSB5eXN0cGNweSAoeXlwLCB5eXRuYW1lW3l5dHlwZV0pOworCisJICAgICAgaWYgKHl5Y291bnQgPCA1KQorCQl7CisJCSAgeXljb3VudCA9IDA7CisJCSAgZm9yICh5eXggPSB5eW4gPCAwID8gLXl5biA6IDA7CisJCSAgICAgICB5eXggPCAoaW50KSAoc2l6ZW9mICh5eXRuYW1lKSAvIHNpemVvZiAoY2hhciAqKSk7CisJCSAgICAgICB5eXgrKykKKwkJICAgIGlmICh5eWNoZWNrW3l5eCArIHl5bl0gPT0geXl4ICYmIHl5eCAhPSBZWVRFUlJPUikKKwkJICAgICAgeworCQkJY29uc3QgY2hhciAqeXlxID0gISB5eWNvdW50ID8gIiwgZXhwZWN0aW5nICIgOiAiIG9yICI7CisJCQl5eXAgPSB5eXN0cGNweSAoeXlwLCB5eXEpOworCQkJeXlwID0geXlzdHBjcHkgKHl5cCwgeXl0bmFtZVt5eXhdKTsKKwkJCXl5Y291bnQrKzsKKwkJICAgICAgfQorCQl9CisJICAgICAgeXllcnJvciAoeXltc2cpOworCSAgICAgIFlZU1RBQ0tfRlJFRSAoeXltc2cpOworCSAgICB9CisJICBlbHNlCisJICAgIHl5ZXJyb3IgKCJzeW50YXggZXJyb3I7IGFsc28gdmlydHVhbCBtZW1vcnkgZXhoYXVzdGVkIik7CisJfQorICAgICAgZWxzZQorI2VuZGlmIC8qIFlZRVJST1JfVkVSQk9TRSAqLworCXl5ZXJyb3IgKCJzeW50YXggZXJyb3IiKTsKKyAgICB9CisKKworCisgIGlmICh5eWVycnN0YXR1cyA9PSAzKQorICAgIHsKKyAgICAgIC8qIElmIGp1c3QgdHJpZWQgYW5kIGZhaWxlZCB0byByZXVzZSBsb29rYWhlYWQgdG9rZW4gYWZ0ZXIgYW4KKwkgZXJyb3IsIGRpc2NhcmQgaXQuICAqLworCisgICAgICAvKiBSZXR1cm4gZmFpbHVyZSBpZiBhdCBlbmQgb2YgaW5wdXQuICAqLworICAgICAgaWYgKHl5Y2hhciA9PSBZWUVPRikKKyAgICAgICAgeworCSAgLyogUG9wIHRoZSBlcnJvciB0b2tlbi4gICovCisgICAgICAgICAgWVlQT1BTVEFDSzsKKwkgIC8qIFBvcCB0aGUgcmVzdCBvZiB0aGUgc3RhY2suICAqLworCSAgd2hpbGUgKHl5c3MgPCB5eXNzcCkKKwkgICAgeworCSAgICAgIFlZRFNZTVBSSU5URiAoIkVycm9yOiBwb3BwaW5nIiwgeXlzdG9zWyp5eXNzcF0sIHl5dnNwLCB5eWxzcCk7CisJICAgICAgeXlkZXN0cnVjdCAoeXlzdG9zWyp5eXNzcF0sIHl5dnNwKTsKKwkgICAgICBZWVBPUFNUQUNLOworCSAgICB9CisJICBZWUFCT1JUOworICAgICAgICB9CisKKyAgICAgIFlZRFNZTVBSSU5URiAoIkVycm9yOiBkaXNjYXJkaW5nIiwgeXl0b2tlbiwgJnl5bHZhbCwgJnl5bGxvYyk7CisgICAgICB5eWRlc3RydWN0ICh5eXRva2VuLCAmeXlsdmFsKTsKKyAgICAgIHl5Y2hhciA9IFlZRU1QVFk7CisKKyAgICB9CisKKyAgLyogRWxzZSB3aWxsIHRyeSB0byByZXVzZSBsb29rYWhlYWQgdG9rZW4gYWZ0ZXIgc2hpZnRpbmcgdGhlIGVycm9yCisgICAgIHRva2VuLiAgKi8KKyAgZ290byB5eWVycmxhYjE7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLgorfCB5eWVycmxhYjEgLS0gZXJyb3IgcmFpc2VkIGV4cGxpY2l0bHkgYnkgYW4gYWN0aW9uLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworeXllcnJsYWIxOgorICB5eWVycnN0YXR1cyA9IDM7CS8qIEVhY2ggcmVhbCB0b2tlbiBzaGlmdGVkIGRlY3JlbWVudHMgdGhpcy4gICovCisKKyAgZm9yICg7OykKKyAgICB7CisgICAgICB5eW4gPSB5eXBhY3RbeXlzdGF0ZV07CisgICAgICBpZiAoeXluICE9IFlZUEFDVF9OSU5GKQorCXsKKwkgIHl5biArPSBZWVRFUlJPUjsKKwkgIGlmICgwIDw9IHl5biAmJiB5eW4gPD0gWVlMQVNUICYmIHl5Y2hlY2tbeXluXSA9PSBZWVRFUlJPUikKKwkgICAgeworCSAgICAgIHl5biA9IHl5dGFibGVbeXluXTsKKwkgICAgICBpZiAoMCA8IHl5bikKKwkJYnJlYWs7CisJICAgIH0KKwl9CisKKyAgICAgIC8qIFBvcCB0aGUgY3VycmVudCBzdGF0ZSBiZWNhdXNlIGl0IGNhbm5vdCBoYW5kbGUgdGhlIGVycm9yIHRva2VuLiAgKi8KKyAgICAgIGlmICh5eXNzcCA9PSB5eXNzKQorCVlZQUJPUlQ7CisKKyAgICAgIFlZRFNZTVBSSU5URiAoIkVycm9yOiBwb3BwaW5nIiwgeXlzdG9zWyp5eXNzcF0sIHl5dnNwLCB5eWxzcCk7CisgICAgICB5eWRlc3RydWN0ICh5eXN0b3NbeXlzdGF0ZV0sIHl5dnNwKTsKKyAgICAgIHl5dnNwLS07CisgICAgICB5eXN0YXRlID0gKi0teXlzc3A7CisKKyAgICAgIFlZX1NUQUNLX1BSSU5UICh5eXNzLCB5eXNzcCk7CisgICAgfQorCisgIGlmICh5eW4gPT0gWVlGSU5BTCkKKyAgICBZWUFDQ0VQVDsKKworICBZWURQUklOVEYgKChzdGRlcnIsICJTaGlmdGluZyBlcnJvciB0b2tlbiwgIikpOworCisgICorK3l5dnNwID0geXlsdmFsOworCisKKyAgeXlzdGF0ZSA9IHl5bjsKKyAgZ290byB5eW5ld3N0YXRlOworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS4KK3wgeXlhY2NlcHRsYWIgLS0gWVlBQ0NFUFQgY29tZXMgaGVyZS4gIHwKK2AtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5YWNjZXB0bGFiOgorICB5eXJlc3VsdCA9IDA7CisgIGdvdG8geXlyZXR1cm47CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5YWJvcnRsYWIgLS0gWVlBQk9SVCBjb21lcyBoZXJlLiAgfAorYC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3l5YWJvcnRsYWI6CisgIHl5cmVzdWx0ID0gMTsKKyAgZ290byB5eXJldHVybjsKKworI2lmbmRlZiB5eW92ZXJmbG93CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uCit8IHl5b3ZlcmZsb3dsYWIgLS0gcGFyc2VyIG92ZXJmbG93IGNvbWVzIGhlcmUuICB8CitgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit5eW92ZXJmbG93bGFiOgorICB5eWVycm9yICgicGFyc2VyIHN0YWNrIG92ZXJmbG93Iik7CisgIHl5cmVzdWx0ID0gMjsKKyAgLyogRmFsbCB0aHJvdWdoLiAgKi8KKyNlbmRpZgorCit5eXJldHVybjoKKyNpZm5kZWYgeXlvdmVyZmxvdworICBpZiAoeXlzcyAhPSB5eXNzYSkKKyAgICBZWVNUQUNLX0ZSRUUgKHl5c3MpOworI2VuZGlmCisgIHJldHVybiB5eXJlc3VsdDsKK30KKworCisKKworCit2b2lkIGNvbmZfcGFyc2UoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJaW50IGk7CisKKwl6Y29uZl9pbml0c2NhbihuYW1lKTsKKworCXN5bV9pbml0KCk7CisJbWVudV9pbml0KCk7CisJbW9kdWxlc19zeW0gPSBzeW1fbG9va3VwKCJNT0RVTEVTIiwgMCk7CisJcm9vdG1lbnUucHJvbXB0ID0gbWVudV9hZGRfcHJvcChQX01FTlUsICJMaW51eCBLZXJuZWwgQ29uZmlndXJhdGlvbiIsIE5VTEwsIE5VTEwpOworCisJLy96Y29uZmRlYnVnID0gMTsKKwl6Y29uZnBhcnNlKCk7CisJaWYgKHpjb25mbmVycnMpCisJCWV4aXQoMSk7CisJbWVudV9maW5hbGl6ZSgmcm9vdG1lbnUpOworCWZvcl9hbGxfc3ltYm9scyhpLCBzeW0pIHsKKyAgICAgICAgICAgICAgICBpZiAoIShzeW0tPmZsYWdzICYgU1lNQk9MX0NIRUNLRUQpICYmIHN5bV9jaGVja19kZXBzKHN5bSkpCisgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuIik7CisJCWVsc2UKKwkJCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX0NIRUNLX0RPTkU7CisgICAgICAgIH0KKworCXN5bV9jaGFuZ2VfY291bnQgPSAxOworfQorCitjb25zdCBjaGFyICp6Y29uZl90b2tlbm5hbWUoaW50IHRva2VuKQoreworCXN3aXRjaCAodG9rZW4pIHsKKwljYXNlIFRfTUVOVToJCXJldHVybiAibWVudSI7CisJY2FzZSBUX0VORE1FTlU6CQlyZXR1cm4gImVuZG1lbnUiOworCWNhc2UgVF9DSE9JQ0U6CQlyZXR1cm4gImNob2ljZSI7CisJY2FzZSBUX0VORENIT0lDRToJcmV0dXJuICJlbmRjaG9pY2UiOworCWNhc2UgVF9JRjoJCXJldHVybiAiaWYiOworCWNhc2UgVF9FTkRJRjoJCXJldHVybiAiZW5kaWYiOworCX0KKwlyZXR1cm4gIjx0b2tlbj4iOworfQorCitzdGF0aWMgYm9vbCB6Y29uZl9lbmR0b2tlbihpbnQgdG9rZW4sIGludCBzdGFydHRva2VuLCBpbnQgZW5kdG9rZW4pCit7CisJaWYgKHRva2VuICE9IGVuZHRva2VuKSB7CisJCXpjb25mcHJpbnQoInVuZXhwZWN0ZWQgJyVzJyB3aXRoaW4gJXMgYmxvY2siLCB6Y29uZl90b2tlbm5hbWUodG9rZW4pLCB6Y29uZl90b2tlbm5hbWUoc3RhcnR0b2tlbikpOworCQl6Y29uZm5lcnJzKys7CisJCXJldHVybiBmYWxzZTsKKwl9CisJaWYgKGN1cnJlbnRfbWVudS0+ZmlsZSAhPSBjdXJyZW50X2ZpbGUpIHsKKwkJemNvbmZwcmludCgiJyVzJyBpbiBkaWZmZXJlbnQgZmlsZSB0aGFuICclcyciLCB6Y29uZl90b2tlbm5hbWUodG9rZW4pLCB6Y29uZl90b2tlbm5hbWUoc3RhcnR0b2tlbikpOworCQl6Y29uZnByaW50KCJsb2NhdGlvbiBvZiB0aGUgJyVzJyIsIHpjb25mX3Rva2VubmFtZShzdGFydHRva2VuKSk7CisJCXpjb25mbmVycnMrKzsKKwkJcmV0dXJuIGZhbHNlOworCX0KKwlyZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgemNvbmZwcmludChjb25zdCBjaGFyICplcnIsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJZnByaW50ZihzdGRlcnIsICIlczolZDogIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSArIDEpOworCXZhX3N0YXJ0KGFwLCBlcnIpOworCXZmcHJpbnRmKHN0ZGVyciwgZXJyLCBhcCk7CisJdmFfZW5kKGFwKTsKKwlmcHJpbnRmKHN0ZGVyciwgIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHpjb25mZXJyb3IoY29uc3QgY2hhciAqZXJyKQoreworCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6ICVzXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpICsgMSwgZXJyKTsKK30KKwordm9pZCBwcmludF9xdW90ZWRfc3RyaW5nKEZJTEUgKm91dCwgY29uc3QgY2hhciAqc3RyKQoreworCWNvbnN0IGNoYXIgKnA7CisJaW50IGxlbjsKKworCXB1dGMoJyInLCBvdXQpOworCXdoaWxlICgocCA9IHN0cmNocihzdHIsICciJykpKSB7CisJCWxlbiA9IHAgLSBzdHI7CisJCWlmIChsZW4pCisJCQlmcHJpbnRmKG91dCwgIiUuKnMiLCBsZW4sIHN0cik7CisJCWZwdXRzKCJcXFwiIiwgb3V0KTsKKwkJc3RyID0gcCArIDE7CisJfQorCWZwdXRzKHN0ciwgb3V0KTsKKwlwdXRjKCciJywgb3V0KTsKK30KKwordm9pZCBwcmludF9zeW1ib2woRklMRSAqb3V0LCBzdHJ1Y3QgbWVudSAqbWVudSkKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBtZW51LT5zeW07CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCisJaWYgKHN5bV9pc19jaG9pY2Uoc3ltKSkKKwkJZnByaW50ZihvdXQsICJjaG9pY2VcbiIpOworCWVsc2UKKwkJZnByaW50ZihvdXQsICJjb25maWcgJXNcbiIsIHN5bS0+bmFtZSk7CisJc3dpdGNoIChzeW0tPnR5cGUpIHsKKwljYXNlIFNfQk9PTEVBTjoKKwkJZnB1dHMoIiAgYm9vbGVhblxuIiwgb3V0KTsKKwkJYnJlYWs7CisJY2FzZSBTX1RSSVNUQVRFOgorCQlmcHV0cygiICB0cmlzdGF0ZVxuIiwgb3V0KTsKKwkJYnJlYWs7CisJY2FzZSBTX1NUUklORzoKKwkJZnB1dHMoIiAgc3RyaW5nXG4iLCBvdXQpOworCQlicmVhazsKKwljYXNlIFNfSU5UOgorCQlmcHV0cygiICBpbnRlZ2VyXG4iLCBvdXQpOworCQlicmVhazsKKwljYXNlIFNfSEVYOgorCQlmcHV0cygiICBoZXhcbiIsIG91dCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWZwdXRzKCIgID8/P1xuIiwgb3V0KTsKKwkJYnJlYWs7CisJfQorCWZvciAocHJvcCA9IHN5bS0+cHJvcDsgcHJvcDsgcHJvcCA9IHByb3AtPm5leHQpIHsKKwkJaWYgKHByb3AtPm1lbnUgIT0gbWVudSkKKwkJCWNvbnRpbnVlOworCQlzd2l0Y2ggKHByb3AtPnR5cGUpIHsKKwkJY2FzZSBQX1BST01QVDoKKwkJCWZwdXRzKCIgIHByb21wdCAiLCBvdXQpOworCQkJcHJpbnRfcXVvdGVkX3N0cmluZyhvdXQsIHByb3AtPnRleHQpOworCQkJaWYgKCFleHByX2lzX3llcyhwcm9wLT52aXNpYmxlLmV4cHIpKSB7CisJCQkJZnB1dHMoIiBpZiAiLCBvdXQpOworCQkJCWV4cHJfZnByaW50KHByb3AtPnZpc2libGUuZXhwciwgb3V0KTsKKwkJCX0KKwkJCWZwdXRjKCdcbicsIG91dCk7CisJCQlicmVhazsKKwkJY2FzZSBQX0RFRkFVTFQ6CisJCQlmcHV0cyggIiAgZGVmYXVsdCAiLCBvdXQpOworCQkJZXhwcl9mcHJpbnQocHJvcC0+ZXhwciwgb3V0KTsKKwkJCWlmICghZXhwcl9pc195ZXMocHJvcC0+dmlzaWJsZS5leHByKSkgeworCQkJCWZwdXRzKCIgaWYgIiwgb3V0KTsKKwkJCQlleHByX2ZwcmludChwcm9wLT52aXNpYmxlLmV4cHIsIG91dCk7CisJCQl9CisJCQlmcHV0YygnXG4nLCBvdXQpOworCQkJYnJlYWs7CisJCWNhc2UgUF9DSE9JQ0U6CisJCQlmcHV0cygiICAjY2hvaWNlIHZhbHVlXG4iLCBvdXQpOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlmcHJpbnRmKG91dCwgIiAgdW5rbm93biBwcm9wICVkIVxuIiwgcHJvcC0+dHlwZSk7CisJCQlicmVhazsKKwkJfQorCX0KKwlpZiAoc3ltLT5oZWxwKSB7CisJCWludCBsZW4gPSBzdHJsZW4oc3ltLT5oZWxwKTsKKwkJd2hpbGUgKHN5bS0+aGVscFstLWxlbl0gPT0gJ1xuJykKKwkJCXN5bS0+aGVscFtsZW5dID0gMDsKKwkJZnByaW50ZihvdXQsICIgIGhlbHBcbiVzXG4iLCBzeW0tPmhlbHApOworCX0KKwlmcHV0YygnXG4nLCBvdXQpOworfQorCit2b2lkIHpjb25mZHVtcChGSUxFICpvdXQpCit7CisJc3RydWN0IHByb3BlcnR5ICpwcm9wOworCXN0cnVjdCBzeW1ib2wgKnN5bTsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKKworCW1lbnUgPSByb290bWVudS5saXN0OworCXdoaWxlIChtZW51KSB7CisJCWlmICgoc3ltID0gbWVudS0+c3ltKSkKKwkJCXByaW50X3N5bWJvbChvdXQsIG1lbnUpOworCQllbHNlIGlmICgocHJvcCA9IG1lbnUtPnByb21wdCkpIHsKKwkJCXN3aXRjaCAocHJvcC0+dHlwZSkgeworCQkJY2FzZSBQX0NPTU1FTlQ6CisJCQkJZnB1dHMoIlxuY29tbWVudCAiLCBvdXQpOworCQkJCXByaW50X3F1b3RlZF9zdHJpbmcob3V0LCBwcm9wLT50ZXh0KTsKKwkJCQlmcHV0cygiXG4iLCBvdXQpOworCQkJCWJyZWFrOworCQkJY2FzZSBQX01FTlU6CisJCQkJZnB1dHMoIlxubWVudSAiLCBvdXQpOworCQkJCXByaW50X3F1b3RlZF9zdHJpbmcob3V0LCBwcm9wLT50ZXh0KTsKKwkJCQlmcHV0cygiXG4iLCBvdXQpOworCQkJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQk7CisJCQl9CisJCQlpZiAoIWV4cHJfaXNfeWVzKHByb3AtPnZpc2libGUuZXhwcikpIHsKKwkJCQlmcHV0cygiICBkZXBlbmRzICIsIG91dCk7CisJCQkJZXhwcl9mcHJpbnQocHJvcC0+dmlzaWJsZS5leHByLCBvdXQpOworCQkJCWZwdXRjKCdcbicsIG91dCk7CisJCQl9CisJCQlmcHV0cygiXG4iLCBvdXQpOworCQl9CisKKwkJaWYgKG1lbnUtPmxpc3QpCisJCQltZW51ID0gbWVudS0+bGlzdDsKKwkJZWxzZSBpZiAobWVudS0+bmV4dCkKKwkJCW1lbnUgPSBtZW51LT5uZXh0OworCQllbHNlIHdoaWxlICgobWVudSA9IG1lbnUtPnBhcmVudCkpIHsKKwkJCWlmIChtZW51LT5wcm9tcHQgJiYgbWVudS0+cHJvbXB0LT50eXBlID09IFBfTUVOVSkKKwkJCQlmcHV0cygiXG5lbmRtZW51XG4iLCBvdXQpOworCQkJaWYgKG1lbnUtPm5leHQpIHsKKwkJCQltZW51ID0gbWVudS0+bmV4dDsKKwkJCQlicmVhazsKKwkJCX0KKwkJfQorCX0KK30KKworI2luY2x1ZGUgImxleC56Y29uZi5jIgorI2luY2x1ZGUgInV0aWwuYyIKKyNpbmNsdWRlICJjb25mZGF0YS5jIgorI2luY2x1ZGUgImV4cHIuYyIKKyNpbmNsdWRlICJzeW1ib2wuYyIKKyNpbmNsdWRlICJtZW51LmMiCisKKwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rY29uZmlnL3pjb25mLnRhYi5oX3NoaXBwZWQgYi9zY3JpcHRzL2tjb25maWcvemNvbmYudGFiLmhfc2hpcHBlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjE5MWVmCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rY29uZmlnL3pjb25mLnRhYi5oX3NoaXBwZWQKQEAgLTAsMCArMSwxMjUgQEAKKy8qIEEgQmlzb24gcGFyc2VyLCBtYWRlIGZyb20gemNvbmYueSwgYnkgR05VIGJpc29uIDEuNzUuICAqLworCisvKiBTa2VsZXRvbiBwYXJzZXIgZm9yIFlhY2MtbGlrZSBwYXJzaW5nIHdpdGggQmlzb24sCisgICBDb3B5cmlnaHQgKEMpIDE5ODQsIDE5ODksIDE5OTAsIDIwMDAsIDIwMDEsIDIwMDIgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKQorICAgYW55IGxhdGVyIHZlcnNpb24uCisKKyAgIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAgIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKKyAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICAgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICAgQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuICAqLworCisvKiBBcyBhIHNwZWNpYWwgZXhjZXB0aW9uLCB3aGVuIHRoaXMgZmlsZSBpcyBjb3BpZWQgYnkgQmlzb24gaW50byBhCisgICBCaXNvbiBvdXRwdXQgZmlsZSwgeW91IG1heSB1c2UgdGhhdCBvdXRwdXQgZmlsZSB3aXRob3V0IHJlc3RyaWN0aW9uLgorICAgVGhpcyBzcGVjaWFsIGV4Y2VwdGlvbiB3YXMgYWRkZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbgorICAgaW4gdmVyc2lvbiAxLjI0IG9mIEJpc29uLiAgKi8KKworI2lmbmRlZiBCSVNPTl9aQ09ORl9UQUJfSAorIyBkZWZpbmUgQklTT05fWkNPTkZfVEFCX0gKKworLyogVG9rZW5zLiAgKi8KKyNpZm5kZWYgWVlUT0tFTlRZUEUKKyMgZGVmaW5lIFlZVE9LRU5UWVBFCisgICAvKiBQdXQgdGhlIHRva2VucyBpbnRvIHRoZSBzeW1ib2wgdGFibGUsIHNvIHRoYXQgR0RCIGFuZCBvdGhlciBkZWJ1Z2dlcnMKKyAgICAgIGtub3cgYWJvdXQgdGhlbS4gICovCisgICBlbnVtIHl5dG9rZW50eXBlIHsKKyAgICAgVF9NQUlOTUVOVSA9IDI1OCwKKyAgICAgVF9NRU5VID0gMjU5LAorICAgICBUX0VORE1FTlUgPSAyNjAsCisgICAgIFRfU09VUkNFID0gMjYxLAorICAgICBUX0NIT0lDRSA9IDI2MiwKKyAgICAgVF9FTkRDSE9JQ0UgPSAyNjMsCisgICAgIFRfQ09NTUVOVCA9IDI2NCwKKyAgICAgVF9DT05GSUcgPSAyNjUsCisgICAgIFRfSEVMUCA9IDI2NiwKKyAgICAgVF9IRUxQVEVYVCA9IDI2NywKKyAgICAgVF9JRiA9IDI2OCwKKyAgICAgVF9FTkRJRiA9IDI2OSwKKyAgICAgVF9ERVBFTkRTID0gMjcwLAorICAgICBUX1JFUVVJUkVTID0gMjcxLAorICAgICBUX09QVElPTkFMID0gMjcyLAorICAgICBUX1BST01QVCA9IDI3MywKKyAgICAgVF9ERUZBVUxUID0gMjc0LAorICAgICBUX1RSSVNUQVRFID0gMjc1LAorICAgICBUX0JPT0xFQU4gPSAyNzYsCisgICAgIFRfSU5UID0gMjc3LAorICAgICBUX0hFWCA9IDI3OCwKKyAgICAgVF9XT1JEID0gMjc5LAorICAgICBUX1NUUklORyA9IDI4MCwKKyAgICAgVF9VTkVRVUFMID0gMjgxLAorICAgICBUX0VPRiA9IDI4MiwKKyAgICAgVF9FT0wgPSAyODMsCisgICAgIFRfQ0xPU0VfUEFSRU4gPSAyODQsCisgICAgIFRfT1BFTl9QQVJFTiA9IDI4NSwKKyAgICAgVF9PTiA9IDI4NiwKKyAgICAgVF9PUiA9IDI4NywKKyAgICAgVF9BTkQgPSAyODgsCisgICAgIFRfRVFVQUwgPSAyODksCisgICAgIFRfTk9UID0gMjkwCisgICB9OworI2VuZGlmCisjZGVmaW5lIFRfTUFJTk1FTlUgMjU4CisjZGVmaW5lIFRfTUVOVSAyNTkKKyNkZWZpbmUgVF9FTkRNRU5VIDI2MAorI2RlZmluZSBUX1NPVVJDRSAyNjEKKyNkZWZpbmUgVF9DSE9JQ0UgMjYyCisjZGVmaW5lIFRfRU5EQ0hPSUNFIDI2MworI2RlZmluZSBUX0NPTU1FTlQgMjY0CisjZGVmaW5lIFRfQ09ORklHIDI2NQorI2RlZmluZSBUX0hFTFAgMjY2CisjZGVmaW5lIFRfSEVMUFRFWFQgMjY3CisjZGVmaW5lIFRfSUYgMjY4CisjZGVmaW5lIFRfRU5ESUYgMjY5CisjZGVmaW5lIFRfREVQRU5EUyAyNzAKKyNkZWZpbmUgVF9SRVFVSVJFUyAyNzEKKyNkZWZpbmUgVF9PUFRJT05BTCAyNzIKKyNkZWZpbmUgVF9QUk9NUFQgMjczCisjZGVmaW5lIFRfREVGQVVMVCAyNzQKKyNkZWZpbmUgVF9UUklTVEFURSAyNzUKKyNkZWZpbmUgVF9CT09MRUFOIDI3NgorI2RlZmluZSBUX0lOVCAyNzcKKyNkZWZpbmUgVF9IRVggMjc4CisjZGVmaW5lIFRfV09SRCAyNzkKKyNkZWZpbmUgVF9TVFJJTkcgMjgwCisjZGVmaW5lIFRfVU5FUVVBTCAyODEKKyNkZWZpbmUgVF9FT0YgMjgyCisjZGVmaW5lIFRfRU9MIDI4MworI2RlZmluZSBUX0NMT1NFX1BBUkVOIDI4NAorI2RlZmluZSBUX09QRU5fUEFSRU4gMjg1CisjZGVmaW5lIFRfT04gMjg2CisjZGVmaW5lIFRfT1IgMjg3CisjZGVmaW5lIFRfQU5EIDI4OAorI2RlZmluZSBUX0VRVUFMIDI4OQorI2RlZmluZSBUX05PVCAyOTAKKworCisKKworI2lmbmRlZiBZWVNUWVBFCisjbGluZSAzMyAiemNvbmYueSIKK3R5cGVkZWYgdW5pb24geworCWludCB0b2tlbjsKKwljaGFyICpzdHJpbmc7CisJc3RydWN0IHN5bWJvbCAqc3ltYm9sOworCXN0cnVjdCBleHByICpleHByOworCXN0cnVjdCBtZW51ICptZW51OworfSB5eXN0eXBlOworLyogTGluZSAxMjgxIG9mIC91c3Ivc2hhcmUvYmlzb24veWFjYy5jLiAgKi8KKyNsaW5lIDExOCAiemNvbmYudGFiLmgiCisjIGRlZmluZSBZWVNUWVBFIHl5c3R5cGUKKyNlbmRpZgorCitleHRlcm4gWVlTVFlQRSB6Y29uZmx2YWw7CisKKworI2VuZGlmIC8qIG5vdCBCSVNPTl9aQ09ORl9UQUJfSCAqLworCmRpZmYgLS1naXQgYS9zY3JpcHRzL2tjb25maWcvemNvbmYueSBiL3NjcmlwdHMva2NvbmZpZy96Y29uZi55Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0NDYwZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tjb25maWcvemNvbmYueQpAQCAtMCwwICsxLDY5MCBAQAorJXsKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDIgUm9tYW4gWmlwcGVsIDx6aXBwZWxAbGludXgtbTY4ay5vcmc+CisgKiBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwgdjIuMC4KKyAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKworI2RlZmluZSBwcmludGQobWFzaywgZm10Li4uKSBpZiAoY2RlYnVnICYgKG1hc2spKSBwcmludGYoZm10KQorCisjZGVmaW5lIFBSSU5URAkJMHgwMDAxCisjZGVmaW5lIERFQlVHX1BBUlNFCTB4MDAwMgorCitpbnQgY2RlYnVnID0gUFJJTlREOworCitleHRlcm4gaW50IHpjb25mbGV4KHZvaWQpOworc3RhdGljIHZvaWQgemNvbmZwcmludChjb25zdCBjaGFyICplcnIsIC4uLik7CitzdGF0aWMgdm9pZCB6Y29uZmVycm9yKGNvbnN0IGNoYXIgKmVycik7CitzdGF0aWMgYm9vbCB6Y29uZl9lbmR0b2tlbihpbnQgdG9rZW4sIGludCBzdGFydHRva2VuLCBpbnQgZW5kdG9rZW4pOworCitzdHJ1Y3Qgc3ltYm9sICpzeW1ib2xfaGFzaFsyNTddOworCitzdGF0aWMgc3RydWN0IG1lbnUgKmN1cnJlbnRfbWVudSwgKmN1cnJlbnRfZW50cnk7CisKKyNkZWZpbmUgWVlFUlJPUl9WRVJCT1NFCislfQorJWV4cGVjdCA0MAorCisldW5pb24KK3sKKwlpbnQgdG9rZW47CisJY2hhciAqc3RyaW5nOworCXN0cnVjdCBzeW1ib2wgKnN5bWJvbDsKKwlzdHJ1Y3QgZXhwciAqZXhwcjsKKwlzdHJ1Y3QgbWVudSAqbWVudTsKK30KKworJXRva2VuIFRfTUFJTk1FTlUKKyV0b2tlbiBUX01FTlUKKyV0b2tlbiBUX0VORE1FTlUKKyV0b2tlbiBUX1NPVVJDRQorJXRva2VuIFRfQ0hPSUNFCisldG9rZW4gVF9FTkRDSE9JQ0UKKyV0b2tlbiBUX0NPTU1FTlQKKyV0b2tlbiBUX0NPTkZJRworJXRva2VuIFRfTUVOVUNPTkZJRworJXRva2VuIFRfSEVMUAorJXRva2VuIDxzdHJpbmc+IFRfSEVMUFRFWFQKKyV0b2tlbiBUX0lGCisldG9rZW4gVF9FTkRJRgorJXRva2VuIFRfREVQRU5EUworJXRva2VuIFRfUkVRVUlSRVMKKyV0b2tlbiBUX09QVElPTkFMCisldG9rZW4gVF9QUk9NUFQKKyV0b2tlbiBUX0RFRkFVTFQKKyV0b2tlbiBUX1RSSVNUQVRFCisldG9rZW4gVF9ERUZfVFJJU1RBVEUKKyV0b2tlbiBUX0JPT0xFQU4KKyV0b2tlbiBUX0RFRl9CT09MRUFOCisldG9rZW4gVF9TVFJJTkcKKyV0b2tlbiBUX0lOVAorJXRva2VuIFRfSEVYCisldG9rZW4gPHN0cmluZz4gVF9XT1JECisldG9rZW4gPHN0cmluZz4gVF9XT1JEX1FVT1RFCisldG9rZW4gVF9VTkVRVUFMCisldG9rZW4gVF9FT0YKKyV0b2tlbiBUX0VPTAorJXRva2VuIFRfQ0xPU0VfUEFSRU4KKyV0b2tlbiBUX09QRU5fUEFSRU4KKyV0b2tlbiBUX09OCisldG9rZW4gVF9TRUxFQ1QKKyV0b2tlbiBUX1JBTkdFCisKKyVsZWZ0IFRfT1IKKyVsZWZ0IFRfQU5ECislbGVmdCBUX0VRVUFMIFRfVU5FUVVBTAorJW5vbmFzc29jIFRfTk9UCisKKyV0eXBlIDxzdHJpbmc+IHByb21wdAorJXR5cGUgPHN0cmluZz4gc291cmNlCisldHlwZSA8c3ltYm9sPiBzeW1ib2wKKyV0eXBlIDxleHByPiBleHByCisldHlwZSA8ZXhwcj4gaWZfZXhwcgorJXR5cGUgPHRva2VuPiBlbmQKKworJXsKKyNkZWZpbmUgTEtDX0RJUkVDVF9MSU5LCisjaW5jbHVkZSAibGtjLmgiCislfQorJSUKK2lucHV0OgkgIC8qIGVtcHR5ICovCisJfCBpbnB1dCBibG9jaworOworCitibG9jazoJICBjb21tb25fYmxvY2sKKwl8IGNob2ljZV9zdG10CisJfCBtZW51X3N0bXQKKwl8IFRfTUFJTk1FTlUgcHJvbXB0IG5sX29yX2VvZgorCXwgVF9FTkRNRU5VCQl7IHpjb25mcHJpbnQoInVuZXhwZWN0ZWQgJ2VuZG1lbnUnIHN0YXRlbWVudCIpOyB9CisJfCBUX0VORElGCQl7IHpjb25mcHJpbnQoInVuZXhwZWN0ZWQgJ2VuZGlmJyBzdGF0ZW1lbnQiKTsgfQorCXwgVF9FTkRDSE9JQ0UJCXsgemNvbmZwcmludCgidW5leHBlY3RlZCAnZW5kY2hvaWNlJyBzdGF0ZW1lbnQiKTsgfQorCXwgZXJyb3Igbmxfb3JfZW9mCXsgemNvbmZwcmludCgic3ludGF4IGVycm9yIik7IHl5ZXJyb2s7IH0KKzsKKworY29tbW9uX2Jsb2NrOgorCSAgaWZfc3RtdAorCXwgY29tbWVudF9zdG10CisJfCBjb25maWdfc3RtdAorCXwgbWVudWNvbmZpZ19zdG10CisJfCBzb3VyY2Vfc3RtdAorCXwgbmxfb3JfZW9mCis7CisKKworLyogY29uZmlnL21lbnVjb25maWcgZW50cnkgKi8KKworY29uZmlnX2VudHJ5X3N0YXJ0OiBUX0NPTkZJRyBUX1dPUkQgVF9FT0wKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBzeW1fbG9va3VwKCQyLCAwKTsKKwlzeW0tPmZsYWdzIHw9IFNZTUJPTF9PUFRJT05BTDsKKwltZW51X2FkZF9lbnRyeShzeW0pOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmNvbmZpZyAlc1xuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSwgJDIpOworfTsKKworY29uZmlnX3N0bXQ6IGNvbmZpZ19lbnRyeV9zdGFydCBjb25maWdfb3B0aW9uX2xpc3QKK3sKKwltZW51X2VuZF9lbnRyeSgpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmVuZGNvbmZpZ1xuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cit9OworCittZW51Y29uZmlnX2VudHJ5X3N0YXJ0OiBUX01FTlVDT05GSUcgVF9XT1JEIFRfRU9MCit7CisJc3RydWN0IHN5bWJvbCAqc3ltID0gc3ltX2xvb2t1cCgkMiwgMCk7CisJc3ltLT5mbGFncyB8PSBTWU1CT0xfT1BUSU9OQUw7CisJbWVudV9hZGRfZW50cnkoc3ltKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDptZW51Y29uZmlnICVzXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpLCAkMik7Cit9OworCittZW51Y29uZmlnX3N0bXQ6IG1lbnVjb25maWdfZW50cnlfc3RhcnQgY29uZmlnX29wdGlvbl9saXN0Cit7CisJaWYgKGN1cnJlbnRfZW50cnktPnByb21wdCkKKwkJY3VycmVudF9lbnRyeS0+cHJvbXB0LT50eXBlID0gUF9NRU5VOworCWVsc2UKKwkJemNvbmZwcmludCgid2FybmluZzogbWVudWNvbmZpZyBzdGF0ZW1lbnQgd2l0aG91dCBwcm9tcHQiKTsKKwltZW51X2VuZF9lbnRyeSgpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmVuZGNvbmZpZ1xuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cit9OworCitjb25maWdfb3B0aW9uX2xpc3Q6CisJICAvKiBlbXB0eSAqLworCXwgY29uZmlnX29wdGlvbl9saXN0IGNvbmZpZ19vcHRpb24KKwl8IGNvbmZpZ19vcHRpb25fbGlzdCBkZXBlbmRzCisJfCBjb25maWdfb3B0aW9uX2xpc3QgaGVscAorCXwgY29uZmlnX29wdGlvbl9saXN0IFRfRU9MCis7CisKK2NvbmZpZ19vcHRpb246IFRfVFJJU1RBVEUgcHJvbXB0X3N0bXRfb3B0IFRfRU9MCit7CisJbWVudV9zZXRfdHlwZShTX1RSSVNUQVRFKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDp0cmlzdGF0ZVxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cit9OworCitjb25maWdfb3B0aW9uOiBUX0RFRl9UUklTVEFURSBleHByIGlmX2V4cHIgVF9FT0wKK3sKKwltZW51X2FkZF9leHByKFBfREVGQVVMVCwgJDIsICQzKTsKKwltZW51X3NldF90eXBlKFNfVFJJU1RBVEUpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmRlZl9ib29sZWFuXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKK307CisKK2NvbmZpZ19vcHRpb246IFRfQk9PTEVBTiBwcm9tcHRfc3RtdF9vcHQgVF9FT0wKK3sKKwltZW51X3NldF90eXBlKFNfQk9PTEVBTik7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6Ym9vbGVhblxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cit9OworCitjb25maWdfb3B0aW9uOiBUX0RFRl9CT09MRUFOIGV4cHIgaWZfZXhwciBUX0VPTAoreworCW1lbnVfYWRkX2V4cHIoUF9ERUZBVUxULCAkMiwgJDMpOworCW1lbnVfc2V0X3R5cGUoU19CT09MRUFOKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpkZWZfYm9vbGVhblxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cit9OworCitjb25maWdfb3B0aW9uOiBUX0lOVCBwcm9tcHRfc3RtdF9vcHQgVF9FT0wKK3sKKwltZW51X3NldF90eXBlKFNfSU5UKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDppbnRcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworfTsKKworY29uZmlnX29wdGlvbjogVF9IRVggcHJvbXB0X3N0bXRfb3B0IFRfRU9MCit7CisJbWVudV9zZXRfdHlwZShTX0hFWCk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6aGV4XG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKK307CisKK2NvbmZpZ19vcHRpb246IFRfU1RSSU5HIHByb21wdF9zdG10X29wdCBUX0VPTAoreworCW1lbnVfc2V0X3R5cGUoU19TVFJJTkcpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOnN0cmluZ1xuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cit9OworCitjb25maWdfb3B0aW9uOiBUX1BST01QVCBwcm9tcHQgaWZfZXhwciBUX0VPTAoreworCW1lbnVfYWRkX3Byb21wdChQX1BST01QVCwgJDIsICQzKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpwcm9tcHRcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworfTsKKworY29uZmlnX29wdGlvbjogVF9ERUZBVUxUIGV4cHIgaWZfZXhwciBUX0VPTAoreworCW1lbnVfYWRkX2V4cHIoUF9ERUZBVUxULCAkMiwgJDMpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmRlZmF1bHRcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworfTsKKworY29uZmlnX29wdGlvbjogVF9TRUxFQ1QgVF9XT1JEIGlmX2V4cHIgVF9FT0wKK3sKKwltZW51X2FkZF9zeW1ib2woUF9TRUxFQ1QsIHN5bV9sb29rdXAoJDIsIDApLCAkMyk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6c2VsZWN0XG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKK307CisKK2NvbmZpZ19vcHRpb246IFRfUkFOR0Ugc3ltYm9sIHN5bWJvbCBpZl9leHByIFRfRU9MCit7CisJbWVudV9hZGRfZXhwcihQX1JBTkdFLCBleHByX2FsbG9jX2NvbXAoRV9SQU5HRSwkMiwgJDMpLCAkNCk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6cmFuZ2VcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworfTsKKworLyogY2hvaWNlIGVudHJ5ICovCisKK2Nob2ljZTogVF9DSE9JQ0UgVF9FT0wKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzeW0gPSBzeW1fbG9va3VwKE5VTEwsIDApOworCXN5bS0+ZmxhZ3MgfD0gU1lNQk9MX0NIT0lDRTsKKwltZW51X2FkZF9lbnRyeShzeW0pOworCW1lbnVfYWRkX2V4cHIoUF9DSE9JQ0UsIE5VTEwsIE5VTEwpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmNob2ljZVxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cit9OworCitjaG9pY2VfZW50cnk6IGNob2ljZSBjaG9pY2Vfb3B0aW9uX2xpc3QKK3sKKwltZW51X2VuZF9lbnRyeSgpOworCW1lbnVfYWRkX21lbnUoKTsKK307CisKK2Nob2ljZV9lbmQ6IGVuZAoreworCWlmICh6Y29uZl9lbmR0b2tlbigkMSwgVF9DSE9JQ0UsIFRfRU5EQ0hPSUNFKSkgeworCQltZW51X2VuZF9tZW51KCk7CisJCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmVuZGNob2ljZVxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CisJfQorfTsKKworY2hvaWNlX3N0bXQ6CisJICBjaG9pY2VfZW50cnkgY2hvaWNlX2Jsb2NrIGNob2ljZV9lbmQKKwl8IGNob2ljZV9lbnRyeSBjaG9pY2VfYmxvY2sKK3sKKwlwcmludGYoIiVzOiVkOiBtaXNzaW5nICdlbmRjaG9pY2UnIGZvciB0aGlzICdjaG9pY2UnIHN0YXRlbWVudFxuIiwgY3VycmVudF9tZW51LT5maWxlLT5uYW1lLCBjdXJyZW50X21lbnUtPmxpbmVubyk7CisJemNvbmZuZXJycysrOworfTsKKworY2hvaWNlX29wdGlvbl9saXN0OgorCSAgLyogZW1wdHkgKi8KKwl8IGNob2ljZV9vcHRpb25fbGlzdCBjaG9pY2Vfb3B0aW9uCisJfCBjaG9pY2Vfb3B0aW9uX2xpc3QgZGVwZW5kcworCXwgY2hvaWNlX29wdGlvbl9saXN0IGhlbHAKKwl8IGNob2ljZV9vcHRpb25fbGlzdCBUX0VPTAorOworCitjaG9pY2Vfb3B0aW9uOiBUX1BST01QVCBwcm9tcHQgaWZfZXhwciBUX0VPTAoreworCW1lbnVfYWRkX3Byb21wdChQX1BST01QVCwgJDIsICQzKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpwcm9tcHRcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworfTsKKworY2hvaWNlX29wdGlvbjogVF9UUklTVEFURSBwcm9tcHRfc3RtdF9vcHQgVF9FT0wKK3sKKwltZW51X3NldF90eXBlKFNfVFJJU1RBVEUpOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOnRyaXN0YXRlXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKK307CisKK2Nob2ljZV9vcHRpb246IFRfQk9PTEVBTiBwcm9tcHRfc3RtdF9vcHQgVF9FT0wKK3sKKwltZW51X3NldF90eXBlKFNfQk9PTEVBTik7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6Ym9vbGVhblxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cit9OworCitjaG9pY2Vfb3B0aW9uOiBUX09QVElPTkFMIFRfRU9MCit7CisJY3VycmVudF9lbnRyeS0+c3ltLT5mbGFncyB8PSBTWU1CT0xfT1BUSU9OQUw7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6b3B0aW9uYWxcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworfTsKKworY2hvaWNlX29wdGlvbjogVF9ERUZBVUxUIFRfV09SRCBpZl9leHByIFRfRU9MCit7CisJbWVudV9hZGRfc3ltYm9sKFBfREVGQVVMVCwgc3ltX2xvb2t1cCgkMiwgMCksICQzKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpkZWZhdWx0XG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKK307CisKK2Nob2ljZV9ibG9jazoKKwkgIC8qIGVtcHR5ICovCisJfCBjaG9pY2VfYmxvY2sgY29tbW9uX2Jsb2NrCis7CisKKy8qIGlmIGVudHJ5ICovCisKK2lmOiBUX0lGIGV4cHIgVF9FT0wKK3sKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDppZlxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CisJbWVudV9hZGRfZW50cnkoTlVMTCk7CisJbWVudV9hZGRfZGVwKCQyKTsKKwltZW51X2VuZF9lbnRyeSgpOworCW1lbnVfYWRkX21lbnUoKTsKK307CisKK2lmX2VuZDogZW5kCit7CisJaWYgKHpjb25mX2VuZHRva2VuKCQxLCBUX0lGLCBUX0VORElGKSkgeworCQltZW51X2VuZF9tZW51KCk7CisJCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmVuZGlmXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKKwl9Cit9OworCitpZl9zdG10OgorCSAgaWYgaWZfYmxvY2sgaWZfZW5kCisJfCBpZiBpZl9ibG9jaworeworCXByaW50ZigiJXM6JWQ6IG1pc3NpbmcgJ2VuZGlmJyBmb3IgdGhpcyAnaWYnIHN0YXRlbWVudFxuIiwgY3VycmVudF9tZW51LT5maWxlLT5uYW1lLCBjdXJyZW50X21lbnUtPmxpbmVubyk7CisJemNvbmZuZXJycysrOworfTsKKworaWZfYmxvY2s6CisJICAvKiBlbXB0eSAqLworCXwgaWZfYmxvY2sgY29tbW9uX2Jsb2NrCisJfCBpZl9ibG9jayBtZW51X3N0bXQKKwl8IGlmX2Jsb2NrIGNob2ljZV9zdG10Cis7CisKKy8qIG1lbnUgZW50cnkgKi8KKworbWVudTogVF9NRU5VIHByb21wdCBUX0VPTAoreworCW1lbnVfYWRkX2VudHJ5KE5VTEwpOworCW1lbnVfYWRkX3Byb3AoUF9NRU5VLCAkMiwgTlVMTCwgTlVMTCk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6bWVudVxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cit9OworCittZW51X2VudHJ5OiBtZW51IGRlcGVuZHNfbGlzdAoreworCW1lbnVfZW5kX2VudHJ5KCk7CisJbWVudV9hZGRfbWVudSgpOworfTsKKworbWVudV9lbmQ6IGVuZAoreworCWlmICh6Y29uZl9lbmR0b2tlbigkMSwgVF9NRU5VLCBUX0VORE1FTlUpKSB7CisJCW1lbnVfZW5kX21lbnUoKTsKKwkJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6ZW5kbWVudVxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7CisJfQorfTsKKworbWVudV9zdG10OgorCSAgbWVudV9lbnRyeSBtZW51X2Jsb2NrIG1lbnVfZW5kCisJfCBtZW51X2VudHJ5IG1lbnVfYmxvY2sKK3sKKwlwcmludGYoIiVzOiVkOiBtaXNzaW5nICdlbmRtZW51JyBmb3IgdGhpcyAnbWVudScgc3RhdGVtZW50XG4iLCBjdXJyZW50X21lbnUtPmZpbGUtPm5hbWUsIGN1cnJlbnRfbWVudS0+bGluZW5vKTsKKwl6Y29uZm5lcnJzKys7Cit9OworCittZW51X2Jsb2NrOgorCSAgLyogZW1wdHkgKi8KKwl8IG1lbnVfYmxvY2sgY29tbW9uX2Jsb2NrCisJfCBtZW51X2Jsb2NrIG1lbnVfc3RtdAorCXwgbWVudV9ibG9jayBjaG9pY2Vfc3RtdAorCXwgbWVudV9ibG9jayBlcnJvciBUX0VPTAkJeyB6Y29uZnByaW50KCJpbnZhbGlkIG1lbnUgb3B0aW9uIik7IHl5ZXJyb2s7IH0KKzsKKworc291cmNlOiBUX1NPVVJDRSBwcm9tcHQgVF9FT0wKK3sKKwkkJCA9ICQyOworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOnNvdXJjZSAlc1xuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSwgJDIpOworfTsKKworc291cmNlX3N0bXQ6IHNvdXJjZQoreworCXpjb25mX25leHRmaWxlKCQxKTsKK307CisKKy8qIGNvbW1lbnQgZW50cnkgKi8KKworY29tbWVudDogVF9DT01NRU5UIHByb21wdCBUX0VPTAoreworCW1lbnVfYWRkX2VudHJ5KE5VTEwpOworCW1lbnVfYWRkX3Byb3AoUF9DT01NRU5ULCAkMiwgTlVMTCwgTlVMTCk7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6Y29tbWVudFxuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSk7Cit9OworCitjb21tZW50X3N0bXQ6IGNvbW1lbnQgZGVwZW5kc19saXN0Cit7CisJbWVudV9lbmRfZW50cnkoKTsKK307CisKKy8qIGhlbHAgb3B0aW9uICovCisKK2hlbHBfc3RhcnQ6IFRfSEVMUCBUX0VPTAoreworCXByaW50ZChERUJVR19QQVJTRSwgIiVzOiVkOmhlbHBcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworCXpjb25mX3N0YXJ0aGVscCgpOworfTsKKworaGVscDogaGVscF9zdGFydCBUX0hFTFBURVhUCit7CisJY3VycmVudF9lbnRyeS0+c3ltLT5oZWxwID0gJDI7Cit9OworCisvKiBkZXBlbmRzIG9wdGlvbiAqLworCitkZXBlbmRzX2xpc3Q6CSAgLyogZW1wdHkgKi8KKwkJfCBkZXBlbmRzX2xpc3QgZGVwZW5kcworCQl8IGRlcGVuZHNfbGlzdCBUX0VPTAorOworCitkZXBlbmRzOiBUX0RFUEVORFMgVF9PTiBleHByIFRfRU9MCit7CisJbWVudV9hZGRfZGVwKCQzKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpkZXBlbmRzIG9uXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKK30KKwl8IFRfREVQRU5EUyBleHByIFRfRU9MCit7CisJbWVudV9hZGRfZGVwKCQyKTsKKwlwcmludGQoREVCVUdfUEFSU0UsICIlczolZDpkZXBlbmRzXG4iLCB6Y29uZl9jdXJuYW1lKCksIHpjb25mX2xpbmVubygpKTsKK30KKwl8IFRfUkVRVUlSRVMgZXhwciBUX0VPTAoreworCW1lbnVfYWRkX2RlcCgkMik7CisJcHJpbnRkKERFQlVHX1BBUlNFLCAiJXM6JWQ6cmVxdWlyZXNcbiIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkpOworfTsKKworLyogcHJvbXB0IHN0YXRlbWVudCAqLworCitwcm9tcHRfc3RtdF9vcHQ6CisJICAvKiBlbXB0eSAqLworCXwgcHJvbXB0IGlmX2V4cHIKK3sKKwltZW51X2FkZF9wcm9wKFBfUFJPTVBULCAkMSwgTlVMTCwgJDIpOworfTsKKworcHJvbXB0OgkgIFRfV09SRAorCXwgVF9XT1JEX1FVT1RFCis7CisKK2VuZDoJICBUX0VORE1FTlUgbmxfb3JfZW9mCXsgJCQgPSBUX0VORE1FTlU7IH0KKwl8IFRfRU5EQ0hPSUNFIG5sX29yX2VvZgl7ICQkID0gVF9FTkRDSE9JQ0U7IH0KKwl8IFRfRU5ESUYgbmxfb3JfZW9mCXsgJCQgPSBUX0VORElGOyB9Cis7CisKK25sX29yX2VvZjoKKwlUX0VPTCB8IFRfRU9GOworCitpZl9leHByOiAgLyogZW1wdHkgKi8JCQl7ICQkID0gTlVMTDsgfQorCXwgVF9JRiBleHByCQkJeyAkJCA9ICQyOyB9Cis7CisKK2V4cHI6CSAgc3ltYm9sCQkJCXsgJCQgPSBleHByX2FsbG9jX3N5bWJvbCgkMSk7IH0KKwl8IHN5bWJvbCBUX0VRVUFMIHN5bWJvbAkJCXsgJCQgPSBleHByX2FsbG9jX2NvbXAoRV9FUVVBTCwgJDEsICQzKTsgfQorCXwgc3ltYm9sIFRfVU5FUVVBTCBzeW1ib2wJCXsgJCQgPSBleHByX2FsbG9jX2NvbXAoRV9VTkVRVUFMLCAkMSwgJDMpOyB9CisJfCBUX09QRU5fUEFSRU4gZXhwciBUX0NMT1NFX1BBUkVOCXsgJCQgPSAkMjsgfQorCXwgVF9OT1QgZXhwcgkJCQl7ICQkID0gZXhwcl9hbGxvY19vbmUoRV9OT1QsICQyKTsgfQorCXwgZXhwciBUX09SIGV4cHIJCQl7ICQkID0gZXhwcl9hbGxvY190d28oRV9PUiwgJDEsICQzKTsgfQorCXwgZXhwciBUX0FORCBleHByCQkJeyAkJCA9IGV4cHJfYWxsb2NfdHdvKEVfQU5ELCAkMSwgJDMpOyB9Cis7CisKK3N5bWJvbDoJICBUX1dPUkQJeyAkJCA9IHN5bV9sb29rdXAoJDEsIDApOyBmcmVlKCQxKTsgfQorCXwgVF9XT1JEX1FVT1RFCXsgJCQgPSBzeW1fbG9va3VwKCQxLCAxKTsgZnJlZSgkMSk7IH0KKzsKKworJSUKKwordm9pZCBjb25mX3BhcnNlKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltOworCWludCBpOworCisJemNvbmZfaW5pdHNjYW4obmFtZSk7CisKKwlzeW1faW5pdCgpOworCW1lbnVfaW5pdCgpOworCW1vZHVsZXNfc3ltID0gc3ltX2xvb2t1cCgiTU9EVUxFUyIsIDApOworCXJvb3RtZW51LnByb21wdCA9IG1lbnVfYWRkX3Byb3AoUF9NRU5VLCAiTGludXggS2VybmVsIENvbmZpZ3VyYXRpb24iLCBOVUxMLCBOVUxMKTsKKworCS8vemNvbmZkZWJ1ZyA9IDE7CisJemNvbmZwYXJzZSgpOworCWlmICh6Y29uZm5lcnJzKQorCQlleGl0KDEpOworCW1lbnVfZmluYWxpemUoJnJvb3RtZW51KTsKKwlmb3JfYWxsX3N5bWJvbHMoaSwgc3ltKSB7CisgICAgICAgICAgICAgICAgaWYgKCEoc3ltLT5mbGFncyAmIFNZTUJPTF9DSEVDS0VEKSAmJiBzeW1fY2hlY2tfZGVwcyhzeW0pKQorICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiIpOworCQllbHNlCisJCQlzeW0tPmZsYWdzIHw9IFNZTUJPTF9DSEVDS19ET05FOworICAgICAgICB9CisKKwlzeW1fY2hhbmdlX2NvdW50ID0gMTsKK30KKworY29uc3QgY2hhciAqemNvbmZfdG9rZW5uYW1lKGludCB0b2tlbikKK3sKKwlzd2l0Y2ggKHRva2VuKSB7CisJY2FzZSBUX01FTlU6CQlyZXR1cm4gIm1lbnUiOworCWNhc2UgVF9FTkRNRU5VOgkJcmV0dXJuICJlbmRtZW51IjsKKwljYXNlIFRfQ0hPSUNFOgkJcmV0dXJuICJjaG9pY2UiOworCWNhc2UgVF9FTkRDSE9JQ0U6CXJldHVybiAiZW5kY2hvaWNlIjsKKwljYXNlIFRfSUY6CQlyZXR1cm4gImlmIjsKKwljYXNlIFRfRU5ESUY6CQlyZXR1cm4gImVuZGlmIjsKKwl9CisJcmV0dXJuICI8dG9rZW4+IjsKK30KKworc3RhdGljIGJvb2wgemNvbmZfZW5kdG9rZW4oaW50IHRva2VuLCBpbnQgc3RhcnR0b2tlbiwgaW50IGVuZHRva2VuKQoreworCWlmICh0b2tlbiAhPSBlbmR0b2tlbikgeworCQl6Y29uZnByaW50KCJ1bmV4cGVjdGVkICclcycgd2l0aGluICVzIGJsb2NrIiwgemNvbmZfdG9rZW5uYW1lKHRva2VuKSwgemNvbmZfdG9rZW5uYW1lKHN0YXJ0dG9rZW4pKTsKKwkJemNvbmZuZXJycysrOworCQlyZXR1cm4gZmFsc2U7CisJfQorCWlmIChjdXJyZW50X21lbnUtPmZpbGUgIT0gY3VycmVudF9maWxlKSB7CisJCXpjb25mcHJpbnQoIiclcycgaW4gZGlmZmVyZW50IGZpbGUgdGhhbiAnJXMnIiwgemNvbmZfdG9rZW5uYW1lKHRva2VuKSwgemNvbmZfdG9rZW5uYW1lKHN0YXJ0dG9rZW4pKTsKKwkJemNvbmZwcmludCgibG9jYXRpb24gb2YgdGhlICclcyciLCB6Y29uZl90b2tlbm5hbWUoc3RhcnR0b2tlbikpOworCQl6Y29uZm5lcnJzKys7CisJCXJldHVybiBmYWxzZTsKKwl9CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIHpjb25mcHJpbnQoY29uc3QgY2hhciAqZXJyLCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKworCWZwcmludGYoc3RkZXJyLCAiJXM6JWQ6ICIsIHpjb25mX2N1cm5hbWUoKSwgemNvbmZfbGluZW5vKCkgKyAxKTsKKwl2YV9zdGFydChhcCwgZXJyKTsKKwl2ZnByaW50ZihzdGRlcnIsIGVyciwgYXApOworCXZhX2VuZChhcCk7CisJZnByaW50ZihzdGRlcnIsICJcbiIpOworfQorCitzdGF0aWMgdm9pZCB6Y29uZmVycm9yKGNvbnN0IGNoYXIgKmVycikKK3sKKwlmcHJpbnRmKHN0ZGVyciwgIiVzOiVkOiAlc1xuIiwgemNvbmZfY3VybmFtZSgpLCB6Y29uZl9saW5lbm8oKSArIDEsIGVycik7Cit9CisKK3ZvaWQgcHJpbnRfcXVvdGVkX3N0cmluZyhGSUxFICpvdXQsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwljb25zdCBjaGFyICpwOworCWludCBsZW47CisKKwlwdXRjKCciJywgb3V0KTsKKwl3aGlsZSAoKHAgPSBzdHJjaHIoc3RyLCAnIicpKSkgeworCQlsZW4gPSBwIC0gc3RyOworCQlpZiAobGVuKQorCQkJZnByaW50ZihvdXQsICIlLipzIiwgbGVuLCBzdHIpOworCQlmcHV0cygiXFxcIiIsIG91dCk7CisJCXN0ciA9IHAgKyAxOworCX0KKwlmcHV0cyhzdHIsIG91dCk7CisJcHV0YygnIicsIG91dCk7Cit9CisKK3ZvaWQgcHJpbnRfc3ltYm9sKEZJTEUgKm91dCwgc3RydWN0IG1lbnUgKm1lbnUpCit7CisJc3RydWN0IHN5bWJvbCAqc3ltID0gbWVudS0+c3ltOworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKworCWlmIChzeW1faXNfY2hvaWNlKHN5bSkpCisJCWZwcmludGYob3V0LCAiY2hvaWNlXG4iKTsKKwllbHNlCisJCWZwcmludGYob3V0LCAiY29uZmlnICVzXG4iLCBzeW0tPm5hbWUpOworCXN3aXRjaCAoc3ltLT50eXBlKSB7CisJY2FzZSBTX0JPT0xFQU46CisJCWZwdXRzKCIgIGJvb2xlYW5cbiIsIG91dCk7CisJCWJyZWFrOworCWNhc2UgU19UUklTVEFURToKKwkJZnB1dHMoIiAgdHJpc3RhdGVcbiIsIG91dCk7CisJCWJyZWFrOworCWNhc2UgU19TVFJJTkc6CisJCWZwdXRzKCIgIHN0cmluZ1xuIiwgb3V0KTsKKwkJYnJlYWs7CisJY2FzZSBTX0lOVDoKKwkJZnB1dHMoIiAgaW50ZWdlclxuIiwgb3V0KTsKKwkJYnJlYWs7CisJY2FzZSBTX0hFWDoKKwkJZnB1dHMoIiAgaGV4XG4iLCBvdXQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmcHV0cygiICA/Pz9cbiIsIG91dCk7CisJCWJyZWFrOworCX0KKwlmb3IgKHByb3AgPSBzeW0tPnByb3A7IHByb3A7IHByb3AgPSBwcm9wLT5uZXh0KSB7CisJCWlmIChwcm9wLT5tZW51ICE9IG1lbnUpCisJCQljb250aW51ZTsKKwkJc3dpdGNoIChwcm9wLT50eXBlKSB7CisJCWNhc2UgUF9QUk9NUFQ6CisJCQlmcHV0cygiICBwcm9tcHQgIiwgb3V0KTsKKwkJCXByaW50X3F1b3RlZF9zdHJpbmcob3V0LCBwcm9wLT50ZXh0KTsKKwkJCWlmICghZXhwcl9pc195ZXMocHJvcC0+dmlzaWJsZS5leHByKSkgeworCQkJCWZwdXRzKCIgaWYgIiwgb3V0KTsKKwkJCQlleHByX2ZwcmludChwcm9wLT52aXNpYmxlLmV4cHIsIG91dCk7CisJCQl9CisJCQlmcHV0YygnXG4nLCBvdXQpOworCQkJYnJlYWs7CisJCWNhc2UgUF9ERUZBVUxUOgorCQkJZnB1dHMoICIgIGRlZmF1bHQgIiwgb3V0KTsKKwkJCWV4cHJfZnByaW50KHByb3AtPmV4cHIsIG91dCk7CisJCQlpZiAoIWV4cHJfaXNfeWVzKHByb3AtPnZpc2libGUuZXhwcikpIHsKKwkJCQlmcHV0cygiIGlmICIsIG91dCk7CisJCQkJZXhwcl9mcHJpbnQocHJvcC0+dmlzaWJsZS5leHByLCBvdXQpOworCQkJfQorCQkJZnB1dGMoJ1xuJywgb3V0KTsKKwkJCWJyZWFrOworCQljYXNlIFBfQ0hPSUNFOgorCQkJZnB1dHMoIiAgI2Nob2ljZSB2YWx1ZVxuIiwgb3V0KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZnByaW50ZihvdXQsICIgIHVua25vd24gcHJvcCAlZCFcbiIsIHByb3AtPnR5cGUpOworCQkJYnJlYWs7CisJCX0KKwl9CisJaWYgKHN5bS0+aGVscCkgeworCQlpbnQgbGVuID0gc3RybGVuKHN5bS0+aGVscCk7CisJCXdoaWxlIChzeW0tPmhlbHBbLS1sZW5dID09ICdcbicpCisJCQlzeW0tPmhlbHBbbGVuXSA9IDA7CisJCWZwcmludGYob3V0LCAiICBoZWxwXG4lc1xuIiwgc3ltLT5oZWxwKTsKKwl9CisJZnB1dGMoJ1xuJywgb3V0KTsKK30KKwordm9pZCB6Y29uZmR1bXAoRklMRSAqb3V0KQoreworCXN0cnVjdCBwcm9wZXJ0eSAqcHJvcDsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW07CisJc3RydWN0IG1lbnUgKm1lbnU7CisKKwltZW51ID0gcm9vdG1lbnUubGlzdDsKKwl3aGlsZSAobWVudSkgeworCQlpZiAoKHN5bSA9IG1lbnUtPnN5bSkpCisJCQlwcmludF9zeW1ib2wob3V0LCBtZW51KTsKKwkJZWxzZSBpZiAoKHByb3AgPSBtZW51LT5wcm9tcHQpKSB7CisJCQlzd2l0Y2ggKHByb3AtPnR5cGUpIHsKKwkJCWNhc2UgUF9DT01NRU5UOgorCQkJCWZwdXRzKCJcbmNvbW1lbnQgIiwgb3V0KTsKKwkJCQlwcmludF9xdW90ZWRfc3RyaW5nKG91dCwgcHJvcC0+dGV4dCk7CisJCQkJZnB1dHMoIlxuIiwgb3V0KTsKKwkJCQlicmVhazsKKwkJCWNhc2UgUF9NRU5VOgorCQkJCWZwdXRzKCJcbm1lbnUgIiwgb3V0KTsKKwkJCQlwcmludF9xdW90ZWRfc3RyaW5nKG91dCwgcHJvcC0+dGV4dCk7CisJCQkJZnB1dHMoIlxuIiwgb3V0KTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJOworCQkJfQorCQkJaWYgKCFleHByX2lzX3llcyhwcm9wLT52aXNpYmxlLmV4cHIpKSB7CisJCQkJZnB1dHMoIiAgZGVwZW5kcyAiLCBvdXQpOworCQkJCWV4cHJfZnByaW50KHByb3AtPnZpc2libGUuZXhwciwgb3V0KTsKKwkJCQlmcHV0YygnXG4nLCBvdXQpOworCQkJfQorCQkJZnB1dHMoIlxuIiwgb3V0KTsKKwkJfQorCisJCWlmIChtZW51LT5saXN0KQorCQkJbWVudSA9IG1lbnUtPmxpc3Q7CisJCWVsc2UgaWYgKG1lbnUtPm5leHQpCisJCQltZW51ID0gbWVudS0+bmV4dDsKKwkJZWxzZSB3aGlsZSAoKG1lbnUgPSBtZW51LT5wYXJlbnQpKSB7CisJCQlpZiAobWVudS0+cHJvbXB0ICYmIG1lbnUtPnByb21wdC0+dHlwZSA9PSBQX01FTlUpCisJCQkJZnB1dHMoIlxuZW5kbWVudVxuIiwgb3V0KTsKKwkJCWlmIChtZW51LT5uZXh0KSB7CisJCQkJbWVudSA9IG1lbnUtPm5leHQ7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9Cit9CisKKyNpbmNsdWRlICJsZXguemNvbmYuYyIKKyNpbmNsdWRlICJ1dGlsLmMiCisjaW5jbHVkZSAiY29uZmRhdGEuYyIKKyNpbmNsdWRlICJleHByLmMiCisjaW5jbHVkZSAic3ltYm9sLmMiCisjaW5jbHVkZSAibWVudS5jIgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rZXJuZWwtZG9jIGIvc2NyaXB0cy9rZXJuZWwtZG9jCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjhiMWRhYjYKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2tlcm5lbC1kb2MKQEAgLTAsMCArMSwxODMxIEBACisjIS91c3IvYmluL3BlcmwgLXcKKwordXNlIHN0cmljdDsKKworIyMgQ29weXJpZ2h0IChjKSAxOTk4IE1pY2hhZWwgWnVjY2hpLCBBbGwgUmlnaHRzIFJlc2VydmVkICAgICAgICAjIworIyMgQ29weXJpZ2h0IChDKSAyMDAwLCAxICBUaW0gV2F1Z2ggPHR3YXVnaEByZWRoYXQuY29tPiAgICAgICAgICAjIworIyMgQ29weXJpZ2h0IChDKSAyMDAxICBTaW1vbiBIdWdnaW5zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIworIyMgCQkJCQkJCQkgIyMKKyMjICNkZWZpbmUgZW5oYW5jZW1lbnRzIGJ5IEFybWluIEt1c3RlciA8YWt1c3RlckBtdmlzdGEuY29tPgkgIyMKKyMjIENvcHlyaWdodCAoYykgMjAwMCBNb250YVZpc3RhIFNvZnR3YXJlLCBJbmMuCQkJICMjCisjIyAJCQkJCQkJCSAjIworIyMgVGhpcyBzb2Z0d2FyZSBmYWxscyB1bmRlciB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICAgICAjIworIyMgUGxlYXNlIHJlYWQgdGhlIENPUFlJTkcgZmlsZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiAgICAgICAgICAgICAjIworCisjIHcuby4gMDMtMTEtMjAwMDogYWRkZWQgdGhlICctZmlsZWxpc3QnIG9wdGlvbi4KKworIyAxOC8wMS8yMDAxIC0gCUNsZWFudXBzCisjIAkJRnVuY3Rpb25zIHByb3RvdHlwZWQgYXMgZm9vKHZvaWQpIHNhbWUgYXMgZm9vKCkKKyMgCQlTdG9wIGV2YWwnaW5nIHdoZXJlIHdlIGRvbid0IG5lZWQgdG8uCisjIC0tIGh1Z2dpZUBlYXJ0aC5saQorCisjIDI3LzA2LzIwMDEgLSAgQWxsb3dlZCB3aGl0ZXNwYWNlIGFmdGVyIGluaXRpYWwgIi8qKiIgYW5kCisjICAgICAgICAgICAgICAgYWxsb3dlZCBjb21tZW50cyBiZWZvcmUgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgorIyAtLSBDaHJpc3RpYW4gS3JlaWJpY2ggPGNrQHdob29wLm9yZz4KKworIyBTdGlsbCB0byBkbzoKKyMgCS0gYWRkIHBlcmxkb2MgZG9jdW1lbnRhdGlvbgorIyAJLSBMb29rIG1vcmUgY2xvc2VseSBhdCBzb21lIG9mIHRoZSBzY2FyaWVyIGJpdHMgOikKKworIyAyNi8wNS8yMDAxIC0gCVN1cHBvcnQgZm9yIHNlcGFyYXRlIHNvdXJjZSBhbmQgb2JqZWN0IHRyZWVzLgorIwkJUmV0dXJuIGVycm9yIGNvZGUuCisjIAkJS2VpdGggT3dlbnMgPGthb3NAb2NzLmNvbS5hdT4KKworIyAyMy8wOS8yMDAxIC0gQWRkZWQgc3VwcG9ydCBmb3IgdHlwZWRlZnMsIHN0cnVjdHMsIGVudW1zIGFuZCB1bmlvbnMKKyMgICAgICAgICAgICAgIFN1cHBvcnQgZm9yIENvbnRleHQgc2VjdGlvbjsgY2FuIGJlIHRlcm1pbmF0ZWQgdXNpbmcgZW1wdHkgbGluZQorIyAgICAgICAgICAgICAgU21hbGwgZml4ZXMgKGxpa2Ugc3BhY2VzIHZzLiBccyBpbiByZWdleCkKKyMgLS0gVGltIEphbnNlbiA8dGltQHRqYW5zZW4uZGU+CisKKworIworIyBUaGlzIHdpbGwgcmVhZCBhICdjJyBmaWxlIGFuZCBzY2FuIGZvciBlbWJlZGRlZCBjb21tZW50cyBpbiB0aGUKKyMgc3R5bGUgb2YgZ25vbWUgY29tbWVudHMgKCttaW5vciBleHRlbnNpb25zIC0gc2VlIGJlbG93KS4KKyMKKworIyBOb3RlOiBUaGlzIG9ubHkgc3VwcG9ydHMgJ2MnLgorCisjIHVzYWdlOgorIyBrZXJuZWxkb2MgWyAtZG9jYm9vayB8IC1odG1sIHwgLXRleHQgfCAtbWFuIF0KKyMgICAgICAgICAgIFsgLWZ1bmN0aW9uIGZ1bmNuYW1lIFsgLWZ1bmN0aW9uIGZ1bmNuYW1lIC4uLl0gXSBjIGZpbGUocylzID4gb3V0cHV0ZmlsZQorIyBvcgorIyAgICAgICAgICAgWyAtbm9mdW5jdGlvbiBmdW5jbmFtZSBbIC1mdW5jdGlvbiBmdW5jbmFtZSAuLi5dIF0gYyBmaWxlKHMpcyA+IG91dHB1dGZpbGUKKyMKKyMgIFNldCBvdXRwdXQgZm9ybWF0IHVzaW5nIG9uZSBvZiAtZG9jYm9vayAtaHRtbCAtdGV4dCBvciAtbWFuLiAgRGVmYXVsdCBpcyBtYW4uCisjCisjICAtZnVuY3Rpb24gZnVuY25hbWUKKyMJSWYgc2V0LCB0aGVuIG9ubHkgZ2VuZXJhdGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIGdpdmVuIGZ1bmN0aW9uKHMpLiAgQWxsCisjCW90aGVyIGZ1bmN0aW9ucyBhcmUgaWdub3JlZC4KKyMKKyMgIC1ub2Z1bmN0aW9uIGZ1bmNuYW1lCisjCUlmIHNldCwgdGhlbiBvbmx5IGdlbmVyYXRlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBvdGhlciBmdW5jdGlvbihzKS4gIEFsbAorIwlvdGhlciBmdW5jdGlvbnMgYXJlIGlnbm9yZWQuIENhbm5vdCBiZSB1c2VkIHdpdGggLWZ1bmN0aW9uIHRvZ2V0aGVyCisjCSh5ZXMgdGhhdHMgYSBidWcgLSBwZXJsIGhhY2tlcnMgY2FuIGZpeCBpdCA4KSkKKyMKKyMgIGMgZmlsZXMgLSBsaXN0IG9mICdjJyBmaWxlcyB0byBwcm9jZXNzCisjCisjICBBbGwgb3V0cHV0IGdvZXMgdG8gc3Rkb3V0LCB3aXRoIGVycm9ycyB0byBzdGRlcnIuCisKKyMKKyMgZm9ybWF0IG9mIGNvbW1lbnRzLgorIyBJbiB0aGUgZm9sbG93aW5nIHRhYmxlLCAoLi4uKT8gc2lnbmlmaWVzIG9wdGlvbmFsIHN0cnVjdHVyZS4KKyMgICAgICAgICAgICAgICAgICAgICAgICAgKC4uLikqIHNpZ25pZmllcyAwIG9yIG1vcmUgc3RydWN0dXJlIGVsZW1lbnRzCisjIC8qKgorIyAgKiBmdW5jdGlvbl9uYW1lKDopPyAoLSBzaG9ydCBkZXNjcmlwdGlvbik/CisjICgqIEBwYXJhbWV0ZXJ4OiAoZGVzY3JpcHRpb24gb2YgcGFyYW1ldGVyIHgpPykqCisjICgqIGEgYmxhbmsgbGluZSk/CisjICAqIChEZXNjcmlwdGlvbjopPyAoRGVzY3JpcHRpb24gb2YgZnVuY3Rpb24pPworIyAgKiAoc2VjdGlvbiBoZWFkZXI6IChzZWN0aW9uIGRlc2NyaXB0aW9uKT8gKSoKKyMgICgqKT8qLworIworIyBTbyAuLiB0aGUgdHJpdmlhbCBleGFtcGxlIHdvdWxkIGJlOgorIworIyAvKioKKyMgICogbXlfZnVuY3Rpb24KKyMgICoqLworIworIyBJZiB0aGUgRGVzY3JpcHRpb246IGhlYWRlciB0YWcgaXMgb21taXR0ZWQsIHRoZW4gdGhlcmUgbXVzdCBiZSBhIGJsYW5rIGxpbmUKKyMgYWZ0ZXIgdGhlIGxhc3QgcGFyYW1ldGVyIHNwZWNpZmljYXRpb24uCisjIGUuZy4KKyMgLyoqCisjICAqIG15X2Z1bmN0aW9uIC0gZG9lcyBteSBzdHVmZgorIyAgKiBAbXlfYXJnOiBpdHMgbWluZSBkYW1uaXQKKyMgICoKKyMgICogRG9lcyBteSBzdHVmZiBleHBsYWluZWQuIAorIyAgKi8KKyMKKyMgIG9yLCBjb3VsZCBhbHNvIHVzZToKKyMgLyoqCisjICAqIG15X2Z1bmN0aW9uIC0gZG9lcyBteSBzdHVmZgorIyAgKiBAbXlfYXJnOiBpdHMgbWluZSBkYW1uaXQKKyMgICogRGVzY3JpcHRpb246IERvZXMgbXkgc3R1ZmYgZXhwbGFpbmVkLiAKKyMgICovCisjIGV0Yy4KKyMKKyMgQmVzaWRlIGZ1bmN0aW9ucyB5b3UgY2FuIGFsc28gd3JpdGUgZG9jdW1lbnRhdGlvbiBmb3Igc3RydWN0cywgdW5pb25zLCAKKyMgZW51bXMgYW5kIHR5cGVkZWZzLiBJbnN0ZWFkIG9mIHRoZSBmdW5jdGlvbiBuYW1lIHlvdSBtdXN0IHdyaXRlIHRoZSBuYW1lIAorIyBvZiB0aGUgZGVjbGFyYXRpb247ICB0aGUgc3RydWN0L3VuaW9uL2VudW0vdHlwZWRlZiBtdXN0IGFsd2F5cyBwcmVjZWRlIAorIyB0aGUgbmFtZS4gTmVzdGluZyBvZiBkZWNsYXJhdGlvbnMgaXMgbm90IHN1cHBvcnRlZC4gCisjIFVzZSB0aGUgYXJndW1lbnQgbWVjaGFuaXNtIHRvIGRvY3VtZW50IG1lbWJlcnMgb3IgY29uc3RhbnRzLgorIyBlLmcuCisjIC8qKgorIyAgKiBzdHJ1Y3QgbXlfc3RydWN0IC0gc2hvcnQgZGVzY3JpcHRpb24KKyMgICogQGE6IGZpcnN0IG1lbWJlcgorIyAgKiBAYjogc2Vjb25kIG1lbWJlcgorIyAgKiAKKyMgICogTG9uZ2VyIGRlc2NyaXB0aW9uCisjICAqLworIyBzdHJ1Y3QgbXlfc3RydWN0IHsKKyMgICAgIGludCBhOworIyAgICAgaW50IGI7CisjIH07CisjCisjIEFsbCBkZXNjcmlwdGlvbnMgY2FuIGJlIG11bHRpbGluZSwgZXhjZXB0IHRoZSBzaG9ydCBmdW5jdGlvbiBkZXNjcmlwdGlvbi4KKyMgCisjIFlvdSBjYW4gYWxzbyBhZGQgYWRkaXRpb25hbCBzZWN0aW9ucy4gV2hlbiBkb2N1bWVudGluZyBrZXJuZWwgZnVuY3Rpb25zIHlvdSAKKyMgc2hvdWxkIGRvY3VtZW50IHRoZSAiQ29udGV4dDoiIG9mIHRoZSBmdW5jdGlvbiwgZS5nLiB3aGV0aGVyIHRoZSBmdW5jdGlvbnMgCisjIGNhbiBiZSBjYWxsZWQgZm9ybSBpbnRlcnJ1cHRzLiBVbmxpa2Ugb3RoZXIgc2VjdGlvbnMgeW91IGNhbiBlbmQgaXQgd2l0aCBhbgorIyBlbXB0eSBsaW5lLiAKKyMgRXhhbXBsZS1zZWN0aW9ucyBzaG91bGQgY29udGFpbiB0aGUgc3RyaW5nIEVYQU1QTEUgc28gdGhhdCB0aGV5IGFyZSBtYXJrZWQgCisjIGFwcHJvcHJpYXRlbHkgaW4gRG9jQm9vay4KKyMKKyMgRXhhbXBsZToKKyMgLyoqCisjICAqIHVzZXJfZnVuY3Rpb24gLSBmdW5jdGlvbiB0aGF0IGNhbiBvbmx5IGJlIGNhbGxlZCBpbiB1c2VyIGNvbnRleHQKKyMgICogQGE6IHNvbWUgYXJndW1lbnQKKyMgICogQ29udGV4dDogIWluX2ludGVycnVwdCgpCisjICAqIAorIyAgKiBTb21lIGRlc2NyaXB0aW9uCisjICAqIEV4YW1wbGU6CisjICAqICAgIHVzZXJfZnVuY3Rpb24oMjIpOworIyAgKi8KKyMgLi4uCisjCisjCisjIEFsbCBkZXNjcmlwdGl2ZSB0ZXh0IGlzIGZ1cnRoZXIgcHJvY2Vzc2VkLCBzY2FubmluZyBmb3IgdGhlIGZvbGxvd2luZyBzcGVjaWFsCisjIHBhdHRlcm5zLCB3aGljaCBhcmUgaGlnaGxpZ2h0ZWQgYXBwcm9wcmlhdGVseS4KKyMKKyMgJ2Z1bmNuYW1lKCknIC0gZnVuY3Rpb24KKyMgJyRFTlZWQVInIC0gZW52aXJvbm1lbnRhbCB2YXJpYWJsZQorIyAnJnN0cnVjdF9uYW1lJyAtIG5hbWUgb2YgYSBzdHJ1Y3R1cmUgKHVwIHRvIHR3byB3b3JkcyBpbmNsdWRpbmcgJ3N0cnVjdCcpCisjICdAcGFyYW1ldGVyJyAtIG5hbWUgb2YgYSBwYXJhbWV0ZXIKKyMgJyVDT05TVCcgLSBuYW1lIG9mIGEgY29uc3RhbnQuCisKK215ICRlcnJvcnMgPSAwOworbXkgJHdhcm5pbmdzID0gMDsKKworIyBtYXRjaCBleHByZXNzaW9ucyB1c2VkIHRvIGZpbmQgZW1iZWRkZWQgdHlwZSBpbmZvcm1hdGlvbgorbXkgJHR5cGVfY29uc3RhbnQgPSAnXCUoWy1fXHddKyknOworbXkgJHR5cGVfZnVuYyA9ICcoXHcrKVwoXCknOworbXkgJHR5cGVfcGFyYW0gPSAnXEAoXHcrKSc7CitteSAkdHlwZV9zdHJ1Y3QgPSAnXCYoKHN0cnVjdFxzKik/W19cd10rKSc7CitteSAkdHlwZV9lbnYgPSAnKFwkXHcrKSc7CisKKyMgT3V0cHV0IGNvbnZlcnNpb24gc3Vic3RpdHV0aW9ucy4KKyMgIE9uZSBmb3IgZWFjaCBvdXRwdXQgZm9ybWF0CisKKyMgdGhlc2Ugd29yayBmYWlybHkgd2VsbAorbXkgJWhpZ2hsaWdodHNfaHRtbCA9ICggJHR5cGVfY29uc3RhbnQsICI8aT5cJDE8L2k+IiwKKwkJCSR0eXBlX2Z1bmMsICI8Yj5cJDE8L2I+IiwKKwkJCSR0eXBlX3N0cnVjdCwgIjxpPlwkMTwvaT4iLAorCQkJJHR5cGVfcGFyYW0sICI8dHQ+PGI+XCQxPC9iPjwvdHQ+IiApOworbXkgJGJsYW5rbGluZV9odG1sID0gIjxwPiI7CisKKyMgWE1MLCBkb2Nib29rIGZvcm1hdAorbXkgJWhpZ2hsaWdodHNfeG1sID0gKCAiKFtePV0pXFxcIihbXlxcXCI8XSspXFxcIiIsICJcJDE8cXVvdGU+XCQyPC9xdW90ZT4iLAorCQkJJHR5cGVfY29uc3RhbnQsICI8Y29uc3RhbnQ+XCQxPC9jb25zdGFudD4iLAorCQkJJHR5cGVfZnVuYywgIjxmdW5jdGlvbj5cJDE8L2Z1bmN0aW9uPiIsCisJCQkkdHlwZV9zdHJ1Y3QsICI8c3RydWN0bmFtZT5cJDE8L3N0cnVjdG5hbWU+IiwKKwkJCSR0eXBlX2VudiwgIjxlbnZhcj5cJDE8L2VudmFyPiIsCisJCQkkdHlwZV9wYXJhbSwgIjxwYXJhbWV0ZXI+XCQxPC9wYXJhbWV0ZXI+IiApOworbXkgJGJsYW5rbGluZV94bWwgPSAiPC9wYXJhPjxwYXJhPlxuIjsKKworIyBnbm9tZSwgZG9jYm9vayBmb3JtYXQKK215ICVoaWdobGlnaHRzX2dub21lID0gKCAkdHlwZV9jb25zdGFudCwgIjxyZXBsYWNlYWJsZSBjbGFzcz1cIm9wdGlvblwiPlwkMTwvcmVwbGFjZWFibGU+IiwKKwkJCSAkdHlwZV9mdW5jLCAiPGZ1bmN0aW9uPlwkMTwvZnVuY3Rpb24+IiwKKwkJCSAkdHlwZV9zdHJ1Y3QsICI8c3RydWN0bmFtZT5cJDE8L3N0cnVjdG5hbWU+IiwKKwkJCSAkdHlwZV9lbnYsICI8ZW52YXI+XCQxPC9lbnZhcj4iLAorCQkJICR0eXBlX3BhcmFtLCAiPHBhcmFtZXRlcj5cJDE8L3BhcmFtZXRlcj4iICk7CitteSAkYmxhbmtsaW5lX2dub21lID0gIjwvcGFyYT48cGFyYT5cbiI7CisKKyMgdGhlc2UgYXJlIHByZXR0eSByb3VnaAorbXkgJWhpZ2hsaWdodHNfbWFuID0gKCAkdHlwZV9jb25zdGFudCwgIlwkMSIsCisJCSAgICAgICAkdHlwZV9mdW5jLCAiXFxcXGZCXCQxXFxcXGZQIiwKKwkJICAgICAgICR0eXBlX3N0cnVjdCwgIlxcXFxmSVwkMVxcXFxmUCIsCisJCSAgICAgICAkdHlwZV9wYXJhbSwgIlxcXFxmSVwkMVxcXFxmUCIgKTsKK215ICRibGFua2xpbmVfbWFuID0gIiI7CisKKyMgdGV4dC1tb2RlCitteSAlaGlnaGxpZ2h0c190ZXh0ID0gKCAkdHlwZV9jb25zdGFudCwgIlwkMSIsCisJCQkkdHlwZV9mdW5jLCAiXCQxIiwKKwkJCSR0eXBlX3N0cnVjdCwgIlwkMSIsCisJCQkkdHlwZV9wYXJhbSwgIlwkMSIgKTsKK215ICRibGFua2xpbmVfdGV4dCA9ICIiOworCisKK3N1YiB1c2FnZSB7CisgICAgcHJpbnQgIlVzYWdlOiAkMCBbIC12IF0gWyAtZG9jYm9vayB8IC1odG1sIHwgLXRleHQgfCAtbWFuIF1cbiI7CisgICAgcHJpbnQgIiAgICAgICAgIFsgLWZ1bmN0aW9uIGZ1bmNuYW1lIFsgLWZ1bmN0aW9uIGZ1bmNuYW1lIC4uLl0gXVxuIjsKKyAgICBwcmludCAiICAgICAgICAgWyAtbm9mdW5jdGlvbiBmdW5jbmFtZSBbIC1ub2Z1bmN0aW9uIGZ1bmNuYW1lIC4uLl0gXVxuIjsKKyAgICBwcmludCAiICAgICAgICAgYyBzb3VyY2UgZmlsZShzKSA+IG91dHB1dGZpbGVcbiI7CisgICAgZXhpdCAxOworfQorCisjIHJlYWQgYXJndW1lbnRzCitpZiAoJCNBUkdWPT0tMSkgeworICAgIHVzYWdlKCk7Cit9CisKK215ICR2ZXJib3NlID0gMDsKK215ICRvdXRwdXRfbW9kZSA9ICJtYW4iOworbXkgJWhpZ2hsaWdodHMgPSAlaGlnaGxpZ2h0c19tYW47CitteSAkYmxhbmtsaW5lID0gJGJsYW5rbGluZV9tYW47CitteSAkbW9kdWxlbmFtZSA9ICJLZXJuZWwgQVBJIjsKK215ICRmdW5jdGlvbl9vbmx5ID0gMDsKK215ICRtYW5fZGF0ZSA9ICgnSmFudWFyeScsICdGZWJydWFyeScsICdNYXJjaCcsICdBcHJpbCcsICdNYXknLCAnSnVuZScsIAorCQknSnVseScsICdBdWd1c3QnLCAnU2VwdGVtYmVyJywgJ09jdG9iZXInLCAKKwkJJ05vdmVtYmVyJywgJ0RlY2VtYmVyJylbKGxvY2FsdGltZSlbNF1dIC4gCisgICIgIiAuICgobG9jYWx0aW1lKVs1XSsxOTAwKTsKKworIyBFc3NlbnRpYWxseSB0aGVzZSBhcmUgZ2xvYmFscworIyBUaGV5IHByb2JhYmx5IHdhbnQgdG8gYmUgdGlkaWVkIHVwIG1hZGUgbW9yZSBsb2NhbGlzZWQgb3Igc3VtbWF0LgorIyBDQVZFQVQgRU1QVE9SISAgU29tZSBvZiB0aGUgb3RoZXJzIEkgbG9jYWxpc2VkIG1heSBub3Qgd2FudCB0byBiZSB3aGljaAorIyBjb3VsZCBjYXVzZSAidXNlIG9mIHVuZGVmaW5lZCB2YWx1ZSIgb3Igb3RoZXIgYnVncy4KK215ICgkZnVuY3Rpb24sICVmdW5jdGlvbl90YWJsZSwlcGFyYW1ldGVydHlwZXMsJGRlY2xhcmF0aW9uX3B1cnBvc2UpOworbXkgKCR0eXBlLCRkZWNsYXJhdGlvbl9uYW1lLCRyZXR1cm5fdHlwZSk7CitteSAoJG5ld3NlY3Rpb24sJG5ld2NvbnRlbnRzLCRwcm90b3R5cGUsJGZpbGVsaXN0LCAkYnJjb3VudCwgJXNvdXJjZV9tYXApOworCisjIEdlbmVyYXRlZCBkb2Nib29rIGNvZGUgaXMgaW5zZXJ0ZWQgaW4gYSB0ZW1wbGF0ZSBhdCBhIHBvaW50IHdoZXJlIAorIyBkb2Nib29rIHYzLjEgcmVxdWlyZXMgYSBub24temVybyBzZXF1ZW5jZSBvZiBSZWZFbnRyeSdzOyBzZWU6CisjIGh0dHA6Ly93d3cub2FzaXMtb3Blbi5vcmcvZG9jYm9vay9kb2N1bWVudGF0aW9uL3JlZmVyZW5jZS9odG1sL3JlZmVudHJ5Lmh0bWwKKyMgV2Uga2VlcCB0cmFjayBvZiBudW1iZXIgb2YgZ2VuZXJhdGVkIGVudHJpZXMgYW5kIGdlbmVyYXRlIGEgZHVtbXkKKyMgaWYgbmVlZHMgYmUgdG8gZW5zdXJlIHRoZSBleHBhbmRlZCB0ZW1wbGF0ZSBjYW4gYmUgcG9zdHByb2Nlc3NlZAorIyBpbnRvIGh0bWwuCitteSAkc2VjdGlvbl9jb3VudGVyID0gMDsKKworbXkgJGxpbmVwcmVmaXg9IiI7CisKKyMgc3RhdGVzCisjIDAgLSBub3JtYWwgY29kZQorIyAxIC0gbG9va2luZyBmb3IgZnVuY3Rpb24gbmFtZQorIyAyIC0gc2Nhbm5pbmcgZmllbGQgc3RhcnQuCisjIDMgLSBzY2FubmluZyBwcm90b3R5cGUuCisjIDQgLSBkb2N1bWVudGF0aW9uIGJsb2NrCitteSAkc3RhdGU7CisKKyNkZWNsYXJhdGlvbiB0eXBlczogY2FuIGJlCisjICdmdW5jdGlvbicsICdzdHJ1Y3QnLCAndW5pb24nLCAnZW51bScsICd0eXBlZGVmJworbXkgJGRlY2xfdHlwZTsKKworbXkgJGRvY19zcGVjaWFsID0gIlxAXCVcJFwmIjsKKworbXkgJGRvY19zdGFydCA9ICdeL1wqXCpccyokJzsgIyBBbGxvdyB3aGl0ZXNwYWNlIGF0IGVuZCBvZiBjb21tZW50IHN0YXJ0LgorbXkgJGRvY19lbmQgPSAnXCovJzsKK215ICRkb2NfY29tID0gJ1xzKlwqXHMqJzsKK215ICRkb2NfZGVjbCA9ICRkb2NfY29tLicoXHcrKSc7CitteSAkZG9jX3NlY3QgPSAkZG9jX2NvbS4nKFsnLiRkb2Nfc3BlY2lhbC4nXT9bXHcgXSspOiguKiknOworbXkgJGRvY19jb250ZW50ID0gJGRvY19jb20uJyguKiknOworbXkgJGRvY19ibG9jayA9ICRkb2NfY29tLidET0M6XHMqKC4qKT8nOworCitteSAlY29uc3RhbnRzOworbXkgJXBhcmFtZXRlcmRlc2NzOworbXkgQHBhcmFtZXRlcmxpc3Q7CitteSAlc2VjdGlvbnM7CitteSBAc2VjdGlvbmxpc3Q7CisKK215ICRjb250ZW50cyA9ICIiOworbXkgJHNlY3Rpb25fZGVmYXVsdCA9ICJEZXNjcmlwdGlvbiI7CSMgZGVmYXVsdCBzZWN0aW9uCitteSAkc2VjdGlvbl9pbnRybyA9ICJJbnRyb2R1Y3Rpb24iOworbXkgJHNlY3Rpb24gPSAkc2VjdGlvbl9kZWZhdWx0OworbXkgJHNlY3Rpb25fY29udGV4dCA9ICJDb250ZXh0IjsKKworbXkgJHVuZGVzY3JpYmVkID0gIi0tIHVuZGVzY3JpYmVkIC0tIjsKKworcmVzZXRfc3RhdGUoKTsKKword2hpbGUgKCRBUkdWWzBdID1+IG0vXi0oLiopLykgeworICAgIG15ICRjbWQgPSBzaGlmdCBAQVJHVjsKKyAgICBpZiAoJGNtZCBlcSAiLWh0bWwiKSB7CisJJG91dHB1dF9tb2RlID0gImh0bWwiOworCSVoaWdobGlnaHRzID0gJWhpZ2hsaWdodHNfaHRtbDsKKwkkYmxhbmtsaW5lID0gJGJsYW5rbGluZV9odG1sOworICAgIH0gZWxzaWYgKCRjbWQgZXEgIi1tYW4iKSB7CisJJG91dHB1dF9tb2RlID0gIm1hbiI7CisJJWhpZ2hsaWdodHMgPSAlaGlnaGxpZ2h0c19tYW47CisJJGJsYW5rbGluZSA9ICRibGFua2xpbmVfbWFuOworICAgIH0gZWxzaWYgKCRjbWQgZXEgIi10ZXh0IikgeworCSRvdXRwdXRfbW9kZSA9ICJ0ZXh0IjsKKwklaGlnaGxpZ2h0cyA9ICVoaWdobGlnaHRzX3RleHQ7CisJJGJsYW5rbGluZSA9ICRibGFua2xpbmVfdGV4dDsKKyAgICB9IGVsc2lmICgkY21kIGVxICItZG9jYm9vayIpIHsKKwkkb3V0cHV0X21vZGUgPSAieG1sIjsKKwklaGlnaGxpZ2h0cyA9ICVoaWdobGlnaHRzX3htbDsKKwkkYmxhbmtsaW5lID0gJGJsYW5rbGluZV94bWw7CisgICAgfSBlbHNpZiAoJGNtZCBlcSAiLWdub21lIikgeworCSRvdXRwdXRfbW9kZSA9ICJnbm9tZSI7CisJJWhpZ2hsaWdodHMgPSAlaGlnaGxpZ2h0c19nbm9tZTsKKwkkYmxhbmtsaW5lID0gJGJsYW5rbGluZV9nbm9tZTsKKyAgICB9IGVsc2lmICgkY21kIGVxICItbW9kdWxlIikgeyAjIG5vdCBuZWVkZWQgZm9yIFhNTCwgaW5oZXJpdHMgZnJvbSBjYWxsaW5nIGRvY3VtZW50CisJJG1vZHVsZW5hbWUgPSBzaGlmdCBAQVJHVjsKKyAgICB9IGVsc2lmICgkY21kIGVxICItZnVuY3Rpb24iKSB7ICMgdG8gb25seSBvdXRwdXQgc3BlY2lmaWMgZnVuY3Rpb25zCisJJGZ1bmN0aW9uX29ubHkgPSAxOworCSRmdW5jdGlvbiA9IHNoaWZ0IEBBUkdWOworCSRmdW5jdGlvbl90YWJsZXskZnVuY3Rpb259ID0gMTsKKyAgICB9IGVsc2lmICgkY21kIGVxICItbm9mdW5jdGlvbiIpIHsgIyB0byBvbmx5IG91dHB1dCBzcGVjaWZpYyBmdW5jdGlvbnMKKwkkZnVuY3Rpb25fb25seSA9IDI7CisJJGZ1bmN0aW9uID0gc2hpZnQgQEFSR1Y7CisJJGZ1bmN0aW9uX3RhYmxleyRmdW5jdGlvbn0gPSAxOworICAgIH0gZWxzaWYgKCRjbWQgZXEgIi12IikgeworCSR2ZXJib3NlID0gMTsKKyAgICB9IGVsc2lmICgoJGNtZCBlcSAiLWgiKSB8fCAoJGNtZCBlcSAiLS1oZWxwIikpIHsKKwl1c2FnZSgpOworICAgIH0gZWxzaWYgKCRjbWQgZXEgJy1maWxlbGlzdCcpIHsKKwkgICAgJGZpbGVsaXN0ID0gc2hpZnQgQEFSR1Y7CisgICAgfQorfQorCisKKyMgZ2VuZXJhdGUgYSBzZXF1ZW5jZSBvZiBjb2RlIHRoYXQgd2lsbCBzcGxpY2UgaW4gaGlnaGxpZ2h0aW5nIGluZm9ybWF0aW9uCisjIHVzaW5nIHRoZSBzLy8gb3BlcmF0b3IuCitteSAkZG9oaWdobGlnaHQgPSAiIjsKK2ZvcmVhY2ggbXkgJHBhdHRlcm4gKGtleXMgJWhpZ2hsaWdodHMpIHsKKyMgICAgcHJpbnQgInNjYW5uaW5nIHBhdHRlcm4gJHBhdHRlcm4gKCRoaWdobGlnaHRzeyRwYXR0ZXJufSlcbiI7CisgICAgJGRvaGlnaGxpZ2h0IC49ICAiXCRjb250ZW50cyA9fiBzOiRwYXR0ZXJuOiRoaWdobGlnaHRzeyRwYXR0ZXJufTpncztcbiI7Cit9CisKKyMjCisjIGR1bXBzIHNlY3Rpb24gY29udGVudHMgdG8gYXJyYXlzL2hhc2hlcyBpbnRlbmRlZCBmb3IgdGhhdCBwdXJwb3NlLgorIworc3ViIGR1bXBfc2VjdGlvbiB7CisgICAgbXkgJG5hbWUgPSBzaGlmdDsKKyAgICBteSAkY29udGVudHMgPSBqb2luICJcbiIsIEBfOworCisgICAgaWYgKCRuYW1lID1+IG0vJHR5cGVfY29uc3RhbnQvKSB7CisJJG5hbWUgPSAkMTsKKyMJcHJpbnQgU1RERVJSICJjb25zdGFudCBzZWN0aW9uICckMScgPSAnJGNvbnRlbnRzJ1xuIjsKKwkkY29uc3RhbnRzeyRuYW1lfSA9ICRjb250ZW50czsKKyAgICB9IGVsc2lmICgkbmFtZSA9fiBtLyR0eXBlX3BhcmFtLykgeworIwlwcmludCBTVERFUlIgInBhcmFtZXRlciBkZWYgJyQxJyA9ICckY29udGVudHMnXG4iOworCSRuYW1lID0gJDE7CisJJHBhcmFtZXRlcmRlc2NzeyRuYW1lfSA9ICRjb250ZW50czsKKyAgICB9IGVsc2UgeworIwlwcmludCBTVERFUlIgIm90aGVyIHNlY3Rpb24gJyRuYW1lJyA9ICckY29udGVudHMnXG4iOworCSRzZWN0aW9uc3skbmFtZX0gPSAkY29udGVudHM7CisJcHVzaCBAc2VjdGlvbmxpc3QsICRuYW1lOworICAgIH0KK30KKworIyMKKyMgb3V0cHV0IGZ1bmN0aW9uCisjCisjIHBhcmFtZXRlcmRlc2NzLCBhIGhhc2guCisjICBmdW5jdGlvbiA9PiAiZnVuY3Rpb24gbmFtZSIKKyMgIHBhcmFtZXRlcmxpc3QgPT4gQGxpc3Qgb2YgcGFyYW1ldGVycworIyAgcGFyYW1ldGVyZGVzY3MgPT4gJXBhcmFtZXRlciBkZXNjcmlwdGlvbnMKKyMgIHNlY3Rpb25saXN0ID0+IEBsaXN0IG9mIHNlY3Rpb25zCisjICBzZWN0aW9ucyA9PiAlZGVzY3Jpb250IGRlc2NyaXB0aW9ucworIyAgCisKK3N1YiBvdXRwdXRfaGlnaGxpZ2h0IHsKKyAgICBteSAkY29udGVudHMgPSBqb2luICJcbiIsQF87CisgICAgbXkgJGxpbmU7CisKKyMgICBERUJVRworIyAgIGlmICghZGVmaW5lZCAkY29udGVudHMpIHsKKyMJdXNlIENhcnA7CisjCWNvbmZlc3MgIm91dHB1dF9oaWdobGlnaHQgZ290IGNhbGxlZCB3aXRoIG5vIGFyZ3M/XG4iOworIyAgIH0KKworICAgIGV2YWwgJGRvaGlnaGxpZ2h0OworICAgIGRpZSAkQCBpZiAkQDsKKyAgICBmb3JlYWNoICRsaW5lIChzcGxpdCAiXG4iLCAkY29udGVudHMpIHsKKyAgICAgIGlmICgkbGluZSBlcSAiIil7CisJICAgIHByaW50ICRsaW5lcHJlZml4LCAkYmxhbmtsaW5lOworCX0gZWxzZSB7CisgICAgICAgICAgICAkbGluZSA9fiBzL1xcXFxcXC9cJi9nOworCSAgICBwcmludCAkbGluZXByZWZpeCwgJGxpbmU7CisJfQorCXByaW50ICJcbiI7CisgICAgfQorfQorCisjb3V0cHV0IHNlY3Rpb25zIGluIGh0bWwKK3N1YiBvdXRwdXRfc2VjdGlvbl9odG1sKCUpIHsKKyAgICBteSAlYXJncyA9ICV7JF9bMF19OworICAgIG15ICRzZWN0aW9uOworCisgICAgZm9yZWFjaCAkc2VjdGlvbiAoQHskYXJnc3snc2VjdGlvbmxpc3QnfX0pIHsKKwlwcmludCAiPGgzPiRzZWN0aW9uPC9oMz5cbiI7CisJcHJpbnQgIjxibG9ja3F1b3RlPlxuIjsKKwlvdXRwdXRfaGlnaGxpZ2h0KCRhcmdzeydzZWN0aW9ucyd9eyRzZWN0aW9ufSk7CisJcHJpbnQgIjwvYmxvY2txdW90ZT5cbiI7CisgICAgfSAgCit9CisKKyMgb3V0cHV0IGVudW0gaW4gaHRtbAorc3ViIG91dHB1dF9lbnVtX2h0bWwoJSkgeworICAgIG15ICVhcmdzID0gJXskX1swXX07CisgICAgbXkgKCRwYXJhbWV0ZXIpOworICAgIG15ICRjb3VudDsKKyAgICBwcmludCAiPGgyPmVudW0gIi4kYXJnc3snZW51bSd9LiI8L2gyPlxuIjsKKworICAgIHByaW50ICI8Yj5lbnVtICIuJGFyZ3N7J2VudW0nfS4iPC9iPiB7PGJyPlxuIjsKKyAgICAkY291bnQgPSAwOworICAgIGZvcmVhY2ggJHBhcmFtZXRlciAoQHskYXJnc3sncGFyYW1ldGVybGlzdCd9fSkgeworICAgICAgICBwcmludCAiIDxiPiIuJHBhcmFtZXRlci4iPC9iPiI7CisJaWYgKCRjb3VudCAhPSAkI3skYXJnc3sncGFyYW1ldGVybGlzdCd9fSkgeworCSAgICAkY291bnQrKzsKKwkgICAgcHJpbnQgIixcbiI7CisJfQorCXByaW50ICI8YnI+IjsKKyAgICB9CisgICAgcHJpbnQgIn07PGJyPlxuIjsKKworICAgIHByaW50ICI8aDM+Q29uc3RhbnRzPC9oMz5cbiI7CisgICAgcHJpbnQgIjxkbD5cbiI7CisgICAgZm9yZWFjaCAkcGFyYW1ldGVyIChAeyRhcmdzeydwYXJhbWV0ZXJsaXN0J319KSB7CisJcHJpbnQgIjxkdD48Yj4iLiRwYXJhbWV0ZXIuIjwvYj5cbiI7CisJcHJpbnQgIjxkZD4iOworCW91dHB1dF9oaWdobGlnaHQoJGFyZ3N7J3BhcmFtZXRlcmRlc2NzJ317JHBhcmFtZXRlcn0pOworICAgIH0KKyAgICBwcmludCAiPC9kbD5cbiI7CisgICAgb3V0cHV0X3NlY3Rpb25faHRtbChAXyk7CisgICAgcHJpbnQgIjxocj5cbiI7Cit9CisKKyMgb3V0cHV0IHR5ZXBkZWYgaW4gaHRtbAorc3ViIG91dHB1dF90eXBlZGVmX2h0bWwoJSkgeworICAgIG15ICVhcmdzID0gJXskX1swXX07CisgICAgbXkgKCRwYXJhbWV0ZXIpOworICAgIG15ICRjb3VudDsKKyAgICBwcmludCAiPGgyPnR5cGVkZWYgIi4kYXJnc3sndHlwZWRlZid9LiI8L2gyPlxuIjsKKworICAgIHByaW50ICI8Yj50eXBlZGVmICIuJGFyZ3N7J3R5cGVkZWYnfS4iPC9iPlxuIjsKKyAgICBvdXRwdXRfc2VjdGlvbl9odG1sKEBfKTsKKyAgICBwcmludCAiPGhyPlxuIjsKK30KKworIyBvdXRwdXQgc3RydWN0IGluIGh0bWwKK3N1YiBvdXRwdXRfc3RydWN0X2h0bWwoJSkgeworICAgIG15ICVhcmdzID0gJXskX1swXX07CisgICAgbXkgKCRwYXJhbWV0ZXIpOworCisgICAgcHJpbnQgIjxoMj4iLiRhcmdzeyd0eXBlJ30uIiAiLiRhcmdzeydzdHJ1Y3QnfS4iPC9oMj5cbiI7CisgICAgcHJpbnQgIjxiPiIuJGFyZ3N7J3R5cGUnfS4iICIuJGFyZ3N7J3N0cnVjdCd9LiI8L2I+IHs8YnI+XG4iOworICAgIGZvcmVhY2ggJHBhcmFtZXRlciAoQHskYXJnc3sncGFyYW1ldGVybGlzdCd9fSkgeworCWlmICgkcGFyYW1ldGVyID1+IC9eIy8pIHsKKwkJcHJpbnQgIiRwYXJhbWV0ZXI8YnI+XG4iOworCQluZXh0OworCX0KKwlteSAkcGFyYW1ldGVyX25hbWUgPSAkcGFyYW1ldGVyOworCSRwYXJhbWV0ZXJfbmFtZSA9fiBzL1xbLiovLzsKKworICAgICAgICAoJGFyZ3N7J3BhcmFtZXRlcmRlc2NzJ317JHBhcmFtZXRlcl9uYW1lfSBuZSAkdW5kZXNjcmliZWQpIHx8IG5leHQ7CisJJHR5cGUgPSAkYXJnc3sncGFyYW1ldGVydHlwZXMnfXskcGFyYW1ldGVyfTsKKwlpZiAoJHR5cGUgPX4gbS8oW15cKF0qXChcKilccypcKVxzKlwoKFteXCldKilcKS8pIHsKKwkgICAgIyBwb2ludGVyLXRvLWZ1bmN0aW9uCisJICAgIHByaW50ICIgPGk+JDE8L2k+PGI+JHBhcmFtZXRlcjwvYj4pIDxpPigkMik8L2k+Ozxicj5cbiI7CisJfSBlbHNpZiAoJHR5cGUgPX4gbS9eKC4qPylccyooOi4qKS8pIHsKKwkgICAgcHJpbnQgIiA8aT4kMTwvaT4gPGI+JHBhcmFtZXRlcjwvYj4kMjs8YnI+XG4iOworCX0gZWxzZSB7CisJICAgIHByaW50ICIgPGk+JHR5cGU8L2k+IDxiPiRwYXJhbWV0ZXI8L2I+Ozxicj5cbiI7CisJfQorICAgIH0KKyAgICBwcmludCAifTs8YnI+XG4iOworCisgICAgcHJpbnQgIjxoMz5NZW1iZXJzPC9oMz5cbiI7CisgICAgcHJpbnQgIjxkbD5cbiI7CisgICAgZm9yZWFjaCAkcGFyYW1ldGVyIChAeyRhcmdzeydwYXJhbWV0ZXJsaXN0J319KSB7CisJKCRwYXJhbWV0ZXIgPX4gL14jLykgJiYgbmV4dDsKKworCW15ICRwYXJhbWV0ZXJfbmFtZSA9ICRwYXJhbWV0ZXI7CisJJHBhcmFtZXRlcl9uYW1lID1+IHMvXFsuKi8vOworCisgICAgICAgICgkYXJnc3sncGFyYW1ldGVyZGVzY3MnfXskcGFyYW1ldGVyX25hbWV9IG5lICR1bmRlc2NyaWJlZCkgfHwgbmV4dDsKKwlwcmludCAiPGR0PjxiPiIuJHBhcmFtZXRlci4iPC9iPlxuIjsKKwlwcmludCAiPGRkPiI7CisJb3V0cHV0X2hpZ2hsaWdodCgkYXJnc3sncGFyYW1ldGVyZGVzY3MnfXskcGFyYW1ldGVyX25hbWV9KTsKKyAgICB9CisgICAgcHJpbnQgIjwvZGw+XG4iOworICAgIG91dHB1dF9zZWN0aW9uX2h0bWwoQF8pOworICAgIHByaW50ICI8aHI+XG4iOworfQorCisjIG91dHB1dCBmdW5jdGlvbiBpbiBodG1sCitzdWIgb3V0cHV0X2Z1bmN0aW9uX2h0bWwoJSkgeworICAgIG15ICVhcmdzID0gJXskX1swXX07CisgICAgbXkgKCRwYXJhbWV0ZXIsICRzZWN0aW9uKTsKKyAgICBteSAkY291bnQ7CisgICAgcHJpbnQgIjxoMj5GdW5jdGlvbjwvaDI+XG4iOworCisgICAgcHJpbnQgIjxpPiIuJGFyZ3N7J2Z1bmN0aW9udHlwZSd9LiI8L2k+XG4iOworICAgIHByaW50ICI8Yj4iLiRhcmdzeydmdW5jdGlvbid9LiI8L2I+XG4iOworICAgIHByaW50ICIoIjsKKyAgICAkY291bnQgPSAwOworICAgIGZvcmVhY2ggJHBhcmFtZXRlciAoQHskYXJnc3sncGFyYW1ldGVybGlzdCd9fSkgeworCSR0eXBlID0gJGFyZ3N7J3BhcmFtZXRlcnR5cGVzJ317JHBhcmFtZXRlcn07CisJaWYgKCR0eXBlID1+IG0vKFteXChdKlwoXCopXHMqXClccypcKChbXlwpXSopXCkvKSB7CisJICAgICMgcG9pbnRlci10by1mdW5jdGlvbgorCSAgICBwcmludCAiPGk+JDE8L2k+PGI+JHBhcmFtZXRlcjwvYj4pIDxpPigkMik8L2k+IjsKKwl9IGVsc2UgeworCSAgICBwcmludCAiPGk+Ii4kdHlwZS4iPC9pPiA8Yj4iLiRwYXJhbWV0ZXIuIjwvYj4iOworCX0KKwlpZiAoJGNvdW50ICE9ICQjeyRhcmdzeydwYXJhbWV0ZXJsaXN0J319KSB7CisJICAgICRjb3VudCsrOworCSAgICBwcmludCAiLFxuIjsKKwl9CisgICAgfQorICAgIHByaW50ICIpXG4iOworCisgICAgcHJpbnQgIjxoMz5Bcmd1bWVudHM8L2gzPlxuIjsKKyAgICBwcmludCAiPGRsPlxuIjsKKyAgICBmb3JlYWNoICRwYXJhbWV0ZXIgKEB7JGFyZ3N7J3BhcmFtZXRlcmxpc3QnfX0pIHsKKwlteSAkcGFyYW1ldGVyX25hbWUgPSAkcGFyYW1ldGVyOworCSRwYXJhbWV0ZXJfbmFtZSA9fiBzL1xbLiovLzsKKworICAgICAgICAoJGFyZ3N7J3BhcmFtZXRlcmRlc2NzJ317JHBhcmFtZXRlcl9uYW1lfSBuZSAkdW5kZXNjcmliZWQpIHx8IG5leHQ7CisJcHJpbnQgIjxkdD48Yj4iLiRwYXJhbWV0ZXIuIjwvYj5cbiI7CisJcHJpbnQgIjxkZD4iOworCW91dHB1dF9oaWdobGlnaHQoJGFyZ3N7J3BhcmFtZXRlcmRlc2NzJ317JHBhcmFtZXRlcl9uYW1lfSk7CisgICAgfQorICAgIHByaW50ICI8L2RsPlxuIjsKKyAgICBvdXRwdXRfc2VjdGlvbl9odG1sKEBfKTsKKyAgICBwcmludCAiPGhyPlxuIjsKK30KKworIyBvdXRwdXQgaW50cm8gaW4gaHRtbAorc3ViIG91dHB1dF9pbnRyb19odG1sKCUpIHsKKyAgICBteSAlYXJncyA9ICV7JF9bMF19OworICAgIG15ICgkcGFyYW1ldGVyLCAkc2VjdGlvbik7CisgICAgbXkgJGNvdW50OworCisgICAgZm9yZWFjaCAkc2VjdGlvbiAoQHskYXJnc3snc2VjdGlvbmxpc3QnfX0pIHsKKwlwcmludCAiPGgzPiRzZWN0aW9uPC9oMz5cbiI7CisJcHJpbnQgIjx1bD5cbiI7CisJb3V0cHV0X2hpZ2hsaWdodCgkYXJnc3snc2VjdGlvbnMnfXskc2VjdGlvbn0pOworCXByaW50ICI8L3VsPlxuIjsKKyAgICB9CisgICAgcHJpbnQgIjxocj5cbiI7Cit9CisKK3N1YiBvdXRwdXRfc2VjdGlvbl94bWwoJSkgeworICAgIG15ICVhcmdzID0gJXskX1swXX07CisgICAgbXkgJHNlY3Rpb247ICAgIAorICAgICMgcHJpbnQgb3V0IGVhY2ggc2VjdGlvbgorICAgICRsaW5lcHJlZml4PSIgICAiOworICAgIGZvcmVhY2ggJHNlY3Rpb24gKEB7JGFyZ3N7J3NlY3Rpb25saXN0J319KSB7CisJcHJpbnQgIjxyZWZzZWN0MT5cbiA8dGl0bGU+JHNlY3Rpb248L3RpdGxlPlxuIDxwYXJhPlxuIjsKKwlpZiAoJHNlY3Rpb24gPX4gbS9FWEFNUExFL2kpIHsKKwkgICAgcHJpbnQgIjxleGFtcGxlPjxwYXJhPlxuIjsKKwl9CisJb3V0cHV0X2hpZ2hsaWdodCgkYXJnc3snc2VjdGlvbnMnfXskc2VjdGlvbn0pOworCWlmICgkc2VjdGlvbiA9fiBtL0VYQU1QTEUvaSkgeworCSAgICBwcmludCAiPC9wYXJhPjwvZXhhbXBsZT5cbiI7CisJfQorCXByaW50ICIgPC9wYXJhPlxuPC9yZWZzZWN0MT5cbiI7CisgICAgfQorfQorCisjIG91dHB1dCBmdW5jdGlvbiBpbiBYTUwgRG9jQm9vaworc3ViIG91dHB1dF9mdW5jdGlvbl94bWwoJSkgeworICAgIG15ICVhcmdzID0gJXskX1swXX07CisgICAgbXkgKCRwYXJhbWV0ZXIsICRzZWN0aW9uKTsKKyAgICBteSAkY291bnQ7CisgICAgbXkgJGlkOworCisgICAgJGlkID0gIkFQSS0iLiRhcmdzeydmdW5jdGlvbid9OworICAgICRpZCA9fiBzL1teQS1aYS16MC05XS8tL2c7CisKKyAgICBwcmludCAiPHJlZmVudHJ5PlxuIjsKKyAgICBwcmludCAiPHJlZm1ldGE+XG4iOworICAgIHByaW50ICI8cmVmZW50cnl0aXRsZT48cGhyYXNlIGlkPVwiJGlkXCI+Ii4kYXJnc3snZnVuY3Rpb24nfS4iPC9waHJhc2U+PC9yZWZlbnRyeXRpdGxlPlxuIjsKKyAgICBwcmludCAiPC9yZWZtZXRhPlxuIjsKKyAgICBwcmludCAiPHJlZm5hbWVkaXY+XG4iOworICAgIHByaW50ICIgPHJlZm5hbWU+Ii4kYXJnc3snZnVuY3Rpb24nfS4iPC9yZWZuYW1lPlxuIjsKKyAgICBwcmludCAiIDxyZWZwdXJwb3NlPlxuIjsKKyAgICBwcmludCAiICAiOworICAgIG91dHB1dF9oaWdobGlnaHQgKCRhcmdzeydwdXJwb3NlJ30pOworICAgIHByaW50ICIgPC9yZWZwdXJwb3NlPlxuIjsKKyAgICBwcmludCAiPC9yZWZuYW1lZGl2PlxuIjsKKworICAgIHByaW50ICI8cmVmc3lub3BzaXNkaXY+XG4iOworICAgIHByaW50ICIgPHRpdGxlPlN5bm9wc2lzPC90aXRsZT5cbiI7CisgICAgcHJpbnQgIiAgPGZ1bmNzeW5vcHNpcz48ZnVuY3Byb3RvdHlwZT5cbiI7CisgICAgcHJpbnQgIiAgIDxmdW5jZGVmPiIuJGFyZ3N7J2Z1bmN0aW9udHlwZSd9LiIgIjsKKyAgICBwcmludCAiPGZ1bmN0aW9uPiIuJGFyZ3N7J2Z1bmN0aW9uJ30uIiA8L2Z1bmN0aW9uPjwvZnVuY2RlZj5cbiI7CisKKyAgICAkY291bnQgPSAwOworICAgIGlmICgkI3skYXJnc3sncGFyYW1ldGVybGlzdCd9fSA+PSAwKSB7CisJZm9yZWFjaCAkcGFyYW1ldGVyIChAeyRhcmdzeydwYXJhbWV0ZXJsaXN0J319KSB7CisJICAgICR0eXBlID0gJGFyZ3N7J3BhcmFtZXRlcnR5cGVzJ317JHBhcmFtZXRlcn07CisJICAgIGlmICgkdHlwZSA9fiBtLyhbXlwoXSpcKFwqKVxzKlwpXHMqXCgoW15cKV0qKVwpLykgeworCQkjIHBvaW50ZXItdG8tZnVuY3Rpb24KKwkJcHJpbnQgIiAgIDxwYXJhbWRlZj4kMTxwYXJhbWV0ZXI+JHBhcmFtZXRlcjwvcGFyYW1ldGVyPilcbiI7CisJCXByaW50ICIgICAgIDxmdW5jcGFyYW1zPiQyPC9mdW5jcGFyYW1zPjwvcGFyYW1kZWY+XG4iOworCSAgICB9IGVsc2UgeworCQlwcmludCAiICAgPHBhcmFtZGVmPiIuJHR5cGU7CisJCXByaW50ICIgPHBhcmFtZXRlcj4kcGFyYW1ldGVyPC9wYXJhbWV0ZXI+PC9wYXJhbWRlZj5cbiI7CisJICAgIH0KKwl9CisgICAgfSBlbHNlIHsKKwlwcmludCAiICA8dm9pZD5cbiI7CisgICAgfQorICAgIHByaW50ICIgIDwvZnVuY3Byb3RvdHlwZT48L2Z1bmNzeW5vcHNpcz5cbiI7CisgICAgcHJpbnQgIjwvcmVmc3lub3BzaXNkaXY+XG4iOworCisgICAgIyBwcmludCBwYXJhbWV0ZXJzCisgICAgcHJpbnQgIjxyZWZzZWN0MT5cbiA8dGl0bGU+QXJndW1lbnRzPC90aXRsZT5cbiI7CisgICAgaWYgKCQjeyRhcmdzeydwYXJhbWV0ZXJsaXN0J319ID49IDApIHsKKwlwcmludCAiIDx2YXJpYWJsZWxpc3Q+XG4iOworCWZvcmVhY2ggJHBhcmFtZXRlciAoQHskYXJnc3sncGFyYW1ldGVybGlzdCd9fSkgeworCSAgICBteSAkcGFyYW1ldGVyX25hbWUgPSAkcGFyYW1ldGVyOworCSAgICAkcGFyYW1ldGVyX25hbWUgPX4gcy9cWy4qLy87CisKKwkgICAgcHJpbnQgIiAgPHZhcmxpc3RlbnRyeT5cbiAgIDx0ZXJtPjxwYXJhbWV0ZXI+JHBhcmFtZXRlcjwvcGFyYW1ldGVyPjwvdGVybT5cbiI7CisJICAgIHByaW50ICIgICA8bGlzdGl0ZW0+XG4gICAgPHBhcmE+XG4iOworCSAgICAkbGluZXByZWZpeD0iICAgICAiOworCSAgICBvdXRwdXRfaGlnaGxpZ2h0KCRhcmdzeydwYXJhbWV0ZXJkZXNjcyd9eyRwYXJhbWV0ZXJfbmFtZX0pOworCSAgICBwcmludCAiICAgIDwvcGFyYT5cbiAgIDwvbGlzdGl0ZW0+XG4gIDwvdmFybGlzdGVudHJ5PlxuIjsKKwl9CisJcHJpbnQgIiA8L3ZhcmlhYmxlbGlzdD5cbiI7CisgICAgfSBlbHNlIHsKKwlwcmludCAiIDxwYXJhPlxuICBOb25lXG4gPC9wYXJhPlxuIjsKKyAgICB9CisgICAgcHJpbnQgIjwvcmVmc2VjdDE+XG4iOworCisgICAgb3V0cHV0X3NlY3Rpb25feG1sKEBfKTsKKyAgICBwcmludCAiPC9yZWZlbnRyeT5cblxuIjsKK30KKworIyBvdXRwdXQgc3RydWN0IGluIFhNTCBEb2NCb29rCitzdWIgb3V0cHV0X3N0cnVjdF94bWwoJSkgeworICAgIG15ICVhcmdzID0gJXskX1swXX07CisgICAgbXkgKCRwYXJhbWV0ZXIsICRzZWN0aW9uKTsKKyAgICBteSAkaWQ7CisKKyAgICAkaWQgPSAiQVBJLXN0cnVjdC0iLiRhcmdzeydzdHJ1Y3QnfTsKKyAgICAkaWQgPX4gcy9bXkEtWmEtejAtOV0vLS9nOworCisgICAgcHJpbnQgIjxyZWZlbnRyeT5cbiI7CisgICAgcHJpbnQgIjxyZWZtZXRhPlxuIjsKKyAgICBwcmludCAiPHJlZmVudHJ5dGl0bGU+PHBocmFzZSBpZD1cIiRpZFwiPiIuJGFyZ3N7J3R5cGUnfS4iICIuJGFyZ3N7J3N0cnVjdCd9LiI8L3BocmFzZT48L3JlZmVudHJ5dGl0bGU+XG4iOworICAgIHByaW50ICI8L3JlZm1ldGE+XG4iOworICAgIHByaW50ICI8cmVmbmFtZWRpdj5cbiI7CisgICAgcHJpbnQgIiA8cmVmbmFtZT4iLiRhcmdzeyd0eXBlJ30uIiAiLiRhcmdzeydzdHJ1Y3QnfS4iPC9yZWZuYW1lPlxuIjsKKyAgICBwcmludCAiIDxyZWZwdXJwb3NlPlxuIjsKKyAgICBwcmludCAiICAiOworICAgIG91dHB1dF9oaWdobGlnaHQgKCRhcmdzeydwdXJwb3NlJ30pOworICAgIHByaW50ICIgPC9yZWZwdXJwb3NlPlxuIjsKKyAgICBwcmludCAiPC9yZWZuYW1lZGl2PlxuIjsKKworICAgIHByaW50ICI8cmVmc3lub3BzaXNkaXY+XG4iOworICAgIHByaW50ICIgPHRpdGxlPlN5bm9wc2lzPC90aXRsZT5cbiI7CisgICAgcHJpbnQgIiAgPHByb2dyYW1saXN0aW5nPlxuIjsKKyAgICBwcmludCAkYXJnc3sndHlwZSd9LiIgIi4kYXJnc3snc3RydWN0J30uIiB7XG4iOworICAgIGZvcmVhY2ggJHBhcmFtZXRlciAoQHskYXJnc3sncGFyYW1ldGVybGlzdCd9fSkgeworCWlmICgkcGFyYW1ldGVyID1+IC9eIy8pIHsKKwkgICAgcHJpbnQgIiRwYXJhbWV0ZXJcbiI7CisJICAgIG5leHQ7CisJfQorCisJbXkgJHBhcmFtZXRlcl9uYW1lID0gJHBhcmFtZXRlcjsKKwkkcGFyYW1ldGVyX25hbWUgPX4gcy9cWy4qLy87CisKKwlkZWZpbmVkKCRhcmdzeydwYXJhbWV0ZXJkZXNjcyd9eyRwYXJhbWV0ZXJfbmFtZX0pIHx8IG5leHQ7CisgICAgICAgICgkYXJnc3sncGFyYW1ldGVyZGVzY3MnfXskcGFyYW1ldGVyX25hbWV9IG5lICR1bmRlc2NyaWJlZCkgfHwgbmV4dDsKKwkkdHlwZSA9ICRhcmdzeydwYXJhbWV0ZXJ0eXBlcyd9eyRwYXJhbWV0ZXJ9OworCWlmICgkdHlwZSA9fiBtLyhbXlwoXSpcKFwqKVxzKlwpXHMqXCgoW15cKV0qKVwpLykgeworCSAgICAjIHBvaW50ZXItdG8tZnVuY3Rpb24KKwkgICAgcHJpbnQgIiAgJDEgJHBhcmFtZXRlcikgKCQyKTtcbiI7CisJfSBlbHNpZiAoJHR5cGUgPX4gbS9eKC4qPylccyooOi4qKS8pIHsKKwkgICAgcHJpbnQgIiAgJDEgJHBhcmFtZXRlciQyO1xuIjsKKwl9IGVsc2UgeworCSAgICBwcmludCAiICAiLiR0eXBlLiIgIi4kcGFyYW1ldGVyLiI7XG4iOworCX0KKyAgICB9CisgICAgcHJpbnQgIn07IjsKKyAgICBwcmludCAiICA8L3Byb2dyYW1saXN0aW5nPlxuIjsKKyAgICBwcmludCAiPC9yZWZzeW5vcHNpc2Rpdj5cbiI7CisKKyAgICBwcmludCAiIDxyZWZzZWN0MT5cbiI7CisgICAgcHJpbnQgIiAgPHRpdGxlPk1lbWJlcnM8L3RpdGxlPlxuIjsKKworICAgIHByaW50ICIgIDx2YXJpYWJsZWxpc3Q+XG4iOworICAgIGZvcmVhY2ggJHBhcmFtZXRlciAoQHskYXJnc3sncGFyYW1ldGVybGlzdCd9fSkgeworICAgICAgKCRwYXJhbWV0ZXIgPX4gL14jLykgJiYgbmV4dDsKKworICAgICAgbXkgJHBhcmFtZXRlcl9uYW1lID0gJHBhcmFtZXRlcjsKKyAgICAgICRwYXJhbWV0ZXJfbmFtZSA9fiBzL1xbLiovLzsKKworICAgICAgZGVmaW5lZCgkYXJnc3sncGFyYW1ldGVyZGVzY3MnfXskcGFyYW1ldGVyX25hbWV9KSB8fCBuZXh0OworICAgICAgKCRhcmdzeydwYXJhbWV0ZXJkZXNjcyd9eyRwYXJhbWV0ZXJfbmFtZX0gbmUgJHVuZGVzY3JpYmVkKSB8fCBuZXh0OworICAgICAgcHJpbnQgIiAgICA8dmFybGlzdGVudHJ5PiI7CisgICAgICBwcmludCAiICAgICAgPHRlcm0+JHBhcmFtZXRlcjwvdGVybT5cbiI7CisgICAgICBwcmludCAiICAgICAgPGxpc3RpdGVtPjxwYXJhPlxuIjsKKyAgICAgIG91dHB1dF9oaWdobGlnaHQoJGFyZ3N7J3BhcmFtZXRlcmRlc2NzJ317JHBhcmFtZXRlcl9uYW1lfSk7CisgICAgICBwcmludCAiICAgICAgPC9wYXJhPjwvbGlzdGl0ZW0+XG4iOworICAgICAgcHJpbnQgIiAgICA8L3Zhcmxpc3RlbnRyeT5cbiI7CisgICAgfQorICAgIHByaW50ICIgIDwvdmFyaWFibGVsaXN0PlxuIjsKKyAgICBwcmludCAiIDwvcmVmc2VjdDE+XG4iOworCisgICAgb3V0cHV0X3NlY3Rpb25feG1sKEBfKTsKKworICAgIHByaW50ICI8L3JlZmVudHJ5PlxuXG4iOworfQorCisjIG91dHB1dCBlbnVtIGluIFhNTCBEb2NCb29rCitzdWIgb3V0cHV0X2VudW1feG1sKCUpIHsKKyAgICBteSAlYXJncyA9ICV7JF9bMF19OworICAgIG15ICgkcGFyYW1ldGVyLCAkc2VjdGlvbik7CisgICAgbXkgJGNvdW50OworICAgIG15ICRpZDsKKworICAgICRpZCA9ICJBUEktZW51bS0iLiRhcmdzeydlbnVtJ307CisgICAgJGlkID1+IHMvW15BLVphLXowLTldLy0vZzsKKworICAgIHByaW50ICI8cmVmZW50cnk+XG4iOworICAgIHByaW50ICI8cmVmbWV0YT5cbiI7CisgICAgcHJpbnQgIjxyZWZlbnRyeXRpdGxlPjxwaHJhc2UgaWQ9XCIkaWRcIj5lbnVtICIuJGFyZ3N7J2VudW0nfS4iPC9waHJhc2U+PC9yZWZlbnRyeXRpdGxlPlxuIjsKKyAgICBwcmludCAiPC9yZWZtZXRhPlxuIjsKKyAgICBwcmludCAiPHJlZm5hbWVkaXY+XG4iOworICAgIHByaW50ICIgPHJlZm5hbWU+ZW51bSAiLiRhcmdzeydlbnVtJ30uIjwvcmVmbmFtZT5cbiI7CisgICAgcHJpbnQgIiA8cmVmcHVycG9zZT5cbiI7CisgICAgcHJpbnQgIiAgIjsKKyAgICBvdXRwdXRfaGlnaGxpZ2h0ICgkYXJnc3sncHVycG9zZSd9KTsKKyAgICBwcmludCAiIDwvcmVmcHVycG9zZT5cbiI7CisgICAgcHJpbnQgIjwvcmVmbmFtZWRpdj5cbiI7CisKKyAgICBwcmludCAiPHJlZnN5bm9wc2lzZGl2PlxuIjsKKyAgICBwcmludCAiIDx0aXRsZT5TeW5vcHNpczwvdGl0bGU+XG4iOworICAgIHByaW50ICIgIDxwcm9ncmFtbGlzdGluZz5cbiI7CisgICAgcHJpbnQgImVudW0gIi4kYXJnc3snZW51bSd9LiIge1xuIjsKKyAgICAkY291bnQgPSAwOworICAgIGZvcmVhY2ggJHBhcmFtZXRlciAoQHskYXJnc3sncGFyYW1ldGVybGlzdCd9fSkgeworICAgICAgICBwcmludCAiICAkcGFyYW1ldGVyIjsKKyAgICAgICAgaWYgKCRjb3VudCAhPSAkI3skYXJnc3sncGFyYW1ldGVybGlzdCd9fSkgeworCSAgICAkY291bnQrKzsKKwkgICAgcHJpbnQgIiwiOworICAgICAgICB9CisJcHJpbnQgIlxuIjsKKyAgICB9CisgICAgcHJpbnQgIn07IjsKKyAgICBwcmludCAiICA8L3Byb2dyYW1saXN0aW5nPlxuIjsKKyAgICBwcmludCAiPC9yZWZzeW5vcHNpc2Rpdj5cbiI7CisKKyAgICBwcmludCAiPHJlZnNlY3QxPlxuIjsKKyAgICBwcmludCAiIDx0aXRsZT5Db25zdGFudHM8L3RpdGxlPlxuIjsgICAgCisgICAgcHJpbnQgIiAgPHZhcmlhYmxlbGlzdD5cbiI7CisgICAgZm9yZWFjaCAkcGFyYW1ldGVyIChAeyRhcmdzeydwYXJhbWV0ZXJsaXN0J319KSB7CisgICAgICBteSAkcGFyYW1ldGVyX25hbWUgPSAkcGFyYW1ldGVyOworICAgICAgJHBhcmFtZXRlcl9uYW1lID1+IHMvXFsuKi8vOworCisgICAgICBwcmludCAiICAgIDx2YXJsaXN0ZW50cnk+IjsKKyAgICAgIHByaW50ICIgICAgICA8dGVybT4kcGFyYW1ldGVyPC90ZXJtPlxuIjsKKyAgICAgIHByaW50ICIgICAgICA8bGlzdGl0ZW0+PHBhcmE+XG4iOworICAgICAgb3V0cHV0X2hpZ2hsaWdodCgkYXJnc3sncGFyYW1ldGVyZGVzY3MnfXskcGFyYW1ldGVyX25hbWV9KTsKKyAgICAgIHByaW50ICIgICAgICA8L3BhcmE+PC9saXN0aXRlbT5cbiI7CisgICAgICBwcmludCAiICAgIDwvdmFybGlzdGVudHJ5PlxuIjsKKyAgICB9CisgICAgcHJpbnQgIiAgPC92YXJpYWJsZWxpc3Q+XG4iOworICAgIHByaW50ICI8L3JlZnNlY3QxPlxuIjsKKworICAgIG91dHB1dF9zZWN0aW9uX3htbChAXyk7CisKKyAgICBwcmludCAiPC9yZWZlbnRyeT5cblxuIjsKK30KKworIyBvdXRwdXQgdHlwZWRlZiBpbiBYTUwgRG9jQm9vaworc3ViIG91dHB1dF90eXBlZGVmX3htbCglKSB7CisgICAgbXkgJWFyZ3MgPSAleyRfWzBdfTsKKyAgICBteSAoJHBhcmFtZXRlciwgJHNlY3Rpb24pOworICAgIG15ICRpZDsKKworICAgICRpZCA9ICJBUEktdHlwZWRlZi0iLiRhcmdzeyd0eXBlZGVmJ307CisgICAgJGlkID1+IHMvW15BLVphLXowLTldLy0vZzsKKworICAgIHByaW50ICI8cmVmZW50cnk+XG4iOworICAgIHByaW50ICI8cmVmbWV0YT5cbiI7CisgICAgcHJpbnQgIjxyZWZlbnRyeXRpdGxlPjxwaHJhc2UgaWQ9XCIkaWRcIj50eXBlZGVmICIuJGFyZ3N7J3R5cGVkZWYnfS4iPC9waHJhc2U+PC9yZWZlbnRyeXRpdGxlPlxuIjsKKyAgICBwcmludCAiPC9yZWZtZXRhPlxuIjsKKyAgICBwcmludCAiPHJlZm5hbWVkaXY+XG4iOworICAgIHByaW50ICIgPHJlZm5hbWU+dHlwZWRlZiAiLiRhcmdzeyd0eXBlZGVmJ30uIjwvcmVmbmFtZT5cbiI7CisgICAgcHJpbnQgIiA8cmVmcHVycG9zZT5cbiI7CisgICAgcHJpbnQgIiAgIjsKKyAgICBvdXRwdXRfaGlnaGxpZ2h0ICgkYXJnc3sncHVycG9zZSd9KTsKKyAgICBwcmludCAiIDwvcmVmcHVycG9zZT5cbiI7CisgICAgcHJpbnQgIjwvcmVmbmFtZWRpdj5cbiI7CisKKyAgICBwcmludCAiPHJlZnN5bm9wc2lzZGl2PlxuIjsKKyAgICBwcmludCAiIDx0aXRsZT5TeW5vcHNpczwvdGl0bGU+XG4iOworICAgIHByaW50ICIgIDxzeW5vcHNpcz50eXBlZGVmICIuJGFyZ3N7J3R5cGVkZWYnfS4iOzwvc3lub3BzaXM+XG4iOworICAgIHByaW50ICI8L3JlZnN5bm9wc2lzZGl2PlxuIjsKKworICAgIG91dHB1dF9zZWN0aW9uX3htbChAXyk7CisKKyAgICBwcmludCAiPC9yZWZlbnRyeT5cblxuIjsKK30KKworIyBvdXRwdXQgaW4gWE1MIERvY0Jvb2sKK3N1YiBvdXRwdXRfaW50cm9feG1sKCUpIHsKKyAgICBteSAlYXJncyA9ICV7JF9bMF19OworICAgIG15ICgkcGFyYW1ldGVyLCAkc2VjdGlvbik7CisgICAgbXkgJGNvdW50OworCisgICAgbXkgJGlkID0gJGFyZ3N7J21vZHVsZSd9OworICAgICRpZCA9fiBzL1teQS1aYS16MC05XS8tL2c7CisKKyAgICAjIHByaW50IG91dCBlYWNoIHNlY3Rpb24KKyAgICAkbGluZXByZWZpeD0iICAgIjsKKyAgICBmb3JlYWNoICRzZWN0aW9uIChAeyRhcmdzeydzZWN0aW9ubGlzdCd9fSkgeworCXByaW50ICI8cmVmc2VjdDE+XG4gPHRpdGxlPiRzZWN0aW9uPC90aXRsZT5cbiA8cGFyYT5cbiI7CisJaWYgKCRzZWN0aW9uID1+IG0vRVhBTVBMRS9pKSB7CisJICAgIHByaW50ICI8ZXhhbXBsZT48cGFyYT5cbiI7CisJfQorCW91dHB1dF9oaWdobGlnaHQoJGFyZ3N7J3NlY3Rpb25zJ317JHNlY3Rpb259KTsKKwlpZiAoJHNlY3Rpb24gPX4gbS9FWEFNUExFL2kpIHsKKwkgICAgcHJpbnQgIjwvcGFyYT48L2V4YW1wbGU+XG4iOworCX0KKwlwcmludCAiIDwvcGFyYT5cbjwvcmVmc2VjdDE+XG4iOworICAgIH0KKworICAgIHByaW50ICJcblxuIjsKK30KKworIyBvdXRwdXQgaW4gWE1MIERvY0Jvb2sKK3N1YiBvdXRwdXRfZnVuY3Rpb25fZ25vbWUgeworICAgIG15ICVhcmdzID0gJXskX1swXX07CisgICAgbXkgKCRwYXJhbWV0ZXIsICRzZWN0aW9uKTsKKyAgICBteSAkY291bnQ7CisgICAgbXkgJGlkOworCisgICAgJGlkID0gJGFyZ3N7J21vZHVsZSd9LiItIi4kYXJnc3snZnVuY3Rpb24nfTsKKyAgICAkaWQgPX4gcy9bXkEtWmEtejAtOV0vLS9nOworCisgICAgcHJpbnQgIjxzZWN0Mj5cbiI7CisgICAgcHJpbnQgIiA8dGl0bGUgaWQ9XCIkaWRcIj4iLiRhcmdzeydmdW5jdGlvbid9LiI8L3RpdGxlPlxuIjsKKworICAgIHByaW50ICIgIDxmdW5jc3lub3BzaXM+XG4iOworICAgIHByaW50ICIgICA8ZnVuY2RlZj4iLiRhcmdzeydmdW5jdGlvbnR5cGUnfS4iICI7CisgICAgcHJpbnQgIjxmdW5jdGlvbj4iLiRhcmdzeydmdW5jdGlvbid9LiIgIjsKKyAgICBwcmludCAiPC9mdW5jdGlvbj48L2Z1bmNkZWY+XG4iOworCisgICAgJGNvdW50ID0gMDsKKyAgICBpZiAoJCN7JGFyZ3N7J3BhcmFtZXRlcmxpc3QnfX0gPj0gMCkgeworCWZvcmVhY2ggJHBhcmFtZXRlciAoQHskYXJnc3sncGFyYW1ldGVybGlzdCd9fSkgeworCSAgICAkdHlwZSA9ICRhcmdzeydwYXJhbWV0ZXJ0eXBlcyd9eyRwYXJhbWV0ZXJ9OworCSAgICBpZiAoJHR5cGUgPX4gbS8oW15cKF0qXChcKilccypcKVxzKlwoKFteXCldKilcKS8pIHsKKwkJIyBwb2ludGVyLXRvLWZ1bmN0aW9uCisJCXByaW50ICIgICA8cGFyYW1kZWY+JDEgPHBhcmFtZXRlcj4kcGFyYW1ldGVyPC9wYXJhbWV0ZXI+KVxuIjsKKwkJcHJpbnQgIiAgICAgPGZ1bmNwYXJhbXM+JDI8L2Z1bmNwYXJhbXM+PC9wYXJhbWRlZj5cbiI7CisJICAgIH0gZWxzZSB7CisJCXByaW50ICIgICA8cGFyYW1kZWY+Ii4kdHlwZTsKKwkJcHJpbnQgIiA8cGFyYW1ldGVyPiRwYXJhbWV0ZXI8L3BhcmFtZXRlcj48L3BhcmFtZGVmPlxuIjsKKwkgICAgfQorCX0KKyAgICB9IGVsc2UgeworCXByaW50ICIgIDx2b2lkPlxuIjsKKyAgICB9CisgICAgcHJpbnQgIiAgPC9mdW5jc3lub3BzaXM+XG4iOworICAgIGlmICgkI3skYXJnc3sncGFyYW1ldGVybGlzdCd9fSA+PSAwKSB7CisJcHJpbnQgIiA8aW5mb3JtYWx0YWJsZSBwZ3dpZGU9XCIxXCIgZnJhbWU9XCJub25lXCIgcm9sZT1cInBhcmFtc1wiPlxuIjsKKwlwcmludCAiPHRncm91cCBjb2xzPVwiMlwiPlxuIjsKKwlwcmludCAiPGNvbHNwZWMgY29sd2lkdGg9XCIyKlwiPlxuIjsKKwlwcmludCAiPGNvbHNwZWMgY29sd2lkdGg9XCI4KlwiPlxuIjsKKwlwcmludCAiPHRib2R5PlxuIjsKKwlmb3JlYWNoICRwYXJhbWV0ZXIgKEB7JGFyZ3N7J3BhcmFtZXRlcmxpc3QnfX0pIHsKKwkgICAgbXkgJHBhcmFtZXRlcl9uYW1lID0gJHBhcmFtZXRlcjsKKwkgICAgJHBhcmFtZXRlcl9uYW1lID1+IHMvXFsuKi8vOworCisJICAgIHByaW50ICIgIDxyb3c+PGVudHJ5IGFsaWduPVwicmlnaHRcIj48cGFyYW1ldGVyPiRwYXJhbWV0ZXI8L3BhcmFtZXRlcj48L2VudHJ5PlxuIjsKKwkgICAgcHJpbnQgIiAgIDxlbnRyeT5cbiI7CisJICAgICRsaW5lcHJlZml4PSIgICAgICI7CisJICAgIG91dHB1dF9oaWdobGlnaHQoJGFyZ3N7J3BhcmFtZXRlcmRlc2NzJ317JHBhcmFtZXRlcl9uYW1lfSk7CisJICAgIHByaW50ICIgICAgPC9lbnRyeT48L3Jvdz5cbiI7CisJfQorCXByaW50ICIgPC90Ym9keT48L3Rncm91cD48L2luZm9ybWFsdGFibGU+XG4iOworICAgIH0gZWxzZSB7CisJcHJpbnQgIiA8cGFyYT5cbiAgTm9uZVxuIDwvcGFyYT5cbiI7CisgICAgfQorCisgICAgIyBwcmludCBvdXQgZWFjaCBzZWN0aW9uCisgICAgJGxpbmVwcmVmaXg9IiAgICI7CisgICAgZm9yZWFjaCAkc2VjdGlvbiAoQHskYXJnc3snc2VjdGlvbmxpc3QnfX0pIHsKKwlwcmludCAiPHNpbXBsZXNlY3Q+XG4gPHRpdGxlPiRzZWN0aW9uPC90aXRsZT5cbiI7CisJaWYgKCRzZWN0aW9uID1+IG0vRVhBTVBMRS9pKSB7CisJICAgIHByaW50ICI8ZXhhbXBsZT48cHJvZ3JhbWxpc3Rpbmc+XG4iOworCX0gZWxzZSB7CisJfQorCXByaW50ICI8cGFyYT5cbiI7CisJb3V0cHV0X2hpZ2hsaWdodCgkYXJnc3snc2VjdGlvbnMnfXskc2VjdGlvbn0pOworCXByaW50ICI8L3BhcmE+XG4iOworCWlmICgkc2VjdGlvbiA9fiBtL0VYQU1QTEUvaSkgeworCSAgICBwcmludCAiPC9wcm9ncmFtbGlzdGluZz48L2V4YW1wbGU+XG4iOworCX0gZWxzZSB7CisJfQorCXByaW50ICIgPC9zaW1wbGVzZWN0PlxuIjsKKyAgICB9CisKKyAgICBwcmludCAiPC9zZWN0Mj5cblxuIjsKK30KKworIyMKKyMgb3V0cHV0IGZ1bmN0aW9uIGluIG1hbgorc3ViIG91dHB1dF9mdW5jdGlvbl9tYW4oJSkgeworICAgIG15ICVhcmdzID0gJXskX1swXX07CisgICAgbXkgKCRwYXJhbWV0ZXIsICRzZWN0aW9uKTsKKyAgICBteSAkY291bnQ7CisKKyAgICBwcmludCAiLlRIIFwiJGFyZ3N7J2Z1bmN0aW9uJ31cIiA5IFwiJGFyZ3N7J2Z1bmN0aW9uJ31cIiBcIiRtYW5fZGF0ZVwiIFwiS2VybmVsIEhhY2tlcidzIE1hbnVhbFwiIExJTlVYXG4iOworCisgICAgcHJpbnQgIi5TSCBOQU1FXG4iOworICAgIHByaW50ICRhcmdzeydmdW5jdGlvbid9LiIgXFwtICIuJGFyZ3N7J3B1cnBvc2UnfS4iXG4iOworCisgICAgcHJpbnQgIi5TSCBTWU5PUFNJU1xuIjsKKyAgICBwcmludCAiLkIgXCIiLiRhcmdzeydmdW5jdGlvbnR5cGUnfS4iXCIgIi4kYXJnc3snZnVuY3Rpb24nfS4iXG4iOworICAgICRjb3VudCA9IDA7CisgICAgbXkgJHBhcmVudGggPSAiKCI7CisgICAgbXkgJHBvc3QgPSAiLCI7CisgICAgZm9yZWFjaCBteSAkcGFyYW1ldGVyIChAeyRhcmdzeydwYXJhbWV0ZXJsaXN0J319KSB7CisJaWYgKCRjb3VudCA9PSAkI3skYXJnc3sncGFyYW1ldGVybGlzdCd9fSkgeworCSAgICAkcG9zdCA9ICIpOyI7CisJfQorCSR0eXBlID0gJGFyZ3N7J3BhcmFtZXRlcnR5cGVzJ317JHBhcmFtZXRlcn07CisJaWYgKCR0eXBlID1+IG0vKFteXChdKlwoXCopXHMqXClccypcKChbXlwpXSopXCkvKSB7CisJICAgICMgcG9pbnRlci10by1mdW5jdGlvbgorCSAgICBwcmludCAiLkJJIFwiIi4kcGFyZW50aC4kMS4iXCIgIi4kcGFyYW1ldGVyLiIgXCIpICgiLiQyLiIpIi4kcG9zdC4iXCJcbiI7CisJfSBlbHNlIHsKKwkgICAgJHR5cGUgPX4gcy8oW15cKl0pJC8kMSAvOworCSAgICBwcmludCAiLkJJIFwiIi4kcGFyZW50aC4kdHlwZS4iXCIgIi4kcGFyYW1ldGVyLiIgXCIiLiRwb3N0LiJcIlxuIjsKKwl9CisJJGNvdW50Kys7CisJJHBhcmVudGggPSAiIjsKKyAgICB9CisKKyAgICBwcmludCAiLlNIIEFSR1VNRU5UU1xuIjsKKyAgICBmb3JlYWNoICRwYXJhbWV0ZXIgKEB7JGFyZ3N7J3BhcmFtZXRlcmxpc3QnfX0pIHsKKwlteSAkcGFyYW1ldGVyX25hbWUgPSAkcGFyYW1ldGVyOworCSRwYXJhbWV0ZXJfbmFtZSA9fiBzL1xbLiovLzsKKworCXByaW50ICIuSVAgXCIiLiRwYXJhbWV0ZXIuIlwiIDEyXG4iOworCW91dHB1dF9oaWdobGlnaHQoJGFyZ3N7J3BhcmFtZXRlcmRlc2NzJ317JHBhcmFtZXRlcl9uYW1lfSk7CisgICAgfQorICAgIGZvcmVhY2ggJHNlY3Rpb24gKEB7JGFyZ3N7J3NlY3Rpb25saXN0J319KSB7CisJcHJpbnQgIi5TSCBcIiIsIHVjICRzZWN0aW9uLCAiXCJcbiI7CisJb3V0cHV0X2hpZ2hsaWdodCgkYXJnc3snc2VjdGlvbnMnfXskc2VjdGlvbn0pOworICAgIH0KK30KKworIyMKKyMgb3V0cHV0IGVudW0gaW4gbWFuCitzdWIgb3V0cHV0X2VudW1fbWFuKCUpIHsKKyAgICBteSAlYXJncyA9ICV7JF9bMF19OworICAgIG15ICgkcGFyYW1ldGVyLCAkc2VjdGlvbik7CisgICAgbXkgJGNvdW50OworCisgICAgcHJpbnQgIi5USCBcIiRhcmdzeydtb2R1bGUnfVwiIDkgXCJlbnVtICRhcmdzeydlbnVtJ31cIiBcIiRtYW5fZGF0ZVwiIFwiQVBJIE1hbnVhbFwiIExJTlVYXG4iOworCisgICAgcHJpbnQgIi5TSCBOQU1FXG4iOworICAgIHByaW50ICJlbnVtICIuJGFyZ3N7J2VudW0nfS4iIFxcLSAiLiRhcmdzeydwdXJwb3NlJ30uIlxuIjsKKworICAgIHByaW50ICIuU0ggU1lOT1BTSVNcbiI7CisgICAgcHJpbnQgImVudW0gIi4kYXJnc3snZW51bSd9LiIge1xuIjsKKyAgICAkY291bnQgPSAwOworICAgIGZvcmVhY2ggbXkgJHBhcmFtZXRlciAoQHskYXJnc3sncGFyYW1ldGVybGlzdCd9fSkgeworICAgICAgICBwcmludCAiLmJyXG4uQkkgXCIgICAgJHBhcmFtZXRlclwiXG4iOworCWlmICgkY291bnQgPT0gJCN7JGFyZ3N7J3BhcmFtZXRlcmxpc3QnfX0pIHsKKwkgICAgcHJpbnQgIlxufTtcbiI7CisJICAgIGxhc3Q7CisJfQorCWVsc2UgeworCSAgICBwcmludCAiLCBcbi5iclxuIjsKKwl9CisJJGNvdW50Kys7CisgICAgfQorCisgICAgcHJpbnQgIi5TSCBDb25zdGFudHNcbiI7CisgICAgZm9yZWFjaCAkcGFyYW1ldGVyIChAeyRhcmdzeydwYXJhbWV0ZXJsaXN0J319KSB7CisJbXkgJHBhcmFtZXRlcl9uYW1lID0gJHBhcmFtZXRlcjsKKwkkcGFyYW1ldGVyX25hbWUgPX4gcy9cWy4qLy87CisKKwlwcmludCAiLklQIFwiIi4kcGFyYW1ldGVyLiJcIiAxMlxuIjsKKwlvdXRwdXRfaGlnaGxpZ2h0KCRhcmdzeydwYXJhbWV0ZXJkZXNjcyd9eyRwYXJhbWV0ZXJfbmFtZX0pOworICAgIH0KKyAgICBmb3JlYWNoICRzZWN0aW9uIChAeyRhcmdzeydzZWN0aW9ubGlzdCd9fSkgeworCXByaW50ICIuU0ggXCIkc2VjdGlvblwiXG4iOworCW91dHB1dF9oaWdobGlnaHQoJGFyZ3N7J3NlY3Rpb25zJ317JHNlY3Rpb259KTsKKyAgICB9Cit9CisKKyMjCisjIG91dHB1dCBzdHJ1Y3QgaW4gbWFuCitzdWIgb3V0cHV0X3N0cnVjdF9tYW4oJSkgeworICAgIG15ICVhcmdzID0gJXskX1swXX07CisgICAgbXkgKCRwYXJhbWV0ZXIsICRzZWN0aW9uKTsKKworICAgIHByaW50ICIuVEggXCIkYXJnc3snbW9kdWxlJ31cIiA5IFwiIi4kYXJnc3sndHlwZSd9LiIgIi4kYXJnc3snc3RydWN0J30uIlwiIFwiJG1hbl9kYXRlXCIgXCJBUEkgTWFudWFsXCIgTElOVVhcbiI7CisKKyAgICBwcmludCAiLlNIIE5BTUVcbiI7CisgICAgcHJpbnQgJGFyZ3N7J3R5cGUnfS4iICIuJGFyZ3N7J3N0cnVjdCd9LiIgXFwtICIuJGFyZ3N7J3B1cnBvc2UnfS4iXG4iOworCisgICAgcHJpbnQgIi5TSCBTWU5PUFNJU1xuIjsKKyAgICBwcmludCAkYXJnc3sndHlwZSd9LiIgIi4kYXJnc3snc3RydWN0J30uIiB7XG4uYnJcbiI7CisKKyAgICBmb3JlYWNoIG15ICRwYXJhbWV0ZXIgKEB7JGFyZ3N7J3BhcmFtZXRlcmxpc3QnfX0pIHsKKwlpZiAoJHBhcmFtZXRlciA9fiAvXiMvKSB7CisJICAgIHByaW50ICIuQkkgXCIkcGFyYW1ldGVyXCJcbi5iclxuIjsKKwkgICAgbmV4dDsKKwl9CisJbXkgJHBhcmFtZXRlcl9uYW1lID0gJHBhcmFtZXRlcjsKKwkkcGFyYW1ldGVyX25hbWUgPX4gcy9cWy4qLy87CisKKyAgICAgICAgKCRhcmdzeydwYXJhbWV0ZXJkZXNjcyd9eyRwYXJhbWV0ZXJfbmFtZX0gbmUgJHVuZGVzY3JpYmVkKSB8fCBuZXh0OworCSR0eXBlID0gJGFyZ3N7J3BhcmFtZXRlcnR5cGVzJ317JHBhcmFtZXRlcn07CisJaWYgKCR0eXBlID1+IG0vKFteXChdKlwoXCopXHMqXClccypcKChbXlwpXSopXCkvKSB7CisJICAgICMgcG9pbnRlci10by1mdW5jdGlvbgorCSAgICBwcmludCAiLkJJIFwiICAgICIuJDEuIlwiICIuJHBhcmFtZXRlci4iIFwiKSAoIi4kMi4iKSIuIlwiXG47XG4iOworCX0gZWxzaWYgKCR0eXBlID1+IG0vXiguKj8pXHMqKDouKikvKSB7CisJICAgIHByaW50ICIuQkkgXCIgICAgIi4kMS4iXCIgIi4kcGFyYW1ldGVyLiQyLiIgXCIiLiJcIlxuO1xuIjsKKwl9IGVsc2UgeworCSAgICAkdHlwZSA9fiBzLyhbXlwqXSkkLyQxIC87CisJICAgIHByaW50ICIuQkkgXCIgICAgIi4kdHlwZS4iXCIgIi4kcGFyYW1ldGVyLiIgXCIiLiJcIlxuO1xuIjsKKwl9CisJcHJpbnQgIlxuLmJyXG4iOworICAgIH0KKyAgICBwcmludCAifTtcbi5iclxuIjsKKworICAgIHByaW50ICIuU0ggQXJndW1lbnRzXG4iOworICAgIGZvcmVhY2ggJHBhcmFtZXRlciAoQHskYXJnc3sncGFyYW1ldGVybGlzdCd9fSkgeworCSgkcGFyYW1ldGVyID1+IC9eIy8pICYmIG5leHQ7CisKKwlteSAkcGFyYW1ldGVyX25hbWUgPSAkcGFyYW1ldGVyOworCSRwYXJhbWV0ZXJfbmFtZSA9fiBzL1xbLiovLzsKKworICAgICAgICAoJGFyZ3N7J3BhcmFtZXRlcmRlc2NzJ317JHBhcmFtZXRlcl9uYW1lfSBuZSAkdW5kZXNjcmliZWQpIHx8IG5leHQ7CisJcHJpbnQgIi5JUCBcIiIuJHBhcmFtZXRlci4iXCIgMTJcbiI7CisJb3V0cHV0X2hpZ2hsaWdodCgkYXJnc3sncGFyYW1ldGVyZGVzY3MnfXskcGFyYW1ldGVyX25hbWV9KTsKKyAgICB9CisgICAgZm9yZWFjaCAkc2VjdGlvbiAoQHskYXJnc3snc2VjdGlvbmxpc3QnfX0pIHsKKwlwcmludCAiLlNIIFwiJHNlY3Rpb25cIlxuIjsKKwlvdXRwdXRfaGlnaGxpZ2h0KCRhcmdzeydzZWN0aW9ucyd9eyRzZWN0aW9ufSk7CisgICAgfQorfQorCisjIworIyBvdXRwdXQgdHlwZWRlZiBpbiBtYW4KK3N1YiBvdXRwdXRfdHlwZWRlZl9tYW4oJSkgeworICAgIG15ICVhcmdzID0gJXskX1swXX07CisgICAgbXkgKCRwYXJhbWV0ZXIsICRzZWN0aW9uKTsKKworICAgIHByaW50ICIuVEggXCIkYXJnc3snbW9kdWxlJ31cIiA5IFwiJGFyZ3N7J3R5cGVkZWYnfVwiIFwiJG1hbl9kYXRlXCIgXCJBUEkgTWFudWFsXCIgTElOVVhcbiI7CisKKyAgICBwcmludCAiLlNIIE5BTUVcbiI7CisgICAgcHJpbnQgInR5cGVkZWYgIi4kYXJnc3sndHlwZWRlZid9LiIgXFwtICIuJGFyZ3N7J3B1cnBvc2UnfS4iXG4iOworCisgICAgZm9yZWFjaCAkc2VjdGlvbiAoQHskYXJnc3snc2VjdGlvbmxpc3QnfX0pIHsKKwlwcmludCAiLlNIIFwiJHNlY3Rpb25cIlxuIjsKKwlvdXRwdXRfaGlnaGxpZ2h0KCRhcmdzeydzZWN0aW9ucyd9eyRzZWN0aW9ufSk7CisgICAgfQorfQorCitzdWIgb3V0cHV0X2ludHJvX21hbiglKSB7CisgICAgbXkgJWFyZ3MgPSAleyRfWzBdfTsKKyAgICBteSAoJHBhcmFtZXRlciwgJHNlY3Rpb24pOworICAgIG15ICRjb3VudDsKKworICAgIHByaW50ICIuVEggXCIkYXJnc3snbW9kdWxlJ31cIiA5IFwiJGFyZ3N7J21vZHVsZSd9XCIgXCIkbWFuX2RhdGVcIiBcIkFQSSBNYW51YWxcIiBMSU5VWFxuIjsKKworICAgIGZvcmVhY2ggJHNlY3Rpb24gKEB7JGFyZ3N7J3NlY3Rpb25saXN0J319KSB7CisJcHJpbnQgIi5TSCBcIiRzZWN0aW9uXCJcbiI7CisJb3V0cHV0X2hpZ2hsaWdodCgkYXJnc3snc2VjdGlvbnMnfXskc2VjdGlvbn0pOworICAgIH0KK30KKworIyMKKyMgb3V0cHV0IGluIHRleHQKK3N1YiBvdXRwdXRfZnVuY3Rpb25fdGV4dCglKSB7CisgICAgbXkgJWFyZ3MgPSAleyRfWzBdfTsKKyAgICBteSAoJHBhcmFtZXRlciwgJHNlY3Rpb24pOworCisgICAgcHJpbnQgIkZ1bmN0aW9uOlxuXG4iOworICAgIG15ICRzdGFydD0kYXJnc3snZnVuY3Rpb250eXBlJ30uIiAiLiRhcmdzeydmdW5jdGlvbid9LiIgKCI7CisgICAgcHJpbnQgJHN0YXJ0OworICAgIG15ICRjb3VudCA9IDA7CisgICAgZm9yZWFjaCBteSAkcGFyYW1ldGVyIChAeyRhcmdzeydwYXJhbWV0ZXJsaXN0J319KSB7CisJJHR5cGUgPSAkYXJnc3sncGFyYW1ldGVydHlwZXMnfXskcGFyYW1ldGVyfTsKKwlpZiAoJHR5cGUgPX4gbS8oW15cKF0qXChcKilccypcKVxzKlwoKFteXCldKilcKS8pIHsKKwkgICAgIyBwb2ludGVyLXRvLWZ1bmN0aW9uCisJICAgIHByaW50ICQxLiRwYXJhbWV0ZXIuIikgKCIuJDI7CisJfSBlbHNlIHsKKwkgICAgcHJpbnQgJHR5cGUuIiAiLiRwYXJhbWV0ZXI7CisJfQorCWlmICgkY291bnQgIT0gJCN7JGFyZ3N7J3BhcmFtZXRlcmxpc3QnfX0pIHsKKwkgICAgJGNvdW50Kys7CisJICAgIHByaW50ICIsXG4iOworCSAgICBwcmludCAiICIgeCBsZW5ndGgoJHN0YXJ0KTsKKwl9IGVsc2UgeworCSAgICBwcmludCAiKTtcblxuIjsKKwl9CisgICAgfQorCisgICAgcHJpbnQgIkFyZ3VtZW50czpcblxuIjsKKyAgICBmb3JlYWNoICRwYXJhbWV0ZXIgKEB7JGFyZ3N7J3BhcmFtZXRlcmxpc3QnfX0pIHsKKwlteSAkcGFyYW1ldGVyX25hbWUgPSAkcGFyYW1ldGVyOworCSRwYXJhbWV0ZXJfbmFtZSA9fiBzL1xbLiovLzsKKworCXByaW50ICRwYXJhbWV0ZXIuIlxuXHQiLiRhcmdzeydwYXJhbWV0ZXJkZXNjcyd9eyRwYXJhbWV0ZXJfbmFtZX0uIlxuIjsKKyAgICB9CisgICAgb3V0cHV0X3NlY3Rpb25fdGV4dChAXyk7Cit9CisKKyNvdXRwdXQgc2VjdGlvbnMgaW4gdGV4dAorc3ViIG91dHB1dF9zZWN0aW9uX3RleHQoJSkgeworICAgIG15ICVhcmdzID0gJXskX1swXX07CisgICAgbXkgJHNlY3Rpb247CisKKyAgICBwcmludCAiXG4iOworICAgIGZvcmVhY2ggJHNlY3Rpb24gKEB7JGFyZ3N7J3NlY3Rpb25saXN0J319KSB7CisJcHJpbnQgIiRzZWN0aW9uOlxuXG4iOworCW91dHB1dF9oaWdobGlnaHQoJGFyZ3N7J3NlY3Rpb25zJ317JHNlY3Rpb259KTsKKyAgICB9ICAKKyAgICBwcmludCAiXG5cbiI7Cit9CisKKyMgb3V0cHV0IGVudW0gaW4gdGV4dAorc3ViIG91dHB1dF9lbnVtX3RleHQoJSkgeworICAgIG15ICVhcmdzID0gJXskX1swXX07CisgICAgbXkgKCRwYXJhbWV0ZXIpOworICAgIG15ICRjb3VudDsKKyAgICBwcmludCAiRW51bTpcblxuIjsKKworICAgIHByaW50ICJlbnVtICIuJGFyZ3N7J2VudW0nfS4iIHtcbiI7CisgICAgJGNvdW50ID0gMDsKKyAgICBmb3JlYWNoICRwYXJhbWV0ZXIgKEB7JGFyZ3N7J3BhcmFtZXRlcmxpc3QnfX0pIHsKKyAgICAgICAgcHJpbnQgIlx0JHBhcmFtZXRlciI7CisJaWYgKCRjb3VudCAhPSAkI3skYXJnc3sncGFyYW1ldGVybGlzdCd9fSkgeworCSAgICAkY291bnQrKzsKKwkgICAgcHJpbnQgIiwiOworCX0KKwlwcmludCAiXG4iOworICAgIH0KKyAgICBwcmludCAifTtcblxuIjsKKworICAgIHByaW50ICJDb25zdGFudHM6XG5cbiI7CisgICAgZm9yZWFjaCAkcGFyYW1ldGVyIChAeyRhcmdzeydwYXJhbWV0ZXJsaXN0J319KSB7CisJcHJpbnQgIiRwYXJhbWV0ZXJcblx0IjsKKwlwcmludCAkYXJnc3sncGFyYW1ldGVyZGVzY3MnfXskcGFyYW1ldGVyfS4iXG4iOworICAgIH0KKworICAgIG91dHB1dF9zZWN0aW9uX3RleHQoQF8pOworfQorCisjIG91dHB1dCB0eXBlZGVmIGluIHRleHQKK3N1YiBvdXRwdXRfdHlwZWRlZl90ZXh0KCUpIHsKKyAgICBteSAlYXJncyA9ICV7JF9bMF19OworICAgIG15ICgkcGFyYW1ldGVyKTsKKyAgICBteSAkY291bnQ7CisgICAgcHJpbnQgIlR5cGVkZWY6XG5cbiI7CisKKyAgICBwcmludCAidHlwZWRlZiAiLiRhcmdzeyd0eXBlZGVmJ30uIlxuIjsKKyAgICBvdXRwdXRfc2VjdGlvbl90ZXh0KEBfKTsKK30KKworIyBvdXRwdXQgc3RydWN0IGFzIHRleHQKK3N1YiBvdXRwdXRfc3RydWN0X3RleHQoJSkgeworICAgIG15ICVhcmdzID0gJXskX1swXX07CisgICAgbXkgKCRwYXJhbWV0ZXIpOworCisgICAgcHJpbnQgJGFyZ3N7J3R5cGUnfS4iICIuJGFyZ3N7J3N0cnVjdCd9LiI6XG5cbiI7CisgICAgcHJpbnQgJGFyZ3N7J3R5cGUnfS4iICIuJGFyZ3N7J3N0cnVjdCd9LiIge1xuIjsKKyAgICBmb3JlYWNoICRwYXJhbWV0ZXIgKEB7JGFyZ3N7J3BhcmFtZXRlcmxpc3QnfX0pIHsKKwlpZiAoJHBhcmFtZXRlciA9fiAvXiMvKSB7CisJICAgIHByaW50ICIkcGFyYW1ldGVyXG4iOworCSAgICBuZXh0OworCX0KKworCW15ICRwYXJhbWV0ZXJfbmFtZSA9ICRwYXJhbWV0ZXI7CisJJHBhcmFtZXRlcl9uYW1lID1+IHMvXFsuKi8vOworCisgICAgICAgICgkYXJnc3sncGFyYW1ldGVyZGVzY3MnfXskcGFyYW1ldGVyX25hbWV9IG5lICR1bmRlc2NyaWJlZCkgfHwgbmV4dDsKKwkkdHlwZSA9ICRhcmdzeydwYXJhbWV0ZXJ0eXBlcyd9eyRwYXJhbWV0ZXJ9OworCWlmICgkdHlwZSA9fiBtLyhbXlwoXSpcKFwqKVxzKlwpXHMqXCgoW15cKV0qKVwpLykgeworCSAgICAjIHBvaW50ZXItdG8tZnVuY3Rpb24KKwkgICAgcHJpbnQgIlx0JDEgJHBhcmFtZXRlcikgKCQyKTtcbiI7CisJfSBlbHNpZiAoJHR5cGUgPX4gbS9eKC4qPylccyooOi4qKS8pIHsKKwkgICAgcHJpbnQgIlx0JDEgJHBhcmFtZXRlciQyO1xuIjsKKwl9IGVsc2UgeworCSAgICBwcmludCAiXHQiLiR0eXBlLiIgIi4kcGFyYW1ldGVyLiI7XG4iOworCX0KKyAgICB9CisgICAgcHJpbnQgIn07XG5cbiI7CisKKyAgICBwcmludCAiTWVtYmVyczpcblxuIjsKKyAgICBmb3JlYWNoICRwYXJhbWV0ZXIgKEB7JGFyZ3N7J3BhcmFtZXRlcmxpc3QnfX0pIHsKKwkoJHBhcmFtZXRlciA9fiAvXiMvKSAmJiBuZXh0OworCisJbXkgJHBhcmFtZXRlcl9uYW1lID0gJHBhcmFtZXRlcjsKKwkkcGFyYW1ldGVyX25hbWUgPX4gcy9cWy4qLy87CisKKyAgICAgICAgKCRhcmdzeydwYXJhbWV0ZXJkZXNjcyd9eyRwYXJhbWV0ZXJfbmFtZX0gbmUgJHVuZGVzY3JpYmVkKSB8fCBuZXh0OworCXByaW50ICIkcGFyYW1ldGVyXG5cdCI7CisJcHJpbnQgJGFyZ3N7J3BhcmFtZXRlcmRlc2NzJ317JHBhcmFtZXRlcl9uYW1lfS4iXG4iOworICAgIH0KKyAgICBwcmludCAiXG4iOworICAgIG91dHB1dF9zZWN0aW9uX3RleHQoQF8pOworfQorCitzdWIgb3V0cHV0X2ludHJvX3RleHQoJSkgeworICAgIG15ICVhcmdzID0gJXskX1swXX07CisgICAgbXkgKCRwYXJhbWV0ZXIsICRzZWN0aW9uKTsKKworICAgIGZvcmVhY2ggJHNlY3Rpb24gKEB7JGFyZ3N7J3NlY3Rpb25saXN0J319KSB7CisJcHJpbnQgIiAkc2VjdGlvbjpcbiI7CisJcHJpbnQgIiAgICAtPiAiOworCW91dHB1dF9oaWdobGlnaHQoJGFyZ3N7J3NlY3Rpb25zJ317JHNlY3Rpb259KTsKKyAgICB9Cit9CisKKyMjCisjIGdlbmVyaWMgb3V0cHV0IGZ1bmN0aW9uIGZvciB0eXBlZGVmcworc3ViIG91dHB1dF9kZWNsYXJhdGlvbiB7CisgICAgbm8gc3RyaWN0ICdyZWZzJzsKKyAgICBteSAkbmFtZSA9IHNoaWZ0OworICAgIG15ICRmdW5jdHlwZSA9IHNoaWZ0OworICAgIG15ICRmdW5jID0gIm91dHB1dF8ke2Z1bmN0eXBlfV8kb3V0cHV0X21vZGUiOworICAgIGlmICgoJGZ1bmN0aW9uX29ubHk9PTApIHx8IAorCSggJGZ1bmN0aW9uX29ubHkgPT0gMSAmJiBkZWZpbmVkKCRmdW5jdGlvbl90YWJsZXskbmFtZX0pKSB8fCAKKwkoICRmdW5jdGlvbl9vbmx5ID09IDIgJiYgIWRlZmluZWQoJGZ1bmN0aW9uX3RhYmxleyRuYW1lfSkpKQorICAgIHsKKyAgICAgICAgJiRmdW5jKEBfKTsKKwkkc2VjdGlvbl9jb3VudGVyKys7CisgICAgfQorfQorCisjIworIyBnZW5lcmljIG91dHB1dCBmdW5jdGlvbiAtIGNhbGxzIHRoZSByaWdodCBvbmUgYmFzZWQKKyMgb24gY3VycmVudCBvdXRwdXQgbW9kZS4KK3N1YiBvdXRwdXRfaW50cm8geworICAgIG5vIHN0cmljdCAncmVmcyc7CisgICAgbXkgJGZ1bmMgPSAib3V0cHV0X2ludHJvXyIuJG91dHB1dF9tb2RlOworICAgICYkZnVuYyhAXyk7CisgICAgJHNlY3Rpb25fY291bnRlcisrOworfQorCisjIworIyB0YWtlcyBhIGRlY2xhcmF0aW9uIChzdHJ1Y3QsIHVuaW9uLCBlbnVtLCB0eXBlZGVmKSBhbmQgCisjIGludm9rZXMgdGhlIHJpZ2h0IGhhbmRsZXIuIE5PVCBjYWxsZWQgZm9yIGZ1bmN0aW9ucy4KK3N1YiBkdW1wX2RlY2xhcmF0aW9uKCQkKSB7CisgICAgbm8gc3RyaWN0ICdyZWZzJzsKKyAgICBteSAoJHByb3RvdHlwZSwgJGZpbGUpID0gQF87CisgICAgbXkgJGZ1bmMgPSAiZHVtcF8iLiRkZWNsX3R5cGU7CisgICAgJiRmdW5jKEBfKTsKK30KKworc3ViIGR1bXBfdW5pb24oJCQpIHsKKyAgICBkdW1wX3N0cnVjdChAXyk7Cit9CisKK3N1YiBkdW1wX3N0cnVjdCgkJCkgeworICAgIG15ICR4ID0gc2hpZnQ7CisgICAgbXkgJGZpbGUgPSBzaGlmdDsKKworICAgIGlmICgkeCA9fi8oc3RydWN0fHVuaW9uKVxzKyhcdyspXHMqeyguKil9LykgeworICAgICAgICAkZGVjbGFyYXRpb25fbmFtZSA9ICQyOworICAgICAgICBteSAkbWVtYmVycyA9ICQzOworCisJIyBpZ25vcmUgZW1iZWRkZWQgc3RydWN0cyBvciB1bmlvbnMKKwkkbWVtYmVycyA9fiBzL3suKj99Ly9nOworCisJY3JlYXRlX3BhcmFtZXRlcmxpc3QoJG1lbWJlcnMsICc7JywgJGZpbGUpOworCisJb3V0cHV0X2RlY2xhcmF0aW9uKCRkZWNsYXJhdGlvbl9uYW1lLAorCQkJICAgJ3N0cnVjdCcsCisJCQkgICB7J3N0cnVjdCcgPT4gJGRlY2xhcmF0aW9uX25hbWUsCisJCQkgICAgJ21vZHVsZScgPT4gJG1vZHVsZW5hbWUsCisJCQkgICAgJ3BhcmFtZXRlcmxpc3QnID0+IFxAcGFyYW1ldGVybGlzdCwKKwkJCSAgICAncGFyYW1ldGVyZGVzY3MnID0+IFwlcGFyYW1ldGVyZGVzY3MsCisJCQkgICAgJ3BhcmFtZXRlcnR5cGVzJyA9PiBcJXBhcmFtZXRlcnR5cGVzLAorCQkJICAgICdzZWN0aW9ubGlzdCcgPT4gXEBzZWN0aW9ubGlzdCwKKwkJCSAgICAnc2VjdGlvbnMnID0+IFwlc2VjdGlvbnMsCisJCQkgICAgJ3B1cnBvc2UnID0+ICRkZWNsYXJhdGlvbl9wdXJwb3NlLAorCQkJICAgICd0eXBlJyA9PiAkZGVjbF90eXBlCisJCQkgICB9KTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHByaW50IFNUREVSUiAiRXJyb3IoJHtmaWxlfTokLik6IENhbm5vdCBwYXJzZSBzdHJ1Y3Qgb3IgdW5pb24hXG4iOworCSsrJGVycm9yczsKKyAgICB9Cit9CisKK3N1YiBkdW1wX2VudW0oJCQpIHsKKyAgICBteSAkeCA9IHNoaWZ0OworICAgIG15ICRmaWxlID0gc2hpZnQ7CisKKyAgICBpZiAoJHggPX4gL2VudW1ccysoXHcrKVxzKnsoLiopfS8pIHsKKyAgICAgICAgJGRlY2xhcmF0aW9uX25hbWUgPSAkMTsKKyAgICAgICAgbXkgJG1lbWJlcnMgPSAkMjsKKworCWZvcmVhY2ggbXkgJGFyZyAoc3BsaXQgJywnLCAkbWVtYmVycykgeworCSAgICAkYXJnID1+IHMvXlxzKihcdyspLiovJDEvOworCSAgICBwdXNoIEBwYXJhbWV0ZXJsaXN0LCAkYXJnOworCSAgICBpZiAoISRwYXJhbWV0ZXJkZXNjc3skYXJnfSkgeworCSAgICAgICAgJHBhcmFtZXRlcmRlc2NzeyRhcmd9ID0gJHVuZGVzY3JpYmVkOworCSAgICAgICAgcHJpbnQgU1RERVJSICJXYXJuaW5nKCR7ZmlsZX06JC4pOiBFbnVtIHZhbHVlICckYXJnJyAiLgorCQkgICAgIm5vdCBkZXNjcmliZWQgaW4gZW51bSAnJGRlY2xhcmF0aW9uX25hbWUnXG4iOworCSAgICB9CisKKwl9CisJCisJb3V0cHV0X2RlY2xhcmF0aW9uKCRkZWNsYXJhdGlvbl9uYW1lLAorCQkJICAgJ2VudW0nLAorCQkJICAgeydlbnVtJyA9PiAkZGVjbGFyYXRpb25fbmFtZSwKKwkJCSAgICAnbW9kdWxlJyA9PiAkbW9kdWxlbmFtZSwKKwkJCSAgICAncGFyYW1ldGVybGlzdCcgPT4gXEBwYXJhbWV0ZXJsaXN0LAorCQkJICAgICdwYXJhbWV0ZXJkZXNjcycgPT4gXCVwYXJhbWV0ZXJkZXNjcywKKwkJCSAgICAnc2VjdGlvbmxpc3QnID0+IFxAc2VjdGlvbmxpc3QsCisJCQkgICAgJ3NlY3Rpb25zJyA9PiBcJXNlY3Rpb25zLAorCQkJICAgICdwdXJwb3NlJyA9PiAkZGVjbGFyYXRpb25fcHVycG9zZQorCQkJICAgfSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBwcmludCBTVERFUlIgIkVycm9yKCR7ZmlsZX06JC4pOiBDYW5ub3QgcGFyc2UgZW51bSFcbiI7CisJKyskZXJyb3JzOworICAgIH0KK30KKworc3ViIGR1bXBfdHlwZWRlZigkJCkgeworICAgIG15ICR4ID0gc2hpZnQ7CisgICAgbXkgJGZpbGUgPSBzaGlmdDsKKworICAgIHdoaWxlICgoJHggPX4gL1woKi5cKVxzKjskLykgfHwgKCR4ID1+IC9cWyouXF1ccyo7JC8pKSB7CisgICAgICAgICR4ID1+IHMvXCgqLlwpXHMqOyQvOy87CisJJHggPX4gcy9cWyouXF1ccyo7JC87LzsKKyAgICB9CisKKyAgICBpZiAoJHggPX4gL3R5cGVkZWYuKlxzKyhcdyspXHMqOy8pIHsKKyAgICAgICAgJGRlY2xhcmF0aW9uX25hbWUgPSAkMTsKKworCW91dHB1dF9kZWNsYXJhdGlvbigkZGVjbGFyYXRpb25fbmFtZSwKKwkJCSAgICd0eXBlZGVmJywKKwkJCSAgIHsndHlwZWRlZicgPT4gJGRlY2xhcmF0aW9uX25hbWUsCisJCQkgICAgJ21vZHVsZScgPT4gJG1vZHVsZW5hbWUsCisJCQkgICAgJ3NlY3Rpb25saXN0JyA9PiBcQHNlY3Rpb25saXN0LAorCQkJICAgICdzZWN0aW9ucycgPT4gXCVzZWN0aW9ucywKKwkJCSAgICAncHVycG9zZScgPT4gJGRlY2xhcmF0aW9uX3B1cnBvc2UKKwkJCSAgIH0pOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcHJpbnQgU1RERVJSICJFcnJvcigke2ZpbGV9OiQuKTogQ2Fubm90IHBhcnNlIHR5cGVkZWYhXG4iOworCSsrJGVycm9yczsKKyAgICB9Cit9CisKK3N1YiBjcmVhdGVfcGFyYW1ldGVybGlzdCgkJCQpIHsKKyAgICBteSAkYXJncyA9IHNoaWZ0OworICAgIG15ICRzcGxpdHRlciA9IHNoaWZ0OworICAgIG15ICRmaWxlID0gc2hpZnQ7CisgICAgbXkgJHR5cGU7CisgICAgbXkgJHBhcmFtOworCisgICAgd2hpbGUgKCRhcmdzID1+IC8oXChbXlwpLF0rKSwvKSB7CisgICAgICAgICRhcmdzID1+IHMvKFwoW15cKSxdKyksLyQxIy9nOworICAgIH0KKyAgICAKKyAgICBmb3JlYWNoIG15ICRhcmcgKHNwbGl0KCRzcGxpdHRlciwgJGFyZ3MpKSB7CisJIyBzdHJpcCBjb21tZW50cworCSRhcmcgPX4gcy9cL1wqLipcKlwvLy87CisgICAgICAgICMgc3RyaXAgbGVhZGluZy90cmFpbGluZyBzcGFjZXMKKyAgICAgICAgJGFyZyA9fiBzL15ccyovLzsKKwkkYXJnID1+IHMvXHMqJC8vOworCSRhcmcgPX4gcy9ccysvIC87CisKKwlpZiAoJGFyZyA9fiAvXiMvKSB7CisJICAgICMgVHJlYXQgcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZSBhcyBhIHR5cGVsZXNzIHZhcmlhYmxlIGp1c3QgdG8gZmlsbAorCSAgICAjIGNvcnJlc3BvbmRpbmcgZGF0YSBzdHJ1Y3R1cmVzICJjb3JyZWN0bHkiLiBDYXRjaCBpdCBsYXRlciBpbgorCSAgICAjIG91dHB1dF8qIHN1YnMuCisJICAgIHB1c2hfcGFyYW1ldGVyKCRhcmcsICIiLCAkZmlsZSk7CisJfSBlbHNpZiAoJGFyZyA9fiBtL1woLykgeworCSAgICAjIHBvaW50ZXItdG8tZnVuY3Rpb24KKwkgICAgJGFyZyA9fiB0ci8jLywvOworCSAgICAkYXJnID1+IG0vW15cKF0rXChcKihbXlwpXSspXCkvOworCSAgICAkcGFyYW0gPSAkMTsKKwkgICAgJHR5cGUgPSAkYXJnOworCSAgICAkdHlwZSA9fiBzLyhbXlwoXStcKFwqKSRwYXJhbS8kMS87CisJICAgIHB1c2hfcGFyYW1ldGVyKCRwYXJhbSwgJHR5cGUsICRmaWxlKTsKKwl9IGVsc2UgeworCSAgICAkYXJnID1+IHMvXHMqOlxzKi86L2c7CisJICAgICRhcmcgPX4gcy9ccypcWy9cWy9nOworCisJICAgIG15IEBhcmdzID0gc3BsaXQoJ1xzKixccyonLCAkYXJnKTsKKwkgICAgaWYgKCRhcmdzWzBdID1+IG0vXCovKSB7CisJCSRhcmdzWzBdID1+IHMvKFwqKylccyovICQxLzsKKwkgICAgfQorCSAgICBteSBAZmlyc3RfYXJnID0gc3BsaXQoJ1xzKycsIHNoaWZ0IEBhcmdzKTsKKwkgICAgdW5zaGlmdChAYXJncywgcG9wIEBmaXJzdF9hcmcpOworCSAgICAkdHlwZSA9IGpvaW4gIiAiLCBAZmlyc3RfYXJnOworCisJICAgIGZvcmVhY2ggJHBhcmFtIChAYXJncykgeworCQlpZiAoJHBhcmFtID1+IG0vXihcKispXHMqKC4qKS8pIHsKKwkJICAgIHB1c2hfcGFyYW1ldGVyKCQyLCAiJHR5cGUgJDEiLCAkZmlsZSk7CisJCX0KKwkJZWxzaWYgKCRwYXJhbSA9fiBtLyguKj8pOihcZCspLykgeworCQkgICAgcHVzaF9wYXJhbWV0ZXIoJDEsICIkdHlwZTokMiIsICRmaWxlKQorCQl9CisJCWVsc2UgeworCQkgICAgcHVzaF9wYXJhbWV0ZXIoJHBhcmFtLCAkdHlwZSwgJGZpbGUpOworCQl9CisJICAgIH0KKwl9CisgICAgfQorfQorCitzdWIgcHVzaF9wYXJhbWV0ZXIoJCQkKSB7CisJbXkgJHBhcmFtID0gc2hpZnQ7CisJbXkgJHR5cGUgPSBzaGlmdDsKKwlteSAkZmlsZSA9IHNoaWZ0OworCisJbXkgJHBhcmFtX25hbWUgPSAkcGFyYW07CisJJHBhcmFtX25hbWUgPX4gcy9cWy4qLy87CisKKwlpZiAoJHR5cGUgZXEgIiIgJiYgJHBhcmFtIGVxICIuLi4iKQorCXsKKwkgICAgJHR5cGU9IiI7CisJICAgICRwYXJhbT0iLi4uIjsKKwkgICAgJHBhcmFtZXRlcmRlc2NzeyIuLi4ifSA9ICJ2YXJpYWJsZSBhcmd1bWVudHMiOworCX0KKwllbHNpZiAoJHR5cGUgZXEgIiIgJiYgKCRwYXJhbSBlcSAiIiBvciAkcGFyYW0gZXEgInZvaWQiKSkKKwl7CisJICAgICR0eXBlPSIiOworCSAgICAkcGFyYW09InZvaWQiOworCSAgICAkcGFyYW1ldGVyZGVzY3N7dm9pZH0gPSAibm8gYXJndW1lbnRzIjsKKwl9CisJaWYgKGRlZmluZWQgJHR5cGUgJiYgJHR5cGUgJiYgIWRlZmluZWQgJHBhcmFtZXRlcmRlc2NzeyRwYXJhbV9uYW1lfSkgeworCSAgICAkcGFyYW1ldGVyZGVzY3N7JHBhcmFtX25hbWV9ID0gJHVuZGVzY3JpYmVkOworCisJICAgIGlmICgoJHR5cGUgZXEgJ2Z1bmN0aW9uJykgfHwgKCR0eXBlIGVxICdlbnVtJykpIHsKKwkgICAgICAgIHByaW50IFNUREVSUiAiV2FybmluZygke2ZpbGV9OiQuKTogRnVuY3Rpb24gcGFyYW1ldGVyICIuCisJCSAgICAib3IgbWVtYmVyICckcGFyYW0nIG5vdCAiIC4KKwkJICAgICJkZXNjcmliZWQgaW4gJyRkZWNsYXJhdGlvbl9uYW1lJ1xuIjsKKwkgICAgfQorCSAgICBwcmludCBTVERFUlIgIldhcm5pbmcoJHtmaWxlfTokLik6Ii4KKwkgICAgICAgICAgICAgICAgICIgTm8gZGVzY3JpcHRpb24gZm91bmQgZm9yIHBhcmFtZXRlciAnJHBhcmFtJ1xuIjsKKwkgICAgKyskd2FybmluZ3M7CisgICAgICAgIH0KKworCXB1c2ggQHBhcmFtZXRlcmxpc3QsICRwYXJhbTsKKwkkcGFyYW1ldGVydHlwZXN7JHBhcmFtfSA9ICR0eXBlOworfQorCisjIworIyB0YWtlcyBhIGZ1bmN0aW9uIHByb3RvdHlwZSBhbmQgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgZmlsZSBiZWluZworIyBwcm9jZXNzZWQgYW5kIHNwaXRzIG91dCBhbGwgdGhlIGRldGFpbHMgc3RvcmVkIGluIHRoZSBnbG9iYWwKKyMgYXJyYXlzL2hhc2hlcy4KK3N1YiBkdW1wX2Z1bmN0aW9uKCQkKSB7CisgICAgbXkgJHByb3RvdHlwZSA9IHNoaWZ0OworICAgIG15ICRmaWxlID0gc2hpZnQ7CisKKyAgICAkcHJvdG90eXBlID1+IHMvXnN0YXRpYyArLy87CisgICAgJHByb3RvdHlwZSA9fiBzL15leHRlcm4gKy8vOworICAgICRwcm90b3R5cGUgPX4gcy9eaW5saW5lICsvLzsKKyAgICAkcHJvdG90eXBlID1+IHMvXl9faW5saW5lX18gKy8vOworICAgICRwcm90b3R5cGUgPX4gcy9eI2RlZmluZSArLy87ICNhayBhZGRlZAorICAgICRwcm90b3R5cGUgPX4gcy9fX2F0dHJpYnV0ZV9fIFwoXChbYS16LF0qXClcKS8vOworCisgICAgIyBZZXMsIHRoaXMgdHJ1bHkgaXMgdmlsZS4gIFdlIGFyZSBsb29raW5nIGZvcjoKKyAgICAjIDEuIFJldHVybiB0eXBlIChtYXkgYmUgbm90aGluZyBpZiB3ZSdyZSBsb29raW5nIGF0IGEgbWFjcm8pCisgICAgIyAyLiBGdW5jdGlvbiBuYW1lCisgICAgIyAzLiBGdW5jdGlvbiBwYXJhbWV0ZXJzLgorICAgICMKKyAgICAjIEFsbCB0aGUgd2hpbGUgd2UgaGF2ZSB0byB3YXRjaCBvdXQgZm9yIGZ1bmN0aW9uIHBvaW50ZXIgcGFyYW1ldGVycworICAgICMgKHdoaWNoIElJUkMgaXMgd2hhdCB0aGUgdHdvIHNlY3Rpb25zIGFyZSBmb3IpLCBDIHR5cGVzICh0aGVzZQorICAgICMgcmVnZXhwcyBkb24ndCBldmVuIHN0YXJ0IHRvIGV4cHJlc3MgYWxsIHRoZSBwb3NzaWJpbGl0aWVzKSwgYW5kCisgICAgIyBzbyBvbi4KKyAgICAjCisgICAgIyBJZiB5b3UgbWVzcyB3aXRoIHRoZXNlIHJlZ2V4cHMsIGl0J3MgYSBnb29kIGlkZWEgdG8gY2hlY2sgdGhhdAorICAgICMgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMnIGRvY3VtZW50YXRpb24gc3RpbGwgY29tZXMgb3V0IHJpZ2h0OgorICAgICMgLSBwYXJwb3J0X3JlZ2lzdGVyX2RldmljZSAoZnVuY3Rpb24gcG9pbnRlciBwYXJhbWV0ZXJzKQorICAgICMgLSBhdG9taWNfc2V0IChtYWNybykKKyAgICAjIC0gcGNpX21hdGNoX2RldmljZSAobG9uZyByZXR1cm4gdHlwZSkKKworICAgIGlmICgkcHJvdG90eXBlID1+IG0vXigpKFthLXpBLVowLTlffjpdKylccypcKChbXlwoXSopXCkvIHx8CisJJHByb3RvdHlwZSA9fiBtL14oXHcrKVxzKyhbYS16QS1aMC05X346XSspXHMqXCgoW15cKF0qKVwpLyB8fAorCSRwcm90b3R5cGUgPX4gbS9eKFx3K1xzKlwqKVxzKihbYS16QS1aMC05X346XSspXHMqXCgoW15cKF0qKVwpLyB8fAorCSRwcm90b3R5cGUgPX4gbS9eKFx3K1xzK1x3KylccysoW2EtekEtWjAtOV9+Ol0rKVxzKlwoKFteXChdKilcKS8gfHwKKwkkcHJvdG90eXBlID1+IG0vXihcdytccytcdytccypcKilccyooW2EtekEtWjAtOV9+Ol0rKVxzKlwoKFteXChdKilcKS8gfHwKKwkkcHJvdG90eXBlID1+IG0vXihcdytccytcdytccytcdyspXHMrKFthLXpBLVowLTlffjpdKylccypcKChbXlwoXSopXCkvIHx8CisJJHByb3RvdHlwZSA9fiBtL14oXHcrXHMrXHcrXHMrXHcrXHMqXCopXHMqKFthLXpBLVowLTlffjpdKylccypcKChbXlwoXSopXCkvIHx8CisJJHByb3RvdHlwZSA9fiBtL14oKShbYS16QS1aMC05X346XSspXHMqXCgoW15ce10qKVwpLyB8fAorCSRwcm90b3R5cGUgPX4gbS9eKFx3KylccysoW2EtekEtWjAtOV9+Ol0rKVxzKlwoKFteXHtdKilcKS8gfHwKKwkkcHJvdG90eXBlID1+IG0vXihcdytccypcKilccyooW2EtekEtWjAtOV9+Ol0rKVxzKlwoKFteXHtdKilcKS8gfHwKKwkkcHJvdG90eXBlID1+IG0vXihcdytccytcdyspXHMrKFthLXpBLVowLTlffjpdKylccypcKChbXlx7XSopXCkvIHx8CisJJHByb3RvdHlwZSA9fiBtL14oXHcrXHMrXHcrXHMqXCopXHMqKFthLXpBLVowLTlffjpdKylccypcKChbXlx7XSopXCkvIHx8CisJJHByb3RvdHlwZSA9fiBtL14oXHcrXHMrXHcrXHMrXHcrKVxzKyhbYS16QS1aMC05X346XSspXHMqXCgoW15ce10qKVwpLyB8fAorCSRwcm90b3R5cGUgPX4gbS9eKFx3K1xzK1x3K1xzK1x3K1xzKlwqKVxzKihbYS16QS1aMC05X346XSspXHMqXCgoW15ce10qKVwpLykgIHsKKwkkcmV0dXJuX3R5cGUgPSAkMTsKKwkkZGVjbGFyYXRpb25fbmFtZSA9ICQyOworCW15ICRhcmdzID0gJDM7CisKKwljcmVhdGVfcGFyYW1ldGVybGlzdCgkYXJncywgJywnLCAkZmlsZSk7CisgICAgfSBlbHNlIHsKKwlwcmludCBTVERFUlIgIkVycm9yKCR7ZmlsZX06JC4pOiBjYW5ub3QgdW5kZXJzdGFuZCBwcm90b3R5cGU6ICckcHJvdG90eXBlJ1xuIjsKKwkrKyRlcnJvcnM7CisJcmV0dXJuOworICAgIH0KKworICAgIG91dHB1dF9kZWNsYXJhdGlvbigkZGVjbGFyYXRpb25fbmFtZSwgCisJCSAgICAgICAnZnVuY3Rpb24nLAorCQkgICAgICAgeydmdW5jdGlvbicgPT4gJGRlY2xhcmF0aW9uX25hbWUsCisJCQknbW9kdWxlJyA9PiAkbW9kdWxlbmFtZSwKKwkJCSdmdW5jdGlvbnR5cGUnID0+ICRyZXR1cm5fdHlwZSwKKwkJCSdwYXJhbWV0ZXJsaXN0JyA9PiBcQHBhcmFtZXRlcmxpc3QsCisJCQkncGFyYW1ldGVyZGVzY3MnID0+IFwlcGFyYW1ldGVyZGVzY3MsCisJCQkncGFyYW1ldGVydHlwZXMnID0+IFwlcGFyYW1ldGVydHlwZXMsCisJCQknc2VjdGlvbmxpc3QnID0+IFxAc2VjdGlvbmxpc3QsCisJCQknc2VjdGlvbnMnID0+IFwlc2VjdGlvbnMsCisJCQkncHVycG9zZScgPT4gJGRlY2xhcmF0aW9uX3B1cnBvc2UKKwkJICAgICAgIH0pOworfQorCitzdWIgcHJvY2Vzc19maWxlKCQpOworCisjIFJlYWQgdGhlIGZpbGUgdGhhdCBtYXBzIHJlbGF0aXZlIG5hbWVzIHRvIGFic29sdXRlIG5hbWVzIGZvcgorIyBzZXBhcmF0ZSBzb3VyY2UgYW5kIG9iamVjdCBkaXJlY3RvcmllcyBhbmQgZm9yIHNoYWRvdyB0cmVlcy4KK2lmIChvcGVuKFNPVVJDRV9NQVAsICI8LnRtcF9maWxlbGlzdC50eHQiKSkgeworCW15ICgkcmVsbmFtZSwgJGFic25hbWUpOworCXdoaWxlKDxTT1VSQ0VfTUFQPikgeworCQljaG9wKCk7CisJCSgkcmVsbmFtZSwgJGFic25hbWUpID0gKHNwbGl0KCkpWzAuLjFdOworCQkkcmVsbmFtZSA9fiBzOl4vKzo6OworCQkkc291cmNlX21hcHskcmVsbmFtZX0gPSAkYWJzbmFtZTsKKwl9CisJY2xvc2UoU09VUkNFX01BUCk7Cit9CisKK2lmICgkZmlsZWxpc3QpIHsKKwlvcGVuKEZMSVNULCI8JGZpbGVsaXN0Iikgb3IgZGllICJDYW4ndCBvcGVuIGZpbGUgbGlzdCAkZmlsZWxpc3QiOworCXdoaWxlKDxGTElTVD4pIHsKKwkJY2hvcDsKKwkJcHJvY2Vzc19maWxlKCRfKTsKKwl9Cit9CisKK2ZvcmVhY2ggKEBBUkdWKSB7CisgICAgY2hvbXA7CisgICAgcHJvY2Vzc19maWxlKCRfKTsKK30KK2lmICgkdmVyYm9zZSAmJiAkZXJyb3JzKSB7CisgIHByaW50IFNUREVSUiAiJGVycm9ycyBlcnJvcnNcbiI7Cit9CitpZiAoJHZlcmJvc2UgJiYgJHdhcm5pbmdzKSB7CisgIHByaW50IFNUREVSUiAiJHdhcm5pbmdzIHdhcm5pbmdzXG4iOworfQorCitleGl0KCRlcnJvcnMpOworCitzdWIgcmVzZXRfc3RhdGUgeworICAgICRmdW5jdGlvbiA9ICIiOworICAgICVjb25zdGFudHMgPSAoKTsKKyAgICAlcGFyYW1ldGVyZGVzY3MgPSAoKTsKKyAgICAlcGFyYW1ldGVydHlwZXMgPSAoKTsKKyAgICBAcGFyYW1ldGVybGlzdCA9ICgpOworICAgICVzZWN0aW9ucyA9ICgpOworICAgIEBzZWN0aW9ubGlzdCA9ICgpOworICAgICRwcm90b3R5cGUgPSAiIjsKKyAgICAKKyAgICAkc3RhdGUgPSAwOworfQorCitzdWIgcHJvY2Vzc19zdGF0ZTNfZnVuY3Rpb24oJCQpIHsgCisgICAgbXkgJHggPSBzaGlmdDsKKyAgICBteSAkZmlsZSA9IHNoaWZ0OworCisgICAgaWYgKCR4ID1+IG0jXHMqL1wqXHMrTUFDRE9DXHMqI2lvIHx8ICgkeCA9fiAvXiMvICYmICR4ICF+IC9eI2RlZmluZS8pKSB7CisJIyBkbyBub3RoaW5nCisgICAgfQorICAgIGVsc2lmICgkeCA9fiAvKFteXHtdKikvKSB7CisgICAgICAgICRwcm90b3R5cGUgLj0gJDE7CisgICAgfQorICAgIGlmICgoJHggPX4gL1x7LykgfHwgKCR4ID1+IC9cI2RlZmluZS8pIHx8ICgkeCA9fiAvOy8pKSB7CisgICAgICAgICRwcm90b3R5cGUgPX4gc0AvXCouKj9cKi9AQGdvczsJIyBzdHJpcCBjb21tZW50cy4KKwkkcHJvdG90eXBlID1+IHNAW1xyXG5dK0AgQGdvczsgIyBzdHJpcCBuZXdsaW5lcy9jcidzLgorCSRwcm90b3R5cGUgPX4gc0BeXHMrQEBnb3M7ICMgc3RyaXAgbGVhZGluZyBzcGFjZXMKKwlkdW1wX2Z1bmN0aW9uKCRwcm90b3R5cGUsJGZpbGUpOworCXJlc2V0X3N0YXRlKCk7CisgICAgfQorfQorCitzdWIgcHJvY2Vzc19zdGF0ZTNfdHlwZSgkJCkgeyAKKyAgICBteSAkeCA9IHNoaWZ0OworICAgIG15ICRmaWxlID0gc2hpZnQ7CisKKyAgICAkeCA9fiBzQC9cKi4qP1wqL0BAZ29zOwkjIHN0cmlwIGNvbW1lbnRzLgorICAgICR4ID1+IHNAW1xyXG5dK0AgQGdvczsgIyBzdHJpcCBuZXdsaW5lcy9jcidzLgorICAgICR4ID1+IHNAXlxzK0BAZ29zOyAjIHN0cmlwIGxlYWRpbmcgc3BhY2VzCisgICAgJHggPX4gc0BccyskQEBnb3M7ICMgc3RyaXAgdHJhaWxpbmcgc3BhY2VzCisgICAgaWYgKCR4ID1+IC9eIy8pIHsKKwkjIFRvIGRpc3Rpbmd1aXNoIHByZXByb2Nlc3NvciBkaXJlY3RpdmUgZnJvbSByZWd1bGFyIGRlY2xhcmF0aW9uIGxhdGVyLgorCSR4IC49ICI7IjsKKyAgICB9CisKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoICR4ID1+IC8oW157fTtdKikoW3t9O10pKC4qKS8gKSB7CisJICAgICRwcm90b3R5cGUgLj0gJDEgLiAkMjsKKwkgICAgKCQyIGVxICd7JykgJiYgJGJyY291bnQrKzsKKwkgICAgKCQyIGVxICd9JykgJiYgJGJyY291bnQtLTsKKwkgICAgaWYgKCgkMiBlcSAnOycpICYmICgkYnJjb3VudCA9PSAwKSkgeworCSAgICAgICAgZHVtcF9kZWNsYXJhdGlvbigkcHJvdG90eXBlLCRmaWxlKTsKKwkJcmVzZXRfc3RhdGUoKTsKKwkgICAgICAgIGxhc3Q7CisJICAgIH0KKwkgICAgJHggPSAkMzsKKyAgICAgICAgfSBlbHNlIHsKKwkgICAgJHByb3RvdHlwZSAuPSAkeDsKKwkgICAgbGFzdDsKKwl9CisgICAgfQorfQorCisjIHJlcGxhY2UgPCwgPiwgYW5kICYKK3N1YiB4bWxfZXNjYXBlKCQpIHsKKwlteSAkdGV4dCA9IHNoaWZ0OworCSR0ZXh0ID1+IHMvXCYvXFxcXFxcYW1wOy9nOworCSR0ZXh0ID1+IHMvXDwvXFxcXFxcbHQ7L2c7CisJJHRleHQgPX4gcy9cPi9cXFxcXFxndDsvZzsKKwlyZXR1cm4gJHRleHQ7Cit9CisKK3N1YiBwcm9jZXNzX2ZpbGUoJCkgeworICAgIG15ICgkZmlsZSkgPSAiJEVOVnsnU1JDVFJFRSd9QF8iOworICAgIG15ICRpZGVudGlmaWVyOworICAgIG15ICRmdW5jOworICAgIG15ICRpbml0aWFsX3NlY3Rpb25fY291bnRlciA9ICRzZWN0aW9uX2NvdW50ZXI7CisKKyAgICBpZiAoZGVmaW5lZCgkc291cmNlX21hcHskZmlsZX0pKSB7CisJJGZpbGUgPSAkc291cmNlX21hcHskZmlsZX07CisgICAgfQorCisgICAgaWYgKCFvcGVuKElOLCI8JGZpbGUiKSkgeworCXByaW50IFNUREVSUiAiRXJyb3I6IENhbm5vdCBvcGVuIGZpbGUgJGZpbGVcbiI7CisJKyskZXJyb3JzOworCXJldHVybjsKKyAgICB9CisKKyAgICAkc2VjdGlvbl9jb3VudGVyID0gMDsKKyAgICB3aGlsZSAoPElOPikgeworCWlmICgkc3RhdGUgPT0gMCkgeworCSAgICBpZiAoLyRkb2Nfc3RhcnQvbykgeworCQkkc3RhdGUgPSAxOwkJIyBuZXh0IGxpbmUgaXMgYWx3YXlzIHRoZSBmdW5jdGlvbiBuYW1lCisJICAgIH0KKwl9IGVsc2lmICgkc3RhdGUgPT0gMSkgewkjIHRoaXMgbGluZSBpcyB0aGUgZnVuY3Rpb24gbmFtZSAoYWx3YXlzKQorCSAgICBpZiAoLyRkb2NfYmxvY2svbykgeworCQkkc3RhdGUgPSA0OworCQkkY29udGVudHMgPSAiIjsKKwkJaWYgKCAkMSBlcSAiIiApIHsKKwkJCSRzZWN0aW9uID0gJHNlY3Rpb25faW50cm87CisJCX0gZWxzZSB7CisJCQkkc2VjdGlvbiA9ICQxOworCQl9CisgICAgICAgICAgICB9CisJICAgIGVsc2lmICgvJGRvY19kZWNsL28pIHsKKwkJJGlkZW50aWZpZXIgPSAkMTsKKwkJaWYgKC9ccyooW1x3XHNdKz8pXHMqLS8pIHsKKwkJICAgICRpZGVudGlmaWVyID0gJDE7CisJCX0KKworCQkkc3RhdGUgPSAyOworCQlpZiAoLy0oLiopLykgeworCQkgICAgJGRlY2xhcmF0aW9uX3B1cnBvc2UgPSB4bWxfZXNjYXBlKCQxKTsKKwkJfSBlbHNlIHsKKwkJICAgICRkZWNsYXJhdGlvbl9wdXJwb3NlID0gIiI7CisJCX0KKwkJaWYgKCRpZGVudGlmaWVyID1+IG0vXnN0cnVjdC8pIHsKKwkJICAgICRkZWNsX3R5cGUgPSAnc3RydWN0JzsKKwkJfSBlbHNpZiAoJGlkZW50aWZpZXIgPX4gbS9edW5pb24vKSB7CisJCSAgICAkZGVjbF90eXBlID0gJ3VuaW9uJzsKKwkJfSBlbHNpZiAoJGlkZW50aWZpZXIgPX4gbS9eZW51bS8pIHsKKwkJICAgICRkZWNsX3R5cGUgPSAnZW51bSc7CisJCX0gZWxzaWYgKCRpZGVudGlmaWVyID1+IG0vXnR5cGVkZWYvKSB7CisJCSAgICAkZGVjbF90eXBlID0gJ3R5cGVkZWYnOworCQl9IGVsc2UgeworCQkgICAgJGRlY2xfdHlwZSA9ICdmdW5jdGlvbic7CisJCX0KKworCQlpZiAoJHZlcmJvc2UpIHsKKwkJICAgIHByaW50IFNUREVSUiAiSW5mbygke2ZpbGV9OiQuKTogU2Nhbm5pbmcgZG9jIGZvciAkaWRlbnRpZmllclxuIjsKKwkJfQorCSAgICB9IGVsc2UgeworCQlwcmludCBTVERFUlIgIldhcm5pbmcoJHtmaWxlfTokLik6IENhbm5vdCB1bmRlcnN0YW5kICRfIG9uIGxpbmUgJC4iLAorCQkiIC0gSSB0aG91Z2h0IGl0IHdhcyBhIGRvYyBsaW5lXG4iOworCQkrKyR3YXJuaW5nczsKKwkJJHN0YXRlID0gMDsKKwkgICAgfQorCX0gZWxzaWYgKCRzdGF0ZSA9PSAyKSB7CSMgbG9vayBmb3IgaGVhZDogbGluZXMsIGFuZCBpbmNsdWRlIGNvbnRlbnQKKwkgICAgaWYgKC8kZG9jX3NlY3QvbykgeworCQkkbmV3c2VjdGlvbiA9ICQxOworCQkkbmV3Y29udGVudHMgPSAkMjsKKworCQlpZiAoJGNvbnRlbnRzIG5lICIiKSB7CisJCSAgICBkdW1wX3NlY3Rpb24oJHNlY3Rpb24sIHhtbF9lc2NhcGUoJGNvbnRlbnRzKSk7CisJCSAgICAkc2VjdGlvbiA9ICRzZWN0aW9uX2RlZmF1bHQ7CisJCX0KKworCQkkY29udGVudHMgPSAkbmV3Y29udGVudHM7CisJCWlmICgkY29udGVudHMgbmUgIiIpIHsKKwkJICAgICRjb250ZW50cyAuPSAiXG4iOworCQl9CisJCSRzZWN0aW9uID0gJG5ld3NlY3Rpb247CisJICAgIH0gZWxzaWYgKC8kZG9jX2VuZC8pIHsKKworCQlpZiAoJGNvbnRlbnRzIG5lICIiKSB7CisJCSAgICBkdW1wX3NlY3Rpb24oJHNlY3Rpb24sIHhtbF9lc2NhcGUoJGNvbnRlbnRzKSk7CisJCSAgICAkc2VjdGlvbiA9ICRzZWN0aW9uX2RlZmF1bHQ7CisJCSAgICAkY29udGVudHMgPSAiIjsKKwkJfQorCisJCSRwcm90b3R5cGUgPSAiIjsKKwkJJHN0YXRlID0gMzsKKwkJJGJyY291bnQgPSAwOworIwkgICAgcHJpbnQgU1RERVJSICJlbmQgb2YgZG9jIGNvbW1lbnQsIGxvb2tpbmcgZm9yIHByb3RvdHlwZVxuIjsKKwkgICAgfSBlbHNpZiAoLyRkb2NfY29udGVudC8pIHsKKwkJIyBtaWd1ZWwtc3R5bGUgY29tbWVudCBrbHVkZ2UsIGxvb2sgZm9yIGJsYW5rIGxpbmVzIGFmdGVyCisJCSMgQHBhcmFtZXRlciBsaW5lIHRvIHNpZ25pZnkgc3RhcnQgb2YgZGVzY3JpcHRpb24KKwkJaWYgKCQxIGVxICIiICYmIAorCQkJKCRzZWN0aW9uID1+IG0vXkAvIHx8ICRzZWN0aW9uIGVxICRzZWN0aW9uX2NvbnRleHQpKSB7CisJCSAgICBkdW1wX3NlY3Rpb24oJHNlY3Rpb24sIHhtbF9lc2NhcGUoJGNvbnRlbnRzKSk7CisJCSAgICAkc2VjdGlvbiA9ICRzZWN0aW9uX2RlZmF1bHQ7CisJCSAgICAkY29udGVudHMgPSAiIjsKKwkJfSBlbHNlIHsKKwkJICAgICRjb250ZW50cyAuPSAkMS4iXG4iOworCQl9CisJICAgIH0gZWxzZSB7CisJCSMgaSBkb250IGtub3cgLSBiYWQgbGluZT8gIGlnbm9yZS4KKwkJcHJpbnQgU1RERVJSICJXYXJuaW5nKCR7ZmlsZX06JC4pOiBiYWQgbGluZTogJF8iOyAKKwkJKyskd2FybmluZ3M7CisJICAgIH0KKwl9IGVsc2lmICgkc3RhdGUgPT0gMykgewkjIHNjYW5uaW5nIGZvciBmdW5jdGlvbiB7IChlbmQgb2YgcHJvdG90eXBlKQorCSAgICBpZiAoJGRlY2xfdHlwZSBlcSAnZnVuY3Rpb24nKSB7CisJICAgICAgICBwcm9jZXNzX3N0YXRlM19mdW5jdGlvbigkXywgJGZpbGUpOworCSAgICB9IGVsc2UgeworCSAgICAgICAgcHJvY2Vzc19zdGF0ZTNfdHlwZSgkXywgJGZpbGUpOworCSAgICB9CisJfSBlbHNpZiAoJHN0YXRlID09IDQpIHsKKwkJIyBEb2N1bWVudGF0aW9uIGJsb2NrCisJICAgICAgICBpZiAoLyRkb2NfYmxvY2svKSB7CisJCQlkdW1wX3NlY3Rpb24oJHNlY3Rpb24sICRjb250ZW50cyk7CisJCQlvdXRwdXRfaW50cm8oeydzZWN0aW9ubGlzdCcgPT4gXEBzZWN0aW9ubGlzdCwKKwkJCQkgICAgICAnc2VjdGlvbnMnID0+IFwlc2VjdGlvbnMgfSk7CisJCQkkY29udGVudHMgPSAiIjsKKwkJCSRmdW5jdGlvbiA9ICIiOworCQkJJWNvbnN0YW50cyA9ICgpOworCQkJJXBhcmFtZXRlcmRlc2NzID0gKCk7CisJCQklcGFyYW1ldGVydHlwZXMgPSAoKTsKKwkJCUBwYXJhbWV0ZXJsaXN0ID0gKCk7CisJCQklc2VjdGlvbnMgPSAoKTsKKwkJCUBzZWN0aW9ubGlzdCA9ICgpOworCQkJJHByb3RvdHlwZSA9ICIiOworCQkJaWYgKCAkMSBlcSAiIiApIHsKKwkJCQkkc2VjdGlvbiA9ICRzZWN0aW9uX2ludHJvOworCQkJfSBlbHNlIHsKKwkJCQkkc2VjdGlvbiA9ICQxOworCQkJfQorICAgICAgICAgICAgICAgIH0KKwkJZWxzaWYgKC8kZG9jX2VuZC8pCisJCXsKKwkJCWR1bXBfc2VjdGlvbigkc2VjdGlvbiwgJGNvbnRlbnRzKTsKKwkJCW91dHB1dF9pbnRybyh7J3NlY3Rpb25saXN0JyA9PiBcQHNlY3Rpb25saXN0LAorCQkJCSAgICAgICdzZWN0aW9ucycgPT4gXCVzZWN0aW9ucyB9KTsKKwkJCSRjb250ZW50cyA9ICIiOworCQkJJGZ1bmN0aW9uID0gIiI7CisJCQklY29uc3RhbnRzID0gKCk7CisJCQklcGFyYW1ldGVyZGVzY3MgPSAoKTsKKwkJCSVwYXJhbWV0ZXJ0eXBlcyA9ICgpOworCQkJQHBhcmFtZXRlcmxpc3QgPSAoKTsKKwkJCSVzZWN0aW9ucyA9ICgpOworCQkJQHNlY3Rpb25saXN0ID0gKCk7CisJCQkkcHJvdG90eXBlID0gIiI7CisJCQkkc3RhdGUgPSAwOworCQl9CisJCWVsc2lmICgvJGRvY19jb250ZW50LykKKwkJeworCQkJaWYgKCAkMSBlcSAiIiApCisJCQl7CisJCQkJJGNvbnRlbnRzIC49ICRibGFua2xpbmU7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJJGNvbnRlbnRzIC49ICQxIC4gIlxuIjsKKwkJCX0JCisgICAgICAgIAl9CisgICAgICAgICAgfQorICAgIH0KKyAgICBpZiAoJGluaXRpYWxfc2VjdGlvbl9jb3VudGVyID09ICRzZWN0aW9uX2NvdW50ZXIpIHsKKwlwcmludCBTVERFUlIgIldhcm5pbmcoJHtmaWxlfSk6IG5vIHN0cnVjdHVyZWQgY29tbWVudHMgZm91bmRcbiI7CisJaWYgKCRvdXRwdXRfbW9kZSBlcSAieG1sIikgeworCSAgICAjIFRoZSB0ZW1wbGF0ZSB3YW50cyBhdCBsZWFzdCBvbmUgUmVmRW50cnkgaGVyZTsgbWFrZSBvbmUuCisJICAgIHByaW50ICI8cmVmZW50cnk+XG4iOworCSAgICBwcmludCAiIDxyZWZuYW1lZGl2PlxuIjsKKwkgICAgcHJpbnQgIiAgPHJlZm5hbWU+XG4iOworCSAgICBwcmludCAiICAgJHtmaWxlfVxuIjsKKwkgICAgcHJpbnQgIiAgPC9yZWZuYW1lPlxuIjsKKwkgICAgcHJpbnQgIiAgPHJlZnB1cnBvc2U+XG4iOworCSAgICBwcmludCAiICAgRG9jdW1lbnQgZ2VuZXJhdGlvbiBpbmNvbnNpc3RlbmN5XG4iOworCSAgICBwcmludCAiICA8L3JlZnB1cnBvc2U+XG4iOworCSAgICBwcmludCAiIDwvcmVmbmFtZWRpdj5cbiI7CisJICAgIHByaW50ICIgPHJlZnNlY3QxPlxuIjsKKwkgICAgcHJpbnQgIiAgPHRpdGxlPlxuIjsKKwkgICAgcHJpbnQgIiAgIE9vcHNcbiI7CisJICAgIHByaW50ICIgIDwvdGl0bGU+XG4iOworCSAgICBwcmludCAiICA8d2FybmluZz5cbiI7CisJICAgIHByaW50ICIgICA8cGFyYT5cbiI7CisJICAgIHByaW50ICIgICAgVGhlIHRlbXBsYXRlIGZvciB0aGlzIGRvY3VtZW50IHRyaWVkIHRvIGluc2VydFxuIjsKKwkgICAgcHJpbnQgIiAgICB0aGUgc3RydWN0dXJlZCBjb21tZW50IGZyb20gdGhlIGZpbGVcbiI7CisJICAgIHByaW50ICIgICAgPGZpbGVuYW1lPiR7ZmlsZX08L2ZpbGVuYW1lPiBhdCB0aGlzIHBvaW50LFxuIjsKKwkgICAgcHJpbnQgIiAgICBidXQgbm9uZSB3YXMgZm91bmQuXG4iOworCSAgICBwcmludCAiICAgIFRoaXMgZHVtbXkgc2VjdGlvbiBpcyBpbnNlcnRlZCB0byBhbGxvd1xuIjsKKwkgICAgcHJpbnQgIiAgICBnZW5lcmF0aW9uIHRvIGNvbnRpbnVlLlxuIjsKKwkgICAgcHJpbnQgIiAgIDwvcGFyYT5cbiI7CisJICAgIHByaW50ICIgIDwvd2FybmluZz5cbiI7CisJICAgIHByaW50ICIgPC9yZWZzZWN0MT5cbiI7CisJICAgIHByaW50ICI8L3JlZmVudHJ5PlxuIjsKKwl9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9rc3ltb29wcy9SRUFETUUgYi9zY3JpcHRzL2tzeW1vb3BzL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmNiMDZlCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9rc3ltb29wcy9SRUFETUUKQEAgLTAsMCArMSw4IEBACitrc3ltb29wcyBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGtlcm5lbC4gIEl0IHdhcyBhbHdheXMgbWVhbnQgdG8gYmUgYQorZnJlZSBzdGFuZGluZyB1dGlsaXR5LCBub3QgbGlua2VkIHRvIGFueSBwYXJ0aWN1bGFyIGtlcm5lbCB2ZXJzaW9uLgorVGhlIGxhdGVzdCB2ZXJzaW9uIGNhbiBiZSBmb3VuZCBpbgorZnRwOi8vZnRwLjxjb3VudHJ5Pi5rZXJuZWwub3JnL3B1Yi9saW51eC91dGlscy9rZXJuZWwva3N5bW9vcHMgdG9nZXRoZXIKK3dpdGggcGF0Y2hlcyB0byBvdGhlciB1dGlsaXRpZXMgaW4gb3JkZXIgdG8gZ2l2ZSBtb3JlIGFjY3VyYXRlIE9vcHMKK2RlYnVnZ2luZy4KKworS2VpdGggT3dlbnMgPGthb3NAb2NzLmNvbS5hdT4gU2F0IEp1biAxOSAxMDozMDozNCBFU1QgMTk5OQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9seGRpYWxvZy9CSUcuRkFULldBUk5JTkcgYi9zY3JpcHRzL2x4ZGlhbG9nL0JJRy5GQVQuV0FSTklORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODk5OWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9seGRpYWxvZy9CSUcuRkFULldBUk5JTkcKQEAgLTAsMCArMSw0IEBACitUaGlzIGlzIE5PVCB0aGUgb2ZmaWNpYWwgdmVyc2lvbiBvZiBkaWFsb2cuICBUaGlzIHZlcnNpb24gaGFzIGJlZW4KK3NpZ25pZmljYW50bHkgbW9kaWZpZWQgZnJvbSB0aGUgb3JpZ2luYWwuICBJdCBpcyBmb3IgdXNlIGJ5IHRoZSBMaW51eAora2VybmVsIGNvbmZpZ3VyYXRpb24gc2NyaXB0LiAgUGxlYXNlIGRvIG5vdCBib3RoZXIgU2F2aW8gTGFtIHdpdGggCitxdWVzdGlvbnMgYWJvdXQgdGhpcyBwcm9ncmFtLgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9seGRpYWxvZy9NYWtlZmlsZSBiL3NjcmlwdHMvbHhkaWFsb2cvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ1YTEzZgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvbHhkaWFsb2cvTWFrZWZpbGUKQEAgLTAsMCArMSw0MiBAQAorSE9TVF9FWFRSQUNGTEFHUyA6PSAtRExPQ0FMRSAKK2lmZXEgKCQoc2hlbGwgdW5hbWUpLFN1bk9TKQorSE9TVF9MT0FETElCRVMgICA6PSAtbGN1cnNlcworZWxzZQorSE9TVF9MT0FETElCRVMgICA6PSAtbG5jdXJzZXMKK2VuZGlmCisKK2lmZXEgKC91c3IvaW5jbHVkZS9uY3Vyc2VzL25jdXJzZXMuaCwgJCh3aWxkY2FyZCAvdXNyL2luY2x1ZGUvbmN1cnNlcy9uY3Vyc2VzLmgpKQorICAgICAgICBIT1NUX0VYVFJBQ0ZMQUdTICs9IC1JL3Vzci9pbmNsdWRlL25jdXJzZXMgLURDVVJTRVNfTE9DPSI8bmN1cnNlcy5oPiIKK2Vsc2UKK2lmZXEgKC91c3IvaW5jbHVkZS9uY3Vyc2VzL2N1cnNlcy5oLCAkKHdpbGRjYXJkIC91c3IvaW5jbHVkZS9uY3Vyc2VzL2N1cnNlcy5oKSkKKyAgICAgICAgSE9TVF9FWFRSQUNGTEFHUyArPSAtSS91c3IvaW5jbHVkZS9uY3Vyc2VzIC1EQ1VSU0VTX0xPQz0iPG5jdXJzZXMvY3Vyc2VzLmg+IgorZWxzZQoraWZlcSAoL3Vzci9pbmNsdWRlL25jdXJzZXMuaCwgJCh3aWxkY2FyZCAvdXNyL2luY2x1ZGUvbmN1cnNlcy5oKSkKKyAgICAgICAgSE9TVF9FWFRSQUNGTEFHUyArPSAtRENVUlNFU19MT0M9IjxuY3Vyc2VzLmg+IgorZWxzZQorCUhPU1RfRVhUUkFDRkxBR1MgKz0gLURDVVJTRVNfTE9DPSI8Y3Vyc2VzLmg+IgorZW5kaWYKK2VuZGlmCitlbmRpZgorCitob3N0cHJvZ3MteQk6PSBseGRpYWxvZworYWx3YXlzCQk6PSBuY3Vyc2VzICQoaG9zdHByb2dzLXkpCisKK2x4ZGlhbG9nLW9ianMgOj0gY2hlY2tsaXN0Lm8gbWVudWJveC5vIHRleHRib3gubyB5ZXNuby5vIGlucHV0Ym94Lm8gXAorCQkgdXRpbC5vIGx4ZGlhbG9nLm8gbXNnYm94Lm8KKworLlBIT05ZOiAkKG9iaikvbmN1cnNlcworJChvYmopL25jdXJzZXM6CisJQGVjaG8gIm1haW4oKSB7fSIgPiBseHRlbXAuYworCUBpZiAkKEhPU1RDQykgbHh0ZW1wLmMgICQoSE9TVF9MT0FETElCRVMpOyB0aGVuIFwKKwkJcm0gLWYgbHh0ZW1wLmMgYS5vdXQ7IFwKKwllbHNlIFwKKwkJcm0gLWYgbHh0ZW1wLmM7IFwKKwkJZWNobyAtZSAiXDAwNyIgO1wKKwkJZWNobyAiPj4gVW5hYmxlIHRvIGZpbmQgdGhlIE5jdXJzZXMgbGlicmFyaWVzLiIgO1wKKwkJZWNobyAiPj4iIDtcCisJCWVjaG8gIj4+IFlvdSBtdXN0IGluc3RhbGwgbmN1cnNlcy1kZXZlbCBpbiBvcmRlciIgO1wKKwkJZWNobyAiPj4gdG8gdXNlICdtYWtlIG1lbnVjb25maWcnIiA7XAorCQllY2hvIDtcCisJCWV4aXQgMSA7XAorCWZpCmRpZmYgLS1naXQgYS9zY3JpcHRzL2x4ZGlhbG9nL2NoZWNrbGlzdC5jIGIvc2NyaXB0cy9seGRpYWxvZy9jaGVja2xpc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWJhMTdjCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9seGRpYWxvZy9jaGVja2xpc3QuYwpAQCAtMCwwICsxLDM3MyBAQAorLyoKKyAqICBjaGVja2xpc3QuYyAtLSBpbXBsZW1lbnRzIHRoZSBjaGVja2xpc3QgYm94CisgKgorICogIE9SSUdJTkFMIEFVVEhPUjogU2F2aW8gTGFtIChsYW04MzZAY3MuY3Voay5oaykKKyAqICAgICBTdHVhcnQgSGVyYmVydCAtIFMuSGVyYmVydEBzaGVmZmllbGQuYWMudWs6IHJhZGlvbGlzdCBleHRlbnNpb24KKyAqICAgICBBbGVzc2FuZHJvIFJ1YmluaSAtIHJ1YmluaUBpcHZ2aXMudW5pcHYuaXQ6IG1lcmdlZCB0aGUgdHdvCisgKiAgTU9ESUZJRUQgRk9SIExJTlVYIEtFUk5FTCBDT05GSUcgQlk6IFdpbGxpYW0gUm9hZGNhcCAocm9hZGNhcEBjZncuY29tKQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgImRpYWxvZy5oIgorCitzdGF0aWMgaW50IGxpc3Rfd2lkdGgsIGNoZWNrX3gsIGl0ZW1feCwgY2hlY2tmbGFnOworCisvKgorICogUHJpbnQgbGlzdCBpdGVtCisgKi8KK3N0YXRpYyB2b2lkCitwcmludF9pdGVtIChXSU5ET1cgKiB3aW4sIGNvbnN0IGNoYXIgKml0ZW0sIGludCBzdGF0dXMsCisJICAgIGludCBjaG9pY2UsIGludCBzZWxlY3RlZCkKK3sKKyAgICBpbnQgaTsKKworICAgIC8qIENsZWFyICdyZXNpZHVlJyBvZiBsYXN0IGl0ZW0gKi8KKyAgICB3YXR0cnNldCAod2luLCBtZW51Ym94X2F0dHIpOworICAgIHdtb3ZlICh3aW4sIGNob2ljZSwgMCk7CisgICAgZm9yIChpID0gMDsgaSA8IGxpc3Rfd2lkdGg7IGkrKykKKwl3YWRkY2ggKHdpbiwgJyAnKTsKKworICAgIHdtb3ZlICh3aW4sIGNob2ljZSwgY2hlY2tfeCk7CisgICAgd2F0dHJzZXQgKHdpbiwgc2VsZWN0ZWQgPyBjaGVja19zZWxlY3RlZF9hdHRyIDogY2hlY2tfYXR0cik7CisgICAgaWYgKGNoZWNrZmxhZyA9PSBGTEFHX0NIRUNLKQorCXdwcmludHcgKHdpbiwgIlslY10iLCBzdGF0dXMgPyAnWCcgOiAnICcpOworICAgIGVsc2UKKwl3cHJpbnR3ICh3aW4sICIoJWMpIiwgc3RhdHVzID8gJ1gnIDogJyAnKTsKKworICAgIHdhdHRyc2V0ICh3aW4sIHNlbGVjdGVkID8gdGFnX3NlbGVjdGVkX2F0dHIgOiB0YWdfYXR0cik7CisgICAgbXZ3YWRkY2god2luLCBjaG9pY2UsIGl0ZW1feCwgaXRlbVswXSk7CisgICAgd2F0dHJzZXQgKHdpbiwgc2VsZWN0ZWQgPyBpdGVtX3NlbGVjdGVkX2F0dHIgOiBpdGVtX2F0dHIpOworICAgIHdhZGRzdHIgKHdpbiwgKGNoYXIgKilpdGVtKzEpOworICAgIGlmIChzZWxlY3RlZCkgeworICAgIAl3bW92ZSAod2luLCBjaG9pY2UsIGNoZWNrX3grMSk7CisgICAgCXdyZWZyZXNoICh3aW4pOworICAgIH0KK30KKworLyoKKyAqIFByaW50IHRoZSBzY3JvbGwgaW5kaWNhdG9ycy4KKyAqLworc3RhdGljIHZvaWQKK3ByaW50X2Fycm93cyAoV0lORE9XICogd2luLCBpbnQgY2hvaWNlLCBpbnQgaXRlbV9ubywgaW50IHNjcm9sbCwKKwkJaW50IHksIGludCB4LCBpbnQgaGVpZ2h0KQoreworICAgIHdtb3ZlKHdpbiwgeSwgeCk7CisKKyAgICBpZiAoc2Nyb2xsID4gMCkgeworCXdhdHRyc2V0ICh3aW4sIHVhcnJvd19hdHRyKTsKKwl3YWRkY2ggKHdpbiwgQUNTX1VBUlJPVyk7CisJd2FkZHN0ciAod2luLCAiKC0pIik7CisgICAgfQorICAgIGVsc2UgeworCXdhdHRyc2V0ICh3aW4sIG1lbnVib3hfYXR0cik7CisJd2FkZGNoICh3aW4sIEFDU19ITElORSk7CisJd2FkZGNoICh3aW4sIEFDU19ITElORSk7CisJd2FkZGNoICh3aW4sIEFDU19ITElORSk7CisJd2FkZGNoICh3aW4sIEFDU19ITElORSk7CisgICAgfQorCisgICB5ID0geSArIGhlaWdodCArIDE7CisgICB3bW92ZSh3aW4sIHksIHgpOworCisgICBpZiAoKGhlaWdodCA8IGl0ZW1fbm8pICYmIChzY3JvbGwgKyBjaG9pY2UgPCBpdGVtX25vIC0gMSkpIHsKKwl3YXR0cnNldCAod2luLCBkYXJyb3dfYXR0cik7CisJd2FkZGNoICh3aW4sIEFDU19EQVJST1cpOworCXdhZGRzdHIgKHdpbiwgIigrKSIpOworICAgIH0KKyAgICBlbHNlIHsKKwl3YXR0cnNldCAod2luLCBtZW51Ym94X2JvcmRlcl9hdHRyKTsKKwl3YWRkY2ggKHdpbiwgQUNTX0hMSU5FKTsKKwl3YWRkY2ggKHdpbiwgQUNTX0hMSU5FKTsKKwl3YWRkY2ggKHdpbiwgQUNTX0hMSU5FKTsKKwl3YWRkY2ggKHdpbiwgQUNTX0hMSU5FKTsKKyAgIH0KK30KKworLyoKKyAqICBEaXNwbGF5IHRoZSB0ZXJtaW5hdGlvbiBidXR0b25zCisgKi8KK3N0YXRpYyB2b2lkCitwcmludF9idXR0b25zKCBXSU5ET1cgKmRpYWxvZywgaW50IGhlaWdodCwgaW50IHdpZHRoLCBpbnQgc2VsZWN0ZWQpCit7CisgICAgaW50IHggPSB3aWR0aCAvIDIgLSAxMTsKKyAgICBpbnQgeSA9IGhlaWdodCAtIDI7CisKKyAgICBwcmludF9idXR0b24gKGRpYWxvZywgIlNlbGVjdCIsIHksIHgsIHNlbGVjdGVkID09IDApOworICAgIHByaW50X2J1dHRvbiAoZGlhbG9nLCAiIEhlbHAgIiwgeSwgeCArIDE0LCBzZWxlY3RlZCA9PSAxKTsKKworICAgIHdtb3ZlKGRpYWxvZywgeSwgeCsxICsgMTQqc2VsZWN0ZWQpOworICAgIHdyZWZyZXNoIChkaWFsb2cpOworfQorCisvKgorICogRGlzcGxheSBhIGRpYWxvZyBib3ggd2l0aCBhIGxpc3Qgb2Ygb3B0aW9ucyB0aGF0IGNhbiBiZSB0dXJuZWQgb24gb3Igb2ZmCisgKiBUaGUgYGZsYWcnIHBhcmFtZXRlciBpcyB1c2VkIHRvIHNlbGVjdCBiZXR3ZWVuIHJhZGlvbGlzdCBhbmQgY2hlY2tsaXN0LgorICovCitpbnQKK2RpYWxvZ19jaGVja2xpc3QgKGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCBoZWlnaHQsIGludCB3aWR0aCwKKwlpbnQgbGlzdF9oZWlnaHQsIGludCBpdGVtX25vLCBjb25zdCBjaGFyICogY29uc3QgKiBpdGVtcywgaW50IGZsYWcpCisJCit7CisgICAgaW50IGksIHgsIHksIGJveF94LCBib3hfeTsKKyAgICBpbnQga2V5ID0gMCwgYnV0dG9uID0gMCwgY2hvaWNlID0gMCwgc2Nyb2xsID0gMCwgbWF4X2Nob2ljZSwgKnN0YXR1czsKKyAgICBXSU5ET1cgKmRpYWxvZywgKmxpc3Q7CisKKyAgICBjaGVja2ZsYWcgPSBmbGFnOworCisgICAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHN0b3JpbmcgaXRlbSBvbi9vZmYgc3RhdHVzICovCisgICAgaWYgKChzdGF0dXMgPSBtYWxsb2MgKHNpemVvZiAoaW50KSAqIGl0ZW1fbm8pKSA9PSBOVUxMKSB7CisJZW5kd2luICgpOworCWZwcmludGYgKHN0ZGVyciwKKwkJICJcbkNhbid0IGFsbG9jYXRlIG1lbW9yeSBpbiBkaWFsb2dfY2hlY2tsaXN0KCkuXG4iKTsKKwlleGl0ICgtMSk7CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZXMgc3RhdHVzICovCisgICAgZm9yIChpID0gMDsgaSA8IGl0ZW1fbm87IGkrKykgeworCXN0YXR1c1tpXSA9ICFzdHJjYXNlY21wIChpdGVtc1tpICogMyArIDJdLCAib24iKTsKKwlpZiAoKCFjaG9pY2UgJiYgc3RhdHVzW2ldKSB8fCAhc3RyY2FzZWNtcCAoaXRlbXNbaSAqIDMgKyAyXSwgInNlbGVjdGVkIikpCisgICAgICAgICAgICBjaG9pY2UgPSBpICsgMTsKKyAgICB9CisgICAgaWYgKGNob2ljZSkKKwkgICAgY2hvaWNlLS07CisKKyAgICBtYXhfY2hvaWNlID0gTUlOIChsaXN0X2hlaWdodCwgaXRlbV9ubyk7CisKKyAgICAvKiBjZW50ZXIgZGlhbG9nIGJveCBvbiBzY3JlZW4gKi8KKyAgICB4ID0gKENPTFMgLSB3aWR0aCkgLyAyOworICAgIHkgPSAoTElORVMgLSBoZWlnaHQpIC8gMjsKKworICAgIGRyYXdfc2hhZG93IChzdGRzY3IsIHksIHgsIGhlaWdodCwgd2lkdGgpOworCisgICAgZGlhbG9nID0gbmV3d2luIChoZWlnaHQsIHdpZHRoLCB5LCB4KTsKKyAgICBrZXlwYWQgKGRpYWxvZywgVFJVRSk7CisKKyAgICBkcmF3X2JveCAoZGlhbG9nLCAwLCAwLCBoZWlnaHQsIHdpZHRoLCBkaWFsb2dfYXR0ciwgYm9yZGVyX2F0dHIpOworICAgIHdhdHRyc2V0IChkaWFsb2csIGJvcmRlcl9hdHRyKTsKKyAgICBtdndhZGRjaCAoZGlhbG9nLCBoZWlnaHQtMywgMCwgQUNTX0xURUUpOworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aCAtIDI7IGkrKykKKwl3YWRkY2ggKGRpYWxvZywgQUNTX0hMSU5FKTsKKyAgICB3YXR0cnNldCAoZGlhbG9nLCBkaWFsb2dfYXR0cik7CisgICAgd2FkZGNoIChkaWFsb2csIEFDU19SVEVFKTsKKworICAgIGlmICh0aXRsZSAhPSBOVUxMICYmIHN0cmxlbih0aXRsZSkgPj0gd2lkdGgtMiApIHsKKwkvKiB0cnVuY2F0ZSBsb25nIHRpdGxlIC0tIG1lYyAqLworCWNoYXIgKiB0aXRsZTIgPSBtYWxsb2Mod2lkdGgtMisxKTsKKwltZW1jcHkoIHRpdGxlMiwgdGl0bGUsIHdpZHRoLTIgKTsKKwl0aXRsZTJbd2lkdGgtMl0gPSAnXDAnOworCXRpdGxlID0gdGl0bGUyOworICAgIH0KKworICAgIGlmICh0aXRsZSAhPSBOVUxMKSB7CisJd2F0dHJzZXQgKGRpYWxvZywgdGl0bGVfYXR0cik7CisJbXZ3YWRkY2ggKGRpYWxvZywgMCwgKHdpZHRoIC0gc3RybGVuKHRpdGxlKSkvMiAtIDEsICcgJyk7CisJd2FkZHN0ciAoZGlhbG9nLCAoY2hhciAqKXRpdGxlKTsKKwl3YWRkY2ggKGRpYWxvZywgJyAnKTsKKyAgICB9CisKKyAgICB3YXR0cnNldCAoZGlhbG9nLCBkaWFsb2dfYXR0cik7CisgICAgcHJpbnRfYXV0b3dyYXAgKGRpYWxvZywgcHJvbXB0LCB3aWR0aCAtIDIsIDEsIDMpOworCisgICAgbGlzdF93aWR0aCA9IHdpZHRoIC0gNjsKKyAgICBib3hfeSA9IGhlaWdodCAtIGxpc3RfaGVpZ2h0IC0gNTsKKyAgICBib3hfeCA9ICh3aWR0aCAtIGxpc3Rfd2lkdGgpIC8gMiAtIDE7CisKKyAgICAvKiBjcmVhdGUgbmV3IHdpbmRvdyBmb3IgdGhlIGxpc3QgKi8KKyAgICBsaXN0ID0gc3Vid2luIChkaWFsb2csIGxpc3RfaGVpZ2h0LCBsaXN0X3dpZHRoLCB5K2JveF95KzEsIHgrYm94X3grMSk7CisKKyAgICBrZXlwYWQgKGxpc3QsIFRSVUUpOworCisgICAgLyogZHJhdyBhIGJveCBhcm91bmQgdGhlIGxpc3QgaXRlbXMgKi8KKyAgICBkcmF3X2JveCAoZGlhbG9nLCBib3hfeSwgYm94X3gsIGxpc3RfaGVpZ2h0ICsgMiwgbGlzdF93aWR0aCArIDIsCisJICAgICAgbWVudWJveF9ib3JkZXJfYXR0ciwgbWVudWJveF9hdHRyKTsKKworICAgIC8qIEZpbmQgbGVuZ3RoIG9mIGxvbmdlc3QgaXRlbSBpbiBvcmRlciB0byBjZW50ZXIgY2hlY2tsaXN0ICovCisgICAgY2hlY2tfeCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGl0ZW1fbm87IGkrKykgCisJY2hlY2tfeCA9IE1BWCAoY2hlY2tfeCwgKyBzdHJsZW4gKGl0ZW1zW2kgKiAzICsgMV0pICsgNCk7CisKKyAgICBjaGVja194ID0gKGxpc3Rfd2lkdGggLSBjaGVja194KSAvIDI7CisgICAgaXRlbV94ID0gY2hlY2tfeCArIDQ7CisKKyAgICBpZiAoY2hvaWNlID49IGxpc3RfaGVpZ2h0KSB7CisJc2Nyb2xsID0gY2hvaWNlIC0gbGlzdF9oZWlnaHQgKyAxOworCWNob2ljZSAtPSBzY3JvbGw7CisgICAgfQorCisgICAgLyogUHJpbnQgdGhlIGxpc3QgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbWF4X2Nob2ljZTsgaSsrKSB7CisJcHJpbnRfaXRlbSAobGlzdCwgaXRlbXNbKHNjcm9sbCtpKSAqIDMgKyAxXSwKKwkJICAgIHN0YXR1c1tpK3Njcm9sbF0sIGksIGkgPT0gY2hvaWNlKTsKKyAgICB9CisKKyAgICBwcmludF9hcnJvd3MoZGlhbG9nLCBjaG9pY2UsIGl0ZW1fbm8sIHNjcm9sbCwKKwkJCWJveF95LCBib3hfeCArIGNoZWNrX3ggKyA1LCBsaXN0X2hlaWdodCk7CisKKyAgICBwcmludF9idXR0b25zKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCwgMCk7CisKKyAgICB3bm91dHJlZnJlc2ggKGxpc3QpOworICAgIHdub3V0cmVmcmVzaCAoZGlhbG9nKTsKKyAgICBkb3VwZGF0ZSAoKTsKKworICAgIHdoaWxlIChrZXkgIT0gRVNDKSB7CisJa2V5ID0gd2dldGNoIChkaWFsb2cpOworCisgICAgCWZvciAoaSA9IDA7IGkgPCBtYXhfY2hvaWNlOyBpKyspCisgICAgICAgICAgICBpZiAodG91cHBlcihrZXkpID09IHRvdXBwZXIoaXRlbXNbKHNjcm9sbCtpKSozKzFdWzBdKSkKKyAgICAgICAgICAgICAgICBicmVhazsKKworCisJaWYgKCBpIDwgbWF4X2Nob2ljZSB8fCBrZXkgPT0gS0VZX1VQIHx8IGtleSA9PSBLRVlfRE9XTiB8fCAKKwkgICAga2V5ID09ICcrJyB8fCBrZXkgPT0gJy0nICkgeworCSAgICBpZiAoa2V5ID09IEtFWV9VUCB8fCBrZXkgPT0gJy0nKSB7CisJCWlmICghY2hvaWNlKSB7CisJCSAgICBpZiAoIXNjcm9sbCkKKwkJCWNvbnRpbnVlOworCQkgICAgLyogU2Nyb2xsIGxpc3QgZG93biAqLworCQkgICAgaWYgKGxpc3RfaGVpZ2h0ID4gMSkgeworCQkJLyogRGUtaGlnaGxpZ2h0IGN1cnJlbnQgZmlyc3QgaXRlbSAqLworCQkJcHJpbnRfaXRlbSAobGlzdCwgaXRlbXNbc2Nyb2xsICogMyArIDFdLAorCQkJCQlzdGF0dXNbc2Nyb2xsXSwgMCwgRkFMU0UpOworCQkJc2Nyb2xsb2sgKGxpc3QsIFRSVUUpOworCQkJd3NjcmwgKGxpc3QsIC0xKTsKKwkJCXNjcm9sbG9rIChsaXN0LCBGQUxTRSk7CisJCSAgICB9CisJCSAgICBzY3JvbGwtLTsKKwkJICAgIHByaW50X2l0ZW0gKGxpc3QsIGl0ZW1zW3Njcm9sbCAqIDMgKyAxXSwKKwkJCQlzdGF0dXNbc2Nyb2xsXSwgMCwgVFJVRSk7CisJCSAgICB3bm91dHJlZnJlc2ggKGxpc3QpOworCisgICAgCQkgICAgcHJpbnRfYXJyb3dzKGRpYWxvZywgY2hvaWNlLCBpdGVtX25vLCBzY3JvbGwsCisJCQkJYm94X3ksIGJveF94ICsgY2hlY2tfeCArIDUsIGxpc3RfaGVpZ2h0KTsKKworCQkgICAgd3JlZnJlc2ggKGRpYWxvZyk7CisKKwkJICAgIGNvbnRpbnVlOwkvKiB3YWl0IGZvciBhbm90aGVyIGtleSBwcmVzcyAqLworCQl9IGVsc2UKKwkJICAgIGkgPSBjaG9pY2UgLSAxOworCSAgICB9IGVsc2UgaWYgKGtleSA9PSBLRVlfRE9XTiB8fCBrZXkgPT0gJysnKSB7CisJCWlmIChjaG9pY2UgPT0gbWF4X2Nob2ljZSAtIDEpIHsKKwkJICAgIGlmIChzY3JvbGwgKyBjaG9pY2UgPj0gaXRlbV9ubyAtIDEpCisJCQljb250aW51ZTsKKwkJICAgIC8qIFNjcm9sbCBsaXN0IHVwICovCisJCSAgICBpZiAobGlzdF9oZWlnaHQgPiAxKSB7CisJCQkvKiBEZS1oaWdobGlnaHQgY3VycmVudCBsYXN0IGl0ZW0gYmVmb3JlIHNjcm9sbGluZyB1cCAqLworCQkJcHJpbnRfaXRlbSAobGlzdCwgaXRlbXNbKHNjcm9sbCArIG1heF9jaG9pY2UgLSAxKSAqIDMgKyAxXSwKKwkJCQkgICAgc3RhdHVzW3Njcm9sbCArIG1heF9jaG9pY2UgLSAxXSwKKwkJCQkgICAgbWF4X2Nob2ljZSAtIDEsIEZBTFNFKTsKKwkJCXNjcm9sbG9rIChsaXN0LCBUUlVFKTsKKwkJCXdzY3JsIChsaXN0LCAxKTsKKwkJCXNjcm9sbG9rIChsaXN0LCBGQUxTRSk7CisJCSAgICB9CisJCSAgICBzY3JvbGwrKzsKKwkJICAgIHByaW50X2l0ZW0gKGxpc3QsIGl0ZW1zWyhzY3JvbGwgKyBtYXhfY2hvaWNlIC0gMSkgKiAzICsgMV0sCisJCQkJc3RhdHVzW3Njcm9sbCArIG1heF9jaG9pY2UgLSAxXSwKKwkJCQltYXhfY2hvaWNlIC0gMSwgVFJVRSk7CisJCSAgICB3bm91dHJlZnJlc2ggKGxpc3QpOworCisgICAgCQkgICAgcHJpbnRfYXJyb3dzKGRpYWxvZywgY2hvaWNlLCBpdGVtX25vLCBzY3JvbGwsCisJCQkJYm94X3ksIGJveF94ICsgY2hlY2tfeCArIDUsIGxpc3RfaGVpZ2h0KTsKKworCQkgICAgd3JlZnJlc2ggKGRpYWxvZyk7CisKKwkJICAgIGNvbnRpbnVlOwkvKiB3YWl0IGZvciBhbm90aGVyIGtleSBwcmVzcyAqLworCQl9IGVsc2UKKwkJICAgIGkgPSBjaG9pY2UgKyAxOworCSAgICB9CisJICAgIGlmIChpICE9IGNob2ljZSkgeworCQkvKiBEZS1oaWdobGlnaHQgY3VycmVudCBpdGVtICovCisJCXByaW50X2l0ZW0gKGxpc3QsIGl0ZW1zWyhzY3JvbGwgKyBjaG9pY2UpICogMyArIDFdLAorCQkJICAgIHN0YXR1c1tzY3JvbGwgKyBjaG9pY2VdLCBjaG9pY2UsIEZBTFNFKTsKKwkJLyogSGlnaGxpZ2h0IG5ldyBpdGVtICovCisJCWNob2ljZSA9IGk7CisJCXByaW50X2l0ZW0gKGxpc3QsIGl0ZW1zWyhzY3JvbGwgKyBjaG9pY2UpICogMyArIDFdLAorCQkJICAgIHN0YXR1c1tzY3JvbGwgKyBjaG9pY2VdLCBjaG9pY2UsIFRSVUUpOworCQl3bm91dHJlZnJlc2ggKGxpc3QpOworCQl3cmVmcmVzaCAoZGlhbG9nKTsKKwkgICAgfQorCSAgICBjb250aW51ZTsJCS8qIHdhaXQgZm9yIGFub3RoZXIga2V5IHByZXNzICovCisJfQorCXN3aXRjaCAoa2V5KSB7CisJY2FzZSAnSCc6CisJY2FzZSAnaCc6CisJY2FzZSAnPyc6CisJICAgIGZwcmludGYgKHN0ZGVyciwgIiVzIiwgaXRlbXNbKHNjcm9sbCArIGNob2ljZSkgKiAzXSk7CisJICAgIGRlbHdpbiAoZGlhbG9nKTsKKwkgICAgZnJlZSAoc3RhdHVzKTsKKwkgICAgcmV0dXJuIDE7CisJY2FzZSBUQUI6CisJY2FzZSBLRVlfTEVGVDoKKwljYXNlIEtFWV9SSUdIVDoKKwkgICAgYnV0dG9uID0gKChrZXkgPT0gS0VZX0xFRlQgPyAtLWJ1dHRvbiA6ICsrYnV0dG9uKSA8IDApCisJCQk/IDEgOiAoYnV0dG9uID4gMSA/IDAgOiBidXR0b24pOworCisJICAgIHByaW50X2J1dHRvbnMoZGlhbG9nLCBoZWlnaHQsIHdpZHRoLCBidXR0b24pOworCSAgICB3cmVmcmVzaCAoZGlhbG9nKTsKKwkgICAgYnJlYWs7CisJY2FzZSAnUyc6CisJY2FzZSAncyc6CisJY2FzZSAnICc6CisJY2FzZSAnXG4nOgorCSAgICBpZiAoIWJ1dHRvbikgeworCQlpZiAoZmxhZyA9PSBGTEFHX0NIRUNLKSB7CisJCSAgICBzdGF0dXNbc2Nyb2xsICsgY2hvaWNlXSA9ICFzdGF0dXNbc2Nyb2xsICsgY2hvaWNlXTsKKwkJICAgIHdtb3ZlIChsaXN0LCBjaG9pY2UsIGNoZWNrX3gpOworCQkgICAgd2F0dHJzZXQgKGxpc3QsIGNoZWNrX3NlbGVjdGVkX2F0dHIpOworCQkgICAgd3ByaW50dyAobGlzdCwgIlslY10iLCBzdGF0dXNbc2Nyb2xsICsgY2hvaWNlXSA/ICdYJyA6ICcgJyk7CisJCX0gZWxzZSB7CisJCSAgICBpZiAoIXN0YXR1c1tzY3JvbGwgKyBjaG9pY2VdKSB7CisJCQlmb3IgKGkgPSAwOyBpIDwgaXRlbV9ubzsgaSsrKQorCQkJICAgIHN0YXR1c1tpXSA9IDA7CisJCQlzdGF0dXNbc2Nyb2xsICsgY2hvaWNlXSA9IDE7CisJCQlmb3IgKGkgPSAwOyBpIDwgbWF4X2Nob2ljZTsgaSsrKQorCQkJICAgIHByaW50X2l0ZW0gKGxpc3QsIGl0ZW1zWyhzY3JvbGwgKyBpKSAqIDMgKyAxXSwKKwkJCQkJc3RhdHVzW3Njcm9sbCArIGldLCBpLCBpID09IGNob2ljZSk7CisJCSAgICB9CisJCX0KKwkJd25vdXRyZWZyZXNoIChsaXN0KTsKKwkJd3JlZnJlc2ggKGRpYWxvZyk7CisgICAgICAgICAgICAKKwkJZm9yIChpID0gMDsgaSA8IGl0ZW1fbm87IGkrKykgeworCQkgICAgaWYgKHN0YXR1c1tpXSkgeworCQkJaWYgKGZsYWcgPT0gRkxBR19DSEVDSykgeworCQkJICAgIGZwcmludGYgKHN0ZGVyciwgIlwiJXNcIiAiLCBpdGVtc1tpICogM10pOworCQkJfSBlbHNlIHsKKwkJCSAgICBmcHJpbnRmIChzdGRlcnIsICIlcyIsIGl0ZW1zW2kgKiAzXSk7CisJCQl9CisKKwkJICAgIH0KKwkJfQorICAgICAgICAgICAgfSBlbHNlCisJCWZwcmludGYgKHN0ZGVyciwgIiVzIiwgaXRlbXNbKHNjcm9sbCArIGNob2ljZSkgKiAzXSk7CisJICAgIGRlbHdpbiAoZGlhbG9nKTsKKwkgICAgZnJlZSAoc3RhdHVzKTsKKwkgICAgcmV0dXJuIGJ1dHRvbjsKKwljYXNlICdYJzoKKwljYXNlICd4JzoKKwkgICAga2V5ID0gRVNDOworCWNhc2UgRVNDOgorCSAgICBicmVhazsKKwl9CisKKwkvKiBOb3csIHVwZGF0ZSBldmVyeXRoaW5nLi4uICovCisJZG91cGRhdGUgKCk7CisgICAgfQorICAgIAorCisgICAgZGVsd2luIChkaWFsb2cpOworICAgIGZyZWUgKHN0YXR1cyk7CisgICAgcmV0dXJuIC0xOwkJCS8qIEVTQyBwcmVzc2VkICovCit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2x4ZGlhbG9nL2NvbG9ycy5oIGIvc2NyaXB0cy9seGRpYWxvZy9jb2xvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWM1OTUyCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9seGRpYWxvZy9jb2xvcnMuaApAQCAtMCwwICsxLDE1NSBAQAorLyoKKyAqICBjb2xvcnMuaCAtLSBjb2xvciBhdHRyaWJ1dGUgZGVmaW5pdGlvbnMKKyAqCisgKiAgQVVUSE9SOiBTYXZpbyBMYW0gKGxhbTgzNkBjcy5jdWhrLmhrKQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworCisvKgorICogICBEZWZhdWx0IGNvbG9yIGRlZmluaXRpb25zCisgKgorICogICAqX0ZHID0gZm9yZWdyb3VuZAorICogICAqX0JHID0gYmFja2dyb3VuZAorICogICAqX0hMID0gaGlnaGxpZ2h0PworICovCisjZGVmaW5lIFNDUkVFTl9GRyAgICAgICAgICAgICAgICAgICAgQ09MT1JfQ1lBTgorI2RlZmluZSBTQ1JFRU5fQkcgICAgICAgICAgICAgICAgICAgIENPTE9SX0JMVUUKKyNkZWZpbmUgU0NSRUVOX0hMICAgICAgICAgICAgICAgICAgICBUUlVFCisKKyNkZWZpbmUgU0hBRE9XX0ZHICAgICAgICAgICAgICAgICAgICBDT0xPUl9CTEFDSworI2RlZmluZSBTSEFET1dfQkcgICAgICAgICAgICAgICAgICAgIENPTE9SX0JMQUNLCisjZGVmaW5lIFNIQURPV19ITCAgICAgICAgICAgICAgICAgICAgVFJVRQorCisjZGVmaW5lIERJQUxPR19GRyAgICAgICAgICAgICAgICAgICAgQ09MT1JfQkxBQ0sKKyNkZWZpbmUgRElBTE9HX0JHICAgICAgICAgICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBESUFMT0dfSEwgICAgICAgICAgICAgICAgICAgIEZBTFNFCisKKyNkZWZpbmUgVElUTEVfRkcgICAgICAgICAgICAgICAgICAgICBDT0xPUl9ZRUxMT1cKKyNkZWZpbmUgVElUTEVfQkcgICAgICAgICAgICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBUSVRMRV9ITCAgICAgICAgICAgICAgICAgICAgIFRSVUUKKworI2RlZmluZSBCT1JERVJfRkcgICAgICAgICAgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIEJPUkRFUl9CRyAgICAgICAgICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgQk9SREVSX0hMICAgICAgICAgICAgICAgICAgICBUUlVFCisKKyNkZWZpbmUgQlVUVE9OX0FDVElWRV9GRyAgICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBCVVRUT05fQUNUSVZFX0JHICAgICAgICAgICAgIENPTE9SX0JMVUUKKyNkZWZpbmUgQlVUVE9OX0FDVElWRV9ITCAgICAgICAgICAgICBUUlVFCisKKyNkZWZpbmUgQlVUVE9OX0lOQUNUSVZFX0ZHICAgICAgICAgICBDT0xPUl9CTEFDSworI2RlZmluZSBCVVRUT05fSU5BQ1RJVkVfQkcgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIEJVVFRPTl9JTkFDVElWRV9ITCAgICAgICAgICAgRkFMU0UKKworI2RlZmluZSBCVVRUT05fS0VZX0FDVElWRV9GRyAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIEJVVFRPTl9LRVlfQUNUSVZFX0JHICAgICAgICAgQ09MT1JfQkxVRQorI2RlZmluZSBCVVRUT05fS0VZX0FDVElWRV9ITCAgICAgICAgIFRSVUUKKworI2RlZmluZSBCVVRUT05fS0VZX0lOQUNUSVZFX0ZHICAgICAgIENPTE9SX1JFRAorI2RlZmluZSBCVVRUT05fS0VZX0lOQUNUSVZFX0JHICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIEJVVFRPTl9LRVlfSU5BQ1RJVkVfSEwgICAgICAgRkFMU0UKKworI2RlZmluZSBCVVRUT05fTEFCRUxfQUNUSVZFX0ZHICAgICAgIENPTE9SX1lFTExPVworI2RlZmluZSBCVVRUT05fTEFCRUxfQUNUSVZFX0JHICAgICAgIENPTE9SX0JMVUUKKyNkZWZpbmUgQlVUVE9OX0xBQkVMX0FDVElWRV9ITCAgICAgICBUUlVFCisKKyNkZWZpbmUgQlVUVE9OX0xBQkVMX0lOQUNUSVZFX0ZHICAgICBDT0xPUl9CTEFDSworI2RlZmluZSBCVVRUT05fTEFCRUxfSU5BQ1RJVkVfQkcgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIEJVVFRPTl9MQUJFTF9JTkFDVElWRV9ITCAgICAgVFJVRQorCisjZGVmaW5lIElOUFVUQk9YX0ZHICAgICAgICAgICAgICAgICAgQ09MT1JfQkxBQ0sKKyNkZWZpbmUgSU5QVVRCT1hfQkcgICAgICAgICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBJTlBVVEJPWF9ITCAgICAgICAgICAgICAgICAgIEZBTFNFCisKKyNkZWZpbmUgSU5QVVRCT1hfQk9SREVSX0ZHICAgICAgICAgICBDT0xPUl9CTEFDSworI2RlZmluZSBJTlBVVEJPWF9CT1JERVJfQkcgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIElOUFVUQk9YX0JPUkRFUl9ITCAgICAgICAgICAgRkFMU0UKKworI2RlZmluZSBTRUFSQ0hCT1hfRkcgICAgICAgICAgICAgICAgIENPTE9SX0JMQUNLCisjZGVmaW5lIFNFQVJDSEJPWF9CRyAgICAgICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgU0VBUkNIQk9YX0hMICAgICAgICAgICAgICAgICBGQUxTRQorCisjZGVmaW5lIFNFQVJDSEJPWF9USVRMRV9GRyAgICAgICAgICAgQ09MT1JfWUVMTE9XCisjZGVmaW5lIFNFQVJDSEJPWF9USVRMRV9CRyAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgU0VBUkNIQk9YX1RJVExFX0hMICAgICAgICAgICBUUlVFCisKKyNkZWZpbmUgU0VBUkNIQk9YX0JPUkRFUl9GRyAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBTRUFSQ0hCT1hfQk9SREVSX0JHICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIFNFQVJDSEJPWF9CT1JERVJfSEwgICAgICAgICAgVFJVRQorCisjZGVmaW5lIFBPU0lUSU9OX0lORElDQVRPUl9GRyAgICAgICAgQ09MT1JfWUVMTE9XCisjZGVmaW5lIFBPU0lUSU9OX0lORElDQVRPUl9CRyAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgUE9TSVRJT05fSU5ESUNBVE9SX0hMICAgICAgICBUUlVFCisKKyNkZWZpbmUgTUVOVUJPWF9GRyAgICAgICAgICAgICAgICAgICBDT0xPUl9CTEFDSworI2RlZmluZSBNRU5VQk9YX0JHICAgICAgICAgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIE1FTlVCT1hfSEwgICAgICAgICAgICAgICAgICAgRkFMU0UKKworI2RlZmluZSBNRU5VQk9YX0JPUkRFUl9GRyAgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIE1FTlVCT1hfQk9SREVSX0JHICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgTUVOVUJPWF9CT1JERVJfSEwgICAgICAgICAgICBUUlVFCisKKyNkZWZpbmUgSVRFTV9GRyAgICAgICAgICAgICAgICAgICAgICBDT0xPUl9CTEFDSworI2RlZmluZSBJVEVNX0JHICAgICAgICAgICAgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIElURU1fSEwgICAgICAgICAgICAgICAgICAgICAgRkFMU0UKKworI2RlZmluZSBJVEVNX1NFTEVDVEVEX0ZHICAgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIElURU1fU0VMRUNURURfQkcgICAgICAgICAgICAgQ09MT1JfQkxVRQorI2RlZmluZSBJVEVNX1NFTEVDVEVEX0hMICAgICAgICAgICAgIFRSVUUKKworI2RlZmluZSBUQUdfRkcgICAgICAgICAgICAgICAgICAgICAgIENPTE9SX1lFTExPVworI2RlZmluZSBUQUdfQkcgICAgICAgICAgICAgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIFRBR19ITCAgICAgICAgICAgICAgICAgICAgICAgVFJVRQorCisjZGVmaW5lIFRBR19TRUxFQ1RFRF9GRyAgICAgICAgICAgICAgQ09MT1JfWUVMTE9XCisjZGVmaW5lIFRBR19TRUxFQ1RFRF9CRyAgICAgICAgICAgICAgQ09MT1JfQkxVRQorI2RlZmluZSBUQUdfU0VMRUNURURfSEwgICAgICAgICAgICAgIFRSVUUKKworI2RlZmluZSBUQUdfS0VZX0ZHICAgICAgICAgICAgICAgICAgIENPTE9SX1lFTExPVworI2RlZmluZSBUQUdfS0VZX0JHICAgICAgICAgICAgICAgICAgIENPTE9SX1dISVRFCisjZGVmaW5lIFRBR19LRVlfSEwgICAgICAgICAgICAgICAgICAgVFJVRQorCisjZGVmaW5lIFRBR19LRVlfU0VMRUNURURfRkcgICAgICAgICAgQ09MT1JfWUVMTE9XCisjZGVmaW5lIFRBR19LRVlfU0VMRUNURURfQkcgICAgICAgICAgQ09MT1JfQkxVRQorI2RlZmluZSBUQUdfS0VZX1NFTEVDVEVEX0hMICAgICAgICAgIFRSVUUKKworI2RlZmluZSBDSEVDS19GRyAgICAgICAgICAgICAgICAgICAgIENPTE9SX0JMQUNLCisjZGVmaW5lIENIRUNLX0JHICAgICAgICAgICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgQ0hFQ0tfSEwgICAgICAgICAgICAgICAgICAgICBGQUxTRQorCisjZGVmaW5lIENIRUNLX1NFTEVDVEVEX0ZHICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgQ0hFQ0tfU0VMRUNURURfQkcgICAgICAgICAgICBDT0xPUl9CTFVFCisjZGVmaW5lIENIRUNLX1NFTEVDVEVEX0hMICAgICAgICAgICAgVFJVRQorCisjZGVmaW5lIFVBUlJPV19GRyAgICAgICAgICAgICAgICAgICAgQ09MT1JfR1JFRU4KKyNkZWZpbmUgVUFSUk9XX0JHICAgICAgICAgICAgICAgICAgICBDT0xPUl9XSElURQorI2RlZmluZSBVQVJST1dfSEwgICAgICAgICAgICAgICAgICAgIFRSVUUKKworI2RlZmluZSBEQVJST1dfRkcgICAgICAgICAgICAgICAgICAgIENPTE9SX0dSRUVOCisjZGVmaW5lIERBUlJPV19CRyAgICAgICAgICAgICAgICAgICAgQ09MT1JfV0hJVEUKKyNkZWZpbmUgREFSUk9XX0hMICAgICAgICAgICAgICAgICAgICBUUlVFCisKKy8qIEVuZCBvZiBkZWZhdWx0IGNvbG9yIGRlZmluaXRpb25zICovCisKKyNkZWZpbmUgQ19BVFRSKHgseSkgICAgICAgICAgICAgICAgICAoKHggPyBBX0JPTEQgOiAwKSB8IENPTE9SX1BBSVIoKHkpKSkKKyNkZWZpbmUgQ09MT1JfTkFNRV9MRU4gICAgICAgICAgICAgICAxMAorI2RlZmluZSBDT0xPUl9DT1VOVCAgICAgICAgICAgICAgICAgIDgKKworLyoKKyAqIEdsb2JhbCB2YXJpYWJsZXMKKyAqLworCitleHRlcm4gaW50IGNvbG9yX3RhYmxlW11bM107CmRpZmYgLS1naXQgYS9zY3JpcHRzL2x4ZGlhbG9nL2RpYWxvZy5oIGIvc2NyaXB0cy9seGRpYWxvZy9kaWFsb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTcxNTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9seGRpYWxvZy9kaWFsb2cuaApAQCAtMCwwICsxLDE4NyBAQAorCisvKgorICogIGRpYWxvZy5oIC0tIGNvbW1vbiBkZWNsYXJhdGlvbnMgZm9yIGFsbCBkaWFsb2cgbW9kdWxlcworICoKKyAqICBBVVRIT1I6IFNhdmlvIExhbSAobGFtODM2QGNzLmN1aGsuaGspCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaWZkZWYgX19zdW5fXworI2RlZmluZSBDVVJTX01BQ1JPUworI2VuZGlmCisjaW5jbHVkZSBDVVJTRVNfTE9DCisKKy8qCisgKiBDb2xvcnMgaW4gbmN1cnNlcyAxLjkuOWUgZG8gbm90IHdvcmsgcHJvcGVybHkgc2luY2UgZm9yZWdyb3VuZCBhbmQKKyAqIGJhY2tncm91bmQgY29sb3JzIGFyZSBPUidkIHJhdGhlciB0aGFuIHNlcGFyYXRlbHkgbWFza2VkLiAgVGhpcyB2ZXJzaW9uCisgKiBvZiBkaWFsb2cgd2FzIGhhY2tlZCB0byB3b3JrIHdpdGggbmN1cnNlcyAxLjkuOWUsIG1ha2luZyBpdCBpbmNvbXBhdGlibGUKKyAqIHdpdGggc3RhbmRhcmQgY3Vyc2VzLiAgVGhlIHNpbXBsZXN0IGZpeCAodG8gbWFrZSB0aGlzIHdvcmsgd2l0aCBzdGFuZGFyZAorICogY3Vyc2VzKSB1c2VzIHRoZSB3YmtnZHNldCgpIGZ1bmN0aW9uLCBub3QgdXNlZCBpbiB0aGUgb3JpZ2luYWwgaGFjay4KKyAqIFR1cm4gaXQgb2ZmIGlmIHdlJ3JlIGJ1aWxkaW5nIHdpdGggMS45LjllLCBzaW5jZSBpdCBqdXN0IGNvbmZ1c2VzIHRoaW5ncy4KKyAqLworI2lmIGRlZmluZWQoTkNVUlNFU19WRVJTSU9OKSAmJiBkZWZpbmVkKF9ORUVEX1dSQVApICYmICFkZWZpbmVkKEdDQ19QUklOVEZMSUtFKQorI2RlZmluZSBPTERfTkNVUlNFUyAxCisjdW5kZWYgIHdia2dkc2V0CisjZGVmaW5lIHdia2dkc2V0KHcscCkgLypub3RoaW5nKi8KKyNlbHNlCisjZGVmaW5lIE9MRF9OQ1VSU0VTIDAKKyNlbmRpZgorCisjZGVmaW5lIFRSKHBhcmFtcykgX3RyYWNlZiBwYXJhbXMKKworI2RlZmluZSBFU0MgMjcKKyNkZWZpbmUgVEFCIDkKKyNkZWZpbmUgTUFYX0xFTiAyMDQ4CisjZGVmaW5lIEJVRl9TSVpFICgxMCoxMDI0KQorI2RlZmluZSBNSU4oeCx5KSAoeCA8IHkgPyB4IDogeSkKKyNkZWZpbmUgTUFYKHgseSkgKHggPiB5ID8geCA6IHkpCisKKworI2lmbmRlZiBBQ1NfVUxDT1JORVIKKyNkZWZpbmUgQUNTX1VMQ09STkVSICcrJworI2VuZGlmCisjaWZuZGVmIEFDU19MTENPUk5FUgorI2RlZmluZSBBQ1NfTExDT1JORVIgJysnCisjZW5kaWYKKyNpZm5kZWYgQUNTX1VSQ09STkVSCisjZGVmaW5lIEFDU19VUkNPUk5FUiAnKycKKyNlbmRpZgorI2lmbmRlZiBBQ1NfTFJDT1JORVIKKyNkZWZpbmUgQUNTX0xSQ09STkVSICcrJworI2VuZGlmCisjaWZuZGVmIEFDU19ITElORQorI2RlZmluZSBBQ1NfSExJTkUgJy0nCisjZW5kaWYKKyNpZm5kZWYgQUNTX1ZMSU5FCisjZGVmaW5lIEFDU19WTElORSAnfCcKKyNlbmRpZgorI2lmbmRlZiBBQ1NfTFRFRQorI2RlZmluZSBBQ1NfTFRFRSAnKycKKyNlbmRpZgorI2lmbmRlZiBBQ1NfUlRFRQorI2RlZmluZSBBQ1NfUlRFRSAnKycKKyNlbmRpZgorI2lmbmRlZiBBQ1NfVUFSUk9XCisjZGVmaW5lIEFDU19VQVJST1cgJ14nCisjZW5kaWYKKyNpZm5kZWYgQUNTX0RBUlJPVworI2RlZmluZSBBQ1NfREFSUk9XICd2JworI2VuZGlmCisKKy8qIAorICogQXR0cmlidXRlIG5hbWVzCisgKi8KKyNkZWZpbmUgc2NyZWVuX2F0dHIgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1swXQorI2RlZmluZSBzaGFkb3dfYXR0ciAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzWzFdCisjZGVmaW5lIGRpYWxvZ19hdHRyICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNbMl0KKyNkZWZpbmUgdGl0bGVfYXR0ciAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlc1szXQorI2RlZmluZSBib3JkZXJfYXR0ciAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzWzRdCisjZGVmaW5lIGJ1dHRvbl9hY3RpdmVfYXR0ciAgICAgICAgICAgIGF0dHJpYnV0ZXNbNV0KKyNkZWZpbmUgYnV0dG9uX2luYWN0aXZlX2F0dHIgICAgICAgICAgYXR0cmlidXRlc1s2XQorI2RlZmluZSBidXR0b25fa2V5X2FjdGl2ZV9hdHRyICAgICAgICBhdHRyaWJ1dGVzWzddCisjZGVmaW5lIGJ1dHRvbl9rZXlfaW5hY3RpdmVfYXR0ciAgICAgIGF0dHJpYnV0ZXNbOF0KKyNkZWZpbmUgYnV0dG9uX2xhYmVsX2FjdGl2ZV9hdHRyICAgICAgYXR0cmlidXRlc1s5XQorI2RlZmluZSBidXR0b25fbGFiZWxfaW5hY3RpdmVfYXR0ciAgICBhdHRyaWJ1dGVzWzEwXQorI2RlZmluZSBpbnB1dGJveF9hdHRyICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzWzExXQorI2RlZmluZSBpbnB1dGJveF9ib3JkZXJfYXR0ciAgICAgICAgICBhdHRyaWJ1dGVzWzEyXQorI2RlZmluZSBzZWFyY2hib3hfYXR0ciAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzWzEzXQorI2RlZmluZSBzZWFyY2hib3hfdGl0bGVfYXR0ciAgICAgICAgICBhdHRyaWJ1dGVzWzE0XQorI2RlZmluZSBzZWFyY2hib3hfYm9yZGVyX2F0dHIgICAgICAgICBhdHRyaWJ1dGVzWzE1XQorI2RlZmluZSBwb3NpdGlvbl9pbmRpY2F0b3JfYXR0ciAgICAgICBhdHRyaWJ1dGVzWzE2XQorI2RlZmluZSBtZW51Ym94X2F0dHIgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzWzE3XQorI2RlZmluZSBtZW51Ym94X2JvcmRlcl9hdHRyICAgICAgICAgICBhdHRyaWJ1dGVzWzE4XQorI2RlZmluZSBpdGVtX2F0dHIgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzWzE5XQorI2RlZmluZSBpdGVtX3NlbGVjdGVkX2F0dHIgICAgICAgICAgICBhdHRyaWJ1dGVzWzIwXQorI2RlZmluZSB0YWdfYXR0ciAgICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzWzIxXQorI2RlZmluZSB0YWdfc2VsZWN0ZWRfYXR0ciAgICAgICAgICAgICBhdHRyaWJ1dGVzWzIyXQorI2RlZmluZSB0YWdfa2V5X2F0dHIgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzWzIzXQorI2RlZmluZSB0YWdfa2V5X3NlbGVjdGVkX2F0dHIgICAgICAgICBhdHRyaWJ1dGVzWzI0XQorI2RlZmluZSBjaGVja19hdHRyICAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzWzI1XQorI2RlZmluZSBjaGVja19zZWxlY3RlZF9hdHRyICAgICAgICAgICBhdHRyaWJ1dGVzWzI2XQorI2RlZmluZSB1YXJyb3dfYXR0ciAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzWzI3XQorI2RlZmluZSBkYXJyb3dfYXR0ciAgICAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzWzI4XQorCisvKiBudW1iZXIgb2YgYXR0cmlidXRlcyAqLworI2RlZmluZSBBVFRSSUJVVEVfQ09VTlQgICAgICAgICAgICAgICAyOQorCisvKgorICogR2xvYmFsIHZhcmlhYmxlcworICovCitleHRlcm4gYm9vbCB1c2VfY29sb3JzOworZXh0ZXJuIGJvb2wgdXNlX3NoYWRvdzsKKworZXh0ZXJuIGNodHlwZSBhdHRyaWJ1dGVzW107CisKK2V4dGVybiBjb25zdCBjaGFyICpiYWNrdGl0bGU7CisKKy8qCisgKiBGdW5jdGlvbiBwcm90b3R5cGVzCisgKi8KK2V4dGVybiB2b2lkIGNyZWF0ZV9yYyAoY29uc3QgY2hhciAqZmlsZW5hbWUpOworZXh0ZXJuIGludCBwYXJzZV9yYyAodm9pZCk7CisKKwordm9pZCBpbml0X2RpYWxvZyAodm9pZCk7Cit2b2lkIGVuZF9kaWFsb2cgKHZvaWQpOwordm9pZCBhdHRyX2NsZWFyIChXSU5ET1cgKiB3aW4sIGludCBoZWlnaHQsIGludCB3aWR0aCwgY2h0eXBlIGF0dHIpOwordm9pZCBkaWFsb2dfY2xlYXIgKHZvaWQpOwordm9pZCBjb2xvcl9zZXR1cCAodm9pZCk7Cit2b2lkIHByaW50X2F1dG93cmFwIChXSU5ET1cgKiB3aW4sIGNvbnN0IGNoYXIgKnByb21wdCwgaW50IHdpZHRoLCBpbnQgeSwgaW50IHgpOwordm9pZCBwcmludF9idXR0b24gKFdJTkRPVyAqIHdpbiwgY29uc3QgY2hhciAqbGFiZWwsIGludCB5LCBpbnQgeCwgaW50IHNlbGVjdGVkKTsKK3ZvaWQgZHJhd19ib3ggKFdJTkRPVyAqIHdpbiwgaW50IHksIGludCB4LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsIGNodHlwZSBib3gsCisJCWNodHlwZSBib3JkZXIpOwordm9pZCBkcmF3X3NoYWRvdyAoV0lORE9XICogd2luLCBpbnQgeSwgaW50IHgsIGludCBoZWlnaHQsIGludCB3aWR0aCk7CisKK2ludCBmaXJzdF9hbHBoYSAoY29uc3QgY2hhciAqc3RyaW5nLCBjb25zdCBjaGFyICpleGVtcHQpOworaW50IGRpYWxvZ195ZXNubyAoY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKnByb21wdCwgaW50IGhlaWdodCwgaW50IHdpZHRoKTsKK2ludCBkaWFsb2dfbXNnYm94IChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgaGVpZ2h0LAorCQlpbnQgd2lkdGgsIGludCBwYXVzZSk7CitpbnQgZGlhbG9nX3RleHRib3ggKGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpmaWxlLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpOworaW50IGRpYWxvZ19tZW51IChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsCisJCWludCBtZW51X2hlaWdodCwgY29uc3QgY2hhciAqY2hvaWNlLCBpbnQgaXRlbV9ubywgCisJCWNvbnN0IGNoYXIgKiBjb25zdCAqIGl0ZW1zKTsKK2ludCBkaWFsb2dfY2hlY2tsaXN0IChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgaGVpZ2h0LAorCQlpbnQgd2lkdGgsIGludCBsaXN0X2hlaWdodCwgaW50IGl0ZW1fbm8sCisJCWNvbnN0IGNoYXIgKiBjb25zdCAqIGl0ZW1zLCBpbnQgZmxhZyk7CitleHRlcm4gdW5zaWduZWQgY2hhciBkaWFsb2dfaW5wdXRfcmVzdWx0W107CitpbnQgZGlhbG9nX2lucHV0Ym94IChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgaGVpZ2h0LAorCQlpbnQgd2lkdGgsIGNvbnN0IGNoYXIgKmluaXQpOworCisvKgorICogVGhpcyBpcyB0aGUgYmFzZSBmb3IgZmljdGl0aW91cyBrZXlzLCB3aGljaCBhY3RpdmF0ZQorICogdGhlIGJ1dHRvbnMuCisgKgorICogTW91c2UtZ2VuZXJhdGVkIGtleXMgYXJlIHRoZSBmb2xsb3dpbmc6CisgKiAgIC0tIHRoZSBmaXJzdCAzMiBhcmUgdXNlZCBhcyBudW1iZXJzLCBpbiBhZGRpdGlvbiB0byAnMCctJzknCisgKiAgIC0tIHRoZSBsb3dlcmNhc2UgYXJlIHVzZWQgdG8gc2lnbmFsIG1vdXNlLWVudGVyIGV2ZW50cyAoTV9FVkVOVCArICdvJykKKyAqICAgLS0gdXBwZXJjYXNlIGNoYXJzIGFyZSB1c2VkIHRvIGludm9rZSB0aGUgYnV0dG9uIChNX0VWRU5UICsgJ08nKQorICovCisjZGVmaW5lIE1fRVZFTlQgKEtFWV9NQVgrMSkKKworCisvKgorICogVGhlIGBmbGFnJyBwYXJhbWV0ZXIgaW4gY2hlY2tsaXN0IGlzIHVzZWQgdG8gc2VsZWN0IGJldHdlZW4KKyAqIHJhZGlvbGlzdCBhbmQgY2hlY2tsaXN0CisgKi8KKyNkZWZpbmUgRkxBR19DSEVDSyAxCisjZGVmaW5lIEZMQUdfUkFESU8gMApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9seGRpYWxvZy9pbnB1dGJveC5jIGIvc2NyaXB0cy9seGRpYWxvZy9pbnB1dGJveC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhN2JlYmMKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2x4ZGlhbG9nL2lucHV0Ym94LmMKQEAgLTAsMCArMSwyNDAgQEAKKy8qCisgKiAgaW5wdXRib3guYyAtLSBpbXBsZW1lbnRzIHRoZSBpbnB1dCBib3gKKyAqCisgKiAgT1JJR0lOQUwgQVVUSE9SOiBTYXZpbyBMYW0gKGxhbTgzNkBjcy5jdWhrLmhrKQorICogIE1PRElGSUVEIEZPUiBMSU5VWCBLRVJORUwgQ09ORklHIEJZOiBXaWxsaWFtIFJvYWRjYXAgKHJvYWRjYXBAY2Z3LmNvbSkKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlICJkaWFsb2cuaCIKKwordW5zaWduZWQgY2hhciBkaWFsb2dfaW5wdXRfcmVzdWx0W01BWF9MRU4gKyAxXTsKKworLyoKKyAqICBQcmludCB0aGUgdGVybWluYXRpb24gYnV0dG9ucworICovCitzdGF0aWMgdm9pZAorcHJpbnRfYnV0dG9ucyhXSU5ET1cgKmRpYWxvZywgaW50IGhlaWdodCwgaW50IHdpZHRoLCBpbnQgc2VsZWN0ZWQpCit7CisgICAgaW50IHggPSB3aWR0aCAvIDIgLSAxMTsKKyAgICBpbnQgeSA9IGhlaWdodCAtIDI7CisKKyAgICBwcmludF9idXR0b24gKGRpYWxvZywgIiAgT2sgICIsIHksIHgsIHNlbGVjdGVkPT0wKTsKKyAgICBwcmludF9idXR0b24gKGRpYWxvZywgIiBIZWxwICIsIHksIHggKyAxNCwgc2VsZWN0ZWQ9PTEpOworCisgICAgd21vdmUoZGlhbG9nLCB5LCB4KzErMTQqc2VsZWN0ZWQpOworICAgIHdyZWZyZXNoKGRpYWxvZyk7Cit9CisKKy8qCisgKiBEaXNwbGF5IGEgZGlhbG9nIGJveCBmb3IgaW5wdXRpbmcgYSBzdHJpbmcKKyAqLworaW50CitkaWFsb2dfaW5wdXRib3ggKGNvbnN0IGNoYXIgKnRpdGxlLCBjb25zdCBjaGFyICpwcm9tcHQsIGludCBoZWlnaHQsIGludCB3aWR0aCwKKwkJIGNvbnN0IGNoYXIgKmluaXQpCit7CisgICAgaW50IGksIHgsIHksIGJveF95LCBib3hfeCwgYm94X3dpZHRoOworICAgIGludCBpbnB1dF94ID0gMCwgc2Nyb2xsID0gMCwga2V5ID0gMCwgYnV0dG9uID0gLTE7CisgICAgdW5zaWduZWQgY2hhciAqaW5zdHIgPSBkaWFsb2dfaW5wdXRfcmVzdWx0OworICAgIFdJTkRPVyAqZGlhbG9nOworCisgICAgLyogY2VudGVyIGRpYWxvZyBib3ggb24gc2NyZWVuICovCisgICAgeCA9IChDT0xTIC0gd2lkdGgpIC8gMjsKKyAgICB5ID0gKExJTkVTIC0gaGVpZ2h0KSAvIDI7CisKKworICAgIGRyYXdfc2hhZG93IChzdGRzY3IsIHksIHgsIGhlaWdodCwgd2lkdGgpOworCisgICAgZGlhbG9nID0gbmV3d2luIChoZWlnaHQsIHdpZHRoLCB5LCB4KTsKKyAgICBrZXlwYWQgKGRpYWxvZywgVFJVRSk7CisKKyAgICBkcmF3X2JveCAoZGlhbG9nLCAwLCAwLCBoZWlnaHQsIHdpZHRoLCBkaWFsb2dfYXR0ciwgYm9yZGVyX2F0dHIpOworICAgIHdhdHRyc2V0IChkaWFsb2csIGJvcmRlcl9hdHRyKTsKKyAgICBtdndhZGRjaCAoZGlhbG9nLCBoZWlnaHQtMywgMCwgQUNTX0xURUUpOworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aCAtIDI7IGkrKykKKwl3YWRkY2ggKGRpYWxvZywgQUNTX0hMSU5FKTsKKyAgICB3YXR0cnNldCAoZGlhbG9nLCBkaWFsb2dfYXR0cik7CisgICAgd2FkZGNoIChkaWFsb2csIEFDU19SVEVFKTsKKworICAgIGlmICh0aXRsZSAhPSBOVUxMICYmIHN0cmxlbih0aXRsZSkgPj0gd2lkdGgtMiApIHsKKwkvKiB0cnVuY2F0ZSBsb25nIHRpdGxlIC0tIG1lYyAqLworCWNoYXIgKiB0aXRsZTIgPSBtYWxsb2Mod2lkdGgtMisxKTsKKwltZW1jcHkoIHRpdGxlMiwgdGl0bGUsIHdpZHRoLTIgKTsKKwl0aXRsZTJbd2lkdGgtMl0gPSAnXDAnOworCXRpdGxlID0gdGl0bGUyOworICAgIH0KKworICAgIGlmICh0aXRsZSAhPSBOVUxMKSB7CisJd2F0dHJzZXQgKGRpYWxvZywgdGl0bGVfYXR0cik7CisJbXZ3YWRkY2ggKGRpYWxvZywgMCwgKHdpZHRoIC0gc3RybGVuKHRpdGxlKSkvMiAtIDEsICcgJyk7CisJd2FkZHN0ciAoZGlhbG9nLCAoY2hhciAqKXRpdGxlKTsKKwl3YWRkY2ggKGRpYWxvZywgJyAnKTsKKyAgICB9CisKKyAgICB3YXR0cnNldCAoZGlhbG9nLCBkaWFsb2dfYXR0cik7CisgICAgcHJpbnRfYXV0b3dyYXAgKGRpYWxvZywgcHJvbXB0LCB3aWR0aCAtIDIsIDEsIDMpOworCisgICAgLyogRHJhdyB0aGUgaW5wdXQgZmllbGQgYm94ICovCisgICAgYm94X3dpZHRoID0gd2lkdGggLSA2OworICAgIGdldHl4IChkaWFsb2csIHksIHgpOworICAgIGJveF95ID0geSArIDI7CisgICAgYm94X3ggPSAod2lkdGggLSBib3hfd2lkdGgpIC8gMjsKKyAgICBkcmF3X2JveCAoZGlhbG9nLCB5ICsgMSwgYm94X3ggLSAxLCAzLCBib3hfd2lkdGggKyAyLAorCSAgICAgIGJvcmRlcl9hdHRyLCBkaWFsb2dfYXR0cik7CisKKyAgICBwcmludF9idXR0b25zKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCwgMCk7CisKKyAgICAvKiBTZXQgdXAgdGhlIGluaXRpYWwgdmFsdWUgKi8KKyAgICB3bW92ZSAoZGlhbG9nLCBib3hfeSwgYm94X3gpOworICAgIHdhdHRyc2V0IChkaWFsb2csIGlucHV0Ym94X2F0dHIpOworCisgICAgaWYgKCFpbml0KQorCWluc3RyWzBdID0gJ1wwJzsKKyAgICBlbHNlCisJc3RyY3B5IChpbnN0ciwgaW5pdCk7CisKKyAgICBpbnB1dF94ID0gc3RybGVuIChpbnN0cik7CisKKyAgICBpZiAoaW5wdXRfeCA+PSBib3hfd2lkdGgpIHsKKwlzY3JvbGwgPSBpbnB1dF94IC0gYm94X3dpZHRoICsgMTsKKwlpbnB1dF94ID0gYm94X3dpZHRoIC0gMTsKKwlmb3IgKGkgPSAwOyBpIDwgYm94X3dpZHRoIC0gMTsgaSsrKQorCSAgICB3YWRkY2ggKGRpYWxvZywgaW5zdHJbc2Nyb2xsICsgaV0pOworICAgIH0gZWxzZQorCXdhZGRzdHIgKGRpYWxvZywgaW5zdHIpOworCisgICAgd21vdmUgKGRpYWxvZywgYm94X3ksIGJveF94ICsgaW5wdXRfeCk7CisKKyAgICB3cmVmcmVzaCAoZGlhbG9nKTsKKworICAgIHdoaWxlIChrZXkgIT0gRVNDKSB7CisJa2V5ID0gd2dldGNoIChkaWFsb2cpOworCisJaWYgKGJ1dHRvbiA9PSAtMSkgewkvKiBJbnB1dCBib3ggc2VsZWN0ZWQgKi8KKwkgICAgc3dpdGNoIChrZXkpIHsKKwkgICAgY2FzZSBUQUI6CisJICAgIGNhc2UgS0VZX1VQOgorCSAgICBjYXNlIEtFWV9ET1dOOgorCQlicmVhazsKKwkgICAgY2FzZSBLRVlfTEVGVDoKKwkJY29udGludWU7CisJICAgIGNhc2UgS0VZX1JJR0hUOgorCQljb250aW51ZTsKKwkgICAgY2FzZSBLRVlfQkFDS1NQQUNFOgorCSAgICBjYXNlIDEyNzoKKwkJaWYgKGlucHV0X3ggfHwgc2Nyb2xsKSB7CisJCSAgICB3YXR0cnNldCAoZGlhbG9nLCBpbnB1dGJveF9hdHRyKTsKKwkJICAgIGlmICghaW5wdXRfeCkgeworCQkJc2Nyb2xsID0gc2Nyb2xsIDwgYm94X3dpZHRoIC0gMSA/CisJCQkgICAgMCA6IHNjcm9sbCAtIChib3hfd2lkdGggLSAxKTsKKwkJCXdtb3ZlIChkaWFsb2csIGJveF95LCBib3hfeCk7CisJCQlmb3IgKGkgPSAwOyBpIDwgYm94X3dpZHRoOyBpKyspCisJCQkgICAgd2FkZGNoIChkaWFsb2csIGluc3RyW3Njcm9sbCArIGlucHV0X3ggKyBpXSA/CisJCQkJICAgIGluc3RyW3Njcm9sbCArIGlucHV0X3ggKyBpXSA6ICcgJyk7CisJCQlpbnB1dF94ID0gc3RybGVuIChpbnN0cikgLSBzY3JvbGw7CisJCSAgICB9IGVsc2UKKwkJCWlucHV0X3gtLTsKKwkJICAgIGluc3RyW3Njcm9sbCArIGlucHV0X3hdID0gJ1wwJzsKKwkJICAgIG12d2FkZGNoIChkaWFsb2csIGJveF95LCBpbnB1dF94ICsgYm94X3gsICcgJyk7CisJCSAgICB3bW92ZSAoZGlhbG9nLCBib3hfeSwgaW5wdXRfeCArIGJveF94KTsKKwkJICAgIHdyZWZyZXNoIChkaWFsb2cpOworCQl9CisJCWNvbnRpbnVlOworCSAgICBkZWZhdWx0OgorCQlpZiAoa2V5IDwgMHgxMDAgJiYgaXNwcmludCAoa2V5KSkgeworCQkgICAgaWYgKHNjcm9sbCArIGlucHV0X3ggPCBNQVhfTEVOKSB7CisJCQl3YXR0cnNldCAoZGlhbG9nLCBpbnB1dGJveF9hdHRyKTsKKwkJCWluc3RyW3Njcm9sbCArIGlucHV0X3hdID0ga2V5OworCQkJaW5zdHJbc2Nyb2xsICsgaW5wdXRfeCArIDFdID0gJ1wwJzsKKwkJCWlmIChpbnB1dF94ID09IGJveF93aWR0aCAtIDEpIHsKKwkJCSAgICBzY3JvbGwrKzsKKwkJCSAgICB3bW92ZSAoZGlhbG9nLCBib3hfeSwgYm94X3gpOworCQkJICAgIGZvciAoaSA9IDA7IGkgPCBib3hfd2lkdGggLSAxOyBpKyspCisJCQkJd2FkZGNoIChkaWFsb2csIGluc3RyW3Njcm9sbCArIGldKTsKKwkJCX0gZWxzZSB7CisJCQkgICAgd21vdmUgKGRpYWxvZywgYm94X3ksIGlucHV0X3grKyArIGJveF94KTsKKwkJCSAgICB3YWRkY2ggKGRpYWxvZywga2V5KTsKKwkJCX0KKwkJCXdyZWZyZXNoIChkaWFsb2cpOworCQkgICAgfSBlbHNlCisJCQlmbGFzaCAoKTsJLyogQWxhcm0gdXNlciBhYm91dCBvdmVyZmxvdyAqLworCQkgICAgY29udGludWU7CisJCX0KKwkgICAgfQorCX0KKwlzd2l0Y2ggKGtleSkgeworCWNhc2UgJ08nOgorCWNhc2UgJ28nOgorCSAgICBkZWx3aW4gKGRpYWxvZyk7CisJICAgIHJldHVybiAwOworCWNhc2UgJ0gnOgorCWNhc2UgJ2gnOgorCSAgICBkZWx3aW4gKGRpYWxvZyk7CisJICAgIHJldHVybiAxOworCWNhc2UgS0VZX1VQOgorCWNhc2UgS0VZX0xFRlQ6CisJICAgIHN3aXRjaCAoYnV0dG9uKSB7CisJICAgIGNhc2UgLTE6CisJCWJ1dHRvbiA9IDE7CS8qIEluZGljYXRlcyAiQ2FuY2VsIiBidXR0b24gaXMgc2VsZWN0ZWQgKi8KKwkJcHJpbnRfYnV0dG9ucyhkaWFsb2csIGhlaWdodCwgd2lkdGgsIDEpOworCQlicmVhazsKKwkgICAgY2FzZSAwOgorCQlidXR0b24gPSAtMTsJLyogSW5kaWNhdGVzIGlucHV0IGJveCBpcyBzZWxlY3RlZCAqLworCQlwcmludF9idXR0b25zKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCwgMCk7CisJCXdtb3ZlIChkaWFsb2csIGJveF95LCBib3hfeCArIGlucHV0X3gpOworCQl3cmVmcmVzaCAoZGlhbG9nKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgMToKKwkJYnV0dG9uID0gMDsJLyogSW5kaWNhdGVzICJPSyIgYnV0dG9uIGlzIHNlbGVjdGVkICovCisJCXByaW50X2J1dHRvbnMoZGlhbG9nLCBoZWlnaHQsIHdpZHRoLCAwKTsKKwkJYnJlYWs7CisJICAgIH0KKwkgICAgYnJlYWs7CisJY2FzZSBUQUI6CisJY2FzZSBLRVlfRE9XTjoKKwljYXNlIEtFWV9SSUdIVDoKKwkgICAgc3dpdGNoIChidXR0b24pIHsKKwkgICAgY2FzZSAtMToKKwkJYnV0dG9uID0gMDsJLyogSW5kaWNhdGVzICJPSyIgYnV0dG9uIGlzIHNlbGVjdGVkICovCisJCXByaW50X2J1dHRvbnMoZGlhbG9nLCBoZWlnaHQsIHdpZHRoLCAwKTsKKwkJYnJlYWs7CisJICAgIGNhc2UgMDoKKwkJYnV0dG9uID0gMTsJLyogSW5kaWNhdGVzICJDYW5jZWwiIGJ1dHRvbiBpcyBzZWxlY3RlZCAqLworCQlwcmludF9idXR0b25zKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCwgMSk7CisJCWJyZWFrOworCSAgICBjYXNlIDE6CisJCWJ1dHRvbiA9IC0xOwkvKiBJbmRpY2F0ZXMgaW5wdXQgYm94IGlzIHNlbGVjdGVkICovCisJCXByaW50X2J1dHRvbnMoZGlhbG9nLCBoZWlnaHQsIHdpZHRoLCAwKTsKKwkJd21vdmUgKGRpYWxvZywgYm94X3ksIGJveF94ICsgaW5wdXRfeCk7CisJCXdyZWZyZXNoIChkaWFsb2cpOworCQlicmVhazsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlICcgJzoKKwljYXNlICdcbic6CisJICAgIGRlbHdpbiAoZGlhbG9nKTsKKwkgICAgcmV0dXJuIChidXR0b24gPT0gLTEgPyAwIDogYnV0dG9uKTsKKwljYXNlICdYJzoKKwljYXNlICd4JzoKKwkgICAga2V5ID0gRVNDOworCWNhc2UgRVNDOgorCSAgICBicmVhazsKKwl9CisgICAgfQorCisgICAgZGVsd2luIChkaWFsb2cpOworICAgIHJldHVybiAtMTsJCQkvKiBFU0MgcHJlc3NlZCAqLworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9seGRpYWxvZy9seGRpYWxvZy5jIGIvc2NyaXB0cy9seGRpYWxvZy9seGRpYWxvZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyODNhODUKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2x4ZGlhbG9nL2x4ZGlhbG9nLmMKQEAgLTAsMCArMSwyMjYgQEAKKy8qCisgKiAgZGlhbG9nIC0gRGlzcGxheSBzaW1wbGUgZGlhbG9nIGJveGVzIGZyb20gc2hlbGwgc2NyaXB0cworICoKKyAqICBPUklHSU5BTCBBVVRIT1I6IFNhdmlvIExhbSAobGFtODM2QGNzLmN1aGsuaGspCisgKiAgTU9ESUZJRUQgRk9SIExJTlVYIEtFUk5FTCBDT05GSUcgQlk6IFdpbGxpYW0gUm9hZGNhcCAocm9hZGNhcEBjZncuY29tKQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgImRpYWxvZy5oIgorCitzdGF0aWMgdm9pZCBVc2FnZSAoY29uc3QgY2hhciAqbmFtZSk7CisKK3R5cGVkZWYgaW50IChqdW1wZXJGbikgKGNvbnN0IGNoYXIgKnRpdGxlLCBpbnQgYXJnYywgY29uc3QgY2hhciAqIGNvbnN0ICogYXJndik7CisKK3N0cnVjdCBNb2RlIHsKKyAgICBjaGFyICpuYW1lOworICAgIGludCBhcmdtaW4sIGFyZ21heCwgYXJnbW9kOworICAgIGp1bXBlckZuICpqdW1wZXI7Cit9OworCitqdW1wZXJGbiBqX21lbnUsIGpfY2hlY2tsaXN0LCBqX3JhZGlvbGlzdCwgal95ZXNubywgal90ZXh0Ym94LCBqX2lucHV0Ym94OworanVtcGVyRm4gal9tc2dib3gsIGpfaW5mb2JveDsKKworc3RhdGljIHN0cnVjdCBNb2RlIG1vZGVzW10gPQoreworICAgIHsiLS1tZW51IiwgOSwgMCwgMywgal9tZW51fSwKKyAgICB7Ii0tY2hlY2tsaXN0IiwgOSwgMCwgMywgal9jaGVja2xpc3R9LAorICAgIHsiLS1yYWRpb2xpc3QiLCA5LCAwLCAzLCBqX3JhZGlvbGlzdH0sCisgICAgeyItLXllc25vIiwgICAgNSw1LDEsIGpfeWVzbm99LAorICAgIHsiLS10ZXh0Ym94IiwgIDUsNSwxLCBqX3RleHRib3h9LAorICAgIHsiLS1pbnB1dGJveCIsIDUsIDYsIDEsIGpfaW5wdXRib3h9LAorICAgIHsiLS1tc2dib3giLCA1LCA1LCAxLCBqX21zZ2JveH0sCisgICAgeyItLWluZm9ib3giLCA1LCA1LCAxLCBqX2luZm9ib3h9LAorICAgIHtOVUxMLCAwLCAwLCAwLCBOVUxMfQorfTsKKworc3RhdGljIHN0cnVjdCBNb2RlICptb2RlUHRyOworCisjaWZkZWYgTE9DQUxFCisjaW5jbHVkZSA8bG9jYWxlLmg+CisjZW5kaWYKKworaW50CittYWluIChpbnQgYXJnYywgY29uc3QgY2hhciAqIGNvbnN0ICogYXJndikKK3sKKyAgICBpbnQgb2Zmc2V0ID0gMCwgb3B0X2NsZWFyID0gMCwgZW5kX2NvbW1vbl9vcHRzID0gMCwgcmV0dmFsOworICAgIGNvbnN0IGNoYXIgKnRpdGxlID0gTlVMTDsKKworI2lmZGVmIExPQ0FMRQorICAgICh2b2lkKSBzZXRsb2NhbGUgKExDX0FMTCwgIiIpOworI2VuZGlmCisKKyNpZmRlZiBUUkFDRQorICAgIHRyYWNlKFRSQUNFX0NBTExTfFRSQUNFX1VQREFURSk7CisjZW5kaWYKKyAgICBpZiAoYXJnYyA8IDIpIHsKKwlVc2FnZSAoYXJndlswXSk7CisJZXhpdCAoLTEpOworICAgIH0KKworICAgIHdoaWxlIChvZmZzZXQgPCBhcmdjIC0gMSAmJiAhZW5kX2NvbW1vbl9vcHRzKSB7CS8qIENvbW1vbiBvcHRpb25zICovCisJaWYgKCFzdHJjbXAgKGFyZ3Zbb2Zmc2V0ICsgMV0sICItLXRpdGxlIikpIHsKKwkgICAgaWYgKGFyZ2MgLSBvZmZzZXQgPCAzIHx8IHRpdGxlICE9IE5VTEwpIHsKKwkJVXNhZ2UgKGFyZ3ZbMF0pOworCQlleGl0ICgtMSk7CisJICAgIH0gZWxzZSB7CisJCXRpdGxlID0gYXJndltvZmZzZXQgKyAyXTsKKwkJb2Zmc2V0ICs9IDI7CisJICAgIH0KKyAgICAgICAgfSBlbHNlIGlmICghc3RyY21wIChhcmd2W29mZnNldCArIDFdLCAiLS1iYWNrdGl0bGUiKSkgeworICAgICAgICAgICAgaWYgKGJhY2t0aXRsZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgVXNhZ2UgKGFyZ3ZbMF0pOworICAgICAgICAgICAgICAgIGV4aXQgKC0xKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYmFja3RpdGxlID0gYXJndltvZmZzZXQgKyAyXTsKKyAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMjsKKyAgICAgICAgICAgIH0KKwl9IGVsc2UgaWYgKCFzdHJjbXAgKGFyZ3Zbb2Zmc2V0ICsgMV0sICItLWNsZWFyIikpIHsKKwkgICAgaWYgKG9wdF9jbGVhcikgewkJLyogSGV5LCAiLS1jbGVhciIgY2FuJ3QgYXBwZWFyIHR3aWNlISAqLworCQlVc2FnZSAoYXJndlswXSk7CisJCWV4aXQgKC0xKTsKKwkgICAgfSBlbHNlIGlmIChhcmdjID09IDIpIHsJLyogd2Ugb25seSB3YW50IHRvIGNsZWFyIHRoZSBzY3JlZW4gKi8KKwkJaW5pdF9kaWFsb2cgKCk7CisJCXJlZnJlc2ggKCk7CS8qIGluaXRfZGlhbG9nKCkgd2lsbCBjbGVhciB0aGUgc2NyZWVuIGZvciB1cyAqLworCQllbmRfZGlhbG9nICgpOworCQlyZXR1cm4gMDsKKwkgICAgfSBlbHNlIHsKKwkJb3B0X2NsZWFyID0gMTsKKwkJb2Zmc2V0Kys7CisJICAgIH0KKwl9IGVsc2UJCQkvKiBubyBtb3JlIGNvbW1vbiBvcHRpb25zICovCisJICAgIGVuZF9jb21tb25fb3B0cyA9IDE7CisgICAgfQorCisgICAgaWYgKGFyZ2MgLSAxID09IG9mZnNldCkgewkvKiBubyBtb3JlIG9wdGlvbnMgKi8KKwlVc2FnZSAoYXJndlswXSk7CisJZXhpdCAoLTEpOworICAgIH0KKyAgICAvKiB1c2UgYSB0YWJsZSB0byBsb29rIGZvciB0aGUgcmVxdWVzdGVkIG1vZGUsIHRvIGF2b2lkIGNvZGUgZHVwbGljYXRpb24gKi8KKworICAgIGZvciAobW9kZVB0ciA9IG1vZGVzOyBtb2RlUHRyLT5uYW1lOyBtb2RlUHRyKyspCS8qIGxvb2sgZm9yIHRoZSBtb2RlICovCisJaWYgKCFzdHJjbXAgKGFyZ3Zbb2Zmc2V0ICsgMV0sIG1vZGVQdHItPm5hbWUpKQorCSAgICBicmVhazsKKworICAgIGlmICghbW9kZVB0ci0+bmFtZSkKKwlVc2FnZSAoYXJndlswXSk7CisgICAgaWYgKGFyZ2MgLSBvZmZzZXQgPCBtb2RlUHRyLT5hcmdtaW4pCisJVXNhZ2UgKGFyZ3ZbMF0pOworICAgIGlmIChtb2RlUHRyLT5hcmdtYXggJiYgYXJnYyAtIG9mZnNldCA+IG1vZGVQdHItPmFyZ21heCkKKwlVc2FnZSAoYXJndlswXSk7CisKKworCisgICAgaW5pdF9kaWFsb2cgKCk7CisgICAgcmV0dmFsID0gKCoobW9kZVB0ci0+anVtcGVyKSkgKHRpdGxlLCBhcmdjIC0gb2Zmc2V0LCBhcmd2ICsgb2Zmc2V0KTsKKworICAgIGlmIChvcHRfY2xlYXIpIHsJCS8qIGNsZWFyIHNjcmVlbiBiZWZvcmUgZXhpdCAqLworCWF0dHJfY2xlYXIgKHN0ZHNjciwgTElORVMsIENPTFMsIHNjcmVlbl9hdHRyKTsKKwlyZWZyZXNoICgpOworICAgIH0KKyAgICBlbmRfZGlhbG9nKCk7CisKKyAgICBleGl0IChyZXR2YWwpOworfQorCisvKgorICogUHJpbnQgcHJvZ3JhbSB1c2FnZQorICovCitzdGF0aWMgdm9pZAorVXNhZ2UgKGNvbnN0IGNoYXIgKm5hbWUpCit7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiXAorXG5kaWFsb2csIGJ5IFNhdmlvIExhbSAobGFtODM2QGNzLmN1aGsuaGspLlwKK1xuICBwYXRjaGVkIGJ5IFN0dWFydCBIZXJiZXJ0IChTLkhlcmJlcnRAc2hlZi5hYy51aylcCitcbiAgbW9kaWZpZWQvZ3V0dGVkIGZvciB1c2UgYXMgYSBMaW51eCBrZXJuZWwgY29uZmlnIHRvb2wgYnkgXAorXG4gIFdpbGxpYW0gUm9hZGNhcCAocm9hZGNhcHdAY2Z3LmNvbSlcCitcblwKK1xuKiBEaXNwbGF5IGRpYWxvZyBib3hlcyBmcm9tIHNoZWxsIHNjcmlwdHMgKlwKK1xuXAorXG5Vc2FnZTogJXMgLS1jbGVhclwKK1xuICAgICAgICVzIFstLXRpdGxlIDx0aXRsZT5dIFstLWJhY2t0aXRsZSA8YmFja3RpdGxlPl0gLS1jbGVhciA8Qm94IG9wdGlvbnM+XAorXG5cCitcbkJveCBvcHRpb25zOlwKK1xuXAorXG4gIC0tbWVudSAgICAgIDx0ZXh0PiA8aGVpZ2h0PiA8d2lkdGg+IDxtZW51IGhlaWdodD4gPHRhZzE+IDxpdGVtMT4uLi5cCitcbiAgLS1jaGVja2xpc3QgPHRleHQ+IDxoZWlnaHQ+IDx3aWR0aD4gPGxpc3QgaGVpZ2h0PiA8dGFnMT4gPGl0ZW0xPiA8c3RhdHVzMT4uLi5cCitcbiAgLS1yYWRpb2xpc3QgPHRleHQ+IDxoZWlnaHQ+IDx3aWR0aD4gPGxpc3QgaGVpZ2h0PiA8dGFnMT4gPGl0ZW0xPiA8c3RhdHVzMT4uLi5cCitcbiAgLS10ZXh0Ym94ICAgPGZpbGU+IDxoZWlnaHQ+IDx3aWR0aD5cCitcbiAgLS1pbnB1dGJveCAgPHRleHQ+IDxoZWlnaHQ+IDx3aWR0aD4gWzxpbml0Pl1cCitcbiAgLS15ZXNubyAgICAgPHRleHQ+IDxoZWlnaHQ+IDx3aWR0aD5cCitcbiIsIG5hbWUsIG5hbWUpOworICAgIGV4aXQgKC0xKTsKK30KKworLyoKKyAqIFRoZXNlIGFyZSB0aGUgcHJvZ3JhbSBqdW1wZXJzCisgKi8KKworaW50CitqX21lbnUgKGNvbnN0IGNoYXIgKnQsIGludCBhYywgY29uc3QgY2hhciAqIGNvbnN0ICogYXYpCit7CisgICAgcmV0dXJuIGRpYWxvZ19tZW51ICh0LCBhdlsyXSwgYXRvaSAoYXZbM10pLCBhdG9pIChhdls0XSksCisJCQlhdG9pIChhdls1XSksIGF2WzZdLCAoYWMgLSA2KSAvIDIsIGF2ICsgNyk7Cit9CisKK2ludAoral9jaGVja2xpc3QgKGNvbnN0IGNoYXIgKnQsIGludCBhYywgY29uc3QgY2hhciAqIGNvbnN0ICogYXYpCit7CisgICAgcmV0dXJuIGRpYWxvZ19jaGVja2xpc3QgKHQsIGF2WzJdLCBhdG9pIChhdlszXSksIGF0b2kgKGF2WzRdKSwKKwlhdG9pIChhdls1XSksIChhYyAtIDYpIC8gMywgYXYgKyA2LCBGTEFHX0NIRUNLKTsKK30KKworaW50CitqX3JhZGlvbGlzdCAoY29uc3QgY2hhciAqdCwgaW50IGFjLCBjb25zdCBjaGFyICogY29uc3QgKiBhdikKK3sKKyAgICByZXR1cm4gZGlhbG9nX2NoZWNrbGlzdCAodCwgYXZbMl0sIGF0b2kgKGF2WzNdKSwgYXRvaSAoYXZbNF0pLAorCWF0b2kgKGF2WzVdKSwgKGFjIC0gNikgLyAzLCBhdiArIDYsIEZMQUdfUkFESU8pOworfQorCitpbnQKK2pfdGV4dGJveCAoY29uc3QgY2hhciAqdCwgaW50IGFjLCBjb25zdCBjaGFyICogY29uc3QgKiBhdikKK3sKKyAgICByZXR1cm4gZGlhbG9nX3RleHRib3ggKHQsIGF2WzJdLCBhdG9pIChhdlszXSksIGF0b2kgKGF2WzRdKSk7Cit9CisKK2ludAoral95ZXNubyAoY29uc3QgY2hhciAqdCwgaW50IGFjLCBjb25zdCBjaGFyICogY29uc3QgKiBhdikKK3sKKyAgICByZXR1cm4gZGlhbG9nX3llc25vICh0LCBhdlsyXSwgYXRvaSAoYXZbM10pLCBhdG9pIChhdls0XSkpOworfQorCitpbnQKK2pfaW5wdXRib3ggKGNvbnN0IGNoYXIgKnQsIGludCBhYywgY29uc3QgY2hhciAqIGNvbnN0ICogYXYpCit7CisgICAgaW50IHJldCA9IGRpYWxvZ19pbnB1dGJveCAodCwgYXZbMl0sIGF0b2kgKGF2WzNdKSwgYXRvaSAoYXZbNF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjID09IDYgPyBhdls1XSA6IChjaGFyICopIE5VTEwpOworICAgIGlmIChyZXQgPT0gMCkKKyAgICAgICAgZnByaW50ZihzdGRlcnIsIGRpYWxvZ19pbnB1dF9yZXN1bHQpOworICAgIHJldHVybiByZXQ7Cit9CisKK2ludAoral9tc2dib3ggKGNvbnN0IGNoYXIgKnQsIGludCBhYywgY29uc3QgY2hhciAqIGNvbnN0ICogYXYpCit7CisgICAgcmV0dXJuIGRpYWxvZ19tc2dib3ggKHQsIGF2WzJdLCBhdG9pIChhdlszXSksIGF0b2kgKGF2WzRdKSwgMSk7Cit9CisKK2ludAoral9pbmZvYm94IChjb25zdCBjaGFyICp0LCBpbnQgYWMsIGNvbnN0IGNoYXIgKiBjb25zdCAqIGF2KQoreworICAgIHJldHVybiBkaWFsb2dfbXNnYm94ICh0LCBhdlsyXSwgYXRvaSAoYXZbM10pLCBhdG9pIChhdls0XSksIDApOworfQorCmRpZmYgLS1naXQgYS9zY3JpcHRzL2x4ZGlhbG9nL21lbnVib3guYyBiL3NjcmlwdHMvbHhkaWFsb2cvbWVudWJveC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxZDgyYmEKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2x4ZGlhbG9nL21lbnVib3guYwpAQCAtMCwwICsxLDQ0NSBAQAorLyoKKyAqICBtZW51Ym94LmMgLS0gaW1wbGVtZW50cyB0aGUgbWVudSBib3gKKyAqCisgKiAgT1JJR0lOQUwgQVVUSE9SOiBTYXZpbyBMYW0gKGxhbTgzNkBjcy5jdWhrLmhrKQorICogIE1PRElGSUVEIEZPUiBMSU5VWCBLRVJORUwgQ09ORklHIEJZOiBXaWxsaWFtIFJvYWRjYXAgKHJvYWRjYXB3QGNmdy5jb20pCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisvKgorICogIENoYW5nZXMgYnkgQ2xpZmZvcmQgV29sZiAoZ29kQGNsaWZmb3JkLmF0KQorICoKKyAqICBbIDE5OTgtMDYtMTMgXQorICoKKyAqICAgICopICBBIGJ1Z2ZpeCBmb3IgdGhlIFBhZ2UtRG93biBwcm9ibGVtCisgKgorICogICAgKikgIEZvcm1lcmx5IHdoZW4gSSB1c2VkIFBhZ2UgRG93biBhbmQgUGFnZSBVcCwgdGhlIGN1cnNvciB3b3VsZCBiZSBzZXQgCisgKiAgICAgICAgdG8gdGhlIGZpcnN0IHBvc2l0aW9uIGluIHRoZSBtZW51IGJveC4gIE5vdyBseGRpYWxvZyBpcyBhIGJpdAorICogICAgICAgIHNtYXJ0ZXIgYW5kIHdvcmtzIG1vcmUgbGlrZSBvdGhlciBtZW51IHN5c3RlbXMgKGp1c3QgaGF2ZSBhIGxvb2sgYXQKKyAqICAgICAgICBpdCkuCisgKgorICogICAgKikgIEZvcm1lcmx5IGlmIEkgc2VsZWN0ZWQgc29tZXRoaW5nIG15IHNjcm9sbGluZyB3b3VsZCBiZSBicm9rZW4gYmVjYXVzZQorICogICAgICAgIGx4ZGlhbG9nIGlzIHJlLWludm9rZWQgYnkgdGhlIE1lbnVjb25maWcgc2hlbGwgc2NyaXB0LCBjYW4ndAorICogICAgICAgIHJlbWVtYmVyIHRoZSBsYXN0IHNjcm9sbGluZyBwb3NpdGlvbiwgYW5kIGp1c3Qgc2V0cyBpdCBzbyB0aGF0IHRoZQorICogICAgICAgIGN1cnNvciBpcyBhdCB0aGUgYm90dG9tIG9mIHRoZSBib3guICBOb3cgaXQgd3JpdGVzIHRoZSB0ZW1wb3JhcnkgZmlsZQorICogICAgICAgIGx4ZGlhbG9nLnNjcmx0bXAgd2hpY2ggY29udGFpbnMgdGhpcyBpbmZvcm1hdGlvbi4gVGhlIGZpbGUgaXMKKyAqICAgICAgICBkZWxldGVkIGJ5IGx4ZGlhbG9nIGlmIHRoZSB1c2VyIGxlYXZlcyBhIHN1Ym1lbnUgb3IgZW50ZXJzIGEgbmV3CisgKiAgICAgICAgb25lLCBidXQgaXQgd291bGQgYmUgbmljZSBpZiBNZW51Y29uZmlnIGNvdWxkIG1ha2UgYW5vdGhlciAicm0gLWYiCisgKiAgICAgICAganVzdCB0byBiZSBzdXJlLiAgSnVzdCB0cnkgaXQgb3V0IC0geW91IHdpbGwgcmVjb2duaXNlIGEgZGlmZmVyZW5jZSEKKyAqCisgKiAgWyAxOTk4LTA2LTE0IF0KKyAqCisgKiAgICAqKSAgTm93IGx4ZGlhbG9nIGlzIGNyYXNoLXNhZmUgYWdhaW5zdCBicm9rZW4gImx4ZGlhbG9nLnNjcmx0bXAiIGZpbGVzCisgKiAgICAgICAgYW5kIG1lbnVzIGNoYW5nZSB0aGVpciBzaXplIG9uIHRoZSBmbHkuCisgKgorICogICAgKikgIElmIGZvciBzb21lIHJlYXNvbiB0aGUgbGFzdCBzY3JvbGxpbmcgcG9zaXRpb24gaXMgbm90IHNhdmVkIGJ5CisgKiAgICAgICAgbHhkaWFsb2csIGl0IHNldHMgdGhlIHNjcm9sbGluZyBzbyB0aGF0IHRoZSBzZWxlY3RlZCBpdGVtIGlzIGluIHRoZQorICogICAgICAgIG1pZGRsZSBvZiB0aGUgbWVudSBib3gsIG5vdCBhdCB0aGUgYm90dG9tLgorICoKKyAqIDAyIEphbnVhcnkgMTk5OSwgTWljaGFlbCBFbGl6YWJldGggQ2hhc3RhaW4gKG1lY0BzaG91dC5uZXQpCisgKiBSZXNldCAnc2Nyb2xsJyB0byAwIGlmIHRoZSB2YWx1ZSBmcm9tIGx4ZGlhbG9nLnNjcmx0bXAgaXMgYm9ndXMuCisgKiBUaGlzIGZpeGVzIGEgYnVnIGluIE1lbnVjb25maWcgd2hlcmUgdXNpbmcgJyAnIHRvIGRlc2NlbmQgaW50byBtZW51cworICogd291bGQgbGVhdmUgbWlzLXN5bmNocm9uaXplZCBseGRpYWxvZy5zY3JsdG1wIGZpbGVzIGx5aW5nIGFyb3VuZCwKKyAqIGZzY2FuZiB3b3VsZCByZWFkIGluICdzY3JvbGwnLCBhbmQgZXZlbnR1YWxseSB0aGF0IHZhbHVlIHdvdWxkIGdldCB1c2VkLgorICovCisKKyNpbmNsdWRlICJkaWFsb2cuaCIKKworc3RhdGljIGludCBtZW51X3dpZHRoLCBpdGVtX3g7CisKKy8qCisgKiBQcmludCBtZW51IGl0ZW0KKyAqLworc3RhdGljIHZvaWQKK3ByaW50X2l0ZW0gKFdJTkRPVyAqIHdpbiwgY29uc3QgY2hhciAqaXRlbSwgaW50IGNob2ljZSwgaW50IHNlbGVjdGVkLCBpbnQgaG90a2V5KQoreworICAgIGludCBqOworICAgIGNoYXIgbWVudV9pdGVtW21lbnVfd2lkdGgrMV07CisKKyAgICBzdHJuY3B5KG1lbnVfaXRlbSwgaXRlbSwgbWVudV93aWR0aCk7CisgICAgbWVudV9pdGVtW21lbnVfd2lkdGhdID0gMDsKKyAgICBqID0gZmlyc3RfYWxwaGEobWVudV9pdGVtLCAiWXlObk1tSGgiKTsKKworICAgIC8qIENsZWFyICdyZXNpZHVlJyBvZiBsYXN0IGl0ZW0gKi8KKyAgICB3YXR0cnNldCAod2luLCBtZW51Ym94X2F0dHIpOworICAgIHdtb3ZlICh3aW4sIGNob2ljZSwgMCk7CisjaWYgT0xEX05DVVJTRVMKKyAgICB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbWVudV93aWR0aDsgaSsrKQorCSAgICB3YWRkY2ggKHdpbiwgJyAnKTsKKyAgICB9CisjZWxzZQorICAgIHdjbHJ0b2VvbCh3aW4pOworI2VuZGlmCisgICAgd2F0dHJzZXQgKHdpbiwgc2VsZWN0ZWQgPyBpdGVtX3NlbGVjdGVkX2F0dHIgOiBpdGVtX2F0dHIpOworICAgIG12d2FkZHN0ciAod2luLCBjaG9pY2UsIGl0ZW1feCwgbWVudV9pdGVtKTsKKyAgICBpZiAoaG90a2V5KSB7CisgICAgCXdhdHRyc2V0ICh3aW4sIHNlbGVjdGVkID8gdGFnX2tleV9zZWxlY3RlZF9hdHRyIDogdGFnX2tleV9hdHRyKTsKKyAgICAJbXZ3YWRkY2god2luLCBjaG9pY2UsIGl0ZW1feCtqLCBtZW51X2l0ZW1bal0pOworICAgIH0KKyAgICBpZiAoc2VsZWN0ZWQpIHsKKwl3bW92ZSAod2luLCBjaG9pY2UsIGl0ZW1feCsxKTsKKwl3cmVmcmVzaCAod2luKTsKKyAgICB9Cit9CisKKy8qCisgKiBQcmludCB0aGUgc2Nyb2xsIGluZGljYXRvcnMuCisgKi8KK3N0YXRpYyB2b2lkCitwcmludF9hcnJvd3MgKFdJTkRPVyAqIHdpbiwgaW50IGl0ZW1fbm8sIGludCBzY3JvbGwsCisJCWludCB5LCBpbnQgeCwgaW50IGhlaWdodCkKK3sKKyAgICBpbnQgY3VyX3ksIGN1cl94OworCisgICAgZ2V0eXgod2luLCBjdXJfeSwgY3VyX3gpOworCisgICAgd21vdmUod2luLCB5LCB4KTsKKworICAgIGlmIChzY3JvbGwgPiAwKSB7CisJd2F0dHJzZXQgKHdpbiwgdWFycm93X2F0dHIpOworCXdhZGRjaCAod2luLCBBQ1NfVUFSUk9XKTsKKwl3YWRkc3RyICh3aW4sICIoLSkiKTsKKyAgICB9CisgICAgZWxzZSB7CisJd2F0dHJzZXQgKHdpbiwgbWVudWJveF9hdHRyKTsKKwl3YWRkY2ggKHdpbiwgQUNTX0hMSU5FKTsKKwl3YWRkY2ggKHdpbiwgQUNTX0hMSU5FKTsKKwl3YWRkY2ggKHdpbiwgQUNTX0hMSU5FKTsKKwl3YWRkY2ggKHdpbiwgQUNTX0hMSU5FKTsKKyAgICB9CisKKyAgIHkgPSB5ICsgaGVpZ2h0ICsgMTsKKyAgIHdtb3ZlKHdpbiwgeSwgeCk7CisKKyAgIGlmICgoaGVpZ2h0IDwgaXRlbV9ubykgJiYgKHNjcm9sbCArIGhlaWdodCA8IGl0ZW1fbm8pKSB7CisJd2F0dHJzZXQgKHdpbiwgZGFycm93X2F0dHIpOworCXdhZGRjaCAod2luLCBBQ1NfREFSUk9XKTsKKwl3YWRkc3RyICh3aW4sICIoKykiKTsKKyAgICB9CisgICAgZWxzZSB7CisJd2F0dHJzZXQgKHdpbiwgbWVudWJveF9ib3JkZXJfYXR0cik7CisJd2FkZGNoICh3aW4sIEFDU19ITElORSk7CisJd2FkZGNoICh3aW4sIEFDU19ITElORSk7CisJd2FkZGNoICh3aW4sIEFDU19ITElORSk7CisJd2FkZGNoICh3aW4sIEFDU19ITElORSk7CisgICB9CisKKyAgIHdtb3ZlKHdpbiwgY3VyX3ksIGN1cl94KTsKK30KKworLyoKKyAqIERpc3BsYXkgdGhlIHRlcm1pbmF0aW9uIGJ1dHRvbnMuCisgKi8KK3N0YXRpYyB2b2lkCitwcmludF9idXR0b25zIChXSU5ET1cgKndpbiwgaW50IGhlaWdodCwgaW50IHdpZHRoLCBpbnQgc2VsZWN0ZWQpCit7CisgICAgaW50IHggPSB3aWR0aCAvIDIgLSAxNjsKKyAgICBpbnQgeSA9IGhlaWdodCAtIDI7CisKKyAgICBwcmludF9idXR0b24gKHdpbiwgIlNlbGVjdCIsIHksIHgsIHNlbGVjdGVkID09IDApOworICAgIHByaW50X2J1dHRvbiAod2luLCAiIEV4aXQgIiwgeSwgeCArIDEyLCBzZWxlY3RlZCA9PSAxKTsKKyAgICBwcmludF9idXR0b24gKHdpbiwgIiBIZWxwICIsIHksIHggKyAyNCwgc2VsZWN0ZWQgPT0gMik7CisKKyAgICB3bW92ZSh3aW4sIHksIHgrMSsxMipzZWxlY3RlZCk7CisgICAgd3JlZnJlc2ggKHdpbik7Cit9CisKKy8qCisgKiBEaXNwbGF5IGEgbWVudSBmb3IgY2hvb3NpbmcgYW1vbmcgYSBudW1iZXIgb2Ygb3B0aW9ucworICovCitpbnQKK2RpYWxvZ19tZW51IChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsCisJCWludCBtZW51X2hlaWdodCwgY29uc3QgY2hhciAqY3VycmVudCwgaW50IGl0ZW1fbm8sCisJCWNvbnN0IGNoYXIgKiBjb25zdCAqIGl0ZW1zKQorCit7CisgICAgaW50IGksIGosIHgsIHksIGJveF94LCBib3hfeTsKKyAgICBpbnQga2V5ID0gMCwgYnV0dG9uID0gMCwgc2Nyb2xsID0gMCwgY2hvaWNlID0gMCwgZmlyc3RfaXRlbSA9IDAsIG1heF9jaG9pY2U7CisgICAgV0lORE9XICpkaWFsb2csICptZW51OworICAgIEZJTEUgKmY7CisKKyAgICBtYXhfY2hvaWNlID0gTUlOIChtZW51X2hlaWdodCwgaXRlbV9ubyk7CisKKyAgICAvKiBjZW50ZXIgZGlhbG9nIGJveCBvbiBzY3JlZW4gKi8KKyAgICB4ID0gKENPTFMgLSB3aWR0aCkgLyAyOworICAgIHkgPSAoTElORVMgLSBoZWlnaHQpIC8gMjsKKworICAgIGRyYXdfc2hhZG93IChzdGRzY3IsIHksIHgsIGhlaWdodCwgd2lkdGgpOworCisgICAgZGlhbG9nID0gbmV3d2luIChoZWlnaHQsIHdpZHRoLCB5LCB4KTsKKyAgICBrZXlwYWQgKGRpYWxvZywgVFJVRSk7CisKKyAgICBkcmF3X2JveCAoZGlhbG9nLCAwLCAwLCBoZWlnaHQsIHdpZHRoLCBkaWFsb2dfYXR0ciwgYm9yZGVyX2F0dHIpOworICAgIHdhdHRyc2V0IChkaWFsb2csIGJvcmRlcl9hdHRyKTsKKyAgICBtdndhZGRjaCAoZGlhbG9nLCBoZWlnaHQgLSAzLCAwLCBBQ1NfTFRFRSk7CisgICAgZm9yIChpID0gMDsgaSA8IHdpZHRoIC0gMjsgaSsrKQorCXdhZGRjaCAoZGlhbG9nLCBBQ1NfSExJTkUpOworICAgIHdhdHRyc2V0IChkaWFsb2csIGRpYWxvZ19hdHRyKTsKKyAgICB3YmtnZHNldCAoZGlhbG9nLCBkaWFsb2dfYXR0ciAmIEFfQ09MT1IpOworICAgIHdhZGRjaCAoZGlhbG9nLCBBQ1NfUlRFRSk7CisKKyAgICBpZiAodGl0bGUgIT0gTlVMTCAmJiBzdHJsZW4odGl0bGUpID49IHdpZHRoLTIgKSB7CisJLyogdHJ1bmNhdGUgbG9uZyB0aXRsZSAtLSBtZWMgKi8KKwljaGFyICogdGl0bGUyID0gbWFsbG9jKHdpZHRoLTIrMSk7CisJbWVtY3B5KCB0aXRsZTIsIHRpdGxlLCB3aWR0aC0yICk7CisJdGl0bGUyW3dpZHRoLTJdID0gJ1wwJzsKKwl0aXRsZSA9IHRpdGxlMjsKKyAgICB9CisKKyAgICBpZiAodGl0bGUgIT0gTlVMTCkgeworCXdhdHRyc2V0IChkaWFsb2csIHRpdGxlX2F0dHIpOworCW12d2FkZGNoIChkaWFsb2csIDAsICh3aWR0aCAtIHN0cmxlbih0aXRsZSkpLzIgLSAxLCAnICcpOworCXdhZGRzdHIgKGRpYWxvZywgKGNoYXIgKil0aXRsZSk7CisJd2FkZGNoIChkaWFsb2csICcgJyk7CisgICAgfQorCisgICAgd2F0dHJzZXQgKGRpYWxvZywgZGlhbG9nX2F0dHIpOworICAgIHByaW50X2F1dG93cmFwIChkaWFsb2csIHByb21wdCwgd2lkdGggLSAyLCAxLCAzKTsKKworICAgIG1lbnVfd2lkdGggPSB3aWR0aCAtIDY7CisgICAgYm94X3kgPSBoZWlnaHQgLSBtZW51X2hlaWdodCAtIDU7CisgICAgYm94X3ggPSAod2lkdGggLSBtZW51X3dpZHRoKSAvIDIgLSAxOworCisgICAgLyogY3JlYXRlIG5ldyB3aW5kb3cgZm9yIHRoZSBtZW51ICovCisgICAgbWVudSA9IHN1YndpbiAoZGlhbG9nLCBtZW51X2hlaWdodCwgbWVudV93aWR0aCwKKwkJeSArIGJveF95ICsgMSwgeCArIGJveF94ICsgMSk7CisgICAga2V5cGFkIChtZW51LCBUUlVFKTsKKworICAgIC8qIGRyYXcgYSBib3ggYXJvdW5kIHRoZSBtZW51IGl0ZW1zICovCisgICAgZHJhd19ib3ggKGRpYWxvZywgYm94X3ksIGJveF94LCBtZW51X2hlaWdodCArIDIsIG1lbnVfd2lkdGggKyAyLAorCSAgICAgIG1lbnVib3hfYm9yZGVyX2F0dHIsIG1lbnVib3hfYXR0cik7CisKKyAgICAvKgorICAgICAqIEZpbmQgbGVuZ3RoIG9mIGxvbmdlc3QgaXRlbSBpbiBvcmRlciB0byBjZW50ZXIgbWVudS4KKyAgICAgKiBTZXQgJ2Nob2ljZScgdG8gZGVmYXVsdCBpdGVtLiAKKyAgICAgKi8KKyAgICBpdGVtX3ggPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBpdGVtX25vOyBpKyspIHsKKwlpdGVtX3ggPSBNQVggKGl0ZW1feCwgTUlOKG1lbnVfd2lkdGgsIHN0cmxlbiAoaXRlbXNbaSAqIDIgKyAxXSkgKyAyKSk7CisJaWYgKHN0cmNtcChjdXJyZW50LCBpdGVtc1tpKjJdKSA9PSAwKSBjaG9pY2UgPSBpOworICAgIH0KKworICAgIGl0ZW1feCA9IChtZW51X3dpZHRoIC0gaXRlbV94KSAvIDI7CisKKyAgICAvKiBnZXQgdGhlIHNjcm9sbCBpbmZvIGZyb20gdGhlIHRlbXAgZmlsZSAqLworICAgIGlmICggKGY9Zm9wZW4oImx4ZGlhbG9nLnNjcmx0bXAiLCJyIikpICE9IE5VTEwgKSB7CisJaWYgKCAoZnNjYW5mKGYsIiVkXG4iLCZzY3JvbGwpID09IDEpICYmIChzY3JvbGwgPD0gY2hvaWNlKSAmJgorCSAgICAgKHNjcm9sbCttYXhfY2hvaWNlID4gY2hvaWNlKSAmJiAoc2Nyb2xsID49IDApICYmCisJICAgICAoc2Nyb2xsK21heF9jaG9pY2UgPD0gaXRlbV9ubykgKSB7CisJICAgIGZpcnN0X2l0ZW0gPSBzY3JvbGw7CisJICAgIGNob2ljZSA9IGNob2ljZSAtIHNjcm9sbDsKKwkgICAgZmNsb3NlKGYpOworCX0gZWxzZSB7CisJICAgIHNjcm9sbD0wOworCSAgICByZW1vdmUoImx4ZGlhbG9nLnNjcmx0bXAiKTsKKwkgICAgZmNsb3NlKGYpOworCSAgICBmPU5VTEw7CisJfQorICAgIH0KKyAgICBpZiAoIChjaG9pY2UgPj0gbWF4X2Nob2ljZSkgfHwgKGY9PU5VTEwgJiYgY2hvaWNlID49IG1heF9jaG9pY2UvMikgKSB7CisJaWYgKGNob2ljZSA+PSBpdGVtX25vLW1heF9jaG9pY2UvMikKKwkgICAgc2Nyb2xsID0gZmlyc3RfaXRlbSA9IGl0ZW1fbm8tbWF4X2Nob2ljZTsKKwllbHNlCisJICAgIHNjcm9sbCA9IGZpcnN0X2l0ZW0gPSBjaG9pY2UgLSBtYXhfY2hvaWNlLzI7CisJY2hvaWNlID0gY2hvaWNlIC0gc2Nyb2xsOworICAgIH0KKworICAgIC8qIFByaW50IHRoZSBtZW51ICovCisgICAgZm9yIChpPTA7IGkgPCBtYXhfY2hvaWNlOyBpKyspIHsKKwlwcmludF9pdGVtIChtZW51LCBpdGVtc1soZmlyc3RfaXRlbSArIGkpICogMiArIDFdLCBpLCBpID09IGNob2ljZSwKKyAgICAgICAgICAgICAgICAgICAgKGl0ZW1zWyhmaXJzdF9pdGVtICsgaSkqMl1bMF0gIT0gJzonKSk7CisgICAgfQorCisgICAgd25vdXRyZWZyZXNoIChtZW51KTsKKworICAgIHByaW50X2Fycm93cyhkaWFsb2csIGl0ZW1fbm8sIHNjcm9sbCwKKwkJIGJveF95LCBib3hfeCtpdGVtX3grMSwgbWVudV9oZWlnaHQpOworCisgICAgcHJpbnRfYnV0dG9ucyAoZGlhbG9nLCBoZWlnaHQsIHdpZHRoLCAwKTsKKyAgICB3bW92ZSAobWVudSwgY2hvaWNlLCBpdGVtX3grMSk7CisgICAgd3JlZnJlc2ggKG1lbnUpOworCisgICAgd2hpbGUgKGtleSAhPSBFU0MpIHsKKwlrZXkgPSB3Z2V0Y2gobWVudSk7CisKKwlpZiAoa2V5IDwgMjU2ICYmIGlzYWxwaGEoa2V5KSkga2V5ID0gdG9sb3dlcihrZXkpOworCisJaWYgKHN0cmNocigieW5taCIsIGtleSkpCisJCWkgPSBtYXhfY2hvaWNlOworCWVsc2UgeworICAgICAgICBmb3IgKGkgPSBjaG9pY2UrMTsgaSA8IG1heF9jaG9pY2U7IGkrKykgeworCQlqID0gZmlyc3RfYWxwaGEoaXRlbXNbKHNjcm9sbCtpKSoyKzFdLCAiWXlObk1tSGgiKTsKKwkJaWYgKGtleSA9PSB0b2xvd2VyKGl0ZW1zWyhzY3JvbGwraSkqMisxXVtqXSkpCisgICAgICAgICAgICAgICAgCWJyZWFrOworCX0KKwlpZiAoaSA9PSBtYXhfY2hvaWNlKQorICAgICAgIAkJZm9yIChpID0gMDsgaSA8IG1heF9jaG9pY2U7IGkrKykgeworCQkJaiA9IGZpcnN0X2FscGhhKGl0ZW1zWyhzY3JvbGwraSkqMisxXSwgIll5Tm5NbUhoIik7CisJCQlpZiAoa2V5ID09IHRvbG93ZXIoaXRlbXNbKHNjcm9sbCtpKSoyKzFdW2pdKSkKKyAgICAgICAgICAgICAgICAJCWJyZWFrOworCQl9CisJfQorCisJaWYgKGkgPCBtYXhfY2hvaWNlIHx8IAorICAgICAgICAgICAga2V5ID09IEtFWV9VUCB8fCBrZXkgPT0gS0VZX0RPV04gfHwKKyAgICAgICAgICAgIGtleSA9PSAnLScgfHwga2V5ID09ICcrJyB8fAorICAgICAgICAgICAga2V5ID09IEtFWV9QUEFHRSB8fCBrZXkgPT0gS0VZX05QQUdFKSB7CisKKyAgICAgICAgICAgIHByaW50X2l0ZW0gKG1lbnUsIGl0ZW1zWyhzY3JvbGwrY2hvaWNlKSoyKzFdLCBjaG9pY2UsIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAoaXRlbXNbKHNjcm9sbCtjaG9pY2UpKjJdWzBdICE9ICc6JykpOworCisJICAgIGlmIChrZXkgPT0gS0VZX1VQIHx8IGtleSA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICBpZiAoY2hvaWNlIDwgMiAmJiBzY3JvbGwpIHsKKwkgICAgICAgICAgICAvKiBTY3JvbGwgbWVudSBkb3duICovCisgICAgICAgICAgICAgICAgICAgIHNjcm9sbG9rIChtZW51LCBUUlVFKTsKKyAgICAgICAgICAgICAgICAgICAgd3NjcmwgKG1lbnUsIC0xKTsKKyAgICAgICAgICAgICAgICAgICAgc2Nyb2xsb2sgKG1lbnUsIEZBTFNFKTsKKworICAgICAgICAgICAgICAgICAgICBzY3JvbGwtLTsKKworICAgICAgICAgICAgICAgICAgICBwcmludF9pdGVtIChtZW51LCBpdGVtc1tzY3JvbGwgKiAyICsgMV0sIDAsIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtc1tzY3JvbGwqMl1bMF0gIT0gJzonKSk7CisJCX0gZWxzZQorCQkgICAgY2hvaWNlID0gTUFYKGNob2ljZSAtIDEsIDApOworCisJICAgIH0gZWxzZSBpZiAoa2V5ID09IEtFWV9ET1dOIHx8IGtleSA9PSAnKycpICB7CisKKwkJcHJpbnRfaXRlbSAobWVudSwgaXRlbXNbKHNjcm9sbCtjaG9pY2UpKjIrMV0sIGNob2ljZSwgRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtc1soc2Nyb2xsK2Nob2ljZSkqMl1bMF0gIT0gJzonKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoKGNob2ljZSA+IG1heF9jaG9pY2UtMykgJiYKKyAgICAgICAgICAgICAgICAgICAgKHNjcm9sbCArIG1heF9jaG9pY2UgPCBpdGVtX25vKQorICAgICAgICAgICAgICAgICAgICkgeworCQkgICAgLyogU2Nyb2xsIG1lbnUgdXAgKi8KKwkJICAgIHNjcm9sbG9rIChtZW51LCBUUlVFKTsKKwkJICAgIHdzY3JsIChtZW51LCAxKTsKKyAgICAgICAgICAgICAgICAgICAgc2Nyb2xsb2sgKG1lbnUsIEZBTFNFKTsKKworICAgICAgICAgICAgICAgICAgICBzY3JvbGwrKzsKKworICAgICAgICAgICAgICAgICAgICBwcmludF9pdGVtIChtZW51LCBpdGVtc1soc2Nyb2xsK21heF9jaG9pY2UtMSkqMisxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfY2hvaWNlLTEsIEZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpdGVtc1soc2Nyb2xsK21heF9jaG9pY2UtMSkqMl1bMF0gIT0gJzonKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgIGNob2ljZSA9IE1JTihjaG9pY2UrMSwgbWF4X2Nob2ljZS0xKTsKKworCSAgICB9IGVsc2UgaWYgKGtleSA9PSBLRVlfUFBBR0UpIHsKKwkgICAgICAgIHNjcm9sbG9rIChtZW51LCBUUlVFKTsKKyAgICAgICAgICAgICAgICBmb3IgKGk9MDsgKGkgPCBtYXhfY2hvaWNlKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChzY3JvbGwgPiAwKSB7CisgICAgICAgICAgICAgICAgCXdzY3JsIChtZW51LCAtMSk7CisgICAgICAgICAgICAgICAgCXNjcm9sbC0tOworICAgICAgICAgICAgICAgIAlwcmludF9pdGVtIChtZW51LCBpdGVtc1tzY3JvbGwgKiAyICsgMV0sIDAsIEZBTFNFLAorICAgICAgICAgICAgICAgIAkoaXRlbXNbc2Nyb2xsKjJdWzBdICE9ICc6JykpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNob2ljZSA+IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hvaWNlLS07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2Nyb2xsb2sgKG1lbnUsIEZBTFNFKTsKKworICAgICAgICAgICAgfSBlbHNlIGlmIChrZXkgPT0gS0VZX05QQUdFKSB7CisgICAgICAgICAgICAgICAgZm9yIChpPTA7IChpIDwgbWF4X2Nob2ljZSk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2Nyb2xsK21heF9jaG9pY2UgPCBpdGVtX25vKSB7CisJCQlzY3JvbGxvayAobWVudSwgVFJVRSk7CisJCQl3c2NybCAobWVudSwgMSk7CisJCQlzY3JvbGxvayAobWVudSwgRkFMU0UpOworICAgICAgICAgICAgICAgIAlzY3JvbGwrKzsKKyAgICAgICAgICAgICAgICAJcHJpbnRfaXRlbSAobWVudSwgaXRlbXNbKHNjcm9sbCttYXhfY2hvaWNlLTEpKjIrMV0sCisJCQkgICAgICAgICAgICBtYXhfY2hvaWNlLTEsIEZBTFNFLAorCQkJICAgICAgICAgICAgKGl0ZW1zWyhzY3JvbGwrbWF4X2Nob2ljZS0xKSoyXVswXSAhPSAnOicpKTsKKwkJICAgIH0gZWxzZSB7CisJCQlpZiAoY2hvaWNlKzEgPCBtYXhfY2hvaWNlKQorCQkJICAgIGNob2ljZSsrOworCQkgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgY2hvaWNlID0gaTsKKworICAgICAgICAgICAgcHJpbnRfaXRlbSAobWVudSwgaXRlbXNbKHNjcm9sbCtjaG9pY2UpKjIrMV0sIGNob2ljZSwgVFJVRSwKKyAgICAgICAgICAgICAgICAgICAgICAgKGl0ZW1zWyhzY3JvbGwrY2hvaWNlKSoyXVswXSAhPSAnOicpKTsKKworICAgICAgICAgICAgcHJpbnRfYXJyb3dzKGRpYWxvZywgaXRlbV9ubywgc2Nyb2xsLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJveF95LCBib3hfeCtpdGVtX3grMSwgbWVudV9oZWlnaHQpOworCisgICAgICAgICAgICB3bm91dHJlZnJlc2ggKGRpYWxvZyk7CisgICAgICAgICAgICB3cmVmcmVzaCAobWVudSk7CisKKwkgICAgY29udGludWU7CQkvKiB3YWl0IGZvciBhbm90aGVyIGtleSBwcmVzcyAqLworICAgICAgICB9CisKKwlzd2l0Y2ggKGtleSkgeworCWNhc2UgS0VZX0xFRlQ6CisJY2FzZSBUQUI6CisJY2FzZSBLRVlfUklHSFQ6CisJICAgIGJ1dHRvbiA9ICgoa2V5ID09IEtFWV9MRUZUID8gLS1idXR0b24gOiArK2J1dHRvbikgPCAwKQorCQkJPyAyIDogKGJ1dHRvbiA+IDIgPyAwIDogYnV0dG9uKTsKKworCSAgICBwcmludF9idXR0b25zKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCwgYnV0dG9uKTsKKwkgICAgd3JlZnJlc2ggKG1lbnUpOworCSAgICBicmVhazsKKwljYXNlICcgJzoKKwljYXNlICdzJzoKKwljYXNlICd5JzoKKwljYXNlICduJzoKKwljYXNlICdtJzoKKwljYXNlICcvJzoKKwkgICAgLyogc2F2ZSBzY3JvbGwgaW5mbyAqLworCSAgICBpZiAoIChmPWZvcGVuKCJseGRpYWxvZy5zY3JsdG1wIiwidyIpKSAhPSBOVUxMICkgeworCQlmcHJpbnRmKGYsIiVkXG4iLHNjcm9sbCk7CisJCWZjbG9zZShmKTsKKwkgICAgfQorCSAgICBkZWx3aW4gKGRpYWxvZyk7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCBpdGVtc1soc2Nyb2xsICsgY2hvaWNlKSAqIDJdKTsKKyAgICAgICAgICAgIHN3aXRjaCAoa2V5KSB7CisgICAgICAgICAgICBjYXNlICdzJzogcmV0dXJuIDM7CisgICAgICAgICAgICBjYXNlICd5JzogcmV0dXJuIDM7CisgICAgICAgICAgICBjYXNlICduJzogcmV0dXJuIDQ7CisgICAgICAgICAgICBjYXNlICdtJzogcmV0dXJuIDU7CisgICAgICAgICAgICBjYXNlICcgJzogcmV0dXJuIDY7CisgICAgICAgICAgICBjYXNlICcvJzogcmV0dXJuIDc7CisgICAgICAgICAgICB9CisJICAgIHJldHVybiAwOworCWNhc2UgJ2gnOgorCWNhc2UgJz8nOgorCSAgICBidXR0b24gPSAyOworCWNhc2UgJ1xuJzoKKwkgICAgZGVsd2luIChkaWFsb2cpOworCSAgICBpZiAoYnV0dG9uID09IDIpIAorICAgICAgICAgICAgCWZwcmludGYoc3RkZXJyLCAiJXMgXCIlc1wiXG4iLCAKKwkJCWl0ZW1zWyhzY3JvbGwgKyBjaG9pY2UpICogMl0sCisJCQlpdGVtc1soc2Nyb2xsICsgY2hvaWNlKSAqIDIgKyAxXSArCisJCQlmaXJzdF9hbHBoYShpdGVtc1soc2Nyb2xsICsgY2hvaWNlKSAqIDIgKyAxXSwiIikpOworCSAgICBlbHNlCisgICAgICAgICAgICAJZnByaW50ZihzdGRlcnIsICIlc1xuIiwgaXRlbXNbKHNjcm9sbCArIGNob2ljZSkgKiAyXSk7CisKKwkgICAgcmVtb3ZlKCJseGRpYWxvZy5zY3JsdG1wIik7CisJICAgIHJldHVybiBidXR0b247CisJY2FzZSAnZSc6CisJY2FzZSAneCc6CisJICAgIGtleSA9IEVTQzsKKwljYXNlIEVTQzoKKwkgICAgYnJlYWs7CisJfQorICAgIH0KKworICAgIGRlbHdpbiAoZGlhbG9nKTsKKyAgICByZW1vdmUoImx4ZGlhbG9nLnNjcmx0bXAiKTsKKyAgICByZXR1cm4gLTE7CQkJLyogRVNDIHByZXNzZWQgKi8KK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMvbHhkaWFsb2cvbXNnYm94LmMgYi9zY3JpcHRzL2x4ZGlhbG9nL21zZ2JveC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzNjkyZTEKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2x4ZGlhbG9nL21zZ2JveC5jCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiAgbXNnYm94LmMgLS0gaW1wbGVtZW50cyB0aGUgbWVzc2FnZSBib3ggYW5kIGluZm8gYm94CisgKgorICogIE9SSUdJTkFMIEFVVEhPUjogU2F2aW8gTGFtIChsYW04MzZAY3MuY3Voay5oaykKKyAqICBNT0RJRklFRCBGT1IgTElOVVggS0VSTkVMIENPTkZJRyBCWTogV2lsbGlhbSBSb2FkY2FwIChyb2FkY2Fwd0BjZncuY29tKQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgImRpYWxvZy5oIgorCisvKgorICogRGlzcGxheSBhIG1lc3NhZ2UgYm94LiBQcm9ncmFtIHdpbGwgcGF1c2UgYW5kIGRpc3BsYXkgYW4gIk9LIiBidXR0b24KKyAqIGlmIHRoZSBwYXJhbWV0ZXIgJ3BhdXNlJyBpcyBub24temVyby4KKyAqLworaW50CitkaWFsb2dfbXNnYm94IChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgsCisJCWludCBwYXVzZSkKK3sKKyAgICBpbnQgaSwgeCwgeSwga2V5ID0gMDsKKyAgICBXSU5ET1cgKmRpYWxvZzsKKworICAgIC8qIGNlbnRlciBkaWFsb2cgYm94IG9uIHNjcmVlbiAqLworICAgIHggPSAoQ09MUyAtIHdpZHRoKSAvIDI7CisgICAgeSA9IChMSU5FUyAtIGhlaWdodCkgLyAyOworCisgICAgZHJhd19zaGFkb3cgKHN0ZHNjciwgeSwgeCwgaGVpZ2h0LCB3aWR0aCk7CisKKyAgICBkaWFsb2cgPSBuZXd3aW4gKGhlaWdodCwgd2lkdGgsIHksIHgpOworICAgIGtleXBhZCAoZGlhbG9nLCBUUlVFKTsKKworICAgIGRyYXdfYm94IChkaWFsb2csIDAsIDAsIGhlaWdodCwgd2lkdGgsIGRpYWxvZ19hdHRyLCBib3JkZXJfYXR0cik7CisKKyAgICBpZiAodGl0bGUgIT0gTlVMTCAmJiBzdHJsZW4odGl0bGUpID49IHdpZHRoLTIgKSB7CisJLyogdHJ1bmNhdGUgbG9uZyB0aXRsZSAtLSBtZWMgKi8KKwljaGFyICogdGl0bGUyID0gbWFsbG9jKHdpZHRoLTIrMSk7CisJbWVtY3B5KCB0aXRsZTIsIHRpdGxlLCB3aWR0aC0yICk7CisJdGl0bGUyW3dpZHRoLTJdID0gJ1wwJzsKKwl0aXRsZSA9IHRpdGxlMjsKKyAgICB9CisKKyAgICBpZiAodGl0bGUgIT0gTlVMTCkgeworCXdhdHRyc2V0IChkaWFsb2csIHRpdGxlX2F0dHIpOworCW12d2FkZGNoIChkaWFsb2csIDAsICh3aWR0aCAtIHN0cmxlbih0aXRsZSkpLzIgLSAxLCAnICcpOworCXdhZGRzdHIgKGRpYWxvZywgKGNoYXIgKil0aXRsZSk7CisJd2FkZGNoIChkaWFsb2csICcgJyk7CisgICAgfQorICAgIHdhdHRyc2V0IChkaWFsb2csIGRpYWxvZ19hdHRyKTsKKyAgICBwcmludF9hdXRvd3JhcCAoZGlhbG9nLCBwcm9tcHQsIHdpZHRoIC0gMiwgMSwgMik7CisKKyAgICBpZiAocGF1c2UpIHsKKwl3YXR0cnNldCAoZGlhbG9nLCBib3JkZXJfYXR0cik7CisJbXZ3YWRkY2ggKGRpYWxvZywgaGVpZ2h0IC0gMywgMCwgQUNTX0xURUUpOworCWZvciAoaSA9IDA7IGkgPCB3aWR0aCAtIDI7IGkrKykKKwkgICAgd2FkZGNoIChkaWFsb2csIEFDU19ITElORSk7CisJd2F0dHJzZXQgKGRpYWxvZywgZGlhbG9nX2F0dHIpOworCXdhZGRjaCAoZGlhbG9nLCBBQ1NfUlRFRSk7CisKKwlwcmludF9idXR0b24gKGRpYWxvZywgIiAgT2sgICIsCisJCSAgICAgIGhlaWdodCAtIDIsIHdpZHRoIC8gMiAtIDQsIFRSVUUpOworCisJd3JlZnJlc2ggKGRpYWxvZyk7CisJd2hpbGUgKGtleSAhPSBFU0MgJiYga2V5ICE9ICdcbicgJiYga2V5ICE9ICcgJyAmJgorICAgICAgICAgICAgICAga2V5ICE9ICdPJyAmJiBrZXkgIT0gJ28nICYmIGtleSAhPSAnWCcgJiYga2V5ICE9ICd4JykKKwkgICAga2V5ID0gd2dldGNoIChkaWFsb2cpOworICAgIH0gZWxzZSB7CisJa2V5ID0gJ1xuJzsKKwl3cmVmcmVzaCAoZGlhbG9nKTsKKyAgICB9CisKKyAgICBkZWx3aW4gKGRpYWxvZyk7CisgICAgcmV0dXJuIGtleSA9PSBFU0MgPyAtMSA6IDA7Cit9CmRpZmYgLS1naXQgYS9zY3JpcHRzL2x4ZGlhbG9nL3RleHRib3guYyBiL3NjcmlwdHMvbHhkaWFsb2cvdGV4dGJveC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMjNkZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2x4ZGlhbG9nL3RleHRib3guYwpAQCAtMCwwICsxLDU1NiBAQAorLyoKKyAqICB0ZXh0Ym94LmMgLS0gaW1wbGVtZW50cyB0aGUgdGV4dCBib3gKKyAqCisgKiAgT1JJR0lOQUwgQVVUSE9SOiBTYXZpbyBMYW0gKGxhbTgzNkBjcy5jdWhrLmhrKQorICogIE1PRElGSUVEIEZPUiBMSU5VWCBLRVJORUwgQ09ORklHIEJZOiBXaWxsaWFtIFJvYWRjYXAgKHJvYWRjYXBAY2Z3LmNvbSkKKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorICogIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKyAqICBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQorICogIEZvdW5kYXRpb24sIEluYy4sIDY3NSBNYXNzIEF2ZSwgQ2FtYnJpZGdlLCBNQSAwMjEzOSwgVVNBLgorICovCisKKyNpbmNsdWRlICJkaWFsb2cuaCIKKworc3RhdGljIHZvaWQgYmFja19saW5lcyAoaW50IG4pOworc3RhdGljIHZvaWQgcHJpbnRfcGFnZSAoV0lORE9XICogd2luLCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpOworc3RhdGljIHZvaWQgcHJpbnRfbGluZSAoV0lORE9XICogd2luLCBpbnQgcm93LCBpbnQgd2lkdGgpOworc3RhdGljIGNoYXIgKmdldF9saW5lICh2b2lkKTsKK3N0YXRpYyB2b2lkIHByaW50X3Bvc2l0aW9uIChXSU5ET1cgKiB3aW4sIGludCBoZWlnaHQsIGludCB3aWR0aCk7CisKK3N0YXRpYyBpbnQgaHNjcm9sbCwgZmQsIGZpbGVfc2l6ZSwgYnl0ZXNfcmVhZDsKK3N0YXRpYyBpbnQgYmVnaW5fcmVhY2hlZCA9IDEsIGVuZF9yZWFjaGVkLCBwYWdlX2xlbmd0aDsKK3N0YXRpYyBjaGFyICpidWYsICpwYWdlOworCisvKgorICogRGlzcGxheSB0ZXh0IGZyb20gYSBmaWxlIGluIGEgZGlhbG9nIGJveC4KKyAqLworaW50CitkaWFsb2dfdGV4dGJveCAoY29uc3QgY2hhciAqdGl0bGUsIGNvbnN0IGNoYXIgKmZpbGUsIGludCBoZWlnaHQsIGludCB3aWR0aCkKK3sKKyAgICBpbnQgaSwgeCwgeSwgY3VyX3gsIGN1cl95LCBmcG9zLCBrZXkgPSAwOworICAgIGludCBwYXNzZWRfZW5kOworICAgIGNoYXIgc2VhcmNoX3Rlcm1bTUFYX0xFTiArIDFdOworICAgIFdJTkRPVyAqZGlhbG9nLCAqdGV4dDsKKworICAgIHNlYXJjaF90ZXJtWzBdID0gJ1wwJzsJLyogbm8gc2VhcmNoIHRlcm0gZW50ZXJlZCB5ZXQgKi8KKworICAgIC8qIE9wZW4gaW5wdXQgZmlsZSBmb3IgcmVhZGluZyAqLworICAgIGlmICgoZmQgPSBvcGVuIChmaWxlLCBPX1JET05MWSkpID09IC0xKSB7CisJZW5kd2luICgpOworCWZwcmludGYgKHN0ZGVyciwKKwkJICJcbkNhbid0IG9wZW4gaW5wdXQgZmlsZSBpbiBkaWFsb2dfdGV4dGJveCgpLlxuIik7CisJZXhpdCAoLTEpOworICAgIH0KKyAgICAvKiBHZXQgZmlsZSBzaXplLiBBY3R1YWxseSwgJ2ZpbGVfc2l6ZScgaXMgdGhlIHJlYWwgZmlsZSBzaXplIC0gMSwKKyAgICAgICBzaW5jZSBpdCdzIG9ubHkgdGhlIGxhc3QgYnl0ZSBvZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nICovCisgICAgaWYgKChmaWxlX3NpemUgPSBsc2VlayAoZmQsIDAsIFNFRUtfRU5EKSkgPT0gLTEpIHsKKwllbmR3aW4gKCk7CisJZnByaW50ZiAoc3RkZXJyLCAiXG5FcnJvciBnZXR0aW5nIGZpbGUgc2l6ZSBpbiBkaWFsb2dfdGV4dGJveCgpLlxuIik7CisJZXhpdCAoLTEpOworICAgIH0KKyAgICAvKiBSZXN0b3JlIGZpbGUgcG9pbnRlciB0byBiZWdpbm5pbmcgb2YgZmlsZSBhZnRlciBnZXR0aW5nIGZpbGUgc2l6ZSAqLworICAgIGlmIChsc2VlayAoZmQsIDAsIFNFRUtfU0VUKSA9PSAtMSkgeworCWVuZHdpbiAoKTsKKwlmcHJpbnRmIChzdGRlcnIsICJcbkVycm9yIG1vdmluZyBmaWxlIHBvaW50ZXIgaW4gZGlhbG9nX3RleHRib3goKS5cbiIpOworCWV4aXQgKC0xKTsKKyAgICB9CisgICAgLyogQWxsb2NhdGUgc3BhY2UgZm9yIHJlYWQgYnVmZmVyICovCisgICAgaWYgKChidWYgPSBtYWxsb2MgKEJVRl9TSVpFICsgMSkpID09IE5VTEwpIHsKKwllbmR3aW4gKCk7CisJZnByaW50ZiAoc3RkZXJyLCAiXG5DYW4ndCBhbGxvY2F0ZSBtZW1vcnkgaW4gZGlhbG9nX3RleHRib3goKS5cbiIpOworCWV4aXQgKC0xKTsKKyAgICB9CisgICAgaWYgKChieXRlc19yZWFkID0gcmVhZCAoZmQsIGJ1ZiwgQlVGX1NJWkUpKSA9PSAtMSkgeworCWVuZHdpbiAoKTsKKwlmcHJpbnRmIChzdGRlcnIsICJcbkVycm9yIHJlYWRpbmcgZmlsZSBpbiBkaWFsb2dfdGV4dGJveCgpLlxuIik7CisJZXhpdCAoLTEpOworICAgIH0KKyAgICBidWZbYnl0ZXNfcmVhZF0gPSAnXDAnOwkvKiBtYXJrIGVuZCBvZiB2YWxpZCBkYXRhICovCisgICAgcGFnZSA9IGJ1ZjsJCQkvKiBwYWdlIGlzIHBvaW50ZXIgdG8gc3RhcnQgb2YgcGFnZSB0byBiZSBkaXNwbGF5ZWQgKi8KKworICAgIC8qIGNlbnRlciBkaWFsb2cgYm94IG9uIHNjcmVlbiAqLworICAgIHggPSAoQ09MUyAtIHdpZHRoKSAvIDI7CisgICAgeSA9IChMSU5FUyAtIGhlaWdodCkgLyAyOworCisKKyAgICBkcmF3X3NoYWRvdyAoc3Rkc2NyLCB5LCB4LCBoZWlnaHQsIHdpZHRoKTsKKworICAgIGRpYWxvZyA9IG5ld3dpbiAoaGVpZ2h0LCB3aWR0aCwgeSwgeCk7CisgICAga2V5cGFkIChkaWFsb2csIFRSVUUpOworCisgICAgLyogQ3JlYXRlIHdpbmRvdyBmb3IgdGV4dCByZWdpb24sIHVzZWQgZm9yIHNjcm9sbGluZyB0ZXh0ICovCisgICAgdGV4dCA9IHN1YndpbiAoZGlhbG9nLCBoZWlnaHQgLSA0LCB3aWR0aCAtIDIsIHkgKyAxLCB4ICsgMSk7CisgICAgd2F0dHJzZXQgKHRleHQsIGRpYWxvZ19hdHRyKTsKKyAgICB3YmtnZHNldCAodGV4dCwgZGlhbG9nX2F0dHIgJiBBX0NPTE9SKTsKKworICAgIGtleXBhZCAodGV4dCwgVFJVRSk7CisKKyAgICAvKiByZWdpc3RlciB0aGUgbmV3IHdpbmRvdywgYWxvbmcgd2l0aCBpdHMgYm9yZGVycyAqLworICAgIGRyYXdfYm94IChkaWFsb2csIDAsIDAsIGhlaWdodCwgd2lkdGgsIGRpYWxvZ19hdHRyLCBib3JkZXJfYXR0cik7CisKKyAgICB3YXR0cnNldCAoZGlhbG9nLCBib3JkZXJfYXR0cik7CisgICAgbXZ3YWRkY2ggKGRpYWxvZywgaGVpZ2h0LTMsIDAsIEFDU19MVEVFKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGggLSAyOyBpKyspCisJd2FkZGNoIChkaWFsb2csIEFDU19ITElORSk7CisgICAgd2F0dHJzZXQgKGRpYWxvZywgZGlhbG9nX2F0dHIpOworICAgIHdia2dkc2V0IChkaWFsb2csIGRpYWxvZ19hdHRyICYgQV9DT0xPUik7CisgICAgd2FkZGNoIChkaWFsb2csIEFDU19SVEVFKTsKKworICAgIGlmICh0aXRsZSAhPSBOVUxMICYmIHN0cmxlbih0aXRsZSkgPj0gd2lkdGgtMiApIHsKKwkvKiB0cnVuY2F0ZSBsb25nIHRpdGxlIC0tIG1lYyAqLworCWNoYXIgKiB0aXRsZTIgPSBtYWxsb2Mod2lkdGgtMisxKTsKKwltZW1jcHkoIHRpdGxlMiwgdGl0bGUsIHdpZHRoLTIgKTsKKwl0aXRsZTJbd2lkdGgtMl0gPSAnXDAnOworCXRpdGxlID0gdGl0bGUyOworICAgIH0KKworICAgIGlmICh0aXRsZSAhPSBOVUxMKSB7CisJd2F0dHJzZXQgKGRpYWxvZywgdGl0bGVfYXR0cik7CisJbXZ3YWRkY2ggKGRpYWxvZywgMCwgKHdpZHRoIC0gc3RybGVuKHRpdGxlKSkvMiAtIDEsICcgJyk7CisJd2FkZHN0ciAoZGlhbG9nLCAoY2hhciAqKXRpdGxlKTsKKwl3YWRkY2ggKGRpYWxvZywgJyAnKTsKKyAgICB9CisgICAgcHJpbnRfYnV0dG9uIChkaWFsb2csICIgRXhpdCAiLCBoZWlnaHQgLSAyLCB3aWR0aCAvIDIgLSA0LCBUUlVFKTsKKyAgICB3bm91dHJlZnJlc2ggKGRpYWxvZyk7CisgICAgZ2V0eXggKGRpYWxvZywgY3VyX3ksIGN1cl94KTsJLyogU2F2ZSBjdXJzb3IgcG9zaXRpb24gKi8KKworICAgIC8qIFByaW50IGZpcnN0IHBhZ2Ugb2YgdGV4dCAqLworICAgIGF0dHJfY2xlYXIgKHRleHQsIGhlaWdodCAtIDQsIHdpZHRoIC0gMiwgZGlhbG9nX2F0dHIpOworICAgIHByaW50X3BhZ2UgKHRleHQsIGhlaWdodCAtIDQsIHdpZHRoIC0gMik7CisgICAgcHJpbnRfcG9zaXRpb24gKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCk7CisgICAgd21vdmUgKGRpYWxvZywgY3VyX3ksIGN1cl94KTsJLyogUmVzdG9yZSBjdXJzb3IgcG9zaXRpb24gKi8KKyAgICB3cmVmcmVzaCAoZGlhbG9nKTsKKworICAgIHdoaWxlICgoa2V5ICE9IEVTQykgJiYgKGtleSAhPSAnXG4nKSkgeworCWtleSA9IHdnZXRjaCAoZGlhbG9nKTsKKwlzd2l0Y2ggKGtleSkgeworCWNhc2UgJ0UnOgkJLyogRXhpdCAqLworCWNhc2UgJ2UnOgorCWNhc2UgJ1gnOgorCWNhc2UgJ3gnOgorCSAgICBkZWx3aW4gKGRpYWxvZyk7CisJICAgIGZyZWUgKGJ1Zik7CisJICAgIGNsb3NlIChmZCk7CisJICAgIHJldHVybiAwOworCWNhc2UgJ2cnOgkJLyogRmlyc3QgcGFnZSAqLworCWNhc2UgS0VZX0hPTUU6CisJICAgIGlmICghYmVnaW5fcmVhY2hlZCkgeworCQliZWdpbl9yZWFjaGVkID0gMTsKKwkJLyogRmlyc3QgcGFnZSBub3QgaW4gYnVmZmVyPyAqLworCQlpZiAoKGZwb3MgPSBsc2VlayAoZmQsIDAsIFNFRUtfQ1VSKSkgPT0gLTEpIHsKKwkJICAgIGVuZHdpbiAoKTsKKwkJICAgIGZwcmludGYgKHN0ZGVyciwKKwkJICAgICAgIlxuRXJyb3IgbW92aW5nIGZpbGUgcG9pbnRlciBpbiBkaWFsb2dfdGV4dGJveCgpLlxuIik7CisJCSAgICBleGl0ICgtMSk7CisJCX0KKwkJaWYgKGZwb3MgPiBieXRlc19yZWFkKSB7CS8qIFllcywgd2UgaGF2ZSB0byByZWFkIGl0IGluICovCisJCSAgICBpZiAobHNlZWsgKGZkLCAwLCBTRUVLX1NFVCkgPT0gLTEpIHsKKwkJCWVuZHdpbiAoKTsKKwkJCWZwcmludGYgKHN0ZGVyciwgIlxuRXJyb3IgbW92aW5nIGZpbGUgcG9pbnRlciBpbiAiCisJCQkJICJkaWFsb2dfdGV4dGJveCgpLlxuIik7CisJCQlleGl0ICgtMSk7CisJCSAgICB9CisJCSAgICBpZiAoKGJ5dGVzX3JlYWQgPSByZWFkIChmZCwgYnVmLCBCVUZfU0laRSkpID09IC0xKSB7CisJCQllbmR3aW4gKCk7CisJCQlmcHJpbnRmIChzdGRlcnIsCisJCQkgICAgICJcbkVycm9yIHJlYWRpbmcgZmlsZSBpbiBkaWFsb2dfdGV4dGJveCgpLlxuIik7CisJCQlleGl0ICgtMSk7CisJCSAgICB9CisJCSAgICBidWZbYnl0ZXNfcmVhZF0gPSAnXDAnOworCQl9CisJCXBhZ2UgPSBidWY7CisJCXByaW50X3BhZ2UgKHRleHQsIGhlaWdodCAtIDQsIHdpZHRoIC0gMik7CisJCXByaW50X3Bvc2l0aW9uIChkaWFsb2csIGhlaWdodCwgd2lkdGgpOworCQl3bW92ZSAoZGlhbG9nLCBjdXJfeSwgY3VyX3gpOwkvKiBSZXN0b3JlIGN1cnNvciBwb3NpdGlvbiAqLworCQl3cmVmcmVzaCAoZGlhbG9nKTsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlICdHJzoJCS8qIExhc3QgcGFnZSAqLworCWNhc2UgS0VZX0VORDoKKworCSAgICBlbmRfcmVhY2hlZCA9IDE7CisJICAgIC8qIExhc3QgcGFnZSBub3QgaW4gYnVmZmVyPyAqLworCSAgICBpZiAoKGZwb3MgPSBsc2VlayAoZmQsIDAsIFNFRUtfQ1VSKSkgPT0gLTEpIHsKKwkJZW5kd2luICgpOworCQlmcHJpbnRmIChzdGRlcnIsCisJCSAgICAgICJcbkVycm9yIG1vdmluZyBmaWxlIHBvaW50ZXIgaW4gZGlhbG9nX3RleHRib3goKS5cbiIpOworCQlleGl0ICgtMSk7CisJICAgIH0KKwkgICAgaWYgKGZwb3MgPCBmaWxlX3NpemUpIHsJLyogWWVzLCB3ZSBoYXZlIHRvIHJlYWQgaXQgaW4gKi8KKwkJaWYgKGxzZWVrIChmZCwgLUJVRl9TSVpFLCBTRUVLX0VORCkgPT0gLTEpIHsKKwkJICAgIGVuZHdpbiAoKTsKKwkJICAgIGZwcmludGYgKHN0ZGVyciwKKwkJICAgICAgIlxuRXJyb3IgbW92aW5nIGZpbGUgcG9pbnRlciBpbiBkaWFsb2dfdGV4dGJveCgpLlxuIik7CisJCSAgICBleGl0ICgtMSk7CisJCX0KKwkJaWYgKChieXRlc19yZWFkID0gcmVhZCAoZmQsIGJ1ZiwgQlVGX1NJWkUpKSA9PSAtMSkgeworCQkgICAgZW5kd2luICgpOworCQkgICAgZnByaW50ZiAoc3RkZXJyLAorCQkJICAgICAiXG5FcnJvciByZWFkaW5nIGZpbGUgaW4gZGlhbG9nX3RleHRib3goKS5cbiIpOworCQkgICAgZXhpdCAoLTEpOworCQl9CisJCWJ1ZltieXRlc19yZWFkXSA9ICdcMCc7CisJICAgIH0KKwkgICAgcGFnZSA9IGJ1ZiArIGJ5dGVzX3JlYWQ7CisJICAgIGJhY2tfbGluZXMgKGhlaWdodCAtIDQpOworCSAgICBwcmludF9wYWdlICh0ZXh0LCBoZWlnaHQgLSA0LCB3aWR0aCAtIDIpOworCSAgICBwcmludF9wb3NpdGlvbiAoZGlhbG9nLCBoZWlnaHQsIHdpZHRoKTsKKwkgICAgd21vdmUgKGRpYWxvZywgY3VyX3ksIGN1cl94KTsJLyogUmVzdG9yZSBjdXJzb3IgcG9zaXRpb24gKi8KKwkgICAgd3JlZnJlc2ggKGRpYWxvZyk7CisJICAgIGJyZWFrOworCWNhc2UgJ0snOgkJLyogUHJldmlvdXMgbGluZSAqLworCWNhc2UgJ2snOgorCWNhc2UgS0VZX1VQOgorCSAgICBpZiAoIWJlZ2luX3JlYWNoZWQpIHsKKwkJYmFja19saW5lcyAocGFnZV9sZW5ndGggKyAxKTsKKworCQkvKiBXZSBkb24ndCBjYWxsIHByaW50X3BhZ2UoKSBoZXJlIGJ1dCB1c2Ugc2Nyb2xsaW5nIHRvIGVuc3VyZQorCQkgICBmYXN0ZXIgc2NyZWVuIHVwZGF0ZS4gSG93ZXZlciwgJ2VuZF9yZWFjaGVkJyBhbmQKKwkJICAgJ3BhZ2VfbGVuZ3RoJyBzaG91bGQgc3RpbGwgYmUgdXBkYXRlZCwgYW5kICdwYWdlJyBzaG91bGQKKwkJICAgcG9pbnQgdG8gc3RhcnQgb2YgbmV4dCBwYWdlLiBUaGlzIGlzIGRvbmUgYnkgY2FsbGluZworCQkgICBnZXRfbGluZSgpIGluIHRoZSBmb2xsb3dpbmcgJ2ZvcicgbG9vcC4gKi8KKwkJc2Nyb2xsb2sgKHRleHQsIFRSVUUpOworCQl3c2NybCAodGV4dCwgLTEpOwkvKiBTY3JvbGwgdGV4dCByZWdpb24gZG93biBvbmUgbGluZSAqLworCQlzY3JvbGxvayAodGV4dCwgRkFMU0UpOworCQlwYWdlX2xlbmd0aCA9IDA7CisJCXBhc3NlZF9lbmQgPSAwOworCQlmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0IC0gNDsgaSsrKSB7CisJCSAgICBpZiAoIWkpIHsKKwkJCS8qIHByaW50IGZpcnN0IGxpbmUgb2YgcGFnZSAqLworCQkJcHJpbnRfbGluZSAodGV4dCwgMCwgd2lkdGggLSAyKTsKKwkJCXdub3V0cmVmcmVzaCAodGV4dCk7CisJCSAgICB9IGVsc2UKKwkJCS8qIENhbGxlZCB0byB1cGRhdGUgJ2VuZF9yZWFjaGVkJyBhbmQgJ3BhZ2UnICovCisJCQlnZXRfbGluZSAoKTsKKwkJICAgIGlmICghcGFzc2VkX2VuZCkKKwkJCXBhZ2VfbGVuZ3RoKys7CisJCSAgICBpZiAoZW5kX3JlYWNoZWQgJiYgIXBhc3NlZF9lbmQpCisJCQlwYXNzZWRfZW5kID0gMTsKKwkJfQorCisJCXByaW50X3Bvc2l0aW9uIChkaWFsb2csIGhlaWdodCwgd2lkdGgpOworCQl3bW92ZSAoZGlhbG9nLCBjdXJfeSwgY3VyX3gpOwkvKiBSZXN0b3JlIGN1cnNvciBwb3NpdGlvbiAqLworCQl3cmVmcmVzaCAoZGlhbG9nKTsKKwkgICAgfQorCSAgICBicmVhazsKKwljYXNlICdCJzoJCS8qIFByZXZpb3VzIHBhZ2UgKi8KKwljYXNlICdiJzoKKwljYXNlIEtFWV9QUEFHRToKKwkgICAgaWYgKGJlZ2luX3JlYWNoZWQpCisJCWJyZWFrOworCSAgICBiYWNrX2xpbmVzIChwYWdlX2xlbmd0aCArIGhlaWdodCAtIDQpOworCSAgICBwcmludF9wYWdlICh0ZXh0LCBoZWlnaHQgLSA0LCB3aWR0aCAtIDIpOworCSAgICBwcmludF9wb3NpdGlvbiAoZGlhbG9nLCBoZWlnaHQsIHdpZHRoKTsKKwkgICAgd21vdmUgKGRpYWxvZywgY3VyX3ksIGN1cl94KTsKKwkgICAgd3JlZnJlc2ggKGRpYWxvZyk7CisJICAgIGJyZWFrOworCWNhc2UgJ0onOgkJLyogTmV4dCBsaW5lICovCisJY2FzZSAnaic6CisJY2FzZSBLRVlfRE9XTjoKKwkgICAgaWYgKCFlbmRfcmVhY2hlZCkgeworCQliZWdpbl9yZWFjaGVkID0gMDsKKwkJc2Nyb2xsb2sgKHRleHQsIFRSVUUpOworCQlzY3JvbGwgKHRleHQpOwkvKiBTY3JvbGwgdGV4dCByZWdpb24gdXAgb25lIGxpbmUgKi8KKwkJc2Nyb2xsb2sgKHRleHQsIEZBTFNFKTsKKwkJcHJpbnRfbGluZSAodGV4dCwgaGVpZ2h0IC0gNSwgd2lkdGggLSAyKTsKKwkJd25vdXRyZWZyZXNoICh0ZXh0KTsKKwkJcHJpbnRfcG9zaXRpb24gKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCk7CisJCXdtb3ZlIChkaWFsb2csIGN1cl95LCBjdXJfeCk7CS8qIFJlc3RvcmUgY3Vyc29yIHBvc2l0aW9uICovCisJCXdyZWZyZXNoIChkaWFsb2cpOworCSAgICB9CisJICAgIGJyZWFrOworCWNhc2UgS0VZX05QQUdFOgkJLyogTmV4dCBwYWdlICovCisJY2FzZSAnICc6CisJICAgIGlmIChlbmRfcmVhY2hlZCkKKwkJYnJlYWs7CisKKwkgICAgYmVnaW5fcmVhY2hlZCA9IDA7CisJICAgIHByaW50X3BhZ2UgKHRleHQsIGhlaWdodCAtIDQsIHdpZHRoIC0gMik7CisJICAgIHByaW50X3Bvc2l0aW9uIChkaWFsb2csIGhlaWdodCwgd2lkdGgpOworCSAgICB3bW92ZSAoZGlhbG9nLCBjdXJfeSwgY3VyX3gpOworCSAgICB3cmVmcmVzaCAoZGlhbG9nKTsKKwkgICAgYnJlYWs7CisJY2FzZSAnMCc6CQkvKiBCZWdpbm5pbmcgb2YgbGluZSAqLworCWNhc2UgJ0gnOgkJLyogU2Nyb2xsIGxlZnQgKi8KKwljYXNlICdoJzoKKwljYXNlIEtFWV9MRUZUOgorCSAgICBpZiAoaHNjcm9sbCA8PSAwKQorCQlicmVhazsKKworCSAgICBpZiAoa2V5ID09ICcwJykKKwkJaHNjcm9sbCA9IDA7CisJICAgIGVsc2UKKwkJaHNjcm9sbC0tOworCSAgICAvKiBSZXByaW50IGN1cnJlbnQgcGFnZSB0byBzY3JvbGwgaG9yaXpvbnRhbGx5ICovCisJICAgIGJhY2tfbGluZXMgKHBhZ2VfbGVuZ3RoKTsKKwkgICAgcHJpbnRfcGFnZSAodGV4dCwgaGVpZ2h0IC0gNCwgd2lkdGggLSAyKTsKKwkgICAgd21vdmUgKGRpYWxvZywgY3VyX3ksIGN1cl94KTsKKwkgICAgd3JlZnJlc2ggKGRpYWxvZyk7CisJICAgIGJyZWFrOworCWNhc2UgJ0wnOgkJLyogU2Nyb2xsIHJpZ2h0ICovCisJY2FzZSAnbCc6CisJY2FzZSBLRVlfUklHSFQ6CisJICAgIGlmIChoc2Nyb2xsID49IE1BWF9MRU4pCisJCWJyZWFrOworCSAgICBoc2Nyb2xsKys7CisJICAgIC8qIFJlcHJpbnQgY3VycmVudCBwYWdlIHRvIHNjcm9sbCBob3Jpem9udGFsbHkgKi8KKwkgICAgYmFja19saW5lcyAocGFnZV9sZW5ndGgpOworCSAgICBwcmludF9wYWdlICh0ZXh0LCBoZWlnaHQgLSA0LCB3aWR0aCAtIDIpOworCSAgICB3bW92ZSAoZGlhbG9nLCBjdXJfeSwgY3VyX3gpOworCSAgICB3cmVmcmVzaCAoZGlhbG9nKTsKKwkgICAgYnJlYWs7CisJY2FzZSBFU0M6CisJICAgIGJyZWFrOworCX0KKyAgICB9CisKKyAgICBkZWx3aW4gKGRpYWxvZyk7CisgICAgZnJlZSAoYnVmKTsKKyAgICBjbG9zZSAoZmQpOworICAgIHJldHVybiAtMTsJCQkvKiBFU0MgcHJlc3NlZCAqLworfQorCisvKgorICogR28gYmFjayAnbicgbGluZXMgaW4gdGV4dCBmaWxlLiBDYWxsZWQgYnkgZGlhbG9nX3RleHRib3goKS4KKyAqICdwYWdlJyB3aWxsIGJlIHVwZGF0ZWQgdG8gcG9pbnQgdG8gdGhlIGRlc2lyZWQgbGluZSBpbiAnYnVmJy4KKyAqLworc3RhdGljIHZvaWQKK2JhY2tfbGluZXMgKGludCBuKQoreworICAgIGludCBpLCBmcG9zOworCisgICAgYmVnaW5fcmVhY2hlZCA9IDA7CisgICAgLyogV2UgaGF2ZSB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGVuZF9yZWFjaGVkIGFuZCAhZW5kX3JlYWNoZWQKKyAgICAgICBzaW5jZSBhdCBlbmQgb2YgZmlsZSwgdGhlIGxpbmUgaXMgbm90IGVuZGVkIGJ5IGEgJ1xuJy4KKyAgICAgICBUaGUgY29kZSBpbnNpZGUgJ2lmJyBiYXNpY2FsbHkgZG9lcyBhICctLXBhZ2UnIHRvIG1vdmUgb25lCisgICAgICAgY2hhcmFjdGVyIGJhY2t3YXJkIHNvIGFzIHRvIHNraXAgJ1xuJyBvZiB0aGUgcHJldmlvdXMgbGluZSAqLworICAgIGlmICghZW5kX3JlYWNoZWQpIHsKKwkvKiBFaXRoZXIgYmVnaW5uaW5nIG9mIGJ1ZmZlciBvciBiZWdpbm5pbmcgb2YgZmlsZSByZWFjaGVkPyAqLworCWlmIChwYWdlID09IGJ1ZikgeworCSAgICBpZiAoKGZwb3MgPSBsc2VlayAoZmQsIDAsIFNFRUtfQ1VSKSkgPT0gLTEpIHsKKwkJZW5kd2luICgpOworCQlmcHJpbnRmIChzdGRlcnIsICJcbkVycm9yIG1vdmluZyBmaWxlIHBvaW50ZXIgaW4gIgorCQkJICJiYWNrX2xpbmVzKCkuXG4iKTsKKwkJZXhpdCAoLTEpOworCSAgICB9CisJICAgIGlmIChmcG9zID4gYnl0ZXNfcmVhZCkgewkvKiBOb3QgYmVnaW5uaW5nIG9mIGZpbGUgeWV0ICovCisJCS8qIFdlJ3ZlIHJlYWNoZWQgYmVnaW5uaW5nIG9mIGJ1ZmZlciwgYnV0IG5vdCBiZWdpbm5pbmcgb2YKKwkJICAgZmlsZSB5ZXQsIHNvIHJlYWQgcHJldmlvdXMgcGFydCBvZiBmaWxlIGludG8gYnVmZmVyLgorCQkgICBOb3RlIHRoYXQgd2Ugb25seSBtb3ZlIGJhY2t3YXJkIGZvciBCVUZfU0laRS8yIGJ5dGVzLAorCQkgICBidXQgbm90IEJVRl9TSVpFIGJ5dGVzIHRvIGF2b2lkIHJlLXJlYWRpbmcgYWdhaW4gaW4KKwkJICAgcHJpbnRfcGFnZSgpIGxhdGVyICovCisJCS8qIFJlYWxseSBwb3NzaWJsZSB0byBtb3ZlIGJhY2t3YXJkIEJVRl9TSVpFLzIgYnl0ZXM/ICovCisJCWlmIChmcG9zIDwgQlVGX1NJWkUgLyAyICsgYnl0ZXNfcmVhZCkgeworCQkgICAgLyogTm8sIG1vdmUgbGVzcyB0aGVuICovCisJCSAgICBpZiAobHNlZWsgKGZkLCAwLCBTRUVLX1NFVCkgPT0gLTEpIHsKKwkJCWVuZHdpbiAoKTsKKwkJCWZwcmludGYgKHN0ZGVyciwgIlxuRXJyb3IgbW92aW5nIGZpbGUgcG9pbnRlciBpbiAiCisJCQkJICJiYWNrX2xpbmVzKCkuXG4iKTsKKwkJCWV4aXQgKC0xKTsKKwkJICAgIH0KKwkJICAgIHBhZ2UgPSBidWYgKyBmcG9zIC0gYnl0ZXNfcmVhZDsKKwkJfSBlbHNlIHsJLyogTW92ZSBiYWNrd2FyZCBCVUZfU0laRS8yIGJ5dGVzICovCisJCSAgICBpZiAobHNlZWsgKGZkLCAtKEJVRl9TSVpFIC8gMiArIGJ5dGVzX3JlYWQpLCBTRUVLX0NVUikKKwkJCT09IC0xKSB7CisJCQllbmR3aW4gKCk7CisJCQlmcHJpbnRmIChzdGRlcnIsICJcbkVycm9yIG1vdmluZyBmaWxlIHBvaW50ZXIgIgorCQkJCSAiaW4gYmFja19saW5lcygpLlxuIik7CisJCQlleGl0ICgtMSk7CisJCSAgICB9CisJCSAgICBwYWdlID0gYnVmICsgQlVGX1NJWkUgLyAyOworCQl9CisJCWlmICgoYnl0ZXNfcmVhZCA9IHJlYWQgKGZkLCBidWYsIEJVRl9TSVpFKSkgPT0gLTEpIHsKKwkJICAgIGVuZHdpbiAoKTsKKwkJICAgIGZwcmludGYgKHN0ZGVyciwgIlxuRXJyb3IgcmVhZGluZyBmaWxlIGluIGJhY2tfbGluZXMoKS5cbiIpOworCQkgICAgZXhpdCAoLTEpOworCQl9CisJCWJ1ZltieXRlc19yZWFkXSA9ICdcMCc7CisJICAgIH0gZWxzZSB7CQkvKiBCZWdpbm5pbmcgb2YgZmlsZSByZWFjaGVkICovCisJCWJlZ2luX3JlYWNoZWQgPSAxOworCQlyZXR1cm47CisJICAgIH0KKwl9CisJaWYgKCooLS1wYWdlKSAhPSAnXG4nKSB7CS8qICctLXBhZ2UnIGhlcmUgKi8KKwkgICAgLyogU29tZXRoaW5nJ3Mgd3JvbmcuLi4gKi8KKwkgICAgZW5kd2luICgpOworCSAgICBmcHJpbnRmIChzdGRlcnIsICJcbkludGVybmFsIGVycm9yIGluIGJhY2tfbGluZXMoKS5cbiIpOworCSAgICBleGl0ICgtMSk7CisJfQorICAgIH0KKyAgICAvKiBHbyBiYWNrICduJyBsaW5lcyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisJZG8geworCSAgICBpZiAocGFnZSA9PSBidWYpIHsKKwkJaWYgKChmcG9zID0gbHNlZWsgKGZkLCAwLCBTRUVLX0NVUikpID09IC0xKSB7CisJCSAgICBlbmR3aW4gKCk7CisJCSAgICBmcHJpbnRmIChzdGRlcnIsCisJCQkgICJcbkVycm9yIG1vdmluZyBmaWxlIHBvaW50ZXIgaW4gYmFja19saW5lcygpLlxuIik7CisJCSAgICBleGl0ICgtMSk7CisJCX0KKwkJaWYgKGZwb3MgPiBieXRlc19yZWFkKSB7CisJCSAgICAvKiBSZWFsbHkgcG9zc2libGUgdG8gbW92ZSBiYWNrd2FyZCBCVUZfU0laRS8yIGJ5dGVzPyAqLworCQkgICAgaWYgKGZwb3MgPCBCVUZfU0laRSAvIDIgKyBieXRlc19yZWFkKSB7CisJCQkvKiBObywgbW92ZSBsZXNzIHRoZW4gKi8KKwkJCWlmIChsc2VlayAoZmQsIDAsIFNFRUtfU0VUKSA9PSAtMSkgeworCQkJICAgIGVuZHdpbiAoKTsKKwkJCSAgICBmcHJpbnRmIChzdGRlcnIsICJcbkVycm9yIG1vdmluZyBmaWxlIHBvaW50ZXIgIgorCQkJCSAgICAgImluIGJhY2tfbGluZXMoKS5cbiIpOworCQkJICAgIGV4aXQgKC0xKTsKKwkJCX0KKwkJCXBhZ2UgPSBidWYgKyBmcG9zIC0gYnl0ZXNfcmVhZDsKKwkJICAgIH0gZWxzZSB7CS8qIE1vdmUgYmFja3dhcmQgQlVGX1NJWkUvMiBieXRlcyAqLworCQkJaWYgKGxzZWVrIChmZCwgLShCVUZfU0laRSAvIDIgKyBieXRlc19yZWFkKSwKKwkJCQkgICBTRUVLX0NVUikgPT0gLTEpIHsKKwkJCSAgICBlbmR3aW4gKCk7CisJCQkgICAgZnByaW50ZiAoc3RkZXJyLCAiXG5FcnJvciBtb3ZpbmcgZmlsZSBwb2ludGVyIgorCQkJCSAgICAgIiBpbiBiYWNrX2xpbmVzKCkuXG4iKTsKKwkJCSAgICBleGl0ICgtMSk7CisJCQl9CisJCQlwYWdlID0gYnVmICsgQlVGX1NJWkUgLyAyOworCQkgICAgfQorCQkgICAgaWYgKChieXRlc19yZWFkID0gcmVhZCAoZmQsIGJ1ZiwgQlVGX1NJWkUpKSA9PSAtMSkgeworCQkJZW5kd2luICgpOworCQkJZnByaW50ZiAoc3RkZXJyLCAiXG5FcnJvciByZWFkaW5nIGZpbGUgaW4gIgorCQkJCSAiYmFja19saW5lcygpLlxuIik7CisJCQlleGl0ICgtMSk7CisJCSAgICB9CisJCSAgICBidWZbYnl0ZXNfcmVhZF0gPSAnXDAnOworCQl9IGVsc2UgewkvKiBCZWdpbm5pbmcgb2YgZmlsZSByZWFjaGVkICovCisJCSAgICBiZWdpbl9yZWFjaGVkID0gMTsKKwkJICAgIHJldHVybjsKKwkJfQorCSAgICB9CisJfSB3aGlsZSAoKigtLXBhZ2UpICE9ICdcbicpOworICAgIHBhZ2UrKzsKK30KKworLyoKKyAqIFByaW50IGEgbmV3IHBhZ2Ugb2YgdGV4dC4gQ2FsbGVkIGJ5IGRpYWxvZ190ZXh0Ym94KCkuCisgKi8KK3N0YXRpYyB2b2lkCitwcmludF9wYWdlIChXSU5ET1cgKiB3aW4sIGludCBoZWlnaHQsIGludCB3aWR0aCkKK3sKKyAgICBpbnQgaSwgcGFzc2VkX2VuZCA9IDA7CisKKyAgICBwYWdlX2xlbmd0aCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IGhlaWdodDsgaSsrKSB7CisJcHJpbnRfbGluZSAod2luLCBpLCB3aWR0aCk7CisJaWYgKCFwYXNzZWRfZW5kKQorCSAgICBwYWdlX2xlbmd0aCsrOworCWlmIChlbmRfcmVhY2hlZCAmJiAhcGFzc2VkX2VuZCkKKwkgICAgcGFzc2VkX2VuZCA9IDE7CisgICAgfQorICAgIHdub3V0cmVmcmVzaCAod2luKTsKK30KKworLyoKKyAqIFByaW50IGEgbmV3IGxpbmUgb2YgdGV4dC4gQ2FsbGVkIGJ5IGRpYWxvZ190ZXh0Ym94KCkgYW5kIHByaW50X3BhZ2UoKS4KKyAqLworc3RhdGljIHZvaWQKK3ByaW50X2xpbmUgKFdJTkRPVyAqIHdpbiwgaW50IHJvdywgaW50IHdpZHRoKQoreworICAgIGludCB5LCB4OworICAgIGNoYXIgKmxpbmU7CisKKyAgICBsaW5lID0gZ2V0X2xpbmUgKCk7CisgICAgbGluZSArPSBNSU4gKHN0cmxlbiAobGluZSksIGhzY3JvbGwpOwkvKiBTY3JvbGwgaG9yaXpvbnRhbGx5ICovCisgICAgd21vdmUgKHdpbiwgcm93LCAwKTsJLyogbW92ZSBjdXJzb3IgdG8gY29ycmVjdCBsaW5lICovCisgICAgd2FkZGNoICh3aW4sICcgJyk7CisgICAgd2FkZG5zdHIgKHdpbiwgbGluZSwgTUlOIChzdHJsZW4gKGxpbmUpLCB3aWR0aCAtIDIpKTsKKworICAgIGdldHl4ICh3aW4sIHksIHgpOworICAgIC8qIENsZWFyICdyZXNpZHVlJyBvZiBwcmV2aW91cyBsaW5lICovCisjaWYgT0xEX05DVVJTRVMKKyAgICB7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgd2lkdGggLSB4OyBpKyspCisJICAgIHdhZGRjaCAod2luLCAnICcpOworICAgIH0KKyNlbHNlCisgICAgd2NscnRvZW9sKHdpbik7CisjZW5kaWYKK30KKworLyoKKyAqIFJldHVybiBjdXJyZW50IGxpbmUgb2YgdGV4dC4gQ2FsbGVkIGJ5IGRpYWxvZ190ZXh0Ym94KCkgYW5kIHByaW50X2xpbmUoKS4KKyAqICdwYWdlJyBzaG91bGQgcG9pbnQgdG8gc3RhcnQgb2YgY3VycmVudCBsaW5lIGJlZm9yZSBjYWxsaW5nLCBhbmQgd2lsbCBiZQorICogdXBkYXRlZCB0byBwb2ludCB0byBzdGFydCBvZiBuZXh0IGxpbmUuCisgKi8KK3N0YXRpYyBjaGFyICoKK2dldF9saW5lICh2b2lkKQoreworICAgIGludCBpID0gMCwgZnBvczsKKyAgICBzdGF0aWMgY2hhciBsaW5lW01BWF9MRU4gKyAxXTsKKworICAgIGVuZF9yZWFjaGVkID0gMDsKKyAgICB3aGlsZSAoKnBhZ2UgIT0gJ1xuJykgeworCWlmICgqcGFnZSA9PSAnXDAnKSB7CisJICAgIC8qIEVpdGhlciBlbmQgb2YgZmlsZSBvciBlbmQgb2YgYnVmZmVyIHJlYWNoZWQgKi8KKwkgICAgaWYgKChmcG9zID0gbHNlZWsgKGZkLCAwLCBTRUVLX0NVUikpID09IC0xKSB7CisJCWVuZHdpbiAoKTsKKwkJZnByaW50ZiAoc3RkZXJyLCAiXG5FcnJvciBtb3ZpbmcgZmlsZSBwb2ludGVyIGluICIKKwkJCSAiZ2V0X2xpbmUoKS5cbiIpOworCQlleGl0ICgtMSk7CisJICAgIH0KKwkgICAgaWYgKGZwb3MgPCBmaWxlX3NpemUpIHsJLyogTm90IGVuZCBvZiBmaWxlIHlldCAqLworCQkvKiBXZSd2ZSByZWFjaGVkIGVuZCBvZiBidWZmZXIsIGJ1dCBub3QgZW5kIG9mIGZpbGUgeWV0LAorCQkgICBzbyByZWFkIG5leHQgcGFydCBvZiBmaWxlIGludG8gYnVmZmVyICovCisJCWlmICgoYnl0ZXNfcmVhZCA9IHJlYWQgKGZkLCBidWYsIEJVRl9TSVpFKSkgPT0gLTEpIHsKKwkJICAgIGVuZHdpbiAoKTsKKwkJICAgIGZwcmludGYgKHN0ZGVyciwgIlxuRXJyb3IgcmVhZGluZyBmaWxlIGluIGdldF9saW5lKCkuXG4iKTsKKwkJICAgIGV4aXQgKC0xKTsKKwkJfQorCQlidWZbYnl0ZXNfcmVhZF0gPSAnXDAnOworCQlwYWdlID0gYnVmOworCSAgICB9IGVsc2UgeworCQlpZiAoIWVuZF9yZWFjaGVkKQorCQkgICAgZW5kX3JlYWNoZWQgPSAxOworCQlicmVhazsKKwkgICAgfQorCX0gZWxzZSBpZiAoaSA8IE1BWF9MRU4pCisJICAgIGxpbmVbaSsrXSA9ICoocGFnZSsrKTsKKwllbHNlIHsKKwkgICAgLyogVHJ1bmNhdGUgbGluZXMgbG9uZ2VyIHRoYW4gTUFYX0xFTiBjaGFyYWN0ZXJzICovCisJICAgIGlmIChpID09IE1BWF9MRU4pCisJCWxpbmVbaSsrXSA9ICdcMCc7CisJICAgIHBhZ2UrKzsKKwl9CisgICAgfQorICAgIGlmIChpIDw9IE1BWF9MRU4pCisJbGluZVtpXSA9ICdcMCc7CisgICAgaWYgKCFlbmRfcmVhY2hlZCkKKwlwYWdlKys7CQkJLyogbW92ZSBwYXNzICdcbicgKi8KKworICAgIHJldHVybiBsaW5lOworfQorCisvKgorICogUHJpbnQgY3VycmVudCBwb3NpdGlvbgorICovCitzdGF0aWMgdm9pZAorcHJpbnRfcG9zaXRpb24gKFdJTkRPVyAqIHdpbiwgaW50IGhlaWdodCwgaW50IHdpZHRoKQoreworICAgIGludCBmcG9zLCBwZXJjZW50OworCisgICAgaWYgKChmcG9zID0gbHNlZWsgKGZkLCAwLCBTRUVLX0NVUikpID09IC0xKSB7CisJZW5kd2luICgpOworCWZwcmludGYgKHN0ZGVyciwgIlxuRXJyb3IgbW92aW5nIGZpbGUgcG9pbnRlciBpbiBwcmludF9wb3NpdGlvbigpLlxuIik7CisJZXhpdCAoLTEpOworICAgIH0KKyAgICB3YXR0cnNldCAod2luLCBwb3NpdGlvbl9pbmRpY2F0b3JfYXR0cik7CisgICAgd2JrZ2RzZXQgKHdpbiwgcG9zaXRpb25faW5kaWNhdG9yX2F0dHIgJiBBX0NPTE9SKTsKKyAgICBwZXJjZW50ID0gIWZpbGVfc2l6ZSA/CisJMTAwIDogKChmcG9zIC0gYnl0ZXNfcmVhZCArIHBhZ2UgLSBidWYpICogMTAwKSAvIGZpbGVfc2l6ZTsKKyAgICB3bW92ZSAod2luLCBoZWlnaHQgLSAzLCB3aWR0aCAtIDkpOworICAgIHdwcmludHcgKHdpbiwgIiglM2QlJSkiLCBwZXJjZW50KTsKK30KZGlmZiAtLWdpdCBhL3NjcmlwdHMvbHhkaWFsb2cvdXRpbC5jIGIvc2NyaXB0cy9seGRpYWxvZy91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTdiY2U5YgotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvbHhkaWFsb2cvdXRpbC5jCkBAIC0wLDAgKzEsMzU5IEBACisvKgorICogIHV0aWwuYworICoKKyAqICBPUklHSU5BTCBBVVRIT1I6IFNhdmlvIExhbSAobGFtODM2QGNzLmN1aGsuaGspCisgKiAgTU9ESUZJRUQgRk9SIExJTlVYIEtFUk5FTCBDT05GSUcgQlk6IFdpbGxpYW0gUm9hZGNhcCAocm9hZGNhcEBjZncuY29tKQorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisgKiAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqICBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorICogIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqICBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisgKiAgRm91bmRhdGlvbiwgSW5jLiwgNjc1IE1hc3MgQXZlLCBDYW1icmlkZ2UsIE1BIDAyMTM5LCBVU0EuCisgKi8KKworI2luY2x1ZGUgImRpYWxvZy5oIgorCisKKy8qIHVzZSBjb2xvcnMgYnkgZGVmYXVsdD8gKi8KK2Jvb2wgdXNlX2NvbG9ycyA9IDE7CisKK2NvbnN0IGNoYXIgKmJhY2t0aXRsZSA9IE5VTEw7CisKK2NvbnN0IGNoYXIgKmRpYWxvZ19yZXN1bHQ7CisKKy8qIAorICogQXR0cmlidXRlIHZhbHVlcywgZGVmYXVsdCBpcyBmb3IgbW9ubyBkaXNwbGF5CisgKi8KK2NodHlwZSBhdHRyaWJ1dGVzW10gPQoreworICAgIEFfTk9STUFMLAkJCS8qIHNjcmVlbl9hdHRyICovCisgICAgQV9OT1JNQUwsCQkJLyogc2hhZG93X2F0dHIgKi8KKyAgICBBX05PUk1BTCwJCQkvKiBkaWFsb2dfYXR0ciAqLworICAgIEFfQk9MRCwJCQkvKiB0aXRsZV9hdHRyICovCisgICAgQV9OT1JNQUwsCQkJLyogYm9yZGVyX2F0dHIgKi8KKyAgICBBX1JFVkVSU0UsCQkJLyogYnV0dG9uX2FjdGl2ZV9hdHRyICovCisgICAgQV9ESU0sCQkJLyogYnV0dG9uX2luYWN0aXZlX2F0dHIgKi8KKyAgICBBX1JFVkVSU0UsCQkJLyogYnV0dG9uX2tleV9hY3RpdmVfYXR0ciAqLworICAgIEFfQk9MRCwJCQkvKiBidXR0b25fa2V5X2luYWN0aXZlX2F0dHIgKi8KKyAgICBBX1JFVkVSU0UsCQkJLyogYnV0dG9uX2xhYmVsX2FjdGl2ZV9hdHRyICovCisgICAgQV9OT1JNQUwsCQkJLyogYnV0dG9uX2xhYmVsX2luYWN0aXZlX2F0dHIgKi8KKyAgICBBX05PUk1BTCwJCQkvKiBpbnB1dGJveF9hdHRyICovCisgICAgQV9OT1JNQUwsCQkJLyogaW5wdXRib3hfYm9yZGVyX2F0dHIgKi8KKyAgICBBX05PUk1BTCwJCQkvKiBzZWFyY2hib3hfYXR0ciAqLworICAgIEFfQk9MRCwJCQkvKiBzZWFyY2hib3hfdGl0bGVfYXR0ciAqLworICAgIEFfTk9STUFMLAkJCS8qIHNlYXJjaGJveF9ib3JkZXJfYXR0ciAqLworICAgIEFfQk9MRCwJCQkvKiBwb3NpdGlvbl9pbmRpY2F0b3JfYXR0ciAqLworICAgIEFfTk9STUFMLAkJCS8qIG1lbnVib3hfYXR0ciAqLworICAgIEFfTk9STUFMLAkJCS8qIG1lbnVib3hfYm9yZGVyX2F0dHIgKi8KKyAgICBBX05PUk1BTCwJCQkvKiBpdGVtX2F0dHIgKi8KKyAgICBBX1JFVkVSU0UsCQkJLyogaXRlbV9zZWxlY3RlZF9hdHRyICovCisgICAgQV9CT0xELAkJCS8qIHRhZ19hdHRyICovCisgICAgQV9SRVZFUlNFLAkJCS8qIHRhZ19zZWxlY3RlZF9hdHRyICovCisgICAgQV9CT0xELAkJCS8qIHRhZ19rZXlfYXR0ciAqLworICAgIEFfUkVWRVJTRSwJCQkvKiB0YWdfa2V5X3NlbGVjdGVkX2F0dHIgKi8KKyAgICBBX0JPTEQsCQkJLyogY2hlY2tfYXR0ciAqLworICAgIEFfUkVWRVJTRSwJCQkvKiBjaGVja19zZWxlY3RlZF9hdHRyICovCisgICAgQV9CT0xELAkJCS8qIHVhcnJvd19hdHRyICovCisgICAgQV9CT0xECQkJLyogZGFycm93X2F0dHIgKi8KK307CisKKworI2luY2x1ZGUgImNvbG9ycy5oIgorCisvKgorICogVGFibGUgb2YgY29sb3IgdmFsdWVzCisgKi8KK2ludCBjb2xvcl90YWJsZVtdWzNdID0KK3sKKyAgICB7U0NSRUVOX0ZHLCBTQ1JFRU5fQkcsIFNDUkVFTl9ITH0sCisgICAge1NIQURPV19GRywgU0hBRE9XX0JHLCBTSEFET1dfSEx9LAorICAgIHtESUFMT0dfRkcsIERJQUxPR19CRywgRElBTE9HX0hMfSwKKyAgICB7VElUTEVfRkcsIFRJVExFX0JHLCBUSVRMRV9ITH0sCisgICAge0JPUkRFUl9GRywgQk9SREVSX0JHLCBCT1JERVJfSEx9LAorICAgIHtCVVRUT05fQUNUSVZFX0ZHLCBCVVRUT05fQUNUSVZFX0JHLCBCVVRUT05fQUNUSVZFX0hMfSwKKyAgICB7QlVUVE9OX0lOQUNUSVZFX0ZHLCBCVVRUT05fSU5BQ1RJVkVfQkcsIEJVVFRPTl9JTkFDVElWRV9ITH0sCisgICAge0JVVFRPTl9LRVlfQUNUSVZFX0ZHLCBCVVRUT05fS0VZX0FDVElWRV9CRywgQlVUVE9OX0tFWV9BQ1RJVkVfSEx9LAorICAgIHtCVVRUT05fS0VZX0lOQUNUSVZFX0ZHLCBCVVRUT05fS0VZX0lOQUNUSVZFX0JHLCBCVVRUT05fS0VZX0lOQUNUSVZFX0hMfSwKKyAgICB7QlVUVE9OX0xBQkVMX0FDVElWRV9GRywgQlVUVE9OX0xBQkVMX0FDVElWRV9CRywgQlVUVE9OX0xBQkVMX0FDVElWRV9ITH0sCisgICAge0JVVFRPTl9MQUJFTF9JTkFDVElWRV9GRywgQlVUVE9OX0xBQkVMX0lOQUNUSVZFX0JHLAorICAgICBCVVRUT05fTEFCRUxfSU5BQ1RJVkVfSEx9LAorICAgIHtJTlBVVEJPWF9GRywgSU5QVVRCT1hfQkcsIElOUFVUQk9YX0hMfSwKKyAgICB7SU5QVVRCT1hfQk9SREVSX0ZHLCBJTlBVVEJPWF9CT1JERVJfQkcsIElOUFVUQk9YX0JPUkRFUl9ITH0sCisgICAge1NFQVJDSEJPWF9GRywgU0VBUkNIQk9YX0JHLCBTRUFSQ0hCT1hfSEx9LAorICAgIHtTRUFSQ0hCT1hfVElUTEVfRkcsIFNFQVJDSEJPWF9USVRMRV9CRywgU0VBUkNIQk9YX1RJVExFX0hMfSwKKyAgICB7U0VBUkNIQk9YX0JPUkRFUl9GRywgU0VBUkNIQk9YX0JPUkRFUl9CRywgU0VBUkNIQk9YX0JPUkRFUl9ITH0sCisgICAge1BPU0lUSU9OX0lORElDQVRPUl9GRywgUE9TSVRJT05fSU5ESUNBVE9SX0JHLCBQT1NJVElPTl9JTkRJQ0FUT1JfSEx9LAorICAgIHtNRU5VQk9YX0ZHLCBNRU5VQk9YX0JHLCBNRU5VQk9YX0hMfSwKKyAgICB7TUVOVUJPWF9CT1JERVJfRkcsIE1FTlVCT1hfQk9SREVSX0JHLCBNRU5VQk9YX0JPUkRFUl9ITH0sCisgICAge0lURU1fRkcsIElURU1fQkcsIElURU1fSEx9LAorICAgIHtJVEVNX1NFTEVDVEVEX0ZHLCBJVEVNX1NFTEVDVEVEX0JHLCBJVEVNX1NFTEVDVEVEX0hMfSwKKyAgICB7VEFHX0ZHLCBUQUdfQkcsIFRBR19ITH0sCisgICAge1RBR19TRUxFQ1RFRF9GRywgVEFHX1NFTEVDVEVEX0JHLCBUQUdfU0VMRUNURURfSEx9LAorICAgIHtUQUdfS0VZX0ZHLCBUQUdfS0VZX0JHLCBUQUdfS0VZX0hMfSwKKyAgICB7VEFHX0tFWV9TRUxFQ1RFRF9GRywgVEFHX0tFWV9TRUxFQ1RFRF9CRywgVEFHX0tFWV9TRUxFQ1RFRF9ITH0sCisgICAge0NIRUNLX0ZHLCBDSEVDS19CRywgQ0hFQ0tfSEx9LAorICAgIHtDSEVDS19TRUxFQ1RFRF9GRywgQ0hFQ0tfU0VMRUNURURfQkcsIENIRUNLX1NFTEVDVEVEX0hMfSwKKyAgICB7VUFSUk9XX0ZHLCBVQVJST1dfQkcsIFVBUlJPV19ITH0sCisgICAge0RBUlJPV19GRywgREFSUk9XX0JHLCBEQVJST1dfSEx9LAorfTsJCQkJLyogY29sb3JfdGFibGUgKi8KKworLyoKKyAqIFNldCB3aW5kb3cgdG8gYXR0cmlidXRlICdhdHRyJworICovCit2b2lkCithdHRyX2NsZWFyIChXSU5ET1cgKiB3aW4sIGludCBoZWlnaHQsIGludCB3aWR0aCwgY2h0eXBlIGF0dHIpCit7CisgICAgaW50IGksIGo7CisKKyAgICB3YXR0cnNldCAod2luLCBhdHRyKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgaGVpZ2h0OyBpKyspIHsKKwl3bW92ZSAod2luLCBpLCAwKTsKKwlmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykKKwkgICAgd2FkZGNoICh3aW4sICcgJyk7CisgICAgfQorICAgIHRvdWNod2luICh3aW4pOworfQorCit2b2lkIGRpYWxvZ19jbGVhciAodm9pZCkKK3sKKyAgICBhdHRyX2NsZWFyIChzdGRzY3IsIExJTkVTLCBDT0xTLCBzY3JlZW5fYXR0cik7CisgICAgLyogRGlzcGxheSBiYWNrZ3JvdW5kIHRpdGxlIGlmIGl0IGV4aXN0cyAuLi4gLSBTTEggKi8KKyAgICBpZiAoYmFja3RpdGxlICE9IE5VTEwpIHsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgd2F0dHJzZXQgKHN0ZHNjciwgc2NyZWVuX2F0dHIpOworICAgICAgICBtdndhZGRzdHIgKHN0ZHNjciwgMCwgMSwgKGNoYXIgKiliYWNrdGl0bGUpOworICAgICAgICB3bW92ZSAoc3Rkc2NyLCAxLCAxKTsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IENPTFMgLSAxOyBpKyspCisgICAgICAgICAgICB3YWRkY2ggKHN0ZHNjciwgQUNTX0hMSU5FKTsKKyAgICB9CisgICAgd25vdXRyZWZyZXNoIChzdGRzY3IpOworfQorCisvKgorICogRG8gc29tZSBpbml0aWFsaXphdGlvbiBmb3IgZGlhbG9nCisgKi8KK3ZvaWQKK2luaXRfZGlhbG9nICh2b2lkKQoreworICAgIGluaXRzY3IgKCk7CQkJLyogSW5pdCBjdXJzZXMgKi8KKyAgICBrZXlwYWQgKHN0ZHNjciwgVFJVRSk7CisgICAgY2JyZWFrICgpOworICAgIG5vZWNobyAoKTsKKworCisgICAgaWYgKHVzZV9jb2xvcnMpCS8qIFNldCB1cCBjb2xvcnMgKi8KKwljb2xvcl9zZXR1cCAoKTsKKworCisgICAgZGlhbG9nX2NsZWFyICgpOworfQorCisvKgorICogU2V0dXAgZm9yIGNvbG9yIGRpc3BsYXkKKyAqLwordm9pZAorY29sb3Jfc2V0dXAgKHZvaWQpCit7CisgICAgaW50IGk7CisKKyAgICBpZiAoaGFzX2NvbG9ycyAoKSkgewkvKiBUZXJtaW5hbCBzdXBwb3J0cyBjb2xvcj8gKi8KKwlzdGFydF9jb2xvciAoKTsKKworCS8qIEluaXRpYWxpemUgY29sb3IgcGFpcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgQVRUUklCVVRFX0NPVU5UOyBpKyspCisJICAgIGluaXRfcGFpciAoaSArIDEsIGNvbG9yX3RhYmxlW2ldWzBdLCBjb2xvcl90YWJsZVtpXVsxXSk7CisKKwkvKiBTZXR1cCBjb2xvciBhdHRyaWJ1dGVzICovCisJZm9yIChpID0gMDsgaSA8IEFUVFJJQlVURV9DT1VOVDsgaSsrKQorCSAgICBhdHRyaWJ1dGVzW2ldID0gQ19BVFRSIChjb2xvcl90YWJsZVtpXVsyXSwgaSArIDEpOworICAgIH0KK30KKworLyoKKyAqIEVuZCB1c2luZyBkaWFsb2cgZnVuY3Rpb25zLgorICovCit2b2lkCitlbmRfZGlhbG9nICh2b2lkKQoreworICAgIGVuZHdpbiAoKTsKK30KKworCisvKgorICogUHJpbnQgYSBzdHJpbmcgb2YgdGV4dCBpbiBhIHdpbmRvdywgYXV0b21hdGljYWxseSB3cmFwIGFyb3VuZCB0byB0aGUKKyAqIG5leHQgbGluZSBpZiB0aGUgc3RyaW5nIGlzIHRvbyBsb25nIHRvIGZpdCBvbiBvbmUgbGluZS4gTmV3bGluZQorICogY2hhcmFjdGVycyAnXG4nIGFyZSByZXBsYWNlZCBieSBzcGFjZXMuICBXZSBzdGFydCBvbiBhIG5ldyBsaW5lCisgKiBpZiB0aGVyZSBpcyBubyByb29tIGZvciBhdCBsZWFzdCA0IG5vbmJsYW5rcyBmb2xsb3dpbmcgYSBkb3VibGUtc3BhY2UuCisgKi8KK3ZvaWQKK3ByaW50X2F1dG93cmFwIChXSU5ET1cgKiB3aW4sIGNvbnN0IGNoYXIgKnByb21wdCwgaW50IHdpZHRoLCBpbnQgeSwgaW50IHgpCit7CisgICAgaW50IG5ld2wsIGN1cl94LCBjdXJfeTsKKyAgICBpbnQgaSwgcHJvbXB0X2xlbiwgcm9vbSwgd2xlbjsKKyAgICBjaGFyIHRlbXBzdHJbTUFYX0xFTiArIDFdLCAqd29yZCwgKnNwLCAqc3AyOworCisgICAgc3RyY3B5ICh0ZW1wc3RyLCBwcm9tcHQpOworCisgICAgcHJvbXB0X2xlbiA9IHN0cmxlbih0ZW1wc3RyKTsKKwkKKyAgICAvKgorICAgICAqIFJlbW92ZSBuZXdsaW5lcworICAgICAqLworICAgIGZvcihpPTA7IGk8cHJvbXB0X2xlbjsgaSsrKSB7CisJaWYodGVtcHN0cltpXSA9PSAnXG4nKSB0ZW1wc3RyW2ldID0gJyAnOworICAgIH0KKworICAgIGlmIChwcm9tcHRfbGVuIDw9IHdpZHRoIC0geCAqIDIpIHsJLyogSWYgcHJvbXB0IGlzIHNob3J0ICovCisJd21vdmUgKHdpbiwgeSwgKHdpZHRoIC0gcHJvbXB0X2xlbikgLyAyKTsKKwl3YWRkc3RyICh3aW4sIHRlbXBzdHIpOworICAgIH0gZWxzZSB7CisJY3VyX3ggPSB4OworCWN1cl95ID0geTsKKwluZXdsID0gMTsKKwl3b3JkID0gdGVtcHN0cjsKKwl3aGlsZSAod29yZCAmJiAqd29yZCkgeworCSAgICBzcCA9IGluZGV4KHdvcmQsICcgJyk7CisJICAgIGlmIChzcCkKKwkgICAgICAgICpzcCsrID0gMDsKKworCSAgICAvKiBXcmFwIHRvIG5leHQgbGluZSBpZiBlaXRoZXIgdGhlIHdvcmQgZG9lcyBub3QgZml0LAorCSAgICAgICBvciBpdCBpcyB0aGUgZmlyc3Qgd29yZCBvZiBhIG5ldyBzZW50ZW5jZSwgYW5kIGl0IGlzCisJICAgICAgIHNob3J0LCBhbmQgdGhlIG5leHQgd29yZCBkb2VzIG5vdCBmaXQuICovCisJICAgIHJvb20gPSB3aWR0aCAtIGN1cl94OworCSAgICB3bGVuID0gc3RybGVuKHdvcmQpOworCSAgICBpZiAod2xlbiA+IHJvb20gfHwKKwkgICAgICAgKG5ld2wgJiYgd2xlbiA8IDQgJiYgc3AgJiYgd2xlbisxK3N0cmxlbihzcCkgPiByb29tCisJCSAgICAgJiYgKCEoc3AyID0gaW5kZXgoc3AsICcgJykpIHx8IHdsZW4rMSsoc3AyLXNwKSA+IHJvb20pKSkgeworCQljdXJfeSsrOworCQljdXJfeCA9IHg7CisJICAgIH0KKwkgICAgd21vdmUgKHdpbiwgY3VyX3ksIGN1cl94KTsKKwkgICAgd2FkZHN0ciAod2luLCB3b3JkKTsKKwkgICAgZ2V0eXggKHdpbiwgY3VyX3ksIGN1cl94KTsKKwkgICAgY3VyX3grKzsKKwkgICAgaWYgKHNwICYmICpzcCA9PSAnICcpIHsKKwkgICAgICAgIGN1cl94Kys7CS8qIGRvdWJsZSBzcGFjZSAqLworCQl3aGlsZSAoKisrc3AgPT0gJyAnKTsKKwkJbmV3bCA9IDE7CisJICAgIH0gZWxzZQorCSAgICAgICAgbmV3bCA9IDA7CisJICAgIHdvcmQgPSBzcDsKKwl9CisgICAgfQorfQorCisvKgorICogUHJpbnQgYSBidXR0b24KKyAqLwordm9pZAorcHJpbnRfYnV0dG9uIChXSU5ET1cgKiB3aW4sIGNvbnN0IGNoYXIgKmxhYmVsLCBpbnQgeSwgaW50IHgsIGludCBzZWxlY3RlZCkKK3sKKyAgICBpbnQgaSwgdGVtcDsKKworICAgIHdtb3ZlICh3aW4sIHksIHgpOworICAgIHdhdHRyc2V0ICh3aW4sIHNlbGVjdGVkID8gYnV0dG9uX2FjdGl2ZV9hdHRyIDogYnV0dG9uX2luYWN0aXZlX2F0dHIpOworICAgIHdhZGRzdHIgKHdpbiwgIjwiKTsKKyAgICB0ZW1wID0gc3Ryc3BuIChsYWJlbCwgIiAiKTsKKyAgICBsYWJlbCArPSB0ZW1wOworICAgIHdhdHRyc2V0ICh3aW4sIHNlbGVjdGVkID8gYnV0dG9uX2xhYmVsX2FjdGl2ZV9hdHRyCisJICAgICAgOiBidXR0b25fbGFiZWxfaW5hY3RpdmVfYXR0cik7CisgICAgZm9yIChpID0gMDsgaSA8IHRlbXA7IGkrKykKKwl3YWRkY2ggKHdpbiwgJyAnKTsKKyAgICB3YXR0cnNldCAod2luLCBzZWxlY3RlZCA/IGJ1dHRvbl9rZXlfYWN0aXZlX2F0dHIKKwkgICAgICA6IGJ1dHRvbl9rZXlfaW5hY3RpdmVfYXR0cik7CisgICAgd2FkZGNoICh3aW4sIGxhYmVsWzBdKTsKKyAgICB3YXR0cnNldCAod2luLCBzZWxlY3RlZCA/IGJ1dHRvbl9sYWJlbF9hY3RpdmVfYXR0cgorCSAgICAgIDogYnV0dG9uX2xhYmVsX2luYWN0aXZlX2F0dHIpOworICAgIHdhZGRzdHIgKHdpbiwgKGNoYXIgKilsYWJlbCArIDEpOworICAgIHdhdHRyc2V0ICh3aW4sIHNlbGVjdGVkID8gYnV0dG9uX2FjdGl2ZV9hdHRyIDogYnV0dG9uX2luYWN0aXZlX2F0dHIpOworICAgIHdhZGRzdHIgKHdpbiwgIj4iKTsKKyAgICB3bW92ZSAod2luLCB5LCB4ICsgdGVtcCArIDEpOworfQorCisvKgorICogRHJhdyBhIHJlY3Rhbmd1bGFyIGJveCB3aXRoIGxpbmUgZHJhd2luZyBjaGFyYWN0ZXJzCisgKi8KK3ZvaWQKK2RyYXdfYm94IChXSU5ET1cgKiB3aW4sIGludCB5LCBpbnQgeCwgaW50IGhlaWdodCwgaW50IHdpZHRoLAorCSAgY2h0eXBlIGJveCwgY2h0eXBlIGJvcmRlcikKK3sKKyAgICBpbnQgaSwgajsKKworICAgIHdhdHRyc2V0ICh3aW4sIDApOworICAgIGZvciAoaSA9IDA7IGkgPCBoZWlnaHQ7IGkrKykgeworCXdtb3ZlICh3aW4sIHkgKyBpLCB4KTsKKwlmb3IgKGogPSAwOyBqIDwgd2lkdGg7IGorKykKKwkgICAgaWYgKCFpICYmICFqKQorCQl3YWRkY2ggKHdpbiwgYm9yZGVyIHwgQUNTX1VMQ09STkVSKTsKKwkgICAgZWxzZSBpZiAoaSA9PSBoZWlnaHQgLSAxICYmICFqKQorCQl3YWRkY2ggKHdpbiwgYm9yZGVyIHwgQUNTX0xMQ09STkVSKTsKKwkgICAgZWxzZSBpZiAoIWkgJiYgaiA9PSB3aWR0aCAtIDEpCisJCXdhZGRjaCAod2luLCBib3ggfCBBQ1NfVVJDT1JORVIpOworCSAgICBlbHNlIGlmIChpID09IGhlaWdodCAtIDEgJiYgaiA9PSB3aWR0aCAtIDEpCisJCXdhZGRjaCAod2luLCBib3ggfCBBQ1NfTFJDT1JORVIpOworCSAgICBlbHNlIGlmICghaSkKKwkJd2FkZGNoICh3aW4sIGJvcmRlciB8IEFDU19ITElORSk7CisJICAgIGVsc2UgaWYgKGkgPT0gaGVpZ2h0IC0gMSkKKwkJd2FkZGNoICh3aW4sIGJveCB8IEFDU19ITElORSk7CisJICAgIGVsc2UgaWYgKCFqKQorCQl3YWRkY2ggKHdpbiwgYm9yZGVyIHwgQUNTX1ZMSU5FKTsKKwkgICAgZWxzZSBpZiAoaiA9PSB3aWR0aCAtIDEpCisJCXdhZGRjaCAod2luLCBib3ggfCBBQ1NfVkxJTkUpOworCSAgICBlbHNlCisJCXdhZGRjaCAod2luLCBib3ggfCAnICcpOworICAgIH0KK30KKworLyoKKyAqIERyYXcgc2hhZG93cyBhbG9uZyB0aGUgcmlnaHQgYW5kIGJvdHRvbSBlZGdlIHRvIGdpdmUgYSBtb3JlIDNEIGxvb2sKKyAqIHRvIHRoZSBib3hlcworICovCit2b2lkCitkcmF3X3NoYWRvdyAoV0lORE9XICogd2luLCBpbnQgeSwgaW50IHgsIGludCBoZWlnaHQsIGludCB3aWR0aCkKK3sKKyAgICBpbnQgaTsKKworICAgIGlmIChoYXNfY29sb3JzICgpKSB7CS8qIFdoZXRoZXIgdGVybWluYWwgc3VwcG9ydHMgY29sb3I/ICovCisJd2F0dHJzZXQgKHdpbiwgc2hhZG93X2F0dHIpOworCXdtb3ZlICh3aW4sIHkgKyBoZWlnaHQsIHggKyAyKTsKKwlmb3IgKGkgPSAwOyBpIDwgd2lkdGg7IGkrKykKKwkgICAgd2FkZGNoICh3aW4sIHdpbmNoICh3aW4pICYgQV9DSEFSVEVYVCk7CisJZm9yIChpID0geSArIDE7IGkgPCB5ICsgaGVpZ2h0ICsgMTsgaSsrKSB7CisJICAgIHdtb3ZlICh3aW4sIGksIHggKyB3aWR0aCk7CisJICAgIHdhZGRjaCAod2luLCB3aW5jaCAod2luKSAmIEFfQ0hBUlRFWFQpOworCSAgICB3YWRkY2ggKHdpbiwgd2luY2ggKHdpbikgJiBBX0NIQVJURVhUKTsKKwl9CisJd25vdXRyZWZyZXNoICh3aW4pOworICAgIH0KK30KKworLyoKKyAqICBSZXR1cm4gdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBhbHBoYWJldGljIGNoYXJhY3RlciBpbiBhIHN0cmluZy4KKyAqLworaW50CitmaXJzdF9hbHBoYShjb25zdCBjaGFyICpzdHJpbmcsIGNvbnN0IGNoYXIgKmV4ZW1wdCkKK3sKKwlpbnQgaSwgaW5fcGFyZW49MCwgYzsKKworCWZvciAoaSA9IDA7IGkgPCBzdHJsZW4oc3RyaW5nKTsgaSsrKSB7CisJCWMgPSB0b2xvd2VyKHN0cmluZ1tpXSk7CisKKwkJaWYgKHN0cmNocigiPFsoIiwgYykpICsraW5fcGFyZW47CisJCWlmIChzdHJjaHIoIj5dKSIsIGMpICYmIGluX3BhcmVuID4gMCkgLS1pbl9wYXJlbjsKKworCQlpZiAoKCEgaW5fcGFyZW4pICYmIGlzYWxwaGEoYykgJiYgCisJCSAgICAgc3RyY2hyKGV4ZW1wdCwgYykgPT0gMCkKKwkJCXJldHVybiBpOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9seGRpYWxvZy95ZXNuby5jIGIvc2NyaXB0cy9seGRpYWxvZy95ZXNuby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExZmNjMjUKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL2x4ZGlhbG9nL3llc25vLmMKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiAgeWVzbm8uYyAtLSBpbXBsZW1lbnRzIHRoZSB5ZXMvbm8gYm94CisgKgorICogIE9SSUdJTkFMIEFVVEhPUjogU2F2aW8gTGFtIChsYW04MzZAY3MuY3Voay5oaykKKyAqICBNT0RJRklFRCBGT1IgTElOVVggS0VSTkVMIENPTkZJRyBCWTogV2lsbGlhbSBSb2FkY2FwIChyb2FkY2FwQGNmdy5jb20pCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyCisgKiAgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKyAqICBGb3VuZGF0aW9uLCBJbmMuLCA2NzUgTWFzcyBBdmUsIENhbWJyaWRnZSwgTUEgMDIxMzksIFVTQS4KKyAqLworCisjaW5jbHVkZSAiZGlhbG9nLmgiCisKKy8qCisgKiBEaXNwbGF5IHRlcm1pbmF0aW9uIGJ1dHRvbnMKKyAqLworc3RhdGljIHZvaWQKK3ByaW50X2J1dHRvbnMoV0lORE9XICpkaWFsb2csIGludCBoZWlnaHQsIGludCB3aWR0aCwgaW50IHNlbGVjdGVkKQoreworICAgIGludCB4ID0gd2lkdGggLyAyIC0gMTA7CisgICAgaW50IHkgPSBoZWlnaHQgLSAyOworCisgICAgcHJpbnRfYnV0dG9uIChkaWFsb2csICIgWWVzICIsIHksIHgsIHNlbGVjdGVkID09IDApOworICAgIHByaW50X2J1dHRvbiAoZGlhbG9nLCAiICBObyAgIiwgeSwgeCArIDEzLCBzZWxlY3RlZCA9PSAxKTsKKworICAgIHdtb3ZlKGRpYWxvZywgeSwgeCsxICsgMTMqc2VsZWN0ZWQgKTsKKyAgICB3cmVmcmVzaCAoZGlhbG9nKTsKK30KKworLyoKKyAqIERpc3BsYXkgYSBkaWFsb2cgYm94IHdpdGggdHdvIGJ1dHRvbnMgLSBZZXMgYW5kIE5vCisgKi8KK2ludAorZGlhbG9nX3llc25vIChjb25zdCBjaGFyICp0aXRsZSwgY29uc3QgY2hhciAqcHJvbXB0LCBpbnQgaGVpZ2h0LCBpbnQgd2lkdGgpCit7CisgICAgaW50IGksIHgsIHksIGtleSA9IDAsIGJ1dHRvbiA9IDA7CisgICAgV0lORE9XICpkaWFsb2c7CisKKyAgICAvKiBjZW50ZXIgZGlhbG9nIGJveCBvbiBzY3JlZW4gKi8KKyAgICB4ID0gKENPTFMgLSB3aWR0aCkgLyAyOworICAgIHkgPSAoTElORVMgLSBoZWlnaHQpIC8gMjsKKworICAgIGRyYXdfc2hhZG93IChzdGRzY3IsIHksIHgsIGhlaWdodCwgd2lkdGgpOworCisgICAgZGlhbG9nID0gbmV3d2luIChoZWlnaHQsIHdpZHRoLCB5LCB4KTsKKyAgICBrZXlwYWQgKGRpYWxvZywgVFJVRSk7CisKKyAgICBkcmF3X2JveCAoZGlhbG9nLCAwLCAwLCBoZWlnaHQsIHdpZHRoLCBkaWFsb2dfYXR0ciwgYm9yZGVyX2F0dHIpOworICAgIHdhdHRyc2V0IChkaWFsb2csIGJvcmRlcl9hdHRyKTsKKyAgICBtdndhZGRjaCAoZGlhbG9nLCBoZWlnaHQtMywgMCwgQUNTX0xURUUpOworICAgIGZvciAoaSA9IDA7IGkgPCB3aWR0aCAtIDI7IGkrKykKKwl3YWRkY2ggKGRpYWxvZywgQUNTX0hMSU5FKTsKKyAgICB3YXR0cnNldCAoZGlhbG9nLCBkaWFsb2dfYXR0cik7CisgICAgd2FkZGNoIChkaWFsb2csIEFDU19SVEVFKTsKKworICAgIGlmICh0aXRsZSAhPSBOVUxMICYmIHN0cmxlbih0aXRsZSkgPj0gd2lkdGgtMiApIHsKKwkvKiB0cnVuY2F0ZSBsb25nIHRpdGxlIC0tIG1lYyAqLworCWNoYXIgKiB0aXRsZTIgPSBtYWxsb2Mod2lkdGgtMisxKTsKKwltZW1jcHkoIHRpdGxlMiwgdGl0bGUsIHdpZHRoLTIgKTsKKwl0aXRsZTJbd2lkdGgtMl0gPSAnXDAnOworCXRpdGxlID0gdGl0bGUyOworICAgIH0KKworICAgIGlmICh0aXRsZSAhPSBOVUxMKSB7CisJd2F0dHJzZXQgKGRpYWxvZywgdGl0bGVfYXR0cik7CisJbXZ3YWRkY2ggKGRpYWxvZywgMCwgKHdpZHRoIC0gc3RybGVuKHRpdGxlKSkvMiAtIDEsICcgJyk7CisJd2FkZHN0ciAoZGlhbG9nLCAoY2hhciAqKXRpdGxlKTsKKwl3YWRkY2ggKGRpYWxvZywgJyAnKTsKKyAgICB9CisKKyAgICB3YXR0cnNldCAoZGlhbG9nLCBkaWFsb2dfYXR0cik7CisgICAgcHJpbnRfYXV0b3dyYXAgKGRpYWxvZywgcHJvbXB0LCB3aWR0aCAtIDIsIDEsIDMpOworCisgICAgcHJpbnRfYnV0dG9ucyhkaWFsb2csIGhlaWdodCwgd2lkdGgsIDApOworCisgICAgd2hpbGUgKGtleSAhPSBFU0MpIHsKKwlrZXkgPSB3Z2V0Y2ggKGRpYWxvZyk7CisJc3dpdGNoIChrZXkpIHsKKwljYXNlICdZJzoKKwljYXNlICd5JzoKKwkgICAgZGVsd2luIChkaWFsb2cpOworCSAgICByZXR1cm4gMDsKKwljYXNlICdOJzoKKwljYXNlICduJzoKKwkgICAgZGVsd2luIChkaWFsb2cpOworCSAgICByZXR1cm4gMTsKKworCWNhc2UgVEFCOgorCWNhc2UgS0VZX0xFRlQ6CisJY2FzZSBLRVlfUklHSFQ6CisJICAgIGJ1dHRvbiA9ICgoa2V5ID09IEtFWV9MRUZUID8gLS1idXR0b24gOiArK2J1dHRvbikgPCAwKQorCQkJPyAxIDogKGJ1dHRvbiA+IDEgPyAwIDogYnV0dG9uKTsKKworCSAgICBwcmludF9idXR0b25zKGRpYWxvZywgaGVpZ2h0LCB3aWR0aCwgYnV0dG9uKTsKKwkgICAgd3JlZnJlc2ggKGRpYWxvZyk7CisJICAgIGJyZWFrOworCWNhc2UgJyAnOgorCWNhc2UgJ1xuJzoKKwkgICAgZGVsd2luIChkaWFsb2cpOworCSAgICByZXR1cm4gYnV0dG9uOworCWNhc2UgRVNDOgorCSAgICBicmVhazsKKwl9CisgICAgfQorCisgICAgZGVsd2luIChkaWFsb2cpOworICAgIHJldHVybiAtMTsJCQkvKiBFU0MgcHJlc3NlZCAqLworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tYWtlbHN0IGIvc2NyaXB0cy9tYWtlbHN0Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjM0YmQ3MjM5Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9tYWtlbHN0CkBAIC0wLDAgKzEsMzEgQEAKKyMhL2Jpbi9iYXNoCisjIEEgc2NyaXB0IHRvIGR1bXAgbWl4ZWQgc291cmNlIGNvZGUgJiBhc3NlbWJseQorIyB3aXRoIGNvcnJlY3QgcmVsb2NhdGlvbnMgZnJvbSBTeXN0ZW0ubWFwCisjIFJlcXVpcmVzIHRoZSBmb2xsb3dpbmcgbGluZXMgaW4gUnVsZXMubWFrZS4KKyMgQXV0aG9yKHMpOiBESiBCYXJyb3cgKGRqYmFycm93QGRlLmlibS5jb20sYmFycm93X2RqQHlhaG9vLmNvbSkgCisjICAgICAgICAgICAgV2lsbGlhbSBTdGVhcm5zIDx3c3RlYXJuc0Bwb2JveC5jb20+CisjJS5sc3Q6ICUuYworIwkkKENDKSAkKENGTEFHUykgJChFWFRSQV9DRkxBR1MpICQoQ0ZMQUdTXyRAKSAtZyAtYyAtbyAkKi5vICQ8CisjCSQoVE9QRElSKS9zY3JpcHRzL21ha2Vsc3QgJCoubyAkKFRPUERJUikvU3lzdGVtLm1hcCAkKE9CSkRVTVApCisjCisjICAgIENvcHlyaWdodCAoQykgMjAwMCBJQk0gQ29ycG9yYXRpb24KKyMgICAgQXV0aG9yKHMpOiBESiBCYXJyb3cgKGRqYmFycm93QGRlLmlibS5jb20sYmFycm93X2RqQHlhaG9vLmNvbSkgCisjCisKK3QxPWAkMyAtLXN5bXMgJDEgfCBncmVwIC50ZXh0IHwgZ3JlcCAiIEYgIiB8IGhlYWQgLW4gMWAKK2lmIFsgLW4gIiR0MSIgXTsgdGhlbgorICB0Mj1gZWNobyAkdDEgfCBnYXdrICd7IHByaW50ICQ2IH0nYAorICBpZiBbICEgLXIgJDIgXTsgdGhlbgorICAgIGVjaG8gIk5vIFN5c3RlbS5tYXAiID4mMgorICAgIHQ3PTAKKyAgZWxzZQorICAgIHQzPWBncmVwICR0MiAkMmAKKyAgICB0ND1gZWNobyAkdDMgfCBnYXdrICd7IHByaW50ICQxIH0nYAorICAgIHQ1PWBlY2hvICR0MSB8IGdhd2sgJ3sgcHJpbnQgJDEgfSdgCisgICAgdDY9YGVjaG8gJHQ0IC0gJHQ1IHwgdHIgYS1mIEEtRmAKKyAgICB0Nz1gKCBlY2hvICBpYmFzZT0xNiA7IGVjaG8gJHQ2ICkgfCBiY2AKKyAgZmkKK2Vsc2UKKyAgdDc9MAorZmkKKyQzIC1yIC0tc291cmNlIC0tYWRqdXN0LXZtYT0kdDcgJDEKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbWFrZW1hbiBiL3NjcmlwdHMvbWFrZW1hbgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kYjNhZjY0Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9tYWtlbWFuCkBAIC0wLDAgKzEsMTg1IEBACisjIS91c3IvYmluL3BlcmwKKwordXNlIHN0cmljdDsKKworIyMgQ29weXJpZ2h0IChDKSBNaWNoYWVsIFN0aWxsIChtaWthbEBzdGlsbGhxLmNvbSkKKyMjIFJlbGVhc2VkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdQTAorIyMKKyMjIEEgc2NyaXB0IHRvIG1ha2Ugb3IgaW5zdGFsbCB0aGUgbWFucGFnZXMgZXh0cmFjdGVkIGJ5IHNwbGl0LW1hbgorIyMKKyMjIEFyZ3VlbWVudHM6ICQxIC0tIHRoZSB3b3JkICJjb252ZXJ0IiBvciAiaW5zdGFsbCIKKyMjICAgICAgICAgICAgICQyIC0tIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgU0dNTCBmaWxlcyBmb3IgdGhlIG1hbnBhZ2VzCisjIyAgICAgICAgICAgICAkMyAtLSB0aGUgZmlsZW5hbWUgd2hpY2ggY29udGFpbmVkIHRoZSBzZ21sZG9jIG91dHB1dAorIyMgICAgICAgICAgICAgICAgICAgICAoSSBuZWVkIHRoaXMgc28gSSBrbm93IHdoaWNoIG1hbnBhZ2VzIHRvIGNvbnZlcnQpCisKK215KCRMSVNUSU5HLCAkR0VORVJBVEVELCAkSU5QVVQsICRPVVRQVVQsICRmcm9udCwgJG1vZGUsICRmaWxlbmFtZSwgJHRtcGRpcik7CisKK2lmKCRBUkdWWzBdIGVxICIiKXsKKyAgZGllICJVc2FnZTogbWFrZW1hbiBbY29udmVydCB8IGluc3RhbGxdIDxkaXI+IDxmaWxlPlxuIjsKK30KKworaWYoICEgLWQgIiRBUkdWWzFdIiApeworICBkaWUgIk91dHB1dCBkaXJlY3RvcnkgXCIkQVJHVlsxXVwiIGRvZXMgbm90IGV4aXN0XG4iOworfQorCitpZigkRU5WeyJUTVBESVIifSBuZSAiIil7CisgICR0bXBkaXIgPSAkRU5WeyJUTVBESVIifTsKK30KK2Vsc2V7CisgICR0bXBkaXIgPSAiL3RtcCI7Cit9CisKK2lmKCRBUkdWWzBdIGVxICJjb252ZXJ0Iil7CisgIG9wZW4gTElTVElORywgImdyZXAgXCI8cmVmZW50cnl0aXRsZT5cIiAkQVJHVlsyXSB8IjsKKyAgd2hpbGUoPExJU1RJTkc+KXsKKyAgICBzLzxcLy4qJC8vOworICAgIHMvXi4qPi8vOworICAgIHMvXC5zZ21sLy87CisgICAgcy9zdHJ1Y3QgLy87CisgICAgcy90eXBlZGVmIC8vOworCisgICAgY2hvbXA7CisgICAgJGZpbGVuYW1lID0gJF87CisgICAgcHJpbnQgIlByb2Nlc3NpbmcgJGZpbGVuYW1lXG4iOworCisgICAgIyBPcGVuIHRoZSBpbnB1dCBmaWxlIHRvIGV4dHJhY3QgdGhlIGZyb250IG1hdHRlciwgZ2VuZXJhdGUgdGhlIG1hbiBwYWdlLAorICAgICMgYW5kIG9wZW4gaXQsIGFuZCB0aGUgcmVhcnJhbmdlIGV2ZXJ5dGhpbmcgdW50aWwgaXQgaXMgaGFwcHkKKyAgICBvcGVuIElOUFVULCAiPCAkQVJHVlsxXS8kZmlsZW5hbWUuc2dtbCI7CisgICAgJGZyb250ID0gIiI7CisgICAgJG1vZGUgPSAwOworCisgICAgIyBUaGUgbW9kZXMgdXNlZCBoZXJlIGFyZToKKyAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IDAKKyAgICAjIDwhLS0gQkVHSU5GUk9OVFRBRyAtLT4KKyAgICAjIDwhLS0gPGJvb2tpbmZvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IDEKKyAgICAjIDwhLS0gICA8bGVnYWxub3RpY2U+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSA9IDIKKyAgICAjIDwhLS0gICAgIC4uLkdQTCBvciB3aGF0ZXZlci4uLgorICAgICMgPCEtLSAgIDwvbGVnYWxub3RpY2U+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gNAorICAgICMgPCEtLSA8L2Jvb2tpbmZvPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtb2RlID0gMworICAgICMgPCEtLSBFTkRGUk9OVFRBRyAtLT4KKyAgICAjCisgICAgIyAuLi5kb2NvLi4uCisKKyAgICAjIEkga25vdyB0aGF0IHNvbWUgb2YgdGhlIGlmIHN0YXRlbWVudHMgaW4gdGhpcyB3aGlsZSBsb29wIGFyZSBpbiBhIGZ1bm55CisgICAgIyBvcmRlciwgYnV0IHRoYXQgaXMgZGVsaWJlcmF0ZS4uLgorICAgIHdoaWxlKDxJTlBVVD4peworICAgICAgaWYoJG1vZGUgPiAwKXsKKwlzLzwhLS0gLy87CisJcy8gLS0+Ly87CisJcy88ZG9jaW5mbz4vL2k7CisJczxcL2RvY2luZm8+Ly9pOworCXMvXlsgXHRdKi8vaTsKKyAgICAgIH0KKworICAgICAgaWYoJG1vZGUgPT0gMil7CisJaWYoLzxwYXJhPi9pKXsKKwl9CisJZWxzaWYoLzxcL3BhcmE+L2kpeworCSAgJGZyb250ID0gIiRmcm9udC5cXFwiIFxuIjsKKwl9CisJZWxzaWYoLzxcL2xlZ2Fsbm90aWNlPi9pKXsKKwkgICRtb2RlID0gNDsKKwl9CisJZWxzaWYoL15bIFx0XSokLyl7CisJfQorCWVsc2V7CisJICAkZnJvbnQgPSAiJGZyb250LlxcXCIgICAgICRfIjsKKwl9CisgICAgICB9CisKKyAgICAgIGlmKCRtb2RlID09IDEpeworCWlmKC88dGl0bGU+KC4qKTxcL3RpdGxlPi9pKXsKKwkgICRmcm9udCA9ICIkZnJvbnQuXFxcIiBUaGlzIGRvY3VtZW50YXRpb24gd2FzIGdlbmVyYXRlZCBmcm9tIHRoZSBib29rIHRpdGxlZCBcIiQxXCIsIHdoaWNoIGlzIHBhcnQgb2YgdGhlIExpbnV4IGtlcm5lbCBzb3VyY2UuXG4uXFxcIiBcbiI7CisJfQorCWVsc2lmKC88bGVnYWxub3RpY2U+L2kpeworCSAgJGZyb250ID0gIiRmcm9udC5cXFwiIFRoaXMgZG9jdW1lbnRhdGlvbiBjb21lcyB3aXRoIHRoZSBmb2xsb3dpbmcgbGVnYWwgbm90aWNlOlxuLlxcXCIgXG4iOworCSAgJG1vZGUgPSAyOworCX0KKworCWVsc2lmKC88YXV0aG9yPi9pKXsKKwkgICRmcm9udCA9ICIkZnJvbnQuXFxcIiBEb2N1bWVudGF0aW9uIGJ5OiAiOworCX0KKwllbHNpZigvPGZpcnN0bmFtZT4oLiopPFwvZmlyc3RuYW1lPi9pKXsKKwkgICRmcm9udCA9ICIkZnJvbnQkMSAiOworCX0KKwllbHNpZigvPHN1cm5hbWU+KC4qKTxcL3N1cm5hbWU+L2kpeworCSAgJGZyb250ID0gIiRmcm9udCQxICI7CisJfQorCWVsc2lmKC88ZW1haWw+KC4qKTxcL2VtYWlsPi9pKXsKKwkgICRmcm9udCA9ICIkZnJvbnQoJDEpIjsKKwl9CisJZWxzaWYoL1wvYXV0aG9yPi9pKXsKKwkgICRmcm9udCA9ICIkZnJvbnRcbiI7CisJfQorCisJZWxzaWYoLzxjb3B5cmlnaHQ+L2kpeworCSAgJGZyb250ID0gIiRmcm9udC5cXFwiIERvY3VtZW50YXRpb24gY29weXJpZ2h0OiAiOworCX0KKwllbHNpZigvPGhvbGRlcj4oLiopPFwvaG9sZGVyPi9pKXsKKwkgICRmcm9udCA9ICIkZnJvbnQkMSAiOworCX0KKwllbHNpZigvPHllYXI+KC4qKTxcL3llYXI+L2kpeworCSAgJGZyb250ID0gIiRmcm9udCQxICI7CisJfQorCWVsc2lmKC9cL2NvcHlyaWdodD4vaSl7CisJICAkZnJvbnQgPSAiJGZyb250XG4iOworCX0KKworCWVsc2lmKC9eWyBcdF0qJC8KKwkgICAgICB8fCAvPGFmZmlsaWF0aW9uPi9pCisJICAgICAgfHwgLzxcL2FmZmlsaWF0aW9uPi9pCisJICAgICAgfHwgLzxhZGRyZXNzPi9pCisJICAgICAgfHwgLzxcL2FkZHJlc3M+L2kKKwkgICAgICB8fCAvPGF1dGhvcmdyb3VwPi9pCisJICAgICAgfHwgLzxcL2F1dGhvcmdyb3VwPi9pCisJICAgICAgfHwgLzxcL2xlZ2Fsbm90aWNlPi9pCisgICAgICAgICAgICAgIHx8IC88ZGF0ZT4vaQorICAgICAgICAgICAgICB8fCAvPFwvZGF0ZT4vaQorICAgICAgICAgICAgICB8fCAvPGVkaXRpb24+L2kKKyAgICAgICAgICAgICAgfHwgLzxcL2VkaXRpb24+L2kKKwkgICAgICB8fCAvPHB1YmRhdGU+L2kKKwkgICAgICB8fCAvPFwvcHViZGF0ZT4vaSl7CisJfQorCWVsc2V7CisJICBwcmludCAiVW5rbm93biB0YWcgaW4gbWFucGFnZSBjb252ZXJzaW9uOiAkXyI7CisJICB9CisgICAgICB9CisKKyAgICAgIGlmKCRtb2RlID09IDApeworCWlmKC88Ym9va2luZm8+L2kpeworCSAgJG1vZGUgPSAxOworCX0KKyAgICAgIH0KKworICAgICAgaWYoJG1vZGUgPT0gNCl7CisJaWYoLzxcL2Jvb2tpbmZvPi9pKXsKKwkgICRtb2RlID0gMzsKKwl9CisgICAgICB9CisgICAgfQorICAgIGNsb3NlIElOUFVUOworCisgICAgc3lzdGVtKCJjZCAkQVJHVlsxXTsgZG9jYm9vazJtYW4gJGZpbGVuYW1lLnNnbWw7IG12ICRmaWxlbmFtZS45ICR0bXBkaXIvJCQuOVxuIik7CisgICAgb3BlbiBHRU5FUkFURUQsICI8ICR0bXBkaXIvJCQuOSI7CisgICAgb3BlbiBPVVRQVVQsICI+ICRBUkdWWzFdLyRmaWxlbmFtZS45IjsKKworICAgIHByaW50IE9VVFBVVCAiJGZyb250IjsKKyAgICBwcmludCBPVVRQVVQgIi5cXFwiIEZvciBjb21tZW50cyBvbiB0aGUgZm9ybWF0dGluZyBvZiB0aGlzIG1hbnBhZ2UsIHBsZWFzZSBjb250YWN0IE1pY2hhZWwgU3RpbGwgPG1pa2FsXEBzdGlsbGhxLmNvbT5cblxuIjsKKyAgICB3aGlsZSg8R0VORVJBVEVEPil7CisgICAgICBwcmludCBPVVRQVVQgIiRfIjsKKyAgICB9CisgICAgY2xvc2UgT1VUUFVUOworICAgIGNsb3NlIEdFTkVSQVRFRDsKKworICAgIHN5c3RlbSgiZ3ppcCAtZiAkQVJHVlsxXS8kZmlsZW5hbWUuOVxuIik7CisgICAgdW5saW5rKCIkdG1wZGlyLyQkLjkiKTsKKyAgfQorfQorZWxzaWYoJEFSR1ZbMF0gZXEgImluc3RhbGwiKXsKKyAgc3lzdGVtKCJta2RpciAtcCAvdXNyL2xvY2FsL21hbi9tYW45LzsgaW5zdGFsbCAkQVJHVlsxXS8qLjkuZ3ogL3Vzci9sb2NhbC9tYW4vbWFuOS8iKTsKK30KK2Vsc2V7CisgIGRpZSAiVXNhZ2U6IG1ha2VtYW4gW2NvbnZlcnQgfCBpbnN0YWxsXSA8ZGlyPiA8ZmlsZT5cbiI7Cit9CisKK3ByaW50ICJEb25lXG4iOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9ta2NvbXBpbGVfaCBiL3NjcmlwdHMvbWtjb21waWxlX2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOGQxMThkMQotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvbWtjb21waWxlX2gKQEAgLTAsMCArMSw3OCBAQAorVEFSR0VUPSQxCitBUkNIPSQyCitTTVA9JDMKK0NDPSQ0CisKKyMgSWYgY29tcGlsZS5oIGV4aXN0cyBhbHJlYWR5IGFuZCB3ZSBkb24ndCBvd24gYXV0b2NvbmYuaAorIyAoaS5lLiB3ZSdyZSBub3QgdGhlIHNhbWUgdXNlciB3aG8gZGlkIG1ha2UgKmNvbmZpZyksIGRvbid0CisjIG1vZGlmeSBjb21waWxlLmgKKyMgU28gInN1ZG8gbWFrZSBpbnN0YWxsIiB3b24ndCBjaGFuZ2UgdGhlICJjb21waWxlZCBieSA8dXNlcj4iCisjIGRvICJjb21waWxlZCBieSByb290IgorCitpZiBbIC1yICRUQVJHRVQgLWEgISAtTyBpbmNsdWRlL2xpbnV4L2F1dG9jb25mLmggXTsgdGhlbgorICBlY2hvICIgIFNLSVBQRUQgJFRBUkdFVCIKKyAgZXhpdCAwCitmaQorCisjIERvIG5vdCBleHBhbmQgbmFtZXMKK3NldCAtZgorCitpZiBbIC1yIC52ZXJzaW9uIF07IHRoZW4KKyAgVkVSU0lPTj1gY2F0IC52ZXJzaW9uYAorZWxzZQorICBWRVJTSU9OPTAKKyAgZWNobyAwID4gLnZlcnNpb24KK2ZpCisKKworVVRTX1ZFUlNJT049IiMkVkVSU0lPTiIKK2lmIFsgLW4gIiRTTVAiIF0gOyB0aGVuIFVUU19WRVJTSU9OPSIkVVRTX1ZFUlNJT04gU01QIjsgZmkKK1VUU19WRVJTSU9OPSIkVVRTX1ZFUlNJT04gYExDX0FMTD1DIExBTkc9QyBkYXRlYCIKKworIyBUcnVuY2F0ZSB0byBtYXhpbXVtIGxlbmd0aAorCitVVFNfTEVOPTY0CitVVFNfVFJVTkNBVEU9InNlZCAtZSBzL1woLlx7MSwkVVRTX0xFTlx9XCkuKi9cMS8iCisKKyMgR2VuZXJhdGUgYSB0ZW1wb3JhcnkgY29tcGlsZS5oCisKKyggZWNobyAvXCogVGhpcyBmaWxlIGlzIGF1dG8gZ2VuZXJhdGVkLCB2ZXJzaW9uICRWRVJTSU9OIFwqLworCisgIGVjaG8gXCNkZWZpbmUgVVRTX01BQ0hJTkUgXCIkQVJDSFwiCisKKyAgZWNobyBcI2RlZmluZSBVVFNfVkVSU0lPTiBcImBlY2hvICRVVFNfVkVSU0lPTiB8ICRVVFNfVFJVTkNBVEVgXCIKKworICBlY2hvIFwjZGVmaW5lIExJTlVYX0NPTVBJTEVfVElNRSBcImBMQ19BTEw9QyBMQU5HPUMgZGF0ZSArJVRgXCIKKyAgZWNobyBcI2RlZmluZSBMSU5VWF9DT01QSUxFX0JZIFwiYHdob2FtaWBcIgorICBlY2hvIFwjZGVmaW5lIExJTlVYX0NPTVBJTEVfSE9TVCBcImBob3N0bmFtZSB8ICRVVFNfVFJVTkNBVEVgXCIKKworICBpZiBbIC14IC9iaW4vZG5zZG9tYWlubmFtZSBdOyB0aGVuCisgICAgZWNobyBcI2RlZmluZSBMSU5VWF9DT01QSUxFX0RPTUFJTiBcImBkbnNkb21haW5uYW1lIHwgJFVUU19UUlVOQ0FURWBcIgorICBlbGlmIFsgLXggL2Jpbi9kb21haW5uYW1lIF07IHRoZW4KKyAgICBlY2hvIFwjZGVmaW5lIExJTlVYX0NPTVBJTEVfRE9NQUlOIFwiYGRvbWFpbm5hbWUgfCAkVVRTX1RSVU5DQVRFYFwiCisgIGVsc2UKKyAgICBlY2hvIFwjZGVmaW5lIExJTlVYX0NPTVBJTEVfRE9NQUlOCisgIGZpCisKKyAgZWNobyBcI2RlZmluZSBMSU5VWF9DT01QSUxFUiBcImAkQ0MgLXYgMj4mMSB8IHRhaWwgLW4gMWBcIgorKSA+IC50bXBjb21waWxlCisKKyMgT25seSByZXBsYWNlIHRoZSByZWFsIGNvbXBpbGUuaCBpZiB0aGUgbmV3IG9uZSBpcyBkaWZmZXJlbnQsCisjIGluIG9yZGVyIHRvIHByZXNlcnZlIHRoZSB0aW1lc3RhbXAgYW5kIGF2b2lkIHVubmVjZXNzYXJ5CisjIHJlY29tcGlsYXRpb25zLgorIyBXZSBkb24ndCBjb25zaWRlciB0aGUgZmlsZSBjaGFuZ2VkIGlmIG9ubHkgdGhlIGRhdGUvdGltZSBjaGFuZ2VkLgorIyBBIGtlcm5lbCBjb25maWcgY2hhbmdlIHdpbGwgaW5jcmVhc2UgdGhlIGdlbmVyYXRpb24gbnVtYmVyLCB0aHVzCisjIGNhdXNpbmcgY29tcGlsZS5oIHRvIGJlIHVwZGF0ZWQgKGluY2x1ZGluZyBkYXRlL3RpbWUpIGR1ZSB0byB0aGUgCisjIGNoYW5nZWQgY29tbWVudCBpbiB0aGUKKyMgZmlyc3QgbGluZS4KKworaWYgWyAtciAkVEFSR0VUIF0gJiYgXAorICAgICAgZ3JlcCAtdiAnVVRTX1ZFUlNJT05cfExJTlVYX0NPTVBJTEVfVElNRScgJFRBUkdFVCA+IC50bXB2ZXIuMSAmJiBcCisgICAgICBncmVwIC12ICdVVFNfVkVSU0lPTlx8TElOVVhfQ09NUElMRV9USU1FJyAudG1wY29tcGlsZSA+IC50bXB2ZXIuMiAmJiBcCisgICAgICBjbXAgLXMgLnRtcHZlci4xIC50bXB2ZXIuMjsgdGhlbgorICAgcm0gLWYgLnRtcGNvbXBpbGUKK2Vsc2UKKyAgIGVjaG8gIiAgVVBEICAgICAkVEFSR0VUIgorICAgbXYgLWYgLnRtcGNvbXBpbGUgJFRBUkdFVAorZmkKK3JtIC1mIC50bXB2ZXIuMSAudG1wdmVyLjIKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbWttYWtlZmlsZSBiL3NjcmlwdHMvbWttYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGQ2MjFiCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9ta21ha2VmaWxlCkBAIC0wLDAgKzEsMzEgQEAKKyMhL2Jpbi9zaAorIyBHZW5lcmF0ZXMgYSBzbWFsbCBNYWtlZmlsZSB1c2VkIGluIHRoZSByb290IG9mIHRoZSBvdXRwdXQKKyMgZGlyZWN0b3J5LCB0byBhbGxvdyBtYWtlIHRvIGJlIHN0YXJ0ZWQgZnJvbSB0aGVyZS4KKyMgVGhlIE1ha2VmaWxlIGFsc28gYWxsb3cgZm9yIG1vcmUgY29udmluaWVudCBidWlsZCBvZiBleHRlcm5hbCBtb2R1bGVzCisKKyMgVXNhZ2UKKyMgJDEgLSBLZXJuZWwgc3JjIGRpcmVjdG9yeQorIyAkMiAtIE91dHB1dCBkaXJlY3RvcnkKKyMgJDMgLSB2ZXJzaW9uCisjICQ0IC0gcGF0Y2hsZXZlbAorCisKK2NhdCA8PCBFT0YKKyMgQXV0b21hdGljYWxseSBnZW5lcmF0ZWQgYnkgJDA6IGRvbid0IGVkaXQKKworVkVSU0lPTiA9ICQzCitQQVRDSExFVkVMID0gJDQKKworS0VSTkVMU1JDICAgIDo9ICQxCitLRVJORUxPVVRQVVQgOj0gJDIKKworTUFLRUZMQUdTICs9IC0tbm8tcHJpbnQtZGlyZWN0b3J5CisKK2FsbDoKKwlcJChNQUtFKSAtQyBcJChLRVJORUxTUkMpIE89XCQoS0VSTkVMT1VUUFVUKQorCislOjoKKwlcJChNQUtFKSAtQyBcJChLRVJORUxTUkMpIE89XCQoS0VSTkVMT1VUUFVUKSBcJEAKKworRU9GCisKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbWtzeXNtYXAgYi9zY3JpcHRzL21rc3lzbWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NDMwZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL21rc3lzbWFwCkBAIC0wLDAgKzEsNDQgQEAKKyMhL2Jpbi9zaCAteAorIyBCYXNlZCBvbiB0aGUgdm1saW51eCBmaWxlIGNyZWF0ZSB0aGUgU3lzdGVtLm1hcCBmaWxlCisjIFN5c3RlbS5tYXAgaXMgdXNlZCBieSBtb2R1bGUtaW5pdCB0b29scyBhbmQgc29tZSBkZWJ1Z2dpbmcKKyMgdG9vbHMgdG8gcmV0cmVpdmUgdGhlIGFjdHVhbCBhZGRyZXNzZXMgb2Ygc3ltYm9scyBpbiB0aGUga2VybmVsLgorIworIyBVc2FnZQorIyBta3N5c21hcCB2bWxpbnV4IFN5c3RlbS5tYXAKKworCisjIyMjIworIyBHZW5lcmF0ZSBTeXN0ZW0ubWFwIChhY3R1YWwgZmlsZW5hbWUgcGFzc2VkIGFzIHNlY29uZCBhcmd1bWVudCkKKworIyAkTk0gcHJvZHVjZXMgdGhlIGZvbGxvd2luZyBvdXRwdXQ6CisjIGYwMDgxZTgwIFQgYWxsb2NfdmZzbW50CisKKyMgICBUaGUgc2Vjb25kIHJvdyBzcGVjaWZ5IHRoZSB0eXBlIG9mIHRoZSBzeW1ib2w6CisjICAgQSA9IEFic29sdXRlCisjICAgQiA9IFVuaW5pdGlhbGlzZWQgZGF0YSAoLmJzcykKKyMgICBDID0gQ29tb24gc3ltYm9sCisjICAgRCA9IEluaXRpYWxpc2VkIGRhdGEKKyMgICBHID0gSW5pdGlhbGlzZWQgZGF0YSBmb3Igc21hbGwgb2JqZWN0cworIyAgIEkgPSBJbmRpcmVjdCByZWZlcmVuY2UgdG8gYW5vdGhlciBzeW1ib2wKKyMgICBOID0gRGVidWdnaW5nIHN5bWJvbAorIyAgIFIgPSBSZWFkIG9ubHkKKyMgICBTID0gVW5pbml0aWFsaXNlZCBkYXRhIGZvciBzbWFsbCBvYmplY3RzCisjICAgVCA9IFRleHQgY29kZSBzeW1ib2wKKyMgICBVID0gVW5kZWZpbmVkIHN5bWJvbAorIyAgIFYgPSBXZWFrIHN5bWJvbAorIyAgIFcgPSBXZWFrIHN5bWJvbAorIyAgIENvcnJlc3BvbmRpbmcgc21hbGwgbGV0dGVycyBhcmUgbG9jYWwgc3ltYm9scworCisjIEZvciBTeXN0ZW0ubWFwIGZpbHRlciBhd2F5OgorIyAgIGEgLSBsb2NhbCBhYnNvbHV0ZSBzeW1ib2xzCisjICAgVSAtIHVuZGVmaW5lZCBnbG9iYWwgc3ltYm9scworIyAgIHcgLSBsb2NhbCB3ZWFrIHN5bWJvbHMKKworIyByZWFkcHJvZmlsZSBzdGFydHMgcmVhZGluZyBzeW1ib2xzIHdoZW4gX3N0ZXh0IGlzIGZvdW5kLCBhbmQKKyMgY29udGludWUgdW50aWwgaXQgZmluZHMgYSBzeW1ib2wgd2hpY2ggaXMgbm90IGVpdGhlciBvZiAnVCcsICd0JywKKyMgJ1cnIG9yICd3Jy4gX19jcmNfIGFyZSAnQScgYW5kIHBsYWNlZCBpbiB0aGUgbWlkZGxlCisjIHNvIHdlIGp1c3QgaWdub3JlIHRoZW0gdG8gbGV0IHJlYWRwcm9maWxlIGNvbnRpbnVlIHRvIHdvcmsuCisjIChBdCBsZWFzdCBzcGFyYzY0IGhhcyBfX2NyY18gaW4gdGhlIG1pZGRsZSkuCisKKyROTSAtbiAkMSB8IGdyZXAgLXYgJ1woIFthVXddIFwpXHxcKF9fY3JjX1wpXHxcKCBcJFthZHRdXCknID4gJDIKKwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9ta3Vib290LnNoIGIvc2NyaXB0cy9ta3Vib290LnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjUyYTE3YWIKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL21rdWJvb3Quc2gKQEAgLTAsMCArMSwxNiBAQAorIyEvYmluL2Jhc2gKKworIworIyBCdWlsZCBVLUJvb3QgaW1hZ2Ugd2hlbiBgbWtpbWFnZScgdG9vbCBpcyBhdmFpbGFibGUuCisjCisKK01LSU1BR0U9JCh0eXBlIC1wYXRoIG1raW1hZ2UpCisKK2lmIFsgLXogIiR7TUtJTUFHRX0iIF07IHRoZW4KKwkjIERvZXNuJ3QgZXhpc3QKKwllY2hvICcibWtpbWFnZSIgY29tbWFuZCBub3QgZm91bmQgLSBVLUJvb3QgaW1hZ2VzIHdpbGwgbm90IGJlIGJ1aWx0JyA+JjIKKwlleGl0IDA7CitmaQorCisjIENhbGwgIm1raW1hZ2UiIHRvIGNyZWF0ZSBVLUJvb3QgaW1hZ2UKKyR7TUtJTUFHRX0gIiRAIgpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9ta3ZlcnNpb24gYi9zY3JpcHRzL21rdmVyc2lvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTJhZGRjCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9ta3ZlcnNpb24KQEAgLTAsMCArMSw2IEBACitpZiBbICEgLWYgLnZlcnNpb24gXQordGhlbgorICAgIGVjaG8gMQorZWxzZQorICAgIGV4cHIgMGBjYXQgLnZlcnNpb25gICsgMQorZmkKZGlmZiAtLWdpdCBhL3NjcmlwdHMvbW9kL01ha2VmaWxlIGIvc2NyaXB0cy9tb2QvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFkNjljMwotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvbW9kL01ha2VmaWxlCkBAIC0wLDAgKzEsMTYgQEAKK2hvc3Rwcm9ncy15CTo9IG1vZHBvc3QgbWtfZWxmY29uZmlnCithbHdheXMJCTo9ICQoaG9zdHByb2dzLXkpIGVtcHR5Lm8KKworbW9kcG9zdC1vYmpzCTo9IG1vZHBvc3QubyBmaWxlMmFsaWFzLm8gc3VtdmVyc2lvbi5vCisKKyMgZGVwZW5kZW5jaWVzIG9uIGdlbmVyYXRlZCBmaWxlcyBuZWVkIHRvIGJlIGxpc3RlZCBleHBsaWNpdGx5CisKKyQob2JqKS9tb2Rwb3N0Lm8gJChvYmopL2ZpbGUyYWxpYXMubyAkKG9iaikvc3VtdmVyc2lvbi5vOiAkKG9iaikvZWxmY29uZmlnLmgKKworcXVpZXRfY21kX2VsZmNvbmZpZyA9IE1LRUxGICAgJEAKKyAgICAgIGNtZF9lbGZjb25maWcgPSAkKG9iaikvbWtfZWxmY29uZmlnICQoQVJDSCkgPCAkPCA+ICRACisKKyQob2JqKS9lbGZjb25maWcuaDogJChvYmopL2VtcHR5Lm8gJChvYmopL21rX2VsZmNvbmZpZyBGT1JDRQorCSQoY2FsbCBpZl9jaGFuZ2VkLGVsZmNvbmZpZykKKwordGFyZ2V0cyArPSBlbGZjb25maWcuaApkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tb2QvZW1wdHkuYyBiL3NjcmlwdHMvbW9kL2VtcHR5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk4MzljYwotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvbW9kL2VtcHR5LmMKQEAgLTAsMCArMSBAQAorLyogZW1wdHkgZmlsZSB0byBmaWd1cmUgb3V0IGVuZGlhbm5lc3MgLyB3b3JkIHNpemUgKi8KZGlmZiAtLWdpdCBhL3NjcmlwdHMvbW9kL2ZpbGUyYWxpYXMuYyBiL3NjcmlwdHMvbW9kL2ZpbGUyYWxpYXMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTRiNTJkCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9tb2QvZmlsZTJhbGlhcy5jCkBAIC0wLDAgKzEsMzA4IEBACisvKiBTaW1wbGUgY29kZSB0byB0dXJuIHZhcmlvdXMgdGFibGVzIGluIGFuIEVMRiBmaWxlIGludG8gYWxpYXMgZGVmaW5pdGlvbnMuCisgKiBUaGlzIGRlYWxzIHdpdGgga2VybmVsIGRhdGFzdHJ1Y3R1cmVzIHdoZXJlIHRoZXkgc2hvdWxkIGJlCisgKiBkZWFsdCB3aXRoOiBpbiB0aGUga2VybmVsIHNvdXJjZS4KKyAqCisgKiBDb3B5cmlnaHQgMjAwMi0yMDAzICBSdXN0eSBSdXNzZWxsLCBJQk0gQ29ycG9yYXRpb24KKyAqICAgICAgICAgICAyMDAzICAgICAgIEthaSBHZXJtYXNjaGV3c2tpCisgKgorICoKKyAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIGFjY29yZGluZyB0byB0aGUgdGVybXMKKyAqIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgaW5jb3Jwb3JhdGVkIGhlcmVpbiBieSByZWZlcmVuY2UuCisgKi8KKworI2luY2x1ZGUgIm1vZHBvc3QuaCIKKworLyogV2UgdXNlIHRoZSBFTEYgdHlwZWRlZnMgZm9yIGtlcm5lbF91bG9uZ190IGJ1dCBiaXRlIHRoZSBidWxsZXQgYW5kCisgKiB1c2UgZWl0aGVyIHN0ZGludC5oIG9yIGludHR5cGVzLmggZm9yIHRoZSByZXN0LiAqLworI2lmIEtFUk5FTF9FTEZDTEFTUyA9PSBFTEZDTEFTUzMyCit0eXBlZGVmIEVsZjMyX0FkZHIJa2VybmVsX3Vsb25nX3Q7CisjZWxzZQordHlwZWRlZiBFbGY2NF9BZGRyCWtlcm5lbF91bG9uZ190OworI2VuZGlmCisjaWZkZWYgX19zdW5fXworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZWxzZQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisKK3R5cGVkZWYgdWludDMyX3QJX191MzI7Cit0eXBlZGVmIHVpbnQxNl90CV9fdTE2OwordHlwZWRlZiB1bnNpZ25lZCBjaGFyCV9fdTg7CisKKy8qIEJpZyBleGNlcHRpb24gdG8gdGhlICJkb24ndCBpbmNsdWRlIGtlcm5lbCBoZWFkZXJzIGludG8gdXNlcnNwYWNlLCB3aGljaAorICogZXZlbiBwb3RlbnRpYWxseSBoYXMgZGlmZmVyZW50IGVuZGlhbm5lc3MgYW5kIHdvcmQgc2l6ZXMsIHNpbmNlIAorICogd2UgaGFuZGxlIHRob3NlIGRpZmZlcmVuY2VzIGV4cGxpY2l0bHkgYmVsb3cgKi8KKyNpbmNsdWRlICIuLi8uLi9pbmNsdWRlL2xpbnV4L21vZF9kZXZpY2V0YWJsZS5oIgorCisjZGVmaW5lIEFERChzdHIsIHNlcCwgY29uZCwgZmllbGQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RyY2F0KHN0ciwgc2VwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChjb25kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHNwcmludGYoc3RyICsgc3RybGVuKHN0ciksICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihmaWVsZCkgPT0gMSA/ICIlMDJYIiA6ICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmllbGQpID09IDIgPyAiJTA0WCIgOiAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZpZWxkKSA9PSA0ID8gIiUwOFgiIDogIiIsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHNwcmludGYoc3RyICsgc3RybGVuKHN0ciksICIqIik7ICAgICAgICAgICAgICAgIFwKK30gd2hpbGUoMCkKKworLyogTG9va3MgbGlrZSAidXNiOnZOcE5kbE5kaE5kY05kc2NOZHBOaWNOaXNjTmlwTiIgKi8KK3N0YXRpYyBpbnQgZG9fdXNiX2VudHJ5KGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorCQkJc3RydWN0IHVzYl9kZXZpY2VfaWQgKmlkLCBjaGFyICphbGlhcykKK3sKKwlpZC0+bWF0Y2hfZmxhZ3MgPSBUT19OQVRJVkUoaWQtPm1hdGNoX2ZsYWdzKTsKKwlpZC0+aWRWZW5kb3IgPSBUT19OQVRJVkUoaWQtPmlkVmVuZG9yKTsKKwlpZC0+aWRQcm9kdWN0ID0gVE9fTkFUSVZFKGlkLT5pZFByb2R1Y3QpOworCWlkLT5iY2REZXZpY2VfbG8gPSBUT19OQVRJVkUoaWQtPmJjZERldmljZV9sbyk7CisJaWQtPmJjZERldmljZV9oaSA9IFRPX05BVElWRShpZC0+YmNkRGV2aWNlX2hpKTsKKworCS8qCisJICogU29tZSBtb2R1bGVzICh2aXNvcikgaGF2ZSBlbXB0eSBzbG90cyBhcyBwbGFjZWhvbGRlciBmb3IKKwkgKiBydW4tdGltZSBzcGVjaWZpY2F0aW9uIHRoYXQgcmVzdWx0cyBpbiBjYXRjaC1hbGwgYWxpYXMKKwkgKi8KKwlpZiAoIShpZC0+aWRWZW5kb3IgfCBpZC0+YkRldmljZUNsYXNzIHwgaWQtPmJJbnRlcmZhY2VDbGFzcykpCisJCXJldHVybiAxOworCisJc3RyY3B5KGFsaWFzLCAidXNiOiIpOworCUFERChhbGlhcywgInYiLCBpZC0+bWF0Y2hfZmxhZ3MmVVNCX0RFVklDRV9JRF9NQVRDSF9WRU5ET1IsCisJICAgIGlkLT5pZFZlbmRvcik7CisJQUREKGFsaWFzLCAicCIsIGlkLT5tYXRjaF9mbGFncyZVU0JfREVWSUNFX0lEX01BVENIX1BST0RVQ1QsCisJICAgIGlkLT5pZFByb2R1Y3QpOworCUFERChhbGlhcywgImRsIiwgaWQtPm1hdGNoX2ZsYWdzJlVTQl9ERVZJQ0VfSURfTUFUQ0hfREVWX0xPLAorCSAgICBpZC0+YmNkRGV2aWNlX2xvKTsKKwlBREQoYWxpYXMsICJkaCIsIGlkLT5tYXRjaF9mbGFncyZVU0JfREVWSUNFX0lEX01BVENIX0RFVl9ISSwKKwkgICAgaWQtPmJjZERldmljZV9oaSk7CisJQUREKGFsaWFzLCAiZGMiLCBpZC0+bWF0Y2hfZmxhZ3MmVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZfQ0xBU1MsCisJICAgIGlkLT5iRGV2aWNlQ2xhc3MpOworCUFERChhbGlhcywgImRzYyIsCisJICAgIGlkLT5tYXRjaF9mbGFncyZVU0JfREVWSUNFX0lEX01BVENIX0RFVl9TVUJDTEFTUywKKwkgICAgaWQtPmJEZXZpY2VTdWJDbGFzcyk7CisJQUREKGFsaWFzLCAiZHAiLAorCSAgICBpZC0+bWF0Y2hfZmxhZ3MmVVNCX0RFVklDRV9JRF9NQVRDSF9ERVZfUFJPVE9DT0wsCisJICAgIGlkLT5iRGV2aWNlUHJvdG9jb2wpOworCUFERChhbGlhcywgImljIiwKKwkgICAgaWQtPm1hdGNoX2ZsYWdzJlVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX0NMQVNTLAorCSAgICBpZC0+YkludGVyZmFjZUNsYXNzKTsKKwlBREQoYWxpYXMsICJpc2MiLAorCSAgICBpZC0+bWF0Y2hfZmxhZ3MmVVNCX0RFVklDRV9JRF9NQVRDSF9JTlRfU1VCQ0xBU1MsCisJICAgIGlkLT5iSW50ZXJmYWNlU3ViQ2xhc3MpOworCUFERChhbGlhcywgImlwIiwKKwkgICAgaWQtPm1hdGNoX2ZsYWdzJlVTQl9ERVZJQ0VfSURfTUFUQ0hfSU5UX1BST1RPQ09MLAorCSAgICBpZC0+YkludGVyZmFjZVByb3RvY29sKTsKKwlyZXR1cm4gMTsKK30KKworLyogTG9va3MgbGlrZTogaWVlZTEzOTQ6dmVuTm1vTnNwTnZlck4gKi8KK3N0YXRpYyBpbnQgZG9faWVlZTEzOTRfZW50cnkoY29uc3QgY2hhciAqZmlsZW5hbWUsCisJCQkgICAgIHN0cnVjdCBpZWVlMTM5NF9kZXZpY2VfaWQgKmlkLCBjaGFyICphbGlhcykKK3sKKwlpZC0+bWF0Y2hfZmxhZ3MgPSBUT19OQVRJVkUoaWQtPm1hdGNoX2ZsYWdzKTsKKwlpZC0+dmVuZG9yX2lkID0gVE9fTkFUSVZFKGlkLT52ZW5kb3JfaWQpOworCWlkLT5tb2RlbF9pZCA9IFRPX05BVElWRShpZC0+bW9kZWxfaWQpOworCWlkLT5zcGVjaWZpZXJfaWQgPSBUT19OQVRJVkUoaWQtPnNwZWNpZmllcl9pZCk7CisJaWQtPnZlcnNpb24gPSBUT19OQVRJVkUoaWQtPnZlcnNpb24pOworCisJc3RyY3B5KGFsaWFzLCAiaWVlZTEzOTQ6Iik7CisJQUREKGFsaWFzLCAidmVuIiwgaWQtPm1hdGNoX2ZsYWdzICYgSUVFRTEzOTRfTUFUQ0hfVkVORE9SX0lELAorCSAgICBpZC0+dmVuZG9yX2lkKTsKKwlBREQoYWxpYXMsICJtbyIsIGlkLT5tYXRjaF9mbGFncyAmIElFRUUxMzk0X01BVENIX01PREVMX0lELAorCSAgICBpZC0+bW9kZWxfaWQpOworCUFERChhbGlhcywgInNwIiwgaWQtPm1hdGNoX2ZsYWdzICYgSUVFRTEzOTRfTUFUQ0hfU1BFQ0lGSUVSX0lELAorCSAgICBpZC0+c3BlY2lmaWVyX2lkKTsKKwlBREQoYWxpYXMsICJ2ZXIiLCBpZC0+bWF0Y2hfZmxhZ3MgJiBJRUVFMTM5NF9NQVRDSF9WRVJTSU9OLAorCSAgICBpZC0+dmVyc2lvbik7CisKKwlyZXR1cm4gMTsKK30KKworLyogTG9va3MgbGlrZTogcGNpOnZOZE5zdk5zZE5iY05zY05pTi4gKi8KK3N0YXRpYyBpbnQgZG9fcGNpX2VudHJ5KGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorCQkJc3RydWN0IHBjaV9kZXZpY2VfaWQgKmlkLCBjaGFyICphbGlhcykKK3sKKwkvKiBDbGFzcyBmaWVsZCBjYW4gYmUgZGl2aWRlZCBpbnRvIHRoZXNlIHRocmVlLiAqLworCXVuc2lnbmVkIGNoYXIgYmFzZWNsYXNzLCBzdWJjbGFzcywgaW50ZXJmYWNlLAorCQliYXNlY2xhc3NfbWFzaywgc3ViY2xhc3NfbWFzaywgaW50ZXJmYWNlX21hc2s7CisKKwlpZC0+dmVuZG9yID0gVE9fTkFUSVZFKGlkLT52ZW5kb3IpOworCWlkLT5kZXZpY2UgPSBUT19OQVRJVkUoaWQtPmRldmljZSk7CisJaWQtPnN1YnZlbmRvciA9IFRPX05BVElWRShpZC0+c3VidmVuZG9yKTsKKwlpZC0+c3ViZGV2aWNlID0gVE9fTkFUSVZFKGlkLT5zdWJkZXZpY2UpOworCWlkLT5jbGFzcyA9IFRPX05BVElWRShpZC0+Y2xhc3MpOworCWlkLT5jbGFzc19tYXNrID0gVE9fTkFUSVZFKGlkLT5jbGFzc19tYXNrKTsKKworCXN0cmNweShhbGlhcywgInBjaToiKTsKKwlBREQoYWxpYXMsICJ2IiwgaWQtPnZlbmRvciAhPSBQQ0lfQU5ZX0lELCBpZC0+dmVuZG9yKTsKKwlBREQoYWxpYXMsICJkIiwgaWQtPmRldmljZSAhPSBQQ0lfQU5ZX0lELCBpZC0+ZGV2aWNlKTsKKwlBREQoYWxpYXMsICJzdiIsIGlkLT5zdWJ2ZW5kb3IgIT0gUENJX0FOWV9JRCwgaWQtPnN1YnZlbmRvcik7CisJQUREKGFsaWFzLCAic2QiLCBpZC0+c3ViZGV2aWNlICE9IFBDSV9BTllfSUQsIGlkLT5zdWJkZXZpY2UpOworCisJYmFzZWNsYXNzID0gKGlkLT5jbGFzcykgPj4gMTY7CisJYmFzZWNsYXNzX21hc2sgPSAoaWQtPmNsYXNzX21hc2spID4+IDE2OworCXN1YmNsYXNzID0gKGlkLT5jbGFzcykgPj4gODsKKwlzdWJjbGFzc19tYXNrID0gKGlkLT5jbGFzc19tYXNrKSA+PiA4OworCWludGVyZmFjZSA9IGlkLT5jbGFzczsKKwlpbnRlcmZhY2VfbWFzayA9IGlkLT5jbGFzc19tYXNrOworCisJaWYgKChiYXNlY2xhc3NfbWFzayAhPSAwICYmIGJhc2VjbGFzc19tYXNrICE9IDB4RkYpCisJICAgIHx8IChzdWJjbGFzc19tYXNrICE9IDAgJiYgc3ViY2xhc3NfbWFzayAhPSAweEZGKQorCSAgICB8fCAoaW50ZXJmYWNlX21hc2sgIT0gMCAmJiBpbnRlcmZhY2VfbWFzayAhPSAweEZGKSkgeworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSIqKiogV2FybmluZzogQ2FuJ3QgaGFuZGxlIG1hc2tzIGluICVzOiUwNFhcbiIsCisJCQlmaWxlbmFtZSwgaWQtPmNsYXNzX21hc2spOworCQlyZXR1cm4gMDsKKwl9CisKKwlBREQoYWxpYXMsICJiYyIsIGJhc2VjbGFzc19tYXNrID09IDB4RkYsIGJhc2VjbGFzcyk7CisJQUREKGFsaWFzLCAic2MiLCBzdWJjbGFzc19tYXNrID09IDB4RkYsIHN1YmNsYXNzKTsKKwlBREQoYWxpYXMsICJpIiwgaW50ZXJmYWNlX21hc2sgPT0gMHhGRiwgaW50ZXJmYWNlKTsKKwlyZXR1cm4gMTsKK30KKworLyogbG9va3MgbGlrZTogImNjdzp0Tm1OZHROZG1OIiAqLyAKK3N0YXRpYyBpbnQgZG9fY2N3X2VudHJ5KGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorCQkJc3RydWN0IGNjd19kZXZpY2VfaWQgKmlkLCBjaGFyICphbGlhcykKK3sKKwlpZC0+bWF0Y2hfZmxhZ3MgPSBUT19OQVRJVkUoaWQtPm1hdGNoX2ZsYWdzKTsKKwlpZC0+Y3VfdHlwZSA9IFRPX05BVElWRShpZC0+Y3VfdHlwZSk7CisJaWQtPmN1X21vZGVsID0gVE9fTkFUSVZFKGlkLT5jdV9tb2RlbCk7CisJaWQtPmRldl90eXBlID0gVE9fTkFUSVZFKGlkLT5kZXZfdHlwZSk7CisJaWQtPmRldl9tb2RlbCA9IFRPX05BVElWRShpZC0+ZGV2X21vZGVsKTsKKworCXN0cmNweShhbGlhcywgImNjdzoiKTsKKwlBREQoYWxpYXMsICJ0IiwgaWQtPm1hdGNoX2ZsYWdzJkNDV19ERVZJQ0VfSURfTUFUQ0hfQ1VfVFlQRSwKKwkgICAgaWQtPmN1X3R5cGUpOworCUFERChhbGlhcywgIm0iLCBpZC0+bWF0Y2hfZmxhZ3MmQ0NXX0RFVklDRV9JRF9NQVRDSF9DVV9NT0RFTCwKKwkgICAgaWQtPmN1X21vZGVsKTsKKwlBREQoYWxpYXMsICJkdCIsIGlkLT5tYXRjaF9mbGFncyZDQ1dfREVWSUNFX0lEX01BVENIX0RFVklDRV9UWVBFLAorCSAgICBpZC0+ZGV2X3R5cGUpOworCUFERChhbGlhcywgImRtIiwgaWQtPm1hdGNoX2ZsYWdzJkNDV19ERVZJQ0VfSURfTUFUQ0hfREVWSUNFX1RZUEUsCisJICAgIGlkLT5kZXZfbW9kZWwpOworCXJldHVybiAxOworfQorCisvKiBMb29rcyBsaWtlOiAic2VyaW86dHlOcHJOaWROZXhOIiAqLworc3RhdGljIGludCBkb19zZXJpb19lbnRyeShjb25zdCBjaGFyICpmaWxlbmFtZSwKKwkJCSAgc3RydWN0IHNlcmlvX2RldmljZV9pZCAqaWQsIGNoYXIgKmFsaWFzKQoreworCWlkLT50eXBlID0gVE9fTkFUSVZFKGlkLT50eXBlKTsKKwlpZC0+cHJvdG8gPSBUT19OQVRJVkUoaWQtPnByb3RvKTsKKwlpZC0+aWQgPSBUT19OQVRJVkUoaWQtPmlkKTsKKwlpZC0+ZXh0cmEgPSBUT19OQVRJVkUoaWQtPmV4dHJhKTsKKworCXN0cmNweShhbGlhcywgInNlcmlvOiIpOworCUFERChhbGlhcywgInR5IiwgaWQtPnR5cGUgIT0gU0VSSU9fQU5ZLCBpZC0+dHlwZSk7CisJQUREKGFsaWFzLCAicHIiLCBpZC0+cHJvdG8gIT0gU0VSSU9fQU5ZLCBpZC0+cHJvdG8pOworCUFERChhbGlhcywgImlkIiwgaWQtPmlkICE9IFNFUklPX0FOWSwgaWQtPmlkKTsKKwlBREQoYWxpYXMsICJleCIsIGlkLT5leHRyYSAhPSBTRVJJT19BTlksIGlkLT5leHRyYSk7CisKKwlyZXR1cm4gMTsKK30KKworLyogbG9va3MgbGlrZTogInBucDpkRCIgKi8KK3N0YXRpYyBpbnQgZG9fcG5wX2VudHJ5KGNvbnN0IGNoYXIgKmZpbGVuYW1lLAorCQkJc3RydWN0IHBucF9kZXZpY2VfaWQgKmlkLCBjaGFyICphbGlhcykKK3sKKwlzcHJpbnRmKGFsaWFzLCAicG5wOmQlcyIsIGlkLT5pZCk7CisJcmV0dXJuIDE7Cit9CisKKy8qIGxvb2tzIGxpa2U6ICJwbnA6Y0NkRC4uLiIgKi8KK3N0YXRpYyBpbnQgZG9fcG5wX2NhcmRfZW50cnkoY29uc3QgY2hhciAqZmlsZW5hbWUsCisJCQlzdHJ1Y3QgcG5wX2NhcmRfZGV2aWNlX2lkICppZCwgY2hhciAqYWxpYXMpCit7CisJaW50IGk7CisKKwlzcHJpbnRmKGFsaWFzLCAicG5wOmMlcyIsIGlkLT5pZCk7CisJZm9yIChpID0gMDsgaSA8IFBOUF9NQVhfREVWSUNFUzsgaSsrKSB7CisJCWlmICghICppZC0+ZGV2c1tpXS5pZCkKKwkJCWJyZWFrOworCQlzcHJpbnRmKGFsaWFzICsgc3RybGVuKGFsaWFzKSwgImQlcyIsIGlkLT5kZXZzW2ldLmlkKTsKKwl9CisJcmV0dXJuIDE7Cit9CisKKy8qIElnbm9yZSBhbnkgcHJlZml4LCBlZy4gdjg1MCBwcmVwZW5kcyBfICovCitzdGF0aWMgaW5saW5lIGludCBzeW1faXMoY29uc3QgY2hhciAqc3ltYm9sLCBjb25zdCBjaGFyICpuYW1lKQoreworCWNvbnN0IGNoYXIgKm1hdGNoOworCisJbWF0Y2ggPSBzdHJzdHIoc3ltYm9sLCBuYW1lKTsKKwlpZiAoIW1hdGNoKQorCQlyZXR1cm4gMDsKKwlyZXR1cm4gbWF0Y2hbc3RybGVuKHN5bWJvbCldID09ICdcMCc7Cit9CisKK3N0YXRpYyB2b2lkIGRvX3RhYmxlKHZvaWQgKnN5bXZhbCwgdW5zaWduZWQgbG9uZyBzaXplLAorCQkgICAgIHVuc2lnbmVkIGxvbmcgaWRfc2l6ZSwKKwkJICAgICB2b2lkICpmdW5jdGlvbiwKKwkJICAgICBzdHJ1Y3QgbW9kdWxlICptb2QpCit7CisJdW5zaWduZWQgaW50IGk7CisJY2hhciBhbGlhc1s1MDBdOworCWludCAoKmRvX2VudHJ5KShjb25zdCBjaGFyICosIHZvaWQgKmVudHJ5LCBjaGFyICphbGlhcykgPSBmdW5jdGlvbjsKKworCWlmIChzaXplICUgaWRfc2l6ZSB8fCBzaXplIDwgaWRfc2l6ZSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIioqKiBXYXJuaW5nOiAlcyBpZHMgJWx1IGJhZCBzaXplICIKKwkJCSIoZWFjaCBvbiAlbHUpXG4iLCBtb2QtPm5hbWUsIHNpemUsIGlkX3NpemUpOworCX0KKwkvKiBMZWF2ZSBsYXN0IG9uZTogaXQncyB0aGUgdGVybWluYXRvci4gKi8KKwlzaXplIC09IGlkX3NpemU7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSArPSBpZF9zaXplKSB7CisJCWlmIChkb19lbnRyeShtb2QtPm5hbWUsIHN5bXZhbCtpLCBhbGlhcykpIHsKKwkJCS8qIEFsd2F5cyBlbmQgaW4gYSB3aWxkY2FyZCwgZm9yIGZ1dHVyZSBleHRlbnNpb24gKi8KKwkJCWlmIChhbGlhc1tzdHJsZW4oYWxpYXMpLTFdICE9ICcqJykKKwkJCQlzdHJjYXQoYWxpYXMsICIqIik7CisJCQlidWZfcHJpbnRmKCZtb2QtPmRldl90YWJsZV9idWYsCisJCQkJICAgIk1PRFVMRV9BTElBUyhcIiVzXCIpO1xuIiwgYWxpYXMpOworCQl9CisJfQorfQorCisvKiBDcmVhdGUgTU9EVUxFX0FMSUFTKCkgc3RhdGVtZW50cy4KKyAqIEF0IHRoaXMgdGltZSwgd2UgY2Fubm90IHdyaXRlIHRoZSBhY3R1YWwgb3V0cHV0IEMgc291cmNlIHlldCwKKyAqIHNvIHdlIHdyaXRlIGludG8gdGhlIG1vZC0+ZGV2X3RhYmxlX2J1ZiBidWZmZXIuICovCit2b2lkIGhhbmRsZV9tb2RkZXZ0YWJsZShzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBlbGZfaW5mbyAqaW5mbywKKwkJCUVsZl9TeW0gKnN5bSwgY29uc3QgY2hhciAqc3ltbmFtZSkKK3sKKwl2b2lkICpzeW12YWw7CisKKwkvKiBXZSdyZSBsb29raW5nIGZvciBhIHNlY3Rpb24gcmVsYXRpdmUgc3ltYm9sICovCisJaWYgKCFzeW0tPnN0X3NobmR4IHx8IHN5bS0+c3Rfc2huZHggPj0gaW5mby0+aGRyLT5lX3NobnVtKQorCQlyZXR1cm47CisKKwlzeW12YWwgPSAodm9pZCAqKWluZm8tPmhkcgorCQkrIGluZm8tPnNlY2hkcnNbc3ltLT5zdF9zaG5keF0uc2hfb2Zmc2V0CisJCSsgc3ltLT5zdF92YWx1ZTsKKworCWlmIChzeW1faXMoc3ltbmFtZSwgIl9fbW9kX3BjaV9kZXZpY2VfdGFibGUiKSkKKwkJZG9fdGFibGUoc3ltdmFsLCBzeW0tPnN0X3NpemUsIHNpemVvZihzdHJ1Y3QgcGNpX2RldmljZV9pZCksCisJCQkgZG9fcGNpX2VudHJ5LCBtb2QpOworCWVsc2UgaWYgKHN5bV9pcyhzeW1uYW1lLCAiX19tb2RfdXNiX2RldmljZV90YWJsZSIpKQorCQlkb190YWJsZShzeW12YWwsIHN5bS0+c3Rfc2l6ZSwgc2l6ZW9mKHN0cnVjdCB1c2JfZGV2aWNlX2lkKSwKKwkJCSBkb191c2JfZW50cnksIG1vZCk7CisJZWxzZSBpZiAoc3ltX2lzKHN5bW5hbWUsICJfX21vZF9pZWVlMTM5NF9kZXZpY2VfdGFibGUiKSkKKwkJZG9fdGFibGUoc3ltdmFsLCBzeW0tPnN0X3NpemUsIHNpemVvZihzdHJ1Y3QgaWVlZTEzOTRfZGV2aWNlX2lkKSwKKwkJCSBkb19pZWVlMTM5NF9lbnRyeSwgbW9kKTsKKwllbHNlIGlmIChzeW1faXMoc3ltbmFtZSwgIl9fbW9kX2Njd19kZXZpY2VfdGFibGUiKSkKKwkJZG9fdGFibGUoc3ltdmFsLCBzeW0tPnN0X3NpemUsIHNpemVvZihzdHJ1Y3QgY2N3X2RldmljZV9pZCksCisJCQkgZG9fY2N3X2VudHJ5LCBtb2QpOworCWVsc2UgaWYgKHN5bV9pcyhzeW1uYW1lLCAiX19tb2Rfc2VyaW9fZGV2aWNlX3RhYmxlIikpCisJCWRvX3RhYmxlKHN5bXZhbCwgc3ltLT5zdF9zaXplLCBzaXplb2Yoc3RydWN0IHNlcmlvX2RldmljZV9pZCksCisJCQkgZG9fc2VyaW9fZW50cnksIG1vZCk7CisJZWxzZSBpZiAoc3ltX2lzKHN5bW5hbWUsICJfX21vZF9wbnBfZGV2aWNlX3RhYmxlIikpCisJCWRvX3RhYmxlKHN5bXZhbCwgc3ltLT5zdF9zaXplLCBzaXplb2Yoc3RydWN0IHBucF9kZXZpY2VfaWQpLAorCQkJIGRvX3BucF9lbnRyeSwgbW9kKTsKKwllbHNlIGlmIChzeW1faXMoc3ltbmFtZSwgIl9fbW9kX3BucF9jYXJkX2RldmljZV90YWJsZSIpKQorCQlkb190YWJsZShzeW12YWwsIHN5bS0+c3Rfc2l6ZSwgc2l6ZW9mKHN0cnVjdCBwbnBfY2FyZF9kZXZpY2VfaWQpLAorCQkJIGRvX3BucF9jYXJkX2VudHJ5LCBtb2QpOworfQorCisvKiBOb3cgYWRkIG91dCBidWZmZXJlZCBpbmZvcm1hdGlvbiB0byB0aGUgZ2VuZXJhdGVkIEMgc291cmNlICovCit2b2lkIGFkZF9tb2RkZXZ0YWJsZShzdHJ1Y3QgYnVmZmVyICpidWYsIHN0cnVjdCBtb2R1bGUgKm1vZCkKK3sKKwlidWZfcHJpbnRmKGJ1ZiwgIlxuIik7CisJYnVmX3dyaXRlKGJ1ZiwgbW9kLT5kZXZfdGFibGVfYnVmLnAsIG1vZC0+ZGV2X3RhYmxlX2J1Zi5wb3MpOworCWZyZWUobW9kLT5kZXZfdGFibGVfYnVmLnApOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tb2QvbWtfZWxmY29uZmlnLmMgYi9zY3JpcHRzL21vZC9ta19lbGZjb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTJhYWJmCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9tb2QvbWtfZWxmY29uZmlnLmMKQEAgLTAsMCArMSw2NSBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZWxmLmg+CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJdW5zaWduZWQgY2hhciBlaVtFSV9OSURFTlRdOwkKKwl1bmlvbiB7IHNob3J0IHM7IGNoYXIgY1syXTsgfSBlbmRpYW5fdGVzdDsKKworCWlmIChhcmdjICE9IDIpIHsKKwkJZnByaW50ZihzdGRlcnIsICJFcnJvcjogbm8gYXJjaFxuIik7CisJfQorCWlmIChmcmVhZChlaSwgMSwgRUlfTklERU5ULCBzdGRpbikgIT0gRUlfTklERU5UKSB7CisJCWZwcmludGYoc3RkZXJyLCAiRXJyb3I6IGlucHV0IHRydW5jYXRlZFxuIik7CisJCXJldHVybiAxOworCX0KKwlpZiAobWVtY21wKGVpLCBFTEZNQUcsIFNFTEZNQUcpICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJFcnJvcjogbm90IEVMRlxuIik7CisJCXJldHVybiAxOworCX0KKwlzd2l0Y2ggKGVpW0VJX0NMQVNTXSkgeworCWNhc2UgRUxGQ0xBU1MzMjoKKwkJcHJpbnRmKCIjZGVmaW5lIEtFUk5FTF9FTEZDTEFTUyBFTEZDTEFTUzMyXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBFTEZDTEFTUzY0OgorCQlwcmludGYoIiNkZWZpbmUgS0VSTkVMX0VMRkNMQVNTIEVMRkNMQVNTNjRcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlhYm9ydCgpOworCX0KKwlzd2l0Y2ggKGVpW0VJX0RBVEFdKSB7CisJY2FzZSBFTEZEQVRBMkxTQjoKKwkJcHJpbnRmKCIjZGVmaW5lIEtFUk5FTF9FTEZEQVRBIEVMRkRBVEEyTFNCXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBFTEZEQVRBMk1TQjoKKwkJcHJpbnRmKCIjZGVmaW5lIEtFUk5FTF9FTEZEQVRBIEVMRkRBVEEyTVNCXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYWJvcnQoKTsKKwl9CisKKwlpZiAoc2l6ZW9mKHVuc2lnbmVkIGxvbmcpID09IDQpIHsKKwkJcHJpbnRmKCIjZGVmaW5lIEhPU1RfRUxGQ0xBU1MgRUxGQ0xBU1MzMlxuIik7CisJfSBlbHNlIGlmIChzaXplb2YodW5zaWduZWQgbG9uZykgPT0gOCkgeworCQlwcmludGYoIiNkZWZpbmUgSE9TVF9FTEZDTEFTUyBFTEZDTEFTUzY0XG4iKTsKKwl9CisKKwllbmRpYW5fdGVzdC5zID0gMHgwMTAyOworCWlmIChtZW1jbXAoZW5kaWFuX3Rlc3QuYywgIlx4MDFceDAyIiwgMikgPT0gMCkKKwkJcHJpbnRmKCIjZGVmaW5lIEhPU1RfRUxGREFUQSBFTEZEQVRBMk1TQlxuIik7CisJZWxzZSBpZiAobWVtY21wKGVuZGlhbl90ZXN0LmMsICJceDAyXHgwMSIsIDIpID09IDApCisJCXByaW50ZigiI2RlZmluZSBIT1NUX0VMRkRBVEEgRUxGREFUQTJMU0JcbiIpOworCWVsc2UKKwkJYWJvcnQoKTsKKworCWlmICgoc3RyY21wKGFyZ3ZbMV0sICJ2ODUwIikgPT0gMCkgfHwgKHN0cmNtcChhcmd2WzFdLCAiaDgzMDAiKSA9PSAwKSkKKwkJcHJpbnRmKCIjZGVmaW5lIE1PRFVMRV9TWU1CT0xfUFJFRklYIFwiX1wiXG4iKTsKKwllbHNlIAorCQlwcmludGYoIiNkZWZpbmUgTU9EVUxFX1NZTUJPTF9QUkVGSVggXCJcIlxuIik7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tb2QvbW9kcG9zdC5jIGIvc2NyaXB0cy9tb2QvbW9kcG9zdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliOWY5NGMKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL21vZC9tb2Rwb3N0LmMKQEAgLTAsMCArMSw3OTcgQEAKKy8qIFBvc3Rwcm9jZXNzIG1vZHVsZSBzeW1ib2wgdmVyc2lvbnMKKyAqCisgKiBDb3B5cmlnaHQgMjAwMyAgICAgICBLYWkgR2VybWFzY2hld3NraQorICogQ29weXJpZ2h0IDIwMDItMjAwNCAgUnVzdHkgUnVzc2VsbCwgSUJNIENvcnBvcmF0aW9uCisgKgorICogQmFzZWQgaW4gcGFydCBvbiBtb2R1bGUtaW5pdC10b29scy9kZXBtb2QuYyxmaWxlMmFsaWFzCisgKgorICogVGhpcyBzb2Z0d2FyZSBtYXkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXJtcworICogb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLCBpbmNvcnBvcmF0ZWQgaGVyZWluIGJ5IHJlZmVyZW5jZS4KKyAqCisgKiBVc2FnZTogbW9kcG9zdCB2bWxpbnV4IG1vZHVsZTEubyBtb2R1bGUyLm8gLi4uCisgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSAibW9kcG9zdC5oIgorCisvKiBBcmUgd2UgdXNpbmcgQ09ORklHX01PRFZFUlNJT05TPyAqLworaW50IG1vZHZlcnNpb25zID0gMDsKKy8qIFdhcm4gYWJvdXQgdW5kZWZpbmVkIHN5bWJvbHM/IChkbyBzbyBpZiB3ZSBoYXZlIHZtbGludXgpICovCitpbnQgaGF2ZV92bWxpbnV4ID0gMDsKKy8qIElzIENPTkZJR19NT0RVTEVfU1JDVkVSU0lPTl9BTEwgc2V0PyAqLworc3RhdGljIGludCBhbGxfdmVyc2lvbnMgPSAwOworCit2b2lkCitmYXRhbChjb25zdCBjaGFyICpmbXQsIC4uLikKK3sKKwl2YV9saXN0IGFyZ2xpc3Q7CisKKwlmcHJpbnRmKHN0ZGVyciwgIkZBVEFMOiAiKTsKKworCXZhX3N0YXJ0KGFyZ2xpc3QsIGZtdCk7CisJdmZwcmludGYoc3RkZXJyLCBmbXQsIGFyZ2xpc3QpOworCXZhX2VuZChhcmdsaXN0KTsKKworCWV4aXQoMSk7Cit9CisKK3ZvaWQKK3dhcm4oY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisJdmFfbGlzdCBhcmdsaXN0OworCisJZnByaW50ZihzdGRlcnIsICJXQVJOSU5HOiAiKTsKKworCXZhX3N0YXJ0KGFyZ2xpc3QsIGZtdCk7CisJdmZwcmludGYoc3RkZXJyLCBmbXQsIGFyZ2xpc3QpOworCXZhX2VuZChhcmdsaXN0KTsKK30KKwordm9pZCAqZG9fbm9mYWlsKHZvaWQgKnB0ciwgY29uc3QgY2hhciAqZXhwcikKK3sKKwlpZiAoIXB0cikgeworCQlmYXRhbCgibW9kcG9zdDogTWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZTogJXMuXG4iLCBleHByKTsKKwl9CisJcmV0dXJuIHB0cjsKK30KKworLyogQSBsaXN0IG9mIGFsbCBtb2R1bGVzIHdlIHByb2Nlc3NlZCAqLworCitzdGF0aWMgc3RydWN0IG1vZHVsZSAqbW9kdWxlczsKKworc3RydWN0IG1vZHVsZSAqCitmaW5kX21vZHVsZShjaGFyICptb2RuYW1lKQoreworCXN0cnVjdCBtb2R1bGUgKm1vZDsKKworCWZvciAobW9kID0gbW9kdWxlczsgbW9kOyBtb2QgPSBtb2QtPm5leHQpCisJCWlmIChzdHJjbXAobW9kLT5uYW1lLCBtb2RuYW1lKSA9PSAwKQorCQkJYnJlYWs7CisJcmV0dXJuIG1vZDsKK30KKworc3RydWN0IG1vZHVsZSAqCituZXdfbW9kdWxlKGNoYXIgKm1vZG5hbWUpCit7CisJc3RydWN0IG1vZHVsZSAqbW9kOworCWNoYXIgKnAsICpzOworCQorCW1vZCA9IE5PRkFJTChtYWxsb2Moc2l6ZW9mKCptb2QpKSk7CisJbWVtc2V0KG1vZCwgMCwgc2l6ZW9mKCptb2QpKTsKKwlwID0gTk9GQUlMKHN0cmR1cChtb2RuYW1lKSk7CisKKwkvKiBzdHJpcCB0cmFpbGluZyAubyAqLworCWlmICgocyA9IHN0cnJjaHIocCwgJy4nKSkgIT0gTlVMTCkKKwkJaWYgKHN0cmNtcChzLCAiLm8iKSA9PSAwKQorCQkJKnMgPSAnXDAnOworCisJLyogYWRkIHRvIGxpc3QgKi8KKwltb2QtPm5hbWUgPSBwOworCW1vZC0+bmV4dCA9IG1vZHVsZXM7CisJbW9kdWxlcyA9IG1vZDsKKworCXJldHVybiBtb2Q7Cit9CisKKy8qIEEgaGFzaCBvZiBhbGwgZXhwb3J0ZWQgc3ltYm9scywKKyAqIHN0cnVjdCBzeW1ib2wgaXMgYWxzbyB1c2VkIGZvciBsaXN0cyBvZiB1bnJlc29sdmVkIHN5bWJvbHMgKi8KKworI2RlZmluZSBTWU1CT0xfSEFTSF9TSVpFIDEwMjQKKworc3RydWN0IHN5bWJvbCB7CisJc3RydWN0IHN5bWJvbCAqbmV4dDsKKwlzdHJ1Y3QgbW9kdWxlICptb2R1bGU7CisJdW5zaWduZWQgaW50IGNyYzsKKwlpbnQgY3JjX3ZhbGlkOworCXVuc2lnbmVkIGludCB3ZWFrOjE7CisJY2hhciBuYW1lWzBdOworfTsKKworc3RhdGljIHN0cnVjdCBzeW1ib2wgKnN5bWJvbGhhc2hbU1lNQk9MX0hBU0hfU0laRV07CisKKy8qIFRoaXMgaXMgYmFzZWQgb24gdGhlIGhhc2ggYWdvcml0aG0gZnJvbSBnZGJtLCB2aWEgdGRiICovCitzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGludCB0ZGJfaGFzaChjb25zdCBjaGFyICpuYW1lKQoreworCXVuc2lnbmVkIHZhbHVlOwkvKiBVc2VkIHRvIGNvbXB1dGUgdGhlIGhhc2ggdmFsdWUuICAqLworCXVuc2lnbmVkICAgaTsJLyogVXNlZCB0byBjeWNsZSB0aHJvdWdoIHJhbmRvbSB2YWx1ZXMuICovCisKKwkvKiBTZXQgdGhlIGluaXRpYWwgdmFsdWUgZnJvbSB0aGUga2V5IHNpemUuICovCisJZm9yICh2YWx1ZSA9IDB4MjM4RjEzQUYgKiBzdHJsZW4obmFtZSksIGk9MDsgbmFtZVtpXTsgaSsrKQorCQl2YWx1ZSA9ICh2YWx1ZSArICgoKHVuc2lnbmVkIGNoYXIgKiluYW1lKVtpXSA8PCAoaSo1ICUgMjQpKSk7CisKKwlyZXR1cm4gKDExMDM1MTUyNDMgKiB2YWx1ZSArIDEyMzQ1KTsKK30KKworLyogQWxsb2NhdGUgYSBuZXcgc3ltYm9scyBmb3IgdXNlIGluIHRoZSBoYXNoIG9mIGV4cG9ydGVkIHN5bWJvbHMgb3IKKyAqIHRoZSBsaXN0IG9mIHVucmVzb2x2ZWQgc3ltYm9scyBwZXIgbW9kdWxlICovCisKK3N0cnVjdCBzeW1ib2wgKgorYWxsb2Nfc3ltYm9sKGNvbnN0IGNoYXIgKm5hbWUsIHVuc2lnbmVkIGludCB3ZWFrLCBzdHJ1Y3Qgc3ltYm9sICpuZXh0KQoreworCXN0cnVjdCBzeW1ib2wgKnMgPSBOT0ZBSUwobWFsbG9jKHNpemVvZigqcykgKyBzdHJsZW4obmFtZSkgKyAxKSk7CisKKwltZW1zZXQocywgMCwgc2l6ZW9mKCpzKSk7CisJc3RyY3B5KHMtPm5hbWUsIG5hbWUpOworCXMtPndlYWsgPSB3ZWFrOworCXMtPm5leHQgPSBuZXh0OworCXJldHVybiBzOworfQorCisvKiBGb3IgdGhlIGhhc2ggb2YgZXhwb3J0ZWQgc3ltYm9scyAqLworCit2b2lkCituZXdfc3ltYm9sKGNvbnN0IGNoYXIgKm5hbWUsIHN0cnVjdCBtb2R1bGUgKm1vZHVsZSwgdW5zaWduZWQgaW50ICpjcmMpCit7CisJdW5zaWduZWQgaW50IGhhc2g7CisJc3RydWN0IHN5bWJvbCAqbmV3OworCisJaGFzaCA9IHRkYl9oYXNoKG5hbWUpICUgU1lNQk9MX0hBU0hfU0laRTsKKwluZXcgPSBzeW1ib2xoYXNoW2hhc2hdID0gYWxsb2Nfc3ltYm9sKG5hbWUsIDAsIHN5bWJvbGhhc2hbaGFzaF0pOworCW5ldy0+bW9kdWxlID0gbW9kdWxlOworCWlmIChjcmMpIHsKKwkJbmV3LT5jcmMgPSAqY3JjOworCQluZXctPmNyY192YWxpZCA9IDE7CisJfQorfQorCitzdHJ1Y3Qgc3ltYm9sICoKK2ZpbmRfc3ltYm9sKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJc3RydWN0IHN5bWJvbCAqczsKKworCS8qIEZvciBvdXIgcHVycG9zZXMsIC5mb28gbWF0Y2hlcyBmb28uICBQUEM2NCBuZWVkcyB0aGlzLiAqLworCWlmIChuYW1lWzBdID09ICcuJykKKwkJbmFtZSsrOworCisJZm9yIChzID0gc3ltYm9saGFzaFt0ZGJfaGFzaChuYW1lKSAlIFNZTUJPTF9IQVNIX1NJWkVdOyBzOyBzPXMtPm5leHQpIHsKKwkJaWYgKHN0cmNtcChzLT5uYW1lLCBuYW1lKSA9PSAwKQorCQkJcmV0dXJuIHM7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBBZGQgYW4gZXhwb3J0ZWQgc3ltYm9sIC0gaXQgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGFkZGVkIHdpdGhvdXQgYQorICogQ1JDLCBpbiB0aGlzIGNhc2UganVzdCB1cGRhdGUgdGhlIENSQyAqLwordm9pZAorYWRkX2V4cG9ydGVkX3N5bWJvbChjb25zdCBjaGFyICpuYW1lLCBzdHJ1Y3QgbW9kdWxlICptb2R1bGUsIHVuc2lnbmVkIGludCAqY3JjKQoreworCXN0cnVjdCBzeW1ib2wgKnMgPSBmaW5kX3N5bWJvbChuYW1lKTsKKworCWlmICghcykgeworCQluZXdfc3ltYm9sKG5hbWUsIG1vZHVsZSwgY3JjKTsKKwkJcmV0dXJuOworCX0KKwlpZiAoY3JjKSB7CisJCXMtPmNyYyA9ICpjcmM7CisJCXMtPmNyY192YWxpZCA9IDE7CisJfQorfQorCit2b2lkICoKK2dyYWJfZmlsZShjb25zdCBjaGFyICpmaWxlbmFtZSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkKK3sKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwl2b2lkICptYXA7CisJaW50IGZkOworCisJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisJaWYgKGZkIDwgMCB8fCBmc3RhdChmZCwgJnN0KSAhPSAwKQorCQlyZXR1cm4gTlVMTDsKKworCSpzaXplID0gc3Quc3Rfc2l6ZTsKKwltYXAgPSBtbWFwKE5VTEwsICpzaXplLCBQUk9UX1JFQUR8UFJPVF9XUklURSwgTUFQX1BSSVZBVEUsIGZkLCAwKTsKKwljbG9zZShmZCk7CisKKwlpZiAobWFwID09IE1BUF9GQUlMRUQpCisJCXJldHVybiBOVUxMOworCXJldHVybiBtYXA7Cit9CisKKy8qCisgICBSZXR1cm4gYSBjb3B5IG9mIHRoZSBuZXh0IGxpbmUgaW4gYSBtbWFwJ2VkIGZpbGUuCisgICBzcGFjZXMgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZSBpcyB0cmltbWVkIGF3YXkuCisgICBSZXR1cm4gYSBwb2ludGVyIHRvIGEgc3RhdGljIGJ1ZmZlci4KKyovCitjaGFyKgorZ2V0X25leHRfbGluZSh1bnNpZ25lZCBsb25nICpwb3MsIHZvaWQgKmZpbGUsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwlzdGF0aWMgY2hhciBsaW5lWzQwOTZdOworCWludCBza2lwID0gMTsKKwlzaXplX3QgbGVuID0gMDsKKwlzaWduZWQgY2hhciAqcCA9IChzaWduZWQgY2hhciAqKWZpbGUgKyAqcG9zOworCWNoYXIgKnMgPSBsaW5lOworCisJZm9yICg7ICpwb3MgPCBzaXplIDsgKCpwb3MpKyspCisJeworCQlpZiAoc2tpcCAmJiBpc3NwYWNlKCpwKSkgeworCQkJcCsrOworCQkJY29udGludWU7CisJCX0KKwkJc2tpcCA9IDA7CisJCWlmICgqcCAhPSAnXG4nICYmICgqcG9zIDwgc2l6ZSkpIHsKKwkJCWxlbisrOworCQkJKnMrKyA9ICpwKys7CisJCQlpZiAobGVuID4gNDA5NSkKKwkJCQlicmVhazsgLyogVG9vIGxvbmcsIHN0b3AgKi8KKwkJfSBlbHNlIHsKKwkJCS8qIEVuZCBvZiBzdHJpbmcgKi8KKwkJCSpzID0gJ1wwJzsKKwkJCXJldHVybiBsaW5lOworCQl9CisJfQorCS8qIEVuZCBvZiBidWZmZXIgKi8KKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZAorcmVsZWFzZV9maWxlKHZvaWQgKmZpbGUsIHVuc2lnbmVkIGxvbmcgc2l6ZSkKK3sKKwltdW5tYXAoZmlsZSwgc2l6ZSk7Cit9CisKK3ZvaWQKK3BhcnNlX2VsZihzdHJ1Y3QgZWxmX2luZm8gKmluZm8sIGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCXVuc2lnbmVkIGludCBpOworCUVsZl9FaGRyICpoZHIgPSBpbmZvLT5oZHI7CisJRWxmX1NoZHIgKnNlY2hkcnM7CisJRWxmX1N5bSAgKnN5bTsKKworCWhkciA9IGdyYWJfZmlsZShmaWxlbmFtZSwgJmluZm8tPnNpemUpOworCWlmICghaGRyKSB7CisJCXBlcnJvcihmaWxlbmFtZSk7CisJCWFib3J0KCk7CisJfQorCWluZm8tPmhkciA9IGhkcjsKKwlpZiAoaW5mby0+c2l6ZSA8IHNpemVvZigqaGRyKSkKKwkJZ290byB0cnVuY2F0ZWQ7CisKKwkvKiBGaXggZW5kaWFubmVzcyBpbiBFTEYgaGVhZGVyICovCisJaGRyLT5lX3Nob2ZmICAgID0gVE9fTkFUSVZFKGhkci0+ZV9zaG9mZik7CisJaGRyLT5lX3Noc3RybmR4ID0gVE9fTkFUSVZFKGhkci0+ZV9zaHN0cm5keCk7CisJaGRyLT5lX3NobnVtICAgID0gVE9fTkFUSVZFKGhkci0+ZV9zaG51bSk7CisJaGRyLT5lX21hY2hpbmUgID0gVE9fTkFUSVZFKGhkci0+ZV9tYWNoaW5lKTsKKwlzZWNoZHJzID0gKHZvaWQgKiloZHIgKyBoZHItPmVfc2hvZmY7CisJaW5mby0+c2VjaGRycyA9IHNlY2hkcnM7CisKKwkvKiBGaXggZW5kaWFubmVzcyBpbiBzZWN0aW9uIGhlYWRlcnMgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaGRyLT5lX3NobnVtOyBpKyspIHsKKwkJc2VjaGRyc1tpXS5zaF90eXBlICAgPSBUT19OQVRJVkUoc2VjaGRyc1tpXS5zaF90eXBlKTsKKwkJc2VjaGRyc1tpXS5zaF9vZmZzZXQgPSBUT19OQVRJVkUoc2VjaGRyc1tpXS5zaF9vZmZzZXQpOworCQlzZWNoZHJzW2ldLnNoX3NpemUgICA9IFRPX05BVElWRShzZWNoZHJzW2ldLnNoX3NpemUpOworCQlzZWNoZHJzW2ldLnNoX2xpbmsgICA9IFRPX05BVElWRShzZWNoZHJzW2ldLnNoX2xpbmspOworCQlzZWNoZHJzW2ldLnNoX25hbWUgICA9IFRPX05BVElWRShzZWNoZHJzW2ldLnNoX25hbWUpOworCX0KKwkvKiBGaW5kIHN5bWJvbCB0YWJsZS4gKi8KKwlmb3IgKGkgPSAxOyBpIDwgaGRyLT5lX3NobnVtOyBpKyspIHsKKwkJY29uc3QgY2hhciAqc2Vjc3RyaW5ncworCQkJPSAodm9pZCAqKWhkciArIHNlY2hkcnNbaGRyLT5lX3Noc3RybmR4XS5zaF9vZmZzZXQ7CisKKwkJaWYgKHNlY2hkcnNbaV0uc2hfb2Zmc2V0ID4gaW5mby0+c2l6ZSkKKwkJCWdvdG8gdHJ1bmNhdGVkOworCQlpZiAoc3RyY21wKHNlY3N0cmluZ3Mrc2VjaGRyc1tpXS5zaF9uYW1lLCAiLm1vZGluZm8iKSA9PSAwKSB7CisJCQlpbmZvLT5tb2RpbmZvID0gKHZvaWQgKiloZHIgKyBzZWNoZHJzW2ldLnNoX29mZnNldDsKKwkJCWluZm8tPm1vZGluZm9fbGVuID0gc2VjaGRyc1tpXS5zaF9zaXplOworCQl9CisJCWlmIChzZWNoZHJzW2ldLnNoX3R5cGUgIT0gU0hUX1NZTVRBQikKKwkJCWNvbnRpbnVlOworCisJCWluZm8tPnN5bXRhYl9zdGFydCA9ICh2b2lkICopaGRyICsgc2VjaGRyc1tpXS5zaF9vZmZzZXQ7CisJCWluZm8tPnN5bXRhYl9zdG9wICA9ICh2b2lkICopaGRyICsgc2VjaGRyc1tpXS5zaF9vZmZzZXQgCisJCQkgICAgICAgICAgICAgICAgICAgICAgICAgKyBzZWNoZHJzW2ldLnNoX3NpemU7CisJCWluZm8tPnN0cnRhYiAgICAgICA9ICh2b2lkICopaGRyICsgCisJCQkgICAgICAgICAgICAgc2VjaGRyc1tzZWNoZHJzW2ldLnNoX2xpbmtdLnNoX29mZnNldDsKKwl9CisJaWYgKCFpbmZvLT5zeW10YWJfc3RhcnQpIHsKKwkJZnByaW50ZihzdGRlcnIsICJtb2Rwb3N0OiAlcyBubyBzeW10YWI/XG4iLCBmaWxlbmFtZSk7CisJCWFib3J0KCk7CisJfQorCS8qIEZpeCBlbmRpYW5uZXNzIGluIHN5bWJvbHMgKi8KKwlmb3IgKHN5bSA9IGluZm8tPnN5bXRhYl9zdGFydDsgc3ltIDwgaW5mby0+c3ltdGFiX3N0b3A7IHN5bSsrKSB7CisJCXN5bS0+c3Rfc2huZHggPSBUT19OQVRJVkUoc3ltLT5zdF9zaG5keCk7CisJCXN5bS0+c3RfbmFtZSAgPSBUT19OQVRJVkUoc3ltLT5zdF9uYW1lKTsKKwkJc3ltLT5zdF92YWx1ZSA9IFRPX05BVElWRShzeW0tPnN0X3ZhbHVlKTsKKwkJc3ltLT5zdF9zaXplICA9IFRPX05BVElWRShzeW0tPnN0X3NpemUpOworCX0KKwlyZXR1cm47CisKKyB0cnVuY2F0ZWQ6CisJZnByaW50ZihzdGRlcnIsICJtb2Rwb3N0OiAlcyBpcyB0cnVuY2F0ZWQuXG4iLCBmaWxlbmFtZSk7CisJYWJvcnQoKTsKK30KKwordm9pZAorcGFyc2VfZWxmX2ZpbmlzaChzdHJ1Y3QgZWxmX2luZm8gKmluZm8pCit7CisJcmVsZWFzZV9maWxlKGluZm8tPmhkciwgaW5mby0+c2l6ZSk7Cit9CisKKyNkZWZpbmUgQ1JDX1BGWCAgICAgTU9EVUxFX1NZTUJPTF9QUkVGSVggIl9fY3JjXyIKKyNkZWZpbmUgS1NZTVRBQl9QRlggTU9EVUxFX1NZTUJPTF9QUkVGSVggIl9fa3N5bXRhYl8iCisKK3ZvaWQKK2hhbmRsZV9tb2R2ZXJzaW9ucyhzdHJ1Y3QgbW9kdWxlICptb2QsIHN0cnVjdCBlbGZfaW5mbyAqaW5mbywKKwkJICAgRWxmX1N5bSAqc3ltLCBjb25zdCBjaGFyICpzeW1uYW1lKQoreworCXVuc2lnbmVkIGludCBjcmM7CisKKwlzd2l0Y2ggKHN5bS0+c3Rfc2huZHgpIHsKKwljYXNlIFNITl9DT01NT046CisJCWZwcmludGYoc3RkZXJyLCAiKioqIFdhcm5pbmc6IFwiJXNcIiBbJXNdIGlzIENPTU1PTiBzeW1ib2xcbiIsCisJCQlzeW1uYW1lLCBtb2QtPm5hbWUpOworCQlicmVhazsKKwljYXNlIFNITl9BQlM6CisJCS8qIENSQydkIHN5bWJvbCAqLworCQlpZiAobWVtY21wKHN5bW5hbWUsIENSQ19QRlgsIHN0cmxlbihDUkNfUEZYKSkgPT0gMCkgeworCQkJY3JjID0gKHVuc2lnbmVkIGludCkgc3ltLT5zdF92YWx1ZTsKKwkJCWFkZF9leHBvcnRlZF9zeW1ib2woc3ltbmFtZSArIHN0cmxlbihDUkNfUEZYKSwKKwkJCQkJICAgIG1vZCwgJmNyYyk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTSE5fVU5ERUY6CisJCS8qIHVuZGVmaW5lZCBzeW1ib2wgKi8KKwkJaWYgKEVMRl9TVF9CSU5EKHN5bS0+c3RfaW5mbykgIT0gU1RCX0dMT0JBTCAmJgorCQkgICAgRUxGX1NUX0JJTkQoc3ltLT5zdF9pbmZvKSAhPSBTVEJfV0VBSykKKwkJCWJyZWFrOworCQkvKiBpZ25vcmUgZ2xvYmFsIG9mZnNldCB0YWJsZSAqLworCQlpZiAoc3RyY21wKHN5bW5hbWUsICJfR0xPQkFMX09GRlNFVF9UQUJMRV8iKSA9PSAwKQorCQkJYnJlYWs7CisJCS8qIGlnbm9yZSBfX3RoaXNfbW9kdWxlLCBpdCB3aWxsIGJlIHJlc29sdmVkIHNob3J0bHkgKi8KKwkJaWYgKHN0cmNtcChzeW1uYW1lLCBNT0RVTEVfU1lNQk9MX1BSRUZJWCAiX190aGlzX21vZHVsZSIpID09IDApCisJCQlicmVhazsKKyNpZmRlZiBTVFRfUkVHSVNURVIKKwkJaWYgKGluZm8tPmhkci0+ZV9tYWNoaW5lID09IEVNX1NQQVJDIHx8CisJCSAgICBpbmZvLT5oZHItPmVfbWFjaGluZSA9PSBFTV9TUEFSQ1Y5KSB7CisJCQkvKiBJZ25vcmUgcmVnaXN0ZXIgZGlyZWN0aXZlcy4gKi8KKwkJCWlmIChFTEZfU1RfVFlQRShzeW0tPnN0X2luZm8pID09IFNUVF9SRUdJU1RFUikKKwkJCQlicmVhazsKKwkJfQorI2VuZGlmCisJCQorCQlpZiAobWVtY21wKHN5bW5hbWUsIE1PRFVMRV9TWU1CT0xfUFJFRklYLAorCQkJICAgc3RybGVuKE1PRFVMRV9TWU1CT0xfUFJFRklYKSkgPT0gMCkKKwkJCW1vZC0+dW5yZXMgPSBhbGxvY19zeW1ib2woc3ltbmFtZSArCisJCQkJCQkgIHN0cmxlbihNT0RVTEVfU1lNQk9MX1BSRUZJWCksCisJCQkJCQkgIEVMRl9TVF9CSU5EKHN5bS0+c3RfaW5mbykgPT0gU1RCX1dFQUssCisJCQkJCQkgIG1vZC0+dW5yZXMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBBbGwgZXhwb3J0ZWQgc3ltYm9scyAqLworCQlpZiAobWVtY21wKHN5bW5hbWUsIEtTWU1UQUJfUEZYLCBzdHJsZW4oS1NZTVRBQl9QRlgpKSA9PSAwKSB7CisJCQlhZGRfZXhwb3J0ZWRfc3ltYm9sKHN5bW5hbWUgKyBzdHJsZW4oS1NZTVRBQl9QRlgpLAorCQkJCQkgICAgbW9kLCBOVUxMKTsKKwkJfQorCQlpZiAoc3RyY21wKHN5bW5hbWUsIE1PRFVMRV9TWU1CT0xfUFJFRklYICJpbml0X21vZHVsZSIpID09IDApCisJCQltb2QtPmhhc19pbml0ID0gMTsKKwkJaWYgKHN0cmNtcChzeW1uYW1lLCBNT0RVTEVfU1lNQk9MX1BSRUZJWCAiY2xlYW51cF9tb2R1bGUiKSA9PSAwKQorCQkJbW9kLT5oYXNfY2xlYW51cCA9IDE7CisJCWJyZWFrOworCX0KK30KKworaW50Citpc192bWxpbnV4KGNvbnN0IGNoYXIgKm1vZG5hbWUpCit7CisJY29uc3QgY2hhciAqbXluYW1lOworCisJaWYgKChteW5hbWUgPSBzdHJyY2hyKG1vZG5hbWUsICcvJykpKQorCQlteW5hbWUrKzsKKwllbHNlCisJCW15bmFtZSA9IG1vZG5hbWU7CisKKwlyZXR1cm4gc3RyY21wKG15bmFtZSwgInZtbGludXgiKSA9PSAwOworfQorCisvKiBQYXJzZSB0YWc9dmFsdWUgc3RyaW5ncyBmcm9tIC5tb2RpbmZvIHNlY3Rpb24gKi8KK3N0YXRpYyBjaGFyICpuZXh0X3N0cmluZyhjaGFyICpzdHJpbmcsIHVuc2lnbmVkIGxvbmcgKnNlY3NpemUpCit7CisJLyogU2tpcCBub24temVybyBjaGFycyAqLworCXdoaWxlIChzdHJpbmdbMF0pIHsKKwkJc3RyaW5nKys7CisJCWlmICgoKnNlY3NpemUpLS0gPD0gMSkKKwkJCXJldHVybiBOVUxMOworCX0KKworCS8qIFNraXAgYW55IHplcm8gcGFkZGluZy4gKi8KKwl3aGlsZSAoIXN0cmluZ1swXSkgeworCQlzdHJpbmcrKzsKKwkJaWYgKCgqc2Vjc2l6ZSktLSA8PSAxKQorCQkJcmV0dXJuIE5VTEw7CisJfQorCXJldHVybiBzdHJpbmc7Cit9CisKK3N0YXRpYyBjaGFyICpnZXRfbW9kaW5mbyh2b2lkICptb2RpbmZvLCB1bnNpZ25lZCBsb25nIG1vZGluZm9fbGVuLAorCQkJIGNvbnN0IGNoYXIgKnRhZykKK3sKKwljaGFyICpwOworCXVuc2lnbmVkIGludCB0YWdsZW4gPSBzdHJsZW4odGFnKTsKKwl1bnNpZ25lZCBsb25nIHNpemUgPSBtb2RpbmZvX2xlbjsKKworCWZvciAocCA9IG1vZGluZm87IHA7IHAgPSBuZXh0X3N0cmluZyhwLCAmc2l6ZSkpIHsKKwkJaWYgKHN0cm5jbXAocCwgdGFnLCB0YWdsZW4pID09IDAgJiYgcFt0YWdsZW5dID09ICc9JykKKwkJCXJldHVybiBwICsgdGFnbGVuICsgMTsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQKK3JlYWRfc3ltYm9scyhjaGFyICptb2RuYW1lKQoreworCWNvbnN0IGNoYXIgKnN5bW5hbWU7CisJY2hhciAqdmVyc2lvbjsKKwlzdHJ1Y3QgbW9kdWxlICptb2Q7CisJc3RydWN0IGVsZl9pbmZvIGluZm8gPSB7IH07CisJRWxmX1N5bSAqc3ltOworCisJcGFyc2VfZWxmKCZpbmZvLCBtb2RuYW1lKTsKKworCW1vZCA9IG5ld19tb2R1bGUobW9kbmFtZSk7CisKKwkvKiBXaGVuIHRoZXJlJ3Mgbm8gdm1saW51eCwgZG9uJ3QgcHJpbnQgd2FybmluZ3MgYWJvdXQKKwkgKiB1bnJlc29sdmVkIHN5bWJvbHMgKHNpbmNlIHRoZXJlJ2xsIGJlIHRvbyBtYW55IDspICovCisJaWYgKGlzX3ZtbGludXgobW9kbmFtZSkpIHsKKwkJdW5zaWduZWQgaW50IGZha2VfY3JjID0gMDsKKwkJaGF2ZV92bWxpbnV4ID0gMTsKKwkJYWRkX2V4cG9ydGVkX3N5bWJvbCgic3RydWN0X21vZHVsZSIsIG1vZCwgJmZha2VfY3JjKTsKKwkJbW9kLT5za2lwID0gMTsKKwl9CisKKwlmb3IgKHN5bSA9IGluZm8uc3ltdGFiX3N0YXJ0OyBzeW0gPCBpbmZvLnN5bXRhYl9zdG9wOyBzeW0rKykgeworCQlzeW1uYW1lID0gaW5mby5zdHJ0YWIgKyBzeW0tPnN0X25hbWU7CisKKwkJaGFuZGxlX21vZHZlcnNpb25zKG1vZCwgJmluZm8sIHN5bSwgc3ltbmFtZSk7CisJCWhhbmRsZV9tb2RkZXZ0YWJsZShtb2QsICZpbmZvLCBzeW0sIHN5bW5hbWUpOworCX0KKworCXZlcnNpb24gPSBnZXRfbW9kaW5mbyhpbmZvLm1vZGluZm8sIGluZm8ubW9kaW5mb19sZW4sICJ2ZXJzaW9uIik7CisJaWYgKHZlcnNpb24pCisJCW1heWJlX2Zyb2JfcmNzX3ZlcnNpb24obW9kbmFtZSwgdmVyc2lvbiwgaW5mby5tb2RpbmZvLAorCQkJCSAgICAgICB2ZXJzaW9uIC0gKGNoYXIgKilpbmZvLmhkcik7CisJaWYgKHZlcnNpb24gfHwgKGFsbF92ZXJzaW9ucyAmJiAhaXNfdm1saW51eChtb2RuYW1lKSkpCisJCWdldF9zcmNfdmVyc2lvbihtb2RuYW1lLCBtb2QtPnNyY3ZlcnNpb24sCisJCQkJc2l6ZW9mKG1vZC0+c3JjdmVyc2lvbiktMSk7CisKKwlwYXJzZV9lbGZfZmluaXNoKCZpbmZvKTsKKworCS8qIE91ciB0cmljayB0byBnZXQgdmVyc2lvbmluZyBmb3Igc3RydWN0X21vZHVsZSAtIGl0J3MKKwkgKiBuZXZlciBwYXNzZWQgYXMgYW4gYXJndW1lbnQgdG8gYW4gZXhwb3J0ZWQgZnVuY3Rpb24sIHNvCisJICogdGhlIGF1dG9tYXRpYyB2ZXJzaW9uaW5nIGRvZXNuJ3QgcGljayBpdCB1cCwgYnV0IGl0J3MgcmVhbGx5CisJICogaW1wb3J0YW50IGFueWhvdyAqLworCWlmIChtb2R2ZXJzaW9ucykKKwkJbW9kLT51bnJlcyA9IGFsbG9jX3N5bWJvbCgic3RydWN0X21vZHVsZSIsIDAsIG1vZC0+dW5yZXMpOworfQorCisjZGVmaW5lIFNaIDUwMAorCisvKiBXZSBmaXJzdCB3cml0ZSB0aGUgZ2VuZXJhdGVkIGZpbGUgaW50byBtZW1vcnkgdXNpbmcgdGhlCisgKiBmb2xsb3dpbmcgaGVscGVyLCB0aGVuIGNvbXBhcmUgdG8gdGhlIGZpbGUgb24gZGlzayBhbmQKKyAqIG9ubHkgdXBkYXRlIHRoZSBsYXRlciBpZiBhbnl0aGluZyBjaGFuZ2VkICovCisKK3ZvaWQgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMiwgMykpKQorYnVmX3ByaW50ZihzdHJ1Y3QgYnVmZmVyICpidWYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworCWNoYXIgdG1wW1NaXTsKKwlpbnQgbGVuOworCXZhX2xpc3QgYXA7CisJCisJdmFfc3RhcnQoYXAsIGZtdCk7CisJbGVuID0gdnNucHJpbnRmKHRtcCwgU1osIGZtdCwgYXApOworCWlmIChidWYtPnNpemUgLSBidWYtPnBvcyA8IGxlbiArIDEpIHsKKwkJYnVmLT5zaXplICs9IDEyODsKKwkJYnVmLT5wID0gcmVhbGxvYyhidWYtPnAsIGJ1Zi0+c2l6ZSk7CisJfQorCXN0cm5jcHkoYnVmLT5wICsgYnVmLT5wb3MsIHRtcCwgbGVuICsgMSk7CisJYnVmLT5wb3MgKz0gbGVuOworCXZhX2VuZChhcCk7Cit9CisKK3ZvaWQKK2J1Zl93cml0ZShzdHJ1Y3QgYnVmZmVyICpidWYsIGNvbnN0IGNoYXIgKnMsIGludCBsZW4pCit7CisJaWYgKGJ1Zi0+c2l6ZSAtIGJ1Zi0+cG9zIDwgbGVuKSB7CisJCWJ1Zi0+c2l6ZSArPSBsZW47CisJCWJ1Zi0+cCA9IHJlYWxsb2MoYnVmLT5wLCBidWYtPnNpemUpOworCX0KKwlzdHJuY3B5KGJ1Zi0+cCArIGJ1Zi0+cG9zLCBzLCBsZW4pOworCWJ1Zi0+cG9zICs9IGxlbjsKK30KKworLyogSGVhZGVyIGZvciB0aGUgZ2VuZXJhdGVkIGZpbGUgKi8KKwordm9pZAorYWRkX2hlYWRlcihzdHJ1Y3QgYnVmZmVyICpiLCBzdHJ1Y3QgbW9kdWxlICptb2QpCit7CisJYnVmX3ByaW50ZihiLCAiI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPlxuIik7CisJYnVmX3ByaW50ZihiLCAiI2luY2x1ZGUgPGxpbnV4L3Zlcm1hZ2ljLmg+XG4iKTsKKwlidWZfcHJpbnRmKGIsICIjaW5jbHVkZSA8bGludXgvY29tcGlsZXIuaD5cbiIpOworCWJ1Zl9wcmludGYoYiwgIlxuIik7CisJYnVmX3ByaW50ZihiLCAiTU9EVUxFX0lORk8odmVybWFnaWMsIFZFUk1BR0lDX1NUUklORyk7XG4iKTsKKwlidWZfcHJpbnRmKGIsICJcbiIpOworCWJ1Zl9wcmludGYoYiwgIiN1bmRlZiB1bml4XG4iKTsgLyogV2UgaGF2ZSBhIG1vZHVsZSBjYWxsZWQgInVuaXgiICovCisJYnVmX3ByaW50ZihiLCAic3RydWN0IG1vZHVsZSBfX3RoaXNfbW9kdWxlXG4iKTsKKwlidWZfcHJpbnRmKGIsICJfX2F0dHJpYnV0ZV9fKChzZWN0aW9uKFwiLmdudS5saW5rb25jZS50aGlzX21vZHVsZVwiKSkpID0ge1xuIik7CisJYnVmX3ByaW50ZihiLCAiIC5uYW1lID0gX19zdHJpbmdpZnkoS0JVSUxEX01PRE5BTUUpLFxuIik7CisJaWYgKG1vZC0+aGFzX2luaXQpCisJCWJ1Zl9wcmludGYoYiwgIiAuaW5pdCA9IGluaXRfbW9kdWxlLFxuIik7CisJaWYgKG1vZC0+aGFzX2NsZWFudXApCisJCWJ1Zl9wcmludGYoYiwgIiNpZmRlZiBDT05GSUdfTU9EVUxFX1VOTE9BRFxuIgorCQkJICAgICAgIiAuZXhpdCA9IGNsZWFudXBfbW9kdWxlLFxuIgorCQkJICAgICAgIiNlbmRpZlxuIik7CisJYnVmX3ByaW50ZihiLCAifTtcbiIpOworfQorCisvKiBSZWNvcmQgQ1JDcyBmb3IgdW5yZXNvbHZlZCBzeW1ib2xzICovCisKK3ZvaWQKK2FkZF92ZXJzaW9ucyhzdHJ1Y3QgYnVmZmVyICpiLCBzdHJ1Y3QgbW9kdWxlICptb2QpCit7CisJc3RydWN0IHN5bWJvbCAqcywgKmV4cDsKKworCWZvciAocyA9IG1vZC0+dW5yZXM7IHM7IHMgPSBzLT5uZXh0KSB7CisJCWV4cCA9IGZpbmRfc3ltYm9sKHMtPm5hbWUpOworCQlpZiAoIWV4cCB8fCBleHAtPm1vZHVsZSA9PSBtb2QpIHsKKwkJCWlmIChoYXZlX3ZtbGludXggJiYgIXMtPndlYWspCisJCQkJZnByaW50ZihzdGRlcnIsICIqKiogV2FybmluZzogXCIlc1wiIFslcy5rb10gIgorCQkJCSJ1bmRlZmluZWQhXG4iLAlzLT5uYW1lLCBtb2QtPm5hbWUpOworCQkJY29udGludWU7CisJCX0KKwkJcy0+bW9kdWxlID0gZXhwLT5tb2R1bGU7CisJCXMtPmNyY192YWxpZCA9IGV4cC0+Y3JjX3ZhbGlkOworCQlzLT5jcmMgPSBleHAtPmNyYzsKKwl9CisKKwlpZiAoIW1vZHZlcnNpb25zKQorCQlyZXR1cm47CisKKwlidWZfcHJpbnRmKGIsICJcbiIpOworCWJ1Zl9wcmludGYoYiwgInN0YXRpYyBjb25zdCBzdHJ1Y3QgbW9kdmVyc2lvbl9pbmZvIF9fX192ZXJzaW9uc1tdXG4iKTsKKwlidWZfcHJpbnRmKGIsICJfX2F0dHJpYnV0ZV91c2VkX19cbiIpOworCWJ1Zl9wcmludGYoYiwgIl9fYXR0cmlidXRlX18oKHNlY3Rpb24oXCJfX3ZlcnNpb25zXCIpKSkgPSB7XG4iKTsKKworCWZvciAocyA9IG1vZC0+dW5yZXM7IHM7IHMgPSBzLT5uZXh0KSB7CisJCWlmICghcy0+bW9kdWxlKSB7CisJCQljb250aW51ZTsKKwkJfQorCQlpZiAoIXMtPmNyY192YWxpZCkgeworCQkJZnByaW50ZihzdGRlcnIsICIqKiogV2FybmluZzogXCIlc1wiIFslcy5rb10gIgorCQkJCSJoYXMgbm8gQ1JDIVxuIiwKKwkJCQlzLT5uYW1lLCBtb2QtPm5hbWUpOworCQkJY29udGludWU7CisJCX0KKwkJYnVmX3ByaW50ZihiLCAiXHR7ICUjOHgsIFwiJXNcIiB9LFxuIiwgcy0+Y3JjLCBzLT5uYW1lKTsKKwl9CisKKwlidWZfcHJpbnRmKGIsICJ9O1xuIik7Cit9CisKK3ZvaWQKK2FkZF9kZXBlbmRzKHN0cnVjdCBidWZmZXIgKmIsIHN0cnVjdCBtb2R1bGUgKm1vZCwgc3RydWN0IG1vZHVsZSAqbW9kdWxlcykKK3sKKwlzdHJ1Y3Qgc3ltYm9sICpzOworCXN0cnVjdCBtb2R1bGUgKm07CisJaW50IGZpcnN0ID0gMTsKKworCWZvciAobSA9IG1vZHVsZXM7IG07IG0gPSBtLT5uZXh0KSB7CisJCW0tPnNlZW4gPSBpc192bWxpbnV4KG0tPm5hbWUpOworCX0KKworCWJ1Zl9wcmludGYoYiwgIlxuIik7CisJYnVmX3ByaW50ZihiLCAic3RhdGljIGNvbnN0IGNoYXIgX19tb2R1bGVfZGVwZW5kc1tdXG4iKTsKKwlidWZfcHJpbnRmKGIsICJfX2F0dHJpYnV0ZV91c2VkX19cbiIpOworCWJ1Zl9wcmludGYoYiwgIl9fYXR0cmlidXRlX18oKHNlY3Rpb24oXCIubW9kaW5mb1wiKSkpID1cbiIpOworCWJ1Zl9wcmludGYoYiwgIlwiZGVwZW5kcz0iKTsKKwlmb3IgKHMgPSBtb2QtPnVucmVzOyBzOyBzID0gcy0+bmV4dCkgeworCQlpZiAoIXMtPm1vZHVsZSkKKwkJCWNvbnRpbnVlOworCisJCWlmIChzLT5tb2R1bGUtPnNlZW4pCisJCQljb250aW51ZTsKKworCQlzLT5tb2R1bGUtPnNlZW4gPSAxOworCQlidWZfcHJpbnRmKGIsICIlcyVzIiwgZmlyc3QgPyAiIiA6ICIsIiwKKwkJCSAgIHN0cnJjaHIocy0+bW9kdWxlLT5uYW1lLCAnLycpICsgMSk7CisJCWZpcnN0ID0gMDsKKwl9CisJYnVmX3ByaW50ZihiLCAiXCI7XG4iKTsKK30KKwordm9pZAorYWRkX3NyY3ZlcnNpb24oc3RydWN0IGJ1ZmZlciAqYiwgc3RydWN0IG1vZHVsZSAqbW9kKQoreworCWlmIChtb2QtPnNyY3ZlcnNpb25bMF0pIHsKKwkJYnVmX3ByaW50ZihiLCAiXG4iKTsKKwkJYnVmX3ByaW50ZihiLCAiTU9EVUxFX0lORk8oc3JjdmVyc2lvbiwgXCIlc1wiKTtcbiIsCisJCQkgICBtb2QtPnNyY3ZlcnNpb24pOworCX0KK30KKwordm9pZAord3JpdGVfaWZfY2hhbmdlZChzdHJ1Y3QgYnVmZmVyICpiLCBjb25zdCBjaGFyICpmbmFtZSkKK3sKKwljaGFyICp0bXA7CisJRklMRSAqZmlsZTsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCWZpbGUgPSBmb3BlbihmbmFtZSwgInIiKTsKKwlpZiAoIWZpbGUpCisJCWdvdG8gd3JpdGU7CisKKwlpZiAoZnN0YXQoZmlsZW5vKGZpbGUpLCAmc3QpIDwgMCkKKwkJZ290byBjbG9zZV93cml0ZTsKKworCWlmIChzdC5zdF9zaXplICE9IGItPnBvcykKKwkJZ290byBjbG9zZV93cml0ZTsKKworCXRtcCA9IE5PRkFJTChtYWxsb2MoYi0+cG9zKSk7CisJaWYgKGZyZWFkKHRtcCwgMSwgYi0+cG9zLCBmaWxlKSAhPSBiLT5wb3MpCisJCWdvdG8gZnJlZV93cml0ZTsKKworCWlmIChtZW1jbXAodG1wLCBiLT5wLCBiLT5wb3MpICE9IDApCisJCWdvdG8gZnJlZV93cml0ZTsKKworCWZyZWUodG1wKTsKKwlmY2xvc2UoZmlsZSk7CisJcmV0dXJuOworCisgZnJlZV93cml0ZToKKwlmcmVlKHRtcCk7CisgY2xvc2Vfd3JpdGU6CisJZmNsb3NlKGZpbGUpOworIHdyaXRlOgorCWZpbGUgPSBmb3BlbihmbmFtZSwgInciKTsKKwlpZiAoIWZpbGUpIHsKKwkJcGVycm9yKGZuYW1lKTsKKwkJZXhpdCgxKTsKKwl9CisJaWYgKGZ3cml0ZShiLT5wLCAxLCBiLT5wb3MsIGZpbGUpICE9IGItPnBvcykgeworCQlwZXJyb3IoZm5hbWUpOworCQlleGl0KDEpOworCX0KKwlmY2xvc2UoZmlsZSk7Cit9CisKK3ZvaWQKK3JlYWRfZHVtcChjb25zdCBjaGFyICpmbmFtZSkKK3sKKwl1bnNpZ25lZCBsb25nIHNpemUsIHBvcyA9IDA7CisJdm9pZCAqZmlsZSA9IGdyYWJfZmlsZShmbmFtZSwgJnNpemUpOworCWNoYXIgKmxpbmU7CisKKyAgICAgICAgaWYgKCFmaWxlKQorCQkvKiBObyBzeW1ib2wgdmVyc2lvbnMsIHNpbGVudGx5IGlnbm9yZSAqLworCQlyZXR1cm47CisKKwl3aGlsZSAoKGxpbmUgPSBnZXRfbmV4dF9saW5lKCZwb3MsIGZpbGUsIHNpemUpKSkgeworCQljaGFyICpzeW1uYW1lLCAqbW9kbmFtZSwgKmQ7CisJCXVuc2lnbmVkIGludCBjcmM7CisJCXN0cnVjdCBtb2R1bGUgKm1vZDsKKworCQlpZiAoIShzeW1uYW1lID0gc3RyY2hyKGxpbmUsICdcdCcpKSkKKwkJCWdvdG8gZmFpbDsKKwkJKnN5bW5hbWUrKyA9ICdcMCc7CisJCWlmICghKG1vZG5hbWUgPSBzdHJjaHIoc3ltbmFtZSwgJ1x0JykpKQorCQkJZ290byBmYWlsOworCQkqbW9kbmFtZSsrID0gJ1wwJzsKKwkJaWYgKHN0cmNocihtb2RuYW1lLCAnXHQnKSkKKwkJCWdvdG8gZmFpbDsKKwkJY3JjID0gc3RydG91bChsaW5lLCAmZCwgMTYpOworCQlpZiAoKnN5bW5hbWUgPT0gJ1wwJyB8fCAqbW9kbmFtZSA9PSAnXDAnIHx8ICpkICE9ICdcMCcpCisJCQlnb3RvIGZhaWw7CisKKwkJaWYgKCEobW9kID0gZmluZF9tb2R1bGUobW9kbmFtZSkpKSB7CisJCQlpZiAoaXNfdm1saW51eChtb2RuYW1lKSkgeworCQkJCWhhdmVfdm1saW51eCA9IDE7CisJCQl9CisJCQltb2QgPSBuZXdfbW9kdWxlKE5PRkFJTChzdHJkdXAobW9kbmFtZSkpKTsKKwkJCW1vZC0+c2tpcCA9IDE7CisJCX0KKwkJYWRkX2V4cG9ydGVkX3N5bWJvbChzeW1uYW1lLCBtb2QsICZjcmMpOworCX0KKwlyZXR1cm47CitmYWlsOgorCWZhdGFsKCJwYXJzZSBlcnJvciBpbiBzeW1ib2wgZHVtcCBmaWxlXG4iKTsKK30KKwordm9pZAord3JpdGVfZHVtcChjb25zdCBjaGFyICpmbmFtZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyIGJ1ZiA9IHsgfTsKKwlzdHJ1Y3Qgc3ltYm9sICpzeW1ib2w7CisJaW50IG47CisKKwlmb3IgKG4gPSAwOyBuIDwgU1lNQk9MX0hBU0hfU0laRSA7IG4rKykgeworCQlzeW1ib2wgPSBzeW1ib2xoYXNoW25dOworCQl3aGlsZSAoc3ltYm9sKSB7CisJCQlzeW1ib2wgPSBzeW1ib2wtPm5leHQ7CisJCX0KKwl9CisKKwlmb3IgKG4gPSAwOyBuIDwgU1lNQk9MX0hBU0hfU0laRSA7IG4rKykgeworCQlzeW1ib2wgPSBzeW1ib2xoYXNoW25dOworCQl3aGlsZSAoc3ltYm9sKSB7CisJCQlidWZfcHJpbnRmKCZidWYsICIweCUwOHhcdCVzXHQlc1xuIiwgc3ltYm9sLT5jcmMsCisJCQkJc3ltYm9sLT5uYW1lLCBzeW1ib2wtPm1vZHVsZS0+bmFtZSk7CisJCQlzeW1ib2wgPSBzeW1ib2wtPm5leHQ7CisJCX0KKwl9CisJd3JpdGVfaWZfY2hhbmdlZCgmYnVmLCBmbmFtZSk7Cit9CisKK2ludAorbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IG1vZHVsZSAqbW9kOworCXN0cnVjdCBidWZmZXIgYnVmID0geyB9OworCWNoYXIgZm5hbWVbU1pdOworCWNoYXIgKmR1bXBfcmVhZCA9IE5VTEwsICpkdW1wX3dyaXRlID0gTlVMTDsKKwlpbnQgb3B0OworCisJd2hpbGUgKChvcHQgPSBnZXRvcHQoYXJnYywgYXJndiwgImk6bW86YSIpKSAhPSAtMSkgeworCQlzd2l0Y2gob3B0KSB7CisJCQljYXNlICdpJzoKKwkJCQlkdW1wX3JlYWQgPSBvcHRhcmc7CisJCQkJYnJlYWs7CisJCQljYXNlICdtJzoKKwkJCQltb2R2ZXJzaW9ucyA9IDE7CisJCQkJYnJlYWs7CisJCQljYXNlICdvJzoKKwkJCQlkdW1wX3dyaXRlID0gb3B0YXJnOworCQkJCWJyZWFrOworCQkJY2FzZSAnYSc6CisJCQkJYWxsX3ZlcnNpb25zID0gMTsKKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJZXhpdCgxKTsKKwkJfQorCX0KKworCWlmIChkdW1wX3JlYWQpCisJCXJlYWRfZHVtcChkdW1wX3JlYWQpOworCisJd2hpbGUgKG9wdGluZCA8IGFyZ2MpIHsKKwkJcmVhZF9zeW1ib2xzKGFyZ3Zbb3B0aW5kKytdKTsKKwl9CisKKwlmb3IgKG1vZCA9IG1vZHVsZXM7IG1vZDsgbW9kID0gbW9kLT5uZXh0KSB7CisJCWlmIChtb2QtPnNraXApCisJCQljb250aW51ZTsKKworCQlidWYucG9zID0gMDsKKworCQlhZGRfaGVhZGVyKCZidWYsIG1vZCk7CisJCWFkZF92ZXJzaW9ucygmYnVmLCBtb2QpOworCQlhZGRfZGVwZW5kcygmYnVmLCBtb2QsIG1vZHVsZXMpOworCQlhZGRfbW9kZGV2dGFibGUoJmJ1ZiwgbW9kKTsKKwkJYWRkX3NyY3ZlcnNpb24oJmJ1ZiwgbW9kKTsKKworCQlzcHJpbnRmKGZuYW1lLCAiJXMubW9kLmMiLCBtb2QtPm5hbWUpOworCQl3cml0ZV9pZl9jaGFuZ2VkKCZidWYsIGZuYW1lKTsKKwl9CisKKwlpZiAoZHVtcF93cml0ZSkKKwkJd3JpdGVfZHVtcChkdW1wX3dyaXRlKTsKKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9zY3JpcHRzL21vZC9tb2Rwb3N0LmggYi9zY3JpcHRzL21vZC9tb2Rwb3N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMzNGQ4MwotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvbW9kL21vZHBvc3QuaApAQCAtMCwwICsxLDEwNyBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZWxmLmg+CisKKyNpbmNsdWRlICJlbGZjb25maWcuaCIKKworI2lmIEtFUk5FTF9FTEZDTEFTUyA9PSBFTEZDTEFTUzMyCisKKyNkZWZpbmUgRWxmX0VoZHIgICAgRWxmMzJfRWhkciAKKyNkZWZpbmUgRWxmX1NoZHIgICAgRWxmMzJfU2hkciAKKyNkZWZpbmUgRWxmX1N5bSAgICAgRWxmMzJfU3ltCisjZGVmaW5lIEVMRl9TVF9CSU5EIEVMRjMyX1NUX0JJTkQKKyNkZWZpbmUgRUxGX1NUX1RZUEUgRUxGMzJfU1RfVFlQRQorCisjZWxzZQorCisjZGVmaW5lIEVsZl9FaGRyICAgIEVsZjY0X0VoZHIgCisjZGVmaW5lIEVsZl9TaGRyICAgIEVsZjY0X1NoZHIgCisjZGVmaW5lIEVsZl9TeW0gICAgIEVsZjY0X1N5bQorI2RlZmluZSBFTEZfU1RfQklORCBFTEY2NF9TVF9CSU5ECisjZGVmaW5lIEVMRl9TVF9UWVBFIEVMRjY0X1NUX1RZUEUKKworI2VuZGlmCisKKyNpZiBLRVJORUxfRUxGREFUQSAhPSBIT1NUX0VMRkRBVEEKKworc3RhdGljIGlubGluZSB2b2lkIF9fZW5kaWFuKGNvbnN0IHZvaWQgKnNyYywgdm9pZCAqZGVzdCwgdW5zaWduZWQgaW50IHNpemUpCit7CisJdW5zaWduZWQgaW50IGk7CisJZm9yIChpID0gMDsgaSA8IHNpemU7IGkrKykKKwkJKCh1bnNpZ25lZCBjaGFyKilkZXN0KVtpXSA9ICgodW5zaWduZWQgY2hhciopc3JjKVtzaXplIC0gaS0xXTsKK30KKworCisKKyNkZWZpbmUgVE9fTkFUSVZFKHgpCQkJCQkJXAorKHsJCQkJCQkJCVwKKwl0eXBlb2YoeCkgX194OwkJCQkJCVwKKwlfX2VuZGlhbigmKHgpLCAmKF9feCksIHNpemVvZihfX3gpKTsJCQlcCisJX194OwkJCQkJCQlcCit9KQorCisjZWxzZSAvKiBlbmRpYW5uZXNzIG1hdGNoZXMgKi8KKworI2RlZmluZSBUT19OQVRJVkUoeCkgKHgpCisKKyNlbmRpZgorCisjZGVmaW5lIE5PRkFJTChwdHIpICAgZG9fbm9mYWlsKChwdHIpLCAjcHRyKQordm9pZCAqZG9fbm9mYWlsKHZvaWQgKnB0ciwgY29uc3QgY2hhciAqZXhwcik7CisKK3N0cnVjdCBidWZmZXIgeworCWNoYXIgKnA7CisJaW50IHBvczsKKwlpbnQgc2l6ZTsKK307CisKK3ZvaWQgX19hdHRyaWJ1dGVfXygoZm9ybWF0KHByaW50ZiwgMiwgMykpKQorYnVmX3ByaW50ZihzdHJ1Y3QgYnVmZmVyICpidWYsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKKwordm9pZAorYnVmX3dyaXRlKHN0cnVjdCBidWZmZXIgKmJ1ZiwgY29uc3QgY2hhciAqcywgaW50IGxlbik7CisKK3N0cnVjdCBtb2R1bGUgeworCXN0cnVjdCBtb2R1bGUgKm5leHQ7CisJY29uc3QgY2hhciAqbmFtZTsKKwlzdHJ1Y3Qgc3ltYm9sICp1bnJlczsKKwlpbnQgc2VlbjsKKwlpbnQgc2tpcDsKKwlpbnQgaGFzX2luaXQ7CisJaW50IGhhc19jbGVhbnVwOworCXN0cnVjdCBidWZmZXIgZGV2X3RhYmxlX2J1ZjsKKwljaGFyCSAgICAgc3JjdmVyc2lvblsyNV07Cit9OworCitzdHJ1Y3QgZWxmX2luZm8geworCXVuc2lnbmVkIGxvbmcgc2l6ZTsKKwlFbGZfRWhkciAgICAgKmhkcjsKKwlFbGZfU2hkciAgICAgKnNlY2hkcnM7CisJRWxmX1N5bSAgICAgICpzeW10YWJfc3RhcnQ7CisJRWxmX1N5bSAgICAgICpzeW10YWJfc3RvcDsKKwljb25zdCBjaGFyICAgKnN0cnRhYjsKKwljaGFyCSAgICAgKm1vZGluZm87CisJdW5zaWduZWQgaW50IG1vZGluZm9fbGVuOworfTsKKwordm9pZCBoYW5kbGVfbW9kZGV2dGFibGUoc3RydWN0IG1vZHVsZSAqbW9kLCBzdHJ1Y3QgZWxmX2luZm8gKmluZm8sCisJCQlFbGZfU3ltICpzeW0sIGNvbnN0IGNoYXIgKnN5bW5hbWUpOworCit2b2lkIGFkZF9tb2RkZXZ0YWJsZShzdHJ1Y3QgYnVmZmVyICpidWYsIHN0cnVjdCBtb2R1bGUgKm1vZCk7CisKK3ZvaWQgbWF5YmVfZnJvYl9yY3NfdmVyc2lvbihjb25zdCBjaGFyICptb2RmaWxlbmFtZSwKKwkJCSAgICBjaGFyICp2ZXJzaW9uLAorCQkJICAgIHZvaWQgKm1vZGluZm8sCisJCQkgICAgdW5zaWduZWQgbG9uZyBtb2RpbmZvX29mZnNldCk7Cit2b2lkIGdldF9zcmNfdmVyc2lvbihjb25zdCBjaGFyICptb2RuYW1lLCBjaGFyIHN1bVtdLCB1bnNpZ25lZCBzdW1sZW4pOworCit2b2lkICpncmFiX2ZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIHVuc2lnbmVkIGxvbmcgKnNpemUpOworY2hhciogZ2V0X25leHRfbGluZSh1bnNpZ25lZCBsb25nICpwb3MsIHZvaWQgKmZpbGUsIHVuc2lnbmVkIGxvbmcgc2l6ZSk7Cit2b2lkIHJlbGVhc2VfZmlsZSh2b2lkICpmaWxlLCB1bnNpZ25lZCBsb25nIHNpemUpOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9tb2Qvc3VtdmVyc2lvbi5jIGIvc2NyaXB0cy9tb2Qvc3VtdmVyc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMTIzNDcKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL21vZC9zdW12ZXJzaW9uLmMKQEAgLTAsMCArMSw0OTggQEAKKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaWZkZWYgX19zdW5fXworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjZWxzZQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgIm1vZHBvc3QuaCIKKworLyoKKyAqIFN0b2xlbiBmb3JtIENyeXB0b2dyYXBoaWMgQVBJLgorICoKKyAqIE1ENCBNZXNzYWdlIERpZ2VzdCBBbGdvcml0aG0gKFJGQzEzMjApLgorICoKKyAqIEltcGxlbWVudGF0aW9uIGRlcml2ZWQgZnJvbSBBbmRyZXcgVHJpZGdlbGwgYW5kIFN0ZXZlIEZyZW5jaCdzCisgKiBDSUZTIE1ENCBpbXBsZW1lbnRhdGlvbiwgYW5kIHRoZSBjcnlwdG9hcGkgaW1wbGVtZW50YXRpb24KKyAqIG9yaWdpbmFsbHkgYmFzZWQgb24gdGhlIHB1YmxpYyBkb21haW4gaW1wbGVtZW50YXRpb24gd3JpdHRlbgorICogYnkgQ29saW4gUGx1bWIgaW4gMTk5My4KKyAqCisgKiBDb3B5cmlnaHQgKGMpIEFuZHJldyBUcmlkZ2VsbCAxOTk3LTE5OTguCisgKiBNb2RpZmllZCBieSBTdGV2ZSBGcmVuY2ggKHNmcmVuY2hAdXMuaWJtLmNvbSkgMjAwMgorICogQ29weXJpZ2h0IChjKSBDcnlwdG9hcGkgZGV2ZWxvcGVycy4KKyAqIENvcHlyaWdodCAoYykgMjAwMiBEYXZpZCBTLiBNaWxsZXIgKGRhdmVtQHJlZGhhdC5jb20pCisgKiBDb3B5cmlnaHQgKGMpIDIwMDIgSmFtZXMgTW9ycmlzIDxqbW9ycmlzQGludGVyY29kZS5jb20uYXU+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKi8KKyNkZWZpbmUgTUQ0X0RJR0VTVF9TSVpFCQkxNgorI2RlZmluZSBNRDRfSE1BQ19CTE9DS19TSVpFCTY0CisjZGVmaW5lIE1ENF9CTE9DS19XT1JEUwkJMTYKKyNkZWZpbmUgTUQ0X0hBU0hfV09SRFMJCTQKKworc3RydWN0IG1kNF9jdHggeworCXVpbnQzMl90IGhhc2hbTUQ0X0hBU0hfV09SRFNdOworCXVpbnQzMl90IGJsb2NrW01ENF9CTE9DS19XT1JEU107CisJdWludDY0X3QgYnl0ZV9jb3VudDsKK307CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgbHNoaWZ0KHVpbnQzMl90IHgsIHVuc2lnbmVkIGludCBzKQoreworCXggJj0gMHhGRkZGRkZGRjsKKwlyZXR1cm4gKCh4IDw8IHMpICYgMHhGRkZGRkZGRikgfCAoeCA+PiAoMzIgLSBzKSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdWludDMyX3QgRih1aW50MzJfdCB4LCB1aW50MzJfdCB5LCB1aW50MzJfdCB6KQoreworCXJldHVybiAoeCAmIHkpIHwgKCh+eCkgJiB6KTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBHKHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopCit7CisJcmV0dXJuICh4ICYgeSkgfCAoeCAmIHopIHwgKHkgJiB6KTsKK30KKworc3RhdGljIGlubGluZSB1aW50MzJfdCBIKHVpbnQzMl90IHgsIHVpbnQzMl90IHksIHVpbnQzMl90IHopCit7CisJcmV0dXJuIHggXiB5IF4gejsKK30KKworI2RlZmluZSBST1VORDEoYSxiLGMsZCxrLHMpIChhID0gbHNoaWZ0KGEgKyBGKGIsYyxkKSArIGssIHMpKQorI2RlZmluZSBST1VORDIoYSxiLGMsZCxrLHMpIChhID0gbHNoaWZ0KGEgKyBHKGIsYyxkKSArIGsgKyAodWludDMyX3QpMHg1QTgyNzk5OSxzKSkKKyNkZWZpbmUgUk9VTkQzKGEsYixjLGQsayxzKSAoYSA9IGxzaGlmdChhICsgSChiLGMsZCkgKyBrICsgKHVpbnQzMl90KTB4NkVEOUVCQTEscykpCisKKy8qIFhYWDogdGhpcyBzdHVmZiBjYW4gYmUgb3B0aW1pemVkICovCitzdGF0aWMgaW5saW5lIHZvaWQgbGUzMl90b19jcHVfYXJyYXkodWludDMyX3QgKmJ1ZiwgdW5zaWduZWQgaW50IHdvcmRzKQoreworCXdoaWxlICh3b3Jkcy0tKSB7CisJCSpidWYgPSBudG9obCgqYnVmKTsKKwkJYnVmKys7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY3B1X3RvX2xlMzJfYXJyYXkodWludDMyX3QgKmJ1ZiwgdW5zaWduZWQgaW50IHdvcmRzKQoreworCXdoaWxlICh3b3Jkcy0tKSB7CisJCSpidWYgPSBodG9ubCgqYnVmKTsKKwkJYnVmKys7CisJfQorfQorCitzdGF0aWMgdm9pZCBtZDRfdHJhbnNmb3JtKHVpbnQzMl90ICpoYXNoLCB1aW50MzJfdCBjb25zdCAqaW4pCit7CisJdWludDMyX3QgYSwgYiwgYywgZDsKKworCWEgPSBoYXNoWzBdOworCWIgPSBoYXNoWzFdOworCWMgPSBoYXNoWzJdOworCWQgPSBoYXNoWzNdOworCisJUk9VTkQxKGEsIGIsIGMsIGQsIGluWzBdLCAzKTsKKwlST1VORDEoZCwgYSwgYiwgYywgaW5bMV0sIDcpOworCVJPVU5EMShjLCBkLCBhLCBiLCBpblsyXSwgMTEpOworCVJPVU5EMShiLCBjLCBkLCBhLCBpblszXSwgMTkpOworCVJPVU5EMShhLCBiLCBjLCBkLCBpbls0XSwgMyk7CisJUk9VTkQxKGQsIGEsIGIsIGMsIGluWzVdLCA3KTsKKwlST1VORDEoYywgZCwgYSwgYiwgaW5bNl0sIDExKTsKKwlST1VORDEoYiwgYywgZCwgYSwgaW5bN10sIDE5KTsKKwlST1VORDEoYSwgYiwgYywgZCwgaW5bOF0sIDMpOworCVJPVU5EMShkLCBhLCBiLCBjLCBpbls5XSwgNyk7CisJUk9VTkQxKGMsIGQsIGEsIGIsIGluWzEwXSwgMTEpOworCVJPVU5EMShiLCBjLCBkLCBhLCBpblsxMV0sIDE5KTsKKwlST1VORDEoYSwgYiwgYywgZCwgaW5bMTJdLCAzKTsKKwlST1VORDEoZCwgYSwgYiwgYywgaW5bMTNdLCA3KTsKKwlST1VORDEoYywgZCwgYSwgYiwgaW5bMTRdLCAxMSk7CisJUk9VTkQxKGIsIGMsIGQsIGEsIGluWzE1XSwgMTkpOworCisJUk9VTkQyKGEsIGIsIGMsIGQsaW5bIDBdLCAzKTsKKwlST1VORDIoZCwgYSwgYiwgYywgaW5bNF0sIDUpOworCVJPVU5EMihjLCBkLCBhLCBiLCBpbls4XSwgOSk7CisJUk9VTkQyKGIsIGMsIGQsIGEsIGluWzEyXSwgMTMpOworCVJPVU5EMihhLCBiLCBjLCBkLCBpblsxXSwgMyk7CisJUk9VTkQyKGQsIGEsIGIsIGMsIGluWzVdLCA1KTsKKwlST1VORDIoYywgZCwgYSwgYiwgaW5bOV0sIDkpOworCVJPVU5EMihiLCBjLCBkLCBhLCBpblsxM10sIDEzKTsKKwlST1VORDIoYSwgYiwgYywgZCwgaW5bMl0sIDMpOworCVJPVU5EMihkLCBhLCBiLCBjLCBpbls2XSwgNSk7CisJUk9VTkQyKGMsIGQsIGEsIGIsIGluWzEwXSwgOSk7CisJUk9VTkQyKGIsIGMsIGQsIGEsIGluWzE0XSwgMTMpOworCVJPVU5EMihhLCBiLCBjLCBkLCBpblszXSwgMyk7CisJUk9VTkQyKGQsIGEsIGIsIGMsIGluWzddLCA1KTsKKwlST1VORDIoYywgZCwgYSwgYiwgaW5bMTFdLCA5KTsKKwlST1VORDIoYiwgYywgZCwgYSwgaW5bMTVdLCAxMyk7CisKKwlST1VORDMoYSwgYiwgYywgZCxpblsgMF0sIDMpOworCVJPVU5EMyhkLCBhLCBiLCBjLCBpbls4XSwgOSk7CisJUk9VTkQzKGMsIGQsIGEsIGIsIGluWzRdLCAxMSk7CisJUk9VTkQzKGIsIGMsIGQsIGEsIGluWzEyXSwgMTUpOworCVJPVU5EMyhhLCBiLCBjLCBkLCBpblsyXSwgMyk7CisJUk9VTkQzKGQsIGEsIGIsIGMsIGluWzEwXSwgOSk7CisJUk9VTkQzKGMsIGQsIGEsIGIsIGluWzZdLCAxMSk7CisJUk9VTkQzKGIsIGMsIGQsIGEsIGluWzE0XSwgMTUpOworCVJPVU5EMyhhLCBiLCBjLCBkLCBpblsxXSwgMyk7CisJUk9VTkQzKGQsIGEsIGIsIGMsIGluWzldLCA5KTsKKwlST1VORDMoYywgZCwgYSwgYiwgaW5bNV0sIDExKTsKKwlST1VORDMoYiwgYywgZCwgYSwgaW5bMTNdLCAxNSk7CisJUk9VTkQzKGEsIGIsIGMsIGQsIGluWzNdLCAzKTsKKwlST1VORDMoZCwgYSwgYiwgYywgaW5bMTFdLCA5KTsKKwlST1VORDMoYywgZCwgYSwgYiwgaW5bN10sIDExKTsKKwlST1VORDMoYiwgYywgZCwgYSwgaW5bMTVdLCAxNSk7CisKKwloYXNoWzBdICs9IGE7CisJaGFzaFsxXSArPSBiOworCWhhc2hbMl0gKz0gYzsKKwloYXNoWzNdICs9IGQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBtZDRfdHJhbnNmb3JtX2hlbHBlcihzdHJ1Y3QgbWQ0X2N0eCAqY3R4KQoreworCWxlMzJfdG9fY3B1X2FycmF5KGN0eC0+YmxvY2ssIHNpemVvZihjdHgtPmJsb2NrKSAvIHNpemVvZih1aW50MzJfdCkpOworCW1kNF90cmFuc2Zvcm0oY3R4LT5oYXNoLCBjdHgtPmJsb2NrKTsKK30KKworc3RhdGljIHZvaWQgbWQ0X2luaXQoc3RydWN0IG1kNF9jdHggKm1jdHgpCit7CisJbWN0eC0+aGFzaFswXSA9IDB4Njc0NTIzMDE7CisJbWN0eC0+aGFzaFsxXSA9IDB4ZWZjZGFiODk7CisJbWN0eC0+aGFzaFsyXSA9IDB4OThiYWRjZmU7CisJbWN0eC0+aGFzaFszXSA9IDB4MTAzMjU0NzY7CisJbWN0eC0+Ynl0ZV9jb3VudCA9IDA7Cit9CisKK3N0YXRpYyB2b2lkIG1kNF91cGRhdGUoc3RydWN0IG1kNF9jdHggKm1jdHgsCisJCSAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuKQoreworCWNvbnN0IHVpbnQzMl90IGF2YWlsID0gc2l6ZW9mKG1jdHgtPmJsb2NrKSAtIChtY3R4LT5ieXRlX2NvdW50ICYgMHgzZik7CisKKwltY3R4LT5ieXRlX2NvdW50ICs9IGxlbjsKKworCWlmIChhdmFpbCA+IGxlbikgeworCQltZW1jcHkoKGNoYXIgKiltY3R4LT5ibG9jayArIChzaXplb2YobWN0eC0+YmxvY2spIC0gYXZhaWwpLAorCQkgICAgICAgZGF0YSwgbGVuKTsKKwkJcmV0dXJuOworCX0KKworCW1lbWNweSgoY2hhciAqKW1jdHgtPmJsb2NrICsgKHNpemVvZihtY3R4LT5ibG9jaykgLSBhdmFpbCksCisJICAgICAgIGRhdGEsIGF2YWlsKTsKKworCW1kNF90cmFuc2Zvcm1faGVscGVyKG1jdHgpOworCWRhdGEgKz0gYXZhaWw7CisJbGVuIC09IGF2YWlsOworCisJd2hpbGUgKGxlbiA+PSBzaXplb2YobWN0eC0+YmxvY2spKSB7CisJCW1lbWNweShtY3R4LT5ibG9jaywgZGF0YSwgc2l6ZW9mKG1jdHgtPmJsb2NrKSk7CisJCW1kNF90cmFuc2Zvcm1faGVscGVyKG1jdHgpOworCQlkYXRhICs9IHNpemVvZihtY3R4LT5ibG9jayk7CisJCWxlbiAtPSBzaXplb2YobWN0eC0+YmxvY2spOworCX0KKworCW1lbWNweShtY3R4LT5ibG9jaywgZGF0YSwgbGVuKTsKK30KKworc3RhdGljIHZvaWQgbWQ0X2ZpbmFsX2FzY2lpKHN0cnVjdCBtZDRfY3R4ICptY3R4LCBjaGFyICpvdXQsIHVuc2lnbmVkIGludCBsZW4pCit7CisJY29uc3QgdW5zaWduZWQgaW50IG9mZnNldCA9IG1jdHgtPmJ5dGVfY291bnQgJiAweDNmOworCWNoYXIgKnAgPSAoY2hhciAqKW1jdHgtPmJsb2NrICsgb2Zmc2V0OworCWludCBwYWRkaW5nID0gNTYgLSAob2Zmc2V0ICsgMSk7CisKKwkqcCsrID0gMHg4MDsKKwlpZiAocGFkZGluZyA8IDApIHsKKwkJbWVtc2V0KHAsIDB4MDAsIHBhZGRpbmcgKyBzaXplb2YgKHVpbnQ2NF90KSk7CisJCW1kNF90cmFuc2Zvcm1faGVscGVyKG1jdHgpOworCQlwID0gKGNoYXIgKiltY3R4LT5ibG9jazsKKwkJcGFkZGluZyA9IDU2OworCX0KKworCW1lbXNldChwLCAwLCBwYWRkaW5nKTsKKwltY3R4LT5ibG9ja1sxNF0gPSBtY3R4LT5ieXRlX2NvdW50IDw8IDM7CisJbWN0eC0+YmxvY2tbMTVdID0gbWN0eC0+Ynl0ZV9jb3VudCA+PiAyOTsKKwlsZTMyX3RvX2NwdV9hcnJheShtY3R4LT5ibG9jaywgKHNpemVvZihtY3R4LT5ibG9jaykgLQorCSAgICAgICAgICAgICAgICAgIHNpemVvZih1aW50NjRfdCkpIC8gc2l6ZW9mKHVpbnQzMl90KSk7CisJbWQ0X3RyYW5zZm9ybShtY3R4LT5oYXNoLCBtY3R4LT5ibG9jayk7CisJY3B1X3RvX2xlMzJfYXJyYXkobWN0eC0+aGFzaCwgc2l6ZW9mKG1jdHgtPmhhc2gpIC8gc2l6ZW9mKHVpbnQzMl90KSk7CisKKwlzbnByaW50ZihvdXQsIGxlbiwgIiUwOFglMDhYJTA4WCUwOFgiLAorCQkgbWN0eC0+aGFzaFswXSwgbWN0eC0+aGFzaFsxXSwgbWN0eC0+aGFzaFsyXSwgbWN0eC0+aGFzaFszXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCBhZGRfY2hhcih1bnNpZ25lZCBjaGFyIGMsIHN0cnVjdCBtZDRfY3R4ICptZCkKK3sKKwltZDRfdXBkYXRlKG1kLCAmYywgMSk7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2Vfc3RyaW5nKGNvbnN0IGNoYXIgKmZpbGUsIHVuc2lnbmVkIGxvbmcgbGVuLAorCQkJc3RydWN0IG1kNF9jdHggKm1kKQoreworCXVuc2lnbmVkIGxvbmcgaTsKKworCWFkZF9jaGFyKGZpbGVbMF0sIG1kKTsKKwlmb3IgKGkgPSAxOyBpIDwgbGVuOyBpKyspIHsKKwkJYWRkX2NoYXIoZmlsZVtpXSwgbWQpOworCQlpZiAoZmlsZVtpXSA9PSAnIicgJiYgZmlsZVtpLTFdICE9ICdcXCcpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfY29tbWVudChjb25zdCBjaGFyICpmaWxlLCB1bnNpZ25lZCBsb25nIGxlbikKK3sKKwl1bnNpZ25lZCBsb25nIGk7CisKKwlmb3IgKGkgPSAyOyBpIDwgbGVuOyBpKyspIHsKKwkJaWYgKGZpbGVbaS0xXSA9PSAnKicgJiYgZmlsZVtpXSA9PSAnLycpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGk7Cit9CisKKy8qIEZJWE1FOiBIYW5kbGUgLnMgZmlsZXMgZGlmZmVyZW50bHkgKGVnLiAjIHN0YXJ0cyBjb21tZW50cykgLS1SUiAqLworc3RhdGljIGludCBwYXJzZV9maWxlKGNvbnN0IHNpZ25lZCBjaGFyICpmbmFtZSwgc3RydWN0IG1kNF9jdHggKm1kKQoreworCXNpZ25lZCBjaGFyICpmaWxlOworCXVuc2lnbmVkIGxvbmcgaSwgbGVuOworCisJZmlsZSA9IGdyYWJfZmlsZShmbmFtZSwgJmxlbik7CisJaWYgKCFmaWxlKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQkvKiBDb2xsYXBzZSBhbmQgaWdub3JlIFwgYW5kIENSLiAqLworCQlpZiAoZmlsZVtpXSA9PSAnXFwnICYmIChpKzEgPCBsZW4pICYmIGZpbGVbaSsxXSA9PSAnXG4nKSB7CisJCQlpKys7CisJCQljb250aW51ZTsKKwkJfQorCisJCS8qIElnbm9yZSB3aGl0ZXNwYWNlICovCisJCWlmIChpc3NwYWNlKGZpbGVbaV0pKQorCQkJY29udGludWU7CisKKwkJLyogSGFuZGxlIHN0cmluZ3MgYXMgd2hvbGUgdW5pdHMgKi8KKwkJaWYgKGZpbGVbaV0gPT0gJyInKSB7CisJCQlpICs9IHBhcnNlX3N0cmluZyhmaWxlK2ksIGxlbiAtIGksIG1kKTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogQ29tbWVudHM6IGlnbm9yZSAqLworCQlpZiAoZmlsZVtpXSA9PSAnLycgJiYgZmlsZVtpKzFdID09ICcqJykgeworCQkJaSArPSBwYXJzZV9jb21tZW50KGZpbGUraSwgbGVuIC0gaSk7CisJCQljb250aW51ZTsKKwkJfQorCisJCWFkZF9jaGFyKGZpbGVbaV0sIG1kKTsKKwl9CisJcmVsZWFzZV9maWxlKGZpbGUsIGxlbik7CisJcmV0dXJuIDE7Cit9CisKKy8qIFdlIGhhdmUgZGlyL2ZpbGUuby4gIE9wZW4gZGlyLy5maWxlLm8uY21kLCBsb29rIGZvciBkZXBzXyBsaW5lIHRvCisgKiBmaWd1cmUgb3V0IHNvdXJjZSBmaWxlLiAqLworc3RhdGljIGludCBwYXJzZV9zb3VyY2VfZmlsZXMoY29uc3QgY2hhciAqb2JqZmlsZSwgc3RydWN0IG1kNF9jdHggKm1kKQoreworCWNoYXIgKmNtZCwgKmZpbGUsICpsaW5lLCAqZGlyOworCWNvbnN0IGNoYXIgKmJhc2U7CisJdW5zaWduZWQgbG9uZyBmbGVuLCBwb3MgPSAwOworCWludCBkaXJsZW4sIHJldCA9IDAsIGNoZWNrX2ZpbGVzID0gMDsKKworCWNtZCA9IE5PRkFJTChtYWxsb2Moc3RybGVuKG9iamZpbGUpICsgc2l6ZW9mKCIuLmNtZCIpKSk7CisKKwliYXNlID0gc3RycmNocihvYmpmaWxlLCAnLycpOworCWlmIChiYXNlKSB7CisJCWJhc2UrKzsKKwkJZGlybGVuID0gYmFzZSAtIG9iamZpbGU7CisJCXNwcmludGYoY21kLCAiJS4qcy4lcy5jbWQiLCBkaXJsZW4sIG9iamZpbGUsIGJhc2UpOworCX0gZWxzZSB7CisJCWRpcmxlbiA9IDA7CisJCXNwcmludGYoY21kLCAiLiVzLmNtZCIsIG9iamZpbGUpOworCX0KKwlkaXIgPSBOT0ZBSUwobWFsbG9jKGRpcmxlbiArIDEpKTsKKwlzdHJuY3B5KGRpciwgb2JqZmlsZSwgZGlybGVuKTsKKwlkaXJbZGlybGVuXSA9ICdcMCc7CisKKwlmaWxlID0gZ3JhYl9maWxlKGNtZCwgJmZsZW4pOworCWlmICghZmlsZSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IGNvdWxkIG5vdCBmaW5kICVzIGZvciAlc1xuIiwKKwkJCWNtZCwgb2JqZmlsZSk7CisJCWdvdG8gb3V0OworCX0KKworCS8qIFRoZXJlIHdpbGwgYmUgYSBsaW5lIGxpa2Ugc286CisJCWRlcHNfZHJpdmVycy9uZXQvZHVtbXkubyA6PSBcCisJCSAgZHJpdmVycy9uZXQvZHVtbXkuYyBcCisJCSAgICAkKHdpbGRjYXJkIGluY2x1ZGUvY29uZmlnL25ldC9mYXN0cm91dGUuaCkgXAorCQkgIGluY2x1ZGUvbGludXgvY29uZmlnLmggXAorCQkgICAgJCh3aWxkY2FyZCBpbmNsdWRlL2NvbmZpZy9oLmgpIFwKKwkJICBpbmNsdWRlL2xpbnV4L21vZHVsZS5oIFwKKworCSAgIFN1bSBhbGwgZmlsZXMgaW4gdGhlIHNhbWUgZGlyIG9yIHN1YmRpcnMuCisJKi8KKwl3aGlsZSAoKGxpbmUgPSBnZXRfbmV4dF9saW5lKCZwb3MsIGZpbGUsIGZsZW4pKSAhPSBOVUxMKSB7CisJCXNpZ25lZCBjaGFyKiBwID0gbGluZTsKKwkJaWYgKHN0cm5jbXAobGluZSwgImRlcHNfIiwgc2l6ZW9mKCJkZXBzXyIpLTEpID09IDApIHsKKwkJCWNoZWNrX2ZpbGVzID0gMTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghY2hlY2tfZmlsZXMpCisJCQljb250aW51ZTsKKworCQkvKiBDb250aW51ZSB1bnRpbCBsaW5lIGRvZXMgbm90IGVuZCB3aXRoICdcJyAqLworCQlpZiAoICoocCArIHN0cmxlbihwKS0xKSAhPSAnXFwnKQorCQkJYnJlYWs7CisJCS8qIFRlcm1pbmF0ZSBsaW5lIGF0IGZpcnN0IHNwYWNlLCB0byBnZXQgcmlkIG9mIGZpbmFsICcgXCcgKi8KKwkJd2hpbGUgKCpwKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGlmIChpc3NwYWNlKCpwKSkgeworCQkJCSpwID0gJ1wwJzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCXArKzsKKwkJfQorCisJCS8qIENoZWNrIGlmIHRoaXMgZmlsZSBpcyBpbiBzYW1lIGRpciBhcyBvYmpmaWxlICovCisJCWlmICgoc3Ryc3RyKGxpbmUsIGRpcikrc3RybGVuKGRpciktMSkgPT0gc3RycmNocihsaW5lLCAnLycpKSB7CisJCQlpZiAoIXBhcnNlX2ZpbGUobGluZSwgbWQpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsCisJCQkJCSJXYXJuaW5nOiBjb3VsZCBub3Qgb3BlbiAlczogJXNcbiIsCisJCQkJCWxpbmUsIHN0cmVycm9yKGVycm5vKSk7CisJCQkJZ290byBvdXRfZmlsZTsKKwkJCX0KKworCQl9CisKKwl9CisKKwkvKiBFdmVyeW9uZSBwYXJzZWQgT0sgKi8KKwlyZXQgPSAxOworb3V0X2ZpbGU6CisJcmVsZWFzZV9maWxlKGZpbGUsIGZsZW4pOworb3V0OgorCWZyZWUoZGlyKTsKKwlmcmVlKGNtZCk7CisJcmV0dXJuIHJldDsKK30KKworLyogQ2FsYyBhbmQgcmVjb3JkIHNyYyBjaGVja3N1bS4gKi8KK3ZvaWQgZ2V0X3NyY192ZXJzaW9uKGNvbnN0IGNoYXIgKm1vZG5hbWUsIGNoYXIgc3VtW10sIHVuc2lnbmVkIHN1bWxlbikKK3sKKwl2b2lkICpmaWxlOworCXVuc2lnbmVkIGxvbmcgbGVuOworCXN0cnVjdCBtZDRfY3R4IG1kOworCWNoYXIgKnNvdXJjZXMsICplbmQsICpmbmFtZTsKKwljb25zdCBjaGFyICpiYXNlbmFtZTsKKwljaGFyIGZpbGVsaXN0W3N0cmxlbihnZXRlbnYoIk1PRFZFUkRJUiIpKSArIHN0cmxlbigiLyIpICsKKwkJICAgICAgc3RybGVuKG1vZG5hbWUpIC0gc3RybGVuKCIubyIpICsgc3RybGVuKCIubW9kIikgKyAxIF07CisKKwkvKiBTb3VyY2UgZmlsZXMgZm9yIG1vZHVsZSBhcmUgaW4gLnRtcF92ZXJzaW9ucy9tb2RuYW1lLm1vZCwKKwkgICBhZnRlciB0aGUgZmlyc3QgbGluZS4gKi8KKwlpZiAoc3RycmNocihtb2RuYW1lLCAnLycpKQorCQliYXNlbmFtZSA9IHN0cnJjaHIobW9kbmFtZSwgJy8nKSArIDE7CisJZWxzZQorCQliYXNlbmFtZSA9IG1vZG5hbWU7CisJc3ByaW50ZihmaWxlbGlzdCwgIiVzLyUuKnMubW9kIiwgZ2V0ZW52KCJNT0RWRVJESVIiKSwKKwkJKGludCkgc3RybGVuKGJhc2VuYW1lKSAtIDIsIGJhc2VuYW1lKTsKKworCWZpbGUgPSBncmFiX2ZpbGUoZmlsZWxpc3QsICZsZW4pOworCWlmICghZmlsZSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IGNvdWxkIG5vdCBmaW5kIHZlcnNpb25zIGZvciAlc1xuIiwKKwkJCWZpbGVsaXN0KTsKKwkJcmV0dXJuOworCX0KKworCXNvdXJjZXMgPSBzdHJjaHIoZmlsZSwgJ1xuJyk7CisJaWYgKCFzb3VyY2VzKSB7CisJCWZwcmludGYoc3RkZXJyLCAiV2FybmluZzogbWFsZm9ybWVkIHZlcnNpb25zIGZpbGUgZm9yICVzXG4iLAorCQkJbW9kbmFtZSk7CisJCWdvdG8gcmVsZWFzZTsKKwl9CisKKwlzb3VyY2VzKys7CisJZW5kID0gc3RyY2hyKHNvdXJjZXMsICdcbicpOworCWlmICghZW5kKSB7CisJCWZwcmludGYoc3RkZXJyLCAiV2FybmluZzogYmFkIGVuZGluZyB2ZXJzaW9ucyBmaWxlIGZvciAlc1xuIiwKKwkJCW1vZG5hbWUpOworCQlnb3RvIHJlbGVhc2U7CisJfQorCSplbmQgPSAnXDAnOworCisJbWQ0X2luaXQoJm1kKTsKKwl3aGlsZSAoKGZuYW1lID0gc3Ryc2VwKCZzb3VyY2VzLCAiICIpKSAhPSBOVUxMKSB7CisJCWlmICghKmZuYW1lKQorCQkJY29udGludWU7CisJCWlmICghcGFyc2Vfc291cmNlX2ZpbGVzKGZuYW1lLCAmbWQpKQorCQkJZ290byByZWxlYXNlOworCX0KKworCW1kNF9maW5hbF9hc2NpaSgmbWQsIHN1bSwgc3VtbGVuKTsKK3JlbGVhc2U6CisJcmVsZWFzZV9maWxlKGZpbGUsIGxlbik7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX3ZlcnNpb24oY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKnN1bSwKKwkJCSAgdW5zaWduZWQgbG9uZyBvZmZzZXQpCit7CisJaW50IGZkOworCisJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JEV1IpOworCWlmIChmZCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBjaGFuZ2luZyBzdW0gaW4gJXMgZmFpbGVkOiAlc1xuIiwKKwkJCWZpbGVuYW1lLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm47CisJfQorCisJaWYgKGxzZWVrKGZkLCBvZmZzZXQsIFNFRUtfU0VUKSA9PSAob2ZmX3QpLTEpIHsKKwkJZnByaW50ZihzdGRlcnIsICJXYXJuaW5nOiBjaGFuZ2luZyBzdW0gaW4gJXM6JWx1IGZhaWxlZDogJXNcbiIsCisJCQlmaWxlbmFtZSwgb2Zmc2V0LCBzdHJlcnJvcihlcnJubykpOworCQlnb3RvIG91dDsKKwl9CisKKwlpZiAod3JpdGUoZmQsIHN1bSwgc3RybGVuKHN1bSkrMSkgIT0gc3RybGVuKHN1bSkrMSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIldhcm5pbmc6IHdyaXRpbmcgc3VtIGluICVzIGZhaWxlZDogJXNcbiIsCisJCQlmaWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKwkJZ290byBvdXQ7CisJfQorb3V0OgorCWNsb3NlKGZkKTsKK30KKworc3RhdGljIGludCBzdHJpcF9yY3NfY3JhcChzaWduZWQgY2hhciAqdmVyc2lvbikKK3sKKwl1bnNpZ25lZCBpbnQgbGVuLCBmdWxsX2xlbjsKKworCWlmIChzdHJuY21wKHZlcnNpb24sICIkUmV2aXNpb24iLCBzdHJsZW4oIiRSZXZpc2lvbiIpKSAhPSAwKQorCQlyZXR1cm4gMDsKKworCS8qIFNwYWNlIGZvciB2ZXJzaW9uIHN0cmluZyBmb2xsb3dzLiAqLworCWZ1bGxfbGVuID0gc3RybGVuKHZlcnNpb24pICsgc3RybGVuKHZlcnNpb24gKyBzdHJsZW4odmVyc2lvbikgKyAxKSArIDI7CisKKwkvKiBNb3ZlIHN0cmluZyB0byBzdGFydCB3aXRoIHZlcnNpb24gbnVtYmVyOiBwcmVmaXggd2lsbCBiZQorCSAqICRSZXZpc2lvbiQgb3IgJFJldmlzaW9uOiAqLworCWxlbiA9IHN0cmxlbigiJFJldmlzaW9uIik7CisJaWYgKHZlcnNpb25bbGVuXSA9PSAnOicgfHwgdmVyc2lvbltsZW5dID09ICckJykKKwkJbGVuKys7CisJd2hpbGUgKGlzc3BhY2UodmVyc2lvbltsZW5dKSkKKwkJbGVuKys7CisJbWVtbW92ZSh2ZXJzaW9uLCB2ZXJzaW9uK2xlbiwgZnVsbF9sZW4tbGVuKTsKKwlmdWxsX2xlbiAtPSBsZW47CisKKwkvKiBQcmVzZXJ2ZSB1cCB0byBuZXh0IHdoaXRlc3BhY2UuICovCisJbGVuID0gMDsKKwl3aGlsZSAodmVyc2lvbltsZW5dICYmICFpc3NwYWNlKHZlcnNpb25bbGVuXSkpCisJCWxlbisrOworCW1lbW1vdmUodmVyc2lvbiArIGxlbiwgdmVyc2lvbiArIHN0cmxlbih2ZXJzaW9uKSwKKwkJZnVsbF9sZW4gLSBzdHJsZW4odmVyc2lvbikpOworCXJldHVybiAxOworfQorCisvKiBDbGVhbiB1cCBSQ1Mtc3R5bGUgdmVyc2lvbiBudW1iZXJzLiAqLwordm9pZCBtYXliZV9mcm9iX3Jjc192ZXJzaW9uKGNvbnN0IGNoYXIgKm1vZGZpbGVuYW1lLAorCQkJICAgIGNoYXIgKnZlcnNpb24sCisJCQkgICAgdm9pZCAqbW9kaW5mbywKKwkJCSAgICB1bnNpZ25lZCBsb25nIHZlcnNpb25fb2Zmc2V0KQoreworCWlmIChzdHJpcF9yY3NfY3JhcCh2ZXJzaW9uKSkKKwkJd3JpdGVfdmVyc2lvbihtb2RmaWxlbmFtZSwgdmVyc2lvbiwgdmVyc2lvbl9vZmZzZXQpOworfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9uYW1lc3BhY2UucGwgYi9zY3JpcHRzL25hbWVzcGFjZS5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OGUzMGU4Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9uYW1lc3BhY2UucGwKQEAgLTAsMCArMSw0NTQgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworIworIwluYW1lc3BhY2UucGwuICBNb24gQXVnIDMwIDIwMDQKKyMKKyMJUGVyZm9ybSBhIG5hbWUgc3BhY2UgYW5hbHlzaXMgb24gdGhlIGxpbnV4IGtlcm5lbC4KKyMKKyMJQ29weXJpZ2h0IEtlaXRoIE93ZW5zIDxrYW9zQG9jcy5jb20uYXU+LiAgR1BMLgorIworIwlJbnZva2UgYnkgY2hhbmdpbmcgZGlyZWN0b3J5IHRvIHRoZSB0b3Agb2YgdGhlIGtlcm5lbCBvYmplY3QKKyMJdHJlZSB0aGVuIG5hbWVzcGFjZS5wbCwgbm8gcGFyYW1ldGVycy4KKyMKKyMJVHVuZWQgZm9yIDIuMS54IGtlcm5lbHMgd2l0aCB0aGUgbmV3IG1vZHVsZSBoYW5kbGluZywgaXQgd2lsbAorIwl3b3JrIHdpdGggMi4wIGtlcm5lbHMgYXMgd2VsbC4KKyMKKyMJTGFzdCBjaGFuZ2UgMi42LjktcmMxLCBhZGRpbmcgc3VwcG9ydCBmb3Igc2VwYXJhdGUgc291cmNlIGFuZCBvYmplY3QKKyMJdHJlZXMuCisjCisjCVRoZSBzb3VyY2UgbXVzdCBiZSBjb21waWxlZC9hc3NlbWJsZWQgZmlyc3QsIHRoZSBvYmplY3QgZmlsZXMKKyMJYXJlIHRoZSBwcmltYXJ5IGlucHV0IHRvIHRoaXMgc2NyaXB0LiAgSW5jb21wbGV0ZSBvciBtaXNzaW5nCisjCW9iamVjdHMgd2lsbCByZXN1bHQgaW4gYSBmbGF3ZWQgYW5hbHlzaXMuICBDb21waWxlIGJvdGggdm1saW51eAorIwlhbmQgbW9kdWxlcy4KKyMKKyMJRXZlbiB3aXRoIGNvbXBsZXRlIG9iamVjdHMsIHRyZWF0IHRoZSByZXN1bHQgb2YgdGhlIGFuYWx5c2lzCisjCXdpdGggY2F1dGlvbi4gIFNvbWUgZXh0ZXJuYWwgcmVmZXJlbmNlcyBhcmUgb25seSB1c2VkIGJ5CisjCWNlcnRhaW4gYXJjaGl0ZWN0dXJlcywgb3RoZXJzIHdpdGggY2VydGFpbiBjb21iaW5hdGlvbnMgb2YKKyMJY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzLiAgSWRlYWxseSB0aGUgc291cmNlIHNob3VsZCBpbmNsdWRlCisjCXNvbWV0aGluZyBsaWtlCisjCisjCSNpZm5kZWYgQ09ORklHXy4uLgorIwlzdGF0aWMKKyMJI2VuZGlmCisjCXN5bWJvbF9kZWZpbml0aW9uOworIworIwlzbyB0aGUgc3ltYm9scyBhcmUgZGVmaW5lZCBhcyBzdGF0aWMgdW5sZXNzIGEgcGFydGljdWxhcgorIwlDT05GSUdfLi4uIHJlcXVpcmVzIGl0IHRvIGJlIGV4dGVybmFsLgorIworIwlBIHN5bWJvbCB0aGF0IGlzIHN1ZmZpeGVkIHdpdGggJyhleHBvcnQgb25seSknIGhhcyB0aGVzZSBwcm9wZXJ0aWVzCisjCisjCSogSXQgaXMgZ2xvYmFsLgorIwkqIEl0IGlzIG1hcmtlZCBFWFBPUlRfU1lNQk9MIG9yIEVYUE9SVF9TWU1CT0xfR1BMLCBlaXRoZXIgaW4gdGhlIHNhbWUKKyMJICBzb3VyY2UgZmlsZSBvciBhIGRpZmZlcmVudCBzb3VyY2UgZmlsZS4KKyMJKiBHaXZlbiB0aGUgY3VycmVudCAuY29uZmlnLCBub3RoaW5nIHVzZXMgdGhlIHN5bWJvbC4KKyMKKyMJVGhlIHN5bWJvbCBpcyBhIGNhbmRpZGF0ZSBmb3IgY29udmVyc2lvbiB0byBzdGF0aWMsIHBsdXMgcmVtb3ZhbCBvZiB0aGUKKyMJZXhwb3J0LiAgQnV0IGJlIGNhcmVmdWwgdGhhdCBhIGRpZmZlcmVudCAuY29uZmlnIG1pZ2h0IHVzZSB0aGUgc3ltYm9sLgorIworIworIwlOYW1lIHNwYWNlIGFuYWx5c2lzIGFuZCBjbGVhbnVwIGlzIGFuIGl0ZXJhdGl2ZSBwcm9jZXNzLiAgWW91IGNhbm5vdAorIwlleHBlY3QgdG8gZmluZCBhbGwgdGhlIHByb2JsZW1zIGluIGEgc2luZ2xlIHBhc3MuCisjCisjCSogSWRlbnRpZnkgcG9zc2libHkgdW5uZWNlc3NhcnkgZ2xvYmFsIGRlY2xhcmF0aW9ucywgdmVyaWZ5IHRoYXQgdGhleQorIwkgIHJlYWxseSBhcmUgdW5uZWNlc3NhcnkgYW5kIGNoYW5nZSB0aGVtIHRvIHN0YXRpYy4KKyMJKiBDb21waWxlIGFuZCBmaXggdXAgZ2NjIHdhcm5pbmdzIGFib3V0IHN0YXRpYywgcmVtb3ZpbmcgZGVhZCBzeW1ib2xzCisjCSAgYXMgbmVjZXNzYXJ5LgorIwkqIG1ha2UgY2xlYW4gYW5kIHJlYnVpbGQgd2l0aCBkaWZmZXJlbnQgY29uZmlncyAoZXNwZWNpYWxseQorIwkgIENPTkZJR19NT0RVTEVTPW4pIHRvIHNlZSB3aGljaCBzeW1ib2xzIGFyZSBiZWluZyBkZWZpbmVkIHdoZW4gdGhlCisjCSAgY29uZmlnIGRvZXMgbm90IHJlcXVpcmUgdGhlbS4gIFRoZXNlIHN5bWJvbHMgYmxvYXQgdGhlIGtlcm5lbCBvYmplY3QKKyMJICBmb3Igbm8gZ29vZCByZWFzb24sIHdoaWNoIGlzIGZydXN0cmF0aW5nIGZvciBlbWJlZGRlZCBzeXN0ZW1zLgorIwkqIFdyYXAgY29uZmlnIHNlbnNpdGl2ZSBzeW1ib2xzIGluICNpZmRlZiBDT05GSUdfZm9vLCBhcyBsb25nIGFzIHRoZQorIwkgIGNvZGUgZG9lcyBub3QgZ2V0IHRvbyB1Z2x5LgorIwkqIFJlcGVhdCB0aGUgbmFtZSBzcGFjZSBhbmFseXNpcyB1bnRpbCB5b3UgY2FuIGxpdmUgd2l0aCB3aXRoIHRoZQorIwkgIHJlc3VsdC4KKyMKKworcmVxdWlyZSA1OwkjIGF0IGxlYXN0IHBlcmwgNQordXNlIHN0cmljdDsKK3VzZSBGaWxlOjpGaW5kOworCitteSAkbm0gPSAiL3Vzci9iaW4vbm0gLXAiOworbXkgJG9iamR1bXAgPSAiL3Vzci9iaW4vb2JqZHVtcCAtcyAtaiAuY29tbWVudCI7CitteSAkc3JjdHJlZSA9ICIiOworbXkgJG9ianRyZWUgPSAiIjsKKyRzcmN0cmVlID0gIiRFTlZ7J3NyY3RyZWUnfS8iIGlmIChleGlzdHMoJEVOVnsnc3JjdHJlZSd9KSk7Ciskb2JqdHJlZSA9ICIkRU5WeydvYmp0cmVlJ30vIiBpZiAoZXhpc3RzKCRFTlZ7J29ianRyZWUnfSkpOworCitpZiAoJCNBUkdWICE9IC0xKSB7CisJcHJpbnQgU1RERVJSICJ1c2FnZTogJDAgdGFrZXMgbm8gcGFyYW1ldGVyc1xuIjsKKwlkaWUoImdpdmluZyB1cFxuIik7Cit9CisKK215ICVubWRhdGEgPSAoKTsJIyBubSBkYXRhIGZvciBlYWNoIG9iamVjdAorbXkgJWRlZiA9ICgpOwkJIyBhbGwgZGVmaW5pdGlvbnMgZm9yIGVhY2ggbmFtZQorbXkgJWtzeW10YWIgPSAoKTsJIyBuYW1lcyB0aGF0IGFwcGVhciBpbiBfX2tzeW10YWJfCitteSAlcmVmID0gKCk7CQkjICRyZWZ7JG5hbWV9IGV4aXN0cyBpZiB0aGVyZSBpcyBhIHRydWUgZXh0ZXJuYWwgcmVmZXJlbmNlIHRvICRuYW1lCitteSAlZXhwb3J0ID0gKCk7CSMgJGV4cG9ydHskbmFtZX0gZXhpc3RzIGlmIHRoZXJlIGlzIGFuIEVYUE9SVF8uLi4gb2YgJG5hbWUKKworJmZpbmQoXCZsaW51eF9vYmplY3RzLCAnLicpOwkjIGZpbmQgdGhlIG9iamVjdHMgYW5kIGRvX25tIG9uIHRoZW0KKyZsaXN0X211bHRpcGx5X2RlZmluZWQoKTsKKyZyZXNvbHZlX2V4dGVybmFsX3JlZmVyZW5jZXMoKTsKKyZsaXN0X2V4dHJhX2V4dGVybmFscygpOworCitleGl0KDApOworCitzdWIgbGludXhfb2JqZWN0cworeworCSMgU2VsZWN0IG9iamVjdHMsIGlnbm9yaW5nIG9iamVjdHMgd2hpY2ggYXJlIG9ubHkgY3JlYXRlZCBieQorCSMgbWVyZ2luZyBvdGhlciBvYmplY3RzLiAgQWxzbyBpZ25vcmUgYWxsIG9mIG1vZHVsZXMsIHNjcmlwdHMKKwkjIGFuZCBjb21wcmVzc2VkLiAgTW9zdCBjb25nbG9tZXJhdGUgb2JqZWN0cyBhcmUgaGFuZGxlZCBieSBkb19ubSwKKwkjIHRoaXMgbGlzdCBvbmx5IGNvbnRhaW5zIHRoZSBzcGVjaWFsIGNhc2VzLiAgVGhlc2UgaW5jbHVkZSBvYmplY3RzCisJIyB0aGF0IGFyZSBsaW5rZWQgZnJvbSBqdXN0IG9uZSBvdGhlciBvYmplY3QgYW5kIG9iamVjdHMgZm9yIHdoaWNoCisJIyB0aGVyZSBpcyByZWFsbHkgbm8gcGVybWFuZW50IHNvdXJjZSBmaWxlLgorCW15ICRiYXNlbmFtZSA9ICRfOworCSRfID0gJEZpbGU6OkZpbmQ6Om5hbWU7CisJczpeXC4vOjo7CisJaWYgKC8uKlwubyQvICYmCisJCSEgKAorCQltOi9idWlsdC1pbi5vJDoKKwkJfHwgbTphcmNoL2kzODYva2VybmVsL3ZzeXNjYWxsLXN5bXMubyQ6CisJCXx8IG06YXJjaC9pYTY0L2lhMzIvaWEzMi5vJDoKKwkJfHwgbTphcmNoL2lhNjQva2VybmVsL2dhdGUtc3ltcy5vJDoKKwkJfHwgbTphcmNoL2lhNjQvbGliL19fZGl2ZGkzLm8kOgorCQl8fCBtOmFyY2gvaWE2NC9saWIvX19kaXZzaTMubyQ6CisJCXx8IG06YXJjaC9pYTY0L2xpYi9fX21vZGRpMy5vJDoKKwkJfHwgbTphcmNoL2lhNjQvbGliL19fbW9kc2kzLm8kOgorCQl8fCBtOmFyY2gvaWE2NC9saWIvX191ZGl2ZGkzLm8kOgorCQl8fCBtOmFyY2gvaWE2NC9saWIvX191ZGl2c2kzLm8kOgorCQl8fCBtOmFyY2gvaWE2NC9saWIvX191bW9kZGkzLm8kOgorCQl8fCBtOmFyY2gvaWE2NC9saWIvX191bW9kc2kzLm8kOgorCQl8fCBtOmFyY2gvaWE2NC9zY3JpcHRzL2NoZWNrX2dhc19mb3JfaGludC5vJDoKKwkJfHwgbTphcmNoL2lhNjQvc24va2VybmVsL3hwLm8kOgorCQl8fCBtOmJvb3QvYmJvb3RzZWN0Lm8kOgorCQl8fCBtOmJvb3QvYnNldHVwLm8kOgorCQl8fCBtOi9ib290c2VjdC5vJDoKKwkJfHwgbTovYm9vdC9zZXR1cC5vJDoKKwkJfHwgbTovY29tcHJlc3NlZC86CisJCXx8IG06ZHJpdmVycy9jZHJvbS9kcml2ZXIubyQ6CisJCXx8IG06ZHJpdmVycy9jaGFyL2RybS90ZGZ4X2Rydi5vJDoKKwkJfHwgbTpkcml2ZXJzL2lkZS9pZGUtZGV0ZWN0Lm8kOgorCQl8fCBtOmRyaXZlcnMvaWRlL3BjaS9pZGVkcml2ZXItcGNpLm8kOgorCQl8fCBtOmRyaXZlcnMvbWVkaWEvbWVkaWEubyQ6CisJCXx8IG06ZHJpdmVycy9zY3NpL3NkX21vZC5vJDoKKwkJfHwgbTpkcml2ZXJzL3ZpZGVvL3ZpZGVvLm8kOgorCQl8fCBtOmZzL2RldnB0cy9kZXZwdHMubyQ6CisJCXx8IG06ZnMvZXhwb3J0ZnMvZXhwb3J0ZnMubyQ6CisJCXx8IG06ZnMvaHVnZXRsYmZzL2h1Z2V0bGJmcy5vJDoKKwkJfHwgbTpmcy9tc2Rvcy9tc2Rvcy5vJDoKKwkJfHwgbTpmcy9ubHMvbmxzLm8kOgorCQl8fCBtOmZzL3JhbWZzL3JhbWZzLm8kOgorCQl8fCBtOmZzL3JvbWZzL3JvbWZzLm8kOgorCQl8fCBtOmZzL3ZmYXQvdmZhdC5vJDoKKwkJfHwgbTppbml0L21vdW50cy5vJDoKKwkJfHwgbTpebW9kdWxlcy86CisJCXx8IG06bmV0L25ldGxpbmsvbmV0bGluay5vJDoKKwkJfHwgbTpuZXQvc2NoZWQvc2NoZWQubyQ6CisJCXx8IG06L3BpZ2d5Lm8kOgorCQl8fCBtOl5zY3JpcHRzLzoKKwkJfHwgbTpzb3VuZC8uKi9zbmQtOgorCQl8fCBtOl4uKi9cLnRtcF86CisJCXx8IG06XlwudG1wXzoKKwkJfHwgbTovdm1saW51eC1vYmoubyQ6CisJCSkKKwkpIHsKKwkJZG9fbm0oJGJhc2VuYW1lLCAkXyk7CisJfQorCSRfID0gJGJhc2VuYW1lOwkJIyBGaWxlOjpGaW5kIGV4cGVjdHMgJF8gdW50b3VjaGVkICh1bmRvY3VtZW50ZWQpCit9CisKK3N1YiBkb19ubQoreworCW15ICgkYmFzZW5hbWUsICRmdWxsbmFtZSkgPSBAXzsKKwlteSAoJHNvdXJjZSwgJHR5cGUsICRuYW1lKTsKKwlpZiAoISAtZSAkYmFzZW5hbWUpIHsKKwkJcHJpbnRmIFNUREVSUiAiJGJhc2VuYW1lIGRvZXMgbm90IGV4aXN0XG4iOworCQlyZXR1cm47CisJfQorCWlmICgkZnVsbG5hbWUgIX4gL1wubyQvKSB7CisJCXByaW50ZiBTVERFUlIgIiRmdWxsbmFtZSBpcyBub3QgYW4gb2JqZWN0IGZpbGVcbiI7CisJCXJldHVybjsKKwl9CisJKCRzb3VyY2UgPSAkZnVsbG5hbWUpID1+IHMvXC5vJC8vOworCWlmICgtZSAiJG9ianRyZWUkc291cmNlLmMiIHx8IC1lICIkb2JqdHJlZSRzb3VyY2UuUyIpIHsKKwkJJHNvdXJjZSA9ICIkb2JqdHJlZSRzb3VyY2UiOworCX0gZWxzZSB7CisJCSRzb3VyY2UgPSAiJHNyY3RyZWUkc291cmNlIjsKKwl9CisJaWYgKCEgLWUgIiRzb3VyY2UuYyIgJiYgISAtZSAiJHNvdXJjZS5TIikgeworCQkjIE5vIG9idmlvdXMgc291cmNlLCBleGNsdWRlIHRoZSBvYmplY3QgaWYgaXQgaXMgY29uZ2xvbWVyYXRlCisJCWlmICghIG9wZW4oT0JKRFVNUERBVEEsICIkb2JqZHVtcCAkYmFzZW5hbWV8IikpIHsKKwkJCXByaW50ZiBTVERFUlIgIiRvYmpkdW1wICRmdWxsbmFtZSBmYWlsZWQgJCFcbiI7CisJCQlyZXR1cm47CisJCX0KKwkJbXkgJGNvbW1lbnQ7CisJCXdoaWxlICg8T0JKRFVNUERBVEE+KSB7CisJCQljaG9tcCgpOworCQkJaWYgKC9eSW4gYXJjaGl2ZS8pIHsKKwkJCQkjIEFyY2hpdmVzIGFyZSBhbHdheXMgY29uZ2xvbWVyYXRlCisJCQkJJGNvbW1lbnQgPSAiR0NDOkdDQzoiOworCQkJCWxhc3Q7CisJCQl9CisJCQluZXh0IGlmICghIC9eWyAwLTlhLWZdezUsfSAvKTsKKwkJCSRjb21tZW50IC49IHN1YnN0cigkXywgNDMpOworCQl9CisJCWNsb3NlKE9CSkRVTVBEQVRBKTsKKwkJaWYgKCFkZWZpbmVkKCRjb21tZW50KSB8fCAkY29tbWVudCAhfiAvR0NDXDouKkdDQ1w6L20pIHsKKwkJCXByaW50ZiBTVERFUlIgIk5vIHNvdXJjZSBmaWxlIGZvdW5kIGZvciAkZnVsbG5hbWVcbiI7CisJCX0KKwkJcmV0dXJuOworCX0KKwlpZiAoISBvcGVuKE5NREFUQSwgIiRubSAkYmFzZW5hbWV8IikpIHsKKwkJcHJpbnRmIFNUREVSUiAiJG5tICRmdWxsbmFtZSBmYWlsZWQgJCFcbiI7CisJCXJldHVybjsKKwl9CisJbXkgQG5tZGF0YTsKKwl3aGlsZSAoPE5NREFUQT4pIHsKKwkJY2hvcDsKKwkJKCR0eXBlLCAkbmFtZSkgPSAoc3BsaXQoLyArLywgJF8sIDMpKVsxLi4yXTsKKwkJIyBFeHBlY3RlZCB0eXBlcworCQkjIEEgYWJzb2x1dGUgc3ltYm9sCisJCSMgQiB3ZWFrIGV4dGVybmFsIHJlZmVyZW5jZSB0byBkYXRhIHRoYXQgaGFzIGJlZW4gcmVzb2x2ZWQKKwkJIyBDIGdsb2JhbCB2YXJpYWJsZSwgdW5pbml0aWFsaXNlZAorCQkjIEQgZ2xvYmFsIHZhcmlhYmxlLCBpbml0aWFsaXNlZAorCQkjIEcgZ2xvYmFsIHZhcmlhYmxlLCBpbml0aWFsaXNlZCwgc21hbGwgZGF0YSBzZWN0aW9uCisJCSMgUiBnbG9iYWwgYXJyYXksIGluaXRpYWxpc2VkCisJCSMgUyBnbG9iYWwgdmFyaWFibGUsIHVuaW5pdGlhbGlzZWQsIHNtYWxsIGJzcworCQkjIFQgZ2xvYmFsIGxhYmVsL3Byb2NlZHVyZQorCQkjIFUgZXh0ZXJuYWwgcmVmZXJlbmNlCisJCSMgVyB3ZWFrIGV4dGVybmFsIHJlZmVyZW5jZSB0byB0ZXh0IHRoYXQgaGFzIGJlZW4gcmVzb2x2ZWQKKwkJIyBhIGFzc2VtYmxlciBlcXVhdGUKKwkJIyBiIHN0YXRpYyB2YXJpYWJsZSwgdW5pbml0aWFsaXNlZAorCQkjIGQgc3RhdGljIHZhcmlhYmxlLCBpbml0aWFsaXNlZAorCQkjIGcgc3RhdGljIHZhcmlhYmxlLCBpbml0aWFsaXNlZCwgc21hbGwgZGF0YSBzZWN0aW9uCisJCSMgciBzdGF0aWMgYXJyYXksIGluaXRpYWxpc2VkCisJCSMgcyBzdGF0aWMgdmFyaWFibGUsIHVuaW5pdGlhbGlzZWQsIHNtYWxsIGJzcworCQkjIHQgc3RhdGljIGxhYmVsL3Byb2NlZHVyZXMKKwkJIyB3IHdlYWsgZXh0ZXJuYWwgcmVmZXJlbmNlIHRvIHRleHQgdGhhdCBoYXMgbm90IGJlZW4gcmVzb2x2ZWQKKwkJIyA/IHVuZGVmaW5lZCB0eXBlLCB1c2VkIGEgbG90IGJ5IG1vZHVsZXMKKwkJaWYgKCR0eXBlICF+IC9eW0FCQ0RHUlNUVVdhYmRncnN0dz9dJC8pIHsKKwkJCXByaW50ZiBTVERFUlIgIm5tIG91dHB1dCBmb3IgJGZ1bGxuYW1lIGNvbnRhaW5zIHVua25vd24gdHlwZSAnJF8nXG4iOworCQl9CisJCWVsc2lmICgkbmFtZSA9fiAvXC4vKSB7CisJCQkjIG5hbWUgd2l0aCAnLicgaXMgbG9jYWwgc3RhdGljCisJCX0KKwkJZWxzZSB7CisJCQkkdHlwZSA9ICdSJyBpZiAoJHR5cGUgZXEgJz8nKTsJIyBiaW51dGlscyByZXBsYWNlZCA/IHdpdGggUiBhdCBvbmUgcG9pbnQKKwkJCSMgYmludXRpbHMga2VlcHMgY2hhbmdpbmcgdGhlIHR5cGUgZm9yIGV4cG9ydGVkIHN5bWJvbHMsIGZvcmNlIGl0IHRvIFIKKwkJCSR0eXBlID0gJ1InIGlmICgkbmFtZSA9fiAvXl9fa3N5bXRhYi8gfHwgJG5hbWUgPX4gL15fX2tzdHJ0YWIvKTsKKwkJCSRuYW1lID1+IHMvX1JbYS1mMC05XXs4fSQvLzsJIyBtb2R1bGUgdmVyc2lvbnMgYWRkcyB0aGlzCisJCQlpZiAoJHR5cGUgPX4gL1tBQkNER1JTVFddLyAmJgorCQkJCSRuYW1lIG5lICdpbml0X21vZHVsZScgJiYKKwkJCQkkbmFtZSBuZSAnY2xlYW51cF9tb2R1bGUnICYmCisJCQkJJG5hbWUgbmUgJ1VzaW5nX1ZlcnNpb25zJyAmJgorCQkJCSRuYW1lICF+IC9eVmVyc2lvbl9bMC05XSskLyAmJgorCQkJCSRuYW1lICF+IC9eX19wYXJtXy8gJiYKKwkJCQkkbmFtZSAhfiAvXl9fa3N0cnRhYi8gJiYKKwkJCQkkbmFtZSAhfiAvXl9fa3N5bXRhYi8gJiYKKwkJCQkkbmFtZSAhfiAvXl9fa2NyY3RhYl8vICYmCisJCQkJJG5hbWUgIX4gL15fX2V4aXRjYWxsXy8gJiYKKwkJCQkkbmFtZSAhfiAvXl9faW5pdGNhbGxfLyAmJgorCQkJCSRuYW1lICF+IC9eX19rZGJfaW5pdGNhbGxfLyAmJgorCQkJCSRuYW1lICF+IC9eX19rZGJfZXhpdGNhbGxfLyAmJgorCQkJCSRuYW1lICF+IC9eX19tb2R1bGVfLyAmJgorCQkJCSRuYW1lICF+IC9eX19tb2RfLyAmJgorCQkJCSRuYW1lICF+IC9eX19jcmNfLyAmJgorCQkJCSRuYW1lIG5lICdfX3RoaXNfbW9kdWxlJyAmJgorCQkJCSRuYW1lIG5lICdrZXJuZWxfdmVyc2lvbicpIHsKKwkJCQlpZiAoIWV4aXN0cygkZGVmeyRuYW1lfSkpIHsKKwkJCQkJJGRlZnskbmFtZX0gPSBbXTsKKwkJCQl9CisJCQkJcHVzaChAeyRkZWZ7JG5hbWV9fSwgJGZ1bGxuYW1lKTsKKwkJCX0KKwkJCXB1c2goQG5tZGF0YSwgIiR0eXBlICRuYW1lIik7CisJCQlpZiAoJG5hbWUgPX4gL15fX2tzeW10YWJfLykgeworCQkJCSRuYW1lID0gc3Vic3RyKCRuYW1lLCAxMCk7CisJCQkJaWYgKCFleGlzdHMoJGtzeW10YWJ7JG5hbWV9KSkgeworCQkJCQkka3N5bXRhYnskbmFtZX0gPSBbXTsKKwkJCQl9CisJCQkJcHVzaChAeyRrc3ltdGFieyRuYW1lfX0sICRmdWxsbmFtZSk7CisJCQl9CisJCX0KKwl9CisJY2xvc2UoTk1EQVRBKTsKKwlpZiAoJCNubWRhdGEgPCAwKSB7CisJCWlmICgKKwkJCSRmdWxsbmFtZSBuZSAibGliL2JybG9jay5vIgorCQkJJiYgJGZ1bGxuYW1lIG5lICJsaWIvZGVjX2FuZF9sb2NrLm8iCisJCQkmJiAkZnVsbG5hbWUgbmUgImZzL3hmcy94ZnNfbWFjcm9zLm8iCisJCQkmJiAkZnVsbG5hbWUgbmUgImRyaXZlcnMvaWRlL2lkZS1wcm9iZS1taW5pLm8iCisJCQkmJiAkZnVsbG5hbWUgbmUgInVzci9pbml0cmFtZnNfZGF0YS5vIgorCQkJJiYgJGZ1bGxuYW1lIG5lICJkcml2ZXJzL2FjcGkvZXhlY3V0ZXIvZXhkdW1wLm8iCisJCQkmJiAkZnVsbG5hbWUgbmUgImRyaXZlcnMvYWNwaS9yZXNvdXJjZXMvcnNkdW1wLm8iCisJCQkmJiAkZnVsbG5hbWUgbmUgImRyaXZlcnMvYWNwaS9uYW1lc3BhY2UvbnNkdW1wZHYubyIKKwkJCSYmICRmdWxsbmFtZSBuZSAiZHJpdmVycy9hY3BpL25hbWVzcGFjZS9uc2R1bXAubyIKKwkJCSYmICRmdWxsbmFtZSBuZSAiYXJjaC9pYTY0L3NuL2tlcm5lbC9zbjIvaW8ubyIKKwkJCSYmICRmdWxsbmFtZSBuZSAiYXJjaC9pYTY0L2tlcm5lbC9nYXRlLWRhdGEubyIKKwkJCSYmICRmdWxsbmFtZSBuZSAiZHJpdmVycy9pZWVlMTM5NC9vdWkubyIKKwkJCSYmICRmdWxsbmFtZSBuZSAic2VjdXJpdHkvY2FwYWJpbGl0eS5vIgorCQkJJiYgJGZ1bGxuYW1lIG5lICJzb3VuZC9jb3JlL3dyYXBwZXJzLm8iCisJCQkmJiAkZnVsbG5hbWUgbmUgImZzL250ZnMvc3lzY3RsLm8iCisJCQkmJiAkZnVsbG5hbWUgbmUgImZzL2pmcy9qZnNfZGVidWcubyIKKwkJKSB7CisJCQlwcmludGYgIk5vIG5tIGRhdGEgZm9yICRmdWxsbmFtZVxuIjsKKwkJfQorCQlyZXR1cm47CisJfQorCSRubWRhdGF7JGZ1bGxuYW1lfSA9IFxAbm1kYXRhOworfQorCitzdWIgZHJvcF9kZWYKK3sKKwlteSAoJG9iamVjdCwgJG5hbWUpID0gQF87CisJbXkgJG5tZGF0YSA9ICRubWRhdGF7JG9iamVjdH07CisJbXkgKCRpLCAkaik7CisJZm9yICgkaSA9IDA7ICRpIDw9ICQjeyRubWRhdGF9OyArKyRpKSB7CisJCWlmICgkbmFtZSBlcSAoc3BsaXQoJyAnLCAkbm1kYXRhLT5bJGldLCAyKSlbMV0pIHsKKwkJCXNwbGljZShAeyRubWRhdGF7JG9iamVjdH19LCAkaSwgMSk7CisJCQlteSAkZGVmID0gJGRlZnskbmFtZX07CisJCQlmb3IgKCRqID0gMDsgJGogPCAkI3skZGVmeyRuYW1lfX07ICsrJGopIHsKKwkJCQlpZiAoJGRlZnskbmFtZX1bJGpdIGVxICRvYmplY3QpIHsKKwkJCQkJc3BsaWNlKEB7JGRlZnskbmFtZX19LCAkaiwgMSk7CisJCQkJfQorCQkJfQorCQkJbGFzdDsKKwkJfQorCX0KK30KKworc3ViIGxpc3RfbXVsdGlwbHlfZGVmaW5lZAoreworCW15ICgkbmFtZSwgJG1vZHVsZSk7CisJZm9yZWFjaCAkbmFtZSAoa2V5cyglZGVmKSkgeworCQlpZiAoJCN7JGRlZnskbmFtZX19ID4gMCkgeworCQkJIyBTcGVjaWFsIGNhc2UgZm9yIGNvbmRfc3lzY2FsbAorCQkJaWYgKCQjeyRkZWZ7JG5hbWV9fSA9PSAxICYmICRuYW1lID1+IC9ec3lzXy8gJiYKKwkJCSAgICAoJGRlZnskbmFtZX1bMF0gZXEgImtlcm5lbC9zeXMubyIgfHwKKwkJCSAgICAgJGRlZnskbmFtZX1bMV0gZXEgImtlcm5lbC9zeXMubyIpKSB7CisJCQkJJmRyb3BfZGVmKCJrZXJuZWwvc3lzLm8iLCAkbmFtZSk7CisJCQkJbmV4dDsKKwkJCX0KKwkJCSMgU3BlY2lhbCBjYXNlIGZvciBpMzg2IGVudHJ5IGNvZGUKKwkJCWlmICgkI3skZGVmeyRuYW1lfX0gPT0gMSAmJiAkbmFtZSA9fiAvXl9fa2VybmVsXy8gJiYKKwkJCSAgICAkZGVmeyRuYW1lfVswXSBlcSAiYXJjaC9pMzg2L2tlcm5lbC92c3lzY2FsbC1pbnQ4MC5vIiAmJgorCQkJICAgICRkZWZ7JG5hbWV9WzFdIGVxICJhcmNoL2kzODYva2VybmVsL3ZzeXNjYWxsLXN5c2VudGVyLm8iKSB7CisJCQkJJmRyb3BfZGVmKCJhcmNoL2kzODYva2VybmVsL3ZzeXNjYWxsLXN5c2VudGVyLm8iLCAkbmFtZSk7CisJCQkJbmV4dDsKKwkJCX0KKwkJCXByaW50ZiAiJG5hbWUgaXMgbXVsdGlwbHkgZGVmaW5lZCBpbiA6LVxuIjsKKwkJCWZvcmVhY2ggJG1vZHVsZSAoQHskZGVmeyRuYW1lfX0pIHsKKwkJCQlwcmludGYgIlx0JG1vZHVsZVxuIjsKKwkJCX0KKwkJfQorCX0KK30KKworc3ViIHJlc29sdmVfZXh0ZXJuYWxfcmVmZXJlbmNlcworeworCW15ICgkb2JqZWN0LCAkdHlwZSwgJG5hbWUsICRpLCAkaiwgJGtzdHJ0YWIsICRrc3ltdGFiLCAkZXhwb3J0KTsKKwlwcmludGYgIlxuIjsKKwlmb3JlYWNoICRvYmplY3QgKGtleXMoJW5tZGF0YSkpIHsKKwkJbXkgJG5tZGF0YSA9ICRubWRhdGF7JG9iamVjdH07CisJCWZvciAoJGkgPSAwOyAkaSA8PSAkI3skbm1kYXRhfTsgKyskaSkgeworCQkJKCR0eXBlLCAkbmFtZSkgPSBzcGxpdCgnICcsICRubWRhdGEtPlskaV0sIDIpOworCQkJaWYgKCR0eXBlIGVxICJVIiB8fCAkdHlwZSBlcSAidyIpIHsKKwkJCQlpZiAoZXhpc3RzKCRkZWZ7JG5hbWV9KSB8fCBleGlzdHMoJGtzeW10YWJ7JG5hbWV9KSkgeworCQkJCQkjIGFkZCB0aGUgb3duaW5nIG9iamVjdCB0byB0aGUgbm1kYXRhCisJCQkJCSRubWRhdGEtPlskaV0gPSAiJHR5cGUgJG5hbWUgJG9iamVjdCI7CisJCQkJCSMgb25seSBjb3VudCBhcyBhIHJlZmVyZW5jZSBpZiBpdCBpcyBub3QgRVhQT1JUXy4uLgorCQkJCQkka3N0cnRhYiA9ICJSIF9fa3N0cnRhYl8kbmFtZSI7CisJCQkJCSRrc3ltdGFiID0gIlIgX19rc3ltdGFiXyRuYW1lIjsKKwkJCQkJJGV4cG9ydCA9IDA7CisJCQkJCWZvciAoJGogPSAwOyAkaiA8PSAkI3skbm1kYXRhfTsgKyskaikgeworCQkJCQkJaWYgKCRubWRhdGEtPlskal0gZXEgJGtzdHJ0YWIgfHwKKwkJCQkJCSAgICAkbm1kYXRhLT5bJGpdIGVxICRrc3ltdGFiKSB7CisJCQkJCQkJJGV4cG9ydCA9IDE7CisJCQkJCQkJbGFzdDsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlpZiAoJGV4cG9ydCkgeworCQkJCQkJJGV4cG9ydHskbmFtZX0gPSAiIjsKKwkJCQkJfQorCQkJCQllbHNlIHsKKwkJCQkJCSRyZWZ7JG5hbWV9ID0gIiIKKwkJCQkJfQorCQkJCX0KKwkJCQllbHNpZiAoICAgICRuYW1lIG5lICJtb2RfdXNlX2NvdW50XyIKKwkJCQkJJiYgJG5hbWUgbmUgIl9faW5pdHJhbWZzX2VuZCIKKwkJCQkJJiYgJG5hbWUgbmUgIl9faW5pdHJhbWZzX3N0YXJ0IgorCQkJCQkmJiAkbmFtZSBuZSAiX2Vpbml0dGV4dCIKKwkJCQkJJiYgJG5hbWUgbmUgIl9zaW5pdHRleHQiCisJCQkJCSYmICRuYW1lIG5lICJrYWxsc3ltc19uYW1lcyIKKwkJCQkJJiYgJG5hbWUgbmUgImthbGxzeW1zX251bV9zeW1zIgorCQkJCQkmJiAkbmFtZSBuZSAia2FsbHN5bXNfYWRkcmVzc2VzIgorCQkJCQkmJiAkbmFtZSBuZSAiX190aGlzX21vZHVsZSIKKwkJCQkJJiYgJG5hbWUgbmUgIl9ldGV4dCIKKwkJCQkJJiYgJG5hbWUgbmUgIl9lZGF0YSIKKwkJCQkJJiYgJG5hbWUgbmUgIl9lbmQiCisJCQkJCSYmICRuYW1lIG5lICJfX2Jzc19zdGFydCIKKwkJCQkJJiYgJG5hbWUgbmUgIl90ZXh0IgorCQkJCQkmJiAkbmFtZSBuZSAiX3N0ZXh0IgorCQkJCQkmJiAkbmFtZSBuZSAiX19ncCIKKwkJCQkJJiYgJG5hbWUgbmUgImlhNjRfdW53X3N0YXJ0IgorCQkJCQkmJiAkbmFtZSBuZSAiaWE2NF91bndfZW5kIgorCQkJCQkmJiAkbmFtZSBuZSAiX19pbml0X2JlZ2luIgorCQkJCQkmJiAkbmFtZSBuZSAiX19pbml0X2VuZCIKKwkJCQkJJiYgJG5hbWUgbmUgIl9fYnNzX3N0b3AiCisJCQkJCSYmICRuYW1lIG5lICJfX25vc2F2ZV9iZWdpbiIKKwkJCQkJJiYgJG5hbWUgbmUgIl9fbm9zYXZlX2VuZCIKKwkJCQkJJiYgJG5hbWUgbmUgInBnMCIKKwkJCQkJJiYgJG5hbWUgbmUgIl9fbW9kdWxlX3RleHRfYWRkcmVzcyIKKwkJCQkJJiYgJG5hbWUgIX4gL15fX3NjaGVkX3RleHRfLworCQkJCQkmJiAkbmFtZSAhfiAvXl9fc3RhcnRfLworCQkJCQkmJiAkbmFtZSAhfiAvXl9fZW5kXy8KKwkJCQkJJiYgJG5hbWUgIX4gL15fX3N0b3BfLworCQkJCQkmJiAkbmFtZSAhfiAvXl9fc2NoZWR1bGluZ19mdW5jdGlvbnNfLipfaGVyZS8KKwkJCQkJJiYgJG5hbWUgIX4gL15fXy4qaW5pdGNhbGxfLworCQkJCQkmJiAkbmFtZSAhfiAvXl9fLipwZXJfY3B1X3N0YXJ0LworCQkJCQkmJiAkbmFtZSAhfiAvXl9fLipwZXJfY3B1X2VuZC8KKwkJCQkJJiYgJG5hbWUgIX4gL15fX2FsdF9pbnN0cnVjdGlvbnMvCisJCQkJCSYmICRuYW1lICF+IC9eX19zZXR1cF8vCisJCQkJCSYmICRuYW1lICF+IC9eamlmZmllcy8KKwkJCQkJJiYgJG5hbWUgIX4gL15fX21vZF90aW1lci8KKwkJCQkJJiYgJG5hbWUgIX4gL15fX21vZF9wYWdlX3N0YXRlLworCQkJCQkmJiAkbmFtZSAhfiAvXmluaXRfbW9kdWxlLworCQkJCQkmJiAkbmFtZSAhfiAvXmNsZWFudXBfbW9kdWxlLworCQkJCSkgeworCQkJCQlwcmludGYgIkNhbm5vdCByZXNvbHZlICI7CisJCQkJCXByaW50ZiAid2VhayAiIGlmICgkdHlwZSBlcSAidyIpOworCQkJCQlwcmludGYgInJlZmVyZW5jZSB0byAkbmFtZSBmcm9tICRvYmplY3RcbiI7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCitzdWIgbGlzdF9leHRyYV9leHRlcm5hbHMKK3sKKwlteSAlbm9yZWYgPSAoKTsKKwlteSAoJG5hbWUsIEBtb2R1bGUsICRtb2R1bGUsICRleHBvcnQpOworCWZvcmVhY2ggJG5hbWUgKGtleXMoJWRlZikpIHsKKwkJaWYgKCEgZXhpc3RzKCRyZWZ7JG5hbWV9KSkgeworCQkJQG1vZHVsZSA9IEB7JGRlZnskbmFtZX19OworCQkJZm9yZWFjaCAkbW9kdWxlIChAbW9kdWxlKSB7CisJCQkJaWYgKCEgZXhpc3RzKCRub3JlZnskbW9kdWxlfSkpIHsKKwkJCQkJJG5vcmVmeyRtb2R1bGV9ID0gW107CisJCQkJfQorCQkJCXB1c2goQHskbm9yZWZ7JG1vZHVsZX19LCAkbmFtZSk7CisJCQl9CisJCX0KKwl9CisJaWYgKCVub3JlZikgeworCQlwcmludGYgIlxuRXh0ZXJuYWxseSBkZWZpbmVkIHN5bWJvbHMgd2l0aCBubyBleHRlcm5hbCByZWZlcmVuY2VzXG4iOworCQlmb3JlYWNoICRtb2R1bGUgKHNvcnQoa2V5cyglbm9yZWYpKSkgeworCQkJcHJpbnRmICIgICRtb2R1bGVcbiI7CisJCQlmb3JlYWNoIChzb3J0KEB7JG5vcmVmeyRtb2R1bGV9fSkpIHsKKwkJCQlpZiAoZXhpc3RzKCRleHBvcnR7JF99KSkgeworCQkJCQkkZXhwb3J0ID0gIiAoZXhwb3J0IG9ubHkpIjsKKwkJCQl9CisJCQkJZWxzZSB7CisJCQkJCSRleHBvcnQgPSAiIjsKKwkJCQl9CisJCQkJcHJpbnRmICIgICAgJF8kZXhwb3J0XG4iOworCQkJfQorCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9wYWNrYWdlL01ha2VmaWxlIGIvc2NyaXB0cy9wYWNrYWdlL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiMWYyZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL3BhY2thZ2UvTWFrZWZpbGUKQEAgLTAsMCArMSw4OSBAQAorIyBNYWtlZmlsZSBmb3IgdGhlIGRpZmZlcmVudCB0YXJnZXRzIHVzZWQgdG8gZ2VuZXJhdGUgZnVsbCBwYWNrYWdlcyBvZiBhIGtlcm5lbAorIyBJdCB1c2VzIHRoZSBnZW5lcmljIGNsZWFuIGluZnJhc3RydWN0dXJlIG9mIGtidWlsZAorCisjIElnbm9yZSB0aGUgZm9sbG93aW5nIGZpbGVzL2RpcmVjdG9yaWVzIGR1cmluZyB0YXIgb3BlcmF0aW9uCitUQVJfSUdOT1JFIDo9IC0tZXhjbHVkZSBTQ0NTIC0tZXhjbHVkZSBCaXRLZWVwZXIgLS1leGNsdWRlIC5zdm4gLS1leGNsdWRlIENWUworCisKKyMgUlBNIHRhcmdldAorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgVGhlIHJwbSB0YXJnZXQgZ2VuZXJhdGVzIHR3byBycG0gZmlsZXM6CisjIC91c3Ivc3JjL3BhY2thZ2VzL1NSUE1TL2tlcm5lbC0yLjYuN3JjMi0xLnNyYy5ycG0KKyMgL3Vzci9zcmMvcGFja2FnZXMvUlBNUy9pMzg2L2tlcm5lbC0yLjYuN3JjMi0xLjxhcmNoPi5ycG0KKyMgVGhlIHNyYy5ycG0gZmlsZXMgaW5jbHVkZXMgYWxsIHNvdXJjZSBmb3IgdGhlIGtlcm5lbCBiZWluZyBidWlsdAorIyBUaGUgPGFyY2g+LnJwbSBpbmNsdWRlcyBrZXJuZWwgY29uZmlndXJhdGlvbiwgbW9kdWxlcyBldGMuCisjCisjIFByb2Nlc3MgdG8gY3JlYXRlIHRoZSBycG0gZmlsZXMKKyMgYSkgY2xlYW4gdGhlIGtlcm5lbAorIyBiKSBHZW5lcmF0ZSAuc3BlYyBmaWxlCisjIGMpIEJ1aWxkIGEgdGFyIGJhbGwsIHVzaW5nIHN5bWxpbmsgdG8gbWFrZSBrZXJuZWwgdmVyc2lvbgorIyAgICBmaXJzdCBlbnRyeSBpbiB0aGUgcGF0aAorIyBkKSBhbmQgcGFjayB0aGUgcmVzdWx0IHRvIGEgdGFyLmd6IGZpbGUKKyMgZSkgZ2VuZXJhdGUgdGhlIHJwbSBmaWxlcywgYmFzZWQgb24ga2VybmVsLnNwZWMKKyMgLSBVc2UgLy4gdG8gYXZvaWQgdGFyIHBhY2tpbmcganVzdCB0aGUgc3ltbGluaworCisjIERvIHdlIGhhdmUgcnBtYnVpbGQsIG90aGVyd2lzZSBmYWxsIGJhY2sgdG8gdGhlIG9sZGVyIHJwbQorUlBNIDo9ICQoc2hlbGwgaWYgWyAteCAiL3Vzci9iaW4vcnBtYnVpbGQiIF07IHRoZW4gZWNobyBycG1idWlsZDsgXAorCSAgICAgICAgICAgZWxzZSBlY2hvIHJwbTsgZmkpCisKKyMgUmVtb3ZlIGh5cGhlbnMgc2luY2UgdGhleSBoYXZlIHNwZWNpYWwgbWVhbmluZyBpbiBSUE0gZmlsZW5hbWVzCitLRVJORUxQQVRIIDo9IGtlcm5lbC0kKHN1YnN0IC0sLCQoS0VSTkVMUkVMRUFTRSkpCitNS1NQRUMgICAgIDo9ICQoc3JjdHJlZSkvc2NyaXB0cy9wYWNrYWdlL21rc3BlYworUFJFViAgICAgICA6PSBzZXQgLWU7IGNkIC4uOworCisjIHJwbS1wa2cKKy5QSE9OWTogcnBtLXBrZyBycG0KKworJChvYmp0cmVlKS9rZXJuZWwuc3BlYzogJChNS1NQRUMpICQoc3JjdHJlZSkvTWFrZWZpbGUKKwkkKENPTkZJR19TSEVMTCkgJChNS1NQRUMpID4gJEAKKworcnBtLXBrZyBycG06ICQob2JqdHJlZSkva2VybmVsLnNwZWMKKwkkKE1BS0UpIGNsZWFuCisJJChQUkVWKSBsbiAtc2YgJChzcmN0cmVlKSAkKEtFUk5FTFBBVEgpCisJJChQUkVWKSB0YXIgLWN6ICQoUkNTX1RBUl9JR05PUkUpIC1mICQoS0VSTkVMUEFUSCkudGFyLmd6ICQoS0VSTkVMUEFUSCkvLgorCSQoUFJFVikgcm0gJChLRVJORUxQQVRIKQorCisJc2V0IC1lOyBcCisJJChDT05GSUdfU0hFTEwpICQoc3JjdHJlZSkvc2NyaXB0cy9ta3ZlcnNpb24gPiAkKG9ianRyZWUpLy50bXBfdmVyc2lvbgorCXNldCAtZTsgXAorCW12IC1mICQob2JqdHJlZSkvLnRtcF92ZXJzaW9uICQob2JqdHJlZSkvLnZlcnNpb24KKworCSQoUlBNKSAtLXRhcmdldCAkKFVUU19NQUNISU5FKSAtdGEgLi4vJChLRVJORUxQQVRIKS50YXIuZ3oKKwlybSAuLi8kKEtFUk5FTFBBVEgpLnRhci5negorCitjbGVhbi1maWxlcyA6PSAkKG9ianRyZWUpL2tlcm5lbC5zcGVjCisKKyMgYmlucnBtLXBrZworLlBIT05ZOiBiaW5ycG0tcGtnCiskKG9ianRyZWUpL2Jpbmtlcm5lbC5zcGVjOiAkKE1LU1BFQykgJChzcmN0cmVlKS9NYWtlZmlsZQorCSQoQ09ORklHX1NIRUxMKSAkKE1LU1BFQykgcHJlYnVpbHQgPiAkQAorCQorYmlucnBtLXBrZzogJChvYmp0cmVlKS9iaW5rZXJuZWwuc3BlYworCSQoTUFLRSkKKwlzZXQgLWU7IFwKKwkkKENPTkZJR19TSEVMTCkgJChzcmN0cmVlKS9zY3JpcHRzL21rdmVyc2lvbiA+ICQob2JqdHJlZSkvLnRtcF92ZXJzaW9uCisJc2V0IC1lOyBcCisJbXYgLWYgJChvYmp0cmVlKS8udG1wX3ZlcnNpb24gJChvYmp0cmVlKS8udmVyc2lvbgorCisJJChSUE0pIC0tZGVmaW5lICJfYnVpbGRkaXIgJChzcmN0cmVlKSIgLS10YXJnZXQgJChVVFNfTUFDSElORSkgLWJiICQ8CisKK2NsZWFuLWZpbGVzICs9ICQob2JqdHJlZSkvYmlua2VybmVsLnNwZWMKKworIyBEZWIgdGFyZ2V0CisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIworLlBIT05ZOiBkZWItcGtnCitkZWItcGtnOgorCSQoTUFLRSkKKwkkKENPTkZJR19TSEVMTCkgJChzcmN0cmVlKS9zY3JpcHRzL3BhY2thZ2UvYnVpbGRkZWIKKworY2xlYW4tZGlycyArPSAkKG9ianRyZWUpL2RlYmlhbi8KKworCisjIEhlbHAgdGV4dCBkaXNwbGF5ZWQgd2hlbiBleGVjdXRpbmcgJ21ha2UgaGVscCcKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitoZWxwOgorCUBlY2hvICAnICBycG0tcGtnICAgICAgICAgLSBCdWlsZCB0aGUga2VybmVsIGFzIGFuIFJQTSBwYWNrYWdlJworCUBlY2hvICAnICBiaW5ycG0tcGtnICAgICAgLSBCdWlsZCBhbiBycG0gcGFja2FnZSBjb250YWluaW5nIHRoZSBjb21waWxlZCBrZXJuZWwgJiBtb2R1bGVzJworCUBlY2hvICAnICBkZWItcGtnICAgICAgICAgLSBCdWlsZCB0aGUga2VybmVsIGFzIGFuIGRlYiBwYWNrYWdlJworCmRpZmYgLS1naXQgYS9zY3JpcHRzL3BhY2thZ2UvYnVpbGRkZWIgYi9zY3JpcHRzL3BhY2thZ2UvYnVpbGRkZWIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI3OWI2MwotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvcGFja2FnZS9idWlsZGRlYgpAQCAtMCwwICsxLDc5IEBACisjIS9iaW4vc2gKKyMKKyMgYnVpbGRkZWIgMS4yCisjIENvcHlyaWdodCAyMDAzIFdpY2hlcnQgQWtrZXJtYW4gPHdpY2hlcnRAd2lnZ3kubmV0PgorIworIyBTaW1wbGUgc2NyaXB0IHRvIGdlbmVyYXRlIGEgZGViIHBhY2thZ2UgZm9yIGEgTGludXgga2VybmVsLiBBbGwgdGhlCisjIGNvbXBsZXhpdHkgb2Ygd2hhdCB0byBkbyB3aXRoIGEga2VybmVsIGFmdGVyIGl0IGlzIGluc3RhbGxlciBvciByZW1vdmVkCisjIGlzIGxlZnQgdG8gb3RoZXIgc2NyaXB0cyBhbmQgcGFja2FnZXM6IHRoZXkgY2FuIGluc3RhbGwgc2NyaXB0cyBpbiB0aGUKKyMgL2V0Yy9rZXJuZWwve3ByZSxwb3N0fXtpbnN0LHJtfS5kLyBkaXJlY3RvcmllcyB0aGF0IHdpbGwgYmUgY2FsbGVkIG9uCisjIHBhY2thZ2UgaW5zdGFsbCBhbmQgcmVtb3ZhbC4KKworc2V0IC1lCisKKyMgU29tZSB2YXJpYWJsZXMgYW5kIHNldHRpbmdzIHVzZWQgdGhyb3VnaG91dCB0aGUgc2NyaXB0Cit2ZXJzaW9uPSRLRVJORUxSRUxFQVNFCit0bXBkaXI9IiRvYmp0cmVlL2RlYmlhbi90bXAiCisKKyMgU2V0dXAgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUKK3JtIC1yZiAiJHRtcGRpciIKK21rZGlyIC1wICIkdG1wZGlyL0RFQklBTiIgIiR0bXBkaXIvbGliIiAiJHRtcGRpci9ib290IgorCisjIEJ1aWxkIGFuZCBpbnN0YWxsIHRoZSBrZXJuZWwKK2NwIFN5c3RlbS5tYXAgIiR0bXBkaXIvYm9vdC9TeXN0ZW0ubWFwLSR2ZXJzaW9uIgorY3AgLmNvbmZpZyAiJHRtcGRpci9ib290L2NvbmZpZy0kdmVyc2lvbiIKK2NwICRLQlVJTERfSU1BR0UgIiR0bXBkaXIvYm9vdC92bWxpbnV6LSR2ZXJzaW9uIgorCitpZiBncmVwIC1xICdeQ09ORklHX01PRFVMRVM9eScgLmNvbmZpZyA7IHRoZW4KKwlJTlNUQUxMX01PRF9QQVRIPSIkdG1wZGlyIiBtYWtlIG1vZHVsZXNfaW5zdGFsbAorZmkKKworIyBJbnN0YWxsIHRoZSBtYWludGFpbmVyIHNjcmlwdHMKK2ZvciBzY3JpcHQgaW4gcG9zdGluc3QgcG9zdHJtIHByZWluc3QgcHJlcm0gOyBkbworCW1rZGlyIC1wICIkdG1wZGlyL2V0Yy9rZXJuZWwvJHNjcmlwdC5kIgorCWNhdCA8PEVPRiA+ICIkdG1wZGlyL0RFQklBTi8kc2NyaXB0IgorIyEvYmluL3NoCisKK3NldCAtZQorCit0ZXN0IC1kIC9ldGMva2VybmVsLyRzY3JpcHQuZCAmJiBydW4tcGFydHMgLS1hcmc9IiR2ZXJzaW9uIiAvZXRjL2tlcm5lbC8kc2NyaXB0LmQKK2V4aXQgMAorRU9GCisJY2htb2QgNzU1ICIkdG1wZGlyL0RFQklBTi8kc2NyaXB0IgorZG9uZQorCituYW1lPSJLZXJuZWwgQ29tcGlsZXIgPCQoaWQgLW51KUAkKGhvc3RuYW1lIC1mKT4iCisjIEdlbmVyYXRlIGEgc2ltcGxlIGNoYW5nZWxvZyB0ZW1wbGF0ZQorY2F0IDw8RU9GID4gZGViaWFuL2NoYW5nZWxvZworbGludXggKCR2ZXJzaW9uKSB1bnN0YWJsZTsgdXJnZW5jeT1sb3cKKworICAqIEEgc3RhbmRhcmQgcmVsZWFzZQorCisgLS0gJG5hbWUgICQoZGF0ZSAtUikKK0VPRgorCisjIEdlbmVyYXRlIGEgY29udHJvbCBmaWxlCitjYXQgPDxFT0YgPiBkZWJpYW4vY29udHJvbAorU291cmNlOiBsaW51eAorU2VjdGlvbjogYmFzZQorUHJpb3JpdHk6IG9wdGlvbmFsCitNYWludGFpbmVyOiAkbmFtZQorU3RhbmRhcmRzLVZlcnNpb246IDMuNi4xCisKK1BhY2thZ2U6IGxpbnV4LSR2ZXJzaW9uCitBcmNoaXRlY3R1cmU6IGFueQorRGVzY3JpcHRpb246IExpbnV4IGtlcm5lbCwgdmVyc2lvbiAkdmVyc2lvbgorIFRoaXMgcGFja2FnZSBjb250YWlucyB0aGUgTGludXgga2VybmVsLCBtb2R1bGVzIGFuZCBjb3JyZXNwb25kaW5nIG90aGVyCisgZmlsZXMgdmVyc2lvbiAkdmVyc2lvbi4KK0VPRgorCisjIEZpeCBzb21lIG93bmVyc2hpcCBhbmQgcGVybWlzc2lvbnMKK2Nob3duIC1SIHJvb3Q6cm9vdCAiJHRtcGRpciIKK2NobW9kIC1SIGdvLXcgIiR0bXBkaXIiCisKKyMgUGVyZm9ybSB0aGUgZmluYWwgbWFnaWMKK2Rwa2ctZ2VuY29udHJvbCAtaXNwCitkcGtnIC0tYnVpbGQgIiR0bXBkaXIiIC4uCisKK2V4aXQgMAorCmRpZmYgLS1naXQgYS9zY3JpcHRzL3BhY2thZ2UvbWtzcGVjIGIvc2NyaXB0cy9wYWNrYWdlL21rc3BlYwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZTdhNThmCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9wYWNrYWdlL21rc3BlYwpAQCAtMCwwICsxLDgyIEBACisjIS9iaW4vc2gKKyMKKyMJT3V0cHV0IGEgc2ltcGxlIFJQTSBzcGVjIGZpbGUgdGhhdCB1c2VzIG5vIGZhbmN5IGZlYXR1cmVzIHJlcXVyaW5nCisjCVJQTSB2NC4gVGhpcyBpcyBpbnRlbmRlZCB0byB3b3JrIHdpdGggYW55IFJQTSBkaXN0cm8uCisjCisjCVRoZSBvbmx5IGdvdGhpYyBiaXQgaGVyZSBpcyByZWRlZmluaW5nIGluc3RhbGxfcG9zdCB0byBhdm9pZAorIwlzdHJpcHBpbmcgdGhlIHN5bWJvbHMgZnJvbSBmaWxlcyBpbiB0aGUga2VybmVsIHdoaWNoIHdlIHdhbnQKKyMKKyMJUGF0Y2hlZCBmb3Igbm9uLXg4NiBieSBPcGVuY29uIChMKSAyMDAyIDxvcGVuY29uQHJpby5za3lkb21lLm5ldD4KKyMKKworIyBob3cgd2Ugd2VyZSBjYWxsZWQgZGV0ZXJtaW5lcyB3aGljaCBycG1zIHdlIGJ1aWxkIGFuZCBob3cgd2UgYnVpbGQgdGhlbQoraWYgWyAiJDEiID0gInByZWJ1aWx0IiBdOyB0aGVuCisJUFJFQlVJTFQ9dHJ1ZQorZWxzZQorCVBSRUJVSUxUPWZhbHNlCitmaQorCisjIHN0YXJ0aW5nIHRvIG91dHB1dCB0aGUgc3BlYworaWYgWyAiYGdyZXAgQ09ORklHX0RSTT15IC5jb25maWcgfCBjdXQgLWYyIC1kXD1gIiA9ICJ5IiBdOyB0aGVuCisJUFJPVklERVM9a2VybmVsLWRybQorZmkKKworUFJPVklERVM9IiRQUk9WSURFUyBrZXJuZWwtJEtFUk5FTFJFTEVBU0UiCitfX0tFUk5FTFJFTEVBU0U9YGVjaG8gJEtFUk5FTFJFTEVBU0UgfCBzZWQgLWUgInMvLS8vZyJgCisKK2VjaG8gIk5hbWU6IGtlcm5lbCIKK2VjaG8gIlN1bW1hcnk6IFRoZSBMaW51eCBLZXJuZWwiCitlY2hvICJWZXJzaW9uOiAkX19LRVJORUxSRUxFQVNFIgorIyB3ZSBuZWVkIHRvIGRldGVybWluZSB0aGUgTkVYVCB2ZXJzaW9uIG51bWJlciBzbyB0aGF0IHVuYW1lIGFuZAorIyBycG0gLXEgd2lsbCBhZ3JlZQorZWNobyAiUmVsZWFzZTogYC4gJHNyY3RyZWUvc2NyaXB0cy9ta3ZlcnNpb25gIgorZWNobyAiTGljZW5zZTogR1BMIgorZWNobyAiR3JvdXA6IFN5c3RlbSBFbnZpcm9ubWVudC9LZXJuZWwiCitlY2hvICJWZW5kb3I6IFRoZSBMaW51eCBDb21tdW5pdHkiCitlY2hvICJVUkw6IGh0dHA6Ly93d3cua2VybmVsLm9yZyIKKworaWYgISAkUFJFQlVJTFQ7IHRoZW4KK2VjaG8gIlNvdXJjZToga2VybmVsLSRfX0tFUk5FTFJFTEVBU0UudGFyLmd6IgorZmkKKworZWNobyAiQnVpbGRSb290OiAvdmFyL3RtcC8le25hbWV9LSV7UEFDS0FHRV9WRVJTSU9OfS1yb290IgorZWNobyAiUHJvdmlkZXM6ICRQUk9WSURFUyIKK2VjaG8gIiVkZWZpbmUgX19zcGVjX2luc3RhbGxfcG9zdCAvdXNyL2xpYi9ycG0vYnJwLWNvbXByZXNzIHx8IDoiCitlY2hvICIlZGVmaW5lIGRlYnVnX3BhY2thZ2UgJXtuaWx9IgorZWNobyAiIgorZWNobyAiJWRlc2NyaXB0aW9uIgorZWNobyAiVGhlIExpbnV4IEtlcm5lbCwgdGhlIG9wZXJhdGluZyBzeXN0ZW0gY29yZSBpdHNlbGYiCitlY2hvICIiCisKK2lmICEgJFBSRUJVSUxUOyB0aGVuCitlY2hvICIlcHJlcCIKK2VjaG8gIiVzZXR1cCAtcSIKK2VjaG8gIiIKK2ZpCisKK2VjaG8gIiVidWlsZCIKKworaWYgISAkUFJFQlVJTFQ7IHRoZW4KK2VjaG8gIm1ha2UgY2xlYW4gJiYgbWFrZSAle19zbXBfbWZsYWdzfSIKK2VjaG8gIiIKK2ZpCisKK2VjaG8gIiVpbnN0YWxsIgorZWNobyAnbWtkaXIgLXAgJFJQTV9CVUlMRF9ST09UL2Jvb3QgJFJQTV9CVUlMRF9ST09UL2xpYiAkUlBNX0JVSUxEX1JPT1QvbGliL21vZHVsZXMnCisKK2VjaG8gJ0lOU1RBTExfTU9EX1BBVEg9JFJQTV9CVUlMRF9ST09UIG1ha2UgJXtfc21wX21mbGFnc30gbW9kdWxlc19pbnN0YWxsJworZWNobyAnY3AgJEtCVUlMRF9JTUFHRSAkUlBNX0JVSUxEX1JPT1QnIi9ib290L3ZtbGludXotJEtFUk5FTFJFTEVBU0UiCisKK2VjaG8gJ2NwIFN5c3RlbS5tYXAgJFJQTV9CVUlMRF9ST09UJyIvYm9vdC9TeXN0ZW0ubWFwLSRLRVJORUxSRUxFQVNFIgorCitlY2hvICdjcCAuY29uZmlnICRSUE1fQlVJTERfUk9PVCciL2Jvb3QvY29uZmlnLSRLRVJORUxSRUxFQVNFIgorZWNobyAiIgorZWNobyAiJWNsZWFuIgorZWNobyAnI2VjaG8gLXJmICRSUE1fQlVJTERfUk9PVCcKK2VjaG8gIiIKK2VjaG8gIiVmaWxlcyIKK2VjaG8gJyVkZWZhdHRyICgtLCByb290LCByb290KScKK2VjaG8gIiVkaXIgL2xpYi9tb2R1bGVzIgorZWNobyAiL2xpYi9tb2R1bGVzLyRLRVJORUxSRUxFQVNFIgorZWNobyAiL2Jvb3QvKiIKK2VjaG8gIiIKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcGF0Y2gta2VybmVsIGIvc2NyaXB0cy9wYXRjaC1rZXJuZWwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDNhZjAxMAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvcGF0Y2gta2VybmVsCkBAIC0wLDAgKzEsMjU3IEBACisjISAvYmluL3NoCisjIFNjcmlwdCB0byBhcHBseSBrZXJuZWwgcGF0Y2hlcy4KKyMgICB1c2FnZTogcGF0Y2gta2VybmVsIFsgc291cmNlZGlyIFsgcGF0Y2hkaXIgWyBzdG9wdmVyc2lvbiBdIFsgLWFjeHggXSBdIF0KKyMgICAgIFRoZSBzb3VyY2UgZGlyZWN0b3J5IGRlZmF1bHRzIHRvIC91c3Ivc3JjL2xpbnV4LCBhbmQgdGhlIHBhdGNoCisjICAgICBkaXJlY3RvcnkgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorIyBlLmcuCisjICAgc2NyaXB0cy9wYXRjaC1rZXJuZWwgLiAuLgorIyAgICAgIFVwZGF0ZSB0aGUga2VybmVsIHRyZWUgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHVzaW5nIHBhdGNoZXMgaW4gdGhlCisjICAgICAgZGlyZWN0b3J5IGFib3ZlIHRvIHRoZSBsYXRlc3QgTGludXMga2VybmVsCisjICAgc2NyaXB0cy9wYXRjaC1rZXJuZWwgLiAuLiAtYWMKKyMgICAgICBHZXQgdGhlIGxhdGVzdCBMaW51eCBrZXJuZWwgYW5kIHBhdGNoIGl0IHdpdGggdGhlIGxhdGVzdCBhYyBwYXRjaAorIyAgIHNjcmlwdHMvcGF0Y2gta2VybmVsIC4gLi4gMi40LjkKKyMgICAgICBHZXRzIHN0YW5kYXJkIGtlcm5lbCAyLjQuOQorIyAgIHNjcmlwdHMvcGF0Y2gta2VybmVsIC4gLi4gMi40LjkgLWFjCisjICAgICAgR2V0cyAyLjQuOSB3aXRoIGxhdGVzdCBhYyBwYXRjaGVzCisjICAgc2NyaXB0cy9wYXRjaC1rZXJuZWwgLiAuLiAyLjQuOSAtYWMxMQorIyAgICAgIEdldHMgMi40Ljkgd2l0aCBhYyBwYXRjaCBhYzExCisjICAgTm90ZTogSXQgdXNlcyB0aGUgcGF0Y2hlcyByZWxhdGl2ZSB0byB0aGUgTGludXMga2VybmVscywgbm90IHRoZQorIyAgIGFjIHRvIGFjIHJlbGF0aXZlIHBhdGNoZXMKKyMKKyMgSXQgZGV0ZXJtaW5lcyB0aGUgY3VycmVudCBrZXJuZWwgdmVyc2lvbiBmcm9tIHRoZSB0b3AtbGV2ZWwgTWFrZWZpbGUuCisjIEl0IHRoZW4gbG9va3MgZm9yIHBhdGNoZXMgZm9yIHRoZSBuZXh0IHN1YmxldmVsIGluIHRoZSBwYXRjaCBkaXJlY3RvcnkuCisjIFRoaXMgaXMgYXBwbGllZCB1c2luZyAicGF0Y2ggLXAxIC1zIiBmcm9tIHdpdGhpbiB0aGUga2VybmVsIGRpcmVjdG9yeS4KKyMgQSBjaGVjayBpcyB0aGVuIG1hZGUgZm9yICIqLnJlaiIgZmlsZXMgdG8gc2VlIGlmIHRoZSBwYXRjaCB3YXMKKyMgc3VjY2Vzc2Z1bC4gIElmIGl0IGlzLCB0aGVuIGFsbCBvZiB0aGUgIioub3JpZyIgZmlsZXMgYXJlIHJlbW92ZWQuCisjCisjICAgICAgIE5pY2sgSG9sbG93YXkgPE5pY2suSG9sbG93YXlAYWxmaWUuZGVtb24uY28udWs+LCAybmQgSmFudWFyeSAxOTk1LgorIworIyBBZGRlZCBzdXBwb3J0IGZvciBoYW5kbGluZyBtdWx0aXBsZSB0eXBlcyBvZiBjb21wcmVzc2lvbi4gV2hhdCBpbmNsdWRlcworIyBnemlwLCBiemlwLCBiemlwMiwgemlwLCBjb21wcmVzcywgYW5kIHBsYWludGV4dC4gCisjCisjICAgICAgIEFkYW0gU3VsbWlja2kgPGFkYW1AY2Zhci51bWQuZWR1PiwgMXN0IEphbnVhcnkgMTk5Ny4KKyMKKyMgQWRkZWQgYWJpbGl0eSB0byBzdG9wIGF0IGEgZ2l2ZW4gdmVyc2lvbiBudW1iZXIKKyMgUHV0IHRoZSBmdWxsIHZlcnNpb24gbnVtYmVyIChpLmUuIDIuMy4zMSkgYXMgdGhlIGxhc3QgcGFyYW1ldGVyCisjICAgICAgIERhdmUgR2lsYmVydCA8bGludXhAdHJlYmxpZy5vcmc+LCAxMXRoIERlY2VtYmVyIDE5OTkuCisKKyMgRml4ZWQgcHJldmlvdXMgcGF0Y2ggc28gdGhhdCBpZiB3ZSBhcmUgYWxyZWFkeSBhdCB0aGUgY29ycmVjdCB2ZXJzaW9uCisjIG5vdCB0byBwYXRjaCB1cC4KKyMKKyMgQWRkZWQgLWFjIG9wdGlvbiwgdXNlIC1hYyBvciAtYWM5IChzYXkpIHRvIHN0b3AgYXQgYSBwYXJ0aWN1bGFyIHZlcnNpb24KKyMgICAgICAgRGF2ZSBHaWxiZXJ0IDxsaW51eEB0cmVibGlnLm9yZz4sIDI5dGggU2VwdGVtYmVyIDIwMDEuCisjCisjIEFkZCBzdXBwb3J0IGZvciAodXNlIG9mKSBFWFRSQVZFUlNJT04gKHRvIHN1cHBvcnQgMi42LjgueCwgZS5nLik7CisjIHVwZGF0ZSB1c2FnZSBtZXNzYWdlOworIyBmaXggc29tZSB3aGl0ZXNwYWNlIGRhbWFnZTsKKyMgYmUgc21hcnRlciBhYm91dCBzdG9wcGluZyB3aGVuIGN1cnJlbnQgdmVyc2lvbiBpcyBsYXJnZXIgdGhhbiByZXF1ZXN0ZWQ7CisjCVJhbmR5IER1bmxhcCA8cmRkdW5sYXBAb3NkbC5vcmc+LCAyMDA0LUFVRy0xOC4KKworIyBTZXQgZGlyZWN0b3JpZXMgZnJvbSBhcmd1bWVudHMsIG9yIHVzZSBkZWZhdWx0cy4KK3NvdXJjZWRpcj0kezEtL3Vzci9zcmMvbGludXh9CitwYXRjaGRpcj0kezItLn0KK3N0b3B2ZXJzPSR7My1kZWZhdWx0fQorCitpZiBbICIkMSIgPT0gLWggLW8gIiQxIiA9PSAtLWhlbHAgLW8gISAtciAiJHNvdXJjZWRpci9NYWtlZmlsZSIgXTsgdGhlbgorY2F0IDw8IFVTQUdFCit1c2FnZTogcGF0Y2gta2VybmVsIFstaF0gWyBzb3VyY2VkaXIgWyBwYXRjaGRpciBbIHN0b3B2ZXJzaW9uIF0gWyAtYWN4eCBdIF0gXQorICBzb3VyY2UgZGlyZWN0b3J5IGRlZmF1bHRzIHRvIC91c3Ivc3JjL2xpbnV4LAorICBwYXRjaCBkaXJlY3RvcnkgZGVmYXVsdHMgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LAorICBzdG9wdmVyc2lvbiBkZWZhdWx0cyB0byA8YWxsIGluIHBhdGNoZGlyPi4KK1VTQUdFCitleGl0IDEKK2ZpCisKKyMgU2VlIGlmIHdlIGhhdmUgYW55IC1hYyBvcHRpb25zCitmb3IgUEFSTSBpbiAkKgorZG8KKyAgY2FzZSAkUEFSTSBpbgorCSAgLWFjKikKKwkJICBnb3RhYz0kUEFSTTsKKworCWVzYWM7Citkb25lCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEZpbmQgYSBmaWxlLCBmaXJzdCBwYXJhbWV0ZXIgaXMgYmFzZW5hbWUgb2YgZmlsZQorIyBpdCB0cmllcyBtYW55IGNvbXByZXNzaW9uIG1lY2hhbmlzbXMgYW5kIHNldHMgdmFyaWFibGVzIHRvIHNheSBob3cgdG8gZ2V0IGl0CitmaW5kRmlsZSAoKSB7CisgIGZpbGViYXNlPSQxOworCisgIGlmIFsgLXIgJHtmaWxlYmFzZX0uZ3ogXTsgdGhlbgorCQlleHQ9Ii5neiIKKwkJbmFtZT0iZ3ppcCIKKwkJdW5jb21wPSJndW56aXAgLWRjIgorICBlbGlmIFsgLXIgJHtmaWxlYmFzZX0uYnogIF07IHRoZW4KKwkJZXh0PSIuYnoiCisJCW5hbWU9ImJ6aXAiCisJCXVuY29tcD0iYnVuemlwIC1kYyIKKyAgZWxpZiBbIC1yICR7ZmlsZWJhc2V9LmJ6MiBdOyB0aGVuCisJCWV4dD0iLmJ6MiIKKwkJbmFtZT0iYnppcDIiCisJCXVuY29tcD0iYnVuemlwMiAtZGMiCisgIGVsaWYgWyAtciAke2ZpbGViYXNlfS56aXAgXTsgdGhlbgorCQlleHQ9Ii56aXAiCisJCW5hbWU9InppcCIKKwkJdW5jb21wPSJ1bnppcCAtZCIKKyAgZWxpZiBbIC1yICR7ZmlsZWJhc2V9LlogXTsgdGhlbgorCQlleHQ9Ii5aIgorCQluYW1lPSJ1bmNvbXByZXNzIgorCQl1bmNvbXA9InVuY29tcHJlc3MgLWMiCisgIGVsaWYgWyAtciAke2ZpbGViYXNlfSBdOyB0aGVuCisJCWV4dD0iIgorCQluYW1lPSJwbGFpbnRleHQiCisJCXVuY29tcD0iY2F0IgorICBlbHNlCisJcmV0dXJuIDE7CisgIGZpCisKKyAgcmV0dXJuIDA7Cit9CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEFwcGx5IGEgcGF0Y2ggYW5kIGNoZWNrIGl0IGdvZXMgaW4gY2xlYW5seQorIyBGaXJzdCBwYXJhbSBpcyBwYXRjaCBuYW1lIChlLmcuIHBhdGNoLTIuNC45LWFjNSkgLSB3aXRob3V0IHBhdGggb3IgZXh0ZW5zaW9uCisKK2FwcGx5UGF0Y2ggKCkgeworICBlY2hvIC1uICJBcHBseWluZyAkMSAoJHtuYW1lfSkuLi4gIgorICBpZiAkdW5jb21wICR7cGF0Y2hkaXJ9LyQxJHtleHR9IHwgcGF0Y2ggLXAxIC1zIC1OIC1FIC1kICRzb3VyY2VkaXIKKyAgdGhlbgorICAgIGVjaG8gImRvbmUuIgorICBlbHNlCisgICAgZWNobyAiZmFpbGVkLiAgQ2xlYW4gdXAgeW91cnNlbGYuIgorICAgIHJldHVybiAxOworICBmaQorICBpZiBbICJgZmluZCAkc291cmNlZGlyLyAnKCcgLW5hbWUgJyoucmVqJyAtbyAtbmFtZSAnLioucmVqJyAnKScgLXByaW50YCIgXQorICB0aGVuCisgICAgZWNobyAiQWJvcnRpbmcuICBSZWplY3QgZmlsZXMgZm91bmQuIgorICAgIHJldHVybiAxOworICBmaQorICAjIFJlbW92ZSBiYWNrdXAgZmlsZXMKKyAgZmluZCAkc291cmNlZGlyLyAnKCcgLW5hbWUgJyoub3JpZycgLW8gLW5hbWUgJy4qLm9yaWcnICcpJyAtZXhlYyBybSAtZiB7fSBcOworIAorICByZXR1cm4gMDsKK30KKworIyBzZXQgY3VycmVudCBWRVJTSU9OLCBQQVRDSExFVkVMLCBTVUJMRVZFTCwgRVhUUkFWRVJTSU9OCitUTVBGSUxFPWBta3RlbXAgLnRtcHZlci5YWFhYWFhgIHx8IHsgZWNobyAiY2Fubm90IG1ha2UgdGVtcCBmaWxlIiA7IGV4aXQgMTsgfQorZ3JlcCAtRSAiXihWRVJTSU9OfFBBVENITEVWRUx8U1VCTEVWRUx8RVhUUkFWRVJTSU9OKSIgJHNvdXJjZWRpci9NYWtlZmlsZSA+ICRUTVBGSUxFCit0ciAtZCBbOmJsYW5rOl0gPCAkVE1QRklMRSA+ICRUTVBGSUxFLjEKK3NvdXJjZSAkVE1QRklMRS4xCitybSAtZiAkVE1QRklMRSoKK2lmIFsgLXogIiRWRVJTSU9OIiAtbyAteiAiJFBBVENITEVWRUwiIC1vIC16ICIkU1VCTEVWRUwiIF0KK3RoZW4KKyAgICBlY2hvICJ1bmFibGUgdG8gZGV0ZXJtaW5lIGN1cnJlbnQga2VybmVsIHZlcnNpb24iID4mMgorICAgIGV4aXQgMQorZmkKKworTkFNRT1gZ3JlcCBeTkFNRSAkc291cmNlZGlyL01ha2VmaWxlYAorTkFNRT0ke05BTUUjIyo9fQorCitlY2hvICJDdXJyZW50IGtlcm5lbCB2ZXJzaW9uIGlzICRWRVJTSU9OLiRQQVRDSExFVkVMLiRTVUJMRVZFTCR7RVhUUkFWRVJTSU9OfSAoJE5BTUUpIgorCisjIHN0cmlwIEVYVFJBVkVSU0lPTiB0byBqdXN0IGEgbnVtYmVyIChkcm9wIGxlYWRpbmcgJy4nIGFuZCB0cmFpbGluZyBhZGRpdGlvbnMpCitFWFRSQVZFUj0KK2lmIFsgeCRFWFRSQVZFUlNJT04gIT0gIngiIF0KK3RoZW4KKwlpZiBbICR7RVhUUkFWRVJTSU9OOjA6MX0gPT0gIi4iIF07IHRoZW4KKwkJRVhUUkFWRVI9JHtFWFRSQVZFUlNJT046MX0KKwllbHNlCisJCUVYVFJBVkVSPSRFWFRSQVZFUlNJT04KKwlmaQorCUVYVFJBVkVSPSR7RVhUUkFWRVIlJVtbOnB1bmN0Ol1dKn0KKwkjZWNobyAicGF0Y2gta2VybmVsOiBjaGFuZ2luZyBFWFRSQVZFUlNJT04gZnJvbSAkRVhUUkFWRVJTSU9OIHRvICRFWFRSQVZFUiIKK2ZpCisKKyNlY2hvICJzdG9wdmVycz0kc3RvcHZlcnMiCitpZiBbICRzdG9wdmVycyAhPSAiZGVmYXVsdCIgXTsgdGhlbgorCVNUT1BTVUJMRVZFTD1gZWNobyAkc3RvcHZlcnMgfCBjdXQgLWQuIC1mM2AKKwlTVE9QRVhUUkE9YGVjaG8gJHN0b3B2ZXJzIHwgY3V0IC1kLiAtZjRgCisJI2VjaG8gIlNUT1BTVUJMRVZFTD0kU1RPUFNVQkxFVkVMLCBTVE9QRVhUUkE9JFNUT1BFWFRSQSIKK2Vsc2UKKwlTVE9QU1VCTEVWRUw9OTk5OQorCVNUT1BFWFRSQT05OTk5CitmaQorCit3aGlsZSA6CQkJCSMgaW5jcmVtZW50aW5nIFNVQkxFVkVMIChzIGluIHYucC5zKQorZG8KKyAgICBpZiBbIHgkRVhUUkFWRVIgIT0gIngiIF07IHRoZW4KKwlDVVJSRU5URlVMTFZFUlNJT049IiRWRVJTSU9OLiRQQVRDSExFVkVMLiRTVUJMRVZFTC4kRVhUUkFWRVIiCisgICAgZWxzZQorCUNVUlJFTlRGVUxMVkVSU0lPTj0iJFZFUlNJT04uJFBBVENITEVWRUwuJFNVQkxFVkVMIgorICAgIGZpCisKKyAgICBpZiBbICRzdG9wdmVycyA9PSAkQ1VSUkVOVEZVTExWRVJTSU9OIF07IHRoZW4KKyAgICAgICAgZWNobyAiU3RvcHBpbmcgYXQgJENVUlJFTlRGVUxMVkVSU0lPTiBiYXNlIGFzIHJlcXVlc3RlZC4iCisgICAgICAgIGJyZWFrCisgICAgZmkKKworICAgIHdoaWxlIDoJCQkjIGluY3JlbWVudGluZyBFWFRSQVZFUiAoeCBpbiB2LnAucy54KQorICAgIGRvCisJRVhUUkFWRVI9JCgoRVhUUkFWRVIgKyAxKSkKKwlGVUxMVkVSU0lPTj0iJFZFUlNJT04uJFBBVENITEVWRUwuJFNVQkxFVkVMLiRFWFRSQVZFUiIKKwkjZWNobyAiLi4uIHRyeWluZyAkRlVMTFZFUlNJT04gLi4uIgorCisJcGF0Y2g9cGF0Y2gtJEZVTExWRVJTSU9OCisKKwkjIFNlZSBpZiB0aGUgZmlsZSBleGlzdHMgYW5kIGZpbmQgZXh0ZW5zaW9uCisJZmluZEZpbGUgJHBhdGNoZGlyLyR7cGF0Y2h9IHx8IGJyZWFrCisKKwkjIEFwcGx5IHRoZSBwYXRjaCBhbmQgY2hlY2sgYWxsIGlzIE9LCisJYXBwbHlQYXRjaCAkcGF0Y2ggfHwgYnJlYWsKKworCWNvbnRpbnVlIDIKKyAgICBkb25lCisKKyAgICBFWFRSQVZFUj0KKyAgICBTVUJMRVZFTD0kKChTVUJMRVZFTCArIDEpKQorICAgIEZVTExWRVJTSU9OPSIkVkVSU0lPTi4kUEFUQ0hMRVZFTC4kU1VCTEVWRUwiCisgICAgI2VjaG8gIl9fXyB0cnlpbmcgJEZVTExWRVJTSU9OIF9fXyIKKworICAgIGlmIFsgJCgoU1VCTEVWRUwpKSAtZ3QgJCgoU1RPUFNVQkxFVkVMKSkgXTsgdGhlbgorCWVjaG8gIlN0b3BwaW5nIHNpbmNlIHN1YmxldmVsICgkU1VCTEVWRUwpIGlzIGJleW9uZCBzdG9wLXN1YmxldmVsICgkU1RPUFNVQkxFVkVMKSIKKwlleGl0IDEKKyAgICBmaQorCisgICAgcGF0Y2g9cGF0Y2gtJEZVTExWRVJTSU9OCisKKyAgICAjIFNlZSBpZiB0aGUgZmlsZSBleGlzdHMgYW5kIGZpbmQgZXh0ZW5zaW9uCisgICAgZmluZEZpbGUgJHBhdGNoZGlyLyR7cGF0Y2h9IHx8IGJyZWFrCisKKyAgICAjIEFwcGx5IHRoZSBwYXRjaCBhbmQgY2hlY2sgYWxsIGlzIE9LCisgICAgYXBwbHlQYXRjaCAkcGF0Y2ggfHwgYnJlYWsKK2RvbmUKKyNlY2hvICJiYXNlIGFsbCBkb25lIgorCitpZiBbIHgkZ290YWMgIT0geCBdOyB0aGVuCisgICMgT3V0IGdyZWF0IHVzZXIgd2FudHMgdGhlIC1hYyBwYXRjaGVzCisJIyBUaGV5IGNvdWxkIGhhdmUgZG9uZSAtYWMgKGdldCBsYXRlc3QpIG9yIC1hY3h4IHdoZXJlIHh4PXZlcnNpb24gdGhleSB3YW50CisJaWYgWyAkZ290YWMgPT0gIi1hYyIgXTsgdGhlbgorCSAgIyBUaGV5IHdhbnQgdGhlIGxhdGVzdCB2ZXJzaW9uCisJCUhJR0hFU1RQQVRDSD0wCisJCWZvciBQQVRDSE5BTUVTIGluICRwYXRjaGRpci9wYXRjaC0ke0NVUlJFTlRGVUxMVkVSU0lPTn0tYWMqXC4qCisJCWRvCisJCQlBQ1ZBTFVFPWBlY2hvICRQQVRDSE5BTUVTIHwgc2VkIC1lICdzL14uKnBhdGNoLVswLTkuXSotYWNcKFswLTldKlwpLiovXDEvJ2AKKwkJCSMgQ2hlY2sgaXQgaXMgYWN0dWFsbHkgYSByZWNvZ25pc2VkIHBhdGNoIHR5cGUKKwkJCWZpbmRGaWxlICRwYXRjaGRpci9wYXRjaC0ke0NVUlJFTlRGVUxMVkVSU0lPTn0tYWMke0FDVkFMVUV9IHx8IGJyZWFrCisKKwkJICBpZiBbICRBQ1ZBTFVFIC1ndCAkSElHSEVTVFBBVENIIF07IHRoZW4KKwkJCSAgSElHSEVTVFBBVENIPSRBQ1ZBTFVFCisJCSAgZmkKKwkJZG9uZQorCisJCWlmIFsgJEhJR0hFU1RQQVRDSCAtbmUgMCBdOyB0aGVuCisJCQlmaW5kRmlsZSAkcGF0Y2hkaXIvcGF0Y2gtJHtDVVJSRU5URlVMTFZFUlNJT059LWFjJHtISUdIRVNUUEFUQ0h9IHx8IGJyZWFrCisJCQlhcHBseVBhdGNoIHBhdGNoLSR7Q1VSUkVOVEZVTExWRVJTSU9OfS1hYyR7SElHSEVTVFBBVENIfQorCQllbHNlCisJCSAgZWNobyAiTm8gLWFjIHBhdGNoZXMgZm91bmQiCisJCWZpCisJZWxzZQorCSAgIyBUaGV5IHdhbnQgYW4gZXhhY3QgdmVyc2lvbgorCQlmaW5kRmlsZSAkcGF0Y2hkaXIvcGF0Y2gtJHtDVVJSRU5URlVMTFZFUlNJT059JHtnb3RhY30gfHwgeworCQkgIGVjaG8gIlNvcnJ5LCBJIGNvdWxkbid0IGZpbmQgdGhlICRnb3RhYyBwYXRjaCBmb3IgJENVUlJFTlRGVUxMVkVSU0lPTi4gIEhvaHVtLiIKKwkJCWV4aXQgMQorCQl9CisJCWFwcGx5UGF0Y2ggcGF0Y2gtJHtDVVJSRU5URlVMTFZFUlNJT059JHtnb3RhY30KKwlmaQorZmkKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcG5tdG9sb2dvLmMgYi9zY3JpcHRzL3BubXRvbG9nby5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYTJhMjQKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL3BubXRvbG9nby5jCkBAIC0wLDAgKzEsNTA4IEBACisKKy8qCisgKiAgQ29udmVydCBhIGxvZ28gaW4gQVNDSUkgUE5NIGZvcm1hdCB0byBDIHNvdXJjZSBzdWl0YWJsZSBmb3IgaW5jbHVzaW9uIGluCisgKiAgdGhlIExpbnV4IGtlcm5lbAorICoKKyAqICAoQykgQ29weXJpZ2h0IDIwMDEtMjAwMyBieSBHZWVydCBVeXR0ZXJob2V2ZW4gPGdlZXJ0QGxpbnV4LW02OGsub3JnPgorICoKKyAqICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICoKKyAqICBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogIExpY2Vuc2UuIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGUgTGludXgKKyAqICBkaXN0cmlidXRpb24gZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKworc3RhdGljIGNvbnN0IGNoYXIgKnByb2dyYW1uYW1lOworc3RhdGljIGNvbnN0IGNoYXIgKmZpbGVuYW1lOworc3RhdGljIGNvbnN0IGNoYXIgKmxvZ29uYW1lID0gImxpbnV4X2xvZ28iOworc3RhdGljIGNvbnN0IGNoYXIgKm91dHB1dG5hbWU7CitzdGF0aWMgRklMRSAqb3V0OworCisKKyNkZWZpbmUgTElOVVhfTE9HT19NT05PCQkxCS8qIG1vbm9jaHJvbWUgYmxhY2svd2hpdGUgKi8KKyNkZWZpbmUgTElOVVhfTE9HT19WR0ExNgkyCS8qIDE2IGNvbG9ycyBWR0EgdGV4dCBwYWxldHRlICovCisjZGVmaW5lIExJTlVYX0xPR09fQ0xVVDIyNAkzCS8qIDIyNCBjb2xvcnMgKi8KKyNkZWZpbmUgTElOVVhfTE9HT19HUkFZMjU2CTQJLyogMjU2IGxldmVscyBncmF5c2NhbGUgKi8KKworc3RhdGljIGNvbnN0IGNoYXIgKmxvZ29fdHlwZXNbTElOVVhfTE9HT19HUkFZMjU2KzFdID0geworICAgIFtMSU5VWF9MT0dPX01PTk9dID0gIkxJTlVYX0xPR09fTU9OTyIsCisgICAgW0xJTlVYX0xPR09fVkdBMTZdID0gIkxJTlVYX0xPR09fVkdBMTYiLAorICAgIFtMSU5VWF9MT0dPX0NMVVQyMjRdID0gIkxJTlVYX0xPR09fQ0xVVDIyNCIsCisgICAgW0xJTlVYX0xPR09fR1JBWTI1Nl0gPSAiTElOVVhfTE9HT19HUkFZMjU2IgorfTsKKworI2RlZmluZSBNQVhfTElOVVhfTE9HT19DT0xPUlMJMjI0CisKK3N0cnVjdCBjb2xvciB7CisgICAgdW5zaWduZWQgY2hhciByZWQ7CisgICAgdW5zaWduZWQgY2hhciBncmVlbjsKKyAgICB1bnNpZ25lZCBjaGFyIGJsdWU7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IGNvbG9yIGNsdXRfdmdhMTZbMTZdID0geworICAgIHsgMHgwMCwgMHgwMCwgMHgwMCB9LAorICAgIHsgMHgwMCwgMHgwMCwgMHhhYSB9LAorICAgIHsgMHgwMCwgMHhhYSwgMHgwMCB9LAorICAgIHsgMHgwMCwgMHhhYSwgMHhhYSB9LAorICAgIHsgMHhhYSwgMHgwMCwgMHgwMCB9LAorICAgIHsgMHhhYSwgMHgwMCwgMHhhYSB9LAorICAgIHsgMHhhYSwgMHg1NSwgMHgwMCB9LAorICAgIHsgMHhhYSwgMHhhYSwgMHhhYSB9LAorICAgIHsgMHg1NSwgMHg1NSwgMHg1NSB9LAorICAgIHsgMHg1NSwgMHg1NSwgMHhmZiB9LAorICAgIHsgMHg1NSwgMHhmZiwgMHg1NSB9LAorICAgIHsgMHg1NSwgMHhmZiwgMHhmZiB9LAorICAgIHsgMHhmZiwgMHg1NSwgMHg1NSB9LAorICAgIHsgMHhmZiwgMHg1NSwgMHhmZiB9LAorICAgIHsgMHhmZiwgMHhmZiwgMHg1NSB9LAorICAgIHsgMHhmZiwgMHhmZiwgMHhmZiB9LAorfTsKKworCitzdGF0aWMgaW50IGxvZ29fdHlwZSA9IExJTlVYX0xPR09fQ0xVVDIyNDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbG9nb193aWR0aDsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbG9nb19oZWlnaHQ7CitzdGF0aWMgc3RydWN0IGNvbG9yICoqbG9nb19kYXRhOworc3RhdGljIHN0cnVjdCBjb2xvciBsb2dvX2NsdXRbTUFYX0xJTlVYX0xPR09fQ09MT1JTXTsKK3N0YXRpYyB1bnNpZ25lZCBpbnQgbG9nb19jbHV0c2l6ZTsKKworc3RhdGljIHZvaWQgZGllKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQorICAgIF9fYXR0cmlidXRlX18gKChub3JldHVybikpIF9fYXR0cmlidXRlICgoZm9ybWF0IChwcmludGYsIDEsIDIpKSk7CitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKSBfX2F0dHJpYnV0ZSAoKG5vcmV0dXJuKSk7CisKKworc3RhdGljIHVuc2lnbmVkIGludCBnZXRfbnVtYmVyKEZJTEUgKmZwKQoreworICAgIGludCBjLCB2YWw7CisKKyAgICAvKiBTa2lwIGxlYWRpbmcgd2hpdGVzcGFjZSAqLworICAgIGRvIHsKKwljID0gZmdldGMoZnApOworCWlmIChjID09IEVPRikKKwkgICAgZGllKCIlczogZW5kIG9mIGZpbGVcbiIsIGZpbGVuYW1lKTsKKwlpZiAoYyA9PSAnIycpIHsKKwkgICAgLyogSWdub3JlIGNvbW1lbnRzICd0aWxsIGVuZCBvZiBsaW5lICovCisJICAgIGRvIHsKKwkJYyA9IGZnZXRjKGZwKTsKKwkJaWYgKGMgPT0gRU9GKQorCQkgICAgZGllKCIlczogZW5kIG9mIGZpbGVcbiIsIGZpbGVuYW1lKTsKKwkgICAgfSB3aGlsZSAoYyAhPSAnXG4nKTsKKwl9CisgICAgfSB3aGlsZSAoaXNzcGFjZShjKSk7CisKKyAgICAvKiBQYXJzZSBkZWNpbWFsIG51bWJlciAqLworICAgIHZhbCA9IDA7CisgICAgd2hpbGUgKGlzZGlnaXQoYykpIHsKKwl2YWwgPSAxMCp2YWwrYy0nMCc7CisJYyA9IGZnZXRjKGZwKTsKKwlpZiAoYyA9PSBFT0YpCisJICAgIGRpZSgiJXM6IGVuZCBvZiBmaWxlXG4iLCBmaWxlbmFtZSk7CisgICAgfQorICAgIHJldHVybiB2YWw7Cit9CisKK3N0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0X251bWJlcjI1NShGSUxFICpmcCwgdW5zaWduZWQgaW50IG1heHZhbCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgdmFsID0gZ2V0X251bWJlcihmcCk7CisgICAgcmV0dXJuICgyNTUqdmFsK21heHZhbC8yKS9tYXh2YWw7Cit9CisKK3N0YXRpYyB2b2lkIHJlYWRfaW1hZ2Uodm9pZCkKK3sKKyAgICBGSUxFICpmcDsKKyAgICB1bnNpZ25lZCBpbnQgaSwgajsKKyAgICBpbnQgbWFnaWM7CisgICAgdW5zaWduZWQgaW50IG1heHZhbDsKKworICAgIC8qIG9wZW4gaW1hZ2UgZmlsZSAqLworICAgIGZwID0gZm9wZW4oZmlsZW5hbWUsICJyIik7CisgICAgaWYgKCFmcCkKKwlkaWUoIkNhbm5vdCBvcGVuIGZpbGUgJXM6ICVzXG4iLCBmaWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKKworICAgIC8qIGNoZWNrIGZpbGUgdHlwZSBhbmQgcmVhZCBmaWxlIGhlYWRlciAqLworICAgIG1hZ2ljID0gZmdldGMoZnApOworICAgIGlmIChtYWdpYyAhPSAnUCcpCisJZGllKCIlcyBpcyBub3QgYSBQTk0gZmlsZVxuIiwgZmlsZW5hbWUpOworICAgIG1hZ2ljID0gZmdldGMoZnApOworICAgIHN3aXRjaCAobWFnaWMpIHsKKwljYXNlICcxJzoKKwljYXNlICcyJzoKKwljYXNlICczJzoKKwkgICAgLyogUGxhaW4gUEJNL1BHTS9QUE0gKi8KKwkgICAgYnJlYWs7CisKKwljYXNlICc0JzoKKwljYXNlICc1JzoKKwljYXNlICc2JzoKKwkgICAgLyogQmluYXJ5IFBCTS9QR00vUFBNICovCisJICAgIGRpZSgiJXM6IEJpbmFyeSBQTk0gaXMgbm90IHN1cHBvcnRlZFxuIgorCQkiVXNlIHBubW5vcmF3KDEpIHRvIGNvbnZlcnQgaXQgdG8gQVNDSUkgUE5NXG4iLCBmaWxlbmFtZSk7CisKKwlkZWZhdWx0OgorCSAgICBkaWUoIiVzIGlzIG5vdCBhIFBOTSBmaWxlXG4iLCBmaWxlbmFtZSk7CisgICAgfQorICAgIGxvZ29fd2lkdGggPSBnZXRfbnVtYmVyKGZwKTsKKyAgICBsb2dvX2hlaWdodCA9IGdldF9udW1iZXIoZnApOworCisgICAgLyogYWxsb2NhdGUgaW1hZ2UgZGF0YSAqLworICAgIGxvZ29fZGF0YSA9IChzdHJ1Y3QgY29sb3IgKiopbWFsbG9jKGxvZ29faGVpZ2h0KnNpemVvZihzdHJ1Y3QgY29sb3IgKikpOworICAgIGlmICghbG9nb19kYXRhKQorCWRpZSgiJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgZm9yIChpID0gMDsgaSA8IGxvZ29faGVpZ2h0OyBpKyspIHsKKwlsb2dvX2RhdGFbaV0gPSBtYWxsb2MobG9nb193aWR0aCpzaXplb2Yoc3RydWN0IGNvbG9yKSk7CisJaWYgKCFsb2dvX2RhdGFbaV0pCisJICAgIGRpZSgiJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisgICAgfQorCisgICAgLyogcmVhZCBpbWFnZSBkYXRhICovCisgICAgc3dpdGNoIChtYWdpYykgeworCWNhc2UgJzEnOgorCSAgICAvKiBQbGFpbiBQQk0gKi8KKwkgICAgZm9yIChpID0gMDsgaSA8IGxvZ29faGVpZ2h0OyBpKyspCisJCWZvciAoaiA9IDA7IGogPCBsb2dvX3dpZHRoOyBqKyspCisJCSAgICBsb2dvX2RhdGFbaV1bal0ucmVkID0gbG9nb19kYXRhW2ldW2pdLmdyZWVuID0KKwkJCWxvZ29fZGF0YVtpXVtqXS5ibHVlID0gMjU1KigxLWdldF9udW1iZXIoZnApKTsKKwkgICAgYnJlYWs7CisKKwljYXNlICcyJzoKKwkgICAgLyogUGxhaW4gUEdNICovCisJICAgIG1heHZhbCA9IGdldF9udW1iZXIoZnApOworCSAgICBmb3IgKGkgPSAwOyBpIDwgbG9nb19oZWlnaHQ7IGkrKykKKwkJZm9yIChqID0gMDsgaiA8IGxvZ29fd2lkdGg7IGorKykKKwkJICAgIGxvZ29fZGF0YVtpXVtqXS5yZWQgPSBsb2dvX2RhdGFbaV1bal0uZ3JlZW4gPQorCQkJbG9nb19kYXRhW2ldW2pdLmJsdWUgPSBnZXRfbnVtYmVyMjU1KGZwLCBtYXh2YWwpOworCSAgICBicmVhazsKKworCWNhc2UgJzMnOgorCSAgICAvKiBQbGFpbiBQUE0gKi8KKwkgICAgbWF4dmFsID0gZ2V0X251bWJlcihmcCk7CisJICAgIGZvciAoaSA9IDA7IGkgPCBsb2dvX2hlaWdodDsgaSsrKQorCQlmb3IgKGogPSAwOyBqIDwgbG9nb193aWR0aDsgaisrKSB7CisJCSAgICBsb2dvX2RhdGFbaV1bal0ucmVkID0gZ2V0X251bWJlcjI1NShmcCwgbWF4dmFsKTsKKwkJICAgIGxvZ29fZGF0YVtpXVtqXS5ncmVlbiA9IGdldF9udW1iZXIyNTUoZnAsIG1heHZhbCk7CisJCSAgICBsb2dvX2RhdGFbaV1bal0uYmx1ZSA9IGdldF9udW1iZXIyNTUoZnAsIG1heHZhbCk7CisJCX0KKwkgICAgYnJlYWs7CisgICAgfQorCisgICAgLyogY2xvc2UgZmlsZSAqLworICAgIGZjbG9zZShmcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX2JsYWNrKHN0cnVjdCBjb2xvciBjKQoreworICAgIHJldHVybiBjLnJlZCA9PSAwICYmIGMuZ3JlZW4gPT0gMCAmJiBjLmJsdWUgPT0gMDsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfd2hpdGUoc3RydWN0IGNvbG9yIGMpCit7CisgICAgcmV0dXJuIGMucmVkID09IDI1NSAmJiBjLmdyZWVuID09IDI1NSAmJiBjLmJsdWUgPT0gMjU1OworfQorCitzdGF0aWMgaW5saW5lIGludCBpc19ncmF5KHN0cnVjdCBjb2xvciBjKQoreworICAgIHJldHVybiBjLnJlZCA9PSBjLmdyZWVuICYmIGMucmVkID09IGMuYmx1ZTsKK30KKworc3RhdGljIGlubGluZSBpbnQgaXNfZXF1YWwoc3RydWN0IGNvbG9yIGMxLCBzdHJ1Y3QgY29sb3IgYzIpCit7CisgICAgcmV0dXJuIGMxLnJlZCA9PSBjMi5yZWQgJiYgYzEuZ3JlZW4gPT0gYzIuZ3JlZW4gJiYgYzEuYmx1ZSA9PSBjMi5ibHVlOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9oZWFkZXIodm9pZCkKK3sKKyAgICAvKiBvcGVuIGxvZ28gZmlsZSAqLworICAgIGlmIChvdXRwdXRuYW1lKSB7CisJb3V0ID0gZm9wZW4ob3V0cHV0bmFtZSwgInciKTsKKwlpZiAoIW91dCkKKwkgICAgZGllKCJDYW5ub3QgY3JlYXRlIGZpbGUgJXM6ICVzXG4iLCBvdXRwdXRuYW1lLCBzdHJlcnJvcihlcnJubykpOworICAgIH0gZWxzZSB7CisJb3V0ID0gc3Rkb3V0OworICAgIH0KKworICAgIGZwdXRzKCIvKlxuIiwgb3V0KTsKKyAgICBmcHV0cygiICogIERPIE5PVCBFRElUIFRISVMgRklMRSFcbiIsIG91dCk7CisgICAgZnB1dHMoIiAqXG4iLCBvdXQpOworICAgIGZwcmludGYob3V0LCAiICogIEl0IHdhcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmcm9tICVzXG4iLCBmaWxlbmFtZSk7CisgICAgZnB1dHMoIiAqXG4iLCBvdXQpOworICAgIGZwcmludGYob3V0LCAiICogIExpbnV4IGxvZ28gJXNcbiIsIGxvZ29uYW1lKTsKKyAgICBmcHV0cygiICovXG5cbiIsIG91dCk7CisgICAgZnB1dHMoIiNpbmNsdWRlIDxsaW51eC9saW51eF9sb2dvLmg+XG5cbiIsIG91dCk7CisgICAgZnByaW50ZihvdXQsICJzdGF0aWMgdW5zaWduZWQgY2hhciAlc19kYXRhW10gX19pbml0ZGF0YSA9IHtcbiIsCisJICAgIGxvZ29uYW1lKTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfZm9vdGVyKHZvaWQpCit7CisgICAgZnB1dHMoIlxufTtcblxuIiwgb3V0KTsKKyAgICBmcHJpbnRmKG91dCwgInN0cnVjdCBsaW51eF9sb2dvICVzIF9faW5pdGRhdGEgPSB7XG4iLCBsb2dvbmFtZSk7CisgICAgZnByaW50ZihvdXQsICIgICAgLnR5cGVcdD0gJXMsXG4iLCBsb2dvX3R5cGVzW2xvZ29fdHlwZV0pOworICAgIGZwcmludGYob3V0LCAiICAgIC53aWR0aFx0PSAlZCxcbiIsIGxvZ29fd2lkdGgpOworICAgIGZwcmludGYob3V0LCAiICAgIC5oZWlnaHRcdD0gJWQsXG4iLCBsb2dvX2hlaWdodCk7CisgICAgaWYgKGxvZ29fdHlwZSA9PSBMSU5VWF9MT0dPX0NMVVQyMjQpIHsKKwlmcHJpbnRmKG91dCwgIiAgICAuY2x1dHNpemVcdD0gJWQsXG4iLCBsb2dvX2NsdXRzaXplKTsKKwlmcHJpbnRmKG91dCwgIiAgICAuY2x1dFx0PSAlc19jbHV0LFxuIiwgbG9nb25hbWUpOworICAgIH0KKyAgICBmcHJpbnRmKG91dCwgIiAgICAuZGF0YVx0PSAlc19kYXRhXG4iLCBsb2dvbmFtZSk7CisgICAgZnB1dHMoIn07XG5cbiIsIG91dCk7CisKKyAgICAvKiBjbG9zZSBsb2dvIGZpbGUgKi8KKyAgICBpZiAob3V0cHV0bmFtZSkKKwlmY2xvc2Uob3V0KTsKK30KKworc3RhdGljIGludCB3cml0ZV9oZXhfY250OworCitzdGF0aWMgdm9pZCB3cml0ZV9oZXgodW5zaWduZWQgY2hhciBieXRlKQoreworICAgIGlmICh3cml0ZV9oZXhfY250ICUgMTIpCisJZnByaW50ZihvdXQsICIsIDB4JTAyeCIsIGJ5dGUpOworICAgIGVsc2UgaWYgKHdyaXRlX2hleF9jbnQpCisJZnByaW50ZihvdXQsICIsXG5cdDB4JTAyeCIsIGJ5dGUpOworICAgIGVsc2UKKwlmcHJpbnRmKG91dCwgIlx0MHglMDJ4IiwgYnl0ZSk7CisgICAgd3JpdGVfaGV4X2NudCsrOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9sb2dvX21vbm8odm9pZCkKK3sKKyAgICB1bnNpZ25lZCBpbnQgaSwgajsKKyAgICB1bnNpZ25lZCBjaGFyIHZhbCwgYml0OworCisgICAgLyogdmFsaWRhdGUgaW1hZ2UgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbG9nb19oZWlnaHQ7IGkrKykKKwlmb3IgKGogPSAwOyBqIDwgbG9nb193aWR0aDsgaisrKQorCSAgICBpZiAoIWlzX2JsYWNrKGxvZ29fZGF0YVtpXVtqXSkgJiYgIWlzX3doaXRlKGxvZ29fZGF0YVtpXVtqXSkpCisJCWRpZSgiSW1hZ2UgbXVzdCBiZSBtb25vY2hyb21lXG4iKTsKKworICAgIC8qIHdyaXRlIGZpbGUgaGVhZGVyICovCisgICAgd3JpdGVfaGVhZGVyKCk7CisKKyAgICAvKiB3cml0ZSBsb2dvIGRhdGEgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbG9nb19oZWlnaHQ7IGkrKykgeworCWZvciAoaiA9IDA7IGogPCBsb2dvX3dpZHRoOykgeworCSAgICBmb3IgKHZhbCA9IDAsIGJpdCA9IDB4ODA7IGJpdCAmJiBqIDwgbG9nb193aWR0aDsgaisrLCBiaXQgPj49IDEpCisJCWlmIChsb2dvX2RhdGFbaV1bal0ucmVkKQorCQkgICAgdmFsIHw9IGJpdDsKKwkgICAgd3JpdGVfaGV4KHZhbCk7CisJfQorICAgIH0KKworICAgIC8qIHdyaXRlIGxvZ28gc3RydWN0dXJlIGFuZCBmaWxlIGZvb3RlciAqLworICAgIHdyaXRlX2Zvb3RlcigpOworfQorCitzdGF0aWMgdm9pZCB3cml0ZV9sb2dvX3ZnYTE2KHZvaWQpCit7CisgICAgdW5zaWduZWQgaW50IGksIGosIGs7CisgICAgdW5zaWduZWQgY2hhciB2YWw7CisKKyAgICAvKiB2YWxpZGF0ZSBpbWFnZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBsb2dvX2hlaWdodDsgaSsrKQorCWZvciAoaiA9IDA7IGogPCBsb2dvX3dpZHRoOyBqKyspIHsKKwkgICAgZm9yIChrID0gMDsgayA8IDE2OyBrKyspCisJCWlmIChpc19lcXVhbChsb2dvX2RhdGFbaV1bal0sIGNsdXRfdmdhMTZba10pKQorCQkgICAgYnJlYWs7CisJICAgIGlmIChrID09IDE2KQorCQlkaWUoIkltYWdlIG11c3QgdXNlIHRoZSAxNiBjb25zb2xlIGNvbG9ycyBvbmx5XG4iCisJCSAgICAiVXNlIHBwbXF1YW50KDEpIC1tYXAgY2x1dF92Z2ExNi5wcG0gdG8gcmVkdWNlIHRoZSBudW1iZXIgIgorCQkgICAgIm9mIGNvbG9yc1xuIik7CisJfQorCisgICAgLyogd3JpdGUgZmlsZSBoZWFkZXIgKi8KKyAgICB3cml0ZV9oZWFkZXIoKTsKKworICAgIC8qIHdyaXRlIGxvZ28gZGF0YSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBsb2dvX2hlaWdodDsgaSsrKQorCWZvciAoaiA9IDA7IGogPCBsb2dvX3dpZHRoOyBqKyspIHsKKwkgICAgZm9yIChrID0gMDsgayA8IDE2OyBrKyspCisJCWlmIChpc19lcXVhbChsb2dvX2RhdGFbaV1bal0sIGNsdXRfdmdhMTZba10pKQorCQkgICAgYnJlYWs7CisJICAgIHZhbCA9IGs8PDQ7CisJICAgIGlmICgrK2ogPCBsb2dvX3dpZHRoKSB7CisJCWZvciAoayA9IDA7IGsgPCAxNjsgaysrKQorCQkgICAgaWYgKGlzX2VxdWFsKGxvZ29fZGF0YVtpXVtqXSwgY2x1dF92Z2ExNltrXSkpCisJCQlicmVhazsKKwkJdmFsIHw9IGs7CisJICAgIH0KKwkgICAgd3JpdGVfaGV4KHZhbCk7CisJfQorCisgICAgLyogd3JpdGUgbG9nbyBzdHJ1Y3R1cmUgYW5kIGZpbGUgZm9vdGVyICovCisgICAgd3JpdGVfZm9vdGVyKCk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX2xvZ29fY2x1dDIyNCh2b2lkKQoreworICAgIHVuc2lnbmVkIGludCBpLCBqLCBrOworCisgICAgLyogdmFsaWRhdGUgaW1hZ2UgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbG9nb19oZWlnaHQ7IGkrKykKKwlmb3IgKGogPSAwOyBqIDwgbG9nb193aWR0aDsgaisrKSB7CisJICAgIGZvciAoayA9IDA7IGsgPCBsb2dvX2NsdXRzaXplOyBrKyspCisJCWlmIChpc19lcXVhbChsb2dvX2RhdGFbaV1bal0sIGxvZ29fY2x1dFtrXSkpCisJCSAgICBicmVhazsKKwkgICAgaWYgKGsgPT0gbG9nb19jbHV0c2l6ZSkgeworCQlpZiAobG9nb19jbHV0c2l6ZSA9PSBNQVhfTElOVVhfTE9HT19DT0xPUlMpCisJCSAgICBkaWUoIkltYWdlIGhhcyBtb3JlIHRoYW4gJWQgY29sb3JzXG4iCisJCQkiVXNlIHBwbXF1YW50KDEpIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGNvbG9yc1xuIiwKKwkJCU1BWF9MSU5VWF9MT0dPX0NPTE9SUyk7CisJCWxvZ29fY2x1dFtsb2dvX2NsdXRzaXplKytdID0gbG9nb19kYXRhW2ldW2pdOworCSAgICB9CisJfQorCisgICAgLyogd3JpdGUgZmlsZSBoZWFkZXIgKi8KKyAgICB3cml0ZV9oZWFkZXIoKTsKKworICAgIC8qIHdyaXRlIGxvZ28gZGF0YSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBsb2dvX2hlaWdodDsgaSsrKQorCWZvciAoaiA9IDA7IGogPCBsb2dvX3dpZHRoOyBqKyspIHsKKwkgICAgZm9yIChrID0gMDsgayA8IGxvZ29fY2x1dHNpemU7IGsrKykKKwkJaWYgKGlzX2VxdWFsKGxvZ29fZGF0YVtpXVtqXSwgbG9nb19jbHV0W2tdKSkKKwkJICAgIGJyZWFrOworCSAgICB3cml0ZV9oZXgoayszMik7CisJfQorICAgIGZwdXRzKCJcbn07XG5cbiIsIG91dCk7CisKKyAgICAvKiB3cml0ZSBsb2dvIGNsdXQgKi8KKyAgICBmcHJpbnRmKG91dCwgInN0YXRpYyB1bnNpZ25lZCBjaGFyICVzX2NsdXRbXSBfX2luaXRkYXRhID0ge1xuIiwKKwkgICAgbG9nb25hbWUpOworICAgIHdyaXRlX2hleF9jbnQgPSAwOworICAgIGZvciAoaSA9IDA7IGkgPCBsb2dvX2NsdXRzaXplOyBpKyspIHsKKwl3cml0ZV9oZXgobG9nb19jbHV0W2ldLnJlZCk7CisJd3JpdGVfaGV4KGxvZ29fY2x1dFtpXS5ncmVlbik7CisJd3JpdGVfaGV4KGxvZ29fY2x1dFtpXS5ibHVlKTsKKyAgICB9CisKKyAgICAvKiB3cml0ZSBsb2dvIHN0cnVjdHVyZSBhbmQgZmlsZSBmb290ZXIgKi8KKyAgICB3cml0ZV9mb290ZXIoKTsKK30KKworc3RhdGljIHZvaWQgd3JpdGVfbG9nb19ncmF5MjU2KHZvaWQpCit7CisgICAgdW5zaWduZWQgaW50IGksIGo7CisKKyAgICAvKiB2YWxpZGF0ZSBpbWFnZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBsb2dvX2hlaWdodDsgaSsrKQorCWZvciAoaiA9IDA7IGogPCBsb2dvX3dpZHRoOyBqKyspCisJICAgIGlmICghaXNfZ3JheShsb2dvX2RhdGFbaV1bal0pKQorCQlkaWUoIkltYWdlIG11c3QgYmUgZ3JheXNjYWxlXG4iKTsKKworICAgIC8qIHdyaXRlIGZpbGUgaGVhZGVyICovCisgICAgd3JpdGVfaGVhZGVyKCk7CisKKyAgICAvKiB3cml0ZSBsb2dvIGRhdGEgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbG9nb19oZWlnaHQ7IGkrKykKKwlmb3IgKGogPSAwOyBqIDwgbG9nb193aWR0aDsgaisrKQorCSAgICB3cml0ZV9oZXgobG9nb19kYXRhW2ldW2pdLnJlZCk7CisKKyAgICAvKiB3cml0ZSBsb2dvIHN0cnVjdHVyZSBhbmQgZmlsZSBmb290ZXIgKi8KKyAgICB3cml0ZV9mb290ZXIoKTsKK30KKworc3RhdGljIHZvaWQgZGllKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQoreworICAgIHZhX2xpc3QgYXA7CisKKyAgICB2YV9zdGFydChhcCwgZm10KTsKKyAgICB2ZnByaW50ZihzdGRlcnIsIGZtdCwgYXApOworICAgIHZhX2VuZChhcCk7CisKKyAgICBleGl0KDEpOworfQorCitzdGF0aWMgdm9pZCB1c2FnZSh2b2lkKQoreworICAgIGRpZSgiXG4iCisJIlVzYWdlOiAlcyBbb3B0aW9uc10gPGZpbGVuYW1lPlxuIgorCSJcbiIKKwkiVmFsaWQgb3B0aW9uczpcbiIKKwkiICAgIC1oICAgICAgICAgIDogZGlzcGxheSB0aGlzIHVzYWdlIGluZm9ybWF0aW9uXG4iCisJIiAgICAtbiA8bmFtZT4gICA6IHNwZWNpZnkgbG9nbyBuYW1lIChkZWZhdWx0OiBsaW51eF9sb2dvKVxuIgorCSIgICAgLW8gPG91dHB1dD4gOiBvdXRwdXQgdG8gZmlsZSA8b3V0cHV0PiBpbnN0ZWFkIG9mIHN0ZG91dFxuIgorCSIgICAgLXQgPHR5cGU+ICAgOiBzcGVjaWZ5IGxvZ28gdHlwZSwgb25lIG9mXG4iCisJIiAgICAgICAgICAgICAgICAgICAgICBtb25vICAgIDogbW9ub2Nocm9tZSBibGFjay93aGl0ZVxuIgorCSIgICAgICAgICAgICAgICAgICAgICAgdmdhMTYgICA6IDE2IGNvbG9ycyBWR0EgdGV4dCBwYWxldHRlXG4iCisJIiAgICAgICAgICAgICAgICAgICAgICBjbHV0MjI0IDogMjI0IGNvbG9ycyAoZGVmYXVsdClcbiIKKwkiICAgICAgICAgICAgICAgICAgICAgIGdyYXkyNTYgOiAyNTYgbGV2ZWxzIGdyYXlzY2FsZVxuIgorCSJcbiIsIHByb2dyYW1uYW1lKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKyAgICBpbnQgb3B0OworCisgICAgcHJvZ3JhbW5hbWUgPSBhcmd2WzBdOworCisgICAgb3B0ZXJyID0gMDsKKyAgICB3aGlsZSAoMSkgeworCW9wdCA9IGdldG9wdChhcmdjLCBhcmd2LCAiaG46bzp0OiIpOworCWlmIChvcHQgPT0gLTEpCisJICAgIGJyZWFrOworCisJc3dpdGNoIChvcHQpIHsKKwkgICAgY2FzZSAnaCc6CisJCXVzYWdlKCk7CisJCWJyZWFrOworCisJICAgIGNhc2UgJ24nOgorCQlsb2dvbmFtZSA9IG9wdGFyZzsKKwkJYnJlYWs7CisKKwkgICAgY2FzZSAnbyc6CisJCW91dHB1dG5hbWUgPSBvcHRhcmc7CisJCWJyZWFrOworCisJICAgIGNhc2UgJ3QnOgorCQlpZiAoIXN0cmNtcChvcHRhcmcsICJtb25vIikpCisJCSAgICBsb2dvX3R5cGUgPSBMSU5VWF9MT0dPX01PTk87CisJCWVsc2UgaWYgKCFzdHJjbXAob3B0YXJnLCAidmdhMTYiKSkKKwkJICAgIGxvZ29fdHlwZSA9IExJTlVYX0xPR09fVkdBMTY7CisJCWVsc2UgaWYgKCFzdHJjbXAob3B0YXJnLCAiY2x1dDIyNCIpKQorCQkgICAgbG9nb190eXBlID0gTElOVVhfTE9HT19DTFVUMjI0OworCQllbHNlIGlmICghc3RyY21wKG9wdGFyZywgImdyYXkyNTYiKSkKKwkJICAgIGxvZ29fdHlwZSA9IExJTlVYX0xPR09fR1JBWTI1NjsKKwkJZWxzZQorCQkgICAgdXNhZ2UoKTsKKwkJYnJlYWs7CisKKwkgICAgZGVmYXVsdDoKKwkJdXNhZ2UoKTsKKwkJYnJlYWs7CisJfQorICAgIH0KKyAgICBpZiAob3B0aW5kICE9IGFyZ2MtMSkKKwl1c2FnZSgpOworCisgICAgZmlsZW5hbWUgPSBhcmd2W29wdGluZF07CisKKyAgICByZWFkX2ltYWdlKCk7CisgICAgc3dpdGNoIChsb2dvX3R5cGUpIHsKKwljYXNlIExJTlVYX0xPR09fTU9OTzoKKwkgICAgd3JpdGVfbG9nb19tb25vKCk7CisJICAgIGJyZWFrOworCisJY2FzZSBMSU5VWF9MT0dPX1ZHQTE2OgorCSAgICB3cml0ZV9sb2dvX3ZnYTE2KCk7CisJICAgIGJyZWFrOworCisJY2FzZSBMSU5VWF9MT0dPX0NMVVQyMjQ6CisJICAgIHdyaXRlX2xvZ29fY2x1dDIyNCgpOworCSAgICBicmVhazsKKworCWNhc2UgTElOVVhfTE9HT19HUkFZMjU2OgorCSAgICB3cml0ZV9sb2dvX2dyYXkyNTYoKTsKKwkgICAgYnJlYWs7CisgICAgfQorICAgIGV4aXQoMCk7Cit9CisKZGlmZiAtLWdpdCBhL3NjcmlwdHMvcmVmZXJlbmNlX2Rpc2NhcmRlZC5wbCBiL3NjcmlwdHMvcmVmZXJlbmNlX2Rpc2NhcmRlZC5wbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWNhYmI4Ci0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9yZWZlcmVuY2VfZGlzY2FyZGVkLnBsCkBAIC0wLDAgKzEsMTEwIEBACisjIS91c3IvYmluL3BlcmwgLXcKKyMKKyMgcmVmZXJlbmNlX2Rpc2NhcmRlZC5wbCAoQykgS2VpdGggT3dlbnMgMjAwMSA8a2Fvc0BvY3MuY29tLmF1PgorIworIyBSZWxlYXNlZCB1bmRlciBHUEwgVjIuCisjCisjIExpc3QgZGFuZ2xpbmcgcmVmZXJlbmNlcyB0byB2bWxpbnV4IGRpc2NhcmRlZCBzZWN0aW9ucy4KKwordXNlIHN0cmljdDsKK2RpZSgkMCAuICIgdGFrZXMgbm8gYXJndW1lbnRzXG4iKSBpZigkI0FSR1YgPj0gMCk7CisKK215ICVvYmplY3Q7CitteSAkb2JqZWN0OworbXkgJGxpbmU7CitteSAkaWdub3JlOworbXkgJGVycm9yY291bnQ7CisKKyR8ID0gMTsKKworIyBwcmludGYoIkZpbmRpbmcgb2JqZWN0cywgIik7CitvcGVuKE9CSkRVTVBfTElTVCwgImZpbmQgLiAtbmFtZSAnKi5vJyB8IHhhcmdzIG9iamR1bXAgLWggfCIpIHx8IGRpZSAiZ2V0dGluZyBvYmpkdW1wIGxpc3QgZmFpbGVkIjsKK3doaWxlIChkZWZpbmVkKCRsaW5lID0gPE9CSkRVTVBfTElTVD4pKSB7CisJY2hvbXAoJGxpbmUpOworCWlmICgkbGluZSA9fiAvOlxzK2ZpbGUgZm9ybWF0LykgeworCQkoJG9iamVjdCA9ICRsaW5lKSA9fiBzLzouKi8vOworCQkkb2JqZWN0eyRvYmplY3R9LT57J21vZHVsZSd9ID0gMDsKKwkJJG9iamVjdHskb2JqZWN0fS0+eydzaXplJ30gPSAwOworCQkkb2JqZWN0eyRvYmplY3R9LT57J29mZid9ID0gMDsKKwl9CisJaWYgKCRsaW5lID1+IC9eXHMqXGQrXHMrXC5tb2RpbmZvXHMrLykgeworCQkkb2JqZWN0eyRvYmplY3R9LT57J21vZHVsZSd9ID0gMTsKKwl9CisJaWYgKCRsaW5lID1+IC9eXHMqXGQrXHMrXC5jb21tZW50XHMrLykgeworCQkoJG9iamVjdHskb2JqZWN0fS0+eydzaXplJ30sICRvYmplY3R7JG9iamVjdH0tPnsnb2ZmJ30pID0gKHNwbGl0KCcgJywgJGxpbmUpKVsyLDVdOworCX0KK30KK2Nsb3NlKE9CSkRVTVBfTElTVCk7CisjIHByaW50ZigiJWQgb2JqZWN0cywgIiwgc2NhbGFyIGtleXMoJW9iamVjdCkpOworJGlnbm9yZSA9IDA7Citmb3JlYWNoICRvYmplY3QgKGtleXMoJW9iamVjdCkpIHsKKwlpZiAoJG9iamVjdHskb2JqZWN0fS0+eydtb2R1bGUnfSkgeworCQkrKyRpZ25vcmU7CisJCWRlbGV0ZSgkb2JqZWN0eyRvYmplY3R9KTsKKwl9Cit9CisjIHByaW50ZigiaWdub3JpbmcgJWQgbW9kdWxlKHMpXG4iLCAkaWdub3JlKTsKKworIyBJZ25vcmUgY29uZ2xvbWVyYXRlIG9iamVjdHMsIHRoZXkgaGF2ZSBiZWVuIGJ1aWx0IGZyb20gbXVsdGlwbGUgb2JqZWN0cyBhbmQgd2UKKyMgb25seSBjYXJlIGFib3V0IHRoZSBpbmRpdmlkdWFsIG9iamVjdHMuICBJZiBhbiBvYmplY3QgaGFzIG1vcmUgdGhhbiBvbmUgR0NDOgorIyBzdHJpbmcgaW4gdGhlIGNvbW1lbnQgc2VjdGlvbiB0aGVuIGl0IGlzIGNvbmdsb21lcmF0ZS4gIFRoaXMgZG9lcyBub3QgZmlsdGVyCisjIG91dCBjb25nbG9tZXJhdGVzIHRoYXQgY29uc2lzdCBvZiBleGFjdGx5IG9uZSBvYmplY3QsIGNhbid0IGJlIGhlbHBlZC4KKworIyBwcmludGYoIkZpbmRpbmcgY29uZ2xvbWVyYXRlcywgIik7CiskaWdub3JlID0gMDsKK2ZvcmVhY2ggJG9iamVjdCAoa2V5cyglb2JqZWN0KSkgeworCWlmIChleGlzdHMoJG9iamVjdHskb2JqZWN0fS0+eydvZmYnfSkpIHsKKwkJbXkgKCRvZmYsICRzaXplLCAkY29tbWVudCwgJGwpOworCQkkb2ZmID0gaGV4KCRvYmplY3R7JG9iamVjdH0tPnsnb2ZmJ30pOworCQkkc2l6ZSA9IGhleCgkb2JqZWN0eyRvYmplY3R9LT57J3NpemUnfSk7CisJCW9wZW4oT0JKRUNULCAiPCRvYmplY3QiKSB8fCBkaWUgImNhbm5vdCByZWFkICRvYmplY3QiOworCQlzZWVrKE9CSkVDVCwgJG9mZiwgMCkgfHwgZGllICJzZWVrIHRvICRvZmYgaW4gJG9iamVjdCBmYWlsZWQiOworCQkkbCA9IHJlYWQoT0JKRUNULCAkY29tbWVudCwgJHNpemUpOworCQlkaWUgInJlYWQgJHNpemUgYnl0ZXMgZnJvbSAkb2JqZWN0IC5jb21tZW50IGZhaWxlZCIgaWYgKCRsICE9ICRzaXplKTsKKwkJY2xvc2UoT0JKRUNUKTsKKwkJaWYgKCRjb21tZW50ID1+IC9HQ0NcOi4qR0NDXDovbSB8fCAkb2JqZWN0ID1+IC9idWlsdC1pblwuby8pIHsKKwkJCSsrJGlnbm9yZTsKKwkJCWRlbGV0ZSgkb2JqZWN0eyRvYmplY3R9KTsKKwkJfQorCX0KK30KKyMgcHJpbnRmKCJpZ25vcmluZyAlZCBjb25nbG9tZXJhdGUocylcbiIsICRpZ25vcmUpOworCisjIHByaW50ZigiU2Nhbm5pbmcgb2JqZWN0c1xuIik7CiskZXJyb3Jjb3VudCA9IDA7Citmb3JlYWNoICRvYmplY3QgKGtleXMoJW9iamVjdCkpIHsKKwlteSAkZnJvbTsKKwlvcGVuKE9CSkRVTVAsICJvYmpkdW1wIC1yICRvYmplY3R8IikgfHwgZGllICJjYW5ub3Qgb2JqZHVtcCAtciAkb2JqZWN0IjsKKwl3aGlsZSAoZGVmaW5lZCgkbGluZSA9IDxPQkpEVU1QPikpIHsKKwkJY2hvbXAoJGxpbmUpOworCQlpZiAoJGxpbmUgPX4gL1JFTE9DQVRJT04gUkVDT1JEUyBGT1IgLykgeworCQkJKCRmcm9tID0gJGxpbmUpID1+IHMvLipcWyhbXl1dKikuKi8kMS87CisJCX0KKwkJaWYgKCgkbGluZSA9fiAvXC50ZXh0XC5leGl0JC8gfHwKKwkJICAgICAkbGluZSA9fiAvXC5leGl0XC50ZXh0JC8gfHwKKwkJICAgICAkbGluZSA9fiAvXC5kYXRhXC5leGl0JC8gfHwKKwkJICAgICAkbGluZSA9fiAvXC5leGl0XC5kYXRhJC8gfHwKKwkJICAgICAkbGluZSA9fiAvXC5leGl0Y2FsbFwuZXhpdCQvKSAmJgorCQkgICAgKCRmcm9tICF+IC9cLnRleHRcLmV4aXQkLyAmJgorCQkgICAgICRmcm9tICF+IC9cLmV4aXRcLnRleHQkLyAmJgorCQkgICAgICRmcm9tICF+IC9cLmRhdGFcLmV4aXQkLyAmJgorCQkgICAgICRmcm9tICF+IC9cLmV4aXRcLmRhdGEkLyAmJgorCQkgICAgICRmcm9tICF+IC9cLmFsdGluc3RydWN0aW9ucyQvICYmCisJCSAgICAgJGZyb20gIX4gL1wucGRyJC8gJiYKKwkJICAgICAkZnJvbSAhfiAvXC5kZWJ1Z19pbmZvJC8gJiYKKwkJICAgICAkZnJvbSAhfiAvXC5kZWJ1Z19hcmFuZ2VzJC8gJiYKKwkJICAgICAkZnJvbSAhfiAvXC5kZWJ1Z19yYW5nZXMkLyAmJgorCQkgICAgICRmcm9tICF+IC9cLmRlYnVnX2xpbmUkLyAmJgorCQkgICAgICRmcm9tICF+IC9cLmRlYnVnX2ZyYW1lJC8gJiYKKwkJICAgICAkZnJvbSAhfiAvXC5leGl0Y2FsbFwuZXhpdCQvICYmCisJCSAgICAgJGZyb20gIX4gL1wuZWhfZnJhbWUkLyAmJgorCQkgICAgICRmcm9tICF+IC9cLnN0YWIkLykpIHsKKwkJCXByaW50ZigiRXJyb3I6ICVzICVzIHJlZmVycyB0byAlc1xuIiwgJG9iamVjdCwgJGZyb20sICRsaW5lKTsKKwkJCSRlcnJvcmNvdW50ID0gJGVycm9yY291bnQgKyAxOworCQl9CisJfQorCWNsb3NlKE9CSkRVTVApOworfQorIyBwcmludGYoIkRvbmVcbiIpOworCitleGl0KDApOwpkaWZmIC0tZ2l0IGEvc2NyaXB0cy9yZWZlcmVuY2VfaW5pdC5wbCBiL3NjcmlwdHMvcmVmZXJlbmNlX2luaXQucGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEyNDA4NAotLS0gL2Rldi9udWxsCisrKyBiL3NjcmlwdHMvcmVmZXJlbmNlX2luaXQucGwKQEAgLTAsMCArMSwxMDcgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworIworIyByZWZlcmVuY2VfaW5pdC5wbCAoQykgS2VpdGggT3dlbnMgMjAwMiA8a2Fvc0BvY3MuY29tLmF1PgorIworIyBMaXN0IHJlZmVyZW5jZXMgdG8gdm1saW51eCBpbml0IHNlY3Rpb25zIGZyb20gbm9uLWluaXQgc2VjdGlvbnMuCisKKyMgVW5mb3J0dW5hdGVseSBJIGhhZCB0byBleGNsdWRlIHJlZmVyZW5jZXMgZnJvbSByZWFkIG9ubHkgZGF0YSB0byAuaW5pdAorIyBzZWN0aW9ucywgYWxtb3N0IGFsbCBvZiB0aGVzZSBhcmUgZmFsc2UgcG9zaXRpdmVzLCB0aGV5IGFyZSBjcmVhdGVkIGJ5CisjIGdjYy4gIFRoZSBkb3duc2lkZSBvZiBleGNsdWRpbmcgcm9kYXRhIGlzIHRoYXQgdGhlcmUgcmVhbGx5IGFyZSBzb21lCisjIHVzZXIgcmVmZXJlbmNlcyBmcm9tIHJvZGF0YSB0byBpbml0IGNvZGUsIGUuZy4gZHJpdmVycy92aWRlby92Z2Fjb24uYworIworIyBjb25zdCBzdHJ1Y3QgY29uc3cgdmdhX2NvbiA9IHsKKyMgICAgICAgIGNvbl9zdGFydHVwOiAgICAgICAgICAgIHZnYWNvbl9zdGFydHVwLAorIworIyB3aGVyZSB2Z2Fjb25fc3RhcnR1cCBpcyBfX2luaXQuICBJZiB5b3Ugd2FudCB0byB3YWRlIHRocm91Z2ggdGhlIGZhbHNlCisjIHBvc2l0aXZlcywgdGFrZSBvdXQgdGhlIGNoZWNrIGZvciByb2RhdGEuCisKK3VzZSBzdHJpY3Q7CitkaWUoJDAgLiAiIHRha2VzIG5vIGFyZ3VtZW50c1xuIikgaWYoJCNBUkdWID49IDApOworCitteSAlb2JqZWN0OworbXkgJG9iamVjdDsKK215ICRsaW5lOworbXkgJGlnbm9yZTsKKworJHwgPSAxOworCitwcmludGYoIkZpbmRpbmcgb2JqZWN0cywgIik7CitvcGVuKE9CSkRVTVBfTElTVCwgImZpbmQgLiAtbmFtZSAnKi5vJyB8IHhhcmdzIG9iamR1bXAgLWggfCIpIHx8IGRpZSAiZ2V0dGluZyBvYmpkdW1wIGxpc3QgZmFpbGVkIjsKK3doaWxlIChkZWZpbmVkKCRsaW5lID0gPE9CSkRVTVBfTElTVD4pKSB7CisJY2hvbXAoJGxpbmUpOworCWlmICgkbGluZSA9fiAvOlxzK2ZpbGUgZm9ybWF0LykgeworCQkoJG9iamVjdCA9ICRsaW5lKSA9fiBzLzouKi8vOworCQkkb2JqZWN0eyRvYmplY3R9LT57J21vZHVsZSd9ID0gMDsKKwkJJG9iamVjdHskb2JqZWN0fS0+eydzaXplJ30gPSAwOworCQkkb2JqZWN0eyRvYmplY3R9LT57J29mZid9ID0gMDsKKwl9CisJaWYgKCRsaW5lID1+IC9eXHMqXGQrXHMrXC5tb2RpbmZvXHMrLykgeworCQkkb2JqZWN0eyRvYmplY3R9LT57J21vZHVsZSd9ID0gMTsKKwl9CisJaWYgKCRsaW5lID1+IC9eXHMqXGQrXHMrXC5jb21tZW50XHMrLykgeworCQkoJG9iamVjdHskb2JqZWN0fS0+eydzaXplJ30sICRvYmplY3R7JG9iamVjdH0tPnsnb2ZmJ30pID0gKHNwbGl0KCcgJywgJGxpbmUpKVsyLDVdOworCX0KK30KK2Nsb3NlKE9CSkRVTVBfTElTVCk7CitwcmludGYoIiVkIG9iamVjdHMsICIsIHNjYWxhciBrZXlzKCVvYmplY3QpKTsKKyRpZ25vcmUgPSAwOworZm9yZWFjaCAkb2JqZWN0IChrZXlzKCVvYmplY3QpKSB7CisJaWYgKCRvYmplY3R7JG9iamVjdH0tPnsnbW9kdWxlJ30pIHsKKwkJKyskaWdub3JlOworCQlkZWxldGUoJG9iamVjdHskb2JqZWN0fSk7CisJfQorfQorcHJpbnRmKCJpZ25vcmluZyAlZCBtb2R1bGUocylcbiIsICRpZ25vcmUpOworCisjIElnbm9yZSBjb25nbG9tZXJhdGUgb2JqZWN0cywgdGhleSBoYXZlIGJlZW4gYnVpbHQgZnJvbSBtdWx0aXBsZSBvYmplY3RzIGFuZCB3ZQorIyBvbmx5IGNhcmUgYWJvdXQgdGhlIGluZGl2aWR1YWwgb2JqZWN0cy4gIElmIGFuIG9iamVjdCBoYXMgbW9yZSB0aGFuIG9uZSBHQ0M6CisjIHN0cmluZyBpbiB0aGUgY29tbWVudCBzZWN0aW9uIHRoZW4gaXQgaXMgY29uZ2xvbWVyYXRlLiAgVGhpcyBkb2VzIG5vdCBmaWx0ZXIKKyMgb3V0IGNvbmdsb21lcmF0ZXMgdGhhdCBjb25zaXN0IG9mIGV4YWN0bHkgb25lIG9iamVjdCwgY2FuJ3QgYmUgaGVscGVkLgorCitwcmludGYoIkZpbmRpbmcgY29uZ2xvbWVyYXRlcywgIik7CiskaWdub3JlID0gMDsKK2ZvcmVhY2ggJG9iamVjdCAoa2V5cyglb2JqZWN0KSkgeworCWlmIChleGlzdHMoJG9iamVjdHskb2JqZWN0fS0+eydvZmYnfSkpIHsKKwkJbXkgKCRvZmYsICRzaXplLCAkY29tbWVudCwgJGwpOworCQkkb2ZmID0gaGV4KCRvYmplY3R7JG9iamVjdH0tPnsnb2ZmJ30pOworCQkkc2l6ZSA9IGhleCgkb2JqZWN0eyRvYmplY3R9LT57J3NpemUnfSk7CisJCW9wZW4oT0JKRUNULCAiPCRvYmplY3QiKSB8fCBkaWUgImNhbm5vdCByZWFkICRvYmplY3QiOworCQlzZWVrKE9CSkVDVCwgJG9mZiwgMCkgfHwgZGllICJzZWVrIHRvICRvZmYgaW4gJG9iamVjdCBmYWlsZWQiOworCQkkbCA9IHJlYWQoT0JKRUNULCAkY29tbWVudCwgJHNpemUpOworCQlkaWUgInJlYWQgJHNpemUgYnl0ZXMgZnJvbSAkb2JqZWN0IC5jb21tZW50IGZhaWxlZCIgaWYgKCRsICE9ICRzaXplKTsKKwkJY2xvc2UoT0JKRUNUKTsKKwkJaWYgKCRjb21tZW50ID1+IC9HQ0NcOi4qR0NDXDovbSB8fCAkb2JqZWN0ID1+IC9idWlsdC1pblwuby8pIHsKKwkJCSsrJGlnbm9yZTsKKwkJCWRlbGV0ZSgkb2JqZWN0eyRvYmplY3R9KTsKKwkJfQorCX0KK30KK3ByaW50ZigiaWdub3JpbmcgJWQgY29uZ2xvbWVyYXRlKHMpXG4iLCAkaWdub3JlKTsKKworcHJpbnRmKCJTY2FubmluZyBvYmplY3RzXG4iKTsKK2ZvcmVhY2ggJG9iamVjdCAoc29ydChrZXlzKCVvYmplY3QpKSkgeworCW15ICRmcm9tOworCW9wZW4oT0JKRFVNUCwgIm9iamR1bXAgLXIgJG9iamVjdHwiKSB8fCBkaWUgImNhbm5vdCBvYmpkdW1wIC1yICRvYmplY3QiOworCXdoaWxlIChkZWZpbmVkKCRsaW5lID0gPE9CSkRVTVA+KSkgeworCQljaG9tcCgkbGluZSk7CisJCWlmICgkbGluZSA9fiAvUkVMT0NBVElPTiBSRUNPUkRTIEZPUiAvKSB7CisJCQkoJGZyb20gPSAkbGluZSkgPX4gcy8uKlxbKFteXV0qKS4qLyQxLzsKKwkJfQorCQlpZiAoKCRsaW5lID1+IC9cLmluaXQkLyB8fCAkbGluZSA9fiAvXC5pbml0XC4vKSAmJgorCQkgICAgKCRmcm9tICF+IC9cLmluaXQkLyAmJgorCQkgICAgICRmcm9tICF+IC9cLmluaXRcLi8gJiYKKwkJICAgICAkZnJvbSAhfiAvXC5zdGFiJC8gJiYKKwkJICAgICAkZnJvbSAhfiAvXC5yb2RhdGEkLyAmJgorCQkgICAgICRmcm9tICF+IC9cLnRleHRcLmxvY2skLyAmJgorCQkgICAgICRmcm9tICF+IC9cLnBjaV9maXh1cF9oZWFkZXIkLyAmJgorCQkgICAgICRmcm9tICF+IC9cLnBjaV9maXh1cF9maW5hbCQvICYmCisJCSAgICAgJGZyb20gIX4gL1wucGRyJC8gJiYKKwkJICAgICAkZnJvbSAhfiAvXF9fcGFyYW0kLyAmJgorCQkgICAgICRmcm9tICF+IC9cLmFsdGluc3RydWN0aW9ucy8gJiYKKwkJICAgICAkZnJvbSAhfiAvXC5kZWJ1Z18vKSkgeworCQkJcHJpbnRmKCJFcnJvcjogJXMgJXMgcmVmZXJzIHRvICVzXG4iLCAkb2JqZWN0LCAkZnJvbSwgJGxpbmUpOworCQl9CisJfQorCWNsb3NlKE9CSkRVTVApOworfQorcHJpbnRmKCJEb25lXG4iKTsKZGlmZiAtLWdpdCBhL3NjcmlwdHMvc2hvd19kZWx0YSBiL3NjcmlwdHMvc2hvd19kZWx0YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGE3MDZhCi0tLSAvZGV2L251bGwKKysrIGIvc2NyaXB0cy9zaG93X2RlbHRhCkBAIC0wLDAgKzEsMTI5IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMKKyMgc2hvd19kZWx0YXM6IFJlYWQgbGlzdCBvZiBwcmludGsgbWVzc2FnZXMgaW5zdHJ1bWVudGVkIHdpdGgKKyMgdGltZSBkYXRhLCBhbmQgZm9ybWF0IHdpdGggdGltZSBkZWx0YXMuCisjCisjIEFsc28sIHlvdSBjYW4gc2hvdyB0aGUgdGltZXMgcmVsYXRpdmUgdG8gYSBmaXhlZCBwb2ludC4KKyMKKyMgQ29weXJpZ2h0IDIwMDMgU29ueSBDb3Jwb3JhdGlvbgorIworIyBHUEwgMi4wIGFwcGxpZXMuCisKK2ltcG9ydCBzeXMKK2ltcG9ydCBzdHJpbmcKKworZGVmIHVzYWdlKCk6CisJcHJpbnQgIiIidXNhZ2U6IHNob3dfZGVsdGEgWzxvcHRpb25zPl0gPGZpbGVuYW1lPgorCitUaGlzIHByb2dyYW0gcGFyc2VzIHRoZSBvdXRwdXQgZnJvbSBhIHNldCBvZiBwcmludGsgbWVzc2FnZSBsaW5lcyB3aGljaAoraGF2ZSB0aW1lIGRhdGEgcHJlZml4ZWQgYmVjYXVzZSB0aGUgQ09ORklHX1BSSU5US19USU1FIG9wdGlvbiBpcyBzZXQsIG9yCit0aGUga2VybmVsIGNvbW1hbmQgbGluZSBvcHRpb24gInRpbWUiIGlzIHNwZWNpZmllZC4gV2hlbiBydW4gd2l0aCBubworb3B0aW9ucywgdGhlIHRpbWUgaW5mb3JtYXRpb24gaXMgY29udmVydGVkIHRvIHNob3cgdGhlIHRpbWUgZGVsdGEgYmV0d2VlbgorZWFjaCBwcmludGsgbGluZSBhbmQgdGhlIG5leHQuICBXaGVuIHJ1biB3aXRoIHRoZSAnLWInIG9wdGlvbiwgYWxsIHRpbWVzCithcmUgcmVsYXRpdmUgdG8gYSBzaW5nbGUgKGJhc2UpIHBvaW50IGluIHRpbWUuCisKK09wdGlvbnM6CisgIC1oICAgICAgICAgICAgU2hvdyB0aGlzIHVzYWdlIGhlbHAuCisgIC1iIDxiYXNlPglTcGVjaWZ5IGEgYmFzZSBmb3IgdGltZSByZWZlcmVuY2VzLgorCQk8YmFzZT4gY2FuIGJlIGEgbnVtYmVyIG9yIGEgc3RyaW5nLgorCQlJZiBpdCBpcyBhIHN0cmluZywgdGhlIGZpcnN0IG1lc3NhZ2UgbGluZQorCQl3aGljaCBtYXRjaGVzIChhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZQorCQlsaW5lKSBpcyB1c2VkIGFzIHRoZSB0aW1lIHJlZmVyZW5jZS4KKworZXg6ICQgZG1lc2cgPnRpbWVmaWxlCisgICAgJCBzaG93X2RlbHRhIC1iIE5FVDQgdGltZWZpbGUKKword2lsbCBzaG93IHRpbWVzIHJlbGF0aXZlIHRvIHRoZSBsaW5lIGluIHRoZSBrZXJuZWwgb3V0cHV0CitzdGFydGluZyB3aXRoICJORVQ0Ii4KKyIiIgorCXN5cy5leGl0KDEpCisKKyMgcmV0dXJucyBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIHNlY29uZHMgYW5kIHRleHQgZm9yIGVhY2ggbWVzc2FnZSBsaW5lCisjIHNlY29uZHMgaXMgcmV0dXJuZWQgYXMgYSBmbG9hdAorIyByYWlzZSBhbiBleGNlcHRpb24gaWYgbm8gdGltaW5nIGRhdGEgd2FzIGZvdW5kCitkZWYgZ2V0X3RpbWUobGluZSk6CisJaWYgbGluZVswXSE9IlsiOgorCQlyYWlzZSBWYWx1ZUVycm9yCisKKwkjIHNwbGl0IG9uIGNsb3NpbmcgYnJhY2tldAorCSh0aW1lX3N0ciwgcmVzdCkgPSBzdHJpbmcuc3BsaXQobGluZVsxOl0sJ10nLDEpCisJdGltZSA9IHN0cmluZy5hdG9mKHRpbWVfc3RyKQorCisJI3ByaW50ICJ0aW1lPSIsIHRpbWUKKwlyZXR1cm4gKHRpbWUsIHJlc3QpCisKKworIyBhdmVyYWdlIGxpbmUgbG9va3MgbGlrZToKKyMgWyAgICAwLjA4NDI4Ml0gVkZTOiBNb3VudGVkIHJvb3QgKHJvbWZzIGZpbGVzeXN0ZW0pIHJlYWRvbmx5CisjIHRpbWUgZGF0YSBpcyBleHByZXNzZWQgaW4gc2Vjb25kcy51c2Vjb25kcywKKyMgY29udmVydF9saW5lIGFkZHMgYSBkZWx0YSBmb3IgZWFjaCBsaW5lCitsYXN0X3RpbWUgPSAwLjAKK2RlZiBjb252ZXJ0X2xpbmUobGluZSwgYmFzZV90aW1lKToKKwlnbG9iYWwgbGFzdF90aW1lCisKKwl0cnk6CisJCSh0aW1lLCByZXN0KSA9IGdldF90aW1lKGxpbmUpCisJZXhjZXB0OgorCQkjIGlmIGFueSBwcm9ibGVtIHBhcnNpbmcgdGltZSwgZG9uJ3QgY29udmVydCBhbnl0aGluZworCQlyZXR1cm4gbGluZQorCisJaWYgYmFzZV90aW1lOgorCQkjIHNob3cgdGltZSBmcm9tIGJhc2UKKwkJZGVsdGEgPSB0aW1lIC0gYmFzZV90aW1lCisJZWxzZToKKwkJIyBqdXN0IHNob3cgdGltZSBmcm9tIGxhc3QgbGluZQorCQlkZWx0YSA9IHRpbWUgLSBsYXN0X3RpbWUKKwkJbGFzdF90aW1lID0gdGltZQorCisJcmV0dXJuICgiWyU1LjZmIDwgJTUuNmYgPl0iICUgKHRpbWUsIGRlbHRhKSkgKyByZXN0CisKK2RlZiBtYWluKCk6CisJYmFzZV9zdHIgPSAiIgorCWZpbGVpbiA9ICIiCisJZm9yIGFyZyBpbiBzeXMuYXJndlsxOl06CisJCWlmIGFyZz09Ii1iIjoKKwkJCWJhc2Vfc3RyID0gc3lzLmFyZ3Zbc3lzLmFyZ3YuaW5kZXgoIi1iIikrMV0KKwkJZWxpZiBhcmc9PSItaCI6CisJCQl1c2FnZSgpCisJCWVsc2U6CisJCQlmaWxlaW4gPSBhcmcKKworCWlmIG5vdCBmaWxlaW46CisJCXVzYWdlKCkKKworCXRyeToKKwkJbGluZXMgPSBvcGVuKGZpbGVpbiwiciIpLnJlYWRsaW5lcygpCisJZXhjZXB0OgorCQlwcmludCAiUHJvYmxlbSBvcGVuaW5nIGZpbGU6ICVzIiAlIGZpbGVpbgorCQlzeXMuZXhpdCgxKQorCisJaWYgYmFzZV9zdHI6CisJCXByaW50ICdiYXNlPSAiJXMiJyAlIGJhc2Vfc3RyCisJCSMgYXNzdW1lIGEgbnVtZXJpYyBiYXNlLiAgSWYgdGhhdCBmYWlscywgdHJ5IHNlYXJjaGluZworCQkjIGZvciBhIG1hdGNoaW5nIGxpbmUuCisJCXRyeToKKwkJCWJhc2VfdGltZSA9IGZsb2F0KGJhc2Vfc3RyKQorCQlleGNlcHQ6CisJCQkjIHNlYXJjaCBmb3IgbGluZSBtYXRjaGluZyA8YmFzZT4gc3RyaW5nCisJCQlmb3VuZCA9IDAKKwkJCWZvciBsaW5lIGluIGxpbmVzOgorCQkJCXRyeToKKwkJCQkJKHRpbWUsIHJlc3QpID0gZ2V0X3RpbWUobGluZSkKKwkJCQlleGNlcHQ6CisJCQkJCWNvbnRpbnVlCisJCQkJaWYgc3RyaW5nLmZpbmQocmVzdCwgYmFzZV9zdHIpPT0xOgorCQkJCQliYXNlX3RpbWUgPSB0aW1lCisJCQkJCWZvdW5kID0gMQorCQkJCQkjIHN0b3AgYXQgZmlyc3QgbWF0Y2gKKwkJCQkJYnJlYWsKKwkJCWlmIG5vdCBmb3VuZDoKKwkJCQlwcmludCAnQ291bGRuXCd0IGZpbmQgbGluZSBtYXRjaGluZyBiYXNlIHBhdHRlcm4gIiVzIicgJSBiYXNlX3N0cgorCQkJCXN5cy5leGl0KDEpCisJZWxzZToKKwkJYmFzZV90aW1lID0gMC4wCisKKwlmb3IgbGluZSBpbiBsaW5lczoKKwkJcHJpbnQgY29udmVydF9saW5lKGxpbmUsIGJhc2VfdGltZSksCisKK21haW4oKQorCmRpZmYgLS1naXQgYS9zY3JpcHRzL3NwbGl0LW1hbiBiL3NjcmlwdHMvc3BsaXQtbWFuCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjAzODk3ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL3NwbGl0LW1hbgpAQCAtMCwwICsxLDExMiBAQAorIyEvdXNyL2Jpbi9wZXJsCisKK3VzZSBzdHJpY3Q7CisKKyMjIENvcHlyaWdodCAoQykgTWljaGFlbCBTdGlsbCAobWlrYWxAc3RpbGxocS5jb20pCisjIyBSZWxlYXNlZCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHUEwKKyMjCisjIyBIb29uIHRocm91Z2ggdGhlIHNwZWNpZmllZCBEb2NCb29rIFNHTUwgZmlsZSwgYW5kIHNwbGl0IG91dCB0aGUKKyMjIG1hbiBwYWdlcy4gVGhlc2UgY2FuIHRoZW4gYmUgcHJvY2Vzc2VkIGludG8gZ3JvZmYgZm9ybWF0LCBhbmQKKyMjIGluc3RhbGxlZCBpZiBkZXNpcmVkLi4uCisjIworIyMgQXJndWVtZW50czogJDEgLS0gdGhlIG5hbWUgb2YgdGhlIHNnbWwgZmlsZQorIyMgICAgICAgICAgICAgJDIgLS0gdGhlIGRpcmVjdG9yeSB0byBwdXQgdGhlIGdlbmVyYXRlZCBTR01MIGZpbGVzIGluCisjIyAgICAgICAgICAgICAkMyAtLSBrZXJuZWwgdmVyc2lvbgorCitteSgkU0dNTCwgJFJFRiwgJGZyb250LCAkcmVmZGF0YSwgJG1vZGUsICRmaWxlbmFtZSk7CisKK2lmKCgkQVJHVlswXSBlcSAiIikgfHwgKCRBUkdWWzFdIGVxICIiKSB8fCAoJEFSR1ZbMl0gZXEgIiIpKXsKKyAgZGllICJVc2FnZTogc3BsaXQtbWFuIDxzZ21sIGZpbGU+IDxvdXRwdXQgZGlyPiA8a2VybmVsIHZlcnNpb24+XG4iOworfQorCitvcGVuIFNHTUwsICI8ICRBUkdWWzBdIiBvciBkaWUgIkNvdWxkIG5vdCBvcGVuIGlucHV0IGZpbGUgXCIkQVJHVlswXVwiXG4iOworaWYoICEgLWQgIiRBUkdWWzFdIiApeworICBkaWUgIk91dHB1dCBkaXJlY3RvcnkgXCIkQVJHVlsxXVwiIGRvZXMgbm90IGV4aXN0XG4iOworfQorCisjIFBvc3NpYmxlIG1vZGVzOgorIyAgIDA6IExvb2tpbmcgZm9yIGlucHV0IEkgY2FyZSBhYm91dAorIyAgIDE6IEluc2lkZSBib29rIGZyb250IG1hdHRlcgorIyAgIDI6IEluc2lkZSBhIHJlZmVudHJ5CisjICAgMzogSW5zaWRlIGEgcmVmZW50cnksIGFuZCB3ZSBrbm93IHRoZSBmaWxlbmFtZQorCiskbW9kZSA9IDA7CiskcmVmZGF0YSA9ICIiOworJGZyb250ID0gIiI7Cit3aGlsZSg8U0dNTD4peworICAjIFN0YXJ0aW5nIG1vZGVzCisgIGlmKC88Ym9va2luZm8+LyB8fCAvPGRvY2luZm8+Lyl7CisgICAgJG1vZGUgPSAxOworICB9CisgIGVsc2lmKC88cmVmZW50cnk+Lyl7CisgICAgJG1vZGUgPSAyOworICB9CisgIGVsc2lmKC88cmVmZW50cnl0aXRsZT48cGhyYXNlW14+XSo+KFtePF0qKTwuKiQvKXsKKyAgICAkbW9kZSA9IDM7CisgICAgJGZpbGVuYW1lID0gJDE7CisKKyAgICAkZmlsZW5hbWUgPX4gcy9zdHJ1Y3QgLy87CisgICAgJGZpbGVuYW1lID1+IHMvdHlwZWRlZiAvLzsKKworICAgIHByaW50ICJGb3VuZCBtYW5wYWdlIGZvciAkZmlsZW5hbWVcbiI7CisgICAgb3BlbiBSRUYsICI+ICRBUkdWWzFdLyRmaWxlbmFtZS5zZ21sIiBvcgorICAgICAgZGllICJDb3VsZG4ndCBvcGVuIG91dHB1dCBmaWxlIFwiJEFSR1ZbMV0vJGZpbGVuYW1lLnNnbWxcIjogJCFcbiI7CisgICAgcHJpbnQgUkVGIDw8RU9GOworPCFET0NUWVBFIHJlZmVudHJ5IFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFY0LjEvL0VOIj4KKworPCEtLSBCRUdJTkZST05UVEFHOiBUaGUgZm9sbG93aW5nIGlzIGZyb250IG1hdHRlciBmb3IgdGhlIHBhcmVudCBib29rIC0tPgorJGZyb250Cis8IS0tIEVOREZST05UVEFHOiBFbmQgZnJvbnQgbWF0dGVyIC0tPgorCiskcmVmZGF0YQorRU9GCisgICAgJHJlZmRhdGEgPSAiIjsKKyAgfQorCisgICMgRXh0cmFjdGlvbgorICBpZigkbW9kZSA9PSAxKXsKKyAgICBjaG9tcCAkXzsKKyAgICAkZnJvbnQgPSAiJGZyb250PCEtLSAkXyAtLT5cbiI7CisgIH0KKyAgZWxzaWYoJG1vZGUgPT0gMil7CisgICAgJHJlZmRhdGEgPSAiJHJlZmRhdGEkXyI7CisgIH0KKyAgZWxzaWYoJG1vZGUgPT0gMyl7CisgICAgIyBUaGVyZSBhcmUgc29tZSBmaXh1cHMgd2hpY2ggbmVlZCB0byBiZSBhcHBsaWVkCisgICAgaWYoLzxcL3JlZm1ldGE+Lyl7CisgICAgICBwcmludCBSRUYgIjxtYW52b2xudW0+OTwvbWFudm9sbnVtPlxuIjsKKyAgICB9CisgICAgaWYoLzxcL3JlZmVudHJ5Pi8peworICAgICAgcHJpbnQgUkVGIDw8RU9GOworPHJlZnNlY3QxPjx0aXRsZT5BYm91dCB0aGlzIGRvY3VtZW50PC90aXRsZT4KKzxwYXJhPgorVGhpcyBkb2N1bWVudGF0aW9uIHdhcyBnZW5lcmF0ZWQgd2l0aCBrZXJuZWwgdmVyc2lvbiAkQVJHVlsyXS4KKzwvcGFyYT4KKzwvcmVmc2VjdDE+CitFT0YKKyAgICB9CisKKyAgICAjIEZvciBzb21lIHJlYXNvbiwgd2UgdGl0bGUgdGhlIHN5bm9wc2lzIHR3aWNlIGluIHRoZSBtYWluIERvY0Jvb2sKKyAgICBpZighIC88dGl0bGU+U3lub3BzaXM8XC90aXRsZT4vKXsKKyAgICAgIGlmKC88cmVmZW50cnl0aXRsZT4vKXsKKwlzL3N0cnVjdCAvLzsKKwlzL3R5cGVkZWYgLy87CisgICAgICB9CisKKyAgICAgIHByaW50IFJFRiAiJF8iOworICAgIH0KKyAgfQorCisgICMgRW5kaW5nIG1vZGVzCisgIGlmKC88XC9ib29raW5mbz4vIHx8IC88XC9kb2NpbmZvPi8peworICAgICRtb2RlID0gMDsKKyAgfQorICBlbHNpZigvPFwvcmVmZW50cnk+Lyl7CisgICAgJG1vZGUgPSAwOworICAgIGNsb3NlIFJFRjsKKyAgfQorfQorCisjIEFuZCBtYWtlIHN1cmUgd2UgZG9uJ3QgcHJvY2VzcyB0aGlzIHVubmVzc2VzYXJpbHkKKyRBUkdWWzBdID1+IHMvXC5zZ21sLy45LzsKK2B0b3VjaCAkQVJHVlswXWA7CmRpZmYgLS1naXQgYS9zY3JpcHRzL3Zlcl9saW51eCBiL3NjcmlwdHMvdmVyX2xpbnV4Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmJiMTk1YTEKLS0tIC9kZXYvbnVsbAorKysgYi9zY3JpcHRzL3Zlcl9saW51eApAQCAtMCwwICsxLDk1IEBACisjIS9iaW4vc2gKKyMgQmVmb3JlIHJ1bm5pbmcgdGhpcyBzY3JpcHQgcGxlYXNlIGVuc3VyZSB0aGF0IHlvdXIgUEFUSCBpcworIyB0eXBpY2FsIGFzIHlvdSB1c2UgZm9yIGNvbXBpbGF0aW9uL2lzdGFsbGF0aW9uLiBJIHVzZQorIyAvYmluIC9zYmluIC91c3IvYmluIC91c3Ivc2JpbiAvdXNyL2xvY2FsL2JpbiwgYnV0IGl0IG1heQorIyBkaWZmZXIgb24geW91ciBzeXN0ZW0uCisjCitQQVRIPS9zYmluOi91c3Ivc2JpbjovYmluOi91c3IvYmluOi91c3IvbG9jYWwvc2JpbjokUEFUSAorZWNobyAnSWYgc29tZSBmaWVsZHMgYXJlIGVtcHR5IG9yIGxvb2sgdW51c3VhbCB5b3UgbWF5IGhhdmUgYW4gb2xkIHZlcnNpb24uJworZWNobyAnQ29tcGFyZSB0byB0aGUgY3VycmVudCBtaW5pbWFsIHJlcXVpcmVtZW50cyBpbiBEb2N1bWVudGF0aW9uL0NoYW5nZXMuJworZWNobyAnICcKKwordW5hbWUgLWEKK2VjaG8gJyAnCisKK2djYyAtLXZlcnNpb24gMj4mMXwgaGVhZCAtbiAxIHwgZ3JlcCAtdiBnY2MgfCBhd2sgXAorJ05SPT0xe3ByaW50ICJHbnUgQyAgICAgICAgICAgICAgICAgIiwgJDF9JworCitnY2MgLS12ZXJzaW9uIDI+JjF8IGdyZXAgZ2NjIHwgYXdrIFwKKydOUj09MXtwcmludCAiR251IEMgICAgICAgICAgICAgICAgICIsICQzfScKKworbWFrZSAtLXZlcnNpb24gMj4mMSB8IGF3ayAtRiwgJ3twcmludCAkMX0nIHwgYXdrIFwKKyAgICAgICcvR05VIE1ha2Uve3ByaW50ICJHbnUgbWFrZSAgICAgICAgICAgICAgIiwkTkZ9JworCitsZCAtdiB8IGF3ayAtRlwpICd7cHJpbnQgJDF9JyB8IGF3ayBcCisnL0JGRC97cHJpbnQgImJpbnV0aWxzICAgICAgICAgICAgICAiLCRORn0gXAorL15HTlUve3ByaW50ICJiaW51dGlscyAgICAgICAgICAgICAgIiwkNH0nCisKK2ZkZm9ybWF0IC0tdmVyc2lvbiB8IGF3ayAtRlwtICd7cHJpbnQgInV0aWwtbGludXggICAgICAgICAgICAiLCAkTkZ9JworCittb3VudCAtLXZlcnNpb24gfCBhd2sgLUZcLSAne3ByaW50ICJtb3VudCAgICAgICAgICAgICAgICAgIiwgJE5GfScKKworZGVwbW9kIC1WICAyPiYxIHwgYXdrICdOUj09MSB7cHJpbnQgIm1vZHVsZS1pbml0LXRvb2xzICAgICAiLCRORn0nCisKK3R1bmUyZnMgMj4mMSB8IGdyZXAgIl50dW5lMmZzIiB8IHNlZCAncy8sLy8nIHwgIGF3ayBcCisnTlI9PTEge3ByaW50ICJlMmZzcHJvZ3MgICAgICAgICAgICAgIiwgJDJ9JworCitmc2NrLmpmcyAtViAyPiYxIHwgZ3JlcCB2ZXJzaW9uIHwgc2VkICdzLywvLycgfCAgYXdrIFwKKydOUj09MSB7cHJpbnQgImpmc3V0aWxzICAgICAgICAgICAgICAiLCAkM30nCisKK3JlaXNlcmZzY2sgLVYgMj4mMSB8IGdyZXAgcmVpc2VyZnNjayB8IGF3ayBcCisnTlI9PTF7cHJpbnQgInJlaXNlcmZzcHJvZ3MgICAgICAgICAiLCAkMn0nCisKK2ZzY2sucmVpc2VyNCAtViAyPiYxIHwgZ3JlcCBmc2NrLnJlaXNlcjQgfCBhd2sgXAorJ05SPT0xe3ByaW50ICJyZWlzZXI0cHJvZ3MgICAgICAgICAgIiwgJDJ9JworCit4ZnNfZGIgLVYgMj4mMSB8IGdyZXAgdmVyc2lvbiB8IGF3ayBcCisnTlI9PTF7cHJpbnQgInhmc3Byb2dzICAgICAgICAgICAgICAiLCAkM30nCisKK2NhcmRtZ3IgLVYgMj4mMXwgZ3JlcCB2ZXJzaW9uIHwgYXdrIFwKKydOUj09MXtwcmludCAicGNtY2lhLWNzICAgICAgICAgICAgICIsICQzfScKKworcXVvdGEgLVYgMj4mMSB8IGdyZXAgdmVyc2lvbiB8IGF3ayBcCisnTlI9PTF7cHJpbnQgInF1b3RhLXRvb2xzICAgICAgICAgICAiLCAkTkZ9JworCitwcHBkIC0tdmVyc2lvbiAyPiYxfCBncmVwIHZlcnNpb24gfCBhd2sgXAorJ05SPT0xe3ByaW50ICJQUFAgICAgICAgICAgICAgICAgICAgIiwgJDN9JworCitpc2RuY3RybCAyPiYxIHwgZ3JlcCB2ZXJzaW9uIHwgYXdrIFwKKydOUj09MXtwcmludCAiaXNkbjRrLXV0aWxzICAgICAgICAgICIsICRORn0nCisKK3Nob3dtb3VudCAtLXZlcnNpb24gMj4mMSB8IGdyZXAgbmZzLXV0aWxzIHwgYXdrIFwKKydOUj09MXtwcmludCAibmZzLXV0aWxzICAgICAgICAgICAgICIsICRORn0nCisKK2xzIC1sIGBsZGQgL2Jpbi9zaCB8IGF3ayAnL2xpYmMve3ByaW50ICQzfSdgIHwgc2VkIFwKKy1lICdzL1wuc28kLy8nIHwgYXdrIC1GJ1suLV0nICAgJ3twcmludCAiTGludXggQyBMaWJyYXJ5ICAgICAgICAiIFwKKyQoTkYtMikiLiIkKE5GLTEpIi4iJE5GfScKKworbGRkIC12ID4gL2Rldi9udWxsIDI+JjEgJiYgbGRkIC12IHx8IGxkZCAtLXZlcnNpb24gfGhlYWQgLW4gMSB8IGF3ayBcCisnTlI9PTF7cHJpbnQgIkR5bmFtaWMgbGlua2VyIChsZGQpICAiLCAkTkZ9JworCitscyAtbCAvdXNyL2xpYi9saWJ7ZyxzdGRjfSsrLnNvICAyPi9kZXYvbnVsbCB8IGF3ayAtRi4gXAorICAgICAgICd7cHJpbnQgIkxpbnV4IEMrKyBMaWJyYXJ5ICAgICAgIiAkNCIuIiQ1Ii4iJDZ9JworCitwcyAtLXZlcnNpb24gMj4mMSB8IGdyZXAgdmVyc2lvbiB8IGF3ayBcCisnTlI9PTF7cHJpbnQgIlByb2NwcyAgICAgICAgICAgICAgICAiLCAkTkZ9JworCitpZmNvbmZpZyAtLXZlcnNpb24gMj4mMSB8IGdyZXAgdG9vbHMgfCBhd2sgXAorJ05SPT0xe3ByaW50ICJOZXQtdG9vbHMgICAgICAgICAgICAgIiwgJE5GfScKKworIyBLYmQgbmVlZHMgJ2xvYWRrZXlzIC1oJywKK2xvYWRrZXlzIC1oIDI+JjEgfCBhd2sgXAorJyhOUj09MSAmJiAoJDMgIX4gL29wdGlvbi8pKSB7cHJpbnQgIktiZCAgICAgICAgICAgICAgICAgICAiLCAkM30nCisKKyMgd2hpbGUgY29uc29sZS10b29scyBuZWVkcyAnbG9hZGtleXMgLVYnLgorbG9hZGtleXMgLVYgMj4mMSB8IGF3ayBcCisnKE5SPT0xICYmICgkMiB+IC9jb25zb2xlLXRvb2xzLykpIHtwcmludCAiQ29uc29sZS10b29scyAgICAgICAgICIsICQzfScKKworZXhwciAtLXYgMj4mMSB8IGF3ayAnTlI9PTF7cHJpbnQgIlNoLXV0aWxzICAgICAgICAgICAgICAiLCAkTkZ9JworCit1ZGV2aW5mbyAtViB8IGF3ayAne3ByaW50ICJ1ZGV2ICAgICAgICAgICAgICAgICAgIiwgJDN9JworCitpZiBbIC1lIC9wcm9jL21vZHVsZXMgXTsgdGhlbgorICAgIFg9YGNhdCAvcHJvYy9tb2R1bGVzIHwgc2VkIC1lICJzLyAuKiQvLyJgCisgICAgZWNobyAiTW9kdWxlcyBMb2FkZWQgICAgICAgICAiJFgKK2ZpCg==