ZGlmZiAtLWdpdCBhL0NoYW5nZXMubWQgYi9DaGFuZ2VzLm1kCmluZGV4IDlmMjQ0OWMuLmVkZGVjMDQgMTAwNjQ0Ci0tLSBhL0NoYW5nZXMubWQKKysrIGIvQ2hhbmdlcy5tZApAQCAtNDAsMTQgKzQwLDggQEAKIAogIyMgUHl0aG9uIDIgdG8gMyBtaWdyYXRpb24KIAotVGhlIHBhdGggc2V0IHdoZW4gcnVubmluZyBidWlsZHMgbm93IG1ha2VzIHRoZSBgcHl0aG9uYCBleGVjdXRhYmxlIHBvaW50IHRvIHB5dGhvbiAzLAotd2hlcmVhcyBvbiBwcmV2aW91cyB2ZXJzaW9ucyBpdCBwb2ludGVkIHRvIHB5dGhvbiAyLiBJZiB5b3Ugc3RpbGwgaGF2ZSBweXRob24gMiBzY3JpcHRzLAoteW91IGNhbiBjaGFuZ2UgdGhlIHNoZWJhbmcgbGluZSB0byB1c2UgYHB5dGhvbjJgIGV4cGxpY2l0bHkuIFRoaXMgb25seSBhcHBsaWVzIGZvcgotc2NyaXB0cyBydW4gZGlyZWN0bHkgZnJvbSBtYWtlZmlsZXMsIG9yIGZyb20gc29vbmcgZ2VucnVsZXMuCi0KLUluIGFkZGl0aW9uLCBgcHl0aG9uXypgIHNvb25nIG1vZHVsZXMgbm8gbG9uZ2VyIGFsbG93IHB5dGhvbiAyLgotCi1QeXRob24gMiBpcyBzbGF0ZWQgZm9yIGNvbXBsZXRlIHJlbW92YWwgaW4gVi4KK1B5dGhvbiAyIGhhcyBiZWVuIGNvbXBsZXRlbHkgcmVtb3ZlZCBmcm9tIHRoZSBidWlsZC4gUGxlYXNlIG1pZ3JhdGUgYW55IHJlbWFpbmluZyB1c2FnZXMgdG8KK1B5dGhvbiAzLCBhbmQgcmVtb3ZlIGFueSB2ZXJzaW9uLXNwZWNpZmljIHByb3BlcnRpZXMgZnJvbSBicCBmaWxlcy4KIAogIyMgU3RvcCByZWZlcmVuY2luZyBzeXNwcm9wX2xpYnJhcnkgZGlyZWN0bHkgZnJvbSBjYyBtb2R1bGVzCiAKZGlmZiAtLWdpdCBhL2JhY2twb3J0ZWRfZml4ZXMvQW5kcm9pZC5icCBiL2JhY2twb3J0ZWRfZml4ZXMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2FlYTU2Ci0tLSAvZGV2L251bGwKKysrIGIvYmFja3BvcnRlZF9maXhlcy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTQ0IEBACisvLyBDb3B5cmlnaHQgMjAyNCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCisgICAgZGVmYXVsdF90ZWFtOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9tZWRpYV9yZWxpYWJpbGl0eSIsCit9CisKK2dlbnJ1bGUgeworICAgIG5hbWU6ICJhcHBsaWVkX2JhY2twb3J0ZWRfZml4ZXMiLAorICAgIHRvb2xzOiBbImFwcGxpZWRfYmFja3BvcnRlZF9maXhlc19wcm9wZXJ0eV93cml0ZXIiXSwKKyAgICBzcmNzOiBbIjphcHBsaWVkX2JhY2twb3J0ZWRfZml4X2JpbnBicyJdLAorICAgIG91dDogWyJhcHBsaWVkX2JhY2twb3J0ZWRfZml4ZXMucHJvcCJdLAorICAgIGNtZDogIiQobG9jYXRpb24gYXBwbGllZF9iYWNrcG9ydGVkX2ZpeGVzX3Byb3BlcnR5X3dyaXRlcikiICsKKyAgICAgICAgIiAtcCAkKGxvY2F0aW9uIGFwcGxpZWRfYmFja3BvcnRlZF9maXhlcy5wcm9wKSIgKworICAgICAgICAiICQoaW4pIiwKK30KKworZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAiYmFja3BvcnRlZF9maXhlc19wcm90b19maWxlIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJiYWNrcG9ydGVkX2ZpeGVzLnByb3RvIiwKKyAgICBdLAorfQorCitqYXZhX2xpYnJhcnkgeworICAgIG5hbWU6ICJiYWNrcG9ydGVkX2ZpeGVzX3Byb3RvIiwKKyAgICBzcmNzOiBbImJhY2twb3J0ZWRfZml4ZXMucHJvdG8iXSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBzZGtfdmVyc2lvbjogImN1cnJlbnQiLAorfQorCitqYXZhX2xpYnJhcnkgeworICAgIG5hbWU6ICJiYWNrcG9ydGVkX2ZpeGVzX2NvbW1vbiIsCisgICAgc3JjczogWyJzcmMvamF2YS9jb20vYW5kcm9pZC9idWlsZC9iYWNrcG9ydGVkZml4ZXMvY29tbW9uLyouamF2YSJdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJiYWNrcG9ydGVkX2ZpeGVzX3Byb3RvIiwKKyAgICAgICAgImd1YXZhIiwKKyAgICBdLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorfQorCitqYXZhX3Rlc3RfaG9zdCB7CisgICAgbmFtZTogImJhY2twb3J0ZWRfZml4ZXNfY29tbW9uX3Rlc3QiLAorICAgIHNyY3M6IFsidGVzdHMvamF2YS9jb20vYW5kcm9pZC9idWlsZC9iYWNrcG9ydGVkZml4ZXMvY29tbW9uLyouamF2YSJdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJiYWNrcG9ydGVkX2ZpeGVzX2NvbW1vbiIsCisgICAgICAgICJiYWNrcG9ydGVkX2ZpeGVzX3Byb3RvIiwKKyAgICAgICAgImp1bml0IiwKKyAgICAgICAgInRydXRoIiwKKyAgICAgICAgInRydXRoLWxpdGVwcm90by1leHRlbnNpb24iLAorICAgICAgICAidHJ1dGgtcHJvdG8tZXh0ZW5zaW9uIiwKKyAgICBdLAorICAgIHRlc3Rfb3B0aW9uczogeworICAgICAgICB1bml0X3Rlc3Q6IHRydWUsCisgICAgfSwKKyAgICB0ZXN0X3N1aXRlczogWyJnZW5lcmFsLXRlc3RzIl0sCit9CisKK2phdmFfbGlicmFyeSB7CisgICAgbmFtZTogImJhY2twb3J0ZWRfZml4ZXNfbWFpbl9saWIiLAorICAgIHNyY3M6IFsic3JjL2phdmEvY29tL2FuZHJvaWQvYnVpbGQvYmFja3BvcnRlZGZpeGVzLyouamF2YSJdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJiYWNrcG9ydGVkX2ZpeGVzX2NvbW1vbiIsCisgICAgICAgICJiYWNrcG9ydGVkX2ZpeGVzX3Byb3RvIiwKKyAgICAgICAgImpjb21tYW5kZXIiLAorICAgICAgICAiZ3VhdmEiLAorICAgIF0sCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCit9CisKK2phdmFfYmluYXJ5X2hvc3QgeworICAgIG5hbWU6ICJhcHBsaWVkX2JhY2twb3J0ZWRfZml4ZXNfcHJvcGVydHlfd3JpdGVyIiwKKyAgICBtYWluX2NsYXNzOiAiY29tLmFuZHJvaWQuYnVpbGQuYmFja3BvcnRlZGZpeGVzLldyaXRlQmFja3BvcnRlZEZpeGVzUHJvcEZpbGUiLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJiYWNrcG9ydGVkX2ZpeGVzX21haW5fbGliIiwKKyAgICBdLAorfQorCitqYXZhX2JpbmFyeV9ob3N0IHsKKyAgICBuYW1lOiAiYmFja3BvcnRlZF9maXhlc19jb21iaW5lciIsCisgICAgbWFpbl9jbGFzczogImNvbS5hbmRyb2lkLmJ1aWxkLmJhY2twb3J0ZWRmaXhlcy5Db21iaW5lQmFja3BvcnRlZEZpeGVzIiwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYmFja3BvcnRlZF9maXhlc19tYWluX2xpYiIsCisgICAgXSwKK30KKworLy8gQ29tYmluZXMgQmFja3BvcnRlZEZpeCBiaW5hcnkgcHJvdG8gZmlsZXMgaW50byBhIHNpbmdsZSBCYWNrcG9ydGVkRml4ZXMgYmluYXJ5IHByb3RvIGZpbGUuCitnZW5ydWxlX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiZGVmYXVsdF9iYWNrcG9ydGVkX2ZpeGVzX2NvbWJpbmVyIiwKKyAgICB0b29sczogWyJiYWNrcG9ydGVkX2ZpeGVzX2NvbWJpbmVyIl0sCisgICAgY21kOiAiJChsb2NhdGlvbiBiYWNrcG9ydGVkX2ZpeGVzX2NvbWJpbmVyKSIgKworICAgICAgICAiIC1vICQob3V0KSIgKworICAgICAgICAiICQoaW4pIiwKK30KKworamF2YV90ZXN0X2hvc3QgeworICAgIG5hbWU6ICJiYWNrcG9ydGVkX2ZpeGVzX21haW5fbGliX3Rlc3QiLAorICAgIHNyY3M6IFsidGVzdHMvamF2YS9jb20vYW5kcm9pZC9idWlsZC9iYWNrcG9ydGVkZml4ZXMvKi5qYXZhIl0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImJhY2twb3J0ZWRfZml4ZXNfbWFpbl9saWIiLAorICAgICAgICAiYmFja3BvcnRlZF9maXhlc19wcm90byIsCisgICAgICAgICJqdW5pdCIsCisgICAgICAgICJ0cnV0aCIsCisgICAgXSwKKyAgICB0ZXN0X29wdGlvbnM6IHsKKyAgICAgICAgdW5pdF90ZXN0OiB0cnVlLAorICAgIH0sCisgICAgdGVzdF9zdWl0ZXM6IFsiZ2VuZXJhbC10ZXN0cyJdLAorfQorCisvLyBDb252ZXJ0cyBCYWNrcHJvdGVkRml4IHRleHQgcHJvdG9zIHRvIGJpbmFyeSBwcm90b3MKK2dlbnJ1bGVfZGVmYXVsdHMgeworICAgIG5hbWU6ICJkZWZhdWx0X2JhY2twb3J0ZWRfZml4X2JpbnBicyIsCisgICAgdG9vbHM6IFsiYXByb3RvYyJdLAorICAgIHRvb2xfZmlsZXM6IFsKKyAgICAgICAgIjpiYWNrcG9ydGVkX2ZpeGVzX3Byb3RvX2ZpbGUiLAorICAgIF0sCisgICAgY21kOiAiJChsb2NhdGlvbiBhcHJvdG9jKSAgIiArCisgICAgICAgICIgLS1lbmNvZGU9Y29tLmFuZHJvaWQuYnVpbGQuYmFja3BvcnRlZGZpeGVzLkJhY2twb3J0ZWRGaXgiICsKKyAgICAgICAgIiAgJChsb2NhdGlvbiA6YmFja3BvcnRlZF9maXhlc19wcm90b19maWxlKSIgKworICAgICAgICAiIDwgJChpbikiICsKKyAgICAgICAgIiA+ICQob3V0KTsgZWNobyAkKG91dCkiLAorfQorCitnZW5zcmNzIHsKKyAgICBuYW1lOiAiYXBwbGllZF9iYWNrcG9ydGVkX2ZpeF9iaW5wYnMiLAorICAgIGRlZmF1bHRzOiBbImRlZmF1bHRfYmFja3BvcnRlZF9maXhfYmlucGJzIl0sCisgICAgb3V0cHV0X2V4dGVuc2lvbjogImJpbnBiIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJhcHBsaWVkX2ZpeGVzLyoudHh0cGIiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9iYWNrcG9ydGVkX2ZpeGVzL09XTkVSUyBiL2JhY2twb3J0ZWRfZml4ZXMvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMTc2YmYKLS0tIC9kZXYvbnVsbAorKysgYi9iYWNrcG9ydGVkX2ZpeGVzL09XTkVSUwpAQCAtMCwwICsxLDMgQEAKK2Vzc2lja0Bnb29nbGUuY29tCituY2hhbGtvQGdvb2dsZS5jb20KK3BvcnRtYW5uY0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL3Rvb2xzL3VwZGF0ZV9ib290bG9hZGVyX3JhZGlvX2ltYWdlLm1rIGIvYmFja3BvcnRlZF9maXhlcy9hcHBsaWVkX2ZpeGVzL2tpMzUwMDM3MDIzLnR4dHBiCnNpbWlsYXJpdHkgaW5kZXggNzMlCnJlbmFtZSBmcm9tIGNvcmUvdGFza3MvdG9vbHMvdXBkYXRlX2Jvb3Rsb2FkZXJfcmFkaW9faW1hZ2UubWsKcmVuYW1lIHRvIGJhY2twb3J0ZWRfZml4ZXMvYXBwbGllZF9maXhlcy9raTM1MDAzNzAyMy50eHRwYgppbmRleCAwZWJmMjQ3Li40NTZhN2FlIDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL3Rvb2xzL3VwZGF0ZV9ib290bG9hZGVyX3JhZGlvX2ltYWdlLm1rCisrKyBiL2JhY2twb3J0ZWRfZml4ZXMvYXBwbGllZF9maXhlcy9raTM1MDAzNzAyMy50eHRwYgpAQCAtNCwxNCArNCwxNiBAQAogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogIwotIyAgICAgIGh0dHA6I3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyMgcHJvdG8tZmlsZTogLi4vYmFja3BvcnRlZF9maXhlcy5wcm90bworIyBwcm90by1tZXNzYWdlOiBCYWNrcG9ydGVkRml4CiAKLWlmZXEgKCQoVVNFU19ERVZJQ0VfR09PR0xFX1pVTUEpLHRydWUpCi0gICAgLWluY2x1ZGUgdmVuZG9yL2dvb2dsZV9kZXZpY2VzL3p1bWEvcHJlYnVpbHRzL21pc2NfYmlucy91cGRhdGVfYm9vdGxvYWRlcl9yYWRpb19pbWFnZS5tawotZW5kaWYKK2tub3duX2lzc3VlOiAzNTAwMzcwMjMKK2FsaWFzOiAxCmRpZmYgLS1naXQgYS9iYWNrcG9ydGVkX2ZpeGVzL2JhY2twb3J0ZWRfZml4ZXMucHJvdG8gYi9iYWNrcG9ydGVkX2ZpeGVzL2JhY2twb3J0ZWRfZml4ZXMucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE2MThlZQotLS0gL2Rldi9udWxsCisrKyBiL2JhY2twb3J0ZWRfZml4ZXMvYmFja3BvcnRlZF9maXhlcy5wcm90bwpAQCAtMCwwICsxLDM3IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitzeW50YXggPSAicHJvdG8yIjsKKworcGFja2FnZSBjb20uYW5kcm9pZC5idWlsZC5iYWNrcG9ydGVkZml4ZXM7CisKK29wdGlvbiBqYXZhX211bHRpcGxlX2ZpbGVzID0gdHJ1ZTsKKworLy8gQSBsaXN0IG9mIGJhY2twb3J0ZWQgZml4ZXMuCittZXNzYWdlIEJhY2twb3J0ZWRGaXhlcyB7CisgIHJlcGVhdGVkIEJhY2twb3J0ZWRGaXggZml4ZXMgPSAxOworfQorCisvLyBBIGtub3duIGlzc3VlIGFwcHJvdmVkIGZvciByZXBvcnRpbmcgQnVpbGQuZ2V0QmFja3BvcnRlZEZpeFN0YXR1cworbWVzc2FnZSBCYWNrcG9ydGVkRml4IHsKKworICAvLyBUaGUgaXNzdWUgaWQgZnJvbSB0aGUgcHVibGljIGJ1ZyB0cmFja2VyCisgIC8vIGh0dHBzOi8vaXNzdWV0cmFja2VyLmdvb2dsZS5jb20vaXNzdWVzL3trbm93bl9pc3N1ZX0KKyAgb3B0aW9uYWwgaW50NjQga25vd25faXNzdWUgPSAxOworICAvLyBUaGUgYWxpYXMgZm9yIHRoZSBrbm93biBpc3N1ZS4KKyAgLy8gMSAtIDEwMjMgYXJlIHZhbGlkIGFsaWFzZXMKKyAgLy8gTXVzdCBiZSB1bmlxdWUgYWNyb3NzIGFsbCBiYWNrcG9ydGVkIGZpeGVzLgorICBvcHRpb25hbCBpbnQzMiBhbGlhcyA9IDI7Cit9CisKZGlmZiAtLWdpdCBhL2JhY2twb3J0ZWRfZml4ZXMvc3JjL2phdmEvY29tL2FuZHJvaWQvYnVpbGQvYmFja3BvcnRlZGZpeGVzL0NvbWJpbmVCYWNrcG9ydGVkRml4ZXMuamF2YSBiL2JhY2twb3J0ZWRfZml4ZXMvc3JjL2phdmEvY29tL2FuZHJvaWQvYnVpbGQvYmFja3BvcnRlZGZpeGVzL0NvbWJpbmVCYWNrcG9ydGVkRml4ZXMuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTkyY2MxCi0tLSAvZGV2L251bGwKKysrIGIvYmFja3BvcnRlZF9maXhlcy9zcmMvamF2YS9jb20vYW5kcm9pZC9idWlsZC9iYWNrcG9ydGVkZml4ZXMvQ29tYmluZUJhY2twb3J0ZWRGaXhlcy5qYXZhCkBAIC0wLDAgKzEsNjUgQEAKKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmJ1aWxkLmJhY2twb3J0ZWRmaXhlczsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmJhY2twb3J0ZWRmaXhlcy5jb21tb24uUGFyc2VyOworCitpbXBvcnQgY29tLmJldXN0Lmpjb21tYW5kZXIuSkNvbW1hbmRlcjsKK2ltcG9ydCBjb20uYmV1c3QuamNvbW1hbmRlci5QYXJhbWV0ZXI7CitpbXBvcnQgY29tLmJldXN0Lmpjb21tYW5kZXIuY29udmVydGVycy5GaWxlQ29udmVydGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisKKy8qKiBDcmVhdGVzIGEgQmFja3BvcnRlZEZpeGVzIGJpbmFyeSBwcm90byBmaWxlIGZyb20gYSBsaXN0IG9mIEJhY2twb3J0ZWRGaXggcHJvdG8gYmluYXJ5IGZpbGVzLiAqLworcHVibGljIGZpbmFsIGNsYXNzIENvbWJpbmVCYWNrcG9ydGVkRml4ZXMgeworCisgICAgQFBhcmFtZXRlcihkZXNjcmlwdGlvbiA9ICJCYWNrcG9ydGVkRml4IHByb3RvIGJpbmFyeSBmaWxlcyIsCisgICAgICAgICAgICBjb252ZXJ0ZXIgPSBGaWxlQ29udmVydGVyLmNsYXNzLAorICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQorICAgIExpc3Q8RmlsZT4gZml4RmlsZXM7CisgICAgQFBhcmFtZXRlcihkZXNjcmlwdGlvbiA9ICJXcml0ZSB0aGUgQmFja3BvcnRlZEZpeGVzIHByb3RvIGJpbmFyeSB0byB0aGlzIGZpbGUiLAorICAgICAgICAgICAgbmFtZXMgPSB7Ii0tb3V0IiwiLW8ifSwKKyAgICAgICAgICAgIGNvbnZlcnRlciA9IEZpbGVDb252ZXJ0ZXIuY2xhc3MsCisgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCisgICAgRmlsZSBvdXRGaWxlOworCisgICAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nLi4uIGFyZ3YpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBDb21iaW5lQmFja3BvcnRlZEZpeGVzIG1haW4gPSBuZXcgQ29tYmluZUJhY2twb3J0ZWRGaXhlcygpOworICAgICAgICBKQ29tbWFuZGVyLm5ld0J1aWxkZXIoKS5hZGRPYmplY3QobWFpbikuYnVpbGQoKS5wYXJzZShhcmd2KTsKKyAgICAgICAgbWFpbi5ydW4oKTsKKyAgICB9CisKKyAgICBDb21iaW5lQmFja3BvcnRlZEZpeGVzKCkgeworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5ICh2YXIgb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0RmlsZSkpIHsKKyAgICAgICAgICAgIHZhciBmaXhlcyA9IFBhcnNlci5wYXJzZUJhY2twb3J0ZWRGaXhGaWxlcyhmaXhGaWxlcyk7CisgICAgICAgICAgICB3cml0ZUJhY2twb3J0ZWRGaXhlcyhmaXhlcywgb3V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHdyaXRlQmFja3BvcnRlZEZpeGVzKEJhY2twb3J0ZWRGaXhlcyBmaXhlcywgT3V0cHV0U3RyZWFtIG91dCkKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGZpeGVzLndyaXRlVG8ob3V0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9iYWNrcG9ydGVkX2ZpeGVzL3NyYy9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkL2JhY2twb3J0ZWRmaXhlcy9Xcml0ZUJhY2twb3J0ZWRGaXhlc1Byb3BGaWxlLmphdmEgYi9iYWNrcG9ydGVkX2ZpeGVzL3NyYy9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkL2JhY2twb3J0ZWRmaXhlcy9Xcml0ZUJhY2twb3J0ZWRGaXhlc1Byb3BGaWxlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZmYjRhYwotLS0gL2Rldi9udWxsCisrKyBiL2JhY2twb3J0ZWRfZml4ZXMvc3JjL2phdmEvY29tL2FuZHJvaWQvYnVpbGQvYmFja3BvcnRlZGZpeGVzL1dyaXRlQmFja3BvcnRlZEZpeGVzUHJvcEZpbGUuamF2YQpAQCAtMCwwICsxLDg5IEBACisKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5idWlsZC5iYWNrcG9ydGVkZml4ZXM7CisKK2ltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OworCitpbXBvcnQgY29tLmFuZHJvaWQuYnVpbGQuYmFja3BvcnRlZGZpeGVzLmNvbW1vbi5QYXJzZXI7CisKK2ltcG9ydCBjb20uYmV1c3QuamNvbW1hbmRlci5KQ29tbWFuZGVyOworaW1wb3J0IGNvbS5iZXVzdC5qY29tbWFuZGVyLlBhcmFtZXRlcjsKK2ltcG9ydCBjb20uYmV1c3QuamNvbW1hbmRlci5jb252ZXJ0ZXJzLkZpbGVDb252ZXJ0ZXI7CitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uaW8uRmlsZXM7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKK2ltcG9ydCBqYXZhLmlvLldyaXRlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworCisvKioKKyAqIENyZWF0ZXMgYmFja3BvcnRlZCBmaXggcHJvcGVydGllcyBmaWxlLgorICoKKyAqIDxwPldyaXRlcyBCaXRTZXQgb2YgYmFja3BvcnRlZCBmaXggYWxpYXNlcyBmcm9tIGEgbGlzdCBvZiBCYWNrcG9ydGVkRml4IHByb3RvIGJpbmFyeSBmaWxlcyBhbmQKKyAqIHdyaXRlcyB0aGUgcHJvcGVydHkge0B2YWx1ZSBQUk9QRVJUWV9OQU1FfSB0byBhIGZpbGUuCisgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBXcml0ZUJhY2twb3J0ZWRGaXhlc1Byb3BGaWxlIHsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUk9QRVJUWV9OQU1FID0gInJvLmJ1aWxkLmJhY2twb3J0ZWRfZml4ZXMuYWxpYXNfYml0c2V0LmxvbmdfbGlzdCI7CisgICAgQFBhcmFtZXRlcihkZXNjcmlwdGlvbiA9ICJCYWNrcG9ydGVkRml4IHByb3RvIGJpbmFyeSBmaWxlcyIsCisgICAgICAgICAgICBjb252ZXJ0ZXIgPSBGaWxlQ29udmVydGVyLmNsYXNzLAorICAgICAgICAgICAgcmVxdWlyZWQgPSB0cnVlKQorICAgIExpc3Q8RmlsZT4gZml4RmlsZXM7CisgICAgQFBhcmFtZXRlcihkZXNjcmlwdGlvbiA9ICJUaGUgZmlsZSB0byB3cml0ZSB0aGUgcHJvcGVydHkgdmFsdWUgdG8uIiwKKyAgICAgICAgICAgIG5hbWVzID0geyItLXByb3BlcnR5X2ZpbGUiLCAiLXAifSwKKyAgICAgICAgICAgIGNvbnZlcnRlciA9IEZpbGVDb252ZXJ0ZXIuY2xhc3MsCisgICAgICAgICAgICByZXF1aXJlZCA9IHRydWUpCisgICAgRmlsZSBwcm9wZXJ0eUZpbGU7CisKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmcuLi4gYXJndikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFdyaXRlQmFja3BvcnRlZEZpeGVzUHJvcEZpbGUgbWFpbiA9IG5ldyBXcml0ZUJhY2twb3J0ZWRGaXhlc1Byb3BGaWxlKCk7CisgICAgICAgIEpDb21tYW5kZXIubmV3QnVpbGRlcigpLmFkZE9iamVjdChtYWluKS5idWlsZCgpLnBhcnNlKGFyZ3YpOworICAgICAgICBtYWluLnJ1bigpOworICAgIH0KKworICAgIFdyaXRlQmFja3BvcnRlZEZpeGVzUHJvcEZpbGUoKSB7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIHJ1bigpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICB0cnkgKHZhciBvdXQgPSBGaWxlcy5uZXdXcml0ZXIocHJvcGVydHlGaWxlLCBVVEZfOCkpIHsKKyAgICAgICAgICAgIHZhciBmaXhlcyA9IFBhcnNlci5wYXJzZUJhY2twb3J0ZWRGaXhGaWxlcyhmaXhGaWxlcyk7CisgICAgICAgICAgICB3cml0ZUZpeGVzQXNBbGlhc0JpdFNldChmaXhlcywgb3V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyB2b2lkIHdyaXRlRml4ZXNBc0FsaWFzQml0U2V0KEJhY2twb3J0ZWRGaXhlcyBmaXhlcywgV3JpdGVyIG91dCkgeworICAgICAgICBQcmludFdyaXRlciBwcmludFdyaXRlciA9IG5ldyBQcmludFdyaXRlcihvdXQpOworICAgICAgICBwcmludFdyaXRlci5wcmludGxuKCIjIFRoZSBmb2xsb3dpbmcgYmFja3BvcnRlZCBmaXhlcyBoYXZlIGJlZW4gYXBwbGllZCIpOworICAgICAgICBmb3IgKHZhciBmIDogZml4ZXMuZ2V0Rml4ZXNMaXN0KCkpIHsKKyAgICAgICAgICAgIHByaW50V3JpdGVyLnByaW50ZigiIyBodHRwczovL2lzc3VldHJhY2tlci5nb29nbGUuY29tL2lzc3Vlcy8lZCB3aXRoIGFsaWFzICVkIiwKKyAgICAgICAgICAgICAgICAgICAgZi5nZXRLbm93bklzc3VlKCksIGYuZ2V0QWxpYXMoKSk7CisgICAgICAgICAgICBwcmludFdyaXRlci5wcmludGxuKCk7CisgICAgICAgIH0KKyAgICAgICAgdmFyIGJzQXJyYXkgPSBQYXJzZXIuZ2V0Qml0U2V0QXJyYXkoCisgICAgICAgICAgICAgICAgZml4ZXMuZ2V0Rml4ZXNMaXN0KCkuc3RyZWFtKCkubWFwVG9JbnQoQmFja3BvcnRlZEZpeDo6Z2V0QWxpYXMpLnRvQXJyYXkoKSk7CisgICAgICAgIFN0cmluZyBic1N0cmluZyA9IEFycmF5cy5zdHJlYW0oYnNBcnJheSkubWFwVG9PYmooTG9uZzo6dG9TdHJpbmcpLmNvbGxlY3QoCisgICAgICAgICAgICAgICAgQ29sbGVjdG9ycy5qb2luaW5nKCIsIikpOworICAgICAgICBwcmludFdyaXRlci5wcmludGYoIiVzPSVzIiwgUFJPUEVSVFlfTkFNRSwgYnNTdHJpbmcpOworICAgICAgICBwcmludFdyaXRlci5wcmludGxuKCk7CisgICAgICAgIGlmIChwcmludFdyaXRlci5jaGVja0Vycm9yKCkpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJUaGVyZSB3YXMgYW4gZXJyb3Igd3JpdGluZyB0byAiICsgb3V0LnRvU3RyaW5nKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmFja3BvcnRlZF9maXhlcy9zcmMvamF2YS9jb20vYW5kcm9pZC9idWlsZC9iYWNrcG9ydGVkZml4ZXMvY29tbW9uL1BhcnNlci5qYXZhIGIvYmFja3BvcnRlZF9maXhlcy9zcmMvamF2YS9jb20vYW5kcm9pZC9idWlsZC9iYWNrcG9ydGVkZml4ZXMvY29tbW9uL1BhcnNlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxODBmZGMKLS0tIC9kZXYvbnVsbAorKysgYi9iYWNrcG9ydGVkX2ZpeGVzL3NyYy9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkL2JhY2twb3J0ZWRmaXhlcy9jb21tb24vUGFyc2VyLmphdmEKQEAgLTAsMCArMSwxNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBjb20uYW5kcm9pZC5idWlsZC5iYWNrcG9ydGVkZml4ZXMuY29tbW9uOworCitpbXBvcnQgc3RhdGljIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucy5jaGVja05vdE51bGw7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5iYWNrcG9ydGVkZml4ZXMuQmFja3BvcnRlZEZpeDsKK2ltcG9ydCBjb20uYW5kcm9pZC5idWlsZC5iYWNrcG9ydGVkZml4ZXMuQmFja3BvcnRlZEZpeGVzOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24uYmFzZS5UaHJvd2FibGVzOworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLmNvbGxlY3QuSW1tdXRhYmxlTGlzdDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVOb3RGb3VuZEV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS51dGlsLkJpdFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcjsKK2ltcG9ydCBqYXZhLnV0aWwuc3RyZWFtLkNvbGxlY3RvcnM7CisKKworLyoqIFN0YXRpYyB1dGlsaXRpZXMgZm9yIHdvcmtpbmcgd2l0aCB7QGxpbmsgQmFja3BvcnRlZEZpeGVzfS4gKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBQYXJzZXIgeworCisgICAgLyoqIENyZWF0ZXMgbGlzdCBvZiBGaWxlSW5wdXRTdHJlYW1zIGZvciBhIGxpc3Qgb2YgZmlsZXMuICovCisgICAgcHVibGljIHN0YXRpYyBJbW11dGFibGVMaXN0PEZpbGVJbnB1dFN0cmVhbT4gZ2V0RmlsZUlucHV0U3RyZWFtcyhMaXN0PEZpbGU+IGZpeEZpbGVzKSB0aHJvd3MKKyAgICAgICAgICAgIEZpbGVOb3RGb3VuZEV4Y2VwdGlvbiB7CisgICAgICAgIHZhciBzdHJlYW1zID0gSW1tdXRhYmxlTGlzdC48RmlsZUlucHV0U3RyZWFtPmJ1aWxkZXIoKTsKKyAgICAgICAgZm9yICh2YXIgZiA6IGZpeEZpbGVzKSB7CisgICAgICAgICAgICBzdHJlYW1zLmFkZChuZXcgRmlsZUlucHV0U3RyZWFtKGYpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RyZWFtcy5idWlsZCgpOworICAgIH0KKworICAgIC8qKiBDb252ZXJ0cyBhIGxpc3Qgb2YgYmFja3BvcnRlZCBmaXggYWxpYXNlcyBpbnRvIGEgbG9uZyBhcnJheSByZXByZXNlbnRpbmcgYSB7QGxpbmsgQml0U2V0fSAqLworICAgIHB1YmxpYyBzdGF0aWMgbG9uZ1tdIGdldEJpdFNldEFycmF5KGludFtdIGFsaWFzZXMpIHsKKyAgICAgICAgQml0U2V0IGJzID0gbmV3IEJpdFNldCgpOworICAgICAgICBmb3IgKGludCBhIDogYWxpYXNlcykgeworICAgICAgICAgICAgYnMuc2V0KGEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBicy50b0xvbmdBcnJheSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSB7QGxpbmsgQmFja3BvcnRlZEZpeGVzfSBmcm9tIGEgbGlzdCBvZiB7QGxpbmsgQmFja3BvcnRlZEZpeH0gYmluYXJ5IHByb3RvIHN0cmVhbXMuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBCYWNrcG9ydGVkRml4ZXMgcGFyc2VCYWNrcG9ydGVkRml4RmlsZXMoTGlzdDxGaWxlPiBmaXhGaWxlcykKKyAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gZml4RmlsZXMuc3RyZWFtKCkubWFwKFBhcnNlcjo6dHVuZWxGaWxlSW5wdXRTdHJlYW0pCisgICAgICAgICAgICAgICAgICAgIC5tYXAoUGFyc2VyOjp0dW5uZWxQYXJzZSkKKyAgICAgICAgICAgICAgICAgICAgLnNvcnRlZChDb21wYXJhdG9yLmNvbXBhcmluZyhCYWNrcG9ydGVkRml4OjpnZXRLbm93bklzc3VlKSkKKyAgICAgICAgICAgICAgICAgICAgLmNvbGxlY3QoZml4Q29sbGVjdG9yKCkpOworCisgICAgICAgIH0gY2F0Y2ggKFR1bm5lbEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBlLnJldGhyb3coRmlsZU5vdEZvdW5kRXhjZXB0aW9uLmNsYXNzLCBJT0V4Y2VwdGlvbi5jbGFzcyk7CisgICAgICAgIH0KKyAgICB9CisKKworICAgIHByaXZhdGUgc3RhdGljIENvbGxlY3RvcjxCYWNrcG9ydGVkRml4LCA/LCBCYWNrcG9ydGVkRml4ZXM+IGZpeENvbGxlY3RvcigpIHsKKyAgICAgICAgcmV0dXJuIENvbGxlY3RvcnMuY29sbGVjdGluZ0FuZFRoZW4oQ29sbGVjdG9ycy50b0xpc3QoKSwgZml4TGlzdCAtPiB7CisgICAgICAgICAgICB2YXIgcmVzdWx0ID0gQmFja3BvcnRlZEZpeGVzLm5ld0J1aWxkZXIoKTsKKyAgICAgICAgICAgIHJlc3VsdC5hZGRBbGxGaXhlcyhmaXhMaXN0KTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQuYnVpbGQoKTsKKyAgICAgICAgfSk7CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgRmlsZUlucHV0U3RyZWFtIHR1bmVsRmlsZUlucHV0U3RyZWFtKEZpbGUgZmlsZSkgdGhyb3dzIFR1bm5lbEV4Y2VwdGlvbiB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEZpbGVJbnB1dFN0cmVhbShmaWxlKTsKKyAgICAgICAgfSBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBUdW5uZWxFeGNlcHRpb24oZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwcml2YXRlIHN0YXRpYyBCYWNrcG9ydGVkRml4IHR1bm5lbFBhcnNlKElucHV0U3RyZWFtIHMpIHRocm93cyBUdW5uZWxFeGNlcHRpb24geworICAgICAgICB0cnkgeworICAgICAgICAgICAgdmFyIGZpeCA9IEJhY2twb3J0ZWRGaXgucGFyc2VGcm9tKHMpOworICAgICAgICAgICAgcy5jbG9zZSgpOworICAgICAgICAgICAgcmV0dXJuIGZpeDsKKyAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IFR1bm5lbEV4Y2VwdGlvbihlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFR1bm5lbEV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24geworICAgICAgICBUdW5uZWxFeGNlcHRpb24oRXhjZXB0aW9uIGNhdXNlKSB7CisgICAgICAgICAgICBzdXBlcigiSWYgeW91IHNlZSB0aGlzIFR1bm5lbEV4Y2VwdGlvbiBzb21ldGhpbmcgd2VudCB3cm9uZy4gIEl0IHNob3VsZCBhbHdheXMgYmUgcmV0aHJvd24gYXMgdGhlIGNhdXNlLiIsIGNhdXNlKTsKKyAgICAgICAgfQorCisgICAgICAgIDxYIGV4dGVuZHMgRXhjZXB0aW9uPiBSdW50aW1lRXhjZXB0aW9uIHJldGhyb3coQ2xhc3M8WD4gZXhjZXB0aW9uQ2xhenopIHRocm93cyBYIHsKKyAgICAgICAgICAgIGNoZWNrTm90TnVsbChleGNlcHRpb25DbGF6eik7CisgICAgICAgICAgICBUaHJvd2FibGVzLnRocm93SWZJbnN0YW5jZU9mKGdldENhdXNlKCksIGV4Y2VwdGlvbkNsYXp6KTsKKyAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgZ2V0Q2F1c2UoKSwKKyAgICAgICAgICAgICAgICAgICAgInJldGhyb3coJXMpIGRvZXNuJ3QgbWF0Y2ggdW5kZXJseWluZyBleGNlcHRpb24iLCBleGNlcHRpb25DbGF6eik7CisgICAgICAgIH0KKworICAgICAgICBwdWJsaWMgPFgxIGV4dGVuZHMgRXhjZXB0aW9uLCBYMiBleHRlbmRzIEV4Y2VwdGlvbj4gUnVudGltZUV4Y2VwdGlvbiByZXRocm93KAorICAgICAgICAgICAgICAgIENsYXNzPFgxPiBleGNlcHRpb25DbGF6ejEsIENsYXNzPFgyPiBleGNlcHRpb25DbGF6ejIpIHRocm93cyBYMSwgWDIgeworICAgICAgICAgICAgY2hlY2tOb3ROdWxsKGV4Y2VwdGlvbkNsYXp6MSk7CisgICAgICAgICAgICBjaGVja05vdE51bGwoZXhjZXB0aW9uQ2xhenoyKTsKKyAgICAgICAgICAgIFRocm93YWJsZXMudGhyb3dJZkluc3RhbmNlT2YoZ2V0Q2F1c2UoKSwgZXhjZXB0aW9uQ2xhenoxKTsKKyAgICAgICAgICAgIFRocm93YWJsZXMudGhyb3dJZkluc3RhbmNlT2YoZ2V0Q2F1c2UoKSwgZXhjZXB0aW9uQ2xhenoyKTsKKyAgICAgICAgICAgIHRocm93IGV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgZ2V0Q2F1c2UoKSwKKyAgICAgICAgICAgICAgICAgICAgInJldGhyb3coJXMsICVzKSBkb2Vzbid0IG1hdGNoIHVuZGVybHlpbmcgZXhjZXB0aW9uIiwKKyAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uQ2xhenoxLAorICAgICAgICAgICAgICAgICAgICBleGNlcHRpb25DbGF6ejIpOworICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgQ2xhc3NDYXN0RXhjZXB0aW9uIGV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICBUaHJvd2FibGUgY2F1c2UsIFN0cmluZyBtZXNzYWdlLCBPYmplY3QuLi4gZm9ybWF0QXJncykgeworICAgICAgICAgICAgQ2xhc3NDYXN0RXhjZXB0aW9uIHJlc3VsdCA9IG5ldyBDbGFzc0Nhc3RFeGNlcHRpb24oU3RyaW5nLmZvcm1hdChtZXNzYWdlLCBmb3JtYXRBcmdzKSk7CisgICAgICAgICAgICByZXN1bHQuaW5pdENhdXNlKGNhdXNlKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKworICAgIH0KKworICAgIHByaXZhdGUgUGFyc2VyKCkgeworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JhY2twb3J0ZWRfZml4ZXMvdGVzdHMvamF2YS9jb20vYW5kcm9pZC9idWlsZC9iYWNrcG9ydGVkZml4ZXMvQ29tYmluZUJhY2twb3J0ZWRGaXhlc1Rlc3QuamF2YSBiL2JhY2twb3J0ZWRfZml4ZXMvdGVzdHMvamF2YS9jb20vYW5kcm9pZC9idWlsZC9iYWNrcG9ydGVkZml4ZXMvQ29tYmluZUJhY2twb3J0ZWRGaXhlc1Rlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWQ1ZjFlCi0tLSAvZGV2L251bGwKKysrIGIvYmFja3BvcnRlZF9maXhlcy90ZXN0cy9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkL2JhY2twb3J0ZWRmaXhlcy9Db21iaW5lQmFja3BvcnRlZEZpeGVzVGVzdC5qYXZhCkBAIC0wLDAgKzEsNDEgQEAKKworLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLmJ1aWxkLmJhY2twb3J0ZWRmaXhlczsKKworaW1wb3J0IGNvbS5nb29nbGUuY29tbW9uLnRydXRoLlRydXRoOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CisKK2ltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworCisvKiogVGVzdHMgZm9yIHtAbGluayBDb21iaW5lQmFja3BvcnRlZEZpeGVzfS4gKi8KK3B1YmxpYyBjbGFzcyBDb21iaW5lQmFja3BvcnRlZEZpeGVzVGVzdCB7CisKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgd3JpdGVCYWNrcG9ydGVkRml4ZXNfZGVmYXVsdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIC8vIE5vdCBtdWNoIG9mIGEgdGVzdCwgYnV0IHRoZXJlIGlzIG5vdCBtdWNoIHRvIHRlc3QuCisgICAgICAgIEJhY2twb3J0ZWRGaXhlcyBmaXhlcyA9IEJhY2twb3J0ZWRGaXhlcy5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuYWRkRml4ZXMoQmFja3BvcnRlZEZpeC5uZXdCdWlsZGVyKCkuc2V0S25vd25Jc3N1ZSgxMjMpLmJ1aWxkKCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIHZhciByZXN1bHQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7CisgICAgICAgIENvbWJpbmVCYWNrcG9ydGVkRml4ZXMud3JpdGVCYWNrcG9ydGVkRml4ZXMoZml4ZXMsIHJlc3VsdCk7CisgICAgICAgIFRydXRoLmFzc2VydFRoYXQoQmFja3BvcnRlZEZpeGVzLnBhcnNlRnJvbShyZXN1bHQudG9CeXRlQXJyYXkoKSkpCisgICAgICAgICAgICAgICAgLmlzRXF1YWxUbyhmaXhlcyk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvYmFja3BvcnRlZF9maXhlcy90ZXN0cy9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkL2JhY2twb3J0ZWRmaXhlcy9Xcml0ZUJhY2twb3J0ZWRGaXhlc1Byb3BGaWxlVGVzdC5qYXZhIGIvYmFja3BvcnRlZF9maXhlcy90ZXN0cy9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkL2JhY2twb3J0ZWRmaXhlcy9Xcml0ZUJhY2twb3J0ZWRGaXhlc1Byb3BGaWxlVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMDljMTUKLS0tIC9kZXYvbnVsbAorKysgYi9iYWNrcG9ydGVkX2ZpeGVzL3Rlc3RzL2phdmEvY29tL2FuZHJvaWQvYnVpbGQvYmFja3BvcnRlZGZpeGVzL1dyaXRlQmFja3BvcnRlZEZpeGVzUHJvcEZpbGVUZXN0LmphdmEKQEAgLTAsMCArMSw2NCBAQAorCisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuYnVpbGQuYmFja3BvcnRlZGZpeGVzOworCitpbXBvcnQgY29tLmdvb2dsZS5jb21tb24udHJ1dGguVHJ1dGg7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKKworaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7CitpbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7CisKKy8qKiBUZXN0cyBmb3Ige0BsaW5rIFdyaXRlQmFja3BvcnRlZEZpeGVzUHJvcEZpbGV9LiAqLworcHVibGljIGNsYXNzIFdyaXRlQmFja3BvcnRlZEZpeGVzUHJvcEZpbGVUZXN0IHsKKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB3cml0ZUZpeGVzQXNBbGlhc0JpdFNldF9kZWZhdWx0KCkgeworICAgICAgICBCYWNrcG9ydGVkRml4ZXMgZml4ZXMgPSBCYWNrcG9ydGVkRml4ZXMubmV3QnVpbGRlcigpLmJ1aWxkKCk7CisgICAgICAgIHZhciByZXN1bHQgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisKKyAgICAgICAgV3JpdGVCYWNrcG9ydGVkRml4ZXNQcm9wRmlsZS53cml0ZUZpeGVzQXNBbGlhc0JpdFNldChmaXhlcywgbmV3IFByaW50V3JpdGVyKHJlc3VsdCkpOworCisgICAgICAgIFRydXRoLmFzc2VydFRoYXQocmVzdWx0LnRvU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgLmlzRXF1YWxUbygiIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIGZvbGxvd2luZyBiYWNrcG9ydGVkIGZpeGVzIGhhdmUgYmVlbiBhcHBsaWVkCisgICAgICAgICAgICAgICAgICAgICAgICByby5idWlsZC5iYWNrcG9ydGVkX2ZpeGVzLmFsaWFzX2JpdHNldC5sb25nX2xpc3Q9CisgICAgICAgICAgICAgICAgICAgICAgICAiIiIpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgd3JpdGVGaXhlc0FzQWxpYXNCaXRTZXRfc29tZSgpIHsKKyAgICAgICAgQmFja3BvcnRlZEZpeGVzIGZpeGVzID0gQmFja3BvcnRlZEZpeGVzLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5hZGRGaXhlcyhCYWNrcG9ydGVkRml4Lm5ld0J1aWxkZXIoKS5zZXRLbm93bklzc3VlKDEyMzRMKS5zZXRBbGlhcygxKSkKKyAgICAgICAgICAgICAgICAuYWRkRml4ZXMoQmFja3BvcnRlZEZpeC5uZXdCdWlsZGVyKCkuc2V0S25vd25Jc3N1ZSgzTCkuc2V0QWxpYXMoNjUpKQorICAgICAgICAgICAgICAgIC5hZGRGaXhlcyhCYWNrcG9ydGVkRml4Lm5ld0J1aWxkZXIoKS5zZXRLbm93bklzc3VlKDRMKS5zZXRBbGlhcyg2NykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIHZhciByZXN1bHQgPSBuZXcgU3RyaW5nV3JpdGVyKCk7CisKKyAgICAgICAgV3JpdGVCYWNrcG9ydGVkRml4ZXNQcm9wRmlsZS53cml0ZUZpeGVzQXNBbGlhc0JpdFNldChmaXhlcywgbmV3IFByaW50V3JpdGVyKHJlc3VsdCkpOworCisgICAgICAgIFRydXRoLmFzc2VydFRoYXQocmVzdWx0LnRvU3RyaW5nKCkpCisgICAgICAgICAgICAgICAgLmlzRXF1YWxUbygiIiIKKyAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIGZvbGxvd2luZyBiYWNrcG9ydGVkIGZpeGVzIGhhdmUgYmVlbiBhcHBsaWVkCisgICAgICAgICAgICAgICAgICAgICAgICAjIGh0dHBzOi8vaXNzdWV0cmFja2VyLmdvb2dsZS5jb20vaXNzdWVzLzEyMzQgd2l0aCBhbGlhcyAxCisgICAgICAgICAgICAgICAgICAgICAgICAjIGh0dHBzOi8vaXNzdWV0cmFja2VyLmdvb2dsZS5jb20vaXNzdWVzLzMgd2l0aCBhbGlhcyA2NQorICAgICAgICAgICAgICAgICAgICAgICAgIyBodHRwczovL2lzc3VldHJhY2tlci5nb29nbGUuY29tL2lzc3Vlcy80IHdpdGggYWxpYXMgNjcKKyAgICAgICAgICAgICAgICAgICAgICAgIHJvLmJ1aWxkLmJhY2twb3J0ZWRfZml4ZXMuYWxpYXNfYml0c2V0LmxvbmdfbGlzdD0yLDEwCisgICAgICAgICAgICAgICAgICAgICAgICAiIiIpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL2JhY2twb3J0ZWRfZml4ZXMvdGVzdHMvamF2YS9jb20vYW5kcm9pZC9idWlsZC9iYWNrcG9ydGVkZml4ZXMvY29tbW9uL1BhcnNlclRlc3QuamF2YSBiL2JhY2twb3J0ZWRfZml4ZXMvdGVzdHMvamF2YS9jb20vYW5kcm9pZC9idWlsZC9iYWNrcG9ydGVkZml4ZXMvY29tbW9uL1BhcnNlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2EwYTQwCi0tLSAvZGV2L251bGwKKysrIGIvYmFja3BvcnRlZF9maXhlcy90ZXN0cy9qYXZhL2NvbS9hbmRyb2lkL2J1aWxkL2JhY2twb3J0ZWRmaXhlcy9jb21tb24vUGFyc2VyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgY29tLmFuZHJvaWQuYnVpbGQuYmFja3BvcnRlZGZpeGVzLmNvbW1vbjsKKworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5UcnV0aC5hc3NlcnRUaGF0OworaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLmNvbW1vbi50cnV0aC5leHRlbnNpb25zLnByb3RvLlByb3RvVHJ1dGguYXNzZXJ0VGhhdDsKKworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmJhY2twb3J0ZWRmaXhlcy5CYWNrcG9ydGVkRml4OworaW1wb3J0IGNvbS5hbmRyb2lkLmJ1aWxkLmJhY2twb3J0ZWRmaXhlcy5CYWNrcG9ydGVkRml4ZXM7CisKK2ltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5jb2xsZWN0LkltbXV0YWJsZUxpc3Q7CisKK2ltcG9ydCBvcmcuanVuaXQuUnVsZTsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVsZXMuVGVtcG9yYXJ5Rm9sZGVyOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLmZpbGUuRmlsZXM7CisKKy8qKiBUZXN0cyBmb3Ige0BsaW5rIFBhcnNlcn0uKi8KK3B1YmxpYyBjbGFzcyBQYXJzZXJUZXN0IHsKKworICAgIEBSdWxlCisgICAgcHVibGljIFRlbXBvcmFyeUZvbGRlciBtVGVtcEZvbGRlciA9IG5ldyBUZW1wb3JhcnlGb2xkZXIoKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgZ2V0RmlsZUlucHV0U3RyZWFtcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIHZhciByZXN1bHRzID0gUGFyc2VyLmdldEZpbGVJbnB1dFN0cmVhbXMoCisgICAgICAgICAgICAgICAgSW1tdXRhYmxlTGlzdC5vZihGaWxlcy5jcmVhdGVUZW1wRmlsZSgidGVzdCIsIG51bGwpLnRvRmlsZSgpKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzdWx0cykuaXNOb3RFbXB0eSgpOworICAgIH0KKworCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBnZXRCaXRTZXRBcnJheV9lbXB0eSgpIHsKKyAgICAgICAgdmFyIHJlc3VsdHMgPSBQYXJzZXIuZ2V0Qml0U2V0QXJyYXkobmV3IGludFtde30pOworICAgICAgICBhc3NlcnRUaGF0KHJlc3VsdHMpLmlzRW1wdHkoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIGdldEJpdFNldEFycmF5XzJfM182NCgpIHsKKyAgICAgICAgdmFyIHJlc3VsdHMgPSBQYXJzZXIuZ2V0Qml0U2V0QXJyYXkobmV3IGludFtdezIsMyw2NH0pOworICAgICAgICBhc3NlcnRUaGF0KHJlc3VsdHMpLmFzTGlzdCgpLmNvbnRhaW5zRXhhY3RseSgxMkwsMUwpLmluT3JkZXIoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhcnNlQmFja3BvcnRlZEZpeEZpbGVzX2VtcHR5KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdmFyIHJlc3VsdCA9IFBhcnNlci5wYXJzZUJhY2twb3J0ZWRGaXhGaWxlcyhJbW11dGFibGVMaXN0Lm9mKCkpOworICAgICAgICBhc3NlcnRUaGF0KHJlc3VsdCkuaXNFcXVhbFRvKEJhY2twb3J0ZWRGaXhlcy5nZXREZWZhdWx0SW5zdGFuY2UoKSk7CisgICAgfQorCisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHBhcnNlQmFja3BvcnRlZEZpeEZpbGVzX29uZUJsYW5rKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdmFyIHJlc3VsdCA9IFBhcnNlci5wYXJzZUJhY2twb3J0ZWRGaXhGaWxlcyhJbW11dGFibGVMaXN0Lm9mKG1UZW1wRm9sZGVyLm5ld0ZpbGUoKSkpOworCisgICAgICAgIGFzc2VydFRoYXQocmVzdWx0KS5pc0VxdWFsVG8oCisgICAgICAgICAgICAgICAgQmFja3BvcnRlZEZpeGVzLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEZpeGVzKEJhY2twb3J0ZWRGaXguZ2V0RGVmYXVsdEluc3RhbmNlKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCBwYXJzZUJhY2twb3J0ZWRGaXhGaWxlc190d28oKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBCYWNrcG9ydGVkRml4IGtpMTIzID0gQmFja3BvcnRlZEZpeC5uZXdCdWlsZGVyKCkKKyAgICAgICAgICAgICAgICAuc2V0S25vd25Jc3N1ZSgxMjMpCisgICAgICAgICAgICAgICAgLnNldEFsaWFzKDEpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCk7CisgICAgICAgIEJhY2twb3J0ZWRGaXgga2k0NTYgPSBCYWNrcG9ydGVkRml4Lm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgIC5zZXRLbm93bklzc3VlKDQ1NikKKyAgICAgICAgICAgICAgICAuc2V0QWxpYXMoMikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKTsKKyAgICAgICAgdmFyIHJlc3VsdCA9IFBhcnNlci5wYXJzZUJhY2twb3J0ZWRGaXhGaWxlcygKKyAgICAgICAgICAgICAgICBJbW11dGFibGVMaXN0Lm9mKHRlbXBGaWxlKGtpNDU2KSwgdGVtcEZpbGUoa2kxMjMpKSk7CisgICAgICAgIGFzc2VydFRoYXQocmVzdWx0KS5pc0VxdWFsVG8oCisgICAgICAgICAgICAgICAgQmFja3BvcnRlZEZpeGVzLm5ld0J1aWxkZXIoKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEZpeGVzKGtpMTIzKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFkZEZpeGVzKGtpNDU2KQorICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHByaXZhdGUgRmlsZSB0ZW1wRmlsZShCYWNrcG9ydGVkRml4IGZpeCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBmID0gbVRlbXBGb2xkZXIubmV3RmlsZSgpOworICAgICAgICB0cnkgKEZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZikpIHsKKyAgICAgICAgICAgIGZpeC53cml0ZVRvKG91dCk7CisgICAgICAgICAgICByZXR1cm4gZjsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL2NpL0FuZHJvaWQuYnAgYi9jaS9BbmRyb2lkLmJwCmluZGV4IDZkNGFjMzUuLjNmMjhiZTQgMTAwNjQ0Ci0tLSBhL2NpL0FuZHJvaWQuYnAKKysrIGIvY2kvQW5kcm9pZC5icApAQCAtMjUsNyArMjUsNyBAQAogICAgICAgICAiYnVpbGRfdGVzdF9zdWl0ZXNfdGVzdC5weSIsCiAgICAgXSwKICAgICBsaWJzOiBbCi0gICAgICAgICJidWlsZF90ZXN0X3N1aXRlcyIsCisgICAgICAgICJidWlsZF90ZXN0X3N1aXRlc19saWIiLAogICAgICAgICAicHlmYWtlZnMiLAogICAgICAgICAiY2lfdGVzdF9saWIiLAogICAgIF0sCkBAIC01Niw3ICs1Niw3IEBACiAgICAgICAgICJidWlsZF90ZXN0X3N1aXRlc19sb2NhbF90ZXN0LnB5IiwKICAgICBdLAogICAgIGxpYnM6IFsKLSAgICAgICAgImJ1aWxkX3Rlc3Rfc3VpdGVzIiwKKyAgICAgICAgImJ1aWxkX3Rlc3Rfc3VpdGVzX2xpYiIsCiAgICAgICAgICJweWZha2VmcyIsCiAgICAgICAgICJjaV90ZXN0X2xpYiIsCiAgICAgXSwKQEAgLTc5LDcgKzc5LDcgQEAKICAgICAgICAgIm9wdGltaXplZF90YXJnZXRzX3Rlc3QucHkiLAogICAgIF0sCiAgICAgbGliczogWwotICAgICAgICAiYnVpbGRfdGVzdF9zdWl0ZXMiLAorICAgICAgICAiYnVpbGRfdGVzdF9zdWl0ZXNfbGliIiwKICAgICAgICAgInB5ZmFrZWZzIiwKICAgICBdLAogICAgIHRlc3Rfb3B0aW9uczogewpAQCAtOTUsMTMgKzk1LDM2IEBACiAgICAgfSwKIH0KIAotcHl0aG9uX2xpYnJhcnlfaG9zdCB7CitweXRob25fYmluYXJ5X2hvc3QgewogICAgIG5hbWU6ICJidWlsZF90ZXN0X3N1aXRlcyIsCiAgICAgc3JjczogWwogICAgICAgICAiYnVpbGRfdGVzdF9zdWl0ZXMucHkiLAogICAgICAgICAib3B0aW1pemVkX3RhcmdldHMucHkiLAogICAgICAgICAidGVzdF9tYXBwaW5nX21vZHVsZV9yZXRyaWV2ZXIucHkiLAogICAgICAgICAiYnVpbGRfY29udGV4dC5weSIsCisgICAgICAgICJ0ZXN0X2Rpc2NvdmVyeV9hZ2VudC5weSIsCisgICAgICAgICJtZXRyaWNzX2FnZW50LnB5IiwKKyAgICAgICAgImJ1aWxkYm90LnB5IiwKKyAgICBdLAorICAgIG1haW46ICJidWlsZF90ZXN0X3N1aXRlcy5weSIsCisgICAgbGliczogWworICAgICAgICAic29vbmctbWV0cmljcy1wcm90by1weSIsCisgICAgXSwKK30KKworcHl0aG9uX2xpYnJhcnlfaG9zdCB7CisgICAgbmFtZTogImJ1aWxkX3Rlc3Rfc3VpdGVzX2xpYiIsCisgICAgc3JjczogWworICAgICAgICAiYnVpbGRfdGVzdF9zdWl0ZXMucHkiLAorICAgICAgICAib3B0aW1pemVkX3RhcmdldHMucHkiLAorICAgICAgICAidGVzdF9tYXBwaW5nX21vZHVsZV9yZXRyaWV2ZXIucHkiLAorICAgICAgICAiYnVpbGRfY29udGV4dC5weSIsCisgICAgICAgICJ0ZXN0X2Rpc2NvdmVyeV9hZ2VudC5weSIsCisgICAgICAgICJtZXRyaWNzX2FnZW50LnB5IiwKKyAgICAgICAgImJ1aWxkYm90LnB5IiwKKyAgICBdLAorICAgIGxpYnM6IFsKKyAgICAgICAgInNvb25nLW1ldHJpY3MtcHJvdG8tcHkiLAogICAgIF0sCiB9CiAKZGlmZiAtLWdpdCBhL2NpL2J1aWxkX2NvbnRleHQucHkgYi9jaS9idWlsZF9jb250ZXh0LnB5CmluZGV4IGNjNDhkNTMuLmM3YTFkZWYgMTAwNjQ0Ci0tLSBhL2NpL2J1aWxkX2NvbnRleHQucHkKKysrIGIvY2kvYnVpbGRfY29udGV4dC5weQpAQCAtNDcsNiArNDcsOSBAQAogICAgICAgc2VsZi5pc190ZXN0X21hcHBpbmcgPSBGYWxzZQogICAgICAgc2VsZi50ZXN0X21hcHBpbmdfdGVzdF9ncm91cHMgPSBzZXQoKQogICAgICAgc2VsZi5maWxlX2Rvd25sb2FkX29wdGlvbnMgPSBzZXQoKQorICAgICAgc2VsZi5uYW1lID0gdGVzdF9pbmZvX2RpY3QuZ2V0KCduYW1lJykKKyAgICAgIHNlbGYuY29tbWFuZCA9IHRlc3RfaW5mb19kaWN0LmdldCgnY29tbWFuZCcpCisgICAgICBzZWxmLmV4dHJhX29wdGlvbnMgPSB0ZXN0X2luZm9fZGljdC5nZXQoJ2V4dHJhT3B0aW9ucycpCiAgICAgICBmb3Igb3B0IGluIHRlc3RfaW5mb19kaWN0LmdldCgnZXh0cmFPcHRpb25zJywgW10pOgogICAgICAgICBrZXkgPSBvcHQuZ2V0KCdrZXknKQogICAgICAgICBpZiBrZXkgPT0gJ3Rlc3QtbWFwcGluZy10ZXN0LWdyb3VwJzoKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvdG9vbHMvdXBkYXRlX2Jvb3Rsb2FkZXJfcmFkaW9faW1hZ2UubWsgYi9jaS9idWlsZF9kZXZpY2VfYW5kX3Rlc3RzCm9sZCBtb2RlIDEwMDY0NApuZXcgbW9kZSAxMDA3NTUKc2ltaWxhcml0eSBpbmRleCA2MiUKY29weSBmcm9tIGNvcmUvdGFza3MvdG9vbHMvdXBkYXRlX2Jvb3Rsb2FkZXJfcmFkaW9faW1hZ2UubWsKY29weSB0byBjaS9idWlsZF9kZXZpY2VfYW5kX3Rlc3RzCmluZGV4IDBlYmYyNDcuLjYzZDNjZTMKLS0tIGEvY29yZS90YXNrcy90b29scy91cGRhdGVfYm9vdGxvYWRlcl9yYWRpb19pbWFnZS5taworKysgYi9jaS9idWlsZF9kZXZpY2VfYW5kX3Rlc3RzCkBAIC0xLDE3ICsxLDE5IEBACi0jIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjIS91c3IvYmluL2VudiBiYXNoCisjCisjIENvcHlyaWdodCAyMDI0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAjCiAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCiAjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAogIwotIyAgICAgIGh0dHA6I3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK3NldCAtZXVvIHBpcGVmYWlsCiAKLWlmZXEgKCQoVVNFU19ERVZJQ0VfR09PR0xFX1pVTUEpLHRydWUpCi0gICAgLWluY2x1ZGUgdmVuZG9yL2dvb2dsZV9kZXZpY2VzL3p1bWEvcHJlYnVpbHRzL21pc2NfYmlucy91cGRhdGVfYm9vdGxvYWRlcl9yYWRpb19pbWFnZS5tawotZW5kaWYKK2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUgYnVpbGRfdGVzdF9zdWl0ZXMKKyQoYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCAtLWR1bXB2YXItbW9kZSBIT1NUX09VVCkvYmluL2J1aWxkX3Rlc3Rfc3VpdGVzIC0tZGV2aWNlLWJ1aWxkICRACmRpZmYgLS1naXQgYS9jaS9idWlsZF9tZXRhZGF0YSBiL2NpL2J1aWxkX21ldGFkYXRhCmluZGV4IDgxMzY3MDIuLjNlOTIxOGYgMTAwNzU1Ci0tLSBhL2NpL2J1aWxkX21ldGFkYXRhCisrKyBiL2NpL2J1aWxkX21ldGFkYXRhCkBAIC0xNCwxMiArMTQsMzEgQEAKICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAotc2V0IC1leAorc2V0IC14CisKK3NvdXJjZSBidWlsZC9tYWtlL3NoZWxsX3V0aWxzLnNoCiAKIGV4cG9ydCBUQVJHRVRfUFJPRFVDVD1hb3NwX2FybTY0CiBleHBvcnQgVEFSR0VUX1JFTEVBU0U9dHJ1bmtfc3RhZ2luZwogZXhwb3J0IFRBUkdFVF9CVUlMRF9WQVJJQU5UPWVuZwogCi1idWlsZC9zb29uZy9iaW4vbSBkaXN0IFwKLSAgICBjb2RlX21ldGFkYXRhCitpbXBvcnRfYnVpbGRfdmFycyBcCisgICAgICAgIE9VVF9ESVIgXAorICAgICAgICBESVNUX0RJUiBcCisgICAgICAgIEhPU1RfT1VUX0VYRUNVVEFCTEVTIFwKKyAgICB8fCBleGl0ICQ/CiAKK1RBUkdFVFM9KAorICAgIGFsbF90ZWFtcworICAgIHNvdXJjZV90cmVlX3NpemUKKyAgICByZWxlYXNlX2NvbmZpZ19tZXRhZGF0YQorKQorCisjIEJ1aWxkIG1vZHVsZXMKK2J1aWxkL3Nvb25nL2Jpbi9tIGRpc3QgJHtUQVJHRVRTW0BdfSB8fCBleGl0ICQ/CisKKyMgTGlzdCBhbGwgc291cmNlIGZpbGVzIGluIHRoZSB0cmVlCisoIFwKKyAgICAkSE9TVF9PVVRfRVhFQ1VUQUJMRVMvc291cmNlX3RyZWVfc2l6ZSAtbyAkRElTVF9ESVIvYWxsX3NvdXJjZV90cmVlX2ZpbGVzLnBiIFwKKyAgICAgICAgJiYgZ3ppcCAtZm4gJERJU1RfRElSL2FsbF9zb3VyY2VfdHJlZV9maWxlcy5wYiBcCispIHx8IGV4aXQgJD8KZGlmZiAtLWdpdCBhL2NpL2J1aWxkX3Rlc3Rfc3VpdGVzIGIvY2kvYnVpbGRfdGVzdF9zdWl0ZXMKaW5kZXggNWFhZjJmNC4uNzQ0NzBhOCAxMDA3NTUKLS0tIGEvY2kvYnVpbGRfdGVzdF9zdWl0ZXMKKysrIGIvY2kvYnVpbGRfdGVzdF9zdWl0ZXMKQEAgLTEsNCArMSw0IEBACi0jIXByZWJ1aWx0cy9idWlsZC10b29scy9saW51eC14ODYvYmluL3B5My1jbWQgLUIKKyMhL3Vzci9iaW4vZW52IGJhc2gKICMKICMgQ29weXJpZ2h0IDIwMjQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICMKQEAgLTEzLDggKzEzLDcgQEAKICMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitzZXQgLWV1byBwaXBlZmFpbAogCi1pbXBvcnQgYnVpbGRfdGVzdF9zdWl0ZXMKLWltcG9ydCBzeXMKLQotYnVpbGRfdGVzdF9zdWl0ZXMubWFpbihzeXMuYXJndlsxOl0pCitidWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlIGJ1aWxkX3Rlc3Rfc3VpdGVzCiskKGJ1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1kdW1wdmFyLW1vZGUgSE9TVF9PVVQpL2Jpbi9idWlsZF90ZXN0X3N1aXRlcyAkQApkaWZmIC0tZ2l0IGEvY2kvYnVpbGRfdGVzdF9zdWl0ZXMucHkgYi9jaS9idWlsZF90ZXN0X3N1aXRlcy5weQppbmRleCA5MzNlNDNlLi5kODEyNDhiIDEwMDY0NAotLS0gYS9jaS9idWlsZF90ZXN0X3N1aXRlcy5weQorKysgYi9jaS9idWlsZF90ZXN0X3N1aXRlcy5weQpAQCAtMjAsMTUgKzIwLDIyIEBACiBpbXBvcnQgbG9nZ2luZwogaW1wb3J0IG9zCiBpbXBvcnQgcGF0aGxpYgoraW1wb3J0IHJlCiBpbXBvcnQgc3VicHJvY2VzcwogaW1wb3J0IHN5cworZnJvbSB0eXBpbmcgaW1wb3J0IENhbGxhYmxlCiBmcm9tIGJ1aWxkX2NvbnRleHQgaW1wb3J0IEJ1aWxkQ29udGV4dAogaW1wb3J0IG9wdGltaXplZF90YXJnZXRzCitpbXBvcnQgbWV0cmljc19hZ2VudAoraW1wb3J0IHRlc3RfZGlzY292ZXJ5X2FnZW50CiAKIAotUkVRVUlSRURfRU5WX1ZBUlMgPSBmcm96ZW5zZXQoWydUQVJHRVRfUFJPRFVDVCcsICdUQVJHRVRfUkVMRUFTRScsICdUT1AnXSkKK1JFUVVJUkVEX0VOVl9WQVJTID0gZnJvemVuc2V0KFsnVEFSR0VUX1BST0RVQ1QnLCAnVEFSR0VUX1JFTEVBU0UnLCAnVE9QJywgJ0RJU1RfRElSJ10pCiBTT09OR19VSV9FWEVfUkVMX1BBVEggPSAnYnVpbGQvc29vbmcvc29vbmdfdWkuYmFzaCcKIExPR19QQVRIID0gJ2xvZ3MvYnVpbGRfdGVzdF9zdWl0ZXMubG9nJworIyBDdXJyZW50bHksIHRoaXMgcHJldmVudHMgdGhlIHJlbW92YWwgb2YgdGhvc2UgdGFncyB3aGVuIHRoZXkgZXhpc3QuIEluIHRoZSBmdXR1cmUgd2UgbGlrZWx5CisjIHdhbnQgdGhlIHNjcmlwdCB0byBzdXBwbHkgJ2Rpc3QgZGlyZWN0bHkKK1JFUVVJUkVEX0JVSUxEX1RBUkdFVFMgPSBmcm96ZW5zZXQoWydkaXN0JywgJ2Ryb2lkJywgJ2NoZWNrYnVpbGQnXSkKIAogCiBjbGFzcyBFcnJvcihFeGNlcHRpb24pOgpAQCAtNjcsMTQgKzc0LDI4IEBACiAgICAgaWYgJ29wdGltaXplZF9idWlsZCcgbm90IGluIHNlbGYuYnVpbGRfY29udGV4dC5lbmFibGVkX2J1aWxkX2ZlYXR1cmVzOgogICAgICAgcmV0dXJuIEJ1aWxkUGxhbihzZXQoc2VsZi5hcmdzLmV4dHJhX3RhcmdldHMpLCBzZXQoKSkKIAotICAgIGJ1aWxkX3RhcmdldHMgPSBzZXQoKQotICAgIHBhY2thZ2luZ19jb21tYW5kcyA9IFtdCi0gICAgZm9yIHRhcmdldCBpbiBzZWxmLmFyZ3MuZXh0cmFfdGFyZ2V0czoKLSAgICAgIGlmIHNlbGYuX3VudXNlZF90YXJnZXRfZXhjbHVzaW9uX2VuYWJsZWQoCi0gICAgICAgICAgdGFyZ2V0Ci0gICAgICApIGFuZCBub3Qgc2VsZi5idWlsZF9jb250ZXh0LmJ1aWxkX3RhcmdldF91c2VkKHRhcmdldCk6Ci0gICAgICAgIGNvbnRpbnVlCisgICAgaWYgbm90IHNlbGYuYnVpbGRfY29udGV4dC50ZXN0X2luZm9zOgorICAgICAgbG9nZ2luZy53YXJuaW5nKCdCdWlsZCBjb250ZXh0IGhhcyBubyB0ZXN0IGluZm9zLCBza2lwcGluZyBvcHRpbWl6YXRpb25zLicpCisgICAgICBmb3IgdGFyZ2V0IGluIHNlbGYuYXJncy5leHRyYV90YXJnZXRzOgorICAgICAgICBnZXRfbWV0cmljc19hZ2VudCgpLnJlcG9ydF91bm9wdGltaXplZF90YXJnZXQodGFyZ2V0LCAnQlVJTERfQ09OVEVYVCBoYXMgbm8gdGVzdCBpbmZvcy4nKQorICAgICAgcmV0dXJuIEJ1aWxkUGxhbihzZXQoc2VsZi5hcmdzLmV4dHJhX3RhcmdldHMpLCBzZXQoKSkKIAorICAgIGJ1aWxkX3RhcmdldHMgPSBzZXQoKQorICAgIHBhY2thZ2luZ19jb21tYW5kc19nZXR0ZXJzID0gW10KKyAgICAjIEluIG9yZGVyIHRvIHJvbGwgb3B0aW1pemF0aW9ucyBvdXQgZGlmZmVyZW50bHkgYmV0d2VlbiB0ZXN0IHN1aXRlcyBhbmQKKyAgICAjIGRldmljZSBidWlsZHMsIHdlIGhhdmUgc2VwYXJhdGUgZmxhZ3MuCisgICAgZW5hYmxlX2Rpc2NvdmVyeSA9ICgoJ3Rlc3Rfc3VpdGVzX3ppcF90ZXN0X2Rpc2NvdmVyeScKKyAgICAgICAgaW4gc2VsZi5idWlsZF9jb250ZXh0LmVuYWJsZWRfYnVpbGRfZmVhdHVyZXMKKyAgICAgICAgYW5kIG5vdCBzZWxmLmFyZ3MuZGV2aWNlX2J1aWxkCisgICAgKSBvciAoCisgICAgICAgICdkZXZpY2VfemlwX3Rlc3RfZGlzY292ZXJ5JworICAgICAgICBpbiBzZWxmLmJ1aWxkX2NvbnRleHQuZW5hYmxlZF9idWlsZF9mZWF0dXJlcworICAgICAgICBhbmQgc2VsZi5hcmdzLmRldmljZV9idWlsZAorICAgICkpIGFuZCBub3Qgc2VsZi5hcmdzLnRlc3RfZGlzY292ZXJ5X2luZm9fbW9kZQorICAgIGxvZ2dpbmcuaW5mbyhmJ0Rpc2NvdmVyeSBtb2RlIGlzIGVuYWJsZWQ9IHtlbmFibGVfZGlzY292ZXJ5fScpCisgICAgcHJlbGltaW5hcnlfYnVpbGRfdGFyZ2V0cyA9IHNlbGYuX2NvbGxlY3RfcHJlbGltaW5hcnlfYnVpbGRfdGFyZ2V0cyhlbmFibGVfZGlzY292ZXJ5KQorCisgICAgZm9yIHRhcmdldCBpbiBwcmVsaW1pbmFyeV9idWlsZF90YXJnZXRzOgogICAgICAgdGFyZ2V0X29wdGltaXplcl9nZXR0ZXIgPSBzZWxmLnRhcmdldF9vcHRpbWl6YXRpb25zLmdldCh0YXJnZXQsIE5vbmUpCiAgICAgICBpZiBub3QgdGFyZ2V0X29wdGltaXplcl9nZXR0ZXI6CiAgICAgICAgIGJ1aWxkX3RhcmdldHMuYWRkKHRhcmdldCkKQEAgLTg0LDkgKzEwNSw2NiBAQAogICAgICAgICAgIHRhcmdldCwgc2VsZi5idWlsZF9jb250ZXh0LCBzZWxmLmFyZ3MKICAgICAgICkKICAgICAgIGJ1aWxkX3RhcmdldHMudXBkYXRlKHRhcmdldF9vcHRpbWl6ZXIuZ2V0X2J1aWxkX3RhcmdldHMoKSkKLSAgICAgIHBhY2thZ2luZ19jb21tYW5kcy5leHRlbmQodGFyZ2V0X29wdGltaXplci5nZXRfcGFja2FnZV9vdXRwdXRzX2NvbW1hbmRzKCkpCisgICAgICBwYWNrYWdpbmdfY29tbWFuZHNfZ2V0dGVycy5hcHBlbmQoCisgICAgICAgICAgdGFyZ2V0X29wdGltaXplci5nZXRfcGFja2FnZV9vdXRwdXRzX2NvbW1hbmRzCisgICAgICApCiAKLSAgICByZXR1cm4gQnVpbGRQbGFuKGJ1aWxkX3RhcmdldHMsIHBhY2thZ2luZ19jb21tYW5kcykKKyAgICByZXR1cm4gQnVpbGRQbGFuKGJ1aWxkX3RhcmdldHMsIHBhY2thZ2luZ19jb21tYW5kc19nZXR0ZXJzKQorCisgIGRlZiBfY29sbGVjdF9wcmVsaW1pbmFyeV9idWlsZF90YXJnZXRzKHNlbGYsIGVuYWJsZV9kaXNjb3Zlcnk6IGJvb2wpOgorICAgIGJ1aWxkX3RhcmdldHMgPSBzZXQoKQorICAgIHRyeToKKyAgICAgIHRlc3RfZGlzY292ZXJ5X3ppcF9yZWdleGVzID0gc2VsZi5fZ2V0X3Rlc3RfZGlzY292ZXJ5X3ppcF9yZWdleGVzKCkKKyAgICAgIGxvZ2dpbmcuaW5mbyhmJ0Rpc2NvdmVyZWQgdGVzdCBkaXNjb3ZlcnkgcmVnZXhlczoge3Rlc3RfZGlzY292ZXJ5X3ppcF9yZWdleGVzfScpCisgICAgZXhjZXB0IHRlc3RfZGlzY292ZXJ5X2FnZW50LlRlc3REaXNjb3ZlcnlFcnJvciBhcyBlOgorICAgICAgb3B0aW1pemF0aW9uX3JhdGlvbmFsZSA9IGUubWVzc2FnZQorICAgICAgbG9nZ2luZy53YXJuaW5nKGYnVW5hYmxlIHRvIHBlcmZvcm0gdGVzdCBkaXNjb3Zlcnk6IHtvcHRpbWl6YXRpb25fcmF0aW9uYWxlfScpCisKKyAgICAgIGZvciB0YXJnZXQgaW4gc2VsZi5hcmdzLmV4dHJhX3RhcmdldHM6CisgICAgICAgIGdldF9tZXRyaWNzX2FnZW50KCkucmVwb3J0X3Vub3B0aW1pemVkX3RhcmdldCh0YXJnZXQsIG9wdGltaXphdGlvbl9yYXRpb25hbGUpCisgICAgICByZXR1cm4gc2VsZi5fbGVnYWN5X2NvbGxlY3RfcHJlbGltaW5hcnlfYnVpbGRfdGFyZ2V0cygpCisKKyAgICBmb3IgdGFyZ2V0IGluIHNlbGYuYXJncy5leHRyYV90YXJnZXRzOgorICAgICAgaWYgdGFyZ2V0IGluIFJFUVVJUkVEX0JVSUxEX1RBUkdFVFM6CisgICAgICAgIGJ1aWxkX3RhcmdldHMuYWRkKHRhcmdldCkKKyAgICAgICAgZ2V0X21ldHJpY3NfYWdlbnQoKS5yZXBvcnRfdW5vcHRpbWl6ZWRfdGFyZ2V0KHRhcmdldCwgJ1JlcXVpcmVkIGJ1aWxkIHRhcmdldC4nKQorICAgICAgICBjb250aW51ZQorICAgICAgIyBJZiBub3RoaW5nIGlzIGRpc2NvdmVyZWQgd2l0aG91dCBlcnJvciwgdGhhdCBtZWFucyBub3RoaW5nIGlzIG5lZWRlZC4KKyAgICAgIGlmIG5vdCB0ZXN0X2Rpc2NvdmVyeV96aXBfcmVnZXhlczoKKyAgICAgICAgZ2V0X21ldHJpY3NfYWdlbnQoKS5yZXBvcnRfb3B0aW1pemVkX3RhcmdldCh0YXJnZXQpCisgICAgICAgIGNvbnRpbnVlCisKKyAgICAgIHJlZ2V4ID0gcidcYiglcy4qKVxiJyAlIHJlLmVzY2FwZSh0YXJnZXQpCisgICAgICBmb3Igb3B0IGluIHRlc3RfZGlzY292ZXJ5X3ppcF9yZWdleGVzOgorICAgICAgICB0cnk6CisgICAgICAgICAgaWYgcmUuc2VhcmNoKHJlZ2V4LCBvcHQpOgorICAgICAgICAgICAgZ2V0X21ldHJpY3NfYWdlbnQoKS5yZXBvcnRfdW5vcHRpbWl6ZWRfdGFyZ2V0KHRhcmdldCwgJ1Rlc3QgYXJ0aWZhY3QgdXNlZC4nKQorICAgICAgICAgICAgYnVpbGRfdGFyZ2V0cy5hZGQodGFyZ2V0KQorICAgICAgICAgICAgIyBwcm9jZWVkIHRvIG5leHQgdGFyZ2V0IGV2YWx1YXRpb24KKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgZ2V0X21ldHJpY3NfYWdlbnQoKS5yZXBvcnRfb3B0aW1pemVkX3RhcmdldCh0YXJnZXQpCisgICAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgICAjIEluIGNhc2Ugb2YgZXhjZXB0aW9uIHJlcG9ydCBhcyB1bm9wdGltaXplZAorICAgICAgICAgIGJ1aWxkX3RhcmdldHMuYWRkKHRhcmdldCkKKyAgICAgICAgICBnZXRfbWV0cmljc19hZ2VudCgpLnJlcG9ydF91bm9wdGltaXplZF90YXJnZXQodGFyZ2V0LCBmJ0Vycm9yIGluIHBhcnNpbmcgdGVzdCBkaXNjb3Zlcnkgb3V0cHV0IGZvciB7dGFyZ2V0fToge3JlcHIoZSl9JykKKyAgICAgICAgICBsb2dnaW5nLmVycm9yKGYndW5hYmxlIHRvIHBhcnNlIHRlc3QgZGlzY292ZXJ5IG91dHB1dDoge3JlcHIoZSl9JykKKyAgICAgICAgICBicmVhaworICAgICMgSWYgZGlzY292ZXJ5IGlzIG5vdCBlbmFibGVkLCByZXR1cm4gdGhlIG9yaWdpbmFsIGxpc3QKKyAgICBpZiBub3QgZW5hYmxlX2Rpc2NvdmVyeToKKyAgICAgIHJldHVybiBzZWxmLl9sZWdhY3lfY29sbGVjdF9wcmVsaW1pbmFyeV9idWlsZF90YXJnZXRzKCkKKworICAgIHJldHVybiBidWlsZF90YXJnZXRzCisKKyAgZGVmIF9sZWdhY3lfY29sbGVjdF9wcmVsaW1pbmFyeV9idWlsZF90YXJnZXRzKHNlbGYpOgorICAgIGJ1aWxkX3RhcmdldHMgPSBzZXQoKQorICAgIGZvciB0YXJnZXQgaW4gc2VsZi5hcmdzLmV4dHJhX3RhcmdldHM6CisgICAgICBpZiBzZWxmLl91bnVzZWRfdGFyZ2V0X2V4Y2x1c2lvbl9lbmFibGVkKAorICAgICAgICAgIHRhcmdldAorICAgICAgKSBhbmQgbm90IHNlbGYuYnVpbGRfY29udGV4dC5idWlsZF90YXJnZXRfdXNlZCh0YXJnZXQpOgorICAgICAgICBjb250aW51ZQorCisgICAgICBidWlsZF90YXJnZXRzLmFkZCh0YXJnZXQpCisgICAgcmV0dXJuIGJ1aWxkX3RhcmdldHMKIAogICBkZWYgX3VudXNlZF90YXJnZXRfZXhjbHVzaW9uX2VuYWJsZWQoc2VsZiwgdGFyZ2V0OiBzdHIpIC0+IGJvb2w6CiAgICAgcmV0dXJuICgKQEAgLTk0LDExICsxNzIsMzkgQEAKICAgICAgICAgaW4gc2VsZi5idWlsZF9jb250ZXh0LmVuYWJsZWRfYnVpbGRfZmVhdHVyZXMKICAgICApCiAKKyAgZGVmIF9nZXRfdGVzdF9kaXNjb3ZlcnlfemlwX3JlZ2V4ZXMoc2VsZikgLT4gc2V0W3N0cl06CisgICAgYnVpbGRfdGFyZ2V0X3JlZ2V4ZXMgPSBzZXQoKQorICAgIGZvciB0ZXN0X2luZm8gaW4gc2VsZi5idWlsZF9jb250ZXh0LnRlc3RfaW5mb3M6CisgICAgICB0Zl9jb21tYW5kID0gc2VsZi5fYnVpbGRfdGZfY29tbWFuZCh0ZXN0X2luZm8pCisgICAgICBkaXNjb3ZlcnlfYWdlbnQgPSB0ZXN0X2Rpc2NvdmVyeV9hZ2VudC5UZXN0RGlzY292ZXJ5QWdlbnQodHJhZGVmZWRfYXJncz10Zl9jb21tYW5kKQorICAgICAgZm9yIHJlZ2V4IGluIGRpc2NvdmVyeV9hZ2VudC5kaXNjb3Zlcl90ZXN0X3ppcF9yZWdleGVzKCk6CisgICAgICAgIGJ1aWxkX3RhcmdldF9yZWdleGVzLmFkZChyZWdleCkKKyAgICByZXR1cm4gYnVpbGRfdGFyZ2V0X3JlZ2V4ZXMKKworCisgIGRlZiBfYnVpbGRfdGZfY29tbWFuZChzZWxmLCB0ZXN0X2luZm8pIC0+IGxpc3Rbc3RyXToKKyAgICBjb21tYW5kID0gW3Rlc3RfaW5mby5jb21tYW5kXQorICAgIGZvciBleHRyYV9vcHRpb24gaW4gdGVzdF9pbmZvLmV4dHJhX29wdGlvbnM6CisgICAgICBpZiBub3QgZXh0cmFfb3B0aW9uLmdldCgna2V5Jyk6CisgICAgICAgIGNvbnRpbnVlCisgICAgICBhcmdfa2V5ID0gJy0tJyArIGV4dHJhX29wdGlvbi5nZXQoJ2tleScpCisgICAgICBpZiBhcmdfa2V5ID09ICctLWJ1aWxkLWlkJzoKKyAgICAgICAgY29tbWFuZC5hcHBlbmQoYXJnX2tleSkKKyAgICAgICAgY29tbWFuZC5hcHBlbmQob3MuZW52aXJvbi5nZXQoJ0JVSUxEX05VTUJFUicpKQorICAgICAgICBjb250aW51ZQorICAgICAgaWYgZXh0cmFfb3B0aW9uLmdldCgndmFsdWVzJyk6CisgICAgICAgIGZvciB2YWx1ZSBpbiBleHRyYV9vcHRpb24uZ2V0KCd2YWx1ZXMnKToKKyAgICAgICAgICBjb21tYW5kLmFwcGVuZChhcmdfa2V5KQorICAgICAgICAgIGNvbW1hbmQuYXBwZW5kKHZhbHVlKQorICAgICAgZWxzZToKKyAgICAgICAgY29tbWFuZC5hcHBlbmQoYXJnX2tleSkKKworICAgIHJldHVybiBjb21tYW5kCiAKIEBkYXRhY2xhc3MoZnJvemVuPVRydWUpCiBjbGFzcyBCdWlsZFBsYW46CiAgIGJ1aWxkX3RhcmdldHM6IHNldFtzdHJdCi0gIHBhY2thZ2luZ19jb21tYW5kczogbGlzdFtsaXN0W3N0cl1dCisgIHBhY2thZ2luZ19jb21tYW5kc19nZXR0ZXJzOiBsaXN0W0NhbGxhYmxlW1tdLCBsaXN0W2xpc3Rbc3RyXV1dXQogCiAKIGRlZiBidWlsZF90ZXN0X3N1aXRlcyhhcmd2OiBsaXN0W3N0cl0pIC0+IGludDoKQEAgLTExMCwxOSArMjE2LDI3IEBACiAgIFJldHVybnM6CiAgICAgVGhlIGV4aXQgY29kZSBvZiB0aGUgYnVpbGQuCiAgICIiIgotICBhcmdzID0gcGFyc2VfYXJncyhhcmd2KQotICBjaGVja19yZXF1aXJlZF9lbnYoKQotICBidWlsZF9jb250ZXh0ID0gQnVpbGRDb250ZXh0KGxvYWRfYnVpbGRfY29udGV4dCgpKQotICBidWlsZF9wbGFubmVyID0gQnVpbGRQbGFubmVyKAotICAgICAgYnVpbGRfY29udGV4dCwgYXJncywgb3B0aW1pemVkX3RhcmdldHMuT1BUSU1JWkVEX0JVSUxEX1RBUkdFVFMKLSAgKQotICBidWlsZF9wbGFuID0gYnVpbGRfcGxhbm5lci5jcmVhdGVfYnVpbGRfcGxhbigpCisgIGdldF9tZXRyaWNzX2FnZW50KCkuYW5hbHlzaXNfc3RhcnQoKQorICB0cnk6CisgICAgYXJncyA9IHBhcnNlX2FyZ3MoYXJndikKKyAgICBjaGVja19yZXF1aXJlZF9lbnYoKQorICAgIGJ1aWxkX2NvbnRleHQgPSBCdWlsZENvbnRleHQobG9hZF9idWlsZF9jb250ZXh0KCkpCisgICAgYnVpbGRfcGxhbm5lciA9IEJ1aWxkUGxhbm5lcigKKyAgICAgICAgYnVpbGRfY29udGV4dCwgYXJncywgb3B0aW1pemVkX3RhcmdldHMuT1BUSU1JWkVEX0JVSUxEX1RBUkdFVFMKKyAgICApCisgICAgYnVpbGRfcGxhbiA9IGJ1aWxkX3BsYW5uZXIuY3JlYXRlX2J1aWxkX3BsYW4oKQorICBleGNlcHQ6CisgICAgcmFpc2UKKyAgZmluYWxseToKKyAgICBnZXRfbWV0cmljc19hZ2VudCgpLmFuYWx5c2lzX2VuZCgpCiAKICAgdHJ5OgogICAgIGV4ZWN1dGVfYnVpbGRfcGxhbihidWlsZF9wbGFuKQogICBleGNlcHQgQnVpbGRGYWlsdXJlRXJyb3IgYXMgZToKICAgICBsb2dnaW5nLmVycm9yKCdCdWlsZCBjb21tYW5kIGZhaWxlZCEgQ2hlY2sgYnVpbGRfbG9nIGZvciBkZXRhaWxzLicpCiAgICAgcmV0dXJuIGUucmV0dXJuX2NvZGUKKyAgZmluYWxseToKKyAgICBnZXRfbWV0cmljc19hZ2VudCgpLmVuZF9yZXBvcnRpbmcoKQogCiAgIHJldHVybiAwCiAKQEAgLTEzMyw2ICsyNDcsMTYgQEAKICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgKICAgICAgICdleHRyYV90YXJnZXRzJywgbmFyZ3M9JyonLCBoZWxwPSdFeHRyYSB0ZXN0IHN1aXRlcyB0byBidWlsZC4nCiAgICkKKyAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICctLWRldmljZS1idWlsZCcsCisgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgaGVscD0nRmxhZyB0byBpbmRpY2F0ZSBydW5uaW5nIGEgZGV2aWNlIGJ1aWxkLicsCisgICkKKyAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICctLXRlc3RfZGlzY292ZXJ5X2luZm9fbW9kZScsCisgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgaGVscD0nRmxhZyB0byBlbmFibGUgcnVubmluZyB0ZXN0IGRpc2NvdmVyeSBpbiBpbmZvIG9ubHkgbW9kZS4nLAorICApCiAKICAgcmV0dXJuIGFyZ3BhcnNlci5wYXJzZV9hcmdzKGFyZ3YpCiAKQEAgLTE3NCwxNyArMjk4LDIxIEBACiAgIGJ1aWxkX2NvbW1hbmQuYXBwZW5kKGdldF90b3AoKS5qb2lucGF0aChTT09OR19VSV9FWEVfUkVMX1BBVEgpKQogICBidWlsZF9jb21tYW5kLmFwcGVuZCgnLS1tYWtlLW1vZGUnKQogICBidWlsZF9jb21tYW5kLmV4dGVuZChidWlsZF9wbGFuLmJ1aWxkX3RhcmdldHMpCi0KKyAgbG9nZ2luZy5pbmZvKGYnUnVubmluZyBidWlsZCBjb21tYW5kOiB7YnVpbGRfY29tbWFuZH0nKQogICB0cnk6CiAgICAgcnVuX2NvbW1hbmQoYnVpbGRfY29tbWFuZCkKICAgZXhjZXB0IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yIGFzIGU6CiAgICAgcmFpc2UgQnVpbGRGYWlsdXJlRXJyb3IoZS5yZXR1cm5jb2RlKSBmcm9tIGUKIAotICBmb3IgcGFja2FnaW5nX2NvbW1hbmQgaW4gYnVpbGRfcGxhbi5wYWNrYWdpbmdfY29tbWFuZHM6Ci0gICAgdHJ5OgotICAgICAgcnVuX2NvbW1hbmQocGFja2FnaW5nX2NvbW1hbmQpCi0gICAgZXhjZXB0IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yIGFzIGU6Ci0gICAgICByYWlzZSBCdWlsZEZhaWx1cmVFcnJvcihlLnJldHVybmNvZGUpIGZyb20gZQorICBnZXRfbWV0cmljc19hZ2VudCgpLnBhY2thZ2luZ19zdGFydCgpCisgIHRyeToKKyAgICBmb3IgcGFja2FnaW5nX2NvbW1hbmRzX2dldHRlciBpbiBidWlsZF9wbGFuLnBhY2thZ2luZ19jb21tYW5kc19nZXR0ZXJzOgorICAgICAgZm9yIHBhY2thZ2luZ19jb21tYW5kIGluIHBhY2thZ2luZ19jb21tYW5kc19nZXR0ZXIoKToKKyAgICAgICAgcnVuX2NvbW1hbmQocGFja2FnaW5nX2NvbW1hbmQpCisgIGV4Y2VwdCBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvciBhcyBlOgorICAgIHJhaXNlIEJ1aWxkRmFpbHVyZUVycm9yKGUucmV0dXJuY29kZSkgZnJvbSBlCisgIGZpbmFsbHk6CisgICAgZ2V0X21ldHJpY3NfYWdlbnQoKS5wYWNrYWdpbmdfZW5kKCkKIAogCiBkZWYgZ2V0X3RvcCgpIC0+IHBhdGhsaWIuUGF0aDoKQEAgLTE5NSw2ICszMjMsMTAgQEAKICAgc3VicHJvY2Vzcy5ydW4oYXJncz1hcmdzLCBjaGVjaz1UcnVlLCBzdGRvdXQ9c3Rkb3V0KQogCiAKK2RlZiBnZXRfbWV0cmljc19hZ2VudCgpOgorICByZXR1cm4gbWV0cmljc19hZ2VudC5NZXRyaWNzQWdlbnQuaW5zdGFuY2UoKQorCisKIGRlZiBtYWluKGFyZ3YpOgogICBkaXN0X2RpciA9IG9zLmVudmlyb24uZ2V0KCdESVNUX0RJUicpCiAgIGlmIGRpc3RfZGlyOgpAQCAtMjA1LDMgKzMzNyw3IEBACiAgICAgICAgIGZpbGVuYW1lPWxvZ19maWxlLAogICAgICkKICAgc3lzLmV4aXQoYnVpbGRfdGVzdF9zdWl0ZXMoYXJndikpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgbWFpbihzeXMuYXJndlsxOl0pCmRpZmYgLS1naXQgYS9jaS9idWlsZF90ZXN0X3N1aXRlc190ZXN0LnB5IGIvY2kvYnVpbGRfdGVzdF9zdWl0ZXNfdGVzdC5weQppbmRleCBmZDA2YTNhLi4xOTA3NDBmIDEwMDY0NAotLS0gYS9jaS9idWlsZF90ZXN0X3N1aXRlc190ZXN0LnB5CisrKyBiL2NpL2J1aWxkX3Rlc3Rfc3VpdGVzX3Rlc3QucHkKQEAgLTM3LDYgKzM3LDggQEAKIGltcG9ydCBjaV90ZXN0X2xpYgogaW1wb3J0IG9wdGltaXplZF90YXJnZXRzCiBmcm9tIHB5ZmFrZWZzIGltcG9ydCBmYWtlX2ZpbGVzeXN0ZW1fdW5pdHRlc3QKK2ltcG9ydCBtZXRyaWNzX2FnZW50CitpbXBvcnQgdGVzdF9kaXNjb3ZlcnlfYWdlbnQKIAogCiBjbGFzcyBCdWlsZFRlc3RTdWl0ZXNUZXN0KGZha2VfZmlsZXN5c3RlbV91bml0dGVzdC5UZXN0Q2FzZSk6CkBAIC01Miw2ICs1NCwxMCBAQAogICAgIHNlbGYuYWRkQ2xlYW51cChzdWJwcm9jZXNzX3J1bl9wYXRjaGVyLnN0b3ApCiAgICAgc2VsZi5tb2NrX3N1YnByb2Nlc3NfcnVuID0gc3VicHJvY2Vzc19ydW5fcGF0Y2hlci5zdGFydCgpCiAKKyAgICBtZXRyaWNzX2FnZW50X2ZpbmFsaXplX3BhdGNoZXIgPSBtb2NrLnBhdGNoKCdtZXRyaWNzX2FnZW50Lk1ldHJpY3NBZ2VudC5lbmRfcmVwb3J0aW5nJykKKyAgICBzZWxmLmFkZENsZWFudXAobWV0cmljc19hZ2VudF9maW5hbGl6ZV9wYXRjaGVyLnN0b3ApCisgICAgc2VsZi5tb2NrX21ldHJpY3NfYWdlbnRfZW5kID0gbWV0cmljc19hZ2VudF9maW5hbGl6ZV9wYXRjaGVyLnN0YXJ0KCkKKwogICAgIHNlbGYuX3NldHVwX3dvcmtpbmdfYnVpbGRfZW52KCkKIAogICBkZWYgdGVzdF9taXNzaW5nX3RhcmdldF9yZWxlYXNlX2Vudl92YXJfcmFpc2VzKHNlbGYpOgpAQCAtNzIsNiArNzgsMTIgQEAKICAgICB3aXRoIHNlbGYuYXNzZXJ0X3JhaXNlc193b3JkKGJ1aWxkX3Rlc3Rfc3VpdGVzLkVycm9yLCAnVE9QJyk6CiAgICAgICBidWlsZF90ZXN0X3N1aXRlcy5tYWluKFtdKQogCisgIGRlZiB0ZXN0X21pc3NpbmdfZGlzdF9kaXJfZW52X3Zhcl9yYWlzZXMoc2VsZik6CisgICAgZGVsIG9zLmVudmlyb25bJ0RJU1RfRElSJ10KKworICAgIHdpdGggc2VsZi5hc3NlcnRfcmFpc2VzX3dvcmQoYnVpbGRfdGVzdF9zdWl0ZXMuRXJyb3IsICdESVNUX0RJUicpOgorICAgICAgYnVpbGRfdGVzdF9zdWl0ZXMubWFpbihbXSkKKwogICBkZWYgdGVzdF9pbnZhbGlkX2FyZ19yYWlzZXMoc2VsZik6CiAgICAgaW52YWxpZF9hcmdzID0gWyctLWludmFsaWRfYXJnJ10KIApAQCAtMTA4LDYgKzEyMCw5IEBACiAgICAgc2VsZi5zb29uZ191aV9kaXIgPSBzZWxmLmZha2VfdG9wLmpvaW5wYXRoKCdidWlsZC9zb29uZycpCiAgICAgc2VsZi5zb29uZ191aV9kaXIubWtkaXIocGFyZW50cz1UcnVlLCBleGlzdF9vaz1UcnVlKQogCisgICAgc2VsZi5sb2dzX2RpciA9IHNlbGYuZmFrZV90b3Auam9pbnBhdGgoJ2Rpc3QvbG9ncycpCisgICAgc2VsZi5sb2dzX2Rpci5ta2RpcihwYXJlbnRzPVRydWUsIGV4aXN0X29rPVRydWUpCisKICAgICBzZWxmLnNvb25nX3VpID0gc2VsZi5zb29uZ191aV9kaXIuam9pbnBhdGgoJ3Nvb25nX3VpLmJhc2gnKQogICAgIHNlbGYuc29vbmdfdWkudG91Y2goKQogCkBAIC0xMTUsNiArMTMwLDcgQEAKICAgICAgICAgJ1RBUkdFVF9SRUxFQVNFJzogJ3JlbGVhc2UnLAogICAgICAgICAnVEFSR0VUX1BST0RVQ1QnOiAncHJvZHVjdCcsCiAgICAgICAgICdUT1AnOiBzdHIoc2VsZi5mYWtlX3RvcCksCisgICAgICAgICdESVNUX0RJUic6IHN0cihzZWxmLmZha2VfdG9wLmpvaW5wYXRoKCdkaXN0JykpLAogICAgIH0pCiAKICAgICBzZWxmLm1vY2tfc3VicHJvY2Vzc19ydW4ucmV0dXJuX3ZhbHVlID0gMApAQCAtMjU2LDYgKzI3MiwxMiBAQAogICAgIGRlZiBnZXRfZW5hYmxlZF9mbGFnKHNlbGYpOgogICAgICAgcmV0dXJuIGYne3NlbGYudGFyZ2V0fV9lbmFibGVkJwogCisgIGRlZiBzZXRVcChzZWxmKToKKyAgICB0ZXN0X2Rpc2NvdmVyeV9hZ2VudF9wYXRjaGVyID0gbW9jay5wYXRjaCgndGVzdF9kaXNjb3ZlcnlfYWdlbnQuVGVzdERpc2NvdmVyeUFnZW50LmRpc2NvdmVyX3Rlc3RfemlwX3JlZ2V4ZXMnKQorICAgIHNlbGYuYWRkQ2xlYW51cCh0ZXN0X2Rpc2NvdmVyeV9hZ2VudF9wYXRjaGVyLnN0b3ApCisgICAgc2VsZi5tb2NrX3Rlc3RfZGlzY292ZXJ5X2FnZW50X2VuZCA9IHRlc3RfZGlzY292ZXJ5X2FnZW50X3BhdGNoZXIuc3RhcnQoKQorCisKICAgZGVmIHRlc3RfYnVpbGRfb3B0aW1pemF0aW9uX29mZl9idWlsZHNfZXZlcnl0aGluZyhzZWxmKToKICAgICBidWlsZF90YXJnZXRzID0geyd0YXJnZXRfMScsICd0YXJnZXRfMid9CiAgICAgYnVpbGRfcGxhbm5lciA9IHNlbGYuY3JlYXRlX2J1aWxkX3BsYW5uZXIoCkBAIC0yNzYsMTQgKzI5OCwxNiBAQAogCiAgICAgYnVpbGRfcGxhbiA9IGJ1aWxkX3BsYW5uZXIuY3JlYXRlX2J1aWxkX3BsYW4oKQogCi0gICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oYnVpbGRfcGxhbi5wYWNrYWdpbmdfY29tbWFuZHMpLCAwKQorICAgIGZvciBwYWNrYWdpbmdfY29tbWFuZCBpbiBzZWxmLnJ1bl9wYWNrYWdpbmdfY29tbWFuZHMoYnVpbGRfcGxhbik6CisgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihwYWNrYWdpbmdfY29tbWFuZCksIDApCiAKICAgZGVmIHRlc3RfYnVpbGRfb3B0aW1pemF0aW9uX29uX29wdGltaXplc190YXJnZXQoc2VsZik6CiAgICAgYnVpbGRfdGFyZ2V0cyA9IHsndGFyZ2V0XzEnLCAndGFyZ2V0XzInfQogICAgIGJ1aWxkX3BsYW5uZXIgPSBzZWxmLmNyZWF0ZV9idWlsZF9wbGFubmVyKAogICAgICAgICBidWlsZF90YXJnZXRzPWJ1aWxkX3RhcmdldHMsCiAgICAgICAgIGJ1aWxkX2NvbnRleHQ9c2VsZi5jcmVhdGVfYnVpbGRfY29udGV4dCgKLSAgICAgICAgICAgIGVuYWJsZWRfYnVpbGRfZmVhdHVyZXM9W3snbmFtZSc6IHNlbGYuZ2V0X3RhcmdldF9mbGFnKCd0YXJnZXRfMScpfV0KKyAgICAgICAgICAgIGVuYWJsZWRfYnVpbGRfZmVhdHVyZXM9W3snbmFtZSc6IHNlbGYuZ2V0X3RhcmdldF9mbGFnKCd0YXJnZXRfMScpfV0sCisgICAgICAgICAgICB0ZXN0X2NvbnRleHQ9c2VsZi5nZXRfdGVzdF9jb250ZXh0KCd0YXJnZXRfMScpLAogICAgICAgICApLAogICAgICkKIApAQCAtMjk5LDE0ICszMjMsMTUgQEAKICAgICBidWlsZF9wbGFubmVyID0gc2VsZi5jcmVhdGVfYnVpbGRfcGxhbm5lcigKICAgICAgICAgYnVpbGRfdGFyZ2V0cz1idWlsZF90YXJnZXRzLAogICAgICAgICBidWlsZF9jb250ZXh0PXNlbGYuY3JlYXRlX2J1aWxkX2NvbnRleHQoCi0gICAgICAgICAgICBlbmFibGVkX2J1aWxkX2ZlYXR1cmVzPVt7J25hbWUnOiBzZWxmLmdldF90YXJnZXRfZmxhZygndGFyZ2V0XzEnKX1dCisgICAgICAgICAgICBlbmFibGVkX2J1aWxkX2ZlYXR1cmVzPVt7J25hbWUnOiBzZWxmLmdldF90YXJnZXRfZmxhZygndGFyZ2V0XzEnKX1dLAorICAgICAgICAgICAgdGVzdF9jb250ZXh0PXNlbGYuZ2V0X3Rlc3RfY29udGV4dCgndGFyZ2V0XzEnKSwKICAgICAgICAgKSwKICAgICAgICAgcGFja2FnaW5nX2NvbW1hbmRzPXBhY2thZ2luZ19jb21tYW5kcywKICAgICApCiAKICAgICBidWlsZF9wbGFuID0gYnVpbGRfcGxhbm5lci5jcmVhdGVfYnVpbGRfcGxhbigpCiAKLSAgICBzZWxmLmFzc2VydEluKFtmJ3BhY2thZ2luZyB7b3B0aW1pemVkX3RhcmdldF9uYW1lfSddLCBidWlsZF9wbGFuLnBhY2thZ2luZ19jb21tYW5kcykKKyAgICBzZWxmLmFzc2VydEluKHBhY2thZ2luZ19jb21tYW5kcywgc2VsZi5ydW5fcGFja2FnaW5nX2NvbW1hbmRzKGJ1aWxkX3BsYW4pKQogCiAgIGRlZiB0ZXN0X2luZGl2aWR1YWxfYnVpbGRfb3B0aW1pemF0aW9uX29mZl9kb2VzbnRfb3B0aW1pemUoc2VsZik6CiAgICAgYnVpbGRfdGFyZ2V0cyA9IHsndGFyZ2V0XzEnLCAndGFyZ2V0XzInfQpAQCAtMzI4LDcgKzM1Myw4IEBACiAKICAgICBidWlsZF9wbGFuID0gYnVpbGRfcGxhbm5lci5jcmVhdGVfYnVpbGRfcGxhbigpCiAKLSAgICBzZWxmLmFzc2VydEZhbHNlKGJ1aWxkX3BsYW4ucGFja2FnaW5nX2NvbW1hbmRzKQorICAgIGZvciBwYWNrYWdpbmdfY29tbWFuZCBpbiBzZWxmLnJ1bl9wYWNrYWdpbmdfY29tbWFuZHMoYnVpbGRfcGxhbik6CisgICAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihwYWNrYWdpbmdfY29tbWFuZCksIDApCiAKICAgZGVmIHRlc3RfdGFyZ2V0X291dHB1dF91c2VkX3RhcmdldF9idWlsdChzZWxmKToKICAgICBidWlsZF90YXJnZXQgPSAndGVzdF90YXJnZXQnCkBAIC00ODUsNiArNTExLDEyIEBACiAgICAgICAgIF0sCiAgICAgfQogCisgIGRlZiBydW5fcGFja2FnaW5nX2NvbW1hbmRzKHNlbGYsIGJ1aWxkX3BsYW46IGJ1aWxkX3Rlc3Rfc3VpdGVzLkJ1aWxkUGxhbik6CisgICAgcmV0dXJuIFsKKyAgICAgICAgcGFja2FnaW5nX2NvbW1hbmRfZ2V0dGVyKCkKKyAgICAgICAgZm9yIHBhY2thZ2luZ19jb21tYW5kX2dldHRlciBpbiBidWlsZF9wbGFuLnBhY2thZ2luZ19jb21tYW5kc19nZXR0ZXJzCisgICAgXQorCiAKIGRlZiB3YWl0X3VudGlsKAogICAgIGNvbmRpdGlvbl9mdW5jdGlvbjogQ2FsbGFibGVbW10sIGJvb2xdLApkaWZmIC0tZ2l0IGEvY2kvbWV0cmljc19hZ2VudC5weSBiL2NpL21ldHJpY3NfYWdlbnQucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMyNDc5ZQotLS0gL2Rldi9udWxsCisrKyBiL2NpL21ldHJpY3NfYWdlbnQucHkKQEAgLTAsMCArMSwxMTYgQEAKKyMgQ29weXJpZ2h0IDIwMjQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIiIiTWV0cmljc0FnZW50IGlzIGEgc2luZ2xldG9uIGNsYXNzIHRoYXQgY29sbGVjdHMgbWV0cmljcyBmb3Igb3B0aW1pemVkIGJ1aWxkLiIiIgorCitmcm9tIGVudW0gaW1wb3J0IEVudW0KK2ltcG9ydCB0aW1lCitpbXBvcnQgbWV0cmljc19wYjIKK2ltcG9ydCBvcworaW1wb3J0IGxvZ2dpbmcKKworCitjbGFzcyBNZXRyaWNzQWdlbnQ6CisgIF9TT09OR19NRVRSSUNTX1BBVEggPSAnbG9ncy9zb29uZ19tZXRyaWNzJworICBfRElTVF9ESVIgPSAnRElTVF9ESVInCisgIF9pbnN0YW5jZSA9IE5vbmUKKworICBkZWYgX19pbml0X18oc2VsZik6CisgICAgcmFpc2UgUnVudGltZUVycm9yKAorICAgICAgICAnTWV0cmljc0FnZW50IGNhbm5vdCBiZSBpbnN0YW50aWFsaXplZCwgdXNlIGluc3RhbmNlKCkgaW5zdGVhZCcKKyAgICApCisKKyAgQGNsYXNzbWV0aG9kCisgIGRlZiBpbnN0YW5jZShjbHMpOgorICAgIGlmIG5vdCBjbHMuX2luc3RhbmNlOgorICAgICAgY2xzLl9pbnN0YW5jZSA9IGNscy5fX25ld19fKGNscykKKyAgICAgIGNscy5faW5zdGFuY2UuX3Byb3RvID0gbWV0cmljc19wYjIuT3B0aW1pemVkQnVpbGRNZXRyaWNzKCkKKyAgICAgIGNscy5faW5zdGFuY2UuX2luaXRfcHJvdG8oKQorICAgICAgY2xzLl9pbnN0YW5jZS5fdGFyZ2V0X3Jlc3VsdHMgPSBkaWN0KCkKKworICAgIHJldHVybiBjbHMuX2luc3RhbmNlCisKKyAgZGVmIF9pbml0X3Byb3RvKHNlbGYpOgorICAgIHNlbGYuX3Byb3RvLmFuYWx5c2lzX3BlcmYubmFtZSA9ICdPcHRpbWl6ZWQgYnVpbGQgYW5hbHlzaXMgdGltZS4nCisgICAgc2VsZi5fcHJvdG8ucGFja2FnaW5nX3BlcmYubmFtZSA9ICdPcHRpbWl6ZWQgYnVpbGQgdG90YWwgcGFja2FnaW5nIHRpbWUuJworCisgIGRlZiBhbmFseXNpc19zdGFydChzZWxmKToKKyAgICBzZWxmLl9wcm90by5hbmFseXNpc19wZXJmLnN0YXJ0X3RpbWUgPSB0aW1lLnRpbWVfbnMoKQorCisgIGRlZiBhbmFseXNpc19lbmQoc2VsZik6CisgICAgc2VsZi5fcHJvdG8uYW5hbHlzaXNfcGVyZi5yZWFsX3RpbWUgPSAoCisgICAgICAgIHRpbWUudGltZV9ucygpIC0gc2VsZi5fcHJvdG8uYW5hbHlzaXNfcGVyZi5zdGFydF90aW1lCisgICAgKQorCisgIGRlZiBwYWNrYWdpbmdfc3RhcnQoc2VsZik6CisgICAgc2VsZi5fcHJvdG8ucGFja2FnaW5nX3BlcmYuc3RhcnRfdGltZSA9IHRpbWUudGltZV9ucygpCisKKyAgZGVmIHBhY2thZ2luZ19lbmQoc2VsZik6CisgICAgc2VsZi5fcHJvdG8ucGFja2FnaW5nX3BlcmYucmVhbF90aW1lID0gKAorICAgICAgICB0aW1lLnRpbWVfbnMoKSAtIHNlbGYuX3Byb3RvLnBhY2thZ2luZ19wZXJmLnN0YXJ0X3RpbWUKKyAgICApCisKKyAgZGVmIHJlcG9ydF9vcHRpbWl6ZWRfdGFyZ2V0KHNlbGYsIG5hbWU6IHN0cik6CisgICAgdGFyZ2V0X3Jlc3VsdCA9IG1ldHJpY3NfcGIyLk9wdGltaXplZEJ1aWxkTWV0cmljcy5UYXJnZXRPcHRpbWl6YXRpb25SZXN1bHQoKQorICAgIHRhcmdldF9yZXN1bHQubmFtZSA9IG5hbWUKKyAgICB0YXJnZXRfcmVzdWx0Lm9wdGltaXplZCA9IFRydWUKKyAgICBzZWxmLl90YXJnZXRfcmVzdWx0c1tuYW1lXSA9IHRhcmdldF9yZXN1bHQKKworICBkZWYgcmVwb3J0X3Vub3B0aW1pemVkX3RhcmdldChzZWxmLCBuYW1lOiBzdHIsIG9wdGltaXphdGlvbl9yYXRpb25hbGU6IHN0cik6CisgICAgdGFyZ2V0X3Jlc3VsdCA9IG1ldHJpY3NfcGIyLk9wdGltaXplZEJ1aWxkTWV0cmljcy5UYXJnZXRPcHRpbWl6YXRpb25SZXN1bHQoKQorICAgIHRhcmdldF9yZXN1bHQubmFtZSA9IG5hbWUKKyAgICB0YXJnZXRfcmVzdWx0Lm9wdGltaXphdGlvbl9yYXRpb25hbGUgPSBvcHRpbWl6YXRpb25fcmF0aW9uYWxlCisgICAgdGFyZ2V0X3Jlc3VsdC5vcHRpbWl6ZWQgPSBGYWxzZQorICAgIHNlbGYuX3RhcmdldF9yZXN1bHRzW25hbWVdID0gdGFyZ2V0X3Jlc3VsdAorCisgIGRlZiB0YXJnZXRfcGFja2FnaW5nX3N0YXJ0KHNlbGYsIG5hbWU6IHN0cik6CisgICAgdGFyZ2V0X3Jlc3VsdCA9IHNlbGYuX3RhcmdldF9yZXN1bHRzLmdldChuYW1lKQorICAgIHRhcmdldF9yZXN1bHQucGFja2FnaW5nX3BlcmYuc3RhcnRfdGltZSA9IHRpbWUudGltZV9ucygpCisgICAgc2VsZi5fdGFyZ2V0X3Jlc3VsdHNbbmFtZV0gPSB0YXJnZXRfcmVzdWx0CisKKyAgZGVmIHRhcmdldF9wYWNrYWdpbmdfZW5kKHNlbGYsIG5hbWU6IHN0cik6CisgICAgdGFyZ2V0X3Jlc3VsdCA9IHNlbGYuX3RhcmdldF9yZXN1bHRzLmdldChuYW1lKQorICAgIHRhcmdldF9yZXN1bHQucGFja2FnaW5nX3BlcmYucmVhbF90aW1lID0gKAorICAgICAgICB0aW1lLnRpbWVfbnMoKSAtIHRhcmdldF9yZXN1bHQucGFja2FnaW5nX3BlcmYuc3RhcnRfdGltZQorICAgICkKKworICBkZWYgYWRkX3RhcmdldF9hcnRpZmFjdCgKKyAgICAgIHNlbGYsCisgICAgICB0YXJnZXRfbmFtZTogc3RyLAorICAgICAgYXJ0aWZhY3RfbmFtZTogc3RyLAorICAgICAgc2l6ZTogaW50LAorICAgICAgaW5jbHVkZWRfbW9kdWxlczogc2V0W3N0cl0sCisgICk6CisgICAgdGFyZ2V0X3Jlc3VsdCA9IHNlbGYudGFyZ2V0X3Jlc3VsdHMuZ2V0KHRhcmdldF9uYW1lKQorICAgIGFydGlmYWN0ID0gKAorICAgICAgICBtZXRyaWNzX3BiMi5PcHRpbWl6ZWRCdWlsZE1ldHJpY3MuVGFyZ2V0T3B0aW1pemF0aW9uUmVzdWx0Lk91dHB1dEFydGlmYWN0KCkKKyAgICApCisgICAgYXJ0aWZhY3QubmFtZSA9IGFydGlmYWN0X25hbWUKKyAgICBhcnRpZmFjdC5zaXplID0gc2l6ZQorICAgIGZvciBtb2R1bGUgaW4gaW5jbHVkZWRfbW9kdWxlczoKKyAgICAgIGFydGlmYWN0LmluY2x1ZGVkX21vZHVsZXMuYWRkKG1vZHVsZSkKKyAgICB0YXJnZXRfcmVzdWx0Lm91dHB1dF9hcnRpZmFjdHMuYWRkKGFydGlmYWN0KQorCisgIGRlZiBlbmRfcmVwb3J0aW5nKHNlbGYpOgorICAgIGZvciB0YXJnZXRfcmVzdWx0IGluIHNlbGYuX3RhcmdldF9yZXN1bHRzLnZhbHVlcygpOgorICAgICAgc2VsZi5fcHJvdG8udGFyZ2V0X3Jlc3VsdC5hcHBlbmQodGFyZ2V0X3Jlc3VsdCkKKyAgICBzb29uZ19tZXRyaWNzX3Byb3RvID0gbWV0cmljc19wYjIuTWV0cmljc0Jhc2UoKQorICAgICMgUmVhZCBpbiBleGlzdGluZyBtZXRyaWNzIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiB3cml0dGVuIG91dCBieSB0aGUgc29vbmcKKyAgICAjIGJ1aWxkIGNvbW1hbmQgc28gdGhhdCB3ZSBkb24ndCBvdmVyd3JpdGUgdGhlbS4KKyAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKG9zLmVudmlyb25bc2VsZi5fRElTVF9ESVJdLCBzZWxmLl9TT09OR19NRVRSSUNTX1BBVEgpLCAncmInKSBhcyBmOgorICAgICAgc29vbmdfbWV0cmljc19wcm90by5QYXJzZUZyb21TdHJpbmcoZi5yZWFkKCkpCisgICAgc29vbmdfbWV0cmljc19wcm90by5vcHRpbWl6ZWRfYnVpbGRfbWV0cmljcy5Db3B5RnJvbShzZWxmLl9wcm90bykKKyAgICBsb2dnaW5nLmluZm8oc29vbmdfbWV0cmljc19wcm90bykKKyAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKG9zLmVudmlyb25bc2VsZi5fRElTVF9ESVJdLCBzZWxmLl9TT09OR19NRVRSSUNTX1BBVEgpLCAnd2InKSBhcyBmOgorICAgICAgZi53cml0ZShzb29uZ19tZXRyaWNzX3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCmRpZmYgLS1naXQgYS9jaS9vcHRpbWl6ZWRfdGFyZ2V0cy5weSBiL2NpL29wdGltaXplZF90YXJnZXRzLnB5CmluZGV4IDkxNDNjYmYuLjY4OGJkZDggMTAwNjQ0Ci0tLSBhL2NpL29wdGltaXplZF90YXJnZXRzLnB5CisrKyBiL2NpL29wdGltaXplZF90YXJnZXRzLnB5CkBAIC0xNiwxMiArMTYsMTMgQEAKIGZyb20gYWJjIGltcG9ydCBBQkMKIGltcG9ydCBhcmdwYXJzZQogaW1wb3J0IGZ1bmN0b29scwotZnJvbSBidWlsZF9jb250ZXh0IGltcG9ydCBCdWlsZENvbnRleHQKIGltcG9ydCBqc29uCiBpbXBvcnQgbG9nZ2luZwogaW1wb3J0IG9zCi1mcm9tIHR5cGluZyBpbXBvcnQgU2VsZgoraW1wb3J0IHBhdGhsaWIKK2ltcG9ydCBzdWJwcm9jZXNzCiAKK2Zyb20gYnVpbGRfY29udGV4dCBpbXBvcnQgQnVpbGRDb250ZXh0CiBpbXBvcnQgdGVzdF9tYXBwaW5nX21vZHVsZV9yZXRyaWV2ZXIKIAogCkBAIC0zMyw2ICszNCw5IEBACiAgIGJ1aWxkLgogICAiIiIKIAorICBfU09PTkdfVUlfQkFTSF9QQVRIID0gJ2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2gnCisgIF9QUkVCVUlMVF9TT09OR19aSVBfUEFUSCA9ICdwcmVidWlsdHMvYnVpbGQtdG9vbHMvbGludXgteDg2L2Jpbi9zb29uZ196aXAnCisKICAgZGVmIF9faW5pdF9fKAogICAgICAgc2VsZiwKICAgICAgIHRhcmdldDogc3RyLApAQCAtNzUsNiArNzksODggQEAKICAgICAgICAgZidnZXRfYnVpbGRfdGFyZ2V0c19pbXBsIG5vdCBpbXBsZW1lbnRlZCBpbiB7dHlwZShzZWxmKS5fX25hbWVfX30nCiAgICAgKQogCisgIGRlZiBfZ2VuZXJhdGVfemlwX29wdGlvbnNfZm9yX2l0ZW1zKAorICAgICAgc2VsZiwKKyAgICAgIHByZWZpeDogc3RyID0gJycsCisgICAgICByZWxhdGl2ZV9yb290OiBzdHIgPSAnJywKKyAgICAgIGxpc3RfZmlsZXM6IGxpc3Rbc3RyXSB8IE5vbmUgPSBOb25lLAorICAgICAgZmlsZXM6IGxpc3Rbc3RyXSB8IE5vbmUgPSBOb25lLAorICAgICAgZGlyZWN0b3JpZXM6IGxpc3Rbc3RyXSB8IE5vbmUgPSBOb25lLAorICApIC0+IGxpc3Rbc3RyXToKKyAgICBpZiBub3QgbGlzdF9maWxlcyBhbmQgbm90IGZpbGVzIGFuZCBub3QgZGlyZWN0b3JpZXM6CisgICAgICByYWlzZSBSdW50aW1lRXJyb3IoCisgICAgICAgICAgZidObyBpdGVtcyBzcGVjaWZpZWQgdG8gYmUgYWRkZWQgdG8gemlwISBQcmVmaXg6IHtwcmVmaXh9LCBSZWxhdGl2ZScKKyAgICAgICAgICBmJyByb290OiB7cmVsYXRpdmVfcm9vdH0nCisgICAgICApCisgICAgY29tbWFuZF9zZWdtZW50ID0gW10KKyAgICAjIFRoZXNlIGFyZSBhbGwgc29vbmdfemlwIG9wdGlvbnMgc28gY29uc3VsdCBzb29uZ196aXAgLS1oZWxwIGZvciBzcGVjaWZpY3MuCisgICAgaWYgcHJlZml4OgorICAgICAgY29tbWFuZF9zZWdtZW50LmFwcGVuZCgnLVAnKQorICAgICAgY29tbWFuZF9zZWdtZW50LmFwcGVuZChwcmVmaXgpCisgICAgaWYgcmVsYXRpdmVfcm9vdDoKKyAgICAgIGNvbW1hbmRfc2VnbWVudC5hcHBlbmQoJy1DJykKKyAgICAgIGNvbW1hbmRfc2VnbWVudC5hcHBlbmQocmVsYXRpdmVfcm9vdCkKKyAgICBpZiBsaXN0X2ZpbGVzOgorICAgICAgZm9yIGxpc3RfZmlsZSBpbiBsaXN0X2ZpbGVzOgorICAgICAgICBjb21tYW5kX3NlZ21lbnQuYXBwZW5kKCctbCcpCisgICAgICAgIGNvbW1hbmRfc2VnbWVudC5hcHBlbmQobGlzdF9maWxlKQorICAgIGlmIGZpbGVzOgorICAgICAgZm9yIGZpbGUgaW4gZmlsZXM6CisgICAgICAgIGNvbW1hbmRfc2VnbWVudC5hcHBlbmQoJy1mJykKKyAgICAgICAgY29tbWFuZF9zZWdtZW50LmFwcGVuZChmaWxlKQorICAgIGlmIGRpcmVjdG9yaWVzOgorICAgICAgZm9yIGRpcmVjdG9yeSBpbiBkaXJlY3RvcmllczoKKyAgICAgICAgY29tbWFuZF9zZWdtZW50LmFwcGVuZCgnLUQnKQorICAgICAgICBjb21tYW5kX3NlZ21lbnQuYXBwZW5kKGRpcmVjdG9yeSkKKworICAgIHJldHVybiBjb21tYW5kX3NlZ21lbnQKKworICBkZWYgX3F1ZXJ5X3Nvb25nX3ZhcnMoCisgICAgICBzZWxmLCBzcmNfdG9wOiBwYXRobGliLlBhdGgsIHNvb25nX3ZhcnM6IGxpc3Rbc3RyXQorICApIC0+IGRpY3Rbc3RyLCBzdHJdOgorICAgIHByb2Nlc3NfcmVzdWx0ID0gc3VicHJvY2Vzcy5ydW4oCisgICAgICAgIGFyZ3M9WworICAgICAgICAgICAgZid7c3JjX3RvcCAvIHNlbGYuX1NPT05HX1VJX0JBU0hfUEFUSH0nLAorICAgICAgICAgICAgJy0tZHVtcHZhcnMtbW9kZScsCisgICAgICAgICAgICBmJy0tYWJzLXZhcnM9eyIgIi5qb2luKHNvb25nX3ZhcnMpfScsCisgICAgICAgIF0sCisgICAgICAgIGVudj1vcy5lbnZpcm9uLAorICAgICAgICBjaGVjaz1GYWxzZSwKKyAgICAgICAgY2FwdHVyZV9vdXRwdXQ9VHJ1ZSwKKyAgICAgICAgdGV4dD1UcnVlLAorICAgICkKKyAgICBpZiBub3QgcHJvY2Vzc19yZXN1bHQucmV0dXJuY29kZSA9PSAwOgorICAgICAgbG9nZ2luZy5lcnJvcignc29vbmcgZHVtcHZhcnMgY29tbWFuZCBmYWlsZWQhIHN0ZGVycjonKQorICAgICAgbG9nZ2luZy5lcnJvcihwcm9jZXNzX3Jlc3VsdC5zdGRlcnIpCisgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ1Nvb25nIGR1bXB2YXJzIGZhaWxlZCEgU2VlIGxvZyBmb3Igc3RkZXJyLicpCisKKyAgICBpZiBub3QgcHJvY2Vzc19yZXN1bHQuc3Rkb3V0OgorICAgICAgcmFpc2UgUnVudGltZUVycm9yKAorICAgICAgICAgICdOZWNlc3Nhcnkgc29vbmcgdmFyaWFibGVzICcgKyBzb29uZ192YXJzICsgJyBub3QgZm91bmQuJworICAgICAgKQorCisgICAgdHJ5OgorICAgICAgcmV0dXJuIHsKKyAgICAgICAgICBsaW5lLnNwbGl0KCc9JylbMF06IGxpbmUuc3BsaXQoJz0nKVsxXS5zdHJpcCgiJyIpCisgICAgICAgICAgZm9yIGxpbmUgaW4gcHJvY2Vzc19yZXN1bHQuc3Rkb3V0LnN0cmlwKCkuc3BsaXQoJ1xuJykKKyAgICAgIH0KKyAgICBleGNlcHQgSW5kZXhFcnJvciBhcyBlOgorICAgICAgcmFpc2UgUnVudGltZUVycm9yKAorICAgICAgICAgICdFcnJvciBwYXJzaW5nIHNvb25nIGR1bXB2YXJzIG91dHB1dCEgU2VlIG91dHB1dCBoZXJlOicKKyAgICAgICAgICBmJyB7cHJvY2Vzc19yZXN1bHQuc3Rkb3V0fScsCisgICAgICAgICAgZSwKKyAgICAgICkKKworICBkZWYgX2Jhc2VfemlwX2NvbW1hbmQoCisgICAgICBzZWxmLCBzcmNfdG9wOiBwYXRobGliLlBhdGgsIGRpc3RfZGlyOiBwYXRobGliLlBhdGgsIG5hbWU6IHN0cgorICApIC0+IGxpc3Rbc3RyXToKKyAgICByZXR1cm4gWworICAgICAgICBmJ3tzcmNfdG9wIC8gc2VsZi5fUFJFQlVJTFRfU09PTkdfWklQX1BBVEggfScsCisgICAgICAgICctZCcsCisgICAgICAgICctbycsCisgICAgICAgIGYne2Rpc3RfZGlyIC8gbmFtZX0nLAorICAgIF0KKwogCiBjbGFzcyBOdWxsT3B0aW1pemVyKE9wdGltaXplZEJ1aWxkVGFyZ2V0KToKICAgIiIiTm8tb3AgdGFyZ2V0IG9wdGltaXplci4KQEAgLTEyMSw4ICsyMDcsNiBAQAogY2xhc3MgR2VuZXJhbFRlc3RzT3B0aW1pemVyKE9wdGltaXplZEJ1aWxkVGFyZ2V0KToKICAgIiIiZ2VuZXJhbC10ZXN0cyBvcHRpbWl6ZXIKIAotICBUT0RPKGIvMzU4MjE1MjM1KTogSW1wbGVtZW50Ci0KICAgVGhpcyBvcHRpbWl6ZXIgcmVhZHMgaW4gdGhlIGxpc3Qgb2YgY2hhbmdlZCBmaWxlcyBmcm9tIHRoZSBmaWxlIGxvY2F0ZWQgaW4KICAgZW52W0NIQU5HRV9JTkZPXSBhbmQgdXNlcyB0aGlzIGxpc3QgYWxvbmdzaWRlIHRoZSBub3JtYWwgVEVTVCBNQVBQSU5HIGxvZ2ljIHRvCiAgIGRldGVybWluZSB3aGF0IHRlc3QgbWFwcGluZyBtb2R1bGVzIHdpbGwgcnVuIGZvciB0aGUgZ2l2ZW4gY2hhbmdlcy4gSXQgdGhlbgpAQCAtMTMwLDEwICsyMTQsMTMgQEAKICAgbm9ybWFsbHkgYnVpbHQuCiAgICIiIgogCi0gICMgTGlzdCBvZiBtb2R1bGVzIHRoYXQgYXJlIGFsd2F5cyByZXF1aXJlZCB0byBiZSBpbiBnZW5lcmFsLXRlc3RzLnppcC4KLSAgX1JFUVVJUkVEX01PRFVMRVMgPSBmcm96ZW5zZXQoCi0gICAgICBbJ2N0cy10cmFkZWZlZCcsICd2dHMtdHJhZGVmZWQnLCAnY29tcGF0aWJpbGl0eS1ob3N0LXV0aWwnXQotICApCisgICMgTGlzdCBvZiBtb2R1bGVzIHRoYXQgYXJlIGJ1aWx0IGFsb25nc2lkZSBnZW5lcmFsLXRlc3RzIGFzIGRlcGVuZGVuY2llcy4KKyAgX1JFUVVJUkVEX01PRFVMRVMgPSBmcm96ZW5zZXQoWworICAgICAgJ2N0cy10cmFkZWZlZCcsCisgICAgICAndnRzLXRyYWRlZmVkJywKKyAgICAgICdjb21wYXRpYmlsaXR5LWhvc3QtdXRpbCcsCisgICAgICAnZ2VuZXJhbC10ZXN0cy1zaGFyZWQtbGlicycsCisgIF0pCiAKICAgZGVmIGdldF9idWlsZF90YXJnZXRzX2ltcGwoc2VsZikgLT4gc2V0W3N0cl06CiAgICAgY2hhbmdlX2luZm9fZmlsZV9wYXRoID0gb3MuZW52aXJvbi5nZXQoJ0NIQU5HRV9JTkZPJykKQEAgLTE3Nyw2ICsyNjQsMjEyIEBACiAKICAgICByZXR1cm4gbW9kdWxlc190b19idWlsZAogCisgIGRlZiBnZXRfcGFja2FnZV9vdXRwdXRzX2NvbW1hbmRzX2ltcGwoc2VsZik6CisgICAgc3JjX3RvcCA9IHBhdGhsaWIuUGF0aChvcy5lbnZpcm9uLmdldCgnVE9QJywgb3MuZ2V0Y3dkKCkpKQorICAgIGRpc3RfZGlyID0gcGF0aGxpYi5QYXRoKG9zLmVudmlyb24uZ2V0KCdESVNUX0RJUicpKQorCisgICAgc29vbmdfdmFycyA9IHNlbGYuX3F1ZXJ5X3Nvb25nX3ZhcnMoCisgICAgICAgIHNyY190b3AsCisgICAgICAgIFsKKyAgICAgICAgICAgICdIT1NUX09VVF9URVNUQ0FTRVMnLAorICAgICAgICAgICAgJ1RBUkdFVF9PVVRfVEVTVENBU0VTJywKKyAgICAgICAgICAgICdQUk9EVUNUX09VVCcsCisgICAgICAgICAgICAnU09PTkdfSE9TVF9PVVQnLAorICAgICAgICAgICAgJ0hPU1RfT1VUJywKKyAgICAgICAgXSwKKyAgICApCisgICAgaG9zdF9vdXRfdGVzdGNhc2VzID0gcGF0aGxpYi5QYXRoKHNvb25nX3ZhcnMuZ2V0KCdIT1NUX09VVF9URVNUQ0FTRVMnKSkKKyAgICB0YXJnZXRfb3V0X3Rlc3RjYXNlcyA9IHBhdGhsaWIuUGF0aChzb29uZ192YXJzLmdldCgnVEFSR0VUX09VVF9URVNUQ0FTRVMnKSkKKyAgICBwcm9kdWN0X291dCA9IHBhdGhsaWIuUGF0aChzb29uZ192YXJzLmdldCgnUFJPRFVDVF9PVVQnKSkKKyAgICBzb29uZ19ob3N0X291dCA9IHBhdGhsaWIuUGF0aChzb29uZ192YXJzLmdldCgnU09PTkdfSE9TVF9PVVQnKSkKKyAgICBob3N0X291dCA9IHBhdGhsaWIuUGF0aChzb29uZ192YXJzLmdldCgnSE9TVF9PVVQnKSkKKworICAgIGhvc3RfcGF0aHMgPSBbXQorICAgIHRhcmdldF9wYXRocyA9IFtdCisgICAgaG9zdF9jb25maWdfZmlsZXMgPSBbXQorICAgIHRhcmdldF9jb25maWdfZmlsZXMgPSBbXQorICAgIGZvciBtb2R1bGUgaW4gc2VsZi5tb2R1bGVzX3RvX2J1aWxkOgorICAgICAgIyBUaGUgcmVxdWlyZWQgbW9kdWxlcyBhcmUgaGFuZGxlZCBzZXBhcmF0ZWx5LCBubyBuZWVkIHRvIHBhY2thZ2UuCisgICAgICBpZiBtb2R1bGUgaW4gc2VsZi5fUkVRVUlSRURfTU9EVUxFUzoKKyAgICAgICAgY29udGludWUKKworICAgICAgaG9zdF9wYXRoID0gaG9zdF9vdXRfdGVzdGNhc2VzIC8gbW9kdWxlCisgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhob3N0X3BhdGgpOgorICAgICAgICBob3N0X3BhdGhzLmFwcGVuZChob3N0X3BhdGgpCisgICAgICAgIHNlbGYuX2NvbGxlY3RfY29uZmlnX2ZpbGVzKHNyY190b3AsIGhvc3RfcGF0aCwgaG9zdF9jb25maWdfZmlsZXMpCisKKyAgICAgIHRhcmdldF9wYXRoID0gdGFyZ2V0X291dF90ZXN0Y2FzZXMgLyBtb2R1bGUKKyAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHRhcmdldF9wYXRoKToKKyAgICAgICAgdGFyZ2V0X3BhdGhzLmFwcGVuZCh0YXJnZXRfcGF0aCkKKyAgICAgICAgc2VsZi5fY29sbGVjdF9jb25maWdfZmlsZXMoc3JjX3RvcCwgdGFyZ2V0X3BhdGgsIHRhcmdldF9jb25maWdfZmlsZXMpCisKKyAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhob3N0X3BhdGgpIGFuZCBub3Qgb3MucGF0aC5leGlzdHModGFyZ2V0X3BhdGgpOgorICAgICAgICBsb2dnaW5nLmluZm8oZidObyBob3N0IG9yIHRhcmdldCBidWlsZCBvdXRwdXRzIGZvdW5kIGZvciB7bW9kdWxlfS4nKQorCisgICAgemlwX2NvbW1hbmRzID0gW10KKworICAgIHppcF9jb21tYW5kcy5leHRlbmQoCisgICAgICAgIHNlbGYuX2dldF96aXBfdGVzdF9jb25maWdzX3ppcHNfY29tbWFuZHMoCisgICAgICAgICAgICBzcmNfdG9wLAorICAgICAgICAgICAgZGlzdF9kaXIsCisgICAgICAgICAgICBob3N0X291dCwKKyAgICAgICAgICAgIHByb2R1Y3Rfb3V0LAorICAgICAgICAgICAgaG9zdF9jb25maWdfZmlsZXMsCisgICAgICAgICAgICB0YXJnZXRfY29uZmlnX2ZpbGVzLAorICAgICAgICApCisgICAgKQorCisgICAgemlwX2NvbW1hbmQgPSBzZWxmLl9iYXNlX3ppcF9jb21tYW5kKHNyY190b3AsIGRpc3RfZGlyLCAnZ2VuZXJhbC10ZXN0cy56aXAnKQorCisgICAgIyBBZGQgaG9zdCB0ZXN0Y2FzZXMuCisgICAgaWYgaG9zdF9wYXRoczoKKyAgICAgIHppcF9jb21tYW5kLmV4dGVuZCgKKyAgICAgICAgICBzZWxmLl9nZW5lcmF0ZV96aXBfb3B0aW9uc19mb3JfaXRlbXMoCisgICAgICAgICAgICAgIHByZWZpeD0naG9zdCcsCisgICAgICAgICAgICAgIHJlbGF0aXZlX3Jvb3Q9Zid7c3JjX3RvcCAvIHNvb25nX2hvc3Rfb3V0fScsCisgICAgICAgICAgICAgIGRpcmVjdG9yaWVzPWhvc3RfcGF0aHMsCisgICAgICAgICAgKQorICAgICAgKQorCisgICAgIyBBZGQgdGFyZ2V0IHRlc3RjYXNlcy4KKyAgICBpZiB0YXJnZXRfcGF0aHM6CisgICAgICB6aXBfY29tbWFuZC5leHRlbmQoCisgICAgICAgICAgc2VsZi5fZ2VuZXJhdGVfemlwX29wdGlvbnNfZm9yX2l0ZW1zKAorICAgICAgICAgICAgICBwcmVmaXg9J3RhcmdldCcsCisgICAgICAgICAgICAgIHJlbGF0aXZlX3Jvb3Q9Zid7c3JjX3RvcCAvIHByb2R1Y3Rfb3V0fScsCisgICAgICAgICAgICAgIGRpcmVjdG9yaWVzPXRhcmdldF9wYXRocywKKyAgICAgICAgICApCisgICAgICApCisKKyAgICAjIFRPRE8obHVjYWZhcnNpKTogUHVzaCB0aGlzIGxvZ2ljIGludG8gYSBnZW5lcmFsLXRlc3RzLW1pbmltYWwgYnVpbGQgY29tbWFuZAorICAgICMgQWRkIG5lY2Vzc2FyeSB0b29scy4gVGhlc2UgYXJlIGFsc28gaGFyZGNvZGVkIGluIGdlbmVyYWwtdGVzdHMubWsuCisgICAgZnJhbWV3b3JrX3BhdGggPSBzb29uZ19ob3N0X291dCAvICdmcmFtZXdvcmsnCisKKyAgICB6aXBfY29tbWFuZC5leHRlbmQoCisgICAgICAgIHNlbGYuX2dlbmVyYXRlX3ppcF9vcHRpb25zX2Zvcl9pdGVtcygKKyAgICAgICAgICAgIHByZWZpeD0naG9zdC90b29scycsCisgICAgICAgICAgICByZWxhdGl2ZV9yb290PXN0cihmcmFtZXdvcmtfcGF0aCksCisgICAgICAgICAgICBmaWxlcz1bCisgICAgICAgICAgICAgICAgZiJ7ZnJhbWV3b3JrX3BhdGggLyAnY3RzLXRyYWRlZmVkLmphcid9IiwKKyAgICAgICAgICAgICAgICBmIntmcmFtZXdvcmtfcGF0aCAvICdjb21wYXRpYmlsaXR5LWhvc3QtdXRpbC5qYXInfSIsCisgICAgICAgICAgICAgICAgZiJ7ZnJhbWV3b3JrX3BhdGggLyAndnRzLXRyYWRlZmVkLmphcid9IiwKKyAgICAgICAgICAgIF0sCisgICAgICAgICkKKyAgICApCisKKyAgICB6aXBfY29tbWFuZHMuYXBwZW5kKHppcF9jb21tYW5kKQorICAgIHJldHVybiB6aXBfY29tbWFuZHMKKworICBkZWYgX2NvbGxlY3RfY29uZmlnX2ZpbGVzKAorICAgICAgc2VsZiwKKyAgICAgIHNyY190b3A6IHBhdGhsaWIuUGF0aCwKKyAgICAgIHJvb3RfZGlyOiBwYXRobGliLlBhdGgsCisgICAgICBjb25maWdfZmlsZXM6IGxpc3Rbc3RyXSwKKyAgKToKKyAgICBmb3Igcm9vdCwgZGlycywgZmlsZXMgaW4gb3Mud2FsayhzcmNfdG9wIC8gcm9vdF9kaXIpOgorICAgICAgZm9yIGZpbGUgaW4gZmlsZXM6CisgICAgICAgIGlmIGZpbGUuZW5kc3dpdGgoJy5jb25maWcnKToKKyAgICAgICAgICBjb25maWdfZmlsZXMuYXBwZW5kKHJvb3RfZGlyIC8gZmlsZSkKKworICBkZWYgX2dldF96aXBfdGVzdF9jb25maWdzX3ppcHNfY29tbWFuZHMoCisgICAgICBzZWxmLAorICAgICAgc3JjX3RvcDogcGF0aGxpYi5QYXRoLAorICAgICAgZGlzdF9kaXI6IHBhdGhsaWIuUGF0aCwKKyAgICAgIGhvc3Rfb3V0OiBwYXRobGliLlBhdGgsCisgICAgICBwcm9kdWN0X291dDogcGF0aGxpYi5QYXRoLAorICAgICAgaG9zdF9jb25maWdfZmlsZXM6IGxpc3Rbc3RyXSwKKyAgICAgIHRhcmdldF9jb25maWdfZmlsZXM6IGxpc3Rbc3RyXSwKKyAgKSAtPiB0dXBsZVtsaXN0W3N0cl0sIGxpc3Rbc3RyXV06CisgICAgIiIiR2VuZXJhdGUgZ2VuZXJhbC10ZXN0c19jb25maWdzLnppcCBhbmQgZ2VuZXJhbC10ZXN0c19saXN0LnppcC4KKworICAgIGdlbmVyYWwtdGVzdHNfY29uZmlncy56aXAgY29udGFpbnMgYWxsIG9mIHRoZSAuY29uZmlnIGZpbGVzIHRoYXQgd2VyZQorICAgIGJ1aWx0IGFuZCBnZW5lcmFsLXRlc3RzX2xpc3QuemlwIGNvbnRhaW5zIGEgdGV4dCBmaWxlIHdoaWNoIGxpc3RzCisgICAgYWxsIG9mIHRoZSAuY29uZmlnIGZpbGVzIHRoYXQgYXJlIGluIGdlbmVyYWwtdGVzdHNfY29uZmlncy56aXAuCisKKyAgICBnZW5lcmFsLXRlc3RzX2NvbmZpZ3MuemlwIGlzIG9yZ2FuaXplZCBhcyBmb2xsb3dzOgorICAgIC8KKyAgICAgIGhvc3QvCisgICAgICAgIHRlc3RjYXNlcy8KKyAgICAgICAgICB0ZXN0XzEuY29uZmlnCisgICAgICAgICAgdGVzdF8yLmNvbmZpZworICAgICAgICAgIC4uLgorICAgICAgdGFyZ2V0LworICAgICAgICB0ZXN0Y2FzZXMvCisgICAgICAgICAgdGVzdF8xLmNvbmZpZworICAgICAgICAgIHRlc3RfMi5jb25maWcKKyAgICAgICAgICAuLi4KKworICAgIFNvIHRoZSBwcm9jZXNzIGlzIHdlIHdyaXRlIG91dCB0aGUgcGF0aHMgdG8gYWxsIHRoZSBob3N0IGNvbmZpZyBmaWxlcyBpbnRvCisgICAgb25lCisgICAgZmlsZSBhbmQgYWxsIHRoZSBwYXRocyB0byB0aGUgdGFyZ2V0IGNvbmZpZyBmaWxlcyBpbiBhbm90aGVyLiBXZSBhbHNvIHdyaXRlCisgICAgdGhlIHBhdGhzIHRvIGFsbCB0aGUgY29uZmlnIGZpbGVzIGludG8gYSB0aGlyZCBmaWxlIHRvIHVzZSBmb3IKKyAgICBnZW5lcmFsLXRlc3RzX2xpc3QuemlwLgorCisgICAgQXJnczoKKyAgICAgIGRpc3RfZGlyOiBkaXN0IGRpcmVjdG9yeS4KKyAgICAgIGhvc3Rfb3V0OiBob3N0IG91dCBkaXJlY3RvcnkuCisgICAgICBwcm9kdWN0X291dDogcHJvZHVjdCBvdXQgZGlyZWN0b3J5LgorICAgICAgaG9zdF9jb25maWdfZmlsZXM6IGxpc3Qgb2YgYWxsIGhvc3QgY29uZmlnIGZpbGVzLgorICAgICAgdGFyZ2V0X2NvbmZpZ19maWxlczogbGlzdCBvZiBhbGwgdGFyZ2V0IGNvbmZpZyBmaWxlcy4KKworICAgIFJldHVybnM6CisgICAgICBUaGUgY29tbWFuZHMgdG8gZ2VuZXJhdGUgZ2VuZXJhbC10ZXN0c19jb25maWdzLnppcCBhbmQKKyAgICAgIGdlbmVyYWwtdGVzdHNfbGlzdC56aXAKKyAgICAiIiIKKyAgICB3aXRoIG9wZW4oCisgICAgICAgIGYie2hvc3Rfb3V0IC8gJ2hvc3RfZ2VuZXJhbC10ZXN0c19saXN0J30iLCAndycKKyAgICApIGFzIGhvc3RfbGlzdF9maWxlLCBvcGVuKAorICAgICAgICBmIntwcm9kdWN0X291dCAvICd0YXJnZXRfZ2VuZXJhbC10ZXN0c19saXN0J30iLCAndycKKyAgICApIGFzIHRhcmdldF9saXN0X2ZpbGUsIG9wZW4oCisgICAgICAgIGYie2hvc3Rfb3V0IC8gJ2dlbmVyYWwtdGVzdHNfbGlzdCd9IiwgJ3cnCisgICAgKSBhcyBsaXN0X2ZpbGU6CisKKyAgICAgIGZvciBjb25maWdfZmlsZSBpbiBob3N0X2NvbmZpZ19maWxlczoKKyAgICAgICAgaG9zdF9saXN0X2ZpbGUud3JpdGUoZid7Y29uZmlnX2ZpbGV9JyArICdcbicpCisgICAgICAgIGxpc3RfZmlsZS53cml0ZSgnaG9zdC8nICsgb3MucGF0aC5yZWxwYXRoKGNvbmZpZ19maWxlLCBob3N0X291dCkgKyAnXG4nKQorCisgICAgICBmb3IgY29uZmlnX2ZpbGUgaW4gdGFyZ2V0X2NvbmZpZ19maWxlczoKKyAgICAgICAgdGFyZ2V0X2xpc3RfZmlsZS53cml0ZShmJ3tjb25maWdfZmlsZX0nICsgJ1xuJykKKyAgICAgICAgbGlzdF9maWxlLndyaXRlKAorICAgICAgICAgICAgJ3RhcmdldC8nICsgb3MucGF0aC5yZWxwYXRoKGNvbmZpZ19maWxlLCBwcm9kdWN0X291dCkgKyAnXG4nCisgICAgICAgICkKKworICAgIHppcF9jb21tYW5kcyA9IFtdCisKKyAgICB0ZXN0c19jb25maWdfemlwX2NvbW1hbmQgPSBzZWxmLl9iYXNlX3ppcF9jb21tYW5kKAorICAgICAgICBzcmNfdG9wLCBkaXN0X2RpciwgJ2dlbmVyYWwtdGVzdHNfY29uZmlncy56aXAnCisgICAgKQorICAgIHRlc3RzX2NvbmZpZ196aXBfY29tbWFuZC5leHRlbmQoCisgICAgICAgIHNlbGYuX2dlbmVyYXRlX3ppcF9vcHRpb25zX2Zvcl9pdGVtcygKKyAgICAgICAgICAgIHByZWZpeD0naG9zdCcsCisgICAgICAgICAgICByZWxhdGl2ZV9yb290PXN0cihob3N0X291dCksCisgICAgICAgICAgICBsaXN0X2ZpbGVzPVtmIntob3N0X291dCAvICdob3N0X2dlbmVyYWwtdGVzdHNfbGlzdCd9Il0sCisgICAgICAgICkKKyAgICApCisKKyAgICB0ZXN0c19jb25maWdfemlwX2NvbW1hbmQuZXh0ZW5kKAorICAgICAgICBzZWxmLl9nZW5lcmF0ZV96aXBfb3B0aW9uc19mb3JfaXRlbXMoCisgICAgICAgICAgICBwcmVmaXg9J3RhcmdldCcsCisgICAgICAgICAgICByZWxhdGl2ZV9yb290PXN0cihwcm9kdWN0X291dCksCisgICAgICAgICAgICBsaXN0X2ZpbGVzPVtmIntwcm9kdWN0X291dCAvICd0YXJnZXRfZ2VuZXJhbC10ZXN0c19saXN0J30iXSwKKyAgICAgICAgKSwKKyAgICApCisKKyAgICB6aXBfY29tbWFuZHMuYXBwZW5kKHRlc3RzX2NvbmZpZ196aXBfY29tbWFuZCkKKworICAgIHRlc3RzX2xpc3RfemlwX2NvbW1hbmQgPSBzZWxmLl9iYXNlX3ppcF9jb21tYW5kKAorICAgICAgICBzcmNfdG9wLCBkaXN0X2RpciwgJ2dlbmVyYWwtdGVzdHNfbGlzdC56aXAnCisgICAgKQorICAgIHRlc3RzX2xpc3RfemlwX2NvbW1hbmQuZXh0ZW5kKAorICAgICAgICBzZWxmLl9nZW5lcmF0ZV96aXBfb3B0aW9uc19mb3JfaXRlbXMoCisgICAgICAgICAgICByZWxhdGl2ZV9yb290PXN0cihob3N0X291dCksCisgICAgICAgICAgICBmaWxlcz1bZiJ7aG9zdF9vdXQgLyAnZ2VuZXJhbC10ZXN0c19saXN0J30iXSwKKyAgICAgICAgKQorICAgICkKKyAgICB6aXBfY29tbWFuZHMuYXBwZW5kKHRlc3RzX2xpc3RfemlwX2NvbW1hbmQpCisKKyAgICByZXR1cm4gemlwX2NvbW1hbmRzCisKICAgZGVmIGdldF9lbmFibGVkX2ZsYWcoc2VsZik6CiAgICAgcmV0dXJuICdnZW5lcmFsX3Rlc3RzX29wdGltaXplZCcKIApkaWZmIC0tZ2l0IGEvY2kvb3B0aW1pemVkX3RhcmdldHNfdGVzdC5weSBiL2NpL29wdGltaXplZF90YXJnZXRzX3Rlc3QucHkKaW5kZXggOTE5YzE5My4uMGIwYzBlYyAxMDA2NDQKLS0tIGEvY2kvb3B0aW1pemVkX3RhcmdldHNfdGVzdC5weQorKysgYi9jaS9vcHRpbWl6ZWRfdGFyZ2V0c190ZXN0LnB5CkBAIC0xOSwxMCArMTksMTIgQEAKIGltcG9ydCBvcwogaW1wb3J0IHBhdGhsaWIKIGltcG9ydCByZQoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCB0ZXh0d3JhcAogaW1wb3J0IHVuaXR0ZXN0CiBmcm9tIHVuaXR0ZXN0IGltcG9ydCBtb2NrCi1pbXBvcnQgb3B0aW1pemVkX3RhcmdldHMKIGZyb20gYnVpbGRfY29udGV4dCBpbXBvcnQgQnVpbGRDb250ZXh0CitpbXBvcnQgb3B0aW1pemVkX3RhcmdldHMKIGZyb20gcHlmYWtlZnMgaW1wb3J0IGZha2VfZmlsZXN5c3RlbV91bml0dGVzdAogCiAKQEAgLTQzLDExICs0NSw2OCBAQAogCiAgIGRlZiBfc2V0dXBfd29ya2luZ19idWlsZF9lbnYoc2VsZik6CiAgICAgc2VsZi5jaGFuZ2VfaW5mb19maWxlID0gcGF0aGxpYi5QYXRoKCcvdG1wL2NoYW5nZV9pbmZvJykKKyAgICBzZWxmLl93cml0ZV9zb29uZ191aV9maWxlKCkKKyAgICBzZWxmLl9ob3N0X291dF90ZXN0Y2FzZXMgPSBwYXRobGliLlBhdGgoJy90bXAvdG9wL2hvc3Rfb3V0X3Rlc3RjYXNlcycpCisgICAgc2VsZi5faG9zdF9vdXRfdGVzdGNhc2VzLm1rZGlyKHBhcmVudHM9VHJ1ZSkKKyAgICBzZWxmLl90YXJnZXRfb3V0X3Rlc3RjYXNlcyA9IHBhdGhsaWIuUGF0aCgnL3RtcC90b3AvdGFyZ2V0X291dF90ZXN0Y2FzZXMnKQorICAgIHNlbGYuX3RhcmdldF9vdXRfdGVzdGNhc2VzLm1rZGlyKHBhcmVudHM9VHJ1ZSkKKyAgICBzZWxmLl9wcm9kdWN0X291dCA9IHBhdGhsaWIuUGF0aCgnL3RtcC90b3AvcHJvZHVjdF9vdXQnKQorICAgIHNlbGYuX3Byb2R1Y3Rfb3V0Lm1rZGlyKHBhcmVudHM9VHJ1ZSkKKyAgICBzZWxmLl9zb29uZ19ob3N0X291dCA9IHBhdGhsaWIuUGF0aCgnL3RtcC90b3Avc29vbmdfaG9zdF9vdXQnKQorICAgIHNlbGYuX3Nvb25nX2hvc3Rfb3V0Lm1rZGlyKHBhcmVudHM9VHJ1ZSkKKyAgICBzZWxmLl9ob3N0X291dCA9IHBhdGhsaWIuUGF0aCgnL3RtcC90b3AvaG9zdF9vdXQnKQorICAgIHNlbGYuX2hvc3Rfb3V0Lm1rZGlyKHBhcmVudHM9VHJ1ZSkKKworICAgIHNlbGYuX2Rpc3RfZGlyID0gcGF0aGxpYi5QYXRoKCcvdG1wL3RvcC9vdXQvZGlzdCcpCisgICAgc2VsZi5fZGlzdF9kaXIubWtkaXIocGFyZW50cz1UcnVlKQogCiAgICAgc2VsZi5tb2NrX29zX2Vudmlyb24udXBkYXRlKHsKICAgICAgICAgJ0NIQU5HRV9JTkZPJzogc3RyKHNlbGYuY2hhbmdlX2luZm9fZmlsZSksCisgICAgICAgICdUT1AnOiAnL3RtcC90b3AnLAorICAgICAgICAnRElTVF9ESVInOiAnL3RtcC90b3Avb3V0L2Rpc3QnLAogICAgIH0pCiAKKyAgZGVmIF93cml0ZV9zb29uZ191aV9maWxlKHNlbGYpOgorICAgIHNvb25nX3BhdGggPSBwYXRobGliLlBhdGgoJy90bXAvdG9wL2J1aWxkL3Nvb25nJykKKyAgICBzb29uZ19wYXRoLm1rZGlyKHBhcmVudHM9VHJ1ZSkKKyAgICB3aXRoIG9wZW4ob3MucGF0aC5qb2luKHNvb25nX3BhdGgsICdzb29uZ191aS5iYXNoJyksICd3JykgYXMgZjoKKyAgICAgIGYud3JpdGUoIiIiCisgICAgICAgICAgICAgICMvYmluL2Jhc2gKKyAgICAgICAgICAgICAgZWNobyBIT1NUX09VVF9URVNUQ0FTRVM9Jy90bXAvdG9wL2hvc3Rfb3V0X3Rlc3RjYXNlcycKKyAgICAgICAgICAgICAgZWNobyBUQVJHRVRfT1VUX1RFU1RDQVNFUz0nL3RtcC90b3AvdGFyZ2V0X291dF90ZXN0Y2FzZXMnCisgICAgICAgICAgICAgIGVjaG8gUFJPRFVDVF9PVVQ9Jy90bXAvdG9wL3Byb2R1Y3Rfb3V0JworICAgICAgICAgICAgICBlY2hvIFNPT05HX0hPU1RfT1VUPScvdG1wL3RvcC9zb29uZ19ob3N0X291dCcKKyAgICAgICAgICAgICAgZWNobyBIT1NUX09VVD0nL3RtcC90b3AvaG9zdF9vdXQnCisgICAgICAgICAgICAgICIiIikKKyAgICBvcy5jaG1vZChvcy5wYXRoLmpvaW4oc29vbmdfcGF0aCwgJ3Nvb25nX3VpLmJhc2gnKSwgMG82NjYpCisKKyAgZGVmIF93cml0ZV9jaGFuZ2VfaW5mb19maWxlKHNlbGYpOgorICAgIGNoYW5nZV9pbmZvX2NvbnRlbnRzID0geworICAgICAgICAnY2hhbmdlcyc6IFt7CisgICAgICAgICAgICAncHJvamVjdFBhdGgnOiAnL3Byb2plY3QvcGF0aCcsCisgICAgICAgICAgICAncmV2aXNpb25zJzogW3sKKyAgICAgICAgICAgICAgICAnZmlsZUluZm9zJzogW3sKKyAgICAgICAgICAgICAgICAgICAgJ3BhdGgnOiAnZmlsZS9wYXRoL2ZpbGVfbmFtZScsCisgICAgICAgICAgICAgICAgfV0sCisgICAgICAgICAgICB9XSwKKyAgICAgICAgfV0KKyAgICB9CisKKyAgICB3aXRoIG9wZW4oc2VsZi5jaGFuZ2VfaW5mb19maWxlLCAndycpIGFzIGY6CisgICAgICBqc29uLmR1bXAoY2hhbmdlX2luZm9fY29udGVudHMsIGYpCisKKyAgZGVmIF93cml0ZV90ZXN0X21hcHBpbmdfZmlsZShzZWxmKToKKyAgICB0ZXN0X21hcHBpbmdfY29udGVudHMgPSB7CisgICAgICAgICd0ZXN0LW1hcHBpbmctZ3JvdXAnOiBbCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgJ25hbWUnOiAndGVzdF9tYXBwaW5nX21vZHVsZScsCisgICAgICAgICAgICB9LAorICAgICAgICBdLAorICAgIH0KKworICAgIHdpdGggb3BlbignL3Byb2plY3QvcGF0aC9maWxlL3BhdGgvVEVTVF9NQVBQSU5HJywgJ3cnKSBhcyBmOgorICAgICAganNvbi5kdW1wKHRlc3RfbWFwcGluZ19jb250ZW50cywgZikKKwogICBkZWYgdGVzdF9nZW5lcmFsX3Rlc3RzX29wdGltaXplZChzZWxmKToKICAgICBvcHRpbWl6ZXIgPSBzZWxmLl9jcmVhdGVfZ2VuZXJhbF90ZXN0c19vcHRpbWl6ZXIoKQogCkBAIC0xMjQsMzYgKzE4Myw0NCBAQAogICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoanNvbi5kZWNvZGVyLkpTT05EZWNvZGVFcnJvcik6CiAgICAgICBidWlsZF90YXJnZXRzID0gb3B0aW1pemVyLmdldF9idWlsZF90YXJnZXRzKCkKIAotICBkZWYgX3dyaXRlX2NoYW5nZV9pbmZvX2ZpbGUoc2VsZik6Ci0gICAgY2hhbmdlX2luZm9fY29udGVudHMgPSB7Ci0gICAgICAgICdjaGFuZ2VzJzogW3sKLSAgICAgICAgICAgICdwcm9qZWN0UGF0aCc6ICcvcHJvamVjdC9wYXRoJywKLSAgICAgICAgICAgICdyZXZpc2lvbnMnOiBbewotICAgICAgICAgICAgICAgICdmaWxlSW5mb3MnOiBbewotICAgICAgICAgICAgICAgICAgICAncGF0aCc6ICdmaWxlL3BhdGgvZmlsZV9uYW1lJywKLSAgICAgICAgICAgICAgICB9XSwKLSAgICAgICAgICAgIH1dLAotICAgICAgICB9XQotICAgIH0KKyAgQG1vY2sucGF0Y2goJ3N1YnByb2Nlc3MucnVuJykKKyAgZGVmIHRlc3RfcGFja2FnaW5nX291dHB1dHNfc3VjY2VzcyhzZWxmLCBzdWJwcm9jZXNzX3J1bik6CisgICAgc3VicHJvY2Vzc19ydW4ucmV0dXJuX3ZhbHVlID0gc2VsZi5fZ2V0X3Nvb25nX3ZhcnNfb3V0cHV0KCkKKyAgICBvcHRpbWl6ZXIgPSBzZWxmLl9jcmVhdGVfZ2VuZXJhbF90ZXN0c19vcHRpbWl6ZXIoKQorICAgIHNlbGYuX3NldF91cF9idWlsZF9vdXRwdXRzKFsndGVzdF9tYXBwaW5nX21vZHVsZSddKQogCi0gICAgd2l0aCBvcGVuKHNlbGYuY2hhbmdlX2luZm9fZmlsZSwgJ3cnKSBhcyBmOgotICAgICAganNvbi5kdW1wKGNoYW5nZV9pbmZvX2NvbnRlbnRzLCBmKQorICAgIHRhcmdldHMgPSBvcHRpbWl6ZXIuZ2V0X2J1aWxkX3RhcmdldHMoKQorICAgIHBhY2thZ2VfY29tbWFuZHMgPSBvcHRpbWl6ZXIuZ2V0X3BhY2thZ2Vfb3V0cHV0c19jb21tYW5kcygpCiAKLSAgZGVmIF93cml0ZV90ZXN0X21hcHBpbmdfZmlsZShzZWxmKToKLSAgICB0ZXN0X21hcHBpbmdfY29udGVudHMgPSB7Ci0gICAgICAgICd0ZXN0LW1hcHBpbmctZ3JvdXAnOiBbCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgJ25hbWUnOiAndGVzdF9tYXBwaW5nX21vZHVsZScsCi0gICAgICAgICAgICB9LAotICAgICAgICBdLAotICAgIH0KKyAgICBzZWxmLl92ZXJpZnlfc29vbmdfemlwX2NvbW1hbmRzKHBhY2thZ2VfY29tbWFuZHMsIFsndGVzdF9tYXBwaW5nX21vZHVsZSddKQogCi0gICAgd2l0aCBvcGVuKCcvcHJvamVjdC9wYXRoL2ZpbGUvcGF0aC9URVNUX01BUFBJTkcnLCAndycpIGFzIGY6Ci0gICAgICBqc29uLmR1bXAodGVzdF9tYXBwaW5nX2NvbnRlbnRzLCBmKQorICBAbW9jay5wYXRjaCgnc3VicHJvY2Vzcy5ydW4nKQorICBkZWYgdGVzdF9nZXRfc29vbmdfZHVtcHZhcnNfZmFpbHNfcmFpc2VzKHNlbGYsIHN1YnByb2Nlc3NfcnVuKToKKyAgICBzdWJwcm9jZXNzX3J1bi5yZXR1cm5fdmFsdWUgPSBzZWxmLl9nZXRfc29vbmdfdmFyc19vdXRwdXQocmV0dXJuX2NvZGU9LTEpCisgICAgb3B0aW1pemVyID0gc2VsZi5fY3JlYXRlX2dlbmVyYWxfdGVzdHNfb3B0aW1pemVyKCkKKyAgICBzZWxmLl9zZXRfdXBfYnVpbGRfb3V0cHV0cyhbJ3Rlc3RfbWFwcGluZ19tb2R1bGUnXSkKIAotICBkZWYgX2NyZWF0ZV9nZW5lcmFsX3Rlc3RzX29wdGltaXplcigKLSAgICAgIHNlbGYsIGJ1aWxkX2NvbnRleHQ6IEJ1aWxkQ29udGV4dCA9IE5vbmUKLSAgKToKKyAgICB0YXJnZXRzID0gb3B0aW1pemVyLmdldF9idWlsZF90YXJnZXRzKCkKKworICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleChSdW50aW1lRXJyb3IsICdTb29uZyBkdW1wdmFycyBmYWlsZWQhJyk6CisgICAgICBwYWNrYWdlX2NvbW1hbmRzID0gb3B0aW1pemVyLmdldF9wYWNrYWdlX291dHB1dHNfY29tbWFuZHMoKQorCisgIEBtb2NrLnBhdGNoKCdzdWJwcm9jZXNzLnJ1bicpCisgIGRlZiB0ZXN0X2dldF9zb29uZ19kdW1wdmFyc19iYWRfb3V0cHV0X3JhaXNlcyhzZWxmLCBzdWJwcm9jZXNzX3J1bik6CisgICAgc3VicHJvY2Vzc19ydW4ucmV0dXJuX3ZhbHVlID0gc2VsZi5fZ2V0X3Nvb25nX3ZhcnNfb3V0cHV0KAorICAgICAgICBzdGRvdXQ9J1RoaXMgb3V0cHV0IGlzIGJhZCcKKyAgICApCisgICAgb3B0aW1pemVyID0gc2VsZi5fY3JlYXRlX2dlbmVyYWxfdGVzdHNfb3B0aW1pemVyKCkKKyAgICBzZWxmLl9zZXRfdXBfYnVpbGRfb3V0cHV0cyhbJ3Rlc3RfbWFwcGluZ19tb2R1bGUnXSkKKworICAgIHRhcmdldHMgPSBvcHRpbWl6ZXIuZ2V0X2J1aWxkX3RhcmdldHMoKQorCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4KAorICAgICAgICBSdW50aW1lRXJyb3IsICdFcnJvciBwYXJzaW5nIHNvb25nIGR1bXB2YXJzIG91dHB1dCcKKyAgICApOgorICAgICAgcGFja2FnZV9jb21tYW5kcyA9IG9wdGltaXplci5nZXRfcGFja2FnZV9vdXRwdXRzX2NvbW1hbmRzKCkKKworICBkZWYgX2NyZWF0ZV9nZW5lcmFsX3Rlc3RzX29wdGltaXplcihzZWxmLCBidWlsZF9jb250ZXh0OiBCdWlsZENvbnRleHQgPSBOb25lKToKICAgICBpZiBub3QgYnVpbGRfY29udGV4dDoKICAgICAgIGJ1aWxkX2NvbnRleHQgPSBzZWxmLl9jcmVhdGVfYnVpbGRfY29udGV4dCgpCiAgICAgcmV0dXJuIG9wdGltaXplZF90YXJnZXRzLkdlbmVyYWxUZXN0c09wdGltaXplcigKQEAgLTE3MCw3ICsyMzcsOSBAQAogICAgIGJ1aWxkX2NvbnRleHRfZGljdCA9IHt9CiAgICAgYnVpbGRfY29udGV4dF9kaWN0WydlbmFibGVkQnVpbGRGZWF0dXJlcyddID0gW3snbmFtZSc6ICdvcHRpbWl6ZWRfYnVpbGQnfV0KICAgICBpZiBnZW5lcmFsX3Rlc3RzX29wdGltaXplZDoKLSAgICAgIGJ1aWxkX2NvbnRleHRfZGljdFsnZW5hYmxlZEJ1aWxkRmVhdHVyZXMnXS5hcHBlbmQoeyduYW1lJzogJ2dlbmVyYWxfdGVzdHNfb3B0aW1pemVkJ30pCisgICAgICBidWlsZF9jb250ZXh0X2RpY3RbJ2VuYWJsZWRCdWlsZEZlYXR1cmVzJ10uYXBwZW5kKAorICAgICAgICAgIHsnbmFtZSc6ICdnZW5lcmFsX3Rlc3RzX29wdGltaXplZCd9CisgICAgICApCiAgICAgYnVpbGRfY29udGV4dF9kaWN0Wyd0ZXN0Q29udGV4dCddID0gdGVzdF9jb250ZXh0CiAgICAgcmV0dXJuIEJ1aWxkQ29udGV4dChidWlsZF9jb250ZXh0X2RpY3QpCiAKQEAgLTE5OSw2ICsyNjgsODEgQEAKICAgICAgICAgXSwKICAgICB9CiAKKyAgZGVmIF9nZXRfc29vbmdfdmFyc19vdXRwdXQoCisgICAgICBzZWxmLCByZXR1cm5fY29kZTogaW50ID0gMCwgc3Rkb3V0OiBzdHIgPSAnJworICApIC0+IHN1YnByb2Nlc3MuQ29tcGxldGVkUHJvY2VzczoKKyAgICByZXR1cm5fdmFsdWUgPSBzdWJwcm9jZXNzLkNvbXBsZXRlZFByb2Nlc3MoYXJncz1bXSwgcmV0dXJuY29kZT1yZXR1cm5fY29kZSkKKyAgICBpZiBub3Qgc3Rkb3V0OgorICAgICAgc3Rkb3V0ID0gdGV4dHdyYXAuZGVkZW50KGYiIiJcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSE9TVF9PVVRfVEVTVENBU0VTPSd7c2VsZi5faG9zdF9vdXRfdGVzdGNhc2VzfScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUQVJHRVRfT1VUX1RFU1RDQVNFUz0ne3NlbGYuX3RhcmdldF9vdXRfdGVzdGNhc2VzfScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9EVUNUX09VVD0ne3NlbGYuX3Byb2R1Y3Rfb3V0fScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT09OR19IT1NUX09VVD0ne3NlbGYuX3Nvb25nX2hvc3Rfb3V0fScKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIT1NUX09VVD0ne3NlbGYuX2hvc3Rfb3V0fSciIiIpCisKKyAgICByZXR1cm5fdmFsdWUuc3Rkb3V0ID0gc3Rkb3V0CisgICAgcmV0dXJuIHJldHVybl92YWx1ZQorCisgIGRlZiBfc2V0X3VwX2J1aWxkX291dHB1dHMoc2VsZiwgdGFyZ2V0czogbGlzdFtzdHJdKToKKyAgICBmb3IgdGFyZ2V0IGluIHRhcmdldHM6CisgICAgICBob3N0X2RpciA9IHNlbGYuX2hvc3Rfb3V0X3Rlc3RjYXNlcyAvIHRhcmdldAorICAgICAgaG9zdF9kaXIubWtkaXIoKQorICAgICAgKGhvc3RfZGlyIC8gZid7dGFyZ2V0fS5jb25maWcnKS50b3VjaCgpCisgICAgICAoaG9zdF9kaXIgLyBmJ3Rlc3RfZmlsZScpLnRvdWNoKCkKKworICAgICAgdGFyZ2V0X2RpciA9IHNlbGYuX3RhcmdldF9vdXRfdGVzdGNhc2VzIC8gdGFyZ2V0CisgICAgICB0YXJnZXRfZGlyLm1rZGlyKCkKKyAgICAgICh0YXJnZXRfZGlyIC8gZid7dGFyZ2V0fS5jb25maWcnKS50b3VjaCgpCisgICAgICAodGFyZ2V0X2RpciAvIGYndGVzdF9maWxlJykudG91Y2goKQorCisgIGRlZiBfdmVyaWZ5X3Nvb25nX3ppcF9jb21tYW5kcyhzZWxmLCBjb21tYW5kczogbGlzdFtzdHJdLCB0YXJnZXRzOiBsaXN0W3N0cl0pOgorICAgICIiIlZlcmlmeSB0aGUgc3RydWN0dXJlIG9mIHRoZSB6aXAgY29tbWFuZHMuCisKKyAgICBaaXAgY29tbWFuZHMgaGF2ZSB0byBzdGFydCB3aXRoIHRoZSBzb29uZ196aXAgYmluYXJ5IHBhdGgsIHRoZW4gYXJlIGZvbGxvd2VkCisgICAgYnkgYSBjb3VwbGUgb2Ygb3B0aW9ucyBhbmQgdGhlIG5hbWUgb2YgdGhlIGZpbGUgYmVpbmcgemlwcGVkLiBEZXBlbmRpbmcgb24KKyAgICB3aGljaCB6aXAgd2UgYXJlIGNyZWF0aW5nIGxvb2sgZm9yIGEgZmV3IGVzc2VudGlhbCBpdGVtcyBiZWluZyBhZGRlZCBpbgorICAgIHRob3NlIHppcHMuCisKKyAgICBBcmdzOgorICAgICAgY29tbWFuZHM6IGxpc3Qgb2YgY29tbWFuZCBsaXN0cworICAgICAgdGFyZ2V0czogbGlzdCBvZiB0YXJnZXRzIGV4cGVjdGVkIHRvIGJlIGluIGdlbmVyYWwtdGVzdHMuemlwCisgICAgIiIiCisgICAgZm9yIGNvbW1hbmQgaW4gY29tbWFuZHM6CisgICAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICAgICcvdG1wL3RvcC9wcmVidWlsdHMvYnVpbGQtdG9vbHMvbGludXgteDg2L2Jpbi9zb29uZ196aXAnLAorICAgICAgICAgIGNvbW1hbmRbMF0sCisgICAgICApCisgICAgICBzZWxmLmFzc2VydEVxdWFsKCctZCcsIGNvbW1hbmRbMV0pCisgICAgICBzZWxmLmFzc2VydEVxdWFsKCctbycsIGNvbW1hbmRbMl0pCisgICAgICBtYXRjaCAoY29tbWFuZFszXSk6CisgICAgICAgIGNhc2UgJy90bXAvdG9wL291dC9kaXN0L2dlbmVyYWwtdGVzdHNfY29uZmlncy56aXAnOgorICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZid7c2VsZi5faG9zdF9vdXR9L2hvc3RfZ2VuZXJhbC10ZXN0c19saXN0JywgY29tbWFuZCkKKyAgICAgICAgICBzZWxmLmFzc2VydEluKAorICAgICAgICAgICAgICBmJ3tzZWxmLl9wcm9kdWN0X291dH0vdGFyZ2V0X2dlbmVyYWwtdGVzdHNfbGlzdCcsIGNvbW1hbmQKKyAgICAgICAgICApCisgICAgICAgICAgcmV0dXJuCisgICAgICAgIGNhc2UgJy90bXAvdG9wL291dC9kaXN0L2dlbmVyYWwtdGVzdHNfbGlzdC56aXAnOgorICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oJy1mJywgY29tbWFuZCkKKyAgICAgICAgICBzZWxmLmFzc2VydEluKGYne3NlbGYuX2hvc3Rfb3V0fS9nZW5lcmFsLXRlc3RzX2xpc3QnLCBjb21tYW5kKQorICAgICAgICAgIHJldHVybgorICAgICAgICBjYXNlICcvdG1wL3RvcC9vdXQvZGlzdC9nZW5lcmFsLXRlc3RzLnppcCc6CisgICAgICAgICAgZm9yIHRhcmdldCBpbiB0YXJnZXRzOgorICAgICAgICAgICAgc2VsZi5hc3NlcnRJbihmJ3tzZWxmLl9ob3N0X291dF90ZXN0Y2FzZXN9L3t0YXJnZXR9JywgY29tbWFuZCkKKyAgICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oZid7c2VsZi5fdGFyZ2V0X291dF90ZXN0Y2FzZXN9L3t0YXJnZXR9JywgY29tbWFuZCkKKyAgICAgICAgICBzZWxmLmFzc2VydEluKAorICAgICAgICAgICAgICBmJ3tzZWxmLl9zb29uZ19ob3N0X291dH0vZnJhbWV3b3JrL2N0cy10cmFkZWZlZC5qYXInLCBjb21tYW5kCisgICAgICAgICAgKQorICAgICAgICAgIHNlbGYuYXNzZXJ0SW4oCisgICAgICAgICAgICAgIGYne3NlbGYuX3Nvb25nX2hvc3Rfb3V0fS9mcmFtZXdvcmsvY29tcGF0aWJpbGl0eS1ob3N0LXV0aWwuamFyJywKKyAgICAgICAgICAgICAgY29tbWFuZCwKKyAgICAgICAgICApCisgICAgICAgICAgc2VsZi5hc3NlcnRJbigKKyAgICAgICAgICAgICAgZid7c2VsZi5fc29vbmdfaG9zdF9vdXR9L2ZyYW1ld29yay92dHMtdHJhZGVmZWQuamFyJywgY29tbWFuZAorICAgICAgICAgICkKKyAgICAgICAgICByZXR1cm4KKyAgICAgICAgY2FzZSBfOgorICAgICAgICAgIHNlbGYuZmFpbChmJ21hbGZvcm1lZCBjb21tYW5kOiB7Y29tbWFuZH0nKQorCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CiAgICMgU2V0dXAgbG9nZ2luZyB0byBiZSBzaWxlbnQgc28gdW5pdCB0ZXN0cyBjYW4gcGFzcyB0aHJvdWdoIFRGLgpkaWZmIC0tZ2l0IGEvY2kvdGVzdF9kaXNjb3ZlcnlfYWdlbnQucHkgYi9jaS90ZXN0X2Rpc2NvdmVyeV9hZ2VudC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDhlZTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvY2kvdGVzdF9kaXNjb3ZlcnlfYWdlbnQucHkKQEAgLTAsMCArMSwxMjAgQEAKKyMgQ29weXJpZ2h0IDIwMjQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyIiIlRlc3QgZGlzY292ZXJ5IGFnZW50IHRoYXQgdXNlcyBUcmFkZUZlZCB0byBkaXNjb3ZlciB0ZXN0IGFydGlmYWN0cy4iIiIKK2ltcG9ydCBnbG9iCitpbXBvcnQganNvbgoraW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBvcworaW1wb3J0IHN1YnByb2Nlc3MKKworCitjbGFzcyBUZXN0RGlzY292ZXJ5QWdlbnQ6CisgICIiIlRlc3QgZGlzY292ZXJ5IGFnZW50LiIiIgorCisgIF9UUkFERUZFRF9QUkVCVUlMVF9KQVJfUkVMQVRJVkVfUEFUSCA9ICgKKyAgICAgICJ2ZW5kb3IvZ29vZ2xlX3RyYWRlZmVkZXJhdGlvbi9wcmVidWlsdHMvZmlsZWdyb3Vwcy9nb29nbGUtdHJhZGVmZWQvIgorICApCisKKyAgX1RSQURFRkVEX05PX1BPU1NJQkxFX1RFU1RfRElTQ09WRVJZX0tFWSA9ICJOb1Bvc3NpYmxlVGVzdERpc2NvdmVyeSIKKworICBfVFJBREVGRURfVEVTVF9aSVBfUkVHRVhFU19MSVNUX0tFWSA9ICJUZXN0WmlwUmVnZXhlcyIKKworICBfVFJBREVGRURfRElTQ09WRVJZX09VVFBVVF9GSUxFX05BTUUgPSAidGVzdF9kaXNjb3ZlcnlfYWdlbnQudHh0IgorCisgIGRlZiBfX2luaXRfXygKKyAgICAgIHNlbGYsCisgICAgICB0cmFkZWZlZF9hcmdzOiBsaXN0W3N0cl0sCisgICAgICB0ZXN0X21hcHBpbmdfemlwX3BhdGg6IHN0ciA9ICIiLAorICAgICAgdHJhZGVmZWRfamFyX3JldmVsYW50X2ZpbGVzX3BhdGg6IHN0ciA9IF9UUkFERUZFRF9QUkVCVUlMVF9KQVJfUkVMQVRJVkVfUEFUSCwKKyAgKToKKyAgICBzZWxmLnRyYWRlZmVkX2FyZ3MgPSB0cmFkZWZlZF9hcmdzCisgICAgc2VsZi50ZXN0X21hcHBpbmdfemlwX3BhdGggPSB0ZXN0X21hcHBpbmdfemlwX3BhdGgKKyAgICBzZWxmLnRyYWRlZmVkX2phcl9yZWxldmFudF9maWxlc19wYXRoID0gdHJhZGVmZWRfamFyX3JldmVsYW50X2ZpbGVzX3BhdGgKKworICBkZWYgZGlzY292ZXJfdGVzdF96aXBfcmVnZXhlcyhzZWxmKSAtPiBsaXN0W3N0cl06CisgICAgIiIiRGlzY292ZXIgdGVzdCB6aXAgcmVnZXhlcyBmcm9tIFRyYWRlRmVkLgorCisgICAgUmV0dXJuczoKKyAgICAgIEEgbGlzdCBvZiB0ZXN0IHppcCByZWdleGVzIHRoYXQgVEYgaXMgZ29pbmcgdG8gdHJ5IHRvIHB1bGwgZmlsZXMgZnJvbS4KKyAgICAiIiIKKyAgICB0ZXN0X2Rpc2NvdmVyeV9vdXRwdXRfZmlsZV9uYW1lID0gb3MucGF0aC5qb2luKAorICAgICAgICBvcy5lbnZpcm9uLmdldCgnVE9QJyksICdvdXQnLCBzZWxmLl9UUkFERUZFRF9ESVNDT1ZFUllfT1VUUFVUX0ZJTEVfTkFNRQorICAgICkKKyAgICB3aXRoIG9wZW4oCisgICAgICAgIHRlc3RfZGlzY292ZXJ5X291dHB1dF9maWxlX25hbWUsIG1vZGU9IncrdCIKKyAgICApIGFzIHRlc3RfZGlzY292ZXJ5X291dHB1dF9maWxlOgorICAgICAgamF2YV9hcmdzID0gW10KKyAgICAgIGphdmFfYXJncy5hcHBlbmQoInByZWJ1aWx0cy9qZGsvamRrMjEvbGludXgteDg2L2Jpbi9qYXZhIikKKyAgICAgIGphdmFfYXJncy5hcHBlbmQoIi1jcCIpCisgICAgICBqYXZhX2FyZ3MuYXBwZW5kKAorICAgICAgICAgIHNlbGYuY3JlYXRlX2NsYXNzcGF0aChzZWxmLnRyYWRlZmVkX2phcl9yZWxldmFudF9maWxlc19wYXRoKQorICAgICAgKQorICAgICAgamF2YV9hcmdzLmFwcGVuZCgKKyAgICAgICAgICAiY29tLmFuZHJvaWQudHJhZGVmZWQub2JzZXJ2YXRvcnkuVGVzdFppcERpc2NvdmVyeUV4ZWN1dG9yIgorICAgICAgKQorICAgICAgamF2YV9hcmdzLmV4dGVuZChzZWxmLnRyYWRlZmVkX2FyZ3MpCisgICAgICBlbnYgPSBvcy5lbnZpcm9uLmNvcHkoKQorICAgICAgZW52LnVwZGF0ZSh7IkRJU0NPVkVSWV9PVVRQVVRfRklMRSI6IHRlc3RfZGlzY292ZXJ5X291dHB1dF9maWxlLm5hbWV9KQorICAgICAgbG9nZ2luZy5pbmZvKGYiQ2FsbGluZyB0ZXN0IGRpc2NvdmVyeSB3aXRoIGFyZ3M6IHtqYXZhX2FyZ3N9IikKKyAgICAgIHRyeToKKyAgICAgICAgcmVzdWx0ID0gc3VicHJvY2Vzcy5ydW4oYXJncz1qYXZhX2FyZ3MsIGVudj1lbnYsIHRleHQ9VHJ1ZSwgY2hlY2s9VHJ1ZSkKKyAgICAgICAgbG9nZ2luZy5pbmZvKGYiVGVzdCB6aXAgZGlzY292ZXJ5IG91dHB1dDoge3Jlc3VsdC5zdGRvdXR9IikKKyAgICAgIGV4Y2VwdCBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvciBhcyBlOgorICAgICAgICByYWlzZSBUZXN0RGlzY292ZXJ5RXJyb3IoCisgICAgICAgICAgICBmIkZhaWxlZCB0byBydW4gdGVzdCBkaXNjb3ZlcnksIHN0cm91dDoge2Uuc3Rkb3V0fSwgc3RyZXJyOiIKKyAgICAgICAgICAgIGYiIHtlLnN0ZGVycn0sIHJldHVybmNvZGU6IHtlLnJldHVybmNvZGV9IgorICAgICAgICApCisgICAgICBkYXRhID0ganNvbi5sb2Fkcyh0ZXN0X2Rpc2NvdmVyeV9vdXRwdXRfZmlsZS5yZWFkKCkpCisgICAgICBsb2dnaW5nLmluZm8oZiJUZXN0IGRpc2NvdmVyeSByZXN1bHQgZmlsZSBjb250ZW50OiB7ZGF0YX0iKQorICAgICAgaWYgKAorICAgICAgICAgIHNlbGYuX1RSQURFRkVEX05PX1BPU1NJQkxFX1RFU1RfRElTQ09WRVJZX0tFWSBpbiBkYXRhCisgICAgICAgICAgYW5kIGRhdGFbc2VsZi5fVFJBREVGRURfTk9fUE9TU0lCTEVfVEVTVF9ESVNDT1ZFUllfS0VZXQorICAgICAgKToKKyAgICAgICAgcmFpc2UgVGVzdERpc2NvdmVyeUVycm9yKCJObyBwb3NzaWJsZSB0ZXN0IGRpc2NvdmVyeSIpCisgICAgICBpZiAoCisgICAgICAgICAgZGF0YVtzZWxmLl9UUkFERUZFRF9URVNUX1pJUF9SRUdFWEVTX0xJU1RfS0VZXSBpcyBOb25lCisgICAgICAgICAgb3IgZGF0YVtzZWxmLl9UUkFERUZFRF9URVNUX1pJUF9SRUdFWEVTX0xJU1RfS0VZXSBpcyBbXQorICAgICAgKToKKyAgICAgICAgcmFpc2UgVGVzdERpc2NvdmVyeUVycm9yKCJObyB0ZXN0IHppcCByZWdleGVzIHJldHVybmVkIikKKyAgICAgIHJldHVybiBkYXRhW3NlbGYuX1RSQURFRkVEX1RFU1RfWklQX1JFR0VYRVNfTElTVF9LRVldCisKKyAgZGVmIGRpc2NvdmVyX3Rlc3RfbW9kdWxlcyhzZWxmKSAtPiBsaXN0W3N0cl06CisgICAgIiIiRGlzY292ZXIgdGVzdCBtb2R1bGVzIGZyb20gVHJhZGVGZWQuCisKKyAgICBSZXR1cm5zOgorICAgICAgQSBsaXN0IG9mIHRlc3QgbW9kdWxlcyB0aGF0IFRyYWRlRmVkIGlzIGdvaW5nIHRvIGV4ZWN1dGUgYmFzZWQgb24gdGhlCisgICAgICBUcmFkZUZlZCB0ZXN0IGFyZ3MuCisgICAgIiIiCisgICAgcmV0dXJuIFtdCisKKyAgZGVmIGNyZWF0ZV9jbGFzc3BhdGgoc2VsZiwgZGlyZWN0b3J5KToKKyAgICAiIiJDcmVhdGVzIGEgY2xhc3NwYXRoIHN0cmluZyBmcm9tIGFsbCAuamFyIGZpbGVzIGluIHRoZSBnaXZlbiBkaXJlY3RvcnkuCisKKyAgICBBcmdzOgorICAgICAgZGlyZWN0b3J5OiBUaGUgZGlyZWN0b3J5IHRvIHNlYXJjaCBmb3IgLmphciBmaWxlcy4KKworICAgIFJldHVybnM6CisgICAgICBBIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGNsYXNzcGF0aCwgd2l0aCBqYXIgZmlsZXMgc2VwYXJhdGVkIGJ5IHRoZQorICAgICAgT1Mtc3BlY2lmaWMgcGF0aCBzZXBhcmF0b3IgKGUuZy4sICc6JyBvbiBMaW51eC9tYWNPUywgJzsnIG9uIFdpbmRvd3MpLgorICAgICIiIgorICAgIGphcl9maWxlcyA9IGdsb2IuZ2xvYihvcy5wYXRoLmpvaW4oZGlyZWN0b3J5LCAiKi5qYXIiKSkKKyAgICByZXR1cm4gb3MucGF0aHNlcC5qb2luKGphcl9maWxlcykKKworCitjbGFzcyBUZXN0RGlzY292ZXJ5RXJyb3IoRXhjZXB0aW9uKToKKyAgIiIiQSBUZXN0RGlzY292ZXJ5RXJyb3JjbGFzcy4iIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZSk6CisgICAgc3VwZXIoKS5fX2luaXRfXyhtZXNzYWdlKQorICAgIHNlbGYubWVzc2FnZSA9IG1lc3NhZ2UKZGlmZiAtLWdpdCBhL2NvZ3NldHVwLnNoIGIvY29nc2V0dXAuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjNjRhMDYuLjAwMDAwMDAKLS0tIGEvY29nc2V0dXAuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw3MSArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIFRoaXMgZmlsZSBpcyBleGVjdXRlZCBieSBidWlsZC9lbnZzZXR1cC5zaCwgYW5kIGNhbiB1c2UgYW55dGhpbmcKLSMgZGVmaW5lZCBpbiBlbnZzZXR1cC5zaC4KLWZ1bmN0aW9uIF9jcmVhdGVfb3V0X3N5bWxpbmtfZm9yX2NvZygpIHsKLSAgaWYgW1sgIiR7T1VUX0RJUn0iID09ICIiIF1dOyB0aGVuCi0gICAgT1VUX0RJUj0ib3V0IgotICBmaQotCi0gICMgZ2V0b3V0ZGlyIGVuc3VyZXMgcGF0aHMgYXJlIGFic29sdXRlLiBlbnZzZXR1cCBjb3VsZCBiZSBjYWxsZWQgZnJvbSBhCi0gICMgZGlyZWN0b3J5IG90aGVyIHRoYW4gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlCi0gIGxvY2FsIG91dGRpcj0kKGdldG91dGRpcikKLSAgaWYgW1sgLUwgIiR7b3V0ZGlyfSIgXV07IHRoZW4KLSAgICByZXR1cm4KLSAgZmkKLSAgaWYgWyAtZCAiJHtvdXRkaXJ9IiBdOyB0aGVuCi0gICAgZWNobyAtZSAiXHRPdXRwdXQgZGlyZWN0b3J5ICR7b3V0ZGlyfSBjYW5ub3QgYmUgcHJlc2VudCBpbiBhIENvZyB3b3Jrc3BhY2UuIgotICAgIGVjaG8gLWUgIlx0RGVsZXRlIFwiJHtvdXRkaXJ9XCIgb3IgY3JlYXRlIGEgc3ltbGluayBmcm9tIFwiJHtvdXRkaXJ9XCIgdG8gYSBkaXJlY3Rvcnkgb3V0c2lkZSB5b3VyIHdvcmtzcGFjZS4iCi0gICAgcmV0dXJuIDEKLSAgZmkKLQotICBERUZBVUxUX09VVFBVVF9ESVI9IiR7SE9NRX0vLmNvZy9hbmRyb2lkLWJ1aWxkLW91dCIKLSAgbWtkaXIgLXAgJHtERUZBVUxUX09VVFBVVF9ESVJ9Ci0gIGxuIC1zICR7REVGQVVMVF9PVVRQVVRfRElSfSAke291dGRpcn0KLX0KLQotIyBUaGlzIGZ1bmN0aW9uIHNldHMgdXAgdGhlIGJ1aWxkIGVudmlyb25tZW50IHRvIGJlIGFwcHJvcHJpYXRlIGZvciBDb2cuCi1mdW5jdGlvbiBfc2V0dXBfY29nX2VudigpIHsKLSAgX2NyZWF0ZV9vdXRfc3ltbGlua19mb3JfY29nCi0gIGlmIFsgIiQ/IiAtZXEgIjEiIF07IHRoZW4KLSAgICBlY2hvIC1lICJcZVswOzMzbVdBUk5JTkc6XGVbMDBtIENvZyBlbnZpcm9ubWVudCBzZXR1cCBmYWlsZWQhIgotICAgIHJldHVybiAxCi0gIGZpCi0KLSAgZXhwb3J0IEFORFJPSURfQlVJTERfRU5WSVJPTk1FTlRfQ09ORklHPSJnb29nbGVyLWNvZyIKLQotICAjIFJ1bm5pbmcgcmVwbyBjb21tYW5kIHdpdGhpbiBDb2cgd29ya3NwYWNlcyBpcyBub3Qgc3VwcG9ydGVkLCBzbyBvdmVycmlkZQotICAjIGl0IHdpdGggdGhpcyBmdW5jdGlvbi4gSWYgdGhlIHVzZXIgaXMgcnVubmluZyByZXBvIHdpdGhpbiBhIENvZyB3b3Jrc3BhY2UsCi0gICMgd2UnbGwgZmFpbCB3aXRoIGFuIGVycm9yLCBvdGhlcndpc2UsIHdlIHJ1biB0aGUgb3JpZ2luYWwgcmVwbyBjb21tYW5kIHdpdGgKLSAgIyB0aGUgZ2l2ZW4gYXJncy4KLSAgaWYgISBPUklHX1JFUE9fUEFUSD1gd2hpY2ggcmVwb2A7IHRoZW4KLSAgICByZXR1cm4gMAotICBmaQotICBmdW5jdGlvbiByZXBvIHsKLSAgICBpZiBbWyAiJHtQV0R9IiA9PSAvZ29vZ2xlL2NvZy8qIF1dOyB0aGVuCi0gICAgICBlY2hvIC1lICJcZVswMTszMW1FUlJPUjpcZVswbXJlcG8gY29tbWFuZCBpcyBkaXNhbGxvd2VkIHdpdGhpbiBDb2cgd29ya3NwYWNlcy4iCi0gICAgICByZXR1cm4gMQotICAgIGZpCi0gICAgJHtPUklHX1JFUE9fUEFUSH0gIiRAIgotICB9Ci19Ci0KLWlmIFtbICIke1BXRH0iICE9IC9nb29nbGUvY29nLyogXV07IHRoZW4KLSAgZWNobyAtZSAiXGVbMDE7MzFtRVJST1I6XGVbMG0gVGhpcyBzY3JpcHQgbXVzdCBiZSBydW4gZnJvbSBhIENvZyB3b3Jrc3BhY2UuIgotZmkKLQotX3NldHVwX2NvZ19lbnYKZGlmZiAtLWdpdCBhL2NvcmUvQlVJTEQuYmF6ZWwgYi9jb3JlL0JVSUxELmJhemVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDg2OWQ0Li4wMDAwMDAwCi0tLSBhL2NvcmUvQlVJTEQuYmF6ZWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAyMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKLQotIyBFeHBvcnQgdHJhZGVmZWQgdGVtcGxhdGVzIGZvciB0ZXN0cy4KLWV4cG9ydHNfZmlsZXMoCi0gICAgZ2xvYihbIioueG1sIl0pLAotKQotCi0jIEV4cG9ydCBwcm9ndWFyZCBmbGFnIGZpbGVzIGZvciByOC4KLWZpbGVncm91cCgKLSAgICBuYW1lID0gImdsb2JhbF9wcm9ndWFyZF9mbGFncyIsCi0gICAgc3JjcyA9IFsKLSAgICAgICAgInByb2d1YXJkLmZsYWdzIiwKLSAgICAgICAgInByb2d1YXJkX2Jhc2ljX2tlZXBzLmZsYWdzIiwKLSAgICBdLAotICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKLSkKZGlmZiAtLWdpdCBhL2NvcmUvTWFrZWZpbGUgYi9jb3JlL01ha2VmaWxlCmluZGV4IGYzNzYwMTQuLjBkNmIxNzUgMTAwNjQ0Ci0tLSBhL2NvcmUvTWFrZWZpbGUKKysrIGIvY29yZS9NYWtlZmlsZQpAQCAtMTY5LDcgKzE2OSw3IEBACiAgICAgICAgICAgICAkKGV2YWwgJChjYWxsIGNvcHkteG1sLWZpbGUtY2hlY2tlZCwkKF9zcmMpLCQoX2Z1bGxkZXN0KSkpLFwKICAgICAgICAgICAgICQoaWYgJChhbmQgJChmaWx0ZXIgJS5qYXIsJChfZGVzdCkpLCQoZmlsdGVyICQoYmFzZW5hbWUgJChub3RkaXIgJChfZGVzdCkpKSwkKFBST0RVQ1RfTE9BREVEX0JZX1BSSVZJTEVHRURfTU9EVUxFUykpKSxcCiAgICAgICAgICAgICAgICAgJChldmFsICQoY2FsbCBjb3B5LWFuZC11bmNvbXByZXNzLWRleHMsJChfc3JjKSwkKF9mdWxsZGVzdCkpKSwgXAotICAgICAgICAgICAgICAgICQoaWYgJChmaWx0ZXIgaW5pdCVyYywkKG5vdGRpciAkKF9kZXN0KSkpJChmaWx0ZXIgJS9ldGMvaW5pdCwkKGRpciAkKF9kZXN0KSkpLFwKKyAgICAgICAgICAgICAgICAkKGlmICQoZmlsdGVyIGluaXQlcmMsJChub3RkaXIgJChfZGVzdCkpKSQoZmlsdGVyICUvZXRjL2luaXQvLCQoZGlyICQoX2Rlc3QpKSksXAogICAgICAgICAgICAgICAgICAgICAkKGV2YWwgJChjYWxsIGNvcHktaW5pdC1zY3JpcHQtZmlsZS1jaGVja2VkLCQoX3NyYyksJChfZnVsbGRlc3QpKSksXAogICAgICAgICAgICAgICAgICAgICAkKGlmICQoYW5kICQoZmlsdGVyIHRydWUsJChjaGVja19lbGZfcHJlYnVpbHRfcHJvZHVjdF9jb3B5X2ZpbGVzKSksIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGZpbHRlciBiaW4gbGliIGxpYjY0LCQoc3Vic3QgLywkKHNwYWNlKSwkKF9kZXN0KSkpKSwgXApAQCAtMTkyLDYgKzE5MiwzNCBAQAogdW5pcXVlX3Byb2R1Y3RfY29weV9maWxlc19wYWlycyA6PQogdW5pcXVlX3Byb2R1Y3RfY29weV9maWxlc19kZXN0aW5hdGlvbnMgOj0KIAorCisjIFJldHVybnMgYSBsaXN0IG9mIEVYVFJBX0lOU1RBTExfWklQUyB0cmlvcyB3aG9zZSBwcmltYXJ5IGZpbGUgaXMgY29udGFpbmVkIHdpdGhpbiAkKDEpCisjIFRoZSB0cmlvcyB3aWxsIGNvbnRhaW4gdGhlIHByaW1hcnkgaW5zdGFsbGVkIGZpbGUgOiB0aGUgZGlyZWN0b3J5IHRvIHVuemlwIHRoZSB6aXAgdG8gOiB0aGUgemlwCitkZWZpbmUgcmVsZXZhbnQtZXh0cmEtaW5zdGFsbC16aXBzCiskKHN0cmlwICQoZm9yZWFjaCBwLCQoRVhUUkFfSU5TVEFMTF9aSVBTKSwgXAorICAkKGlmICQoZmlsdGVyICQoY2FsbCB3b3JkLWNvbG9uLDEsJChwKSksJCgxKSksIFwKKyAgICAkKHApKSkpCitlbmRlZgorCisjIFdyaXRlcyBhIHRleHQgZmlsZSB0aGF0IGNvbnRhaW5zIGFsbCBvZiB0aGUgZmlsZXMgdGhhdCB3aWxsIGJlIGluc2lkZSBhIHBhcnRpdGlvbi4KKyMgQWxsIHRoZSBmaWxlIHBhdGhzIHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIHBhcnRpdGlvbidzIHN0YWdpbmcgZGlyZWN0b3J5LgorIyBJdCB3aWxsIGFsc28gdGFrZSBpbnRvIGFjY291bnQgZmlsZXMgaW5zaWRlIHppcHMgbGlzdGVkIGluIEVYVFJBX0lOU1RBTExfWklQUy4KKyMKKyMgQXJndW1lbnRzOgorIyAgICQoMSk6IE91dHB1dCBmaWxlCisjICAgJCgyKTogVGhlIHBhcnRpdGlvbidzIHN0YWdpbmcgZGlyZWN0b3J5CisjICAgJCgzKTogRmlsZXMgdG8gaW5jbHVkZSBpbiB0aGUgcGFydGl0aW9uCitkZWZpbmUgd3JpdGUtcGFydGl0aW9uLWZpbGUtbGlzdAorJCgxKTogUFJJVkFURV9GSUxFUyA6PSAkKHN1YnN0ICQoMikvLCwkKGZpbHRlciAkKDIpLyUsJCgzKSkpCiskKDEpOiBQUklWQVRFX0VYVFJBX0lOU1RBTExfWklQUyA6PSAkKGNhbGwgcmVsZXZhbnQtZXh0cmEtaW5zdGFsbC16aXBzLCQoZmlsdGVyICQoMikvJSwkKDMpKSkKKyQoMSk6ICQkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9leHRyYV9pbnN0YWxsX3ppcHNfZmlsZV9saXN0ICQoZm9yZWFjaCBwLCQoY2FsbCByZWxldmFudC1leHRyYS1pbnN0YWxsLXppcHMsJChmaWx0ZXIgJCgyKS8lLCQoMykpKSwkKGNhbGwgd29yZC1jb2xvbiwzLCQocCkpKQorCUBlY2hvIFdyaXRpbmcgJCRACisJcm0gLWYgJCRACisJZWNobyAtbiA+ICQkQAorCSQkKGZvcmVhY2ggZiwkJChQUklWQVRFX0ZJTEVTKSxlY2hvICIkJChmKSIgPj4gJCRAJCQobmV3bGluZSkpCisJJCQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2V4dHJhX2luc3RhbGxfemlwc19maWxlX2xpc3QgJCgyKSAkJChQUklWQVRFX0VYVFJBX0lOU1RBTExfWklQUykgPj4gJCRACitlbmRlZgorCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIFJldHVybnMgdGhlIG1heCBhbGxvd2VkIHNpemUgZm9yIGFuIGltYWdlIHN1aXRhYmxlIGZvciBoYXNoIHZlcmlmaWNhdGlvbgogIyAoZS5nLiwgYm9vdC5pbWcsIHJlY292ZXJ5LmltZywgZXRjKS4KQEAgLTI2NywxMSArMjk1LDYgQEAKIC5QSE9OWTogbmRrLWRvY3MKIGVuZGlmCiAKLWlmZXEgKCQoSE9TVF9PUyksbGludXgpCi0kKGNhbGwgZGlzdC1mb3ItZ29hbHMsc2RrLCQoQVBJX0ZJTkdFUlBSSU5UKSkKLSQoY2FsbCBkaXN0LWZvci1nb2Fscyxkcm9pZGNvcmUsJChBUElfRklOR0VSUFJJTlQpKQotZW5kaWYKLQogSU5TVEFMTEVEX1JFQ09WRVJZSU1BR0VfVEFSR0VUIDo9CiAjIEJ1aWxkIHJlY292ZXJ5IGltYWdlIGlmCiAjIEJVSUxESU5HX1JFQ09WRVJZX0lNQUdFICYmICFCT0FSRF9VU0VTX1JFQ09WRVJZX0FTX0JPT1QgJiYgIUJPQVJEX01PVkVfUkVDT1ZFUllfUkVTT1VSQ0VTX1RPX1ZFTkRPUl9CT09ULgpAQCAtNjkyLDcgKzcxNSw3IEBACiAKIEJPQVJEX0tFUk5FTF9NT0RVTEVfRElSUyArPSB0b3AKIAotIyBEZWZhdWx0IHRvIG5vdCBnZW5lcmF0aW5nIG1vZHVsZXMuZGVwIGZvciBrZXJuZWwgbW9kdWxlcyBvbiBzeXN0ZW0KKyMgRGVmYXVsdCB0byBub3QgZ2VuZXJhdGluZyBtb2R1bGVzLmxvYWQgZm9yIGtlcm5lbCBtb2R1bGVzIG9uIHN5c3RlbQogIyBzaWRlLiBXZSBzaG91bGQgb25seSBsb2FkIHRoZXNlIG1vZHVsZXMgaWYgdGhleSBhcmUgZGVwZW5kZWQgYnkgdmVuZG9yCiAjIHNpZGUgbW9kdWxlcy4KIGlmZXEgKCQoQk9BUkRfU1lTVEVNX0tFUk5FTF9NT0RVTEVTX0xPQUQpLCkKQEAgLTc0NSwxMCArNzY4LDcgQEAKICMgJDUgcGFydGl0aW9uIHRhZwogIyAkNiBvdXRwdXQgZmlsZQogZGVmaW5lIF9hcGtjZXJ0c193cml0ZV9saW5lCi0kKGhpZGUpIGVjaG8gLW4gJ25hbWU9IiQoMSkuYXBrIiBjZXJ0aWZpY2F0ZT0iJDIiIHByaXZhdGVfa2V5PSIkMyInID4+ICQ2Ci0kKGlmICQoNCksICQoaGlkZSkgZWNobyAtbiAnIGNvbXByZXNzZWQ9IiQ0IicgPj4gJDYpCi0kKGlmICQoNSksICQoaGlkZSkgZWNobyAtbiAnIHBhcnRpdGlvbj0iJDUiJyA+PiAkNikKLSQoaGlkZSkgZWNobyAnJyA+PiAkNgorJChoaWRlKSBlY2hvICduYW1lPSIkKDEpLmFwayIgY2VydGlmaWNhdGU9IiQyIiBwcml2YXRlX2tleT0iJDMiJChpZiAkKDQpLCBjb21wcmVzc2VkPSIkNCIpJChpZiAkKDUpLCBwYXJ0aXRpb249IiQ1IiknID4+ICQ2CiAKIGVuZGVmCiAKQEAgLTgxOSwxNiArODM5LDYgQEAKIAogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIGJ1aWxkIHN5c3RlbSBzdGF0cwotQlVJTERfU1lTVEVNX1NUQVRTIDo9ICQoUFJPRFVDVF9PVVQpL2J1aWxkX3N5c3RlbV9zdGF0cy50eHQKLSQoQlVJTERfU1lTVEVNX1NUQVRTKToKLQlAcm0gLWYgJEAKLQlAJChmb3JlYWNoIHMsJChTVEFUUy5NT0RVTEVfVFlQRSksZWNobyAibW9kdWxlc190eXBlX21ha2UsJChzKSwkKHdvcmRzICQoU1RBVFMuTU9EVUxFX1RZUEUuJChzKSkpIiA+PiRAOykKLQlAJChmb3JlYWNoIHMsJChTVEFUUy5TT09OR19NT0RVTEVfVFlQRSksZWNobyAibW9kdWxlc190eXBlX3Nvb25nLCQocyksJChTVEFUUy5TT09OR19NT0RVTEVfVFlQRS4kKHMpKSIgPj4kQDspCi0kKGNhbGwgZGVjbGFyZS0xcC10YXJnZXQsJChCVUlMRF9TWVNURU1fU1RBVFMpLGJ1aWxkKQotJChjYWxsIGRpc3QtZm9yLWdvYWxzLGRyb2lkY29yZS11bmJ1bmRsZWQsJChCVUlMRF9TWVNURU1fU1RBVFMpKQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAjIGJ1aWxkIC9wcm9kdWN0L2V0Yy9zZWN1cml0eS9hdmIvc3lzdGVtX290aGVyLmF2YnB1YmtleSBpZiBuZWVkZWQKIGlmZGVmIEJVSUxESU5HX1NZU1RFTV9PVEhFUl9JTUFHRQogaWZlcSAoJChCT0FSRF9BVkJfRU5BQkxFKSx0cnVlKQpAQCAtODQ0LDYgKzg1NCw3IEBACiBTT09OR19DT05WX0RBVEEgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsc29vbmdfY29udmVyc2lvbikvc29vbmdfY29udl9kYXRhCiAkKFNPT05HX0NPTlZfREFUQSk6CiAJQHJtIC1mICRACisJQHRvdWNoICRAICMgVGhpcyBmaWxlIG11c3QgYmUgcHJlc2VudCBldmVuIGlmIFNPT05HX0NPTlYgaXMgZW1wdHkuCiAJQCQoZm9yZWFjaCBzLCQoU09PTkdfQ09OViksZWNobyAiJChzKSwkKFNPT05HX0NPTlYuJChzKS5UWVBFKSwkKHNvcnQgJChTT09OR19DT05WLiQocykuUFJPQkxFTVMpKSwkKHNvcnQgJChmaWx0ZXItb3V0ICQoU09PTkdfQUxSRUFEWV9DT05WKSwkKFNPT05HX0NPTlYuJChzKS5ERVBTKSkpLCQoc29ydCAkKFNPT05HX0NPTlYuJChzKS5NQUtFRklMRVMpKSwkKHNvcnQgJChTT09OR19DT05WLiQocykuSU5TVEFMTEVEKSkiID4+JEA7KQogCiAkKGNhbGwgZGVjbGFyZS0xcC10YXJnZXQsJChTT09OR19DT05WX0RBVEEpLGJ1aWxkKQpAQCAtODU2LDExICs4NjcsNiBAQAogJChjYWxsIGRlY2xhcmUtMXAtdGFyZ2V0LCQoU09PTkdfVE9fQ09OVkVSVCksYnVpbGQpCiAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsZHJvaWRjb3JlLXVuYnVuZGxlZCwkKFNPT05HX1RPX0NPTlZFUlQpKQogCi0kKFBST0RVQ1RfT1VUKS9wcm9kdWN0X3BhY2thZ2VzLnR4dDoKLQlAcm0gLWYgJEAKLQllY2hvICIiID4gJEAKLQkkKGZvcmVhY2ggeCwkKFBST0RVQ1RfUEFDS0FHRVMpLGVjaG8gJCh4KSA+PiAkQCQobmV3bGluZSkpCi0KIE1LMkJQX0NBVEFMT0dfU0NSSVBUIDo9IGJ1aWxkL21ha2UvdG9vbHMvbWsyYnBfY2F0YWxvZy5weQogUFJPRFVDVF9QQUNLQUdFU19UWFQgOj0gJChQUk9EVUNUX09VVCkvcHJvZHVjdF9wYWNrYWdlcy50eHQKIE1LMkJQX1JFTUFJTklOR19IVE1MIDo9ICQoUFJPRFVDVF9PVVQpL21rMmJwX3JlbWFpbmluZy5odG1sCkBAIC05MDcsMTggKzkxMyw2IEBACiAKICQoY2FsbCBkaXN0LWZvci1nb2Fscyxkcm9pZGNvcmUtdW5idW5kbGVkLCQoV0FMTF9XRVJST1IpKQogCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIE1vZHVsZXMgbWlzc2luZyBwcm9maWxlIGZpbGVzCi1QR09fUFJPRklMRV9NSVNTSU5HIDo9ICQoUFJPRFVDVF9PVVQpL3Bnb19wcm9maWxlX2ZpbGVfbWlzc2luZy50eHQKLSQoUEdPX1BST0ZJTEVfTUlTU0lORyk6Ci0JQHJtIC1mICRACi0JZWNobyAiIyBNb2R1bGVzIG1pc3NpbmcgUEdPIHByb2ZpbGUgZmlsZXMiID4+ICRACi0JZm9yIG0gaW4gJChTT09OR19NT0RVTEVTX01JU1NJTkdfUEdPX1BST0ZJTEVfRklMRSk7IGRvIGVjaG8gJCRtID4+ICRAOyBkb25lCi0KLSQoY2FsbCBkZWNsYXJlLTBwLXRhcmdldCwkKFBHT19QUk9GSUxFX01JU1NJTkcpKQotCi0kKGNhbGwgZGlzdC1mb3ItZ29hbHMsZHJvaWRjb3JlLCQoUEdPX1BST0ZJTEVfTUlTU0lORykpCi0KIENFUlRJRklDQVRFX1ZJT0xBVElPTl9NT0RVTEVTX0ZJTEVOQU1FIDo9ICQoUFJPRFVDVF9PVVQpL2NlcnRpZmljYXRlX3Zpb2xhdGlvbl9tb2R1bGVzLnR4dAogJChDRVJUSUZJQ0FURV9WSU9MQVRJT05fTU9EVUxFU19GSUxFTkFNRSk6CiAJcm0gLWYgJEAKQEAgLTk0MSwyNyArOTM1LDEyIEBACiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotLlBIT05ZOiBldmVudC1sb2ctdGFncwotCi0jIFByb2R1Y2UgYW4gZXZlbnQgbG9ncyB0YWcgZmlsZSBmb3IgZXZlcnl0aGluZyB3ZSBrbm93IGFib3V0LCBpbiBvcmRlcgotIyB0byBwcm9wZXJseSBhbGxvY2F0ZSBudW1iZXJzLiAgVGhlbiBwcm9kdWNlIGEgZmlsZSB0aGF0J3MgZmlsdGVyZWQKLSMgZm9yIHdoYXQncyBnb2luZyB0byBiZSBpbnN0YWxsZWQuCi0KLWFsbF9ldmVudF9sb2dfdGFnc19maWxlIDo9ICQoVEFSR0VUX09VVF9DT01NT05fSU5URVJNRURJQVRFUykvYWxsLWV2ZW50LWxvZy10YWdzLnR4dAotCiBldmVudF9sb2dfdGFnc19maWxlIDo9ICQoVEFSR0VUX09VVCkvZXRjL2V2ZW50LWxvZy10YWdzCiAKICMgSW5jbHVkZSB0YWdzIGZyb20gYWxsIHBhY2thZ2VzIHRoYXQgd2Uga25vdyBhYm91dAogYWxsX2V2ZW50X2xvZ190YWdzX3NyYyA6PSBcCiAgICAgJChzb3J0ICQoZm9yZWFjaCBtLCAkKEFMTF9NT0RVTEVTKSwgJChBTExfTU9EVUxFUy4kKG0pLkVWRU5UX0xPR19UQUdTKSkpCiAKLSQoYWxsX2V2ZW50X2xvZ190YWdzX2ZpbGUpOiBQUklWQVRFX1NSQ19GSUxFUyA6PSAkKGFsbF9ldmVudF9sb2dfdGFnc19zcmMpCi0kKGFsbF9ldmVudF9sb2dfdGFnc19maWxlKTogJChhbGxfZXZlbnRfbG9nX3RhZ3Nfc3JjKSAkKE1FUkdFVEFHUykgYnVpbGQvbWFrZS90b29scy9ldmVudF9sb2dfdGFncy5weQotCSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApCi0JJChoaWRlKSAkKE1FUkdFVEFHUykgLW8gJEAgJChQUklWQVRFX1NSQ19GSUxFUykKLQotJChjYWxsIGRlY2xhcmUtMHAtdGFyZ2V0LCQoYWxsX2V2ZW50X2xvZ190YWdzX2ZpbGUpKQotCiAjIEluY2x1ZGUgdGFncyBmcm9tIGFsbCBwYWNrYWdlcyBpbmNsdWRlZCBpbiB0aGlzIHByb2R1Y3QsIHBsdXMgYWxsCiAjIHRhZ3MgdGhhdCBhcmUgcGFydCBvZiB0aGUgc3lzdGVtIChpZSwgbm90IGluIGEgdmVuZG9yLyBvciBkZXZpY2UvCiAjIGRpcmVjdG9yeSkuCkBAIC05NzMsMTMgKzk1MiwxMyBAQAogICAgICAgJChmaWx0ZXItb3V0IHZlbmRvci8lIGRldmljZS8lIG91dC8lLCQoYWxsX2V2ZW50X2xvZ190YWdzX3NyYykpKQogCiAkKGV2ZW50X2xvZ190YWdzX2ZpbGUpOiBQUklWQVRFX1NSQ19GSUxFUyA6PSAkKGV2ZW50X2xvZ190YWdzX3NyYykKLSQoZXZlbnRfbG9nX3RhZ3NfZmlsZSk6IFBSSVZBVEVfTUVSR0VEX0ZJTEUgOj0gJChhbGxfZXZlbnRfbG9nX3RhZ3NfZmlsZSkKLSQoZXZlbnRfbG9nX3RhZ3NfZmlsZSk6ICQoZXZlbnRfbG9nX3RhZ3Nfc3JjKSAkKGFsbF9ldmVudF9sb2dfdGFnc19maWxlKSAkKE1FUkdFVEFHUykgYnVpbGQvbWFrZS90b29scy9ldmVudF9sb2dfdGFncy5weQorJChldmVudF9sb2dfdGFnc19maWxlKTogJChldmVudF9sb2dfdGFnc19zcmMpICQoTUVSR0VUQUdTKQogCSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApCi0JJChoaWRlKSAkKE1FUkdFVEFHUykgLW8gJEAgLW0gJChQUklWQVRFX01FUkdFRF9GSUxFKSAkKFBSSVZBVEVfU1JDX0ZJTEVTKQorCSQoaGlkZSkgJChNRVJHRVRBR1MpIC1vICRAICQoUFJJVkFURV9TUkNfRklMRVMpCiAKICQoZXZhbCAkKGNhbGwgZGVjbGFyZS0wcC10YXJnZXQsJChldmVudF9sb2dfdGFnc19maWxlKSkpCiAKKy5QSE9OWTogZXZlbnQtbG9nLXRhZ3MKIGV2ZW50LWxvZy10YWdzOiAkKGV2ZW50X2xvZ190YWdzX2ZpbGUpCiAKIEFMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTICs9ICQoZXZlbnRfbG9nX3RhZ3NfZmlsZSkKQEAgLTEyMTksNTMgKzExOTgsOCBAQAogZW5kaWYgIyBCT0FSRF9QUkVCVUlMVF9EVEJPSU1BR0VfMTZLQgogCiAKLWlmbmVxICgkKEJPQVJEX0tFUk5FTF9QQVRIXzE2SyksKQotQlVJTFRfS0VSTkVMXzE2S19UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkva2VybmVsXzE2awotCi0kKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChCT0FSRF9LRVJORUxfUEFUSF8xNkspLCQoQlVJTFRfS0VSTkVMXzE2S19UQVJHRVQpKSkKLQotIyBDb3BpZXMgQk9BUkRfS0VSTkVMX1BBVEhfMTZLIHRvIG91dHB1dCBkaXJlY3RvcnkgYXMgaXMKLWtlcm5lbF8xNms6ICQoQlVJTFRfS0VSTkVMXzE2S19UQVJHRVQpCi0uUEhPTlk6IGtlcm5lbF8xNmsKLQotQlVJTFRfQk9PVElNQUdFXzE2S19UQVJHRVQgOj0gJChQUk9EVUNUX09VVCkvYm9vdF8xNmsuaW1nCi0KLUJPQVJEX0tFUk5FTF8xNktfQk9PVElNQUdFX1BBUlRJVElPTl9TSVpFIDo9ICQoQk9BUkRfQk9PVElNQUdFX1BBUlRJVElPTl9TSVpFKQotCi0kKEJVSUxUX0JPT1RJTUFHRV8xNktfVEFSR0VUKTogJChNS0JPT1RJTUcpICQoQVZCVE9PTCkgJChJTlRFUk5BTF9CT09USU1BR0VfRklMRVMpICQoQk9BUkRfQVZCX0JPT1RfS0VZX1BBVEgpICQoQlVJTFRfS0VSTkVMXzE2S19UQVJHRVQpCi0JJChjYWxsIHByZXR0eSwiVGFyZ2V0IGJvb3QgMTZrIGltYWdlOiAkQCIpCi0JJChjYWxsIGJ1aWxkX2Jvb3RfZnJvbV9rZXJuZWxfYXZiX2VuYWJsZWQsJEAsJChCVUlMVF9LRVJORUxfMTZLX1RBUkdFVCkpCi0KLQotYm9vdGltYWdlXzE2azogJChCVUlMVF9CT09USU1BR0VfMTZLX1RBUkdFVCkKLS5QSE9OWTogYm9vdGltYWdlXzE2awotCi1CVUlMVF9CT09UX09UQV9QQUNLQUdFXzE2SyA6PSAkKFBST0RVQ1RfT1VUKS9ib290X290YV8xNmsuemlwCi0kKEJVSUxUX0JPT1RfT1RBX1BBQ0tBR0VfMTZLKTogICQoT1RBX0ZST01fUkFXX0lNRykgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKEJVSUxUX0JPT1RJTUFHRV8xNktfVEFSR0VUKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChERUZBVUxUX1NZU1RFTV9ERVZfQ0VSVElGSUNBVEUpLnBrOCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoSU5TVEFMTEVEX0RUQk9JTUFHRV8xNktCX1RBUkdFVCkgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKQotCSQoT1RBX0ZST01fUkFXX0lNRykgLS1wYWNrYWdlX2tleSAkKERFRkFVTFRfU1lTVEVNX0RFVl9DRVJUSUZJQ0FURSkgXAotICAgICAgICAgICAgICAgICAgICAgIC0tbWF4X3RpbWVzdGFtcCBgY2F0ICQoQlVJTERfREFURVRJTUVfRklMRSlgIFwKLSAgICAgICAgICAgICAgICAgICAgICAtLXBhdGggJChIT1NUX09VVCkgXAotICAgICAgICAgICAgICAgICAgICAgIC0tcGFydGl0aW9uX25hbWUgJChpZiAkKGFuZCAkKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICQoSU5TVEFMTEVEX0RUQk9JTUFHRV8xNktCX1RBUkdFVCkpLFwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb3QkKGNvbW1hKWR0Ym8sXAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vdCkgXAotICAgICAgICAgICAgICAgICAgICAgIC0tb3V0cHV0ICRAIFwKLSAgICAgICAgICAgICAgICAgICAgICAkKGlmICQoQk9BUkRfMTZLX09UQV9VU0VfSU5DUkVNRU5UQUwpLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpOiQoQlVJTFRfQk9PVElNQUdFXzE2S19UQVJHRVQpLFwKLSAgICAgICAgICAgICAgICAgICAgICAgICQoQlVJTFRfQk9PVElNQUdFXzE2S19UQVJHRVQpXAotICAgICAgICAgICAgICAgICAgICAgIClcCi0gICAgICAgICAgICAgICAgICAgICAgJChpZiAkKGFuZCAkKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKSwkKElOU1RBTExFRF9EVEJPSU1BR0VfMTZLQl9UQVJHRVQpKSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAkKElOU1RBTExFRF9EVEJPSU1BR0VfMTZLQl9UQVJHRVQpKQotCi1ib290b3RhcGFja2FnZV8xNms6ICQoQlVJTFRfQk9PVF9PVEFfUEFDS0FHRV8xNkspCi0uUEhPTlk6IGJvb3RvdGFwYWNrYWdlXzE2awotCi1lbmRpZgorcmFtZGlza19pbnRlcm1lZGlhdGVzIDo9JD0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcscmFtZGlzaykKKyQoZXZhbCAkKGNhbGwgd3JpdGUtcGFydGl0aW9uLWZpbGUtbGlzdCwkKHJhbWRpc2tfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dCwkKFRBUkdFVF9SQU1ESVNLX09VVCksJChJTlRFUk5BTF9SQU1ESVNLX0ZJTEVTKSkpCiAKICMgVGhlIHZhbHVlIG9mIFJBTURJU0tfTk9ERV9MSVNUIGlzIGRlZmluZWQgaW4gc3lzdGVtL2NvcmUvcm9vdGRpci9BbmRyb2lkLmJwLgogIyBUaGlzIGZpbGUgY29udGFpbnMgL2RldiBub2RlcyBkZXNjcmlwdGlvbiBhZGRlZCB0byB0aGUgZ2VuZXJpYyByYW1kaXNrCkBAIC0xNTAwLDYgKzE0MzQsNTUgQEAKIGVuZGlmICMgbXlfaW5zdGFsbGVkX3ByZWJ1aWx0X2draV9hcGV4IG5vdCBkZWZpbmVkCiAKIGlmbmVxICgkKEJPQVJEX0tFUk5FTF9QQVRIXzE2SyksKQorCitCVUlMVF9LRVJORUxfMTZLX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS9rZXJuZWxfMTZrCisKKyQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwkKEJPQVJEX0tFUk5FTF9QQVRIXzE2SyksJChCVUlMVF9LRVJORUxfMTZLX1RBUkdFVCkpKQorCisjIENvcGllcyBCT0FSRF9LRVJORUxfUEFUSF8xNksgdG8gb3V0cHV0IGRpcmVjdG9yeSBhcyBpcwora2VybmVsXzE2azogJChCVUlMVF9LRVJORUxfMTZLX1RBUkdFVCkKKy5QSE9OWToga2VybmVsXzE2aworCitCVUlMVF9CT09USU1BR0VfMTZLX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS9ib290XzE2ay5pbWcKKworQk9BUkRfS0VSTkVMXzE2S19CT09USU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gJChCT0FSRF9CT09USU1BR0VfUEFSVElUSU9OX1NJWkUpCisKKyQoQlVJTFRfQk9PVElNQUdFXzE2S19UQVJHRVQpOiAkKE1LQk9PVElNRykgJChBVkJUT09MKSAkKElOVEVSTkFMX0JPT1RJTUFHRV9GSUxFUykgJChCT0FSRF9BVkJfQk9PVF9LRVlfUEFUSCkgJChCVUlMVF9LRVJORUxfMTZLX1RBUkdFVCkKKwkkKGNhbGwgcHJldHR5LCJUYXJnZXQgYm9vdCAxNmsgaW1hZ2U6ICRAIikKKwkkKGNhbGwgYnVpbGRfYm9vdF9mcm9tX2tlcm5lbF9hdmJfZW5hYmxlZCwkQCwkKEJVSUxUX0tFUk5FTF8xNktfVEFSR0VUKSkKKworCitib290aW1hZ2VfMTZrOiAkKEJVSUxUX0JPT1RJTUFHRV8xNktfVEFSR0VUKQorLlBIT05ZOiBib290aW1hZ2VfMTZrCisKK0JVSUxUX0JPT1RfT1RBX1BBQ0tBR0VfMTZLIDo9ICQoUFJPRFVDVF9PVVQpL2Jvb3Rfb3RhXzE2ay56aXAKKyQoQlVJTFRfQk9PVF9PVEFfUEFDS0FHRV8xNkspOiBQUklWQVRFX0JPT1RJTUFHRV9UQVJHRVQgOj0gJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCkKKyQoQlVJTFRfQk9PVF9PVEFfUEFDS0FHRV8xNkspOiBQUklWQVRFX0JPT1RJTUFHRV8xNktCX1RBUkdFVCA6PSAkKEJVSUxUX0JPT1RJTUFHRV8xNktfVEFSR0VUKQorJChCVUlMVF9CT09UX09UQV9QQUNLQUdFXzE2Syk6ICAkKE9UQV9GUk9NX1JBV19JTUcpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChERUZBVUxUX1NZU1RFTV9ERVZfQ0VSVElGSUNBVEUpLnBrOCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoSU5TVEFMTEVEX0JPT1RJTUFHRV9UQVJHRVQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChCVUlMVF9CT09USU1BR0VfMTZLX1RBUkdFVCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKElOU1RBTExFRF9EVEJPSU1BR0VfMTZLQl9UQVJHRVQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCkKKwkkKE9UQV9GUk9NX1JBV19JTUcpIC0tcGFja2FnZV9rZXkgJChERUZBVUxUX1NZU1RFTV9ERVZfQ0VSVElGSUNBVEUpIFwKKyAgICAgICAgICAgICAgICAgICAgICAtLW1heF90aW1lc3RhbXAgYGNhdCAkKEJVSUxEX0RBVEVUSU1FX0ZJTEUpYCBcCisgICAgICAgICAgICAgICAgICAgICAgLS1wYXRoICQoSE9TVF9PVVQpIFwKKyAgICAgICAgICAgICAgICAgICAgICAtLXBhcnRpdGlvbl9uYW1lICQoaWYgJChhbmQgJChJTlNUQUxMRURfRFRCT0lNQUdFX1RBUkdFVCksXAorICAgICAgICAgICAgICAgICAgICAgICAgICAkKElOU1RBTExFRF9EVEJPSU1BR0VfMTZLQl9UQVJHRVQpKSxcCisgICAgICAgICAgICAgICAgICAgICAgICBib290JChjb21tYSlkdGJvLFwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb3QpIFwKKyAgICAgICAgICAgICAgICAgICAgICAtLW91dHB1dCAkQCBcCisgICAgICAgICAgICAgICAgICAgICAgJChpZiAkKEJPQVJEXzE2S19PVEFfVVNFX0lOQ1JFTUVOVEFMKSxcCisgICAgICAgICAgICAgICAgICAgICAgICAkKFBSSVZBVEVfQk9PVElNQUdFX1RBUkdFVCk6JChQUklWQVRFX0JPT1RJTUFHRV8xNktCX1RBUkdFVCksXAorICAgICAgICAgICAgICAgICAgICAgICAgJChQUklWQVRFX0JPT1RJTUFHRV8xNktCX1RBUkdFVClcCisgICAgICAgICAgICAgICAgICAgICAgKVwKKyAgICAgICAgICAgICAgICAgICAgICAkKGlmICQoYW5kICQoSU5TVEFMTEVEX0RUQk9JTUFHRV9UQVJHRVQpLCQoSU5TVEFMTEVEX0RUQk9JTUFHRV8xNktCX1RBUkdFVCkpLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICQoSU5TVEFMTEVEX0RUQk9JTUFHRV8xNktCX1RBUkdFVCkpCisKK2Jvb3RvdGFwYWNrYWdlXzE2azogJChCVUlMVF9CT09UX09UQV9QQUNLQUdFXzE2SykKKy5QSE9OWTogYm9vdG90YXBhY2thZ2VfMTZrCisKKwogQlVJTFRfQk9PVF9PVEFfUEFDS0FHRV80SyA6PSAkKFBST0RVQ1RfT1VUKS9ib290X290YV80ay56aXAKICQoQlVJTFRfQk9PVF9PVEFfUEFDS0FHRV80Syk6ICQoT1RBX0ZST01fUkFXX0lNRykgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCkgXApAQCAtMTUyOCwxMSArMTUxMSwyNiBAQAogaWZlcSAoJChCT0FSRF8xNktfT1RBX01PVkVfVkVORE9SKSx0cnVlKQogJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoQlVJTFRfQk9PVF9PVEFfUEFDS0FHRV80SyksJChUQVJHRVRfT1VUX1ZFTkRPUikvYm9vdF9vdGFzL2Jvb3Rfb3RhXzRrLnppcCkpCiAkKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChCVUlMVF9CT09UX09UQV9QQUNLQUdFXzE2SyksJChUQVJHRVRfT1VUX1ZFTkRPUikvYm9vdF9vdGFzL2Jvb3Rfb3RhXzE2ay56aXApKQorCiBBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKFRBUkdFVF9PVVRfVkVORE9SKS9ib290X290YXMvYm9vdF9vdGFfNGsuemlwCiBBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKFRBUkdFVF9PVVRfVkVORE9SKS9ib290X290YXMvYm9vdF9vdGFfMTZrLnppcAorCitpZm5lcSAoJChCT0FSRF9WRU5ET1JfS0VSTkVMX01PRFVMRVNfMk5EX1NUQUdFXzE2S0JfTU9ERSksKQorIyBBZGQgdGhlIG1vZHVsZXMgdGhhdCBuZWVkIHRvIGJlIGxvYWRlZCBpbiB0aGUgU2Vjb25kIEJvb3QgU3RhZ2UKKyMgdG8gL3ZlbmRvcl9kbGttL2xpYi9tb2R1bGVzLzE2ay1tb2RlCitWRU5ET1JfRExLTV8xNktfTU9ERV9ESVIgOj0gbGliL21vZHVsZXMvMTZrLW1vZGUKKyQoZm9yZWFjaCBtb2R1bGUsJChCT0FSRF9WRU5ET1JfS0VSTkVMX01PRFVMRVNfMk5EX1NUQUdFXzE2S0JfTU9ERSksIFwKKyAgICAkKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChUQVJHRVRfS0VSTkVMX0RJUl8xNkspLyQobW9kdWxlKSxcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoVEFSR0VUX09VVF9WRU5ET1JfRExLTSkvJChWRU5ET1JfRExLTV8xNktfTU9ERV9ESVIpLyQobW9kdWxlKSkpKQorCitBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKGZvcmVhY2ggbW9kdWxlLCQoQk9BUkRfVkVORE9SX0tFUk5FTF9NT0RVTEVTXzJORF9TVEFHRV8xNktCX01PREUpLFwKKyAgICAkKFRBUkdFVF9PVVRfVkVORE9SX0RMS00pLyQoVkVORE9SX0RMS01fMTZLX01PREVfRElSKS8kKG1vZHVsZSkpCitlbmRpZiAjIEJPQVJEX1ZFTkRPUl9LRVJORUxfTU9EVUxFU18yTkRfU1RBR0VfMTZLQl9NT0RFIG5vdCBlbXB0eQorCiBlbHNlCiAkKGV2YWwgJChjYWxsIGNvcHktb25lLWZpbGUsJChCVUlMVF9CT09UX09UQV9QQUNLQUdFXzRLKSwkKFRBUkdFVF9PVVQpL2Jvb3Rfb3Rhcy9ib290X290YV80ay56aXApKQogJChldmFsICQoY2FsbCBjb3B5LW9uZS1maWxlLCQoQlVJTFRfQk9PVF9PVEFfUEFDS0FHRV8xNkspLCQoVEFSR0VUX09VVCkvYm9vdF9vdGFzL2Jvb3Rfb3RhXzE2ay56aXApKQorCiBBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKFRBUkdFVF9PVVQpL2Jvb3Rfb3Rhcy9ib290X290YV80ay56aXAKIEFMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTICs9ICQoVEFSR0VUX09VVCkvYm9vdF9vdGFzL2Jvb3Rfb3RhXzE2ay56aXAKIGVuZGlmICMgQk9BUkRfMTZLX09UQV9NT1ZFX1ZFTkRPUiA9PSB0cnVlCkBAIC0xNTY0LDYgKzE1NjIsNyBAQAogCSQoQVZCVE9PTCkgYWRkX2hhc2hfZm9vdGVyIFwKICAgICAgICAgICAgLS1pbWFnZSAkQCBcCiAJICAgJChjYWxsIGdldC1wYXJ0aXRpb24tc2l6ZS1hcmd1bWVudCwkKEJPQVJEX0lOSVRfQk9PVF9JTUFHRV9QQVJUSVRJT05fU0laRSkpIFwKKwkgICAtLXNhbHQgJCQoc2hhMjU2c3VtICQoQlVJTERfTlVNQkVSX0ZJTEUpICQoQlVJTERfREFURVRJTUVfRklMRSkgfCBjdXQgLWQgIiAiIC1mIDEgfCB0ciAtZCAnXG4nKSBcCiAJICAgLS1wYXJ0aXRpb25fbmFtZSBpbml0X2Jvb3QgJChJTlRFUk5BTF9BVkJfSU5JVF9CT09UX1NJR05JTkdfQVJHUykgXAogCSAgICQoQk9BUkRfQVZCX0lOSVRfQk9PVF9BRERfSEFTSF9GT09URVJfQVJHUykKIApAQCAtMTYyMiw2ICsxNjIxLDggQEAKICAgICAkKEFMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTKSkKIAogSU5URVJOQUxfVkVORE9SX1JBTURJU0tfVEFSR0VUIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHZlbmRvcl9ib290KS92ZW5kb3JfcmFtZGlzay5jcGlvJChSQU1ESVNLX0VYVCkKK3ZlbmRvcl9yYW1kaXNrX2ludGVybWVkaWF0ZXMgOj0kPSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyx2ZW5kb3JfcmFtZGlzaykKKyQoZXZhbCAkKGNhbGwgd3JpdGUtcGFydGl0aW9uLWZpbGUtbGlzdCwkKHZlbmRvcl9yYW1kaXNrX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQsJChUQVJHRVRfVkVORE9SX1JBTURJU0tfT1VUKSwkKElOVEVSTkFMX1ZFTkRPUl9SQU1ESVNLX0ZJTEVTKSkpCiAKICMgRXhjbHVkZSByZWNvdmVyeSBmaWxlcyBpbiB0aGUgZGVmYXVsdCB2ZW5kb3IgcmFtZGlzayBpZiBpbmNsdWRpbmcgYSBzdGFuZGFsb25lCiAjIHJlY292ZXJ5IHJhbWRpc2sgaW4gdmVuZG9yX2Jvb3QuCkBAIC0xNjc2LDEyICsxNjc3LDEzIEBACiAgIElOVEVSTkFMX1ZFTkRPUl9CT09USU1BR0VfQVJHUyArPSAtLXZlbmRvcl9jbWRsaW5lICIkKElOVEVSTkFMX0tFUk5FTF9DTURMSU5FKSIKIGVuZGlmCiAKLWlmZGVmIElOVEVSTkFMX0JPT1RDT05GSUcKK2lmbmVxICgsICQoSU5URVJOQUxfQk9PVENPTkZJRykkKElOVEVSTkFMX0JPT1RDT05GSUdfRklMRSkpCiAgIElOVEVSTkFMX1ZFTkRPUl9CT09UQ09ORklHX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS92ZW5kb3ItYm9vdGNvbmZpZy5pbWcKICAgJChJTlRFUk5BTF9WRU5ET1JfQk9PVENPTkZJR19UQVJHRVQpOgogCXJtIC1mICRACiAJJChmb3JlYWNoIHBhcmFtLCQoSU5URVJOQUxfQk9PVENPTkZJRyksIFwKIAkgcHJpbnRmICIlc1xuIiAkKHBhcmFtKSA+PiAkQDspCisJY2F0ICQoSU5URVJOQUxfQk9PVENPTkZJR19GSUxFKSA+PiAkQAogICBJTlRFUk5BTF9WRU5ET1JfQk9PVElNQUdFX0FSR1MgKz0gLS12ZW5kb3JfYm9vdGNvbmZpZyAkKElOVEVSTkFMX1ZFTkRPUl9CT09UQ09ORklHX1RBUkdFVCkKIGVuZGlmCiAKQEAgLTE3MzYsNiArMTczOCw3IEBACiAJJChBVkJUT09MKSBhZGRfaGFzaF9mb290ZXIgXAogICAgICAgICAgICAtLWltYWdlICRAIFwKIAkgICAkKGNhbGwgZ2V0LXBhcnRpdGlvbi1zaXplLWFyZ3VtZW50LCQoQk9BUkRfVkVORE9SX0JPT1RJTUFHRV9QQVJUSVRJT05fU0laRSkpIFwKKwkgICAtLXNhbHQgJCQoc2hhMjU2c3VtICQoQlVJTERfTlVNQkVSX0ZJTEUpICQoQlVJTERfREFURVRJTUVfRklMRSkgfCBjdXQgLWQgIiAiIC1mIDEgfCB0ciAtZCAnXG4nKSBcCiAJICAgLS1wYXJ0aXRpb25fbmFtZSB2ZW5kb3JfYm9vdCAkKElOVEVSTkFMX0FWQl9WRU5ET1JfQk9PVF9TSUdOSU5HX0FSR1MpIFwKIAkgICAkKEJPQVJEX0FWQl9WRU5ET1JfQk9PVF9BRERfSEFTSF9GT09URVJfQVJHUykKIGVsc2UKQEAgLTE3ODQsNiArMTc4Nyw3IEBACiBJTlRFUk5BTF9WRU5ET1JfS0VSTkVMX1JBTURJU0tfVEFSR0VUIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHZlbmRvcl9rZXJuZWxfYm9vdCkvdmVuZG9yX2tlcm5lbF9yYW1kaXNrLmNwaW8kKFJBTURJU0tfRVhUKQogCiAkKElOVEVSTkFMX1ZFTkRPUl9LRVJORUxfUkFNRElTS19UQVJHRVQpOiAkKE1LQk9PVEZTKSAkKElOVEVSTkFMX1ZFTkRPUl9LRVJORUxfUkFNRElTS19GSUxFUykgfCAkKENPTVBSRVNTSU9OX0NPTU1BTkRfREVQUykKKwkkKGhpZGUpIDogJCh3b3JkcyAkKElOVEVSTkFMX1ZFTkRPUl9LRVJORUxfUkFNRElTS19GSUxFUykpCiAJJChNS0JPT1RGUykgLWQgJChUQVJHRVRfT1VUKSAkKFRBUkdFVF9WRU5ET1JfS0VSTkVMX1JBTURJU0tfT1VUKSB8ICQoQ09NUFJFU1NJT05fQ09NTUFORCkgPiAkQAogCiBJTlNUQUxMRURfVkVORE9SX0tFUk5FTF9SQU1ESVNLX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS92ZW5kb3Jfa2VybmVsX3JhbWRpc2suaW1nCkBAIC0xOTc1LDcgKzE5NzksOCBAQAogCiAjICQxIGluc3RhbGxlZCBmaWxlIHBhdGgsIGUuZy4gb3V0L3RhcmdldC9wcm9kdWN0L3Zzb2NfeDg2XzY0L3N5c3RlbV9leHQvZXRjL05PVElDRS54bWwuZ3oKIGRlZmluZSBpcy1ub3RpY2UtZmlsZQotJChpZiAkKGZpbmRzdHJpbmcgJDEsJChBTExfSU5TVEFMTEVEX05PVElDRV9GSUxFUykpLFkpCiskKGlmICQoZmlsdGVyIHRydWUsJChQUk9EVUNUX1VTRV9TT09OR19OT1RJQ0VfWE1MKSksLCBcCisgICQoaWYgJChmaW5kc3RyaW5nICQxLCQoQUxMX0lOU1RBTExFRF9OT1RJQ0VfRklMRVMpKSxZKSkKIGVuZGVmCiAKICMgTm90aWNlIGZpbGVzIGFyZSBjb3BpZWQgdG8gVEFSR0VUX09VVF9OT1RJQ0VfRklMRVMgYXMgYSBzaWRlLWVmZmVjdCBvZiB0aGVpciBtb2R1bGUKQEAgLTIzNzgsNyArMjM4Myw3IEBACiAkKGhpZGUpIGVjaG8gInJvb3RfZGlyPSQoVEFSR0VUX1JPT1RfT1VUKSIgPj4gJCgxKQogJChpZiAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9VU0VfRFlOQU1JQ19QQVJUSVRJT05fU0laRSkpLFwKICAgICAkKGhpZGUpIGVjaG8gInVzZV9keW5hbWljX3BhcnRpdGlvbl9zaXplPXRydWUiID4+ICQoMSkpCi0kKGlmICQoQ09QWV9JTUFHRVNfRk9SX1RBUkdFVF9GSUxFU19aSVApLFwKKyQoaWYgJChVU0VfRklYRURfVElNRVNUQU1QX0lNR19GSUxFUykkKENPUFlfSU1BR0VTX0ZPUl9UQVJHRVRfRklMRVNfWklQKSxcCiAgICAgJChoaWRlKSBlY2hvICJ1c2VfZml4ZWRfdGltZXN0YW1wPXRydWUiID4+ICQoMSkpCiAkKGlmICQoMyksJChoaWRlKSAkKGZvcmVhY2gga3YsJCgzKSxlY2hvICIkKGt2KSIgPj4gJCgxKTspKQogJChoaWRlKSBzb3J0IC1vICQoMSkgJCgxKQpAQCAtMjYyNCw3ICsyNjI5LDcgQEAKIFRBUkdFVF9QUklWQVRFX1JFU19ESVJTIDo9ICQod2lsZGNhcmQgJChUQVJHRVRfREVWSUNFX0RJUikvcmVjb3ZlcnkvcmVzKQogZW5kaWYKIHJlY292ZXJ5X3Jlc291cmNlX2RlcHMgOj0gJChzaGVsbCBmaW5kICQocmVjb3ZlcnlfcmVzb3VyY2VzX2NvbW1vbikgXAotICAkKFRBUkdFVF9QUklWQVRFX1JFU19ESVJTKSAtdHlwZSBmKQorICAkKFRBUkdFVF9QUklWQVRFX1JFU19ESVJTKSAtdHlwZSBmIC1ub3QgLW5hbWUgIiouYnAiKQogcmVjb3ZlcnlfcmVzb3VyY2VfZGVwcyArPSAkKGdlbmVyYXRlZF9yZWNvdmVyeV90ZXh0X2ZpbGVzKQogCiAKQEAgLTI4OTcsNiArMjkwMiw5IEBACiAkKGVycm9yIE1URCBkZXZpY2UgaXMgbm8gbG9uZ2VyIHN1cHBvcnRlZCBhbmQgdGh1cyBCT0FSRF9OQU5EX1NQQVJFX1NJWkUgaXMgZGVwcmVjYXRlZC4pCiBlbmRpZgogCityZWNvdmVyeV9pbnRlcm1lZGlhdGVzIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsUEFDS0FHSU5HLHJlY292ZXJ5KQorJChldmFsICQoY2FsbCB3cml0ZS1wYXJ0aXRpb24tZmlsZS1saXN0LCQocmVjb3ZlcnlfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dCwkKFRBUkdFVF9SRUNPVkVSWV9PVVQpLCQoSU5URVJOQUxfUkVDT1ZFUllJTUFHRV9GSUxFUykpKQorCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgQnVpbGQgZGVidWcgcmFtZGlzayBhbmQgZGVidWcgYm9vdCBpbWFnZS4KQEAgLTM0NjksMzEgKzM0NzcsNiBAQAogCiBGVUxMX1NZU1RFTUlNQUdFX0RFUFMgKz0gJChJTlRFUk5BTF9ST09UX0ZJTEVTKSAkKElOU1RBTExFRF9GSUxFU19GSUxFX1JPT1QpCiAKLSMgUmV0dXJucyBhIGxpc3Qgb2YgRVhUUkFfSU5TVEFMTF9aSVBTIHRyaW9zIHdob3NlIHByaW1hcnkgZmlsZSBpcyBjb250YWluZWQgd2l0aGluICQoMSkKLSMgVGhlIHRyaW9zIHdpbGwgY29udGFpbiB0aGUgcHJpbWFyeSBpbnN0YWxsZWQgZmlsZSA6IHRoZSBkaXJlY3RvcnkgdG8gdW56aXAgdGhlIHppcCB0byA6IHRoZSB6aXAKLWRlZmluZSByZWxldmFudC1leHRyYS1pbnN0YWxsLXppcHMKLSQoc3RyaXAgJChmb3JlYWNoIHAsJChFWFRSQV9JTlNUQUxMX1pJUFMpLCBcCi0gICQoaWYgJChmaWx0ZXIgJChjYWxsIHdvcmQtY29sb24sMSwkKHApKSwkKDEpKSwgXAotICAgICQocCkpKSkKLWVuZGVmCi0KLSMgV3JpdGVzIGEgdGV4dCBmaWxlIHRoYXQgY29udGFpbnMgYWxsIG9mIHRoZSBmaWxlcyB0aGF0IHdpbGwgYmUgaW5zaWRlIGEgcGFydGl0aW9uLgotIyBBbGwgdGhlIGZpbGUgcGF0aHMgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgcGFydGl0aW9uJ3Mgc3RhZ2luZyBkaXJlY3RvcnkuCi0jIEl0IHdpbGwgYWxzbyB0YWtlIGludG8gYWNjb3VudCBmaWxlcyBpbnNpZGUgemlwcyBsaXN0ZWQgaW4gRVhUUkFfSU5TVEFMTF9aSVBTLgotIwotIyBBcmd1bWVudHM6Ci0jICAgJCgxKTogT3V0cHV0IGZpbGUKLSMgICAkKDIpOiBUaGUgcGFydGl0aW9uJ3Mgc3RhZ2luZyBkaXJlY3RvcnkKLSMgICAkKDMpOiBGaWxlcyB0byBpbmNsdWRlIGluIHRoZSBwYXJ0aXRpb24KLWRlZmluZSB3cml0ZS1wYXJ0aXRpb24tZmlsZS1saXN0Ci0kKDEpOiAkJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZXh0cmFfaW5zdGFsbF96aXBzX2ZpbGVfbGlzdCAkKGZvcmVhY2ggcCwkKGNhbGwgcmVsZXZhbnQtZXh0cmEtaW5zdGFsbC16aXBzLCQoZmlsdGVyICQoMikvJSwkKDMpKSksJChjYWxsIHdvcmQtY29sb24sMywkKHApKSkKLQlAZWNobyBXcml0aW5nICQkQAotCXJtIC1mICQkQAotCWVjaG8gLW4gPiAkJEAKLQkkJChmb3JlYWNoIGYsJChzdWJzdCAkKDIpLywsJChmaWx0ZXIgJCgyKS8lLCQoMykpKSxlY2hvICIkJChmKSIgPj4gJCRAJCQobmV3bGluZSkpCi0JJCQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2V4dHJhX2luc3RhbGxfemlwc19maWxlX2xpc3QgJCgyKSAkKGNhbGwgcmVsZXZhbnQtZXh0cmEtaW5zdGFsbC16aXBzLCQoZmlsdGVyICQoMikvJSwkKDMpKSkgPj4gJCRACi1lbmRlZgotCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBpZmRlZiBCVUlMRElOR19TWVNURU1fSU1BR0UKIApAQCAtMzUwMSwxNiArMzQ4NCwyMCBAQAogIyBDb2xsZWN0IGFsbCBhdmFpbGFibGUgc3R1YiBsaWJyYXJpZXMgaW5zdGFsbGVkIGluIHN5c3RlbSBhbmQgaW5zdGFsbCB3aXRoIHByZWRlZmluZWQgbGlua2VyIGNvbmZpZ3VyYXRpb24KICMgQWxzbyBhcHBlbmQgTExOREsgbGlicmFyaWVzIGluIHRoZSBBUEVYIGFzIHJlcXVpcmVkIGxpYnMKIFNZU1RFTV9MSU5LRVJfQ09ORklHIDo9ICQoVEFSR0VUX09VVCkvZXRjL2xpbmtlci5jb25maWcucGIKLVNZU1RFTV9MSU5LRVJfQ09ORklHX1NPVVJDRSA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEVUQyxzeXN0ZW1fbGlua2VyX2NvbmZpZykvc3lzdGVtX2xpbmtlcl9jb25maWcKK1NZU1RFTV9MSU5LRVJfQ09ORklHX1NPVVJDRSA6PSBzeXN0ZW0vY29yZS9yb290ZGlyL2V0Yy9saW5rZXIuY29uZmlnLmpzb24KICQoU1lTVEVNX0xJTktFUl9DT05GSUcpOiBQUklWQVRFX1NZU1RFTV9MSU5LRVJfQ09ORklHX1NPVVJDRSA6PSAkKFNZU1RFTV9MSU5LRVJfQ09ORklHX1NPVVJDRSkKICQoU1lTVEVNX0xJTktFUl9DT05GSUcpOiAkKElOVEVSTkFMX1NZU1RFTUlNQUdFX0ZJTEVTKSAkKFNZU1RFTV9MSU5LRVJfQ09ORklHX1NPVVJDRSkgfCBjb252X2xpbmtlcl9jb25maWcKIAlAZWNobyBDcmVhdGluZyBsaW5rZXIgY29uZmlnOiAkQAogCUBta2RpciAtcCAkKGRpciAkQCkKLQlAcm0gLWYgJEAKLQkkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9jb252X2xpbmtlcl9jb25maWcgc3lzdGVtcHJvdmlkZSAtLXNvdXJjZSAkKFBSSVZBVEVfU1lTVEVNX0xJTktFUl9DT05GSUdfU09VUkNFKSBcCisJQHJtIC1mICRAICRALnN0ZXAxCisJJChIT1NUX09VVF9FWEVDVVRBQkxFUykvY29udl9saW5rZXJfY29uZmlnIHByb3RvIC0tZm9yY2UgLXMgJChQUklWQVRFX1NZU1RFTV9MSU5LRVJfQ09ORklHX1NPVVJDRSkgLW8gJEAuc3RlcDEKKwkkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9jb252X2xpbmtlcl9jb25maWcgc3lzdGVtcHJvdmlkZSAtLXNvdXJjZSAkQC5zdGVwMSBcCiAJCS0tb3V0cHV0ICRAIC0tdmFsdWUgIiQoU1RVQl9MSUJSQVJJRVMpIiAtLXN5c3RlbSAiJChUQVJHRVRfT1VUKSIKIAkkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9jb252X2xpbmtlcl9jb25maWcgYXBwZW5kIC0tc291cmNlICRAIC0tb3V0cHV0ICRAIC0ta2V5IHJlcXVpcmVMaWJzIFwKIAkJLS12YWx1ZSAiJChmb3JlYWNoIGxpYiwkKExMTkRLX01PVkVEX1RPX0FQRVhfTElCUkFSSUVTKSwgJChsaWIpLnNvKSIKKwkkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9jb252X2xpbmtlcl9jb25maWcgYXBwZW5kIC0tc291cmNlICRAIC0tb3V0cHV0ICRAIC0ta2V5IHByb3ZpZGVMaWJzIFwKKwkJLS12YWx1ZSAiJChmb3JlYWNoIGxpYiwkKFBST0RVQ1RfRVhUUkFfU1RVQl9MSUJSQVJJRVMpLCAkKGxpYikuc28pIgorCXJtIC1mICRALnN0ZXAxCiAKICQoY2FsbCBkZWNsYXJlLTFwLXRhcmdldCwkKFNZU1RFTV9MSU5LRVJfQ09ORklHKSwpCiAkKGNhbGwgZGVjbGFyZS1saWNlbnNlLWRlcHMsJChTWVNURU1fTElOS0VSX0NPTkZJRyksJChJTlRFUk5BTF9TWVNURU1JTUFHRV9GSUxFUykgJChTWVNURU1fTElOS0VSX0NPTkZJR19TT1VSQ0UpKQpAQCAtMzU2MywxNCArMzU1MCwyNCBAQAogZmlsZV9saXN0X2RpZmYgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZmlsZV9saXN0X2RpZmYkKEhPU1RfRVhFQ1VUQUJMRV9TVUZGSVgpCiBzeXN0ZW1fZmlsZV9kaWZmX3RpbWVzdGFtcCA6PSAkKHN5c3RlbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfZGlmZi50aW1lc3RhbXAKIAorIyBUaGUgYnVpbGQgY29uZmlndXJhdGlvbiB0byBidWlsZCB0aGUgUkVMIHZlcnNpb24gbWF5IGhhdmUgbW9yZSBmaWxlcyB0byBhbGxvdy4KKyMgVXNlIGFsbG93bGlzdF9uZXh0IGluIGFkZGl0aW9uIHRvIHRoZSBhbGxvd2xpc3QgaW4gdGhpcyBjYXNlLgorc3lzdGVtX2ZpbGVfZGlmZl9hbGxvd2xpc3RfbmV4dCA6PQoraWZlcSAoUkVMLCQoUExBVEZPUk1fVkVSU0lPTl9DT0RFTkFNRSkpCitzeXN0ZW1fZmlsZV9kaWZmX2FsbG93bGlzdF9uZXh0IDo9ICQoQUxMX01PRFVMRVMuc3lzdGVtX2ltYWdlX2RpZmZfYWxsb3dsaXN0X25leHQuSU5TVEFMTEVEKQorJChzeXN0ZW1fZmlsZV9kaWZmX3RpbWVzdGFtcCk6IFBSSVZBVEVfQUxMT1dMSVNUX05FWFQgOj0gJChzeXN0ZW1fZmlsZV9kaWZmX2FsbG93bGlzdF9uZXh0KQorZW5kaWYKICQoc3lzdGVtX2ZpbGVfZGlmZl90aW1lc3RhbXApOiBcCiAJICAgICQoc3lzdGVtaW1hZ2VfaW50ZXJtZWRpYXRlcykvZmlsZV9saXN0LnR4dCBcCiAJICAgICQoQUxMX01PRFVMRVMuJChQUk9EVUNUX1NPT05HX0RFRklORURfU1lTVEVNX0lNQUdFKS5GSUxFU1lTVEVNX0ZJTEVMSVNUKSBcCiAJICAgICQoQUxMX01PRFVMRVMuc3lzdGVtX2ltYWdlX2RpZmZfYWxsb3dsaXN0LklOU1RBTExFRCkgXAorCSAgICAkKHN5c3RlbV9maWxlX2RpZmZfYWxsb3dsaXN0X25leHQpIFwKIAkgICAgJChmaWxlX2xpc3RfZGlmZikKIAkkKGZpbGVfbGlzdF9kaWZmKSAkKHN5c3RlbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQgXAogCSAgJChBTExfTU9EVUxFUy4kKFBST0RVQ1RfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UpLkZJTEVTWVNURU1fRklMRUxJU1QpIFwKLQkgICQoQUxMX01PRFVMRVMuc3lzdGVtX2ltYWdlX2RpZmZfYWxsb3dsaXN0LklOU1RBTExFRCkgJChQUk9EVUNUX1NPT05HX0RFRklORURfU1lTVEVNX0lNQUdFKQorCSAgJChQUk9EVUNUX1NPT05HX0RFRklORURfU1lTVEVNX0lNQUdFKSBcCisJICAtLWFsbG93bGlzdHMgJChBTExfTU9EVUxFUy5zeXN0ZW1faW1hZ2VfZGlmZl9hbGxvd2xpc3QuSU5TVEFMTEVEKSBcCisJICAkKFBSSVZBVEVfQUxMT1dMSVNUX05FWFQpCiAJdG91Y2ggJEAKIAogJChCVUlMVF9TWVNURU1JTUFHRSk6ICQoc3lzdGVtX2ZpbGVfZGlmZl90aW1lc3RhbXApCkBAIC0zNTg4LDEwICszNTg1LDkgQEAKIGlmZXEgKCQoUFJPRFVDVF9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSksKQogJChlcnJvciBQUk9EVUNUX1NPT05HX0RFRklORURfU1lTVEVNX0lNQUdFIG11c3QgYmUgc2V0IGlmIFVTRV9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSBpcyB0cnVlKQogZW5kaWYKLXNvb25nX2RlZmluZWRfc3lzdGVtX2ltYWdlIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsRVRDLCQoUFJPRFVDVF9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSkpLyQoUFJPRFVDVF9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSkKLSQoQlVJTFRfU1lTVEVNSU1BR0UpOiAkKElOU1RBTExFRF9GSUxFU19GSUxFKSAkKHN5c3RlbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQgJChzb29uZ19kZWZpbmVkX3N5c3RlbV9pbWFnZSkKLSQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwgJChzb29uZ19kZWZpbmVkX3N5c3RlbV9pbWFnZSksICQoQlVJTFRfU1lTVEVNSU1BR0UpKSkKLXNvb25nX2RlZmluZWRfc3lzdGVtX2ltYWdlIDo9CitTT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRV9CQVNFIDo9ICQoZGlyICQoQUxMX01PRFVMRVMuJChQUk9EVUNUX1NPT05HX0RFRklORURfU1lTVEVNX0lNQUdFKS5GSUxFU1lTVEVNX0ZJTEVMSVNUKSkKKyQoQlVJTFRfU1lTVEVNSU1BR0UpOiAkKEZVTExfU1lTVEVNSU1BR0VfREVQUykgJChJTlNUQUxMRURfRklMRVNfRklMRSkgJChzeXN0ZW1pbWFnZV9pbnRlcm1lZGlhdGVzKS9maWxlX2xpc3QudHh0ICQoU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0VfUEFUSCkKKyQoZXZhbCAkKGNhbGwgY29weS1vbmUtZmlsZSwgJChTT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRV9QQVRIKSwgJChCVUlMVF9TWVNURU1JTUFHRSkpKQogZWxzZQogJChCVUlMVF9TWVNURU1JTUFHRSk6ICQoRlVMTF9TWVNURU1JTUFHRV9ERVBTKSAkKElOU1RBTExFRF9GSUxFU19GSUxFKSAkKHN5c3RlbWltYWdlX2ludGVybWVkaWF0ZXMpL2ZpbGVfbGlzdC50eHQKIAkkKGNhbGwgYnVpbGQtc3lzdGVtaW1hZ2UtdGFyZ2V0LCRAKQpAQCAtMzk5Niw2ICszOTkyLDIxIEBACiAgICAgJChmaWx0ZXIgJChUQVJHRVRfT1VUX1BST0RVQ1QpLyUsXAogICAgICAgJChBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUykpCiAKKyMgSW5zdGFsbCBwcm9kdWN0L2V0Yy9saW5rZXIuY29uZmlnLnBiIHdpdGggUFJPRFVDVF9QUk9EVUNUX0xJTktFUl9DT05GSUdfRlJBR01FTlRTCitwcm9kdWN0X2xpbmtlcl9jb25maWdfZmlsZSA6PSAkKFRBUkdFVF9PVVRfUFJPRFVDVCkvZXRjL2xpbmtlci5jb25maWcucGIKKyQocHJvZHVjdF9saW5rZXJfY29uZmlnX2ZpbGUpOiBwcml2YXRlX2xpbmtlcl9jb25maWdfZnJhZ21lbnRzIDo9ICQoUFJPRFVDVF9QUk9EVUNUX0xJTktFUl9DT05GSUdfRlJBR01FTlRTKQorJChwcm9kdWN0X2xpbmtlcl9jb25maWdfZmlsZSk6ICQoSU5URVJOQUxfUFJPRFVDVElNQUdFX0ZJTEVTKSB8ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2NvbnZfbGlua2VyX2NvbmZpZworCUBlY2hvIENyZWF0aW5nIGxpbmtlciBjb25maWc6ICRACisJQG1rZGlyIC1wICQoZGlyICRAKQorCUBybSAtZiAkQAorCSQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2NvbnZfbGlua2VyX2NvbmZpZyBwcm90byBcCisJCS0tc291cmNlICQoY2FsbCBub3JtYWxpemUtcGF0aC1saXN0LCQocHJpdmF0ZV9saW5rZXJfY29uZmlnX2ZyYWdtZW50cykpIFwKKwkJLS1vdXRwdXQgJEAKKyQoY2FsbCBkZWZpbmUgZGVjbGFyZS0xcC10YXJnZXQsJChwcm9kdWN0X2xpbmtlcl9jb25maWdfZmlsZSksKQorSU5URVJOQUxfUFJPRFVDVElNQUdFX0ZJTEVTICs9ICQocHJvZHVjdF9saW5rZXJfY29uZmlnX2ZpbGUpCitBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSAkKHByb2R1Y3RfbGlua2VyX2NvbmZpZ19maWxlKQorCisKIElOU1RBTExFRF9GSUxFU19GSUxFX1BST0RVQ1QgOj0gJChQUk9EVUNUX09VVCkvaW5zdGFsbGVkLWZpbGVzLXByb2R1Y3QudHh0CiBJTlNUQUxMRURfRklMRVNfSlNPTl9QUk9EVUNUIDo9ICQoSU5TVEFMTEVEX0ZJTEVTX0ZJTEVfUFJPRFVDVDoudHh0PS5qc29uKQogJChJTlNUQUxMRURfRklMRVNfRklMRV9QUk9EVUNUKTogLktBVElfSU1QTElDSVRfT1VUUFVUUyA6PSAkKElOU1RBTExFRF9GSUxFU19KU09OX1BST0RVQ1QpCkBAIC00NDM3LDYgKzQ0NDgsMjUgQEAKIElOVEVSTkFMX1BWTUZXX0VNQkVEREVEX0FWQktFWSA6PSAkKGNhbGwgbW9kdWxlLXRhcmdldC1idWlsdC1maWxlcyxwdm1md19lbWJlZGRlZF9rZXlfcHViX2JpbikKIElOVEVSTkFMX1BWTUZXX1NZTUJPTCA6PSAkKFRBUkdFVF9PVVRfRVhFQ1VUQUJMRVNfVU5TVFJJUFBFRCkvcHZtZncKIAorIyBJZiBwdm1mdyB0YXJnZXQgaXMgbm90IGF2YWlsYWJsZSBhbmQgdGhlcmUgaXMgYSBwcmVidWlsdCBhdmFpbGFibGUgdXNlIHByZWJ1aWx0CisjIE5PVEU6IFRoaXMgaXMgb25seSBhIHRlbXBvcmFyeSBmZWF0dXJlIGZvciB4ODZfNjQgYW5kIGlzIG5vdCBtZWFudCB0byBiZSBzdXBwb3J0ZWQgZm9yIGxvbmcuCisjIFRPRE8oYi8zOTEzMzM0MTMpOiBEb24ndCBhbGxvdyB1c2Ugb2YgcHZtZncgcHJlYnVpbHRzIGFzIHNvb24gYXMgaXQgaXMgcG9zc2libGUKK2lmZXEgKCQoSU5URVJOQUxfUFZNRldJTUFHRV9GSUxFUyksKQoraWZuZXEgKCQoUFJPRFVDVF9QVk1GV19JTUFHRV9QUkVCVUlMVCksKQorSU5URVJOQUxfUFZNRldJTUFHRV9GSUxFUyA6PSAkKGNhbGwgbW9kdWxlLXRhcmdldC1idWlsdC1maWxlcywkKFBST0RVQ1RfUFZNRldfSU1BR0VfUFJFQlVJTFQpKQorSU5URVJOQUxfUFZNRldfU1lNQk9MIDo9CisKK2lmbmVxICgkKFBST0RVQ1RfUFZNRldfQklOX1BSRUJVSUxUKSwpCitJTlNUQUxMRURfUFZNRldfQklOQVJZX1RBUkdFVCA6PSAkKGNhbGwgbW9kdWxlLXRhcmdldC1idWlsdC1maWxlcywkKFBST0RVQ1RfUFZNRldfQklOX1BSRUJVSUxUKSkKK2VuZGlmICMgUFJPRFVDVF9QVk1GV19CSU5fUFJFQlVJTFQKKworaWZuZXEgKCQoUFJPRFVDVF9QVk1GV19FTUJFRERFRF9BVkJLRVlfUFJFQlVJTFQpLCkKK0lOVEVSTkFMX1BWTUZXX0VNQkVEREVEX0FWQktFWSA6PSAkKGNhbGwgbW9kdWxlLXRhcmdldC1idWlsdC1maWxlcywkKFBST0RVQ1RfUFZNRldfRU1CRURERURfQVZCS0VZX1BSRUJVSUxUKSkKK2VuZGlmICMgUFJPRFVDVF9QVk1GV19FTUJFRERFRF9BVkJLRVlfUFJFQlVJTFQKKworZW5kaWYgIyBQUk9EVUNUX1BWTUZXX0lNQUdFX1BSRUJVSUxUCitlbmRpZiAjIElOVEVSTkFMX1BWTUZXSU1BR0VfRklMRVMKKwogJChjYWxsIGRlY2xhcmUtMXAtY29udGFpbmVyLCQoSU5TVEFMTEVEX1BWTUZXSU1BR0VfVEFSR0VUKSwpCiAkKGNhbGwgZGVjbGFyZS1jb250YWluZXItbGljZW5zZS1kZXBzLCQoSU5TVEFMTEVEX1BWTUZXSU1BR0VfVEFSR0VUKSwkKElOVEVSTkFMX1BWTUZXSU1BR0VfRklMRVMpLCQoUFJPRFVDVF9PVVQpLzovKQogCkBAIC01MDA3LDYgKzUwMzcsMTAgQEAKIAkgICAgJChmb3JlYWNoIGltYWdlLCQoQk9BUkRfQVZCXyQoY2FsbCB0by11cHBlciwkKDEpKSksIFwKIAkgICAgICAgIC0taW5jbHVkZV9kZXNjcmlwdG9yc19mcm9tX2ltYWdlICQoY2FsbCBpbWFnZXMtZm9yLXBhcnRpdGlvbnMsJChpbWFnZSkpKSBcCiAJICAgIC0tb3V0cHV0ICRACisgICAgICAjIGxpYmF2YiBleHBlY3RzIHRvIGJlIGFibGUgdG8gcmVhZCB0aGUgbWF4aW11bSB2Ym1ldGEgc2l6ZSwgc28gd2UgbXVzdCBwcm92aWRlIGEgcGFydGl0aW9uCisgICAgICAjIHdoaWNoIG1hdGNoZXMgdGhpcyBvciB0aGUgcmVhZCB3aWxsIGZhaWwuCisgICAgICAjIFNlZSBleHRlcm5hbC9hdmIvbGliYXZiL2F2Yl9zbG90X3ZlcmlmeS5jI1ZCTUVUQV9NQVhfU0laRQorICAgICAgdHJ1bmNhdGUgLXMgNjU1MzYgJEAKIGVuZGVmCiAKIGlmZGVmIEJVSUxESU5HX1NZU1RFTV9JTUFHRQpAQCAtNTA2NSw2ICs1MDk5LDEwIEBACiAgICAgJChQUklWQVRFX0FWQl9WQk1FVEFfU0lHTklOR19BUkdTKSBcCiAgICAgJChCT0FSRF9BVkJfTUFLRV9WQk1FVEFfSU1BR0VfQVJHUykgXAogICAgIC0tb3V0cHV0ICRACisgICAgIyBsaWJhdmIgZXhwZWN0cyB0byBiZSBhYmxlIHRvIHJlYWQgdGhlIG1heGltdW0gdmJtZXRhIHNpemUsIHNvIHdlIG11c3QgcHJvdmlkZSBhIHBhcnRpdGlvbgorICAgICMgd2hpY2ggbWF0Y2hlcyB0aGlzIG9yIHRoZSByZWFkIHdpbGwgZmFpbC4KKyAgICAjIFNlZSBleHRlcm5hbC9hdmIvbGliYXZiL2F2Yl9zbG90X3ZlcmlmeS5jI1ZCTUVUQV9NQVhfU0laRQorICAgIHRydW5jYXRlIC1zIDY1NTM2ICRACiAgICQoaGlkZSkgcm0gLXJmICQoQVZCX0NIQUlOX0tFWV9ESVIpCiBlbmRlZgogCkBAIC01MTMyLDYgKzUxNzAsNyBAQAogIyBSdW4gYXBleF9zZXBvbGljeV90ZXN0cyBmb3IgYWxsIGluc3RhbGxlZCBBUEVYZXMKIAogaWZlcSAoLCQoVEFSR0VUX0JVSUxEX1VOQlVORExFRCkpCitpZm5lcSAoLCQoZmlsdGVyIGV4dDQgZXJvZnMsJChQUk9EVUNUX0RFRkFVTFRfQVBFWF9QQVlMT0FEX1RZUEUpKSkKIGludGVybWVkaWF0ZSA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyxhcGV4X3NlcG9saWN5X3Rlc3RzKQogYXBleF9kaXJzIDo9IFwKICAgJChUQVJHRVRfT1VUKS9hcGV4LyUgXApAQCAtNTE0OCwxMSArNTE4NywxMCBAQAogZGVmaW5lIF9ydW5fYXBleF9zZXBvbGljeV90ZXN0cwogJDI6ICQxIFwKICAgICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hcGV4X3NlcG9saWN5X3Rlc3RzIFwKLSAgICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9kZWFwZXhlciBcCi0gICAgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvZGVidWdmc19zdGF0aWMKKyAgICAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hcGV4LWxzCiAJQHJtIC1yZiAkJEAKIAlAbWtkaXIgLXAgJChkaXIgJCRAKQotCSQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2FwZXhfc2Vwb2xpY3lfdGVzdHMgLS1hbGwgLWYgPCgkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9kZWFwZXhlciAtLWRlYnVnZnNfcGF0aCAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9kZWJ1Z2ZzX3N0YXRpYyBsaXN0IC1aICQkPCkKKwkkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hcGV4X3NlcG9saWN5X3Rlc3RzIC0tYWxsIC1mIDwoJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYXBleC1scyAtWiAkJDwpCiAJQHRvdWNoICQkQAogZW5kZWYKIApAQCAtNTE3MSw2ICs1MjA5LDcgQEAKIAogYXBleF9maWxlcyA6PQogaW50ZXJtZWRpYXRlIDo9CitlbmRpZiAjIFBST0RVQ1RfREVGQVVMVF9BUEVYX1BBWUxPQURfVFlQRQogZW5kaWYgIyBUQVJHRVRfQlVJTERfVU5CVU5ETEVECiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTUyNjYsNyArNTMwNSw3IEBACiAJICAtLWRpcm1hcCAvc3lzdGVtX2V4dDokKFRBUkdFVF9PVVRfU1lTVEVNX0VYVCkgXAogCSAgLS1kaXJtYXAgL3Byb2R1Y3Q6JChUQVJHRVRfT1VUX1BST0RVQ1QpIFwKIAkgIC0tZGlybWFwIC9hcGV4OiQoQVBFWF9PVVQpIFwKLQkgICQoVklOVEZfRlJBTUVXT1JLX01BTklGRVNUX0ZST1pFTl9ESVIpID4gJEAgMj4mMSApIHx8ICggY2F0ICRAICYmIGV4aXQgMSApCisJICBzeXN0ZW0vbGliaGlkbC92aW50ZmRhdGEvZnJvemVuID4gJEAgMj4mMSApIHx8ICggY2F0ICRAICYmIGV4aXQgMSApCiAKICQoY2FsbCBkZWNsYXJlLTFwLXRhcmdldCwkKHZpbnRmZm1fbG9nKSkKIApAQCAtNTQwNSw3ICs1NDQ0LDggQEAKIGlmbmVxICgsJChCVUlMVF9LRVJORUxfVkVSU0lPTl9GSUxFKSkKICQoQlVJTFRfS0VSTkVMX1ZFUlNJT05fRklMRV9GT1JfVUZGRF9HQyk6ICQoQlVJTFRfS0VSTkVMX1ZFUlNJT05fRklMRSkKICQoQlVJTFRfS0VSTkVMX1ZFUlNJT05fRklMRV9GT1JfVUZGRF9HQyk6Ci0JY3AgJChCVUlMVF9LRVJORUxfVkVSU0lPTl9GSUxFKSAkKEJVSUxUX0tFUk5FTF9WRVJTSU9OX0ZJTEVfRk9SX1VGRkRfR0MpCisJaWYgISBjbXAgLXMgJChCVUlMVF9LRVJORUxfVkVSU0lPTl9GSUxFKSAkQCA7IHRoZW4gY3AgJChCVUlMVF9LRVJORUxfVkVSU0lPTl9GSUxFKSAkQDsgZmkKKy5LQVRJX1JFU1RBVDogJChCVUlMVF9LRVJORUxfVkVSU0lPTl9GSUxFX0ZPUl9VRkZEX0dDKQogZWxzZQogIyBXZSBtYWtlIHRoaXMgYSB3YXJuaW5nIHJhdGhlciB0aGFuIGFuIGVycm9yIHRvIGF2b2lkIGJyZWFraW5nIHRvbyBtYW55IGJ1aWxkcy4gV2hlbiBpdCBoYXBwZW5zLAogIyB3ZSB1c2UgYSBwbGFjZWhvbGRlciBhcyB0aGUga2VybmVsIHZlcnNpb24sIHdoaWNoIGlzIGNvbnN1bWVkIGJ5IHVmZmRfZ2NfdXRpbHMucHkuCkBAIC01NjE0LDcgKzU2NTQsOSBAQAogICAgICAgZW5kaWYKICAgICBlbmRpZiAjIElOU1RBTExFRF9CT09USU1BR0VfVEFSR0VUID09ICIiCiAgICAgaWZlcSAoJChyZWNvdmVyeV9mc3RhYiksKQotICAgICAgYnVpbGRfb3RhX3BhY2thZ2UgOj0gZmFsc2UKKyAgICAgIGlmZXEgKCQoZmlsdGVyICQoVEFSR0VUX1JFQ09WRVJZX1JPT1RfT1VUKS9zeXN0ZW0vZXRjL3JlY292ZXJ5LmZzdGFiLCQoSU5URVJOQUxfUkVDT1ZFUllJTUFHRV9GSUxFUykpLCkKKyAgICAgICAgYnVpbGRfb3RhX3BhY2thZ2UgOj0gZmFsc2UKKyAgICAgIGVuZGlmCiAgICAgZW5kaWYKICAgZW5kaWYgIyBQUk9EVUNUX0JVSUxEX0dFTkVSSUNfT1RBX1BBQ0tBR0UKIApAQCAtNTYzOSw2ICs1NjgxLDcgQEAKICAgYnJvdGxpIFwKICAgYnNkaWZmIFwKICAgYnVpbGRfaW1hZ2UgXAorICBidWlsZF9taXhlZF9rZXJuZWxzX3JhbWRpc2tfaG9zdCBcCiAgIGJ1aWxkX3N1cGVyX2ltYWdlIFwKICAgYnVpbGRfdmVyaXR5X21ldGFkYXRhIFwKICAgYnVpbGRfdmVyaXR5X3RyZWUgXApAQCAtNjEzNCw2ICs2MTc3LDkgQEAKICQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6IHppcF9yb290IDo9ICQoaW50ZXJtZWRpYXRlcykvJChuYW1lKQogJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogaW50ZXJtZWRpYXRlcyA6PSAkKGludGVybWVkaWF0ZXMpCiAKK2lmbmVxICgkKFNPT05HX0RFRklORURfU1lTVEVNX0lNQUdFX1BBVEgpLCkKKyAgJChCVUlMVF9UQVJHRVRfRklMRVNfRElSKTogJChTT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRV9QQVRIKQorZW5kaWYKIAogIyAkKDEpOiBEaXJlY3RvcnkgdG8gY29weQogIyAkKDIpOiBMb2NhdGlvbiB0byBjb3B5IGl0IHRvCkBAIC02MTQ3LDExICs2MTkzLDE0IEBACiAKIGJ1aWx0X290YV90b29scyA6PQogCisKICMgV2UgY2FuJ3QgYnVpbGQgc3RhdGljIGV4ZWN1dGFibGVzIHdoZW4gU0FOSVRJWkVfVEFSR0VUPWFkZHJlc3MKIGlmZXEgKCwkKGZpbHRlciBhZGRyZXNzLCAkKFNBTklUSVpFX1RBUkdFVCkpKQoraWZlcSAoZmFsc2UsJChBQl9PVEFfVVBEQVRFUikpCiBidWlsdF9vdGFfdG9vbHMgKz0gXAogICAgICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsRVhFQ1VUQUJMRVMsdXBkYXRlcikvdXBkYXRlcgogZW5kaWYKK2VuZGlmCiAKICQoQlVJTFRfVEFSR0VUX0ZJTEVTX0RJUik6IFBSSVZBVEVfT1RBX1RPT0xTIDo9ICQoYnVpbHRfb3RhX3Rvb2xzKQogCkBAIC02MzQ4LDYgKzYzOTcsMTAgQEAKICAgZW5kaWYKIGVuZGlmCiAKK2lmZGVmIEJVSUxESU5HX1ZFTkRPUl9LRVJORUxfQk9PVF9JTUFHRQorICAkKEJVSUxUX1RBUkdFVF9GSUxFU19ESVIpOiAkKElOVEVSTkFMX1ZFTkRPUl9LRVJORUxfUkFNRElTS19GSUxFUykKK2VuZGlmCisKIGlmZGVmIEJVSUxESU5HX1JFQ09WRVJZX0lNQUdFCiAgICMgVE9ETyhiLzMwNDE0NDI4KTogQ2FuJ3QgZGVwZW5kIG9uIElOVEVSTkFMX1JFQ09WRVJZSU1BR0VfRklMRVMgYWxvbmUgbGlrZSBvdGhlcgogICAjIEJVSUxUX1RBUkdFVF9GSUxFU19QQUNLQUdFIGRlcGVuZGVuY2llcyBiZWNhdXNlIGN1cnJlbnRseSB0aGVyZSdyZSBjcC9yc3luYy9ybQpAQCAtNjYyMCw4ICs2NjczLDEzIEBACiBlbmRpZiAjIElOU1RBTExFRF9WRU5ET1JfQk9PVElNQUdFX1RBUkdFVAogaWZkZWYgQlVJTERJTkdfU1lTVEVNX0lNQUdFCiAJQCMgQ29udGVudHMgb2YgdGhlIHN5c3RlbSBpbWFnZQoraWZuZXEgKCQoU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0VfUEFUSCksKQorCSQoaGlkZSkgJChjYWxsIHBhY2thZ2VfZmlsZXMtY29weS1yb290LCBcCisJICAgICQoU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0VfQkFTRSkvc3lzdGVtL3N5c3RlbSwkKHppcF9yb290KS9TWVNURU0pCitlbHNlCiAJJChoaWRlKSAkKGNhbGwgcGFja2FnZV9maWxlcy1jb3B5LXJvb3QsIFwKIAkgICAgJChTWVNURU1JTUFHRV9TT1VSQ0VfRElSKSwkKHppcF9yb290KS9TWVNURU0pCitlbmRpZgogZWxzZSBpZmRlZiBJTlNUQUxMRURfQlVJTERfUFJPUF9UQVJHRVQKIAlAIyBDb3B5IHRoZSBzeXN0ZW0gYnVpbGQucHJvcCBldmVuIGlmIG5vdCBidWlsZGluZyBhIHN5c3RlbSBpbWFnZQogCUAjIGJlY2F1c2UgYWRkX2ltZ190b190YXJnZXRfZmlsZXMgbWF5IG5lZWQgaXQgdG8gYnVpbGQgb3RoZXIgcGFydGl0aW9uCkBAIC03MjUxLDI5ICs3MzA5LDYgQEAKICAgJChjYWxsIGRpc3QtZm9yLWdvYWxzLGRyb2lkY29yZS11bmJ1bmRsZWQgYXBwc19vbmx5LCQoTExWTV9DT1ZFUkFHRV9UT09MU19aSVApKQogZW5kaWYKIAotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBBIHppcCBvZiB0aGUgQW5kcm9pZCBBcHBzLiBOb3Qga2VlcGluZyBmdWxsIHBhdGggc28gdGhhdCB3ZSBkb24ndAotIyBpbmNsdWRlIHByb2R1Y3QgbmFtZXMgd2hlbiBkaXN0cmlidXRpbmcKLSMKLW5hbWUgOj0gJChUQVJHRVRfUFJPRFVDVCkKLWlmZXEgKCQoVEFSR0VUX0JVSUxEX1RZUEUpLGRlYnVnKQotICBuYW1lIDo9ICQobmFtZSlfZGVidWcKLWVuZGlmCi1uYW1lIDo9ICQobmFtZSktYXBwcwotCi1BUFBTX1pJUCA6PSAkKFBST0RVQ1RfT1VUKS8kKG5hbWUpLnppcAotJChBUFBTX1pJUCk6ICQoRlVMTF9TWVNURU1JTUFHRV9ERVBTKQotCUBlY2hvICJQYWNrYWdlIGFwcHM6ICRAIgotCSQoaGlkZSkgcm0gLXJmICRACi0JJChoaWRlKSBta2RpciAtcCAkKGRpciAkQCkKLQkkKGhpZGUpIGFwcHNfdG9femlwPWBmaW5kICQoVEFSR0VUX09VVF9BUFBTKSAkKFRBUkdFVF9PVVRfQVBQU19QUklWSUxFR0VEKSAtbWluZGVwdGggMiAtbWF4ZGVwdGggMyAtbmFtZSAiKi5hcGsiYDsgXAotCWlmIFsgLXogIiQkYXBwc190b196aXAiIF07IHRoZW4gXAotCSAgICBlY2hvICJObyBhcHBzIHRvIHppcCB1cC4gR2VuZXJhdGluZyBlbXB0eSBhcHBzIGFyY2hpdmUuIiA7IFwKLQkgICAgYT0kJChta3RlbXAgL3RtcC9YWFhYWFhYKSAmJiB0b3VjaCAkJGEgJiYgemlwICRAICQkYSAmJiB6aXAgLWQgJEAgJCRhOyBcCi0JZWxzZSBcCi0JICAgIHppcCAtcWpYICRAICQkYXBwc190b196aXA7IFwKLQlmaQotCiBpZmVxICh0cnVlLCQoRU1NQV9JTlNUUlVNRU5UKSkKICMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgQW4gYXJjaGl2ZSBvZiBjbGFzc2VzIGZvciB1c2UgaW4gZ2VuZXJhdGluZyBjb2RlLWNvdmVyYWdlIHJlcG9ydHMKQEAgLTc5MTUsNiArNzk1MCwxOCBAQAogCSQoSU5TVEFMTEVEX1VTRVJEQVRBSU1BR0VfVEFSR0VUKQogCiAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlc2t0b3AgZ2VuZXJhdGVkIGZpcm13YXJlIGZpbGVzeXN0ZW0uCitUQVJHRVRfUFJPRFVDVF9GV19JTUFHRV9QQUNLQUdFIDo9IHByZWJ1aWx0LSQoVEFSR0VUX1BST0RVQ1QpLWZpcm13YXJlLWltYWdlCitHRU5FUkFURURfRldfSU1BR0UgOj0gJChQUk9EVUNUX09VVCkvcHJvZHVjdC9ldGMvJChUQVJHRVRfUFJPRFVDVCktZmlybXdhcmUuaW1nCisKK2dlbmVyYXRlZF9md19pbWFnZV9mb3VuZCA6PSAkKHN0cmlwICQoZm9yZWFjaCBwcCwkKFBST0RVQ1RfUEFDS0FHRVMpLFwKKwkkKGlmICQoZmluZHN0cmluZyAkKFRBUkdFVF9QUk9EVUNUX0ZXX0lNQUdFX1BBQ0tBR0UpLCQocHApKSwkKHBwKSkpKQorCitpZm5lcSAoLCQoZ2VuZXJhdGVkX2Z3X2ltYWdlX2ZvdW5kKSkKKyQoY2FsbCBkaXN0LWZvci1nb2FscyxkaXN0X2ZpbGVzLCQoR0VORVJBVEVEX0ZXX0lNQUdFKSkKK2VuZGlmCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgRGVza3RvcCBwYWNrIGltYWdlIGhvb2suCiBpZm5lcSAoLCQoc3RyaXAgJChQQUNLX0RFU0tUT1BfRklMRVNZU1RFTV9JTUFHRVMpKSkKIFBBQ0tfSU1BR0VfVEFSR0VUIDo9ICQoUFJPRFVDVF9PVVQpL2FuZHJvaWQtZGVza3RvcF9pbWFnZS5iaW4KQEAgLTc5MzYsMTEgKzc5ODMsMTYgQEAKIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBEZXNrdG9wIHBhY2sgcmVjb3ZlcnkgaW1hZ2UgaG9vay4KLWlmbmVxICgsJChzdHJpcCAkKFBBQ0tfREVTS1RPUF9SRUNPVkVSWV9JTUFHRSkpKQoraWZlcSAoJChCT0FSRF9VU0VTX0RFU0tUT1BfUkVDT1ZFUllfSU1BR0UpLHRydWUpCiBQQUNLX1JFQ09WRVJZX0lNQUdFX1RBUkdFVCA6PSAkKFBST0RVQ1RfT1VUKS9hbmRyb2lkLWRlc2t0b3BfcmVjb3ZlcnlfaW1hZ2UuYmluCitQQUNLX1JFQ09WRVJZX0lNQUdFX0FSR1MgOj0gLS1ub2FyY2hpdmUgLS1yZWNvdmVyeQorCitpZm5lcSAoLCQoc3RyaXAgJChQQUNLX1JFQ09WRVJZX0lNQUdFX0VYUEVSSU1FTlRBTCkpKQorUEFDS19SRUNPVkVSWV9JTUFHRV9BUkdTICs9IC0tZXhwZXJpbWVudGFsCitlbmRpZiAjIFBBQ0tfUkVDT1ZFUllfSU1BR0VfRVhQRVJJTUVOVEFMCiAKICQoUEFDS19SRUNPVkVSWV9JTUFHRV9UQVJHRVQpOiAkKElNQUdFUykgJChQQUNLX0lNQUdFX1NDUklQVCkKLQkkKFBBQ0tfSU1BR0VfU0NSSVBUKSAtLW91dF9kaXIgJChQUk9EVUNUX09VVCkgLS1ub2FyY2hpdmUgLS1yZWNvdmVyeQorCSQoUEFDS19JTUFHRV9TQ1JJUFQpIC0tb3V0X2RpciAkKFBST0RVQ1RfT1VUKSAkKFBBQ0tfUkVDT1ZFUllfSU1BR0VfQVJHUykKIAogUEFDS0VEX1JFQ09WRVJZX0lNQUdFX0FSQ0hJVkVfVEFSR0VUIDo9ICQoUEFDS19SRUNPVkVSWV9JTUFHRV9UQVJHRVQpLmd6CiAKQEAgLTc5NTIsMTUgKzgwMDQsMjAgQEAKIC5QSE9OWTogcGFjay1yZWNvdmVyeS1pbWFnZQogcGFjay1yZWNvdmVyeS1pbWFnZTogJChQQUNLX1JFQ09WRVJZX0lNQUdFX1RBUkdFVCkKIAotZW5kaWYgIyBQQUNLX0RFU0tUT1BfUkVDT1ZFUllfSU1BR0UKK2VuZGlmICMgQk9BUkRfVVNFU19ERVNLVE9QX1JFQ09WRVJZX0lNQUdFCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgRGVza3RvcCBwYWNrIHVwZGF0ZSBpbWFnZSBob29rLgotaWZuZXEgKCwkKHN0cmlwICQoUEFDS19ERVNLVE9QX1VQREFURV9JTUFHRSkpKQoraWZlcSAoJChCT0FSRF9VU0VTX0RFU0tUT1BfVVBEQVRFX0lNQUdFKSx0cnVlKQogUEFDS19VUERBVEVfSU1BR0VfVEFSR0VUIDo9ICQoUFJPRFVDVF9PVVQpL2FuZHJvaWQtZGVza3RvcF91cGRhdGVfaW1hZ2UuYmluCitQQUNLX1VQREFURV9JTUFHRV9BUkdTIDo9IC0tbm9hcmNoaXZlIC0tdXBkYXRlCisKK2lmbmVxICgsJChzdHJpcCAkKFBBQ0tfVVBEQVRFX0lNQUdFX0VYUEVSSU1FTlRBTCkpKQorUEFDS19VUERBVEVfSU1BR0VfQVJHUyArPSAtLWV4cGVyaW1lbnRhbAorZW5kaWYgIyBQQUNLX1VQREFURV9JTUFHRV9FWFBFUklNRU5UQUwKIAogJChQQUNLX1VQREFURV9JTUFHRV9UQVJHRVQpOiAkKElNQUdFUykgJChQQUNLX0lNQUdFX1NDUklQVCkKLQkkKFBBQ0tfSU1BR0VfU0NSSVBUKSAtLW91dF9kaXIgJChQUk9EVUNUX09VVCkgLS1ub2FyY2hpdmUgLS11cGRhdGUKKwkkKFBBQ0tfSU1BR0VfU0NSSVBUKSAtLW91dF9kaXIgJChQUk9EVUNUX09VVCkgJChQQUNLX1VQREFURV9JTUFHRV9BUkdTKQogCiBQQUNLRURfVVBEQVRFX0lNQUdFX0FSQ0hJVkVfVEFSR0VUIDo9ICQoUEFDS19VUERBVEVfSU1BR0VfVEFSR0VUKS5negogCkBAIC03OTcyLDcgKzgwMjksNjkgQEAKIC5QSE9OWTogcGFjay11cGRhdGUtaW1hZ2UKIHBhY2stdXBkYXRlLWltYWdlOiAkKFBBQ0tfVVBEQVRFX0lNQUdFX1RBUkdFVCkKIAotZW5kaWYgIyBQQUNLX0RFU0tUT1BfVVBEQVRFX0lNQUdFCitlbmRpZiAjIEJPQVJEX1VTRVNfREVTS1RPUF9VUERBVEVfSU1BR0UKKworUEFDS19NSUdSQVRJT05fSU1BR0VfU0NSSVBUIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3BhY2tfbWlncmF0aW9uX2ltYWdlCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgRGVza3RvcCBwYWNrIG1pZ3JhdGlvbiBpbWFnZSBob29rLgoraWZlcSAoJChBTkRST0lEX0RFU0tUT1BfTUlHUkFUSU9OX0lNQUdFKSx0cnVlKQorUEFDS19NSUdSQVRJT05fSU1BR0VfVEFSR0VUIDo9ICQoUFJPRFVDVF9PVVQpL2FuZHJvaWQtZGVza3RvcF9taWdyYXRpb25faW1hZ2UuYmluCisKKyQoUEFDS19NSUdSQVRJT05fSU1BR0VfVEFSR0VUKTogJChJTUFHRVMpICQoUEFDS19NSUdSQVRJT05fSU1BR0VfU0NSSVBUKQorCSQoUEFDS19NSUdSQVRJT05fSU1BR0VfU0NSSVBUKSAtLW91dF9kaXIgJChQUk9EVUNUX09VVCkgLS1ub2FyY2hpdmUKKworUEFDS0VEX01JR1JBVElPTl9JTUFHRV9BUkNISVZFX1RBUkdFVCA6PSAkKFBBQ0tfTUlHUkFUSU9OX0lNQUdFX1RBUkdFVCkuZ3oKKworJChQQUNLRURfTUlHUkFUSU9OX0lNQUdFX0FSQ0hJVkVfVEFSR0VUKTogJChQQUNLX01JR1JBVElPTl9JTUFHRV9UQVJHRVQpIHwgJChHWklQKQorCSQoR1pJUCkgLWZrICQoUEFDS19NSUdSQVRJT05fSU1BR0VfVEFSR0VUKQorCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsZGlzdF9maWxlcywkKFBBQ0tFRF9NSUdSQVRJT05fSU1BR0VfQVJDSElWRV9UQVJHRVQpKQorCisuUEhPTlk6IHBhY2stbWlncmF0aW9uLWltYWdlCitwYWNrLW1pZ3JhdGlvbi1pbWFnZTogJChQQUNLX01JR1JBVElPTl9JTUFHRV9UQVJHRVQpCisKK2VuZGlmICMgQU5EUk9JRF9ERVNLVE9QX01JR1JBVElPTl9JTUFHRQorCitpZmRlZiBTT09OR19PTkxZX0FMTF9JTUFHRVNfWklQCisKK2FsbGltYWdlc19zb29uZ196aXBfYXJncyA6PQorYWxsaW1hZ2VzX2RlcHMgOj0KKworZGVmaW5lIGluY2x1ZGVfaW1hZ2UKKyQoaWYgJCgxKSwgXAorICAkKGV2YWwgYWxsaW1hZ2VzX3Nvb25nX3ppcF9hcmdzICs9IC1lICQobm90ZGlyICQoMSkpIC1mICQoMSkpIFwKKyAgJChldmFsIGFsbGltYWdlc19kZXBzICs9ICQoMSkpKQorZW5kZWYKKworJChjYWxsIGluY2x1ZGVfaW1hZ2UsJChJTlNUQUxMRURfU1VQRVJJTUFHRV9UQVJHRVQpKQorJChjYWxsIGluY2x1ZGVfaW1hZ2UsJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCkpCiskKGNhbGwgaW5jbHVkZV9pbWFnZSwkKElOU1RBTExFRF9JTklUX0JPT1RfSU1BR0VfVEFSR0VUKSkKKyQoY2FsbCBpbmNsdWRlX2ltYWdlLCQoSU5TVEFMTEVEX1ZFTkRPUl9CT09USU1BR0VfVEFSR0VUKSkKKyQoY2FsbCBpbmNsdWRlX2ltYWdlLCQoSU5TVEFMTEVEX1VTRVJEQVRBSU1BR0VfVEFSR0VUKSkKKyQoY2FsbCBpbmNsdWRlX2ltYWdlLCQoSU5TVEFMTEVEX1JFQ09WRVJZSU1BR0VfVEFSR0VUKSkKKyQoY2FsbCBpbmNsdWRlX2ltYWdlLCQoSU5TVEFMTEVEX1ZCTUVUQUlNQUdFX1RBUkdFVCkpCiskKGNhbGwgaW5jbHVkZV9pbWFnZSwkKElOU1RBTExFRF9WQk1FVEFfU1lTVEVNSU1BR0VfVEFSR0VUKSkKKyQoY2FsbCBpbmNsdWRlX2ltYWdlLCQoSU5TVEFMTEVEX1ZCTUVUQV9WRU5ET1JJTUFHRV9UQVJHRVQpKQorJChmb3JlYWNoIHBhcnRpdGlvbiwkKGNhbGwgdG8tdXBwZXIsJChCT0FSRF9BVkJfVkJNRVRBX0NVU1RPTV9QQVJUSVRJT05TKSksIFwKKyAgJChjYWxsIGluY2x1ZGVfaW1hZ2UsJChJTlNUQUxMRURfVkJNRVRBXyQocGFydGl0aW9uKUlNQUdFX1RBUkdFVCkpKQorCithbGxpbWFnZXNfemlwIDo9ICQoUFJPRFVDVF9PVVQpL2FsbF9pbWFnZXMuemlwCiskKGFsbGltYWdlc196aXApOiBQUklWQVRFX1NPT05HX1pJUF9BUkdVTUVOVFMgOj0gJChhbGxpbWFnZXNfc29vbmdfemlwX2FyZ3MpCiskKGFsbGltYWdlc196aXApOiAkKFNPT05HX1pJUCkgJChhbGxpbWFnZXNfZGVwcykKKwkkKFNPT05HX1pJUCkgLW8gJEAgJChQUklWQVRFX1NPT05HX1pJUF9BUkdVTUVOVFMpCisKKy5QSE9OWTogc29vbmdfb25seV9kaWZmX3Rlc3QKK3Nvb25nX29ubHlfZGlmZl90ZXN0OiBQUklWQVRFX0FMTElNQUdFU19aSVAgOj0gJChhbGxpbWFnZXNfemlwKQorc29vbmdfb25seV9kaWZmX3Rlc3Q6ICQoYWxsaW1hZ2VzX3ppcCkgJChTT09OR19PTkxZX0FMTF9JTUFHRVNfWklQKQorCWRpZmYgJChQUklWQVRFX0FMTElNQUdFU19aSVApICQoU09PTkdfT05MWV9BTExfSU1BR0VTX1pJUCkKKworYWxsaW1hZ2VzX3Nvb25nX3ppcF9hcmdzIDo9CithbGxpbWFnZXNfZGVwcyA6PQorYWxsaW1hZ2VzX3ppcCA6PQoraW5jbHVkZV9pbWFnZSA6PQorCitlbmRpZiAjIGlmZGVmIFNPT05HX09OTFlfQUxMX0lNQUdFU19aSVAKIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBPUyBMaWNlbnNpbmcKZGlmZiAtLWdpdCBhL2NvcmUvYW5kcm9pZF9zb29uZ19jb25maWdfdmFycy5tayBiL2NvcmUvYW5kcm9pZF9zb29uZ19jb25maWdfdmFycy5tawppbmRleCA0ODY2N2FjLi42YWVhNjgwIDEwMDY0NAotLS0gYS9jb3JlL2FuZHJvaWRfc29vbmdfY29uZmlnX3ZhcnMubWsKKysrIGIvY29yZS9hbmRyb2lkX3Nvb25nX2NvbmZpZ192YXJzLm1rCkBAIC0zMCwxMiArMzAsMzYgQEAKICQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsQU5EUk9JRCxCT0FSRF9VU0VTX1JFQ09WRVJZX0FTX0JPT1QsJChCT0FSRF9VU0VTX1JFQ09WRVJZX0FTX0JPT1QpKQogJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxBTkRST0lELEJPQVJEX01PVkVfR1NJX0FWQl9LRVlTX1RPX1ZFTkRPUl9CT09ULCQoQk9BUkRfTU9WRV9HU0lfQVZCX0tFWVNfVE9fVkVORE9SX0JPT1QpKQogJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyLEFORFJPSUQsQ0hFQ0tfREVWX1RZUEVfVklPTEFUSU9OUykKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsQU5EUk9JRCxIQVNfQk9BUkRfU1lTVEVNX0VYVF9QUkVCVUlMVF9ESVIsJChpZiAkKEJPQVJEX1NZU1RFTV9FWFRfUFJFQlVJTFRfRElSKSx0cnVlLGZhbHNlKSkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsQU5EUk9JRCxIQVNfQk9BUkRfUFJPRFVDVF9QUkVCVUlMVF9ESVIsJChpZiAkKEJPQVJEX1BST0RVQ1RfUFJFQlVJTFRfRElSKSx0cnVlLGZhbHNlKSkKICQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3ZhcixBTkRST0lELFBMQVRGT1JNX1NFUE9MSUNZX1ZFUlNJT04pCiAkKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXIsQU5EUk9JRCxQTEFURk9STV9TRVBPTElDWV9DT01QQVRfVkVSU0lPTlMpCiAkKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXIsQU5EUk9JRCxQUk9EVUNUX0lOU1RBTExfREVCVUdfUE9MSUNZX1RPX1NZU1RFTV9FWFQpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLEFORFJPSUQsUkVMRUFTRV9CT0FSRF9BUElfTEVWRUxfRlJPWkVOLCQoUkVMRUFTRV9CT0FSRF9BUElfTEVWRUxfRlJPWkVOKSkKICQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3ZhcixBTkRST0lELFRBUkdFVF9EWU5BTUlDXzY0XzMyX0RSTVNFUlZFUikKICQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3ZhcixBTkRST0lELFRBUkdFVF9FTkFCTEVfTUVESUFEUk1fNjQpCiAkKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXIsQU5EUk9JRCxUQVJHRVRfRFlOQU1JQ182NF8zMl9NRURJQVNFUlZFUikKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsQU5EUk9JRCxUQVJHRVRfU1VQUE9SVFNfMzJfQklUX0FQUFMsJChpZiAkKGZpbHRlciB0cnVlLCQoVEFSR0VUX1NVUFBPUlRTXzMyX0JJVF9BUFBTKSksdHJ1ZSxmYWxzZSkpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLEFORFJPSUQsVEFSR0VUX1NVUFBPUlRTXzY0X0JJVF9BUFBTLCQoaWYgJChmaWx0ZXIgdHJ1ZSwkKFRBUkdFVF9TVVBQT1JUU182NF9CSVRfQVBQUykpLHRydWUsZmFsc2UpKQorJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyLEFORFJPSUQsQk9BUkRfR0VORlNfTEFCRUxTX1ZFUlNJT04pCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLEFORFJPSUQsUFJPRFVDVF9GU1ZFUklUWV9HRU5FUkFURV9NRVRBREFUQSwkKGlmICQoZmlsdGVyIHRydWUsJChQUk9EVUNUX0ZTVkVSSVRZX0dFTkVSQVRFX01FVEFEQVRBKSksdHJ1ZSxmYWxzZSkpCisKKyQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3ZhcixBTkRST0lELEFERElUSU9OQUxfTTRERUZTLCQoaWYgJChCT0FSRF9TRVBPTElDWV9NNERFRlMpLCQoYWRkcHJlZml4IC1ELCQoQk9BUkRfU0VQT0xJQ1lfTTRERUZTKSkpKQorJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyLEFORFJPSUQsVEFSR0VUX0FERF9ST09UX0VYVFJBX1ZFTkRPUl9TWU1MSU5LUykKKworIyBGb3IgQlVJTERJTkdfR1NJCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLGdzaSxidWlsZGluZ19nc2ksJChpZiAkKGZpbHRlciB0cnVlLCQoQlVJTERJTkdfR1NJKSksdHJ1ZSxmYWxzZSkpCisKKyMgRm9yIGJvb3RhYmxlL3JlY292ZXJ5CitSRUNPVkVSWV9BUElfVkVSU0lPTiA6PSAzCitSRUNPVkVSWV9GU1RBQl9WRVJTSU9OIDo9IDIKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0LCByZWNvdmVyeSwgcmVjb3ZlcnlfYXBpX3ZlcnNpb24sICQoUkVDT1ZFUllfQVBJX1ZFUlNJT04pKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsIHJlY292ZXJ5LCByZWNvdmVyeV9mc3RhYl92ZXJzaW9uLCAkKFJFQ09WRVJZX0ZTVEFCX1ZFUlNJT04pKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCwgcmVjb3ZlcnkgLHRhcmdldF91c2VyaW1hZ2VzX3VzZV9mMmZzICwkKGlmICQoVEFSR0VUX1VTRVJJTUFHRVNfVVNFX0YyRlMpLHRydWUsZmFsc2UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCwgcmVjb3ZlcnkgLGhhc19ib2FyZF9jYWNoZWltYWdlX3BhcnRpdGlvbl9zaXplICwkKGlmICQoQk9BUkRfQ0FDSEVJTUFHRV9QQVJUSVRJT05fU0laRSksdHJ1ZSxmYWxzZSkpCitpZmRlZiBUQVJHRVRfUkVDT1ZFUllfVUlfTElCCisgICQoY2FsbCBzb29uZ19jb25maWdfc2V0X3N0cmluZ19saXN0LCByZWNvdmVyeSwgdGFyZ2V0X3JlY292ZXJ5X3VpX2xpYiwgJChUQVJHRVRfUkVDT1ZFUllfVUlfTElCKSkKK2VuZGlmCiAKICMgRm9yIFNhbml0aXplcnMKICQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsQU5EUk9JRCxBU0FOX0VOQUJMRUQsJChpZiAkKGZpbHRlciBhZGRyZXNzLCQoU0FOSVRJWkVfVEFSR0VUKSksdHJ1ZSxmYWxzZSkpCkBAIC02MCw2ICs4NCwxMyBAQAogIyBUaGUgZGVmYXVsdCB2YWx1ZSBvZiBBUlRfQlVJTERfSE9TVF9ERUJVRyBpcyB0cnVlCiAkKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLGFydF9tb2R1bGUsYXJ0X2J1aWxkX2hvc3RfZGVidWcsJChpZiAkKGZpbHRlciBmYWxzZSwkKEFSVF9CVUlMRF9IT1NUX0RFQlVHKSksZmFsc2UsdHJ1ZSkpCiAKKyMgRm9yIGNocmUKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsY2hyZSxjaHJlX2RhZW1vbl9scG1hX2VuYWJsZWQsJChpZiAkKGZpbHRlciB0cnVlLCQoQ0hSRV9EQUVNT05fTFBNQV9FTkFCTEVEKSksdHJ1ZSxmYWxzZSkpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLGNocmUsY2hyZV9kZWRpY2F0ZWRfdHJhbnNwb3J0X2NoYW5uZWxfZW5hYmxlZCwkKGlmICQoZmlsdGVyIHRydWUsJChDSFJFX0RFRElDQVRFRF9UUkFOU1BPUlRfQ0hBTk5FTF9FTkFCTEVEKSksdHJ1ZSxmYWxzZSkpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLGNocmUsY2hyZV9sb2dfYXRvbV9leHRlbnNpb25fZW5hYmxlZCwkKGlmICQoZmlsdGVyIHRydWUsJChDSFJFX0xPR19BVE9NX0VYVEVOU0lPTl9FTkFCTEVEKSksdHJ1ZSxmYWxzZSkpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLGNocmUsYnVpbGRpbmdfdmVuZG9yX2ltYWdlLCQoaWYgJChmaWx0ZXIgdHJ1ZSwkKEJVSUxESU5HX1ZFTkRPUl9JTUFHRSkpLHRydWUsZmFsc2UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxjaHJlLGNocmVfdXNmX2RhZW1vbl9lbmFibGVkLCQoaWYgJChmaWx0ZXIgdHJ1ZSwkKENIUkVfVVNGX0RBRU1PTl9FTkFCTEVEKSksdHJ1ZSxmYWxzZSkpCisKIGlmZGVmIFRBUkdFVF9CT0FSRF9BVVRPCiAgICQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3Zhcl92YWx1ZSwgQU5EUk9JRCwgdGFyZ2V0X2JvYXJkX2F1dG8sICQoVEFSR0VUX0JPQVJEX0FVVE8pKQogZW5kaWYKQEAgLTc3LDYgKzEwOCw5IEBACiBTWVNURU1VSV9PUFRJTUlaRV9KQVZBID89IHRydWUKICQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3ZhcixBTkRST0lELFNZU1RFTVVJX09QVElNSVpFX0pBVkEpCiAKKyMgRmxhZyBmb3IgZW5hYmxpbmcgY29tcG9zZSBmb3IgTGF1bmNoZXIuCiskKGNhbGwgc29vbmdfY29uZmlnX3NldCxBTkRST0lELHJlbGVhc2VfZW5hYmxlX2NvbXBvc2VfaW5fbGF1bmNoZXIsJChSRUxFQVNFX0VOQUJMRV9DT01QT1NFX0lOX0xBVU5DSEVSKSkKKwogaWZkZWYgUFJPRFVDVF9BVkZfRU5BQkxFRAogJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlLEFORFJPSUQsYXZmX2VuYWJsZWQsJChQUk9EVUNUX0FWRl9FTkFCTEVEKSkKIGVuZGlmCkBAIC05MSwxMiArMTI1LDE0IEBACiAkKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxhdmZfbWljcm9kcm9pZF9ndWVzdF9na2lfdmVyc2lvbiwkKFBST0RVQ1RfQVZGX01JQ1JPRFJPSURfR1VFU1RfR0tJX1ZFUlNJT04pKQogZW5kaWYKIAotaWZkZWYgUFJPRFVDVF9NRU1DR19WMl9GT1JDRV9FTkFCTEVECi0kKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxtZW1jZ192Ml9mb3JjZV9lbmFibGVkLCQoUFJPRFVDVF9NRU1DR19WMl9GT1JDRV9FTkFCTEVEKSkKK2lmZGVmIFRBUkdFVF9CT09UU18xNksKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsQU5EUk9JRCx0YXJnZXRfYm9vdHNfMTZrLCQoZmlsdGVyIHRydWUsJChUQVJHRVRfQk9PVFNfMTZLKSkpCiBlbmRpZgogCiBpZmRlZiBQUk9EVUNUX0NHUk9VUF9WMl9TWVNfQVBQX0lTT0xBVElPTl9FTkFCTEVECiAkKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxjZ3JvdXBfdjJfc3lzX2FwcF9pc29sYXRpb24sJChQUk9EVUNUX0NHUk9VUF9WMl9TWVNfQVBQX0lTT0xBVElPTl9FTkFCTEVEKSkKK2Vsc2UKKyQoY2FsbCBhZGRfc29vbmdfY29uZmlnX3Zhcl92YWx1ZSxBTkRST0lELGNncm91cF92Ml9zeXNfYXBwX2lzb2xhdGlvbix0cnVlKQogZW5kaWYKIAogJChjYWxsIGFkZF9zb29uZ19jb25maWdfdmFyX3ZhbHVlLEFORFJPSUQscmVsZWFzZV9hdmZfYWxsb3dfcHJlaW5zdGFsbGVkX2FwcHMsJChSRUxFQVNFX0FWRl9BTExPV19QUkVJTlNUQUxMRURfQVBQUykpCkBAIC0xNTksNiArMTk1LDE0IEBACiAkKGNhbGwgYWRkX3Nvb25nX2NvbmZpZ192YXJfdmFsdWUsQU5EUk9JRCxpbmNsdWRlX25vbnB1YmxpY19mcmFtZXdvcmtfYXBpLHRydWUpCiBlbmRpZgogCisjIEFkZCBuZmMgYnVpbGQgZmxhZyB0byBzb29uZworaWZuZXEgKCQoUkVMRUFTRV9QQUNLQUdFX05GQ19TVEFDSyksTmZjTmNpKQorICAkKGNhbGwgc29vbmdfY29uZmlnX3NldCxib290Y2xhc3NwYXRoLG5mY19hcGV4X2Jvb3RjbGFzc3BhdGhfZnJhZ21lbnQsdHJ1ZSkKK2VuZGlmCisKKyMgQWRkIHV3YiBidWlsZCBmbGFnIHRvIHNvb25nCiskKGNhbGwgc29vbmdfY29uZmlnX3NldCxib290Y2xhc3NwYXRoLHJlbGVhc2VfcmFuZ2luZ19zdGFjaywkKFJFTEVBU0VfUkFOR0lOR19TVEFDSykpCisKICMgQWRkIGNyYXNocmVjb3ZlcnkgYnVpbGQgZmxhZyB0byBzb29uZwogJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsQU5EUk9JRCxyZWxlYXNlX2NyYXNocmVjb3ZlcnlfbW9kdWxlLCQoUkVMRUFTRV9DUkFTSFJFQ09WRVJZX01PRFVMRSkpCiAjIEFkZCBjcmFzaHJlY292ZXJ5IGZpbGUgbW92ZSBmbGFncyB0byBzb29uZywgZm9yIGJvdGggcGxhdGZvcm0gYW5kIG1vZHVsZQpAQCAtMTcyLDEwICsyMTYsMjQgQEAKICMgUmVxdWlyZWQgYXMgcGxhdGZvcm1fYm9vdGNsYXNzcGF0aCBpcyB1c2luZyB0aGlzIG5hbWVzcGFjZQogJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsYm9vdGNsYXNzcGF0aCxyZWxlYXNlX2NyYXNocmVjb3ZlcnlfbW9kdWxlLCQoUkVMRUFTRV9DUkFTSFJFQ09WRVJZX01PRFVMRSkpCiAKKyMgQWRkIHVwcm9iZXN0YXRzIGJ1aWxkIGZsYWcgdG8gc29vbmcKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0LEFORFJPSUQscmVsZWFzZV91cHJvYmVzdGF0c19tb2R1bGUsJChSRUxFQVNFX1VQUk9CRVNUQVRTX01PRFVMRSkpCisjIEFkZCB1cHJvYmVzdGF0cyBmaWxlIG1vdmUgZmxhZ3MgdG8gc29vbmcsIGZvciBib3RoIHBsYXRmb3JtIGFuZCBtb2R1bGUKK2lmZXEgKHRydWUsJChSRUxFQVNFX1VQUk9CRVNUQVRTX0ZJTEVfTU9WRSkpCisgICQoY2FsbCBzb29uZ19jb25maWdfc2V0LEFORFJPSUQsdXByb2Jlc3RhdHNfZmlsZXNfaW5fbW9kdWxlLHRydWUpCisgICQoY2FsbCBzb29uZ19jb25maWdfc2V0LEFORFJPSUQsdXByb2Jlc3RhdHNfZmlsZXNfaW5fcGxhdGZvcm0sZmFsc2UpCitlbHNlCisgICQoY2FsbCBzb29uZ19jb25maWdfc2V0LEFORFJPSUQsdXByb2Jlc3RhdHNfZmlsZXNfaW5fbW9kdWxlLGZhbHNlKQorICAkKGNhbGwgc29vbmdfY29uZmlnX3NldCxBTkRST0lELHVwcm9iZXN0YXRzX2ZpbGVzX2luX3BsYXRmb3JtLHRydWUpCitlbmRpZgorCiAjIEVuYWJsZSBQcm9maWxpbmcgbW9kdWxlLiBBbHNvIHVzZWQgYnkgcGxhdGZvcm1fYm9vdGNsYXNzcGF0aC4KICQoY2FsbCBzb29uZ19jb25maWdfc2V0LEFORFJPSUQscmVsZWFzZV9wYWNrYWdlX3Byb2ZpbGluZ19tb2R1bGUsJChSRUxFQVNFX1BBQ0tBR0VfUFJPRklMSU5HX01PRFVMRSkpCiAkKGNhbGwgc29vbmdfY29uZmlnX3NldCxib290Y2xhc3NwYXRoLHJlbGVhc2VfcGFja2FnZV9wcm9maWxpbmdfbW9kdWxlLCQoUkVMRUFTRV9QQUNLQUdFX1BST0ZJTElOR19NT0RVTEUpKQogCisjIE1vdmUgVkNOIGZyb20gcGxhdGZvcm0gdG8gdGhlIFRldGhlcmluZyBtb2R1bGU7IHVzZWQgYnkgYm90aCBwbGF0Zm9ybSBhbmQgbW9kdWxlCiskKGNhbGwgc29vbmdfY29uZmlnX3NldCxBTkRST0lELGlzX3Zjbl9pbl9tYWlubGluZSwkKFJFTEVBU0VfTU9WRV9WQ05fVE9fTUFJTkxJTkUpKQorCiAjIEFkZCBwZXJmLXNldHVwIGJ1aWxkIGZsYWcgdG8gc29vbmcKICMgTm90ZTogQk9BUkRfUEVSRlNFVFVQX1NDUklQVCBsb2NhdGlvbiBtdXN0IGJlIHVuZGVyIHBsYXRmb3JtX3Rlc3Rpbmcvc2NyaXB0cy9wZXJmLXNldHVwLy4KIGlmZGVmIEJPQVJEX1BFUkZTRVRVUF9TQ1JJUFQKQEAgLTE4NCwzICsyNDIsOTEgQEAKIAogIyBBZGQgdGFyZ2V0X3VzZV9wYW5fZGlzcGxheSBmbGFnIGZvciBoYXJkd2FyZS9saWJoYXJkd2FyZTpncmFsbG9jLmRlZmF1bHQKICQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsZ3JhbGxvYyx0YXJnZXRfdXNlX3Bhbl9kaXNwbGF5LCQoaWYgJChmaWx0ZXIgdHJ1ZSwkKFRBUkdFVF9VU0VfUEFOX0RJU1BMQVkpKSx0cnVlLGZhbHNlKSkKKworIyBBZGQgdXNlX2NhbWVyYV92NGwyX2hhbCBmbGFnIGZvciBoYXJkd2FyZS9saWJoYXJkd2FyZS9tb2R1bGVzL2NhbWVyYS8zXzQ6Y2FtZXJhLnY0bDIKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsY2FtZXJhLHVzZV9jYW1lcmFfdjRsMl9oYWwsJChpZiAkKGZpbHRlciB0cnVlLCQoVVNFX0NBTUVSQV9WNEwyX0hBTCkpLHRydWUsZmFsc2UpKQorCisjIEFkZCBhdWRpb3NlcnZlcl9tdWx0aWxpYiBmbGFnIGZvciBoYXJkd2FyZS9pbnRlcmZhY2VzL3NvdW5kdHJpZ2dlci8yLjAvZGVmYXVsdDphbmRyb2lkLmhhcmR3YXJlLnNvdW5kdHJpZ2dlckAyLjAtaW1wbAoraWZuZXEgKCQoc3RyaXAgJChBVURJT1NFUlZFUl9NVUxUSUxJQikpLCkKKyAgJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsc291bmR0cmlnZ2VyLGF1ZGlvc2VydmVyX211bHRpbGliLCQoQVVESU9TRVJWRVJfTVVMVElMSUIpKQorZW5kaWYKKworIyBBZGQgc2ltX2NvdW50LCBkaXNhYmxlX3JpbGRfb2VtX2hvb2ssIGFuZCB1c2VfYW9zcF9yaWxkIGZsYWcgZm9yIHJpbCByZWxhdGVkIG1vZHVsZXMKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0LHJpbCxzaW1fY291bnQsJChTSU1fQ09VTlQpKQoraWZuZXEgKCQoRElTQUJMRV9SSUxEX09FTV9IT09LKSwgZmFsc2UpCisgICQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wscmlsLGRpc2FibGVfcmlsZF9vZW1faG9vayx0cnVlKQorZW5kaWYKK2lmbmVxICgkKEVOQUJMRV9WRU5ET1JfUklMX1NFUlZJQ0UpLCB0cnVlKQorICAkKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLHJpbCx1c2VfYW9zcF9yaWxkLHRydWUpCitlbmRpZgorCisjIEV4cG9ydCB0YXJnZXRfYm9hcmRfcGxhdGZvcm0gdG8gc29vbmcgZm9yIGhhcmR3YXJlL2dvb2dsZS9ncmFwaGljcy9jb21tb24vbGlibWVtdHJhY2s6bWVtdHJhY2suJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pCiskKGNhbGwgc29vbmdfY29uZmlnX3NldCxBTkRST0lELHRhcmdldF9ib2FyZF9wbGF0Zm9ybSwkKFRBUkdFVF9CT0FSRF9QTEFURk9STSkpCisKKyMgRXhwb3J0IGJvYXJkX3VzZXNfc2NhbGVyX20ybTFzaG90IGFuZCBib2FyZF91c2VzX2FsaWduX3Jlc3RyaWN0aW9uIHRvIHNvb25nIGZvciBoYXJkd2FyZS9nb29nbGUvZ3JhcGhpY3MvY29tbW9uL2xpYnNjYWxlcjpsaWJleHlub3NzY2FsZXIKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsZ29vZ2xlX2dyYXBoaWNzLGJvYXJkX3VzZXNfc2NhbGVyX20ybTFzaG90LCQoaWYgJChmaWx0ZXIgdHJ1ZSwkKEJPQVJEX1VTRVNfU0NBTEVSX00yTTFTSE9UKSksdHJ1ZSxmYWxzZSkpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLGdvb2dsZV9ncmFwaGljcyxib2FyZF91c2VzX2FsaWduX3Jlc3RyaWN0aW9uLCQoaWYgJChmaWx0ZXIgdHJ1ZSwkKEJPQVJEX1VTRVNfQUxJR05fUkVTVFJJQ1RJT04pKSx0cnVlLGZhbHNlKSkKKworIyBFeHBvcnQgcmVsYXRlZCB2YXJpYWJsZXMgdG8gc29vbmcgZm9yIGhhcmR3YXJlL2dvb2dsZS9ncmFwaGljcy9jb21tb24vbGliYWNyeWw6bGliYWNyeWwKK2lmZGVmIEJPQVJEX0xJQkFDUllMX0RFRkFVTFRfQ09NUE9TSVRPUgorICAkKGNhbGwgc29vbmdfY29uZmlnX3NldCxhY3J5bCxsaWJhY3J5bF9kZWZhdWx0X2NvbXBvc2l0b3IsJChCT0FSRF9MSUJBQ1JZTF9ERUZBVUxUX0NPTVBPU0lUT1IpKQorZW5kaWYKK2lmZGVmIEJPQVJEX0xJQkFDUllMX0RFRkFVTFRfU0NBTEVSCisgICQoY2FsbCBzb29uZ19jb25maWdfc2V0LGFjcnlsLGxpYmFjcnlsX2RlZmF1bHRfc2NhbGVyLCQoQk9BUkRfTElCQUNSWUxfREVGQVVMVF9TQ0FMRVIpKQorZW5kaWYKK2lmZGVmIEJPQVJEX0xJQkFDUllMX0RFRkFVTFRfQkxURVIKKyAgJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsYWNyeWwsbGliYWNyeWxfZGVmYXVsdF9ibHRlciwkKEJPQVJEX0xJQkFDUllMX0RFRkFVTFRfQkxURVIpKQorZW5kaWYKK2lmZGVmIEJPQVJEX0xJQkFDUllMX0cyRF9IRFJfUExVR0lOCisgICNCT0FSRF9MSUJBQ1JZTF9HMkRfSERSX1BMVUdJTiBpcyBzZXQgaW4gZWFjaCBib2FyZCBjb25maWcKKyAgJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxhY3J5bCxsaWJhY3J5bF91c2VfZzJkX2hkcl9wbHVnaW4sdHJ1ZSkKK2VuZGlmCisKKyMgRXhwb3J0IHJlbGF0ZWQgdmFyaWFibGVzIHRvIHNvb25nIGZvciBoYXJkd2FyZS9nb29nbGUvZ3JhcGhpY3MvY29tbW9uL0JvYXJkQ29uZmlnQ0ZsYWdzLm1rCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLGdvb2dsZV9ncmFwaGljcyxod2Nfbm9fc3VwcG9ydF9za2lwX3ZhbGlkYXRlLCQoaWYgJChmaWx0ZXIgdHJ1ZSwkKEhXQ19OT19TVVBQT1JUX1NLSVBfVkFMSURBVEUpKSx0cnVlLGZhbHNlKSkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsZ29vZ2xlX2dyYXBoaWNzLGh3Y19zdXBwb3J0X2NvbG9yX3RyYW5zZm9ybSwkKGlmICQoZmlsdGVyIHRydWUsJChIV0NfU1VQUE9SVF9DT0xPUl9UUkFOU0ZPUk0pKSx0cnVlLGZhbHNlKSkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsZ29vZ2xlX2dyYXBoaWNzLGh3Y19zdXBwb3J0X3JlbmRlcl9pbnRlbnQsJChpZiAkKGZpbHRlciB0cnVlLCQoSFdDX1NVUFBPUlRfUkVOREVSX0lOVEVOVCkpLHRydWUsZmFsc2UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxnb29nbGVfZ3JhcGhpY3MsYm9hcmRfdXNlc192aXJ0dWFsX2Rpc3BsYXksJChpZiAkKGZpbHRlciB0cnVlLCQoQk9BUkRfVVNFU19WSVJUVUFMX0RJU1BMQVkpKSx0cnVlLGZhbHNlKSkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsZ29vZ2xlX2dyYXBoaWNzLGJvYXJkX3VzZXNfZHQsJChpZiAkKGZpbHRlciB0cnVlLCQoQk9BUkRfVVNFU19EVCkpLHRydWUsZmFsc2UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxnb29nbGVfZ3JhcGhpY3MsYm9hcmRfdXNlc19kZWNvbl82NGJpdF9hZGRyZXNzLCQoaWYgJChmaWx0ZXIgdHJ1ZSwkKEJPQVJEX1VTRVNfREVDT05fNjRCSVRfQUREUkVTUykpLHRydWUsZmFsc2UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxnb29nbGVfZ3JhcGhpY3MsYm9hcmRfdXNlc19oZHJ1aV9nbGVzX2NvbnZlcnNpb24sJChpZiAkKGZpbHRlciB0cnVlLCQoQk9BUkRfVVNFU19IRFJVSV9HTEVTX0NPTlZFUlNJT04pKSx0cnVlLGZhbHNlKSkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsZ29vZ2xlX2dyYXBoaWNzLHVzZXNfaWRpc3BsYXlfaW50Zl9zZWMsJChpZiAkKGZpbHRlciB0cnVlLCQoVVNFU19JRElTUExBWV9JTlRGX1NFQykpLHRydWUsZmFsc2UpKQorCisjIFZhcmlhYmxlcyBmb3IgZnNfY29uZmlnCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLGZzX2NvbmZpZyx2ZW5kb3IsJChpZiAkKEJPQVJEX1VTRVNfVkVORE9SSU1BR0UpJChCT0FSRF9WRU5ET1JJTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSx0cnVlLGZhbHNlKSkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsZnNfY29uZmlnLG9lbSwkKGlmICQoQk9BUkRfVVNFU19PRU1JTUFHRSkkKEJPQVJEX09FTUlNQUdFX0ZJTEVfU1lTVEVNX1RZUEUpLHRydWUsZmFsc2UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxmc19jb25maWcsb2RtLCQoaWYgJChCT0FSRF9VU0VTX09ETUlNQUdFKSQoQk9BUkRfT0RNSU1BR0VfRklMRV9TWVNURU1fVFlQRSksdHJ1ZSxmYWxzZSkpCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLGZzX2NvbmZpZyx2ZW5kb3JfZGxrbSwkKGlmICQoQk9BUkRfVVNFU19WRU5ET1JfRExLTUlNQUdFKSQoQk9BUkRfVkVORE9SX0RMS01JTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSx0cnVlLGZhbHNlKSkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsZnNfY29uZmlnLG9kbV9kbGttLCQoaWYgJChCT0FSRF9VU0VTX09ETV9ETEtNSU1BR0UpJChCT0FSRF9PRE1fRExLTUlNQUdFX0ZJTEVfU1lTVEVNX1RZUEUpLHRydWUsZmFsc2UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCxmc19jb25maWcsc3lzdGVtX2Rsa20sJChpZiAkKEJPQVJEX1VTRVNfU1lTVEVNX0RMS01JTUFHRSkkKEJPQVJEX1NZU1RFTV9ETEtNSU1BR0VfRklMRV9TWVNURU1fVFlQRSksdHJ1ZSxmYWxzZSkpCisKKyMgVmFyaWFibGVzIGZvciB0ZWxlcGhvbnkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsdGVsZXBob255LHNlY19jcF9zZWN1cmVfYm9vdCwkKGlmICQoZmlsdGVyIHRydWUsJChTRUNfQ1BfU0VDVVJFX0JPT1QpKSx0cnVlLGZhbHNlKSkKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsdGVsZXBob255LGNiZF9wcm90b2NvbF9zaXQsJChpZiAkKGZpbHRlciB0cnVlLCQoQ0JEX1BST1RPQ09MX1NJVCkpLHRydWUsZmFsc2UpKQorJChjYWxsIHNvb25nX2NvbmZpZ19zZXRfYm9vbCx0ZWxlcGhvbnksdXNlX3JhZGlvZXh0ZXJuYWxfaGFsX2FpZGwsJChpZiAkKGZpbHRlciB0cnVlLCQoVVNFX1JBRElPRVhURVJOQUxfSEFMX0FJREwpKSx0cnVlLGZhbHNlKSkKKworIyBWYXJpYWJsZXMgZm9yIGh3Y29tcG9zZXIuJChUQVJHRVRfQk9BUkRfUExBVEZPUk0pCiskKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLGdvb2dsZV9ncmFwaGljcyxib2FyZF91c2VzX2h3Y19zZXJ2aWNlcywkKGlmICQoZmlsdGVyIHRydWUsJChCT0FSRF9VU0VTX0hXQ19TRVJWSUNFUykpLHRydWUsZmFsc2UpKQorCisjIFZhcmlhYmxlcyBmb3IgY29udHJvbGxpbmcgYW5kcm9pZC5oYXJkd2FyZS5jb21wb3Nlci5od2MzLXNlcnZpY2UucGl4ZWwKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0LGdvb2dsZV9ncmFwaGljcyxib2FyZF9od2NfdmVyc2lvbiwkKEJPQVJEX0hXQ19WRVJTSU9OKSkKKworIyBGbGFnIEV4Y2x1ZGVFeHRyYWN0QXBrIGlzIHRvIHN1cHBvcnQgImV4dHJhY3RfYXBrIiBwcm9wZXJ0eSBmb3IgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zLgoraWZuZXEgKCQoV0lUSF9ERVhQUkVPUFQpLHRydWUpCisgICQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsUHJlYnVpbHRHbXNDb3JlLEV4Y2x1ZGVFeHRyYWN0QXBrLHRydWUpCitlbmRpZgoraWZlcSAoJChET05UX0RFWFBSRU9QVF9QUkVCVUlMVFMpLHRydWUpCisgICQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsUHJlYnVpbHRHbXNDb3JlLEV4Y2x1ZGVFeHRyYWN0QXBrLHRydWUpCitlbmRpZgoraWZlcSAoJChXSVRIX0RFWFBSRU9QVF9CT09UX0lNR19BTkRfU1lTVEVNX1NFUlZFUl9PTkxZKSx0cnVlKQorICAkKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLFByZWJ1aWx0R21zQ29yZSxFeGNsdWRlRXh0cmFjdEFwayx0cnVlKQorZW5kaWYKKworIyBWYXJpYWJsZXMgZm9yIGV4dHJhIGJyYW5jaGVzCisjIFRPRE8oYi8zODMyMzgzOTcpOiBVc2UgYm9vdHN0cmFwX2dvX3BhY2thZ2UgdG8gZW5hYmxlIGV4dHJhIGZsYWdzLgorLWluY2x1ZGUgdmVuZG9yL2dvb2dsZS9idWlsZC9leHRyYV9zb29uZ19jb25maWdfdmFycy5taworCisjIFZhcmlhYmxlIGZvciBDSSB0ZXN0IHBhY2thZ2VzCitpZm5lcSAoJChmaWx0ZXIgYXJtIHg4NiB0cnVlLCQoVEFSR0VUX0FSQ0gpICQoVEFSR0VUXzJORF9BUkNIKSAkKFRBUkdFVF9FTkFCTEVfTUVESUFEUk1fNjQpKSwpCisgICQoY2FsbCBzb29uZ19jb25maWdfc2V0X2Jvb2wsY2lfdGVzdHMsdXNlc193aWRldmluZV90ZXN0cywgdHJ1ZSkKK2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL2Jhc2VfcnVsZXMubWsgYi9jb3JlL2Jhc2VfcnVsZXMubWsKaW5kZXggNTM2M2UwZi4uOWZmZTUxOCAxMDA2NDQKLS0tIGEvY29yZS9iYXNlX3J1bGVzLm1rCisrKyBiL2NvcmUvYmFzZV9ydWxlcy5tawpAQCAtODYxLDEzICs4NjEsNiBAQAogICAgICAgJChldmFsIG15X2NvbXBhdF9kaXN0X2NvbmZpZ18kKHN1aXRlKSArPSAkKGZvcmVhY2ggZGlyLCAkKGNhbGwgY29tcGF0aWJpbGl0eV9zdWl0ZV9kaXJzLCQoc3VpdGUpKSwgXAogICAgICAgICAkKExPQ0FMX1BBVEgpL0R5bmFtaWNDb25maWcueG1sOiQoZGlyKS8kKExPQ0FMX01PRFVMRSkuZHluYW1pYykpKQogICBlbmRpZgotCi0gIGlmbmVxICgsJCh3aWxkY2FyZCAkKExPQ0FMX1BBVEgpLyQoTE9DQUxfTU9EVUxFKV8qLmNvbmZpZykpCi0gICQoZm9yZWFjaCBleHRyYV9jb25maWcsICQod2lsZGNhcmQgJChMT0NBTF9QQVRIKS8kKExPQ0FMX01PRFVMRSlfKi5jb25maWcpLCBcCi0gICAgJChmb3JlYWNoIHN1aXRlLCAkKExPQ0FMX0NPTVBBVElCSUxJVFlfU1VJVEUpLCBcCi0gICAgICAkKGV2YWwgbXlfY29tcGF0X2Rpc3RfY29uZmlnXyQoc3VpdGUpICs9ICQoZm9yZWFjaCBkaXIsICQoY2FsbCBjb21wYXRpYmlsaXR5X3N1aXRlX2RpcnMsJChzdWl0ZSkpLCBcCi0gICAgICAgICQoZXh0cmFfY29uZmlnKTokKGRpcikvJChub3RkaXIgJChleHRyYV9jb25maWcpKSkpKSkKLSAgZW5kaWYKIGVuZGlmICMgJChteV9wcmVmaXgpJChMT0NBTF9NT0RVTEVfQ0xBU1MpXyQoTE9DQUxfTU9EVUxFKV9jb21wYXRfZmlsZXMKIAogCkBAIC05MzgsMTIgKzkzMSw2IEBACiAgICAgbXlfc3VwcG9ydGVkX3ZhcmlhbnQgOj0gREVWSUNFCiAgIGVuZGlmCiBlbmRpZgotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMjIEFkZCB0ZXN0IG1vZHVsZSB0byBBTExfRElTQUJMRURfUFJFU1VCTUlUX1RFU1RTIGlmIExPQ0FMX1BSRVNVQk1JVF9ESVNBQkxFRCBpcyBzZXQgdG8gdHJ1ZS4KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi1pZmVxICgkKExPQ0FMX1BSRVNVQk1JVF9ESVNBQkxFRCksdHJ1ZSkKLSAgQUxMX0RJU0FCTEVEX1BSRVNVQk1JVF9URVNUUyArPSAkKExPQ0FMX01PRFVMRSkKLWVuZGlmICAjIExPQ0FMX1BSRVNVQk1JVF9ESVNBQkxFRAogCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogIyMgUmVnaXN0ZXIgd2l0aCBBTExfTU9EVUxFUwpkaWZmIC0tZ2l0IGEvY29yZS9iaW5hcnkubWsgYi9jb3JlL2JpbmFyeS5tawppbmRleCAxZTk4YmMwLi5lYTg2MmJlIDEwMDY0NAotLS0gYS9jb3JlL2JpbmFyeS5taworKysgYi9jb3JlL2JpbmFyeS5tawpAQCAtMTc0LDcgKzE3NCw3IEBACiBlbmRpZgogZW5kaWYKIAotbXlfbmRrX3N5c3Jvb3RfaW5jbHVkZSA6PQorbXlfbmRrX3N5c3Jvb3QgOj0KIG15X25ka19zeXNyb290X2xpYiA6PQogbXlfYXBpX2xldmVsIDo9IDEwMDAwCiAKQEAgLTIwNywxMSArMjA3LDkgQEAKIAogICBteV9idWlsdF9uZGsgOj0gJChTT09OR19PVVRfRElSKS9uZGsKICAgbXlfbmRrX3RyaXBsZSA6PSAkKCQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClUQVJHRVRfTkRLX1RSSVBMRSkKLSAgbXlfbmRrX3N5c3Jvb3RfaW5jbHVkZSA6PSBcCi0gICAgICAkKG15X2J1aWx0X25kaykvc3lzcm9vdC91c3IvaW5jbHVkZSBcCi0gICAgICAkKG15X2J1aWx0X25kaykvc3lzcm9vdC91c3IvaW5jbHVkZS8kKG15X25ka190cmlwbGUpIFwKKyAgbXlfbmRrX3N5c3Jvb3QgOj0gJChteV9idWlsdF9uZGspL3N5c3Jvb3QKIAotICBteV9uZGtfc3lzcm9vdF9saWIgOj0gJChteV9idWlsdF9uZGspL3N5c3Jvb3QvdXNyL2xpYi8kKG15X25ka190cmlwbGUpLyQobXlfbmRrX2FwaSkKKyAgbXlfbmRrX3N5c3Jvb3RfbGliIDo9ICQobXlfbmRrX3N5c3Jvb3QpL3Vzci9saWIvJChteV9uZGtfdHJpcGxlKS8kKG15X25ka19hcGkpCiAKICAgIyBUaGUgYmlvbmljIGxpbmtlciBub3cgaGFzIHN1cHBvcnQgZm9yIHBhY2tlZCByZWxvY2F0aW9ucyBhbmQgZ251IHN0eWxlCiAgICMgaGFzaGVzICh3aGljaCBhcmUgbXVjaCBmYXN0ZXIhKSwgYnV0IHNoaXBwaW5nIHRvIG9sZGVyIGRldmljZXMgcmVxdWlyZXMKQEAgLTMzMCwxOCArMzI4LDIwIEBACiAgIGlmbmVxICgkKExPQ0FMX0lOX1ZFTkRPUiksKQogICAgICMgVmVuZG9yIG1vZHVsZXMgaGF2ZSBMT0NBTF9JTl9WRU5ET1IKICAgICBteV9jZmxhZ3MgKz0gLURfX0FORFJPSURfVkVORE9SX18KLQotICAgIGlmZXEgKCQoQk9BUkRfQVBJX0xFVkVMKSwpCi0gICAgICAjIFRPRE8oYi8zMTQwMzY4NDcpOiBUaGlzIGlzIGEgZmFsbGJhY2sgZm9yIFVEQyB0YXJnZXRzLgotICAgICAgIyBUaGlzIG11c3QgYmUgYSBidWlsZCBmYWlsdXJlIHdoZW4gVURDIGlzIG5vIGxvbmdlciBidWlsdCBmcm9tIHRoaXMgc291cmNlIHRyZWUuCi0gICAgICBteV9jZmxhZ3MgKz0gLURfX0FORFJPSURfVkVORE9SX0FQSV9fPSQoUExBVEZPUk1fU0RLX1ZFUlNJT04pCi0gICAgZWxzZQotICAgICAgbXlfY2ZsYWdzICs9IC1EX19BTkRST0lEX1ZFTkRPUl9BUElfXz0kKEJPQVJEX0FQSV9MRVZFTCkKLSAgICBlbmRpZgogICBlbHNlIGlmbmVxICgkKExPQ0FMX0lOX1BST0RVQ1QpLCkKICAgICAjIFByb2R1Y3QgbW9kdWxlcyBoYXZlIExPQ0FMX0lOX1BST0RVQ1QKICAgICBteV9jZmxhZ3MgKz0gLURfX0FORFJPSURfUFJPRFVDVF9fCiAgIGVuZGlmCisKKyAgIyBEZWZpbmUgX19BTkRST0lEX1ZFTkRPUl9BUElfXyBmb3IgYm90aCBwcm9kdWN0IGFuZCB2ZW5kb3IgdmFyaWFudHMgYmVjYXVzZQorICAjIHRoZXkgYm90aCB1c2UgdGhlIHNhbWUgTExOREsgbGlicmFyaWVzLgorICBpZmVxICgkKEJPQVJEX0FQSV9MRVZFTCksKQorICAgICMgVE9ETyhiLzMxNDAzNjg0Nyk6IFRoaXMgaXMgYSBmYWxsYmFjayBmb3IgVURDIHRhcmdldHMuCisgICAgIyBUaGlzIG11c3QgYmUgYSBidWlsZCBmYWlsdXJlIHdoZW4gVURDIGlzIG5vIGxvbmdlciBidWlsdCBmcm9tIHRoaXMgc291cmNlIHRyZWUuCisgICAgbXlfY2ZsYWdzICs9IC1EX19BTkRST0lEX1ZFTkRPUl9BUElfXz0kKFBMQVRGT1JNX1NES19WRVJTSU9OKQorICBlbHNlCisgICAgbXlfY2ZsYWdzICs9IC1EX19BTkRST0lEX1ZFTkRPUl9BUElfXz0kKEJPQVJEX0FQSV9MRVZFTCkKKyAgZW5kaWYKIGVuZGlmCiAKIGlmbmRlZiBMT0NBTF9JU19IT1NUX01PRFVMRQpAQCAtMTYyNiwxOSArMTYyNiw2IEBACiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogaWZuZGVmIExPQ0FMX0lTX0hPU1RfTU9EVUxFCiAKLWlmZXEgKCQoY2FsbCBtb2R1bGUtaW4tdmVuZG9yLW9yLXByb2R1Y3QpLHRydWUpCi0gIG15X3RhcmdldF9nbG9iYWxfY19pbmNsdWRlcyA6PQotICBteV90YXJnZXRfZ2xvYmFsX2Nfc3lzdGVtX2luY2x1ZGVzIDo9ICQoVEFSR0VUX09VVF9IRUFERVJTKQotZWxzZSBpZmRlZiBMT0NBTF9TREtfVkVSU0lPTgotICBteV90YXJnZXRfZ2xvYmFsX2NfaW5jbHVkZXMgOj0KLSAgbXlfdGFyZ2V0X2dsb2JhbF9jX3N5c3RlbV9pbmNsdWRlcyA6PSAkKG15X25ka19zdGxfaW5jbHVkZV9wYXRoKSAkKG15X25ka19zeXNyb290X2luY2x1ZGUpCi1lbHNlCi0gIG15X3RhcmdldF9nbG9iYWxfY19pbmNsdWRlcyA6PSAkKFNSQ19IRUFERVJTKSBcCi0gICAgJCgkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpJChteV9wcmVmaXgpQ19JTkNMVURFUykKLSAgbXlfdGFyZ2V0X2dsb2JhbF9jX3N5c3RlbV9pbmNsdWRlcyA6PSAkKFNSQ19TWVNURU1fSEVBREVSUykgXAotICAgICQoJChMT0NBTF8yTkRfQVJDSF9WQVJfUFJFRklYKSQobXlfcHJlZml4KUNfU1lTVEVNX0lOQ0xVREVTKQotZW5kaWYKLQogbXlfdGFyZ2V0X2dsb2JhbF9jZmxhZ3MgOj0gJCgkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpQ0xBTkdfJChteV9wcmVmaXgpR0xPQkFMX0NGTEFHUykKIG15X3RhcmdldF9nbG9iYWxfY29ubHlmbGFncyA6PSAkKCQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClDTEFOR18kKG15X3ByZWZpeClHTE9CQUxfQ09OTFlGTEFHUykgJChteV9jX3N0ZF9jb25seWZsYWdzKQogbXlfdGFyZ2V0X2dsb2JhbF9jcHBmbGFncyA6PSAkKCQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClDTEFOR18kKG15X3ByZWZpeClHTE9CQUxfQ1BQRkxBR1MpICQobXlfY3BwX3N0ZF9jcHBmbGFncykKQEAgLTE2NTQsNiArMTY0MSwyMiBAQAogICBteV90YXJnZXRfZ2xvYmFsX2xkZmxhZ3MgOj0gJCgkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpQ0xBTkdfJChteV9wcmVmaXgpR0xPQkFMX0xERkxBR1MpCiBlbmRpZiAjIG15X3VzZV9jbGFuZ19sbGQKIAoraWZlcSAoJChjYWxsIG1vZHVsZS1pbi12ZW5kb3Itb3ItcHJvZHVjdCksdHJ1ZSkKKyAgbXlfdGFyZ2V0X2dsb2JhbF9jX2luY2x1ZGVzIDo9CisgIG15X3RhcmdldF9nbG9iYWxfY19zeXN0ZW1faW5jbHVkZXMgOj0gJChUQVJHRVRfT1VUX0hFQURFUlMpCisgIG15X3RhcmdldF9nbG9iYWxfY2ZsYWdzICs9IC1ub3N0ZGxpYmluYworZWxzZSBpZmRlZiBMT0NBTF9TREtfVkVSU0lPTgorICBteV90YXJnZXRfZ2xvYmFsX2NfaW5jbHVkZXMgOj0KKyAgbXlfdGFyZ2V0X2dsb2JhbF9jX3N5c3RlbV9pbmNsdWRlcyA6PSAkKG15X25ka19zdGxfaW5jbHVkZV9wYXRoKQorICBteV90YXJnZXRfZ2xvYmFsX2NmbGFncyArPSAtLXN5c3Jvb3QgJChteV9uZGtfc3lzcm9vdCkKK2Vsc2UKKyAgbXlfdGFyZ2V0X2dsb2JhbF9jX2luY2x1ZGVzIDo9ICQoU1JDX0hFQURFUlMpIFwKKyAgICAkKCQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWCkkKG15X3ByZWZpeClDX0lOQ0xVREVTKQorICBteV90YXJnZXRfZ2xvYmFsX2Nfc3lzdGVtX2luY2x1ZGVzIDo9ICQoU1JDX1NZU1RFTV9IRUFERVJTKSBcCisgICAgJCgkKExPQ0FMXzJORF9BUkNIX1ZBUl9QUkVGSVgpJChteV9wcmVmaXgpQ19TWVNURU1fSU5DTFVERVMpCisgIG15X3RhcmdldF9nbG9iYWxfY2ZsYWdzICs9IC1ub3N0ZGxpYmluYworZW5kaWYKKwogbXlfdGFyZ2V0X3RyaXBsZSA6PSAkKCQoTE9DQUxfMk5EX0FSQ0hfVkFSX1BSRUZJWClDTEFOR18kKG15X3ByZWZpeClUUklQTEUpCiBpZm5kZWYgTE9DQUxfSVNfSE9TVF9NT0RVTEUKICAgbXlfdGFyZ2V0X3RyaXBsZV9mbGFnIDo9IC10YXJnZXQgJChteV90YXJnZXRfdHJpcGxlKSQobXlfYXBpX2xldmVsKQpkaWZmIC0tZ2l0IGEvY29yZS9ib2FyZF9jb25maWcubWsgYi9jb3JlL2JvYXJkX2NvbmZpZy5tawppbmRleCA1NjA2OTY0Li5hZDg5YzAzIDEwMDY0NAotLS0gYS9jb3JlL2JvYXJkX2NvbmZpZy5taworKysgYi9jb3JlL2JvYXJkX2NvbmZpZy5tawpAQCAtMjcsNiArMjcsNyBAQAogX2JvYXJkX3N0cmlwX3JlYWRvbmx5X2xpc3QgKz0gQk9BUkRfS0VSTkVMX0NNRExJTkUKIF9ib2FyZF9zdHJpcF9yZWFkb25seV9saXN0ICs9IEJPQVJEX0JPT1RfSEVBREVSX1ZFUlNJT04KIF9ib2FyZF9zdHJpcF9yZWFkb25seV9saXN0ICs9IEJPQVJEX0JPT1RDT05GSUcKK19ib2FyZF9zdHJpcF9yZWFkb25seV9saXN0ICs9IEJPQVJEX0JPT1RDT05GSUdfRklMRQogX2JvYXJkX3N0cmlwX3JlYWRvbmx5X2xpc3QgKz0gQk9BUkRfS0VSTkVMX0JBU0UKIF9ib2FyZF9zdHJpcF9yZWFkb25seV9saXN0ICs9IEJPQVJEX1VTRVNfR0VORVJJQ19BVURJTwogX2JvYXJkX3N0cmlwX3JlYWRvbmx5X2xpc3QgKz0gQk9BUkRfVVNFU19SRUNPVkVSWV9BU19CT09UCkBAIC0yOTAsNiArMjkxLDcgQEAKIGluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2JvYXJkX2NvbmZpZ193aWZpLm1rCiAKICMgU2V0IHVwIHNvb25nIGNvbmZpZyBmb3IgInNvb25nX2NvbmZpZ192YWx1ZV92YXJpYWJsZSIuCistaW5jbHVkZSBoYXJkd2FyZS9pbnRlcmZhY2VzL2NvbmZpZ3N0b3JlLzEuMS9kZWZhdWx0L3N1cmZhY2VmbGluZ2VyLm1rCiAtaW5jbHVkZSB2ZW5kb3IvZ29vZ2xlL2J1aWxkL3Nvb25nL3Nvb25nX2NvbmZpZ19uYW1lc3BhY2UvY2FtZXJhLm1rCiAKICMgRGVmYXVsdCAqX0NQVV9WQVJJQU5UX1JVTlRJTUUgdG8gQ1BVX1ZBUklBTlQgaWYgdW5zcGVjaWZpZWQuCkBAIC0zMTEsOSArMzEzLDEwIEBACiAuS0FUSV9SRUFET05MWSA6PSAkKF9ib2FyZF9zdHJpcF9yZWFkb25seV9saXN0KQogCiBJTlRFUk5BTF9LRVJORUxfQ01ETElORSA6PSAkKEJPQVJEX0tFUk5FTF9DTURMSU5FKQotaWZuZXEgKCwkKEJPQVJEX0JPT1RDT05GSUcpKQoraWZuZXEgKCwkKEJPQVJEX0JPT1RDT05GSUcpJChCT0FSRF9CT09UQ09ORklHX0ZJTEUpKQogICBJTlRFUk5BTF9LRVJORUxfQ01ETElORSArPSBib290Y29uZmlnCiAgIElOVEVSTkFMX0JPT1RDT05GSUcgOj0gJChCT0FSRF9CT09UQ09ORklHKQorICBJTlRFUk5BTF9CT09UQ09ORklHX0ZJTEUgOj0gJChCT0FSRF9CT09UQ09ORklHX0ZJTEUpCiBlbmRpZgogCiBpZm5lcSAoJChmaWx0ZXIgJTY0LCQoVEFSR0VUX0FSQ0gpKSwpCkBAIC05MjIsNiArOTI1LDE4IEBACiBlbmRpZgogLktBVElfUkVBRE9OTFkgOj0gQk9BUkRfVVNFU19QVk1GV0lNQUdFCiAKK0JPQVJEX1VTRVNfREVTS1RPUF9SRUNPVkVSWV9JTUFHRSA6PQoraWZlcSAoJChQUk9EVUNUX0JVSUxEX0RFU0tUT1BfUkVDT1ZFUllfSU1BR0UpLHRydWUpCisgIEJPQVJEX1VTRVNfREVTS1RPUF9SRUNPVkVSWV9JTUFHRSA6PSB0cnVlCitlbmRpZgorLktBVElfUkVBRE9OTFkgOj0gQk9BUkRfVVNFU19ERVNLVE9QX1JFQ09WRVJZX0lNQUdFCisKK0JPQVJEX1VTRVNfREVTS1RPUF9VUERBVEVfSU1BR0UgOj0KK2lmZXEgKCQoUFJPRFVDVF9CVUlMRF9ERVNLVE9QX1VQREFURV9JTUFHRSksdHJ1ZSkKKyAgQk9BUkRfVVNFU19ERVNLVE9QX1VQREFURV9JTUFHRSA6PSB0cnVlCitlbmRpZgorLktBVElfUkVBRE9OTFkgOj0gQk9BUkRfVVNFU19ERVNLVE9QX1VQREFURV9JTUFHRQorCiAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIEVuc3VyZSBjb25zaXN0ZW5jeSBhbW9uZyBUQVJHRVRfUkVDT1ZFUllfVVBEQVRFUl9MSUJTLCBBQl9PVEFfVVBEQVRFUiwgYW5kIFBST0RVQ1RfT1RBX0ZPUkNFX05PTl9BQl9QQUNLQUdFLgogVEFSR0VUX1JFQ09WRVJZX1VQREFURVJfTElCUyA/PQpkaWZmIC0tZ2l0IGEvY29yZS9jbGVhcl92YXJzLm1rIGIvY29yZS9jbGVhcl92YXJzLm1rCmluZGV4IGZlZDE5ZTYuLjJlNjdhZmYgMTAwNjQ0Ci0tLSBhL2NvcmUvY2xlYXJfdmFycy5taworKysgYi9jb3JlL2NsZWFyX3ZhcnMubWsKQEAgLTIwNCw3ICsyMDQsNiBAQAogTE9DQUxfUFJFQlVJTFRfU1RBVElDX0pBVkFfTElCUkFSSUVTOj0KIExPQ0FMX1VTRV9FTUJFRERFRF9ERVg6PQogTE9DQUxfVVNFX0VNQkVEREVEX05BVElWRV9MSUJTOj0KLUxPQ0FMX1BSRVNVQk1JVF9ESVNBQkxFRDo9CiBMT0NBTF9QUklWQVRFX1BMQVRGT1JNX0FQSVM6PQogTE9DQUxfUFJJVklMRUdFRF9NT0RVTEU6PQogTE9DQUxfUFJPQ19NQUNST19MSUJSQVJJRVM6PQpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy90b29scy91cGRhdGVfYm9vdGxvYWRlcl9yYWRpb19pbWFnZS5tayBiL2NvcmUvY29tYm8vYXJjaC9hcm02NC9hcm12OS0yYS5tawpzaW1pbGFyaXR5IGluZGV4IDY1JQpjb3B5IGZyb20gY29yZS90YXNrcy90b29scy91cGRhdGVfYm9vdGxvYWRlcl9yYWRpb19pbWFnZS5tawpjb3B5IHRvIGNvcmUvY29tYm8vYXJjaC9hcm02NC9hcm12OS0yYS5tawppbmRleCAwZWJmMjQ3Li42OWZmZGUwIDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL3Rvb2xzL3VwZGF0ZV9ib290bG9hZGVyX3JhZGlvX2ltYWdlLm1rCisrKyBiL2NvcmUvY29tYm8vYXJjaC9hcm02NC9hcm12OS0yYS5tawpAQCAtMSwxNyArMSwxOCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBDb3B5cmlnaHQgKEMpIDIwMjMgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogIwogIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgogIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKICMKLSMgICAgICBodHRwOiN3d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogIwogIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCiAjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCiAjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgogIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIwogCi1pZmVxICgkKFVTRVNfREVWSUNFX0dPT0dMRV9aVU1BKSx0cnVlKQotICAgIC1pbmNsdWRlIHZlbmRvci9nb29nbGVfZGV2aWNlcy96dW1hL3ByZWJ1aWx0cy9taXNjX2JpbnMvdXBkYXRlX2Jvb3Rsb2FkZXJfcmFkaW9faW1hZ2UubWsKLWVuZGlmCisjIC5tayBmaWxlIHJlcXVpcmVkIHRvIHN1cHBvcnQgYnVpbGQgZm9yIHRoZSBBUk12OS4yLUEgYXJjaCB2YXJpYW50LgorIyBUaGUgZmlsZSBqdXN0IG5lZWRzIHRvIGJlIHByZXNlbnQsIGl0IGRvZXMgbm90IG5lZWQgdG8gY29udGFpbiBhbnl0aGluZy4KZGlmZiAtLWdpdCBhL2NvcmUvY29tYm8vYXJjaC94ODYvYWxkZXJsYWtlLm1rIGIvY29yZS9jb21iby9hcmNoL3g4Ni9hbGRlcmxha2UubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdhZTZlZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvY29tYm8vYXJjaC94ODYvYWxkZXJsYWtlLm1rCkBAIC0wLDAgKzEsNiBAQAorIyBDb25maWd1cmF0aW9uIGZvciBMaW51eCBvbiB4ODYuCisjIEdlbmVyYXRpbmcgYmluYXJpZXMgZm9yIHByb2Nlc3NvcnMKKyMgdGhhdCBoYXZlIEFWWDIgZmVhdHVyZSBmbGFnCisjCisKK0FSQ0hfWDg2X0hBVkVfU1NFNF8xIDo9IHRydWUKZGlmZiAtLWdpdCBhL2NvcmUvY29tYm8vYXJjaC94ODZfNjQvYWxkZXJsYWtlLm1rIGIvY29yZS9jb21iby9hcmNoL3g4Nl82NC9hbGRlcmxha2UubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdhZTZlZAotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvY29tYm8vYXJjaC94ODZfNjQvYWxkZXJsYWtlLm1rCkBAIC0wLDAgKzEsNiBAQAorIyBDb25maWd1cmF0aW9uIGZvciBMaW51eCBvbiB4ODYuCisjIEdlbmVyYXRpbmcgYmluYXJpZXMgZm9yIHByb2Nlc3NvcnMKKyMgdGhhdCBoYXZlIEFWWDIgZmVhdHVyZSBmbGFnCisjCisKK0FSQ0hfWDg2X0hBVkVfU1NFNF8xIDo9IHRydWUKZGlmZiAtLWdpdCBhL2NvcmUvY29uZmlnLm1rIGIvY29yZS9jb25maWcubWsKaW5kZXggMTkyYzhiMi4uYjg5MjkyNCAxMDA2NDQKLS0tIGEvY29yZS9jb25maWcubWsKKysrIGIvY29yZS9jb25maWcubWsKQEAgLTMzMCw2ICszMzAsMTggQEAKICQoZXZhbCBTT09OR19DT05GSUdfVFlQRV8kKHN0cmlwICQxKV8kKHN0cmlwICQyKTo9Ym9vbCkKIGVuZGVmCiAKKyMgc29vbmdfY29uZmlnX3NldF9zdHJpbmdfbGlzdCBpcyB0aGUgc2FtZSBhcyBzb29uZ19jb25maWdfc2V0LCBidXQgaXQgd2lsbAorIyBhbHNvIHR5cGUgdGhlIHZhcmlhYmxlIGFzIGEgbGlzdCBvZiBzdHJpbmdzLCBzbyB0aGF0IHdoZW4gdXNpbmcgc2VsZWN0KCkgZXhwcmVzc2lvbnMKKyMgaW4gYmx1ZXByaW50IGZpbGVzIHRoZXkgY2FuIHVzZSBsaXN0IHZhbHVlcyBpbnN0ZWFkIG9mIHN0cmluZ3MuCisjIFRoZSB2YWx1ZXMgb2YgdGhlIGxpc3QgbXVzdCBiZSBzcGFjZS1zZXBhcmF0ZWQuCisjICQxIGlzIHRoZSBuYW1lc3BhY2UuICQyIGlzIHRoZSB2YXJpYWJsZSBuYW1lLiAkMyBpcyB0aGUgdmFyaWFibGUgdmFsdWUuCisjIEV4OiAkKGNhbGwgc29vbmdfY29uZmlnX3NldF9zdHJpbmdfbGlzdCxhY21lLENPT0xfTElCUyxhIGIpCitkZWZpbmUgc29vbmdfY29uZmlnX3NldF9zdHJpbmdfbGlzdAorJChjYWxsIHNvb25nX2NvbmZpZ19kZWZpbmVfaW50ZXJuYWwsJDEsJDIpIFwKKyQoZXZhbCBTT09OR19DT05GSUdfJChzdHJpcCAkMSlfJChzdHJpcCAkMik6PSQoc3RyaXAgJDMpKQorJChldmFsIFNPT05HX0NPTkZJR19UWVBFXyQoc3RyaXAgJDEpXyQoc3RyaXAgJDIpOj1zdHJpbmdfbGlzdCkKK2VuZGVmCisKICMgc29vbmdfY29uZmlnX2FwcGVuZCBhcHBlbmRzIHRvIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgaW4gdGhlIGdpdmVuIFNvb25nCiAjIGNvbmZpZyBuYW1lc3BhY2UuIElmIHRoZSB2YXJpYWJsZSBkb2VzIG5vdCBleGlzdCwgaXQgd2lsbCBiZSBkZWZpbmVkLiBJZiB0aGUKICMgbmFtZXNwYWNlIGRvZXMgbm90ICBleGlzdCwgaXQgd2lsbCBiZSBkZWZpbmVkLgpAQCAtNDMyLDEzICs0NDQsNiBAQAogZW5kaWYKIC5LQVRJX1JFQURPTkxZIDo9IFRBUkdFVF9NQVhfUEFHRV9TSVpFX1NVUFBPUlRFRAogCi1pZmRlZiBQUk9EVUNUX0NIRUNLX1BSRUJVSUxUX01BWF9QQUdFX1NJWkUKLSAgVEFSR0VUX0NIRUNLX1BSRUJVSUxUX01BWF9QQUdFX1NJWkUgOj0gJChQUk9EVUNUX0NIRUNLX1BSRUJVSUxUX01BWF9QQUdFX1NJWkUpCi1lbHNlCi0gIFRBUkdFVF9DSEVDS19QUkVCVUlMVF9NQVhfUEFHRV9TSVpFIDo9IGZhbHNlCi1lbmRpZgotLktBVElfUkVBRE9OTFkgOj0gVEFSR0VUX0NIRUNLX1BSRUJVSUxUX01BWF9QQUdFX1NJWkUKLQogIyBCb29sZWFuIHZhcmlhYmxlIGRldGVybWluaW5nIGlmIEFPU1AgcmVsaWVzIG9uIGJpb25pYydzIFBBR0VfU0laRSBtYWNyby4KIGlmZGVmIFBST0RVQ1RfTk9fQklPTklDX1BBR0VfU0laRV9NQUNSTwogICBUQVJHRVRfTk9fQklPTklDX1BBR0VfU0laRV9NQUNSTyA6PSAkKFBST0RVQ1RfTk9fQklPTklDX1BBR0VfU0laRV9NQUNSTykKQEAgLTcyNSw4ICs3MzAsOCBAQAogUFJPR1VBUkRfSE9NRSA6PSBleHRlcm5hbC9wcm9ndWFyZAogUFJPR1VBUkQgOj0gJChQUk9HVUFSRF9IT01FKS9iaW4vcHJvZ3VhcmQuc2gKIFBST0dVQVJEX0RFUFMgOj0gJChQUk9HVUFSRCkgJChQUk9HVUFSRF9IT01FKS9saWIvcHJvZ3VhcmQuamFyCi1KQVZBVEFHUyA6PSBidWlsZC9tYWtlL3Rvb2xzL2phdmEtZXZlbnQtbG9nLXRhZ3MucHkKLU1FUkdFVEFHUyA6PSBidWlsZC9tYWtlL3Rvb2xzL21lcmdlLWV2ZW50LWxvZy10YWdzLnB5CitKQVZBVEFHUyA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9qYXZhLWV2ZW50LWxvZy10YWdzCitNRVJHRVRBR1MgOj0gJChIT1NUX09VVF9FWEVDVVRBQkxFUykvbWVyZ2UtZXZlbnQtbG9nLXRhZ3MKIEFQUEVORDJTSU1HIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL2FwcGVuZDJzaW1nCiBWRVJJVFlfU0lHTkVSIDo9ICQoSE9TVF9PVVRfRVhFQ1VUQUJMRVMpL3Zlcml0eV9zaWduZXIKIEJVSUxEX1ZFUklUWV9NRVRBREFUQSA6PSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9idWlsZF92ZXJpdHlfbWV0YWRhdGEKQEAgLTc1OCw1MCArNzYzLDIzIEBACiAuS0FUSV9SRUFET05MWSA6PSBcCiAgICAgUFJPRFVDVF9DT01QQVRJQkxFX1BST1BFUlRZCiAKLSMgQm9vbGVhbiB2YXJpYWJsZSBkZXRlcm1pbmluZyBpZiBUcmVibGUgaXMgZnVsbHkgZW5hYmxlZAotUFJPRFVDVF9GVUxMX1RSRUJMRSA6PSBmYWxzZQotaWZuZXEgKCQoUFJPRFVDVF9GVUxMX1RSRUJMRV9PVkVSUklERSksKQotICBQUk9EVUNUX0ZVTExfVFJFQkxFIDo9ICQoUFJPRFVDVF9GVUxMX1RSRUJMRV9PVkVSUklERSkKLWVsc2UgaWZlcSAoJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCksKQotICAjJCh3YXJuaW5nIG5vIHByb2R1Y3Qgc2hpcHBpbmcgbGV2ZWwgZGVmaW5lZCkKLWVsc2UgaWZuZXEgKCQoY2FsbCBtYXRoX2d0X29yX2VxLCQoUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwpLDI2KSwpCi0gIFBST0RVQ1RfRlVMTF9UUkVCTEUgOj0gdHJ1ZQotZW5kaWYKLQotcmVxdWlyZW1lbnRzIDo9IFwKLSAgICBQUk9EVUNUX1RSRUJMRV9MSU5LRVJfTkFNRVNQQUNFUyBcCi0gICAgUFJPRFVDVF9FTkZPUkNFX1ZJTlRGX01BTklGRVNUCi0KLSMgSWYgaXQgaXMgb3ZlcnJpZGVuLCB0aGVuIHRoZSByZXF1aXJlbWVudCBvdmVycmlkZSBpcyB0YWtlbiwgb3RoZXJ3aXNlIGl0J3MKLSMgUFJPRFVDVF9GVUxMX1RSRUJMRQotJChmb3JlYWNoIHJlcSwkKHJlcXVpcmVtZW50cyksJChldmFsIFwKLSAgICAkKHJlcSkgOj0gJChpZiAkKCQocmVxKV9PVkVSUklERSksJCgkKHJlcSlfT1ZFUlJJREUpLCQoUFJPRFVDVF9GVUxMX1RSRUJMRSkpKSkKLSMgSWYgdGhlIHJlcXVpcmVtZW50IGlzIGZhbHNlIGZvciBhbnkgcmVhc29uLCB0aGVuIGl0J3Mgbm90IFBST0RVQ1RfRlVMTF9UUkVCTEUKLSQoZm9yZWFjaCByZXEsJChyZXF1aXJlbWVudHMpLCQoZXZhbCBcCi0gICAgUFJPRFVDVF9GVUxMX1RSRUJMRSA6PSAkKGlmICQoZmlsdGVyIGZhbHNlLCQoJChyZXEpKSksZmFsc2UsJChQUk9EVUNUX0ZVTExfVFJFQkxFKSkpKQotCi1QUk9EVUNUX0ZVTExfVFJFQkxFX09WRVJSSURFID89Ci0kKGZvcmVhY2ggcmVxLCQocmVxdWlyZW1lbnRzKSwkKGV2YWwgJChyZXEpX09WRVJSSURFID89KSkKLQotIyB1c2VkIHRvIGJlIGEgcGFydCBvZiBQUk9EVUNUX0ZVTExfVFJFQkxFLCBidXQgbm93IGFsd2F5cyBzZXQgaXQKKyMgVE9ETzogcmVtb3ZlIGFsbCBjb2RlIHJlZmVyZW5jaW5nIHRoZXNlLCBhbmQgcmVtb3ZlIG92ZXJyaWRlIHZhcmlhYmxlcworUFJPRFVDVF9GVUxMX1RSRUJMRSA6PSB0cnVlCiBQUk9EVUNUX05PVElDRV9TUExJVCA6PSB0cnVlCitQUk9EVUNUX1RSRUJMRV9MSU5LRVJfTkFNRVNQQUNFUyA6PSB0cnVlCitQUk9EVUNUX0VORk9SQ0VfVklOVEZfTUFOSUZFU1QgOj0gdHJ1ZQogCiAjIFRPRE8oYi8xMTQ0ODg4NzApOiBkaXNhbGxvdyBQUk9EVUNUX0ZVTExfVFJFQkxFX09WRVJSSURFIGZyb20gYmVpbmcgdXNlZC4KIC5LQVRJX1JFQURPTkxZIDo9IFwKLSAgICBQUk9EVUNUX0ZVTExfVFJFQkxFX09WRVJSSURFIFwKLSAgICAkKGZvcmVhY2ggcmVxLCQocmVxdWlyZW1lbnRzKSwkKHJlcSlfT1ZFUlJJREUpIFwKLSAgICAkKHJlcXVpcmVtZW50cykgXAogICAgIFBST0RVQ1RfRlVMTF9UUkVCTEUgXAorICAgIFBST0RVQ1RfVFJFQkxFX0xJTktFUl9OQU1FU1BBQ0VTIFwKKyAgICBQUk9EVUNUX0VORk9SQ0VfVklOVEZfTUFOSUZFU1QgXAogICAgIFBST0RVQ1RfTk9USUNFX1NQTElUIFwKIAotaWZuZXEgKCQoUFJPRFVDVF9GVUxMX1RSRUJMRSksdHJ1ZSkKLSAgICAkKHdhcm5pbmcgVGhpcyBkZXZpY2UgZG9lcyBub3QgaGF2ZSBUcmVibGUgZW5hYmxlZC4gVGhpcyBpcyB1bnNhZmUuKQotZW5kaWYKLQotJChLQVRJX29ic29sZXRlX3ZhciAkKGZvcmVhY2ggcmVxLCQocmVxdWlyZW1lbnRzKSwkKHJlcSlfT1ZFUlJJREUpIFwKLSAgICAsVGhpcyBzaG91bGQgYmUgcmVmZXJlbmNlZCB3aXRob3V0IHRoZSBfT1ZFUlJJREUgc3VmZml4LikKLQotcmVxdWlyZW1lbnRzIDo9CisjIFRPRE8oYi8xMTQ0ODg4NzApOiByZW1vdmUgYWxsIHNldHMgb2YgdGhlc2UgZXZlcndoZXJlLCBhbmQgZGlzYWxsb3cgdGhlbSB0byBiZSB1c2VkCiskKEtBVElfb2Jzb2xldGVfdmFyIFBST0RVQ1RfVFJFQkxFX0xJTktFUl9OQU1FU1BBQ0VTX09WRVJSSURFLERlcHJlY2F0ZWQuKQorJChLQVRJX29ic29sZXRlX3ZhciBQUk9EVUNUX0VORk9SQ0VfVklOVEZfTUFOSUZFU1RfT1ZFUlJJREUsRGVwcmVjYXRlZC4pCiskKEtBVElfb2Jzb2xldGVfdmFyIFBST0RVQ1RfRlVMTF9UUkVCTEVfT1ZFUlJJREUsRGVwcmVjYXRlZC4pCiAKICMgQk9BUkRfUFJPUEVSVFlfT1ZFUlJJREVTX1NQTElUX0VOQUJMRUQgY2FuIGJlIHRydWUgb25seSBpZiBlYXJseS1tb3VudCBvZgogIyBwYXJ0aXRpb25zIGlzIHN1cHBvcnRlZC4gQnV0IHRoZSBlYXJseS1tb3VudCBtdXN0IGJlIHN1cHBvcnRlZCBmb3IgZnVsbApAQCAtODE3LDYgKzc5NSwxOCBAQAogICBlbmRpZgogZW5kaWYKIAoraWZkZWYgUFJPRFVDVF9DSEVDS19QUkVCVUlMVF9NQVhfUEFHRV9TSVpFCisgIFRBUkdFVF9DSEVDS19QUkVCVUlMVF9NQVhfUEFHRV9TSVpFIDo9ICQoUFJPRFVDVF9DSEVDS19QUkVCVUlMVF9NQVhfUEFHRV9TSVpFKQorZWxzZSBpZmVxICh0cnVlLCQoVEFSR0VUX0JVSUxEX1VOQlVORExFRCkpCisgICMgdW5idW5kbGVkIGJ1aWxkcyBtYXkgbm90IGhhdmUgdXBkYXRlZCBidWlsZCBzb3VyY2VzCisgIFRBUkdFVF9DSEVDS19QUkVCVUlMVF9NQVhfUEFHRV9TSVpFIDo9IGZhbHNlCitlbHNlIGlmbmVxICgkKGNhbGwgbWF0aF9ndF9vcl9lcSwkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKSwzNiksKQorICBUQVJHRVRfQ0hFQ0tfUFJFQlVJTFRfTUFYX1BBR0VfU0laRSA6PSB0cnVlCitlbHNlCisgIFRBUkdFVF9DSEVDS19QUkVCVUlMVF9NQVhfUEFHRV9TSVpFIDo9IGZhbHNlCitlbmRpZgorLktBVElfUkVBRE9OTFkgOj0gVEFSR0VUX0NIRUNLX1BSRUJVSUxUX01BWF9QQUdFX1NJWkUKKwogIyBTZXQgQk9BUkRfU1lTVEVNU0RLX1ZFUlNJT05TIHRvIHRoZSBsYXRlc3QgU3lzdGVtU0RLIHZlcnNpb24gc3RhcnRpbmcgZnJvbSBQLWxhdW5jaGluZwogIyBkZXZpY2VzIGlmIHVuc2V0LgogaWZuZGVmIEJPQVJEX1NZU1RFTVNES19WRVJTSU9OUwpAQCAtODM5LDEyICs4MjksNiBAQAogLktBVElfUkVBRE9OTFkgOj0gQk9BUkRfQ1VSUkVOVF9BUElfTEVWRUxfRk9SX1ZFTkRPUl9NT0RVTEVTCiAKIGlmZGVmIFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMCi0gIGJvYXJkX2FwaV9sZXZlbCA6PSAkKGZpcnN0d29yZCAkKEJPQVJEX0FQSV9MRVZFTCkgJChCT0FSRF9TSElQUElOR19BUElfTEVWRUwpKQotICBpZm5lcSAoLCQoYm9hcmRfYXBpX2xldmVsKSkKLSAgICBtaW5fc3lzdGVtc2RrX3ZlcnNpb24gOj0gJChjYWxsIG1hdGhfbWluLCQoYm9hcmRfYXBpX2xldmVsKSwkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKSkKLSAgZWxzZQotICAgIG1pbl9zeXN0ZW1zZGtfdmVyc2lvbiA6PSAkKFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMKQotICBlbmRpZgogICBpZm5lcSAoJChjYWxsIG1hdGhfZ3Rfb3JfZXEsJChQUk9EVUNUX1NISVBQSU5HX0FQSV9MRVZFTCksMjkpLCkKICAgICBpZm5lcSAoJChCT0FSRF9PVEFfRlJBTUVXT1JLX1ZCTUVUQV9WRVJTSU9OX09WRVJSSURFKSwpCiAgICAgICAkKGVycm9yIFdoZW4gUFJPRFVDVF9TSElQUElOR19BUElfTEVWRUwgPj0gMjksIEJPQVJEX09UQV9GUkFNRVdPUktfVkJNRVRBX1ZFUlNJT05fT1ZFUlJJREUgY2Fubm90IGJlIHNldCkKQEAgLTg4MSwyMCArODY1LDI4IEBACiAuS0FUSV9SRUFET05MWSA6PSBQTEFURk9STV9TRVBPTElDWV9WRVJTSU9OIEJPQVJEX1NFUE9MSUNZX1ZFUlMKIAogIyBBIGxpc3Qgb2YgU0VQb2xpY3kgdmVyc2lvbnMsIGJlc2lkZXMgUExBVEZPUk1fU0VQT0xJQ1lfVkVSU0lPTiwgdGhhdCB0aGUgZnJhbWV3b3JrIHN1cHBvcnRzLgotUExBVEZPUk1fU0VQT0xJQ1lfQ09NUEFUX1ZFUlNJT05TIDo9ICQoZmlsdGVyLW91dCAkKFBMQVRGT1JNX1NFUE9MSUNZX1ZFUlNJT04pLCBcCitQTEFURk9STV9TRVBPTElDWV9DT01QQVRfVkVSU0lPTlMgOj0gXAogICAgIDI5LjAgXAogICAgIDMwLjAgXAogICAgIDMxLjAgXAogICAgIDMyLjAgXAogICAgIDMzLjAgXAogICAgIDM0LjAgXAorCitQTEFURk9STV9TRVBPTElDWV9DT01QQVRfVkVSU0lPTlMgKz0gJChmb3JlYWNoIHZlcixcCiAgICAgMjAyNDA0IFwKLSAgICApCisgICAgMjAyNTA0IFwKKyAgICAsJChpZiAkKGZpbHRlciB0cnVlLCQoY2FsbCBtYXRoX2d0LCQoUExBVEZPUk1fU0VQT0xJQ1lfVkVSU0lPTiksJCh2ZXIpKSksJCh2ZXIpKSkKIAogLktBVElfUkVBRE9OTFkgOj0gXAogICAgIFBMQVRGT1JNX1NFUE9MSUNZX0NPTVBBVF9WRVJTSU9OUyBcCiAgICAgUExBVEZPUk1fU0VQT0xJQ1lfVkVSU0lPTiBcCiAKK0JPQVJEX0dFTkZTX0xBQkVMU19WRVJTSU9OID89ICQoQk9BUkRfQVBJX0xFVkVMKQoraWZlcSAoJChjYWxsIG1hdGhfZ3QsJChCT0FSRF9BUElfTEVWRUwpLCQoQk9BUkRfR0VORlNfTEFCRUxTX1ZFUlNJT04pKSx0cnVlKQorICAkKGVycm9yIEJPQVJEX0dFTkZTX0xBQkVMU19WRVJTSU9OICgkKEJPQVJEX0dFTkZTX0xBQkVMU19WRVJTSU9OKSkgbXVzdCBiZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gQk9BUkRfQVBJX0xFVkVMICgkKEJPQVJEX0FQSV9MRVZFTCkpKQorZW5kaWYKKwogaWZlcSAoJChQUk9EVUNUX1JFVFJPRklUX0RZTkFNSUNfUEFSVElUSU9OUyksdHJ1ZSkKICAgaWZuZXEgKCQoUFJPRFVDVF9VU0VfRFlOQU1JQ19QQVJUSVRJT05TKSx0cnVlKQogICAgICQoZXJyb3IgUFJPRFVDVF9VU0VfRFlOQU1JQ19QQVJUSVRJT05TIG11c3QgYmUgdHJ1ZSB3aGVuIFBST0RVQ1RfUkVUUk9GSVRfRFlOQU1JQ19QQVJUSVRJT05TIFwKQEAgLTEzMDMsMTAgKzEyOTUsNiBAQAogU09PTkdfVkFSSUFCTEVTIDo9CiBTT09OR19FWFRSQV9WQVJJQUJMRVMgOj0KIAotLWluY2x1ZGUgZXh0ZXJuYWwvbHRwL2FuZHJvaWQvbHRwX3BhY2thZ2VfbGlzdC5tawotREVGQVVMVF9EQVRBX09VVF9NT0RVTEVTIDo9IGx0cCAkKGx0cF9wYWNrYWdlcykKLS5LQVRJX1JFQURPTkxZIDo9IERFRkFVTFRfREFUQV9PVVRfTU9EVUxFUwotCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9kdW1wdmFyLm1rCiAKIGlmZGVmIEJPQVJEX1ZOREtfVkVSU0lPTgpAQCAtMTMyMSwzICsxMzA5LDU4IEBACiAkKGVycm9yIFNZU1RFTV9PUFRJTUlaRV9KQVZBIG11c3QgYmUgZW5hYmxlZCB3aGVuIEZVTExfU1lTVEVNX09QVElNSVpFX0pBVkEgaXMgZW5hYmxlZCkKIGVuZGlmCiBlbmRpZgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIERlZmluZSBmaW5nZXJwcmludCwgdGh1bWJwcmludCwgYW5kIHZlcnNpb24gdGFncyBmb3IgdGhlIGN1cnJlbnQgYnVpbGQKKyMKKyMgQlVJTERfVkVSU0lPTl9UQUdTIGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgdGFncyBjaG9zZW4gYnkgdGhlIGRldmljZQorIyBpbXBsZW1lbnRlciB0aGF0IGZ1cnRoZXIgZGlzdGluZ3Vpc2hlcyB0aGUgYnVpbGQuIEl0J3MgYmFzaWNhbGx5IGRlZmluZWQKKyMgYnkgdGhlIGRldmljZSBpbXBsZW1lbnRlci4gSGVyZSwgd2UgYXJlIGFkZGluZyBhIG1hbmRhdG9yeSB0YWcgdGhhdAorIyBpZGVudGlmaWVzIHRoZSBzaWduaW5nIGNvbmZpZyBvZiB0aGUgYnVpbGQuCitCVUlMRF9WRVJTSU9OX1RBR1MgOj0gJChCVUlMRF9WRVJTSU9OX1RBR1MpCitpZmVxICgkKFRBUkdFVF9CVUlMRF9UWVBFKSxkZWJ1ZykKKyAgQlVJTERfVkVSU0lPTl9UQUdTICs9IGRlYnVnCitlbmRpZgorIyBUaGUgInRlc3Qta2V5cyIgdGFnIG1hcmtzIGJ1aWxkcyBzaWduZWQgd2l0aCB0aGUgb2xkIHRlc3Qga2V5cywKKyMgd2hpY2ggYXJlIGF2YWlsYWJsZSBpbiB0aGUgU0RLLiAgImRldi1rZXlzIiBtYXJrcyBidWlsZHMgc2lnbmVkIHdpdGgKKyMgbm9uLWRlZmF1bHQgZGV2IGtleXMgKHVzdWFsbHkgcHJpdmF0ZSBrZXlzIGZyb20gYSB2ZW5kb3IgZGlyZWN0b3J5KS4KKyMgQm90aCBvZiB0aGVzZSB0YWdzIHdpbGwgYmUgcmVtb3ZlZCBhbmQgcmVwbGFjZWQgd2l0aCAicmVsZWFzZS1rZXlzIgorIyB3aGVuIHRoZSB0YXJnZXQtZmlsZXMgaXMgc2lnbmVkIGluIGEgcG9zdC1idWlsZCBzdGVwLgoraWZlcSAoJChERUZBVUxUX1NZU1RFTV9ERVZfQ0VSVElGSUNBVEUpLGJ1aWxkL21ha2UvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvdGVzdGtleSkKK0JVSUxEX0tFWVMgOj0gdGVzdC1rZXlzCitlbHNlCitCVUlMRF9LRVlTIDo9IGRldi1rZXlzCitlbmRpZgorQlVJTERfVkVSU0lPTl9UQUdTICs9ICQoQlVJTERfS0VZUykKK0JVSUxEX1ZFUlNJT05fVEFHUyA6PSAkKHN1YnN0ICQoc3BhY2UpLCQoY29tbWEpLCQoc29ydCAkKEJVSUxEX1ZFUlNJT05fVEFHUykpKQorCisjIEJVSUxEX0ZJTkdFUlBSSU5UIGlzIHVzZWQgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSB0aGUgY29tYmluZWQgYnVpbGQgYW5kCisjIHByb2R1Y3Q7IHVzZWQgYnkgdGhlIE9UQSBzZXJ2ZXIuCitpZmVxICgsJChzdHJpcCAkKEJVSUxEX0ZJTkdFUlBSSU5UKSkpCisgIEJVSUxEX0ZJTkdFUlBSSU5UIDo9ICQoUFJPRFVDVF9CUkFORCkvJChUQVJHRVRfUFJPRFVDVCkvJChUQVJHRVRfREVWSUNFKTokKFBMQVRGT1JNX1ZFUlNJT04pLyQoQlVJTERfSUQpLyQoQlVJTERfTlVNQkVSX0ZST01fRklMRSk6JChUQVJHRVRfQlVJTERfVkFSSUFOVCkvJChCVUlMRF9WRVJTSU9OX1RBR1MpCitlbmRpZgorCitCVUlMRF9GSU5HRVJQUklOVF9GSUxFIDo9ICQoUFJPRFVDVF9PVVQpL2J1aWxkX2ZpbmdlcnByaW50LnR4dAoraWZuZXEgKCwkKHNoZWxsIG1rZGlyIC1wICQoUFJPRFVDVF9PVVQpICYmIGVjaG8gJChCVUlMRF9GSU5HRVJQUklOVCkgPiQoQlVJTERfRklOR0VSUFJJTlRfRklMRSkudG1wICYmIChpZiAhIGNtcCAtcyAkKEJVSUxEX0ZJTkdFUlBSSU5UX0ZJTEUpLnRtcCAkKEJVSUxEX0ZJTkdFUlBSSU5UX0ZJTEUpOyB0aGVuIG12ICQoQlVJTERfRklOR0VSUFJJTlRfRklMRSkudG1wICQoQlVJTERfRklOR0VSUFJJTlRfRklMRSk7IGVsc2Ugcm0gJChCVUlMRF9GSU5HRVJQUklOVF9GSUxFKS50bXA7IGZpKSAmJiBncmVwICIgIiAkKEJVSUxEX0ZJTkdFUlBSSU5UX0ZJTEUpKSkKKyAgJChlcnJvciBCVUlMRF9GSU5HRVJQUklOVCBjYW5ub3QgY29udGFpbiBzcGFjZXM6ICIkKGZpbGUgPCQoQlVJTERfRklOR0VSUFJJTlRfRklMRSkpIikKK2VuZGlmCitCVUlMRF9GSU5HRVJQUklOVF9GUk9NX0ZJTEUgOj0gJCQoY2F0ICQoQlVJTERfRklOR0VSUFJJTlRfRklMRSkpCisjIHVuc2V0IGl0IGZvciBzYWZldHkuCitCVUlMRF9GSU5HRVJQUklOVCA6PQorCisjIEJVSUxEX1RIVU1CUFJJTlQgaXMgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSB0aGUgc3lzdGVtIGJ1aWxkOyB1c2VkIGJ5IHRoZQorIyBPVEEgc2VydmVyLiBUaGlzIHB1cnBvc2VmdWxseSBleGNsdWRlcyBhbnkgcHJvZHVjdC1zcGVjaWZpYyB2YXJpYWJsZXMuCitpZmVxICgsJChzdHJpcCAkKEJVSUxEX1RIVU1CUFJJTlQpKSkKKyAgQlVJTERfVEhVTUJQUklOVCA6PSAkKFBMQVRGT1JNX1ZFUlNJT04pLyQoQlVJTERfSUQpLyQoQlVJTERfTlVNQkVSX0ZST01fRklMRSk6JChUQVJHRVRfQlVJTERfVkFSSUFOVCkvJChCVUlMRF9WRVJTSU9OX1RBR1MpCitlbmRpZgorCitCVUlMRF9USFVNQlBSSU5UX0ZJTEUgOj0gJChQUk9EVUNUX09VVCkvYnVpbGRfdGh1bWJwcmludC50eHQKK2lmZXEgKCQoc3RyaXAgJChIQVNfQlVJTERfTlVNQkVSKSksdHJ1ZSkKKyQoQlVJTERfVEhVTUJQUklOVF9GSUxFKTogJChCVUlMRF9OVU1CRVJfRklMRSkKK2VuZGlmCitpZm5lcSAoLCQoc2hlbGwgbWtkaXIgLXAgJChQUk9EVUNUX09VVCkgJiYgZWNobyAkKEJVSUxEX1RIVU1CUFJJTlQpID4kKEJVSUxEX1RIVU1CUFJJTlRfRklMRSkgJiYgZ3JlcCAiICIgJChCVUlMRF9USFVNQlBSSU5UX0ZJTEUpKSkKKyAgJChlcnJvciBCVUlMRF9USFVNQlBSSU5UIGNhbm5vdCBjb250YWluIHNwYWNlczogIiQoZmlsZSA8JChCVUlMRF9USFVNQlBSSU5UX0ZJTEUpKSIpCitlbmRpZgorIyB1bnNldCBpdCBmb3Igc2FmZXR5LgorQlVJTERfVEhVTUJQUklOVF9GSUxFIDo9CitCVUlMRF9USFVNQlBSSU5UIDo9CmRpZmYgLS1naXQgYS9jb3JlL2NvbmZpZ19zYW5pdGl6ZXJzLm1rIGIvY29yZS9jb25maWdfc2FuaXRpemVycy5tawppbmRleCBhYjJkNWMxLi5jMGYyYzY4IDEwMDY0NAotLS0gYS9jb3JlL2NvbmZpZ19zYW5pdGl6ZXJzLm1rCisrKyBiL2NvcmUvY29uZmlnX3Nhbml0aXplcnMubWsKQEAgLTI4NCw5ICsyODQsOSBAQAogaWZuZXEgKCQoZmlsdGVyIG1lbXRhZ19zdGFjaywkKG15X3Nhbml0aXplKSksKQogICBteV9jZmxhZ3MgKz0gLWZzYW5pdGl6ZT1tZW10YWctc3RhY2sKICAgbXlfbGRmbGFncyArPSAtZnNhbml0aXplPW1lbXRhZy1zdGFjawotICBteV9jZmxhZ3MgKz0gLW1hcmNoPWFybXY4YSttZW10YWcKLSAgbXlfbGRmbGFncyArPSAtbWFyY2g9YXJtdjhhK21lbXRhZwotICBteV9hc2ZsYWdzICs9IC1tYXJjaD1hcm12OGErbWVtdGFnCisgIG15X2NmbGFncyArPSAtWGNsYW5nIC10YXJnZXQtZmVhdHVyZSAtWGNsYW5nICttdGUKKyAgbXlfbGRmbGFncyArPSAtWGNsYW5nIC10YXJnZXQtZmVhdHVyZSAtWGNsYW5nICttdGUKKyAgbXlfYXNmbGFncyArPSAtWGNsYW5nIC10YXJnZXQtZmVhdHVyZSAtWGNsYW5nICttdGUKICAgbXlfc2FuaXRpemUgOj0gJChmaWx0ZXItb3V0IG1lbXRhZ19zdGFjaywkKG15X3Nhbml0aXplKSkKIGVuZGlmCiAKZGlmZiAtLWdpdCBhL2NvcmUvZGVmaW5pdGlvbnMubWsgYi9jb3JlL2RlZmluaXRpb25zLm1rCmluZGV4IGNkMWIzNmUuLjQwZjVhZjAgMTAwNjQ0Ci0tLSBhL2NvcmUvZGVmaW5pdGlvbnMubWsKKysrIGIvY29yZS9kZWZpbml0aW9ucy5tawpAQCAtOTAsOSArOTAsNiBAQAogIyBBbGwgaW5zdGFsbGVkIHZpbnRmIG1hbmlmZXN0IGZyYWdtZW50cyBmb3IgYSBwYXJ0aXRpb24gYXQKIEFMTF9WSU5URl9NQU5JRkVTVF9GUkFHTUVOVFNfTElTVDo9CiAKLSMgQWxsIHRlc3RzIHRoYXQgc2hvdWxkIGJlIHNraXBwZWQgaW4gcHJlc3VibWl0IGNoZWNrLgotQUxMX0RJU0FCTEVEX1BSRVNVQk1JVF9URVNUUyA6PQotCiAjIEFsbCBjb21wYXRpYmlsaXR5IHN1aXRlcyBtZW50aW9uZWQgaW4gTE9DQUxfQ09NUEFUSUJJTElUWV9TVUlURQogQUxMX0NPTVBBVElCSUxJVFlfU1VJVEVTIDo9CiAKQEAgLTE1NTUsNyArMTU1Miw3IEBACiBkZWZpbmUgdHJhbnNmb3JtLWxvZ3RhZ3MtdG8tamF2YQogQG1rZGlyIC1wICQoZGlyICRAKQogQGVjaG8gImxvZ3RhZ3M6ICRAIDw9ICQ8IgotJChoaWRlKSAkKEpBVkFUQUdTKSAtbyAkQCAkPCAkKFBSSVZBVEVfTUVSR0VEX1RBRykKKyQoaGlkZSkgJChKQVZBVEFHUykgLW8gJEAgJDwKIGVuZGVmCiAKIApAQCAtMjYwNSw3ICsyNjAyLDg3IEBACiAgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTA4NTAxLDEwOTAwMCwkKDEpKSwkKDIpKQogICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEwOTAwMSwxMDk1MDAsJCgxKSksJCgyKSkKICAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMDk1MDEsMTEwMDAwLCQoMSkpLCQoMikpCi0gICAgICAgIEAkKGlmICQod29yZGxpc3QgMTEwMDAxLDExMDAwMiwkKDEpKSwkKGVycm9yIGR1bXAtd29yZHMtdG8tZmlsZTogVG9vIG1hbnkgd29yZHMgKCQod29yZHMgJCgxKSkpKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMTAwMDEsMTEwNTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTEwNTAxLDExMTAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDExMTAwMSwxMTE1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMTE1MDEsMTEyMDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTEyMDAxLDExMjUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDExMjUwMSwxMTMwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMTMwMDEsMTEzNTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTEzNTAxLDExNDAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDExNDAwMSwxMTQ1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMTQ1MDEsMTE1MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTE1MDAxLDExNTUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDExNTUwMSwxMTYwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMTYwMDEsMTE2NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTE2NTAxLDExNzAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDExNzAwMSwxMTc1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMTc1MDEsMTE4MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTE4MDAxLDExODUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDExODUwMSwxMTkwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMTkwMDEsMTE5NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTE5NTAxLDEyMDAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEyMDAwMSwxMjA1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMjA1MDEsMTIxMDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTIxMDAxLDEyMTUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEyMTUwMSwxMjIwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMjIwMDEsMTIyNTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTIyNTAxLDEyMzAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEyMzAwMSwxMjM1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMjM1MDEsMTI0MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTI0MDAxLDEyNDUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEyNDUwMSwxMjUwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMjUwMDEsMTI1NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTI1NTAxLDEyNjAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEyNjAwMSwxMjY1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMjY1MDEsMTI3MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTI3MDAxLDEyNzUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEyNzUwMSwxMjgwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMjgwMDEsMTI4NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTI4NTAxLDEyOTAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEyOTAwMSwxMjk1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMjk1MDEsMTMwMDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTMwMDAxLDEzMDUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEzMDUwMSwxMzEwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMzEwMDEsMTMxNTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTMxNTAxLDEzMjAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEzMjAwMSwxMzI1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMzI1MDEsMTMzMDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTMzMDAxLDEzMzUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEzMzUwMSwxMzQwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMzQwMDEsMTM0NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTM0NTAxLDEzNTAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEzNTAwMSwxMzU1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMzU1MDEsMTM2MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTM2MDAxLDEzNjUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEzNjUwMSwxMzcwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMzcwMDEsMTM3NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTM3NTAxLDEzODAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEzODAwMSwxMzg1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxMzg1MDEsMTM5MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTM5MDAxLDEzOTUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDEzOTUwMSwxNDAwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxNDAwMDEsMTQwNTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTQwNTAxLDE0MTAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDE0MTAwMSwxNDE1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxNDE1MDEsMTQyMDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTQyMDAxLDE0MjUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDE0MjUwMSwxNDMwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxNDMwMDEsMTQzNTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTQzNTAxLDE0NDAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDE0NDAwMSwxNDQ1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxNDQ1MDEsMTQ1MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTQ1MDAxLDE0NTUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDE0NTUwMSwxNDYwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxNDYwMDEsMTQ2NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTQ2NTAxLDE0NzAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDE0NzAwMSwxNDc1MDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxNDc1MDEsMTQ4MDAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTQ4MDAxLDE0ODUwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChjYWxsIGVtaXQtbGluZSwkKHdvcmRsaXN0IDE0ODUwMSwxNDkwMDAsJCgxKSksJCgyKSkKKyAgICAgICAgQCQoY2FsbCBlbWl0LWxpbmUsJCh3b3JkbGlzdCAxNDkwMDEsMTQ5NTAwLCQoMSkpLCQoMikpCisgICAgICAgIEAkKGNhbGwgZW1pdC1saW5lLCQod29yZGxpc3QgMTQ5NTAxLDE1MDAwMCwkKDEpKSwkKDIpKQorICAgICAgICBAJChpZiAkKHdvcmRsaXN0IDE1MDAwMSwxNTAwMDIsJCgxKSksJChlcnJvciBkdW1wLXdvcmRzLXRvLWZpbGU6IFRvbyBtYW55IHdvcmRzICgkKHdvcmRzICQoMSkpKSkpCiBlbmRlZgogIyBSZXR1cm4gamFyIGFyZ3VtZW50cyB0byBjb21wcmVzcyBmaWxlcyBpbiBhIGdpdmVuIGRpcmVjdG9yeQogIyAkKDEpOiBkaXJlY3RvcnkKQEAgLTMyMDYsNyArMzI4Myw3IEBACiAJJChoaWRlKSBta2RpciAtcCAiJCQoZGlyICQkQCkiCiAJJChoaWRlKSBybSAtZiAiJCRAIgogCSQoaGlkZSkgXAotCSAgICBpZiAkKExMVk1fUkVBRE9CSikgLWggIiQkPCIgPi9kZXYvbnVsbCAyPiYxOyB0aGVuIFwKKwkgICAgaWYgJChMTFZNX1JFQURPQkopIC1oICIkJDwiIDI+L2Rldi9udWxsIHwgZ3JlcCAtcSAiXkZvcm1hdDogZWxmIjsgdGhlbiBcCiAJICAgICAgICAkKGNhbGwgZWNoby1lcnJvciwkKDIpLCQoMykpOyBcCiAJICAgICAgICAkKGNhbGwgZWNoby1lcnJvciwkKDIpLGZvdW5kIEVMRiBmaWxlOiAkJDwpOyBcCiAJICAgICAgICBmYWxzZTsgXApkaWZmIC0tZ2l0IGEvY29yZS9kZXhfcHJlb3B0Lm1rIGIvY29yZS9kZXhfcHJlb3B0Lm1rCmluZGV4IDkwNmQ3ZjAuLjliNWUxZGIgMTAwNjQ0Ci0tLSBhL2NvcmUvZGV4X3ByZW9wdC5taworKysgYi9jb3JlL2RleF9wcmVvcHQubWsKQEAgLTEzLDI4ICsxMyw2IEBACiBpbnN0YWxsLW9uLXN5c3RlbS1vdGhlciA9ICQoZmlsdGVyLW91dCAkKFBST0RVQ1RfREVYUFJFT1BUX1NQRUVEX0FQUFMpICQoUFJPRFVDVF9TWVNURU1fU0VSVkVSX0FQUFMpLCQoYmFzZW5hbWUgJChub3RkaXIgJChmaWx0ZXIgJChmb3JlYWNoIGYsJChTWVNURU1fT1RIRVJfT0RFWF9GSUxURVIpLCQoVEFSR0VUX09VVCkvJChmKSksJCgxKSkpKSkKIGVuZGlmCiAKLSMgSW5zdGFsbCBib290IGltYWdlcyBmb3IgdGVzdGluZyBvbiBob3N0LiBXZSBleGNsdWRlIGZyYW1ld29yayBpbWFnZSBhcyBpdCBpcyBub3QgcGFydCBvZiBhcnQgbWFuaWZlc3QuCi1teV9ib290X2ltYWdlX2FyY2ggOj0gSE9TVF9BUkNICi1teV9ib290X2ltYWdlX291dCA6PSAkKEhPU1RfT1VUKQotbXlfYm9vdF9pbWFnZV9zeW1zIDo9ICQoSE9TVF9PVVQpL3N5bWJvbHMKLUhPU1RfQk9PVF9JTUFHRV9NT0RVTEUgOj0gXAotICAkKGZvcmVhY2ggbXlfYm9vdF9pbWFnZV9uYW1lLGFydF9ob3N0LCQoc3RyaXAgXAotICAgICQoZXZhbCBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9kZXhfcHJlb3B0X2xpYmFydC5taykgXAotICAgICQobXlfYm9vdF9pbWFnZV9tb2R1bGUpKSkKLUhPU1RfQk9PVF9JTUFHRSA6PSAkKGNhbGwgbW9kdWxlLWluc3RhbGxlZC1maWxlcywkKEhPU1RfQk9PVF9JTUFHRV9NT0RVTEUpKQotaWZkZWYgSE9TVF8yTkRfQVJDSAotICBteV9ib290X2ltYWdlX2FyY2ggOj0gSE9TVF8yTkRfQVJDSAotICAyTkRfSE9TVF9CT09UX0lNQUdFX01PRFVMRSA6PSBcCi0gICAgJChmb3JlYWNoIG15X2Jvb3RfaW1hZ2VfbmFtZSxhcnRfaG9zdCwkKHN0cmlwIFwKLSAgICAgICQoZXZhbCBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS9kZXhfcHJlb3B0X2xpYmFydC5taykgXAotICAgICAgJChteV9ib290X2ltYWdlX21vZHVsZSkpKQotICAyTkRfSE9TVF9CT09UX0lNQUdFIDo9ICQoY2FsbCBtb2R1bGUtaW5zdGFsbGVkLWZpbGVzLCQoMk5EX0hPU1RfQk9PVF9JTUFHRV9NT0RVTEUpKQotZW5kaWYKLW15X2Jvb3RfaW1hZ2VfYXJjaCA6PQotbXlfYm9vdF9pbWFnZV9vdXQgOj0KLW15X2Jvb3RfaW1hZ2Vfc3ltcyA6PQotbXlfYm9vdF9pbWFnZV9tb2R1bGUgOj0KLQogIyBCdWlsZCB0aGUgYm9vdC56aXAgd2hpY2ggY29udGFpbnMgdGhlIGJvb3QgamFycyBhbmQgdGhlaXIgY29tcGlsYXRpb24gb3V0cHV0CiAjIFdlIGNhbiBkbyB0aGlzIG9ubHkgaWYgcHJlb3B0IGlzIGVuYWJsZWQgYW5kIGlmIHRoZSBwcm9kdWN0IHVzZXMgbGliYXJ0IGNvbmZpZyAod2hpY2ggc2V0cyB0aGUKICMgZGVmYXVsdCBwcm9wZXJ0aWVzIGZvciBwcmVvcHRpbmcpLgpAQCAtMTA0LDQyICs4Miw2IEBACiAKICQoY2FsbCBkaXN0LWZvci1nb2FscywgZHJvaWRjb3JlLCAkKGJvb3RfemlwKSkKIAotIyBCdWlsZCB0aGUgc3lzdGVtX3NlcnZlci56aXAgd2hpY2ggY29udGFpbnMgdGhlIEFwZXggc3lzdGVtIHNlcnZlciBqYXJzIGFuZCBzdGFuZGFsb25lIHN5c3RlbSBzZXJ2ZXIgamFycwotc3lzdGVtX3NlcnZlcl9kZXgyb2F0X2RpciA6PSAkKFNPT05HX09VVF9ESVIpL3N5c3RlbV9zZXJ2ZXJfZGV4amFycwotc3lzdGVtX3NlcnZlcl96aXAgOj0gJChQUk9EVUNUX09VVCkvc3lzdGVtX3NlcnZlci56aXAKLSMgbm9uX3VwZGF0YWJsZV9zeXN0ZW1fc2VydmVyX2phcnMgY29udGFpbnMgamFycyBpbiAvc3lzdGVtIGFuZCAvc3lzdGVtX2V4dCB0aGF0IGFyZSBub3QgcGFydCBvZiBhbiBhcGV4Lgotbm9uX3VwZGF0YWJsZV9zeXN0ZW1fc2VydmVyX2phcnMgOj0gXAotICAkKGZvcmVhY2ggbSwkKFBST0RVQ1RfU1lTVEVNX1NFUlZFUl9KQVJTKSxcCi0gICAgJChzeXN0ZW1fc2VydmVyX2RleDJvYXRfZGlyKS8kKGNhbGwgd29yZC1jb2xvbiwyLCQobSkpLmphcikKLQotYXBleF9zeXN0ZW1fc2VydmVyX2phcnMgOj0gXAotICAkKGZvcmVhY2ggbSwkKFBST0RVQ1RfQVBFWF9TWVNURU1fU0VSVkVSX0pBUlMpLFwKLSAgICAkKHN5c3RlbV9zZXJ2ZXJfZGV4Mm9hdF9kaXIpLyQoY2FsbCB3b3JkLWNvbG9uLDIsJChtKSkuamFyKQotCi1hcGV4X3N0YW5kYWxvbmVfc3lzdGVtX3NlcnZlcl9qYXJzIDo9IFwKLSAgJChmb3JlYWNoIG0sJChQUk9EVUNUX0FQRVhfU1RBTkRBTE9ORV9TWVNURU1fU0VSVkVSX0pBUlMpLFwKLSAgICAkKHN5c3RlbV9zZXJ2ZXJfZGV4Mm9hdF9kaXIpLyQoY2FsbCB3b3JkLWNvbG9uLDIsJChtKSkuamFyKQotCi1zdGFuZGFsb25lX3N5c3RlbV9zZXJ2ZXJfamFycyA6PSBcCi0gICQoZm9yZWFjaCBtLCQoUFJPRFVDVF9TVEFOREFMT05FX1NZU1RFTV9TRVJWRVJfSkFSUyksXAotICAgICQoc3lzdGVtX3NlcnZlcl9kZXgyb2F0X2RpcikvJChjYWxsIHdvcmQtY29sb24sMiwkKG0pKS5qYXIpCi0KLSQoc3lzdGVtX3NlcnZlcl96aXApOiBQUklWQVRFX1NZU1RFTV9TRVJWRVJfREVYMk9BVF9ESVIgOj0gJChzeXN0ZW1fc2VydmVyX2RleDJvYXRfZGlyKQotJChzeXN0ZW1fc2VydmVyX3ppcCk6IFBSSVZBVEVfU1lTVEVNX1NFUlZFUl9KQVJTIDo9ICQobm9uX3VwZGF0YWJsZV9zeXN0ZW1fc2VydmVyX2phcnMpCi0kKHN5c3RlbV9zZXJ2ZXJfemlwKTogUFJJVkFURV9BUEVYX1NZU1RFTV9TRVJWRVJfSkFSUyA6PSAkKGFwZXhfc3lzdGVtX3NlcnZlcl9qYXJzKQotJChzeXN0ZW1fc2VydmVyX3ppcCk6IFBSSVZBVEVfQVBFWF9TVEFOREFMT05FX1NZU1RFTV9TRVJWRVJfSkFSUyA6PSAkKGFwZXhfc3RhbmRhbG9uZV9zeXN0ZW1fc2VydmVyX2phcnMpCi0kKHN5c3RlbV9zZXJ2ZXJfemlwKTogUFJJVkFURV9TVEFOREFMT05FX1NZU1RFTV9TRVJWRVJfSkFSUyA6PSAkKHN0YW5kYWxvbmVfc3lzdGVtX3NlcnZlcl9qYXJzKQotJChzeXN0ZW1fc2VydmVyX3ppcCk6ICQoc3lzdGVtX3NlcnZlcl9qYXJzKSAkKGFwZXhfc3lzdGVtX3NlcnZlcl9qYXJzKSAkKGFwZXhfc3RhbmRhbG9uZV9zeXN0ZW1fc2VydmVyX2phcnMpICQoc3RhbmRhbG9uZV9zeXN0ZW1fc2VydmVyX2phcnMpICQoU09PTkdfWklQKQotCUBlY2hvICJDcmVhdGUgc3lzdGVtIHNlcnZlciBwYWNrYWdlOiAkQCIKLQlybSAtZiAkQAotCSQoU09PTkdfWklQKSAtbyAkQCBcCi0JICAtQyAkKFBSSVZBVEVfU1lTVEVNX1NFUlZFUl9ERVgyT0FUX0RJUikgJChhZGRwcmVmaXggLWYgLCQoUFJJVkFURV9TWVNURU1fU0VSVkVSX0pBUlMpKSBcCi0JICAtQyAkKFBSSVZBVEVfU1lTVEVNX1NFUlZFUl9ERVgyT0FUX0RJUikgJChhZGRwcmVmaXggLWYgLCQoUFJJVkFURV9BUEVYX1NZU1RFTV9TRVJWRVJfSkFSUykpIFwKLQkgIC1DICQoUFJJVkFURV9TWVNURU1fU0VSVkVSX0RFWDJPQVRfRElSKSAkKGFkZHByZWZpeCAtZiAsJChQUklWQVRFX0FQRVhfU1RBTkRBTE9ORV9TWVNURU1fU0VSVkVSX0pBUlMpKSBcCi0JICAtQyAkKFBSSVZBVEVfU1lTVEVNX1NFUlZFUl9ERVgyT0FUX0RJUikgJChhZGRwcmVmaXggLWYgLCQoUFJJVkFURV9TVEFOREFMT05FX1NZU1RFTV9TRVJWRVJfSkFSUykpCi0KLSQoY2FsbCBkaXN0LWZvci1nb2FscywgZHJvaWRjb3JlLCAkKHN5c3RlbV9zZXJ2ZXJfemlwKSkKLQogZW5kaWYgICNQUk9EVUNUX1VTRVNfREVGQVVMVF9BUlRfQ09ORklHCiBlbmRpZiAgI1dJVEhfREVYUFJFT1BUX0FSVF9CT09UX0lNR19PTkxZCiBlbmRpZiAgI1dJVEhfREVYUFJFT1BUCmRpZmYgLS1naXQgYS9jb3JlL2RleF9wcmVvcHRfbGliYXJ0Lm1rIGIvY29yZS9kZXhfcHJlb3B0X2xpYmFydC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJjOTk0Mi4uMDAwMDAwMAotLS0gYS9jb3JlL2RleF9wcmVvcHRfbGliYXJ0Lm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTA5ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBBUlQgYm9vdCBpbWFnZSBpbnN0YWxsYXRpb24KLSMgSW5wdXQgdmFyaWFibGVzOgotIyAgIG15X2Jvb3RfaW1hZ2VfbmFtZTogdGhlIGJvb3QgaW1hZ2UgdG8gaW5zdGFsbAotIyAgIG15X2Jvb3RfaW1hZ2VfYXJjaDogdGhlIGFyY2hpdGVjdHVyZSB0byBpbnN0YWxsIChlLmcuIFRBUkdFVF9BUkNILCBub3QgZXhwYW5kZWQpCi0jICAgbXlfYm9vdF9pbWFnZV9vdXQ6ICB0aGUgaW5zdGFsbCBkaXJlY3RvcnkgKGUuZy4gJChQUk9EVUNUX09VVCkpCi0jICAgbXlfYm9vdF9pbWFnZV9zeW1zOiB0aGUgc3ltYm9scyBkaXJlY3RvciAoZS5nLiAkKFRBUkdFVF9PVVRfVU5TVFJJUFBFRCkpCi0jCi0jIE91dHB1dCB2YXJpYWJsZXM6Ci0jICAgbXlfYm9vdF9pbWFnZV9tb2R1bGU6IHRoZSBjcmVhdGVkIG1vZHVsZSBuYW1lLiBFbXB0eSBpZiBubyBtb2R1bGUgaXMgY3JlYXRlZC4KLSMKLSMgSW5zdGFsbCB0aGUgYm9vdCBpbWFnZXMgY29tcGlsZWQgYnkgU29vbmcuCi0jIENyZWF0ZSBhIG1vZHVsZSBuYW1lZCBkZXhwcmVvcHRfYm9vdGphci4kKG15X2Jvb3RfaW1hZ2VfbmFtZSlfJCgkKG15X2Jvb3RfaW1hZ2VfYXJjaCkpCi0jIHRoYXQgaW5zdGFsbHMgYWxsIG9mIGJvb3QgaW1hZ2UgZmlsZXMuCi0jIElmIHRoZXJlIGlzIG5vIGZpbGUgdG8gaW5zdGFsbCBmb3IgJChteV9ib290X2ltYWdlX25hbWUpLCBmb3IgZXhhbXBsZSB3aGVuCi0jIGJ1aWxkaW5nIGFuIHVuYnVuZGxlZCBidWlsZCwgdGhlbiBubyBtb2R1bGUgaXMgY3JlYXRlZC4KLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0jIFRha2VzIGEgbGlzdCBvZiBzcmM6ZGVzdCBpbnN0YWxsIHBhaXJzIGFuZCByZXR1cm5zIGEgbmV3IGxpc3Qgd2l0aCBhIHBhdGgKLSMgcHJlZml4ZWQgdG8gZWFjaCBkZXN0IHZhbHVlLgotIyAkKDEpOiBsaXN0IG9mIHNyYzpkZXN0IGluc3RhbGwgcGFpcnMKLSMgJCgyKTogcGF0aCB0byBwcmVmaXggdG8gZWFjaCBkZXN0IHZhbHVlCi1kZWZpbmUgcHJlZml4LWNvcHktbWFueS1maWxlcy1kZXN0Ci0kKGZvcmVhY2ggdiwkKDEpLCQoY2FsbCB3b3JkLWNvbG9uLDEsJCh2KSk6JCgyKSQoY2FsbCB3b3JkLWNvbG9uLDIsJCh2KSkpCi1lbmRlZgotCi0jIENvbnZlcnRzIGFuIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyB2ZGV4IHBhdGggaW50byBhIGxvY2F0aW9uIHRoYXQgY2FuIGJlIHNoYXJlZAotIyBiZXR3ZWVuIGFyY2hpdGVjdHVyZXMuCi1kZWZpbmUgdmRleC1zaGFyZWQtaW5zdGFsbC1wYXRoCi0kKGRpciAkKHBhdHN1YnN0ICUvLCUsJChkaXIgJCgxKSkpKSQobm90ZGlyICQoMSkpCi1lbmRlZgotCi0jIFRha2VzIGEgbGlzdCBvZiBzcmM6ZGVzdCBpbnN0YWxsIHBhaXJzIG9mIHZkZXggZmlsZXMgYW5kIHJldHVybnMgYSBuZXcgbGlzdAotIyB3aGVyZSBlYWNoIGRlc3QgaGFzIGJlZW4gcmV3cml0dGVuIHRvIHRoZSBzaGFyZWQgbG9jYXRpb24gZm9yIHZkZXggZmlsZXMuCi1kZWZpbmUgdmRleC1jb3B5LW1hbnktZmlsZXMtc2hhcmVkLWRlc3QKLSQoZm9yZWFjaCB2LCQoMSksJChjYWxsIHdvcmQtY29sb24sMSwkKHYpKTokKGNhbGwgdmRleC1zaGFyZWQtaW5zdGFsbC1wYXRoLCQoY2FsbCB3b3JkLWNvbG9uLDIsJCh2KSkpKQotZW5kZWYKLQotIyBDcmVhdGVzIGEgcnVsZSB0byBzeW1saW5rIGFuIGFyY2hpdGVjdHVyZSBzcGVjaWZpYyB2ZGV4IGZpbGUgdG8gdGhlIHNoYXJlZAotIyBsb2NhdGlvbiBmb3IgdGhhdCB2ZGV4IGZpbGUuCi1kZWZpbmUgc3ltbGluay12ZGV4LWZpbGUKLSQoc3RyaXAgXAotICAkKGNhbGwgc3ltbGluay1maWxlLFwKLSAgICAkKGNhbGwgdmRleC1zaGFyZWQtaW5zdGFsbC1wYXRoLCQoMSkpLFwKLSAgICAuLi8kKG5vdGRpciAkKDEpKSxcCi0gICAgJCgxKSlcCi0gICQoMSkpCi1lbmRlZgotCi0jIFRha2VzIGEgbGlzdCBvZiBzcmM6ZGVzdCBpbnN0YWxsIHBhaXJzIG9mIHZkZXggZmlsZXMgYW5kIGNyZWF0ZXMgcnVsZXMgdG8KLSMgc3ltbGluayBlYWNoIGRlc3QgdG8gdGhlIHNoYXJlZCBsb2NhdGlvbiBmb3IgdGhhdCB2ZGV4IGZpbGUuCi1kZWZpbmUgc3ltbGluay12ZGV4LWZpbGVzCi0kKGZvcmVhY2ggdiwkKDEpLCQoY2FsbCBzeW1saW5rLXZkZXgtZmlsZSwkKGNhbGwgd29yZC1jb2xvbiwyLCQodikpKSkKLWVuZGVmCi0KLW15X2Jvb3RfaW1hZ2VfbW9kdWxlIDo9Ci0KLW15X3N1ZmZpeCA6PSAkKG15X2Jvb3RfaW1hZ2VfbmFtZSlfJCgkKG15X2Jvb3RfaW1hZ2VfYXJjaCkpCi1teV9jb3B5X3BhaXJzIDo9ICQoY2FsbCBwcmVmaXgtY29weS1tYW55LWZpbGVzLWRlc3QsJChERVhQUkVPUFRfSU1BR0VfQlVJTFRfSU5TVEFMTEVEXyQobXlfc3VmZml4KSksJChteV9ib290X2ltYWdlX291dCkpCi1teV92ZGV4X2NvcHlfcGFpcnMgOj0gJChjYWxsIHByZWZpeC1jb3B5LW1hbnktZmlsZXMtZGVzdCwkKERFWFBSRU9QVF9JTUFHRV9WREVYX0JVSUxUX0lOU1RBTExFRF8kKG15X3N1ZmZpeCkpLCQobXlfYm9vdF9pbWFnZV9vdXQpKQotbXlfdmRleF9jb3B5X3NoYXJlZF9wYWlycyA6PSAkKGNhbGwgdmRleC1jb3B5LW1hbnktZmlsZXMtc2hhcmVkLWRlc3QsJChteV92ZGV4X2NvcHlfcGFpcnMpKQotaWZlcSAoLCQoZmlsdGVyICVfMk5EX0FSQ0gsJChteV9ib290X2ltYWdlX2FyY2gpKSkKLSAgIyBPbmx5IGluc3RhbGwgdGhlIHZkZXggdG8gdGhlIHNoYXJlZCBsb2NhdGlvbiBmb3IgdGhlIHByaW1hcnkgYXJjaGl0ZWN0dXJlLgotICBteV9jb3B5X3BhaXJzICs9ICQobXlfdmRleF9jb3B5X3NoYXJlZF9wYWlycykKLWVuZGlmCi0KLW15X3Vuc3RyaXBwZWRfY29weV9wYWlycyA6PSAkKGNhbGwgcHJlZml4LWNvcHktbWFueS1maWxlcy1kZXN0LCQoREVYUFJFT1BUX0lNQUdFX1VOU1RSSVBQRURfQlVJTFRfSU5TVEFMTEVEXyQobXlfc3VmZml4KSksJChteV9ib290X2ltYWdlX3N5bXMpKQotCi0jIEdlbmVyYXRlIHRoZSBib290IGltYWdlIG1vZHVsZSBvbmx5IGlmIHRoZXJlIGlzIGFueSBmaWxlIHRvIGluc3RhbGwuCi1pZm5lcSAoLCQoc3RyaXAgJChteV9jb3B5X3BhaXJzKSkpCi0gIG15X2ZpcnN0X3BhaXIgOj0gJChmaXJzdHdvcmQgJChteV9jb3B5X3BhaXJzKSkKLSAgbXlfcmVzdF9wYWlycyA6PSAkKHdvcmRsaXN0IDIsJCh3b3JkcyAkKG15X2NvcHlfcGFpcnMpKSwkKG15X2NvcHlfcGFpcnMpKQotCi0gIG15X2ZpcnN0X3NyYyA6PSAkKGNhbGwgd29yZC1jb2xvbiwxLCQobXlfZmlyc3RfcGFpcikpCi0gIG15X2ZpcnN0X2Rlc3QgOj0gJChjYWxsIHdvcmQtY29sb24sMiwkKG15X2ZpcnN0X3BhaXIpKQotCi0gIG15X2luc3RhbGxlZCA6PSAkKGNhbGwgY29weS1tYW55LWZpbGVzLCQobXlfY29weV9wYWlycykpCi0gIG15X3Vuc3RyaXBwZWRfaW5zdGFsbGVkIDo9ICQoY2FsbCBjb3B5LW1hbnktZmlsZXMsJChteV91bnN0cmlwcGVkX2NvcHlfcGFpcnMpKQotCi0gIG15X3N5bWxpbmtzIDo9ICQoY2FsbCBzeW1saW5rLXZkZXgtZmlsZXMsJChteV92ZGV4X2NvcHlfcGFpcnMpKQotCi0gICMgV2UgZG9uJ3QgaGF2ZSBhIExPQ0FMX1BBVEggZm9yIHRoZSBhdXRvLWdlbmVyYXRlZCBtb2R1bGVzLCBzbyBsZXQgaXQgYmUgdGhlICQoQlVJTERfU1lTVEVNKS4KLSAgTE9DQUxfUEFUSCA6PSAkKEJVSUxEX1NZU1RFTSkKLSAgIyBIYWNrIHRvIGxldCB0aGVzZSBwc2V1ZG8tbW9kdWxlcyB3cmFwcGVkIGFyb3VuZCBTb29uZyBtb2R1bGVzIHVzZSBMT0NBTF9TT09OR19JTlNUQUxMRURfTU9EVUxFLgotICBMT0NBTF9NT0RVTEVfTUFLRUZJTEUgOj0gJChTT09OR19BTkRST0lEX01LKQotCi0gIGluY2x1ZGUgJChDTEVBUl9WQVJTKQotICBMT0NBTF9NT0RVTEUgOj0gZGV4cHJlb3B0X2Jvb3RqYXIuJChteV9zdWZmaXgpCi0gIExPQ0FMX1BSRUJVSUxUX01PRFVMRV9GSUxFIDo9ICQobXlfZmlyc3Rfc3JjKQotICBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKGRpciAkKG15X2ZpcnN0X2Rlc3QpKQotICBMT0NBTF9NT0RVTEVfU1RFTSA6PSAkKG5vdGRpciAkKG15X2ZpcnN0X2Rlc3QpKQotICBMT0NBTF9TT09OR19JTlNUQUxMX1BBSVJTIDo9ICQobXlfY29weV9wYWlycykKLSAgTE9DQUxfU09PTkdfSU5TVEFMTF9TWU1MSU5LUyA6PSAkKG15X3N5bWxpbmtzKQotICBMT0NBTF9TT09OR19JTlNUQUxMRURfTU9EVUxFIDo9ICQobXlfZmlyc3RfZGVzdCkKLSAgTE9DQUxfU09PTkdfTElDRU5TRV9NRVRBREFUQSA6PSAkKERFWFBSRU9QVF9JTUFHRV9MSUNFTlNFX01FVEFEQVRBXyQobXlfc3VmZml4KSkKLSAgaWZuZXEgKCwkKHN0cmlwICQoZmlsdGVyIEhPU1RfJSwkKG15X2Jvb3RfaW1hZ2VfYXJjaCkpKSkKLSAgICBMT0NBTF9JU19IT1NUX01PRFVMRSA6PSB0cnVlCi0gIGVuZGlmCi0gIExPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLSAgaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQotICAkKExPQ0FMX0JVSUxUX01PRFVMRSk6IHwgJChteV91bnN0cmlwcGVkX2luc3RhbGxlZCkKLSAgIyBJbnN0YWxsaW5nIGJvb3QuYXJ0IGNhdXNlcyBhbGwgYm9vdCBpbWFnZSBiaXRzIHRvIGJlIGluc3RhbGxlZC4KLSAgIyBLZWVwIHRoaXMgb2xkIGJlaGF2aW9yIGluIGNhc2UgYW55b25lIHN0aWxsIG5lZWRzIGl0LgotICAkKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpOiAkKHdvcmRsaXN0IDIsJCh3b3JkcyAkKG15X2luc3RhbGxlZCkpLCQobXlfaW5zdGFsbGVkKSkgJChteV9zeW1saW5rcykKLSAgJChteV9hbGxfdGFyZ2V0cyk6ICQobXlfaW5zdGFsbGVkKSAkKG15X3N5bWxpbmtzKQotCi0gIG15X2Jvb3RfaW1hZ2VfbW9kdWxlIDo9ICQoTE9DQUxfTU9EVUxFKQotZW5kaWYgICMgbXlfY29weV9wYWlycyAhPSBlbXB0eQpkaWZmIC0tZ2l0IGEvY29yZS9kZXhfcHJlb3B0X29kZXhfaW5zdGFsbC5tayBiL2NvcmUvZGV4X3ByZW9wdF9vZGV4X2luc3RhbGwubWsKaW5kZXggZTcwODZiNy4uNmZlOWQzOCAxMDA2NDQKLS0tIGEvY29yZS9kZXhfcHJlb3B0X29kZXhfaW5zdGFsbC5taworKysgYi9jb3JlL2RleF9wcmVvcHRfb2RleF9pbnN0YWxsLm1rCkBAIC0xNTIsNyArMTUyLDcgQEAKICMgdGhpcyBkZXhwcmVvcHQuY29uZmlnIGlzIGdlbmVyYXRlZC4gU28gaXQncyBuZWNlc3NhcnkgdG8gYWRkIGZpbGUtbGV2ZWwKICMgZGVwZW5kZW5jaWVzIGJldHdlZW4gZGV4cHJlb3B0LmNvbmZpZyBmaWxlcy4KIG15X2RleHByZW9wdF9kZXBfY29uZmlncyA6PSAkKGZvcmVhY2ggbGliLCBcCi0gICQoZmlsdGVyLW91dCAkKG15X2RleHByZW9wdF9saWJzX2NvbXBhdCksJChMT0NBTF9VU0VTX0xJQlJBUklFUykgJChteV9maWx0ZXJlZF9vcHRpb25hbF91c2VzX2xpYnJhcmllcykpLCBcCisgICQoZmlsdGVyLW91dCAkKG15X2RleHByZW9wdF9saWJzX2NvbXBhdCkgJChGUkFNRVdPUktfTElCUkFSSUVTKSwkKExPQ0FMX1VTRVNfTElCUkFSSUVTKSAkKG15X2ZpbHRlcmVkX29wdGlvbmFsX3VzZXNfbGlicmFyaWVzKSksIFwKICAgJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixKQVZBX0xJQlJBUklFUywkKGxpYiksLCkvZGV4cHJlb3B0LmNvbmZpZykKIAogIyAxOiBTREsgdmVyc2lvbgpkaWZmIC0tZ2l0IGEvY29yZS9lbnZzZXR1cC5tayBiL2NvcmUvZW52c2V0dXAubWsKaW5kZXggYzA2M2Y2MC4uZjgyZTg2MSAxMDA2NDQKLS0tIGEvY29yZS9lbnZzZXR1cC5taworKysgYi9jb3JlL2VudnNldHVwLm1rCkBAIC00MTcsNiArNDE3LDcgQEAKIEhPU1RfT1VUX05BVElWRV9URVNUUyA6PSAkKEhPU1RfT1VUKS9uYXRpdmV0ZXN0NjQKIEhPU1RfT1VUX0NPVkVSQUdFIDo9ICQoSE9TVF9PVVQpL2NvdmVyYWdlCiBIT1NUX09VVF9URVNUQ0FTRVMgOj0gJChIT1NUX09VVCkvdGVzdGNhc2VzCitIT1NUX09VVF9FVEMgOj0gJChIT1NUX09VVCkvZXRjCiAuS0FUSV9SRUFET05MWSA6PSBcCiAgIEhPU1RfT1VUX0VYRUNVVEFCTEVTIFwKICAgSE9TVF9PVVRfU0hBUkVEX0xJQlJBUklFUyBcCkBAIC00MjUsNyArNDI2LDggQEAKICAgSE9TVF9PVVRfU0RLX0FERE9OIFwKICAgSE9TVF9PVVRfTkFUSVZFX1RFU1RTIFwKICAgSE9TVF9PVVRfQ09WRVJBR0UgXAotICBIT1NUX09VVF9URVNUQ0FTRVMKKyAgSE9TVF9PVVRfVEVTVENBU0VTIFwKKyAgSE9TVF9PVVRfRVRDCiAKIEhPU1RfQ1JPU1NfT1VUX0VYRUNVVEFCTEVTIDo9ICQoSE9TVF9DUk9TU19PVVQpL2JpbgogSE9TVF9DUk9TU19PVVRfU0hBUkVEX0xJQlJBUklFUyA6PSAkKEhPU1RfQ1JPU1NfT1VUKS9saWIKZGlmZiAtLWdpdCBhL2NvcmUvamF2YS5tayBiL2NvcmUvamF2YS5tawppbmRleCA1ZmJjOTE2Li40MWExYjFiIDEwMDY0NAotLS0gYS9jb3JlL2phdmEubWsKKysrIGIvY29yZS9qYXZhLm1rCkBAIC0xNDAsOCArMTQwLDcgQEAKIGxvZ3RhZ3NfamF2YV9zb3VyY2VzIDo9ICQocGF0c3Vic3QgJS5sb2d0YWdzLCUuamF2YSwkKGFkZHByZWZpeCAkKGludGVybWVkaWF0ZXMuQ09NTU9OKS9sb2d0YWdzLywgJChsb2d0YWdzX3NvdXJjZXMpKSkKIGxvZ3RhZ3Nfc291cmNlcyA6PSAkKGFkZHByZWZpeCAkKExPQ0FMX1BBVEgpLywgJChsb2d0YWdzX3NvdXJjZXMpKQogCi0kKGxvZ3RhZ3NfamF2YV9zb3VyY2VzKTogUFJJVkFURV9NRVJHRURfVEFHIDo9ICQoVEFSR0VUX09VVF9DT01NT05fSU5URVJNRURJQVRFUykvYWxsLWV2ZW50LWxvZy10YWdzLnR4dAotJChsb2d0YWdzX2phdmFfc291cmNlcyk6ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2xvZ3RhZ3MvJS5qYXZhOiAkKExPQ0FMX1BBVEgpLyUubG9ndGFncyAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL2FsbC1ldmVudC1sb2ctdGFncy50eHQgJChKQVZBVEFHUykgYnVpbGQvbWFrZS90b29scy9ldmVudF9sb2dfdGFncy5weQorJChsb2d0YWdzX2phdmFfc291cmNlcyk6ICQoaW50ZXJtZWRpYXRlcy5DT01NT04pL2xvZ3RhZ3MvJS5qYXZhOiAkKExPQ0FMX1BBVEgpLyUubG9ndGFncyAkKEpBVkFUQUdTKQogCSQodHJhbnNmb3JtLWxvZ3RhZ3MtdG8tamF2YSkKIAogZWxzZQpkaWZmIC0tZ2l0IGEvY29yZS9qYXZhX2NvbW1vbi5tayBiL2NvcmUvamF2YV9jb21tb24ubWsKaW5kZXggYTIxZjA2Mi4uZjU3NGI3NiAxMDA2NDQKLS0tIGEvY29yZS9qYXZhX2NvbW1vbi5taworKysgYi9jb3JlL2phdmFfY29tbW9uLm1rCkBAIC0zMiw3ICszMiw3IEBACiAgICAgZWxzZSBpZm5lcSAoLCQoTE9DQUxfU0RLX1ZFUlNJT04pJChUQVJHRVRfQlVJTERfVVNFX1BSRUJVSUxUX1NES1MpKQogICAgICAgIyBUT0RPKGNjcm9zcyk6IGFsbG93IDEuOSBmb3IgY3VycmVudCBhbmQgdW5idW5kbGVkIG9uY2Ugd2UgaGF2ZSBTREsgc3lzdGVtIG1vZHVsZXMKICAgICAgIExPQ0FMX0pBVkFfTEFOR1VBR0VfVkVSU0lPTiA6PSAxLjgKLSAgICBlbHNlIGlmZXEgKCQoRVhQRVJJTUVOVEFMX1RBUkdFVF9KQVZBX1ZFUlNJT05fMjEpLHRydWUpCisgICAgZWxzZSBpZmVxICgkKFJFTEVBU0VfVEFSR0VUX0pBVkFfMjEpLHRydWUpCiAgICAgICBMT0NBTF9KQVZBX0xBTkdVQUdFX1ZFUlNJT04gOj0gMjEKICAgICBlbHNlCiAgICAgICBMT0NBTF9KQVZBX0xBTkdVQUdFX1ZFUlNJT04gOj0gMTcKZGlmZiAtLWdpdCBhL2NvcmUvbGF5b3V0bGliX2RhdGEubWsgYi9jb3JlL2xheW91dGxpYl9kYXRhLm1rCmluZGV4IGU0MjBhMDAuLmRhYmNmYjIgMTAwNjQ0Ci0tLSBhL2NvcmUvbGF5b3V0bGliX2RhdGEubWsKKysrIGIvY29yZS9sYXlvdXRsaWJfZGF0YS5tawpAQCAtMzEsOCArMzEsMTggQEAKIAkkKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKQogCSQoaGlkZSkgY3AgLXZmICQ8ICRACiAKLSMgTGlzdCBvZiBhbGwgZGF0YSBmaWxlcyAtIGZvbnQgZmlsZXMsIGZvbnQgY29uZmlndXJhdGlvbiBmaWxlcywga2V5IGNoYXJhY3RlciBtYXAgZmlsZXMKLUxBWU9VVExJQl9GSUxFUyA6PSAkKGZvbnRzX2RldmljZSkgJChmb250X2NvbmZpZykgJChrZXlib2FyZHMpCitIWVBIRU5fVEVNUCA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyxoeXBoZW4sSE9TVCxDT01NT04pCisKKyMgVGhlIGh5cGhlbmF0aW9uIHBhdHRlcm4gZmlsZXMgbmVlZGVkIHRvIHN1cHBvcnQgdGV4dCBoeXBoZW5hdGlvbgoraHlwaGVuIDo9ICQoZmlsdGVyICQoVEFSR0VUX09VVCkvdXNyL2h5cGhlbi1kYXRhLyUuaHliLCAkKElOVEVSTkFMX1NZU1RFTUlNQUdFX0ZJTEVTKSkKK2h5cGhlbiA6PSAkKGFkZHByZWZpeCAkKEhZUEhFTl9URU1QKS8sICQobm90ZGlyICQoaHlwaGVuKSkpCisKKyQoaHlwaGVuKTogJChIWVBIRU5fVEVNUCkvJTogJChUQVJHRVRfT1VUKS91c3IvaHlwaGVuLWRhdGEvJQorCSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApCisJJChoaWRlKSBjcCAtdmYgJDwgJEAKKworIyBMaXN0IG9mIGFsbCBkYXRhIGZpbGVzIC0gZm9udCBmaWxlcywgZm9udCBjb25maWd1cmF0aW9uIGZpbGVzLCBrZXkgY2hhcmFjdGVyIG1hcCBmaWxlcywgaHlwaGVuYXRpb24gcGF0dGVybiBmaWxlcworTEFZT1VUTElCX0ZJTEVTIDo9ICQoZm9udHNfZGV2aWNlKSAkKGZvbnRfY29uZmlnKSAkKGtleWJvYXJkcykgJChoeXBoZW4pCiAKIC5QSE9OWTogbGF5b3V0bGliIGxheW91dGxpYi10ZXN0cwogbGF5b3V0bGliIGxheW91dGxpYi10ZXN0czogJChMQVlPVVRMSUJfRklMRVMpCkBAIC00MCw2ICs1MCw3IEBACiAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGxheW91dGxpYiwgJChmb3JlYWNoIG0sJChmb250c19kZXZpY2UpLCAkKG0pOmxheW91dGxpYl9uYXRpdmUvZm9udHMvJChub3RkaXIgJChtKSkpKQogJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBsYXlvdXRsaWIsICQoZm9yZWFjaCBtLCQoZm9udF9jb25maWcpLCAkKG0pOmxheW91dGxpYl9uYXRpdmUvZm9udHMvJChub3RkaXIgJChtKSkpKQogJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBsYXlvdXRsaWIsICQoZm9yZWFjaCBtLCQoa2V5Ym9hcmRzKSwgJChtKTpsYXlvdXRsaWJfbmF0aXZlL2tleWJvYXJkcy8kKG5vdGRpciAkKG0pKSkpCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGxheW91dGxpYiwgJChmb3JlYWNoIG0sJChoeXBoZW4pLCAkKG0pOmxheW91dGxpYl9uYXRpdmUvaHlwaGVuLWRhdGEvJChub3RkaXIgJChtKSkpKQogCiBGT05UX1RFTVAgOj0KIGZvbnRfY29uZmlnIDo9CkBAIC05NSw2ICsxMDYsNyBAQAogX2xheW91dGxpYl9mb250X2NvbmZpZ19maWxlcyA6PSAkKHNvcnQgJCh3aWxkY2FyZCBmcmFtZXdvcmtzL2Jhc2UvZGF0YS9mb250cy8qLnhtbCkpCiBfbGF5b3V0bGliX2ZvbnRzX2ZpbGVzIDo9ICQoZmlsdGVyICQoVEFSR0VUX09VVCkvZm9udHMvJS50dGYgJChUQVJHRVRfT1VUKS9mb250cy8lLnR0YyAkKFRBUkdFVF9PVVQpL2ZvbnRzLyUub3RmLCAkKElOVEVSTkFMX1NZU1RFTUlNQUdFX0ZJTEVTKSkKIF9sYXlvdXRsaWJfa2V5Ym9hcmRfZmlsZXMgOj0gJChzb3J0ICQod2lsZGNhcmQgZnJhbWV3b3Jrcy9iYXNlL2RhdGEva2V5Ym9hcmRzLyoua2NtKSkKK19sYXlvdXRsaWJfaHlwaGVuX2ZpbGVzIDo9ICQoZmlsdGVyICQoVEFSR0VUX09VVCkvdXNyL2h5cGhlbi1kYXRhLyUuaHliLCAkKElOVEVSTkFMX1NZU1RFTUlNQUdFX0ZJTEVTKSkKIAogIyBGaW5kIG91dCBmaWxlcyBkaXN0ZWQgd2l0aCBsYXlvdXRsaWIgaW4gU29vbmcuCiAjIyMgRmlsdGVyIG91dCBzdGF0aWMgbGlicmFyaWVzIGZvciBXaW5kb3dzIGFuZCBmaWxlcyBhbHJlYWR5IGhhbmRsZWQgaW4gbWFrZS4KQEAgLTEyNCw2ICsxMzYsMTMgQEAKIAkgIGVjaG8gZGF0YS9rZXlib2FyZHMvJChub3RkaXIgJGYpLGZyYW1ld29ya3MvYmFzZS9kYXRhL2tleWJvYXJkcyxwcmVidWlsdF9ldGMsLCwsLCRmLCwsID4+ICRAOyBcCiAJKQogCisJJChmb3JlYWNoIGYsJChfbGF5b3V0bGliX2h5cGhlbl9maWxlcyksIFwKKwkgICQoZXZhbCBfbW9kdWxlX25hbWUgOj0gJChBTExfSU5TVEFMTEVEX0ZJTEVTLiRmKSkgXAorCSAgJChldmFsIF9tb2R1bGVfcGF0aCA6PSAkKHN0cmlwICQoc29ydCAkKEFMTF9NT0RVTEVTLiQoX21vZHVsZV9uYW1lKS5QQVRIKSkpKSBcCisJICAkKGV2YWwgX3Nvb25nX21vZHVsZV90eXBlIDo9ICQoc3RyaXAgJChzb3J0ICQoQUxMX01PRFVMRVMuJChfbW9kdWxlX25hbWUpLlNPT05HX01PRFVMRV9UWVBFKSkpKSBcCisJICBlY2hvIGRhdGEvaHlwaGVuLWRhdGEvJChub3RkaXIgJGYpLCQoX21vZHVsZV9wYXRoKSwkKF9zb29uZ19tb2R1bGVfdHlwZSksLCwsLCRmLCwsID4+ICRAOyBcCisJKQorCiAJJChmb3JlYWNoIGYsJChfbGF5b3V0bGliX2ZpbGVzX2Rpc3RlZF9ieV9zb29uZyksIFwKIAkgICQoZXZhbCBfcHJlYnVpbHRfbW9kdWxlX2ZpbGUgOj0gJChjYWxsIHdvcmQtY29sb24sMSwkZikpIFwKIAkgICQoZXZhbCBfZGlzdF9maWxlIDo9ICQoY2FsbCB3b3JkLWNvbG9uLDIsJGYpKSBcCkBAIC0xNTIsNyArMTcxLDcgQEAKIAogLlBIT05ZOiBsYXlvdXRsaWItc2JvbQogbGF5b3V0bGliLXNib206ICQoTEFZT1VUTElCX1NCT00pL2xheW91dGxpYi5zcGR4Lmpzb24KLSQoTEFZT1VUTElCX1NCT00pL2xheW91dGxpYi5zcGR4Lmpzb246ICQoUFJPRFVDVF9PVVQpL2Fsd2F5c19kaXJ0eV9maWxlLnR4dCAkKEdFTl9TQk9NKSAkKExBWU9VVExJQl9TQk9NKS9zYm9tLW1ldGFkYXRhLmNzdiAkKF9sYXlvdXRsaWJfZm9udF9jb25maWdfZmlsZXMpICQoX2xheW91dGxpYl9mb250c19maWxlcykgJChMQVlPVVRMSUJfQlVJTERfUFJPUCkvbGF5b3V0bGliLWJ1aWxkLnByb3AgJChfbGF5b3V0bGliX2tleWJvYXJkX2ZpbGVzKSAkKExBWU9VVExJQl9SRVNfRklMRVMpICQoRU1VTEFURURfT1ZFUkxBWVNfRklMRVMpICQoREVWSUNFX09WRVJMQVlTX0ZJTEVTKQorJChMQVlPVVRMSUJfU0JPTSkvbGF5b3V0bGliLnNwZHguanNvbjogJChQUk9EVUNUX09VVCkvYWx3YXlzX2RpcnR5X2ZpbGUudHh0ICQoR0VOX1NCT00pICQoTEFZT1VUTElCX1NCT00pL3Nib20tbWV0YWRhdGEuY3N2ICQoX2xheW91dGxpYl9mb250X2NvbmZpZ19maWxlcykgJChfbGF5b3V0bGliX2ZvbnRzX2ZpbGVzKSAkKExBWU9VVExJQl9CVUlMRF9QUk9QKS9sYXlvdXRsaWItYnVpbGQucHJvcCAkKF9sYXlvdXRsaWJfa2V5Ym9hcmRfZmlsZXMpICQoX2xheW91dGxpYl9oeXBoZW5fZmlsZXMpICQoTEFZT1VUTElCX1JFU19GSUxFUykgJChFTVVMQVRFRF9PVkVSTEFZU19GSUxFUykgJChERVZJQ0VfT1ZFUkxBWVNfRklMRVMpCiAJcm0gLXJmICRACiAJJChHRU5fU0JPTSkgLS1vdXRwdXRfZmlsZSAkQCAtLW1ldGFkYXRhICQoTEFZT1VUTElCX1NCT00pL3Nib20tbWV0YWRhdGEuY3N2IC0tYnVpbGRfdmVyc2lvbiAkKEJVSUxEX0ZJTkdFUlBSSU5UX0ZST01fRklMRSkgLS1wcm9kdWN0X21mciAiJChQUk9EVUNUX01BTlVGQUNUVVJFUikiIC0tbW9kdWxlX25hbWUgImxheW91dGxpYiIgLS1qc29uCiAKZGlmZiAtLWdpdCBhL2NvcmUvbWFpbi5tayBiL2NvcmUvbWFpbi5tawppbmRleCA4MGZmZWM0Li45NzEwZGM4IDEwMDY0NAotLS0gYS9jb3JlL21haW4ubWsKKysrIGIvY29yZS9tYWluLm1rCkBAIC00NSwxMSArNDUsNiBAQAogJChLQVRJX29ic29sZXRlX3ZhciBCVUlMRF9IT1NUTkFNRSxVc2UgQlVJTERfSE9TVE5BTUVfRlJPTV9GSUxFIGluc3RlYWQpCiAkKEtBVElfb2Jzb2xldGVfdmFyIEZJTEVfTkFNRV9UQUcsaHR0cHM6Ly9hbmRyb2lkLmdvb2dsZXNvdXJjZS5jb20vcGxhdGZvcm0vYnVpbGQvKy9tYXN0ZXIvQ2hhbmdlcy5tZCNGSUxFX05BTUVfVEFHKQogCi0kKEJVSUxEX05VTUJFUl9GSUxFKToKLQkjIGVtcHR5IHJ1bGUgdG8gcHJldmVudCBkYW5nbGluZyBydWxlIGVycm9yIGZvciBhIGZpbGUgdGhhdCBpcyB3cml0dGVuIGJ5IHNvb25nX3VpCi0kKEJVSUxEX0hPU1ROQU1FX0ZJTEUpOgotCSMgZW1wdHkgcnVsZSB0byBwcmV2ZW50IGRhbmdsaW5nIHJ1bGUgZXJyb3IgZm9yIGEgZmlsZSB0aGF0IGlzIHdyaXR0ZW4gYnkgc29vbmdfdWkKLQogLktBVElfUkVTVEFUOiAkKEJVSUxEX05VTUJFUl9GSUxFKQogLktBVElfUkVTVEFUOiAkKEJVSUxEX0hPU1ROQU1FX0ZJTEUpCiAKQEAgLTgzLDYgKzc4LDggQEAKIC1pbmNsdWRlIHRlc3QvY3RzLXJvb3QvdG9vbHMvYnVpbGQvY29uZmlnLm1rCiAjIFdWVFMtc3BlY2lmaWMgY29uZmlnLgogLWluY2x1ZGUgdGVzdC93dnRzL3Rvb2xzL2J1aWxkL2NvbmZpZy5taworIyBEVFMtc3BlY2lmaWMgY29uZmlnLgorLWluY2x1ZGUgdGVzdC9kdHMvdG9vbHMvYnVpbGQvY29uZmlnLm1rCiAKIAogIyBDbGVhbiBydWxlcwpAQCAtMjc1LDExICsyNzIsMjQgQEAKICMgSW5jbHVkZSBhbGwgb2YgdGhlIG1ha2VmaWxlcyBpbiB0aGUgc3lzdGVtCiAjCiAKLXN1YmRpcl9tYWtlZmlsZXMgOj0gJChTT09OR19PVVRfRElSKS9pbnN0YWxscy0kKFRBUkdFVF9QUk9EVUNUKSQoQ09WRVJBR0VfU1VGRklYKS5tayAkKFNPT05HX0FORFJPSURfTUspCitzdWJkaXJfbWFrZWZpbGVzIDo9IFwKKyAgICAkKFNPT05HX09VVF9ESVIpL2luc3RhbGxzLSQoVEFSR0VUX1BST0RVQ1QpJChDT1ZFUkFHRV9TVUZGSVgpLm1rIFwKKyAgICAkKFNPT05HX0FORFJPSURfTUspIFwKKyAgICBidWlsZC9tYWtlL3RhcmdldC9ib2FyZC9hbmRyb2lkLWluZm8ubWsKIAogIyBBbmRyb2lkLm1rIGZpbGVzIGFyZSBvbmx5IHVzZWQgb24gTGludXggYnVpbGRzLCBNYWMgb25seSBzdXBwb3J0cyBBbmRyb2lkLmJwCiBpZmVxICgkKEhPU1RfT1MpLGxpbnV4KQotICBzdWJkaXJfbWFrZWZpbGVzICs9ICQoZmlsZSA8JChPVVRfRElSKS8ubW9kdWxlX3BhdGhzL0FuZHJvaWQubWsubGlzdCkKKyAgaWZlcSAoJChQUk9EVUNUX0lHTk9SRV9BTExfQU5EUk9JRE1LKSx0cnVlKQorICAgIGFsbG93ZWRfYW5kcm9pZG1rX2ZpbGVzIDo9CisgICAgaWZkZWYgUFJPRFVDVF9BTkRST0lETUtfQUxMT1dMSVNUX0ZJTEUKKyAgICAgIC1pbmNsdWRlICQoUFJPRFVDVF9BTkRST0lETUtfQUxMT1dMSVNUX0ZJTEUpCisgICAgZW5kaWYKKyAgICBhbGxvd2VkX2FuZHJvaWRta19maWxlcyArPSAkKFBST0RVQ1RfQUxMT1dFRF9BTkRST0lETUtfRklMRVMpCisgICAgc3ViZGlyX21ha2VmaWxlcyArPSAkKGZpbHRlciAkKGFsbG93ZWRfYW5kcm9pZG1rX2ZpbGVzKSwkKGZpbGUgPCQoT1VUX0RJUikvLm1vZHVsZV9wYXRocy9BbmRyb2lkLm1rLmxpc3QpKQorICAgIGFsbG93ZWRfYW5kcm9pZG1rX2ZpbGVzIDo9CisgIGVsc2UKKyAgICBzdWJkaXJfbWFrZWZpbGVzICs9ICQoZmlsZSA8JChPVVRfRElSKS8ubW9kdWxlX3BhdGhzL0FuZHJvaWQubWsubGlzdCkKKyAgZW5kaWYKIGVuZGlmCiAKIHN1YmRpcl9tYWtlZmlsZXMgKz0gJChTT09OR19PVVRfRElSKS9sYXRlLSQoVEFSR0VUX1BST0RVQ1QpJChDT1ZFUkFHRV9TVUZGSVgpLm1rCkBAIC0yOTAsNyArMzAwLDcgQEAKICQoZm9yZWFjaCBtaywkKHN1YmRpcl9tYWtlZmlsZXMpLCQoaW5mbyBbJChjYWxsIGluY19hbmRfcHJpbnQsc3ViZGlyX21ha2VmaWxlc19pbmMpLyQoc3ViZGlyX21ha2VmaWxlc190b3RhbCldIGluY2x1ZGluZyAkKG1rKSAuLi4pJChldmFsIGluY2x1ZGUgJChtaykpKQogCiAjIEJ1aWxkIGJvb3Rsb2FkZXIuaW1nL3JhZGlvLmltZywgYW5kIHVucGFjayB0aGUgcGFydGl0aW9ucy4KLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL3Rhc2tzL3Rvb2xzL3VwZGF0ZV9ib290bG9hZGVyX3JhZGlvX2ltYWdlLm1rCistaW5jbHVkZSB2ZW5kb3IvZ29vZ2xlX2RldmljZXMvJChUQVJHRVRfU09DKS9wcmVidWlsdHMvbWlzY19iaW5zL3VwZGF0ZV9ib290bG9hZGVyX3JhZGlvX2ltYWdlLm1rCiAKICMgRm9yIGFuIHVuYnVuZGxlZCBpbWFnZSwgd2UgY2FuIHNraXAgYmx1ZXByaW50X3Rvb2xzIGJlY2F1c2UgdW5idW5kbGVkIGltYWdlCiAjIGFpbXMgdG8gcmVtb3ZlIGEgbGFyZ2UgbnVtYmVyIGZyYW1ld29yayBwcm9qZWN0cyBmcm9tIHRoZSBtYW5pZmVzdCwgdGhlCkBAIC02ODcsMTIgKzY5NywxMiBAQAogIyBTY2FuIGFsbCBtb2R1bGVzIGluIGdlbmVyYWwtdGVzdHMsIGRldmljZS10ZXN0cyBhbmQgb3RoZXIgc2VsZWN0ZWQgc3VpdGVzIGFuZAogIyBmbGF0dGVuIHRoZSBzaGFyZWQgbGlicmFyeSBkZXBlbmRlbmNpZXMuCiBkZWZpbmUgdXBkYXRlLWhvc3Qtc2hhcmVkLWxpYnMtZGVwcy1mb3Itc3VpdGVzCi0kKGZvcmVhY2ggc3VpdGUsZ2VuZXJhbC10ZXN0cyBkZXZpY2UtdGVzdHMgdnRzIHR2dHMgYXJ0LWhvc3QtdGVzdHMgaG9zdC11bml0LXRlc3RzLFwKKyQoZm9yZWFjaCBzdWl0ZSxnZW5lcmFsLXRlc3RzIGRldmljZS10ZXN0cyB2dHMgdHZ0cyBhcnQtaG9zdC10ZXN0cyBob3N0LXVuaXQtdGVzdHMgY2FtZXJhLWhhbC10ZXN0cyxcCiAgICQoZm9yZWFjaCBtLCQoQ09NUEFUSUJJTElUWS4kKHN1aXRlKS5NT0RVTEVTKSxcCiAgICAgJChldmFsIG15X2RlcHMgOj0gJChjYWxsIGdldC1hbGwtc2hhcmVkLWxpYnMtZGVwcywkKG0pKSlcCiAgICAgJChmb3JlYWNoIGRlcCwkKG15X2RlcHMpLFwKICAgICAgICQoZm9yZWFjaCBmLCQoQUxMX01PRFVMRVMuJChkZXApLkhPU1RfU0hBUkVEX0xJQlJBUllfRklMRVMpLFwKLSAgICAgICAgJChpZiAkKGZpbHRlciAkKHN1aXRlKSxkZXZpY2UtdGVzdHMgZ2VuZXJhbC10ZXN0cyBhcnQtaG9zdC10ZXN0cyBob3N0LXVuaXQtdGVzdHMpLFwKKyAgICAgICAgJChpZiAkKGZpbHRlciAkKHN1aXRlKSxkZXZpY2UtdGVzdHMgZ2VuZXJhbC10ZXN0cyBhcnQtaG9zdC10ZXN0cyBob3N0LXVuaXQtdGVzdHMgY2FtZXJhLWhhbC10ZXN0cyksXAogICAgICAgICAgICQoZXZhbCBteV90ZXN0Y2FzZXMgOj0gJChIT1NUX09VVF9URVNUQ0FTRVMpKSxcCiAgICAgICAgICAgJChldmFsIG15X3Rlc3RjYXNlcyA6PSAkJChDT01QQVRJQklMSVRZX1RFU1RDQVNFU19PVVRfJChzdWl0ZSkpKSlcCiAgICAgICAgICQoZXZhbCB0YXJnZXQgOj0gJChteV90ZXN0Y2FzZXMpLyQobGFzdHdvcmQgJChzdWJzdCAvLCAsJChkaXIgJChmKSkpKS8kKG5vdGRpciAkKGYpKSlcCkBAIC05ODEsOCArOTkxLDggQEAKICMgUmV0dXJucyBtb2R1bGVzIGluY2x1ZGVkIGF1dG9tYXRpY2FsbHkgYXMgYSByZXN1bHQgb2YgY2VydGFpbiBCb2FyZENvbmZpZwogIyB2YXJpYWJsZXMgYmVpbmcgc2V0LgogZGVmaW5lIGF1dG8taW5jbHVkZWQtbW9kdWxlcwotICBsbG5ka19pbl9zeXN0ZW0gXAotICAkKGlmICQoREVWSUNFX01BTklGRVNUX0ZJTEUpLHZlbmRvcl9tYW5pZmVzdC54bWwpIFwKKyAgJChmb3JlYWNoIHZuZGtfdmVyLCQoUFJPRFVDVF9FWFRSQV9WTkRLX1ZFUlNJT05TKSxjb20uYW5kcm9pZC52bmRrLnYkKHZuZGtfdmVyKSkgXAorICBsbG5kay5saWJyYXJpZXMudHh0IFwKICAgJChpZiAkKERFVklDRV9NQU5JRkVTVF9TS1VTKSwkKGZvcmVhY2ggc2t1LCAkKERFVklDRV9NQU5JRkVTVF9TS1VTKSx2ZW5kb3JfbWFuaWZlc3RfJChza3UpLnhtbCkpIFwKICAgJChpZiAkKE9ETV9NQU5JRkVTVF9GSUxFUyksb2RtX21hbmlmZXN0LnhtbCkgXAogICAkKGlmICQoT0RNX01BTklGRVNUX1NLVVMpLCQoZm9yZWFjaCBza3UsICQoT0RNX01BTklGRVNUX1NLVVMpLG9kbV9tYW5pZmVzdF8kKHNrdSkueG1sKSkgXApAQCAtMTE4NSw4ICsxMTk1LDkgQEAKIGlmbmVxICgkKFRBUkdFVF9CVUlMRF9BUFBTKSwpCiAgICMgSWYgdGhpcyBidWlsZCBpcyBqdXN0IGZvciBhcHBzLCBvbmx5IGJ1aWxkIGFwcHMgYW5kIG5vdCB0aGUgZnVsbCBzeXN0ZW0gYnkgZGVmYXVsdC4KICAgaWZuZXEgKCQoZmlsdGVyIGFsbCwkKFRBUkdFVF9CVUlMRF9BUFBTKSksKQotICAgICMgSWYgdGhleSB1c2VkIHRoZSBtYWdpYyBnb2FsICJhbGwiIHRoZW4gYnVpbGQgYWxsIGFwcHMgaW4gdGhlIHNvdXJjZSB0cmVlLgotICAgIHVuYnVuZGxlZF9idWlsZF9tb2R1bGVzIDo9ICQoZm9yZWFjaCBtLCQoc29ydCAkKEFMTF9NT0RVTEVTKSksJChpZiAkKGZpbHRlciBBUFBTLCQoQUxMX01PRFVMRVMuJChtKS5DTEFTUykpLCQobSkpKQorICAgICMgVGhlIG1hZ2ljIGdvYWwgImFsbCIgdXNlZCB0byBidWlsZCBhbGwgYXBwcyBpbiB0aGUgc291cmNlIHRyZWUuIFRoaXMgd2FzIGRlcHJlY2F0ZWQKKyAgICAjIHNvIHRoYXQgd2UgY2FuIGtub3cgYWxsIFRBUkdFVF9CVUlMRF9BUFBTIGFwcHMgYXJlIGJ1aWx0IHdpdGggc29vbmcgZm9yIHNvb25nLW9ubHkgYnVpbGRzLgorICAgICQoZXJyb3IgVEFSR0VUX0JVSUxEX0FQUFM9YWxsIGlzIGRlcHJlY2F0ZWQpCiAgIGVsc2UKICAgICB1bmJ1bmRsZWRfYnVpbGRfbW9kdWxlcyA6PSAkKHNvcnQgJChUQVJHRVRfQlVJTERfQVBQUykpCiAgIGVuZGlmCkBAIC0xMzg0LDYgKzEzOTUsNyBAQAogICAgICQoSU5TVEFMTEVEX1JBTURJU0tfVEFSR0VUKSBcCiAgICAgJChJTlNUQUxMRURfQk9PVElNQUdFX1RBUkdFVCkgXAogICAgICQoSU5TVEFMTEVEX0lOSVRfQk9PVF9JTUFHRV9UQVJHRVQpIFwKKyAgICAkKElOU1RBTExFRF9EVEJPSU1BR0VfVEFSR0VUKSBcCiAgICAgJChJTlNUQUxMRURfUkFESU9JTUFHRV9UQVJHRVQpIFwKICAgICAkKElOU1RBTExFRF9ERUJVR19SQU1ESVNLX1RBUkdFVCkgXAogICAgICQoSU5TVEFMTEVEX0RFQlVHX0JPT1RJTUFHRV9UQVJHRVQpIFwKQEAgLTE0NTUsNyArMTQ2Nyw2IEBACiAjIGRpc3RfZmlsZXMgb25seSBmb3IgcHV0dGluZyB5b3VyIGxpYnJhcnkgaW50byB0aGUgZGlzdCBkaXJlY3Rvcnkgd2l0aCBhIGZ1bGwgYnVpbGQuCiAuUEhPTlk6IGRpc3RfZmlsZXMKIAotJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBkaXN0X2ZpbGVzLCAkKFNPT05HX09VVF9ESVIpL21vZHVsZV9icF9qYXZhX2RlcHMuanNvbikKICQoY2FsbCBkaXN0LWZvci1nb2FscywgZGlzdF9maWxlcywgJChQUk9EVUNUX09VVCkvbW9kdWxlLWluZm8uanNvbikKIAogLlBIT05ZOiBhcHBzX29ubHkKQEAgLTE2MDksNyArMTYyMCw2IEBACiAKICAgaWZuZXEgKCQoQU5EUk9JRF9CVUlMRF9FTUJFRERFRCksdHJ1ZSkKICAgICAkKGNhbGwgZGlzdC1mb3ItZ29hbHMtd2l0aC1maWxlbmFtZXRhZywgZHJvaWRjb3JlLCBcCi0gICAgICAkKEFQUFNfWklQKSBcCiAgICAgICAkKElOVEVSTkFMX0VNVUxBVE9SX1BBQ0tBR0VfVEFSR0VUKSBcCiAgICAgKQogICBlbmRpZgpAQCAtMTY1NiwyNCArMTY2Niw2IEBACiAgICAgJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBkaXN0X2ZpbGVzLCAkKEpBQ09DT19SRVBPUlRfQ0xBU1NFU19BTEwpKQogICBlbmRpZgogCi0gICMgUHV0IFhNTCBmb3JtYXR0ZWQgQVBJIGZpbGVzIGluIHRoZSBkaXN0IGRpci4KLSAgJChUQVJHRVRfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS9hcGkueG1sOiAkKGNhbGwgamF2YS1saWItZmlsZXMsJChBTkRST0lEX1BVQkxJQ19TVFVCUykpICQoQVBJQ0hFQ0spCi0gICQoVEFSR0VUX09VVF9DT01NT05fSU5URVJNRURJQVRFUykvc3lzdGVtLWFwaS54bWw6ICQoY2FsbCBqYXZhLWxpYi1maWxlcywkKEFORFJPSURfU1lTVEVNX1NUVUJTKSkgJChBUElDSEVDSykKLSAgJChUQVJHRVRfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS9tb2R1bGUtbGliLWFwaS54bWw6ICQoY2FsbCBqYXZhLWxpYi1maWxlcywkKEFORFJPSURfTU9EVUxFX0xJQl9TVFVCUykpICQoQVBJQ0hFQ0spCi0gICQoVEFSR0VUX09VVF9DT01NT05fSU5URVJNRURJQVRFUykvc3lzdGVtLXNlcnZlci1hcGkueG1sOiAkKGNhbGwgamF2YS1saWItZmlsZXMsJChBTkRST0lEX1NZU1RFTV9TRVJWRVJfU1RVQlMpKSAkKEFQSUNIRUNLKQotICAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL3Rlc3QtYXBpLnhtbDogJChjYWxsIGphdmEtbGliLWZpbGVzLCQoQU5EUk9JRF9URVNUX1NUVUJTKSkgJChBUElDSEVDSykKLQotICBhcGlfeG1scyA6PSAkKGFkZHByZWZpeCAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpLyxhcGkueG1sIHN5c3RlbS1hcGkueG1sIG1vZHVsZS1saWItYXBpLnhtbCBzeXN0ZW0tc2VydmVyLWFwaS54bWwgdGVzdC1hcGkueG1sKQotICAkKGFwaV94bWxzKToKLQkkKGhpZGUpIGVjaG8gIkNvbnZlcnRpbmcgQVBJIGZpbGUgdG8gWE1MOiAkQCIKLQkkKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKQotCSQoaGlkZSkgJChBUElDSEVDS19DT01NQU5EKSBqYXItdG8tamRpZmYgJDwgJEAKLQotICAkKGZvcmVhY2ggeG1sLCQoc29ydCAkKGFwaV94bWxzKSksJChjYWxsIGRlY2xhcmUtMXAtdGFyZ2V0LCQoeG1sKSwpKQotCi0gICQoY2FsbCBkaXN0LWZvci1nb2FscywgZGlzdF9maWxlcywgJChhcGlfeG1scykpCi0gIGFwaV94bWxzIDo9Ci0KICAgaWZkZWYgQ0xBTkdfQ09WRVJBR0UKICAgICAkKGZvcmVhY2ggZiwkKFNPT05HX05ES19BUElfWE1MKSwgXAogICAgICAgICAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsZHJvaWRjb3JlLCQoZik6bmRrX2FwaXMvJChub3RkaXIgJChmKSkpKQpAQCAtMTc0MywxMCArMTczNSw2IEBACiAJQGVjaG8gJChzb3J0ICQocGF0c3Vic3QgJChQUk9EVUNUX09VVCkvJSwlLCQoZmlsdGVyICQoUFJPRFVDVF9PVVQpLyUsJChtb2R1bGVzX3RvX2luc3RhbGwpKSkpIHwgdHIgLXMgJyAnICdcbicKIAlAZWNobyBTdWNjZXNzZnVsbHkgZHVtcGVkIHByb2R1Y3QgdGFyZ2V0IGZpbGUgbGlzdC4KIAotLlBIT05ZOiBub3RoaW5nCi1ub3RoaW5nOgotCUBlY2hvIFN1Y2Nlc3NmdWxseSByZWFkIHRoZSBtYWtlZmlsZXMuCi0KIC5QSE9OWTogdGlkeV9vbmx5CiB0aWR5X29ubHk6CiAJQGVjaG8gU3VjY2Vzc2Z1bGx5IG1ha2UgdGlkeV9vbmx5LgpAQCAtMTg5OSwyMCArMTg4NywyMCBAQAogCSAgJChldmFsIF9rZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMgOj0gJChzb3J0ICQoZmlsdGVyICUkKF9wYXRoX29uX2RldmljZSksJChLRVJORUxfTU9EVUxFX0NPUFlfRklMRVMpKSkpIFwKIAkgICQoZXZhbCBfaXNfYnVpbGRfcHJvcCA6PSAkKGNhbGwgaXMtYnVpbGQtcHJvcCwkZikpIFwKIAkgICQoZXZhbCBfaXNfbm90aWNlX2ZpbGUgOj0gJChjYWxsIGlzLW5vdGljZS1maWxlLCRmKSkgXAotCSAgJChldmFsIF9pc19kZXhwcmVvcHRfaW1hZ2VfcHJvZmlsZSA6PSAkKGlmICQoZmlsdGVyICU6LyQoX3BhdGhfb25fZGV2aWNlKSwkKERFWFBSRU9QVF9JTUFHRV9QUk9GSUxFX0JVSUxUX0lOU1RBTExFRCkpLFkpKSBcCiAJICAkKGV2YWwgX2lzX3Byb2R1Y3Rfc3lzdGVtX290aGVyX2F2YmtleSA6PSAkKGlmICQoZmluZHN0cmluZyAkZiwkKElOU1RBTExFRF9QUk9EVUNUX1NZU1RFTV9PVEhFUl9BVkJLRVlfVEFSR0VUKSksWSkpIFwKIAkgICQoZXZhbCBfaXNfZXZlbnRfbG9nX3RhZ3NfZmlsZSA6PSAkKGlmICQoZmluZHN0cmluZyAkZiwkKGV2ZW50X2xvZ190YWdzX2ZpbGUpKSxZKSkgXAogCSAgJChldmFsIF9pc19zeXN0ZW1fb3RoZXJfb2RleF9tYXJrZXIgOj0gJChpZiAkKGZpbmRzdHJpbmcgJGYsJChJTlNUQUxMRURfU1lTVEVNX09USEVSX09ERVhfTUFSS0VSKSksWSkpIFwKIAkgICQoZXZhbCBfaXNfa2VybmVsX21vZHVsZXNfYmxvY2tsaXN0IDo9ICQoaWYgJChmaW5kc3RyaW5nICRmLCQoQUxMX0tFUk5FTF9NT0RVTEVTX0JMT0NLTElTVCkpLFkpKSBcCiAJICAkKGV2YWwgX2lzX2ZzdmVyaXR5X2J1aWxkX21hbmlmZXN0X2FwayA6PSAkKGlmICQoZmluZHN0cmluZyAkZiwkKEFMTF9GU1ZFUklUWV9CVUlMRF9NQU5JRkVTVF9BUEspKSxZKSkgXAotCSAgJChldmFsIF9pc19saW5rZXJfY29uZmlnIDo9ICQoaWYgJChmaW5kc3RyaW5nICRmLCQoU1lTVEVNX0xJTktFUl9DT05GSUcpICQodmVuZG9yX2xpbmtlcl9jb25maWdfZmlsZSkpLFkpKSBcCisJICAkKGV2YWwgX2lzX2xpbmtlcl9jb25maWcgOj0gJChpZiAkKGZpbmRzdHJpbmcgJGYsJChTWVNURU1fTElOS0VSX0NPTkZJRykgJCh2ZW5kb3JfbGlua2VyX2NvbmZpZ19maWxlKSAkKHByb2R1Y3RfbGlua2VyX2NvbmZpZ19maWxlKSksWSkpIFwKIAkgICQoZXZhbCBfaXNfcGFydGl0aW9uX2NvbXBhdF9zeW1saW5rIDo9ICQoaWYgJChmaW5kc3RyaW5nICRmLCQoUEFSVElUSU9OX0NPTVBBVF9TWU1MSU5LUykpLFkpKSBcCiAJICAkKGV2YWwgX2lzX2ZsYWdzX2ZpbGUgOj0gJChpZiAkKGZpbmRzdHJpbmcgJGYsICQoQUxMX0ZMQUdTX0ZJTEVTKSksWSkpIFwKIAkgICQoZXZhbCBfaXNfcm9vdGRpcl9zeW1saW5rIDo9ICQoaWYgJChmaW5kc3RyaW5nICRmLCAkKEFMTF9ST09URElSX1NZTUxJTktTKSksWSkpIFwKLQkgICQoZXZhbCBfaXNfcGxhdGZvcm1fZ2VuZXJhdGVkIDo9ICQoX2lzX2J1aWxkX3Byb3ApJChfaXNfbm90aWNlX2ZpbGUpJChfaXNfZGV4cHJlb3B0X2ltYWdlX3Byb2ZpbGUpJChfaXNfcHJvZHVjdF9zeXN0ZW1fb3RoZXJfYXZia2V5KSQoX2lzX2V2ZW50X2xvZ190YWdzX2ZpbGUpJChfaXNfc3lzdGVtX290aGVyX29kZXhfbWFya2VyKSQoX2lzX2tlcm5lbF9tb2R1bGVzX2Jsb2NrbGlzdCkkKF9pc19mc3Zlcml0eV9idWlsZF9tYW5pZmVzdF9hcGspJChfaXNfbGlua2VyX2NvbmZpZykkKF9pc19wYXJ0aXRpb25fY29tcGF0X3N5bWxpbmspJChfaXNfZmxhZ3NfZmlsZSkkKF9pc19yb290ZGlyX3N5bWxpbmspKSBcCisJICAkKGV2YWwgX2lzX3BsYXRmb3JtX2dlbmVyYXRlZCA6PSAkKF9pc19idWlsZF9wcm9wKSQoX2lzX25vdGljZV9maWxlKSQoX2lzX3Byb2R1Y3Rfc3lzdGVtX290aGVyX2F2YmtleSkkKF9pc19ldmVudF9sb2dfdGFnc19maWxlKSQoX2lzX3N5c3RlbV9vdGhlcl9vZGV4X21hcmtlcikkKF9pc19rZXJuZWxfbW9kdWxlc19ibG9ja2xpc3QpJChfaXNfZnN2ZXJpdHlfYnVpbGRfbWFuaWZlc3RfYXBrKSQoX2lzX2xpbmtlcl9jb25maWcpJChfaXNfcGFydGl0aW9uX2NvbXBhdF9zeW1saW5rKSQoX2lzX2ZsYWdzX2ZpbGUpJChfaXNfcm9vdGRpcl9zeW1saW5rKSkgXAogCSAgJChldmFsIF9zdGF0aWNfbGlicyA6PSAkKGlmICQoX2lzX3Nvb25nX21vZHVsZSksLCQoQUxMX0lOU1RBTExFRF9GSUxFUy4kZi5TVEFUSUNfTElCUkFSSUVTKSkpIFwKIAkgICQoZXZhbCBfd2hvbGVfc3RhdGljX2xpYnMgOj0gJChpZiAkKF9pc19zb29uZ19tb2R1bGUpLCwkKEFMTF9JTlNUQUxMRURfRklMRVMuJGYuV0hPTEVfU1RBVElDX0xJQlJBUklFUykpKSBcCi0JICAkKGV2YWwgX2xpY2Vuc2VfdGV4dCA6PSAkKGlmICQoZmlsdGVyICQoX2J1aWxkX291dHB1dF9wYXRoKSwkKEFMTF9OT05fTU9EVUxFUykpLCQoQUxMX05PTl9NT0RVTEVTLiQoX2J1aWxkX291dHB1dF9wYXRoKS5OT1RJQ0VTKSkpIFwKKwkgICQoZXZhbCBfbGljZW5zZV90ZXh0IDo9ICQoaWYgJChmaWx0ZXIgJChfYnVpbGRfb3V0cHV0X3BhdGgpLCQoQUxMX05PTl9NT0RVTEVTKSksJChBTExfTk9OX01PRFVMRVMuJChfYnVpbGRfb3V0cHV0X3BhdGgpLk5PVElDRVMpLFwKKwkgICAgICAgICAgICAgICAgICAgICAgICAgICQoaWYgJChfaXNfcGFydGl0aW9uX2NvbXBhdF9zeW1saW5rKSxidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFKSkpIFwKIAkgIGVjaG8gJyQoX2J1aWxkX291dHB1dF9wYXRoKSwkKF9tb2R1bGVfcGF0aCksJChfaXNfc29vbmdfbW9kdWxlKSwkKF9pc19wcmVidWlsdF9tYWtlX21vZHVsZSksJChfcHJvZHVjdF9jb3B5X2ZpbGVzKSwkKF9rZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMpLCQoX2lzX3BsYXRmb3JtX2dlbmVyYXRlZCksJChfc3RhdGljX2xpYnMpLCQoX3dob2xlX3N0YXRpY19saWJzKSwkKF9saWNlbnNlX3RleHQpJyA+PiAkQDsgXAogCSkKIApkaWZmIC0tZ2l0IGEvY29yZS9taXNjX3ByZWJ1aWx0X2ludGVybmFsLm1rIGIvY29yZS9taXNjX3ByZWJ1aWx0X2ludGVybmFsLm1rCmluZGV4IGE1NjIyMDcuLmIxNGI5Y2UgMTAwNjQ0Ci0tLSBhL2NvcmUvbWlzY19wcmVidWlsdF9pbnRlcm5hbC5taworKysgYi9jb3JlL21pc2NfcHJlYnVpbHRfaW50ZXJuYWwubWsKQEAgLTI1LDcgKzI1LDcgQEAKIAogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5tawogCi1pZm5lcSAoJChmaWx0ZXIgaW5pdCVyYywkKG5vdGRpciAkKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpKSkkKGZpbHRlciAlL2V0Yy9pbml0LCQoZGlyICQoTE9DQUxfSU5TVEFMTEVEX01PRFVMRSkpKSwpCitpZm5lcSAoJChmaWx0ZXIgaW5pdCVyYywkKG5vdGRpciAkKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpKSkkKGZpbHRlciAlL2V0Yy9pbml0LywkKGRpciAkKExPQ0FMX0lOU1RBTExFRF9NT0RVTEUpKSksKQogICAkKGV2YWwgJChjYWxsIGNvcHktaW5pdC1zY3JpcHQtZmlsZS1jaGVja2VkLCQobXlfcHJlYnVpbHRfc3JjX2ZpbGUpLCQoTE9DQUxfQlVJTFRfTU9EVUxFKSkpCiBlbHNlCiAkKExPQ0FMX0JVSUxUX01PRFVMRSkgOiAkKG15X3ByZWJ1aWx0X3NyY19maWxlKQpkaWZmIC0tZ2l0IGEvY29yZS9uaW5qYV9jb25maWcubWsgYi9jb3JlL25pbmphX2NvbmZpZy5tawppbmRleCBkNGI3YzZkLi4yN2I0MTkwIDEwMDY0NAotLS0gYS9jb3JlL25pbmphX2NvbmZpZy5taworKysgYi9jb3JlL25pbmphX2NvbmZpZy5tawpAQCAtMTksOSArMTksNiBAQAogCWJ1aWxkLWFydCUgXAogCWJ1aWxkX2tlcm5lbC1ub2RlcHMgXAogCWNsZWFuLW9hdCUgXAotCWNvbnRpbnVvdXNfaW5zdHJ1bWVudGF0aW9uX3Rlc3RzIFwKLQljb250aW51b3VzX25hdGl2ZV90ZXN0cyBcCi0JY3RzIFwKIAljdXN0b21faW1hZ2VzIFwKIAlkaWN0dG9vbF9hb3NwIFwKIAlkb2NzIFwKZGlmZiAtLWdpdCBhL2NvcmUvb3NfbGljZW5zaW5nLm1rIGIvY29yZS9vc19saWNlbnNpbmcubWsKaW5kZXggMWUxYjdkZi4uOTdlNTVhNyAxMDA2NDQKLS0tIGEvY29yZS9vc19saWNlbnNpbmcubWsKKysrIGIvY29yZS9vc19saWNlbnNpbmcubWsKQEAgLTE3LDEzICsxNywxNyBAQAogCiAkKGV2YWwgJChjYWxsIHRleHQtbm90aWNlLXJ1bGUsJCh0YXJnZXRfbm90aWNlX2ZpbGVfdHh0KSwiU3lzdGVtIGltYWdlIiwkKHN5c3RlbV9ub3RpY2VfZmlsZV9tZXNzYWdlKSwkKFNZU1RFTV9OT1RJQ0VfREVQUyksJChTWVNURU1fTk9USUNFX0RFUFMpKSkKIAoraWZuZXEgKCQoUFJPRFVDVF9VU0VfU09PTkdfTk9USUNFX1hNTCksdHJ1ZSkKICQoaW5zdGFsbGVkX25vdGljZV9odG1sX29yX3htbF9neik6ICQodGFyZ2V0X25vdGljZV9maWxlX3htbF9neikKIAkkKGNvcHktZmlsZS10by10YXJnZXQpCiBlbmRpZgorZW5kaWYKIAogJChjYWxsIGRlY2xhcmUtMXAtdGFyZ2V0LCQodGFyZ2V0X25vdGljZV9maWxlX3htbF9neikpCitpZm5lcSAoJChQUk9EVUNUX1VTRV9TT09OR19OT1RJQ0VfWE1MKSx0cnVlKQogJChjYWxsIGRlY2xhcmUtMXAtdGFyZ2V0LCQoaW5zdGFsbGVkX25vdGljZV9odG1sX29yX3htbF9neikpCiBlbmRpZgorZW5kaWYKIAogLlBIT05ZOiB2ZW5kb3JsaWNlbnNlCiB2ZW5kb3JsaWNlbnNlOiAkKGNhbGwgY29ycmVzcG9uZGluZy1saWNlbnNlLW1ldGFkYXRhLCAkKFZFTkRPUl9OT1RJQ0VfREVQUykpIHJlcG9ydG1pc3NpbmdsaWNlbnNlcwpAQCAtNDAsMTIgKzQ0LDE2IEBACiAgICAgICAgICAiTm90aWNlcyBmb3IgZmlsZXMgY29udGFpbmVkIGluIGFsbCBmaWxlc3lzdGVtIGltYWdlcyBleGNlcHQgc3lzdGVtL3N5c3RlbV9leHQvcHJvZHVjdC9vZG0vdmVuZG9yX2Rsa20vb2RtX2Rsa20gaW4gdGhpcyBkaXJlY3Rvcnk6IiwgXAogICAgICAgICAgJChWRU5ET1JfTk9USUNFX0RFUFMpLCQoVkVORE9SX05PVElDRV9ERVBTKSkpCiAKK2lmbmVxICgkKFBST0RVQ1RfVVNFX1NPT05HX05PVElDRV9YTUwpLHRydWUpCiAkKGluc3RhbGxlZF92ZW5kb3Jfbm90aWNlX3htbF9neik6ICQodGFyZ2V0X3ZlbmRvcl9ub3RpY2VfZmlsZV94bWxfZ3opCiAJJChjb3B5LWZpbGUtdG8tdGFyZ2V0KQorZW5kaWYKIAogJChjYWxsIGRlY2xhcmUtMXAtdGFyZ2V0LCQodGFyZ2V0X3ZlbmRvcl9ub3RpY2VfZmlsZV94bWxfZ3opKQoraWZuZXEgKCQoUFJPRFVDVF9VU0VfU09PTkdfTk9USUNFX1hNTCksdHJ1ZSkKICQoY2FsbCBkZWNsYXJlLTFwLXRhcmdldCwkKGluc3RhbGxlZF92ZW5kb3Jfbm90aWNlX3htbF9neikpCiBlbmRpZgorZW5kaWYKIAogLlBIT05ZOiBvZG1saWNlbnNlCiBvZG1saWNlbnNlOiAkKGNhbGwgY29ycmVzcG9uZGluZy1saWNlbnNlLW1ldGFkYXRhLCAkKE9ETV9OT1RJQ0VfREVQUykpIHJlcG9ydG1pc3NpbmdsaWNlbnNlcwpAQCAtNTksMTIgKzY3LDE2IEBACiAgICAgICAgICAiTm90aWNlcyBmb3IgZmlsZXMgY29udGFpbmVkIGluIHRoZSBvZG0gZmlsZXN5c3RlbSBpbWFnZSBpbiB0aGlzIGRpcmVjdG9yeToiLCBcCiAgICAgICAgICAkKE9ETV9OT1RJQ0VfREVQUyksJChPRE1fTk9USUNFX0RFUFMpKSkKIAoraWZuZXEgKCQoUFJPRFVDVF9VU0VfU09PTkdfTk9USUNFX1hNTCksdHJ1ZSkKICQoaW5zdGFsbGVkX29kbV9ub3RpY2VfeG1sX2d6KTogJCh0YXJnZXRfb2RtX25vdGljZV9maWxlX3htbF9neikKIAkkKGNvcHktZmlsZS10by10YXJnZXQpCitlbmRpZgogCiAkKGNhbGwgZGVjbGFyZS0xcC10YXJnZXQsJCh0YXJnZXRfb2RtX25vdGljZV9maWxlX3htbF9neikpCitpZm5lcSAoJChQUk9EVUNUX1VTRV9TT09OR19OT1RJQ0VfWE1MKSx0cnVlKQogJChjYWxsIGRlY2xhcmUtMXAtdGFyZ2V0LCQoaW5zdGFsbGVkX29kbV9ub3RpY2VfeG1sX2d6KSkKIGVuZGlmCitlbmRpZgogCiAuUEhPTlk6IG9lbWxpY2Vuc2UKIG9lbWxpY2Vuc2U6ICQoY2FsbCBjb3JyZXNwb25kaW5nLWxpY2Vuc2UtbWV0YWRhdGEsICQoT0VNX05PVElDRV9ERVBTKSkgcmVwb3J0bWlzc2luZ2xpY2Vuc2VzCkBAIC04MSwxMiArOTMsMTYgQEAKICAgICAgICAgICJOb3RpY2VzIGZvciBmaWxlcyBjb250YWluZWQgaW4gdGhlIHByb2R1Y3QgZmlsZXN5c3RlbSBpbWFnZSBpbiB0aGlzIGRpcmVjdG9yeToiLCBcCiAgICAgICAgICAkKFBST0RVQ1RfTk9USUNFX0RFUFMpLCQoUFJPRFVDVF9OT1RJQ0VfREVQUykpKQogCitpZm5lcSAoJChQUk9EVUNUX1VTRV9TT09OR19OT1RJQ0VfWE1MKSx0cnVlKQogJChpbnN0YWxsZWRfcHJvZHVjdF9ub3RpY2VfeG1sX2d6KTogJCh0YXJnZXRfcHJvZHVjdF9ub3RpY2VfZmlsZV94bWxfZ3opCiAJJChjb3B5LWZpbGUtdG8tdGFyZ2V0KQorZW5kaWYKIAogJChjYWxsIGRlY2xhcmUtMXAtdGFyZ2V0LCQodGFyZ2V0X3Byb2R1Y3Rfbm90aWNlX2ZpbGVfeG1sX2d6KSkKK2lmbmVxICgkKFBST0RVQ1RfVVNFX1NPT05HX05PVElDRV9YTUwpLHRydWUpCiAkKGNhbGwgZGVjbGFyZS0xcC10YXJnZXQsJChpbnN0YWxsZWRfcHJvZHVjdF9ub3RpY2VfeG1sX2d6KSkKIGVuZGlmCitlbmRpZgogCiAuUEhPTlk6IHN5c3RlbWV4dGxpY2Vuc2UKIHN5c3RlbWV4dGxpY2Vuc2U6ICQoY2FsbCBjb3JyZXNwb25kaW5nLWxpY2Vuc2UtbWV0YWRhdGEsICQoU1lTVEVNX0VYVF9OT1RJQ0VfREVQUykpIHJlcG9ydG1pc3NpbmdsaWNlbnNlcwpAQCAtMTAwLDEyICsxMTYsMTYgQEAKICAgICAgICAgICJOb3RpY2VzIGZvciBmaWxlcyBjb250YWluZWQgaW4gdGhlIHN5c3RlbV9leHQgZmlsZXN5c3RlbSBpbWFnZSBpbiB0aGlzIGRpcmVjdG9yeToiLCBcCiAgICAgICAgICAkKFNZU1RFTV9FWFRfTk9USUNFX0RFUFMpLCQoU1lTVEVNX0VYVF9OT1RJQ0VfREVQUykpKQogCitpZm5lcSAoJChQUk9EVUNUX1VTRV9TT09OR19OT1RJQ0VfWE1MKSx0cnVlKQogJChpbnN0YWxsZWRfc3lzdGVtX2V4dF9ub3RpY2VfeG1sX2d6KTogJCh0YXJnZXRfc3lzdGVtX2V4dF9ub3RpY2VfZmlsZV94bWxfZ3opCiAJJChjb3B5LWZpbGUtdG8tdGFyZ2V0KQorZW5kaWYKIAogJChjYWxsIGRlY2xhcmUtMXAtdGFyZ2V0LCQodGFyZ2V0X3N5c3RlbV9leHRfbm90aWNlX2ZpbGVfeG1sX2d6KSkKK2lmbmVxICgkKFBST0RVQ1RfVVNFX1NPT05HX05PVElDRV9YTUwpLHRydWUpCiAkKGNhbGwgZGVjbGFyZS0xcC10YXJnZXQsJChpbnN0YWxsZWRfc3lzdGVtX2V4dF9ub3RpY2VfeG1sX2d6KSkKIGVuZGlmCitlbmRpZgogCiAuUEhPTlk6IHZlbmRvcl9kbGttbGljZW5zZQogdmVuZG9yX2Rsa21saWNlbnNlOiAkKGNhbGwgY29ycmVzcG9uZGluZy1saWNlbnNlLW1ldGFkYXRhLCAkKFZFTkRPUl9ETEtNX05PVElDRV9ERVBTKSkgcmVwb3J0bWlzc2luZ2xpY2Vuc2VzCkBAIC0xMTksMTIgKzEzOSwxNiBAQAogICAgICAgICAgIk5vdGljZXMgZm9yIGZpbGVzIGNvbnRhaW5lZCBpbiB0aGUgdmVuZG9yX2Rsa20gZmlsZXN5c3RlbSBpbWFnZSBpbiB0aGlzIGRpcmVjdG9yeToiLCBcCiAgICAgICAgICAkKFZFTkRPUl9ETEtNX05PVElDRV9ERVBTKSwkKFZFTkRPUl9ETEtNX05PVElDRV9ERVBTKSkpCiAKK2lmbmVxICgkKFBST0RVQ1RfVVNFX1NPT05HX05PVElDRV9YTUwpLHRydWUpCiAkKGluc3RhbGxlZF92ZW5kb3JfZGxrbV9ub3RpY2VfeG1sX2d6KTogJCh0YXJnZXRfdmVuZG9yX2Rsa21fbm90aWNlX2ZpbGVfeG1sX2d6KQogCSQoY29weS1maWxlLXRvLXRhcmdldCkKK2VuZGlmCiAKICQoY2FsbCBkZWNsYXJlLTFwLXRhcmdldCwkKHRhcmdldF92ZW5kb3JfZGxrbV9ub3RpY2VfZmlsZV94bWxfZ3opKQoraWZuZXEgKCQoUFJPRFVDVF9VU0VfU09PTkdfTk9USUNFX1hNTCksdHJ1ZSkKICQoY2FsbCBkZWNsYXJlLTFwLXRhcmdldCwkKGluc3RhbGxlZF92ZW5kb3JfZGxrbV9ub3RpY2VfeG1sX2d6KSkKIGVuZGlmCitlbmRpZgogCiAuUEhPTlk6IG9kbV9kbGttbGljZW5zZQogb2RtX2Rsa21saWNlbnNlOiAkKGNhbGwgY29ycmVzcG9uZGluZy1saWNlbnNlLW1ldGFkYXRhLCAkKE9ETV9ETEtNX05PVElDRV9ERVBTKSkgcmVwb3J0bWlzc2luZ2xpY2Vuc2VzCkBAIC0xMzgsMTIgKzE2MiwxNiBAQAogICAgICAgICAgIk5vdGljZXMgZm9yIGZpbGVzIGNvbnRhaW5lZCBpbiB0aGUgb2RtX2Rsa20gZmlsZXN5c3RlbSBpbWFnZSBpbiB0aGlzIGRpcmVjdG9yeToiLCBcCiAgICAgICAgICAkKE9ETV9ETEtNX05PVElDRV9ERVBTKSwkKE9ETV9ETEtNX05PVElDRV9ERVBTKSkpCiAKK2lmbmVxICgkKFBST0RVQ1RfVVNFX1NPT05HX05PVElDRV9YTUwpLHRydWUpCiAkKGluc3RhbGxlZF9vZG1fZGxrbV9ub3RpY2VfeG1sX2d6KTogJCh0YXJnZXRfb2RtX2Rsa21fbm90aWNlX2ZpbGVfeG1sX2d6KQogCSQoY29weS1maWxlLXRvLXRhcmdldCkKK2VuZGlmCiAKICQoY2FsbCBkZWNsYXJlLTFwLXRhcmdldCwkKHRhcmdldF9vZG1fZGxrbV9ub3RpY2VfZmlsZV94bWxfZ3opKQoraWZuZXEgKCQoUFJPRFVDVF9VU0VfU09PTkdfTk9USUNFX1hNTCksdHJ1ZSkKICQoY2FsbCBkZWNsYXJlLTFwLXRhcmdldCwkKGluc3RhbGxlZF9vZG1fZGxrbV9ub3RpY2VfeG1sX2d6KSkKIGVuZGlmCitlbmRpZgogCiAuUEhPTlk6IHN5c3RlbV9kbGttbGljZW5zZQogc3lzdGVtX2Rsa21saWNlbnNlOiAkKGNhbGwgY29ycmVzcG9uZGluZy1saWNlbnNlLW1ldGFkYXRhLCAkKFNZU1RFTV9ETEtNX05PVElDRV9ERVBTKSkgcmVwb3J0bWlzc2luZ2xpY2Vuc2VzCkBAIC0xNTcsMTEgKzE4NSwxNSBAQAogICAgICAgICAgIk5vdGljZXMgZm9yIGZpbGVzIGNvbnRhaW5lZCBpbiB0aGUgc3lzdGVtX2Rsa20gZmlsZXN5c3RlbSBpbWFnZSBpbiB0aGlzIGRpcmVjdG9yeToiLCBcCiAgICAgICAgICAkKFNZU1RFTV9ETEtNX05PVElDRV9ERVBTKSwkKFNZU1RFTV9ETEtNX05PVElDRV9ERVBTKSkpCiAKK2lmbmVxICgkKFBST0RVQ1RfVVNFX1NPT05HX05PVElDRV9YTUwpLHRydWUpCiAkKGluc3RhbGxlZF9zeXN0ZW1fZGxrbV9ub3RpY2VfeG1sX2d6KTogJCh0YXJnZXRfc3lzdGVtX2Rsa21fbm90aWNlX2ZpbGVfeG1sX2d6KQogCSQoY29weS1maWxlLXRvLXRhcmdldCkKK2VuZGlmCiAKICQoY2FsbCBkZWNsYXJlLTFwLXRhcmdldCwkKHRhcmdldF9zeXN0ZW1fZGxrbV9ub3RpY2VfZmlsZV94bWxfZ3opKQoraWZuZXEgKCQoUFJPRFVDVF9VU0VfU09PTkdfTk9USUNFX1hNTCksdHJ1ZSkKICQoY2FsbCBkZWNsYXJlLTFwLXRhcmdldCwkKGluc3RhbGxlZF9zeXNldG1fZGxrbV9ub3RpY2VfeG1sX2d6KSkKIGVuZGlmCitlbmRpZgogCiBlbmRpZiAjIG5vdCBUQVJHRVRfQlVJTERfQVBQUwpkaWZmIC0tZ2l0IGEvY29yZS9wYWNrYWdpbmcvZmxhZ3MubWsgYi9jb3JlL3BhY2thZ2luZy9mbGFncy5tawppbmRleCBhNzc5NTZiLi5hMzcxYTAwIDEwMDY0NAotLS0gYS9jb3JlL3BhY2thZ2luZy9mbGFncy5taworKysgYi9jb3JlL3BhY2thZ2luZy9mbGFncy5tawpAQCAtMTgsMTMgKzE4LDEzIEBACiAjCiAKICMgVE9ETzogU2hvdWxkIHdlIGRvIGFsbCBvZiB0aGUgaW1hZ2VzIGluICQoSU1BR0VTX1RPX0JVSUxEKT8KLV9GTEFHX1BBUlRJVElPTlMgOj0gcHJvZHVjdCBzeXN0ZW0gc3lzdGVtX2V4dCB2ZW5kb3IKK19GTEFHX1BBUlRJVElPTlMgOj0gcHJvZHVjdCBzeXN0ZW0gdmVuZG9yCiAKIAogIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyBBY29uZmlnIEZsYWdzCiAKLSMgQ3JlYXRlIGEgc3VtbWFyeSBmaWxlIG9mIGJ1aWxkIGZsYWdzIGZvciBlYWNoIHBhcnRpdGlvbgorIyBDcmVhdGUgYSBzdW1tYXJ5IGZpbGUgb2YgYnVpbGQgZmxhZ3MgZm9yIGEgc2luZ2xlIHBhcnRpdGlvbgogIyAkKDEpOiBidWlsdCBhY29uZmlnIGZsYWdzIGZpbGUgKG91dCkKICMgJCgyKTogaW5zdGFsbGVkIGFjb25maWcgZmxhZ3MgZmlsZSAob3V0KQogIyAkKDMpOiB0aGUgcGFydGl0aW9uIChpbikKQEAgLTM2LDEyICszNiwxNSBAQAogCW1rZGlyIC1wICQkKGRpciAkJChQUklWQVRFX09VVCkpCiAJJCQoaWYgJCQoUFJJVkFURV9JTiksIFwKIAkJJCQoQUNPTkZJRykgZHVtcCAtLWRlZHVwIC0tZm9ybWF0IHByb3RvYnVmIC0tb3V0ICQkKFBSSVZBVEVfT1VUKSBcCi0JCQktLWZpbHRlciBjb250YWluZXI6JCQoc3RyaXAgJCgzKSkgJCQoYWRkcHJlZml4IC0tY2FjaGUgLCQkKFBSSVZBVEVfSU4pKSwgXAorCQkJLS1maWx0ZXIgY29udGFpbmVyOiQoc3RyaXAgJCgzKSkrc3RhdGU6RU5BQkxFRCBcCisJCQktLWZpbHRlciBjb250YWluZXI6JChzdHJpcCAkKDMpKStwZXJtaXNzaW9uOlJFQURfV1JJVEUgXAorCQkJJCQoYWRkcHJlZml4IC0tY2FjaGUgLCQkKFBSSVZBVEVfSU4pKSwgXAogCQllY2hvIC1uID4gJCQoUFJJVkFURV9PVVQpIFwKIAkpCiAkKGNhbGwgY29weS1vbmUtZmlsZSwgJCgxKSwgJCgyKSkKIGVuZGVmCiAKKwogIyBDcmVhdGUgYSBzdW1tYXJ5IGZpbGUgb2YgYnVpbGQgZmxhZ3MgZm9yIGVhY2ggcGFydGl0aW9uCiAjICQoMSk6IGJ1aWx0IGFjb25maWcgZmxhZ3MgZmlsZSAob3V0KQogIyAkKDIpOiBpbnN0YWxsZWQgYWNvbmZpZyBmbGFncyBmaWxlIChvdXQpCkBAIC01OSwxNiArNjIsMjIgQEAKICQoY2FsbCBjb3B5LW9uZS1maWxlLCAkKDEpLCAkKDIpKQogZW5kZWYKIAotCiAkKGZvcmVhY2ggcGFydGl0aW9uLCAkKF9GTEFHX1BBUlRJVElPTlMpLCBcCiAJJChldmFsIGFjb25maWdfZmxhZ19zdW1tYXJpZXNfcHJvdG9idWYuJChwYXJ0aXRpb24pIDo9ICQoUFJPRFVDVF9PVVQpLyQocGFydGl0aW9uKS9ldGMvYWNvbmZpZ19mbGFncy5wYikgXAogCSQoZXZhbCAkKGNhbGwgZ2VuZXJhdGUtcGFydGl0aW9uLWFjb25maWctZmxhZy1maWxlLCBcCi0JCQkJJChUQVJHRVRfT1VUX0ZMQUdTKS8kKHBhcnRpdGlvbikvYWNvbmZpZ19mbGFncy5wYiwgXAotCQkJCSQoYWNvbmZpZ19mbGFnX3N1bW1hcmllc19wcm90b2J1Zi4kKHBhcnRpdGlvbikpLCBcCi0JCQkJJChwYXJ0aXRpb24pLCBcCi0JCQkJJChzb3J0ICQoZm9yZWFjaCBtLCQoY2FsbCByZWdpc3Rlci1uYW1lcy1mb3ItcGFydGl0aW9uLCAkKHBhcnRpdGlvbikpLCBcCisJCQkkKFRBUkdFVF9PVVRfRkxBR1MpLyQocGFydGl0aW9uKS9hY29uZmlnX2ZsYWdzLnBiLCBcCisJCQkkKGFjb25maWdfZmxhZ19zdW1tYXJpZXNfcHJvdG9idWYuJChwYXJ0aXRpb24pKSwgXAorCQkJJChwYXJ0aXRpb24pLCBcCisJCQkkKHNvcnQgXAorCQkJCSQoZm9yZWFjaCBtLCAkKGNhbGwgcmVnaXN0ZXItbmFtZXMtZm9yLXBhcnRpdGlvbiwgJChwYXJ0aXRpb24pKSwgXAogCQkJCQkkKEFMTF9NT0RVTEVTLiQobSkuQUNPTkZJR19GSUxFUykgXAotCQkJCSkpLCBcCisJCQkJKSBcCisJCQkJJChpZiAkKGZpbHRlciBzeXN0ZW0sICQocGFydGl0aW9uKSksIFwKKwkJCQkJJChmb3JlYWNoIG0sICQoY2FsbCByZWdpc3Rlci1uYW1lcy1mb3ItcGFydGl0aW9uLCBzeXN0ZW1fZXh0KSwgXAorCQkJCQkJJChBTExfTU9EVUxFUy4kKG0pLkFDT05GSUdfRklMRVMpIFwKKwkJCQkJKSBcCisJCQkJKSBcCisJCQkpIFwKIAkpKSBcCiApCiAKQEAgLTkwLDQyICs5OSw2MSBAQAogIyAkKDEpOiBidWlsdCBhY29uZmlnIGZsYWdzIHN0b3JhZ2UgcGFja2FnZSBtYXAgZmlsZSAob3V0KQogIyAkKDIpOiBidWlsdCBhY29uZmlnIGZsYWdzIHN0b3JhZ2UgZmxhZyBtYXAgZmlsZSAob3V0KQogIyAkKDMpOiBidWlsdCBhY29uZmlnIGZsYWdzIHN0b3JhZ2UgZmxhZyB2YWwgZmlsZSAob3V0KQotIyAkKDQpOiBpbnN0YWxsZWQgYWNvbmZpZyBmbGFncyBzdG9yYWdlIHBhY2thZ2UgbWFwIGZpbGUgKG91dCkKLSMgJCg1KTogaW5zdGFsbGVkIGFjb25maWcgZmxhZ3Mgc3RvcmFnZSBmbGFnIG1hcCBmaWxlIChvdXQpCi0jICQoNik6IGluc3RhbGxlZCBhY29uZmlnIGZsYWdzIHN0b3JhZ2UgZmxhZyB2YWx1ZSBmaWxlIChvdXQpCi0jICQoNyk6IGlucHV0IGFjb25maWcgZmlsZXMgZm9yIHRoZSBwYXJ0aXRpb24gKGluKQotIyAkKDgpOiBwYXJ0aXRpb24gbmFtZQorIyAkKDQpOiBidWlsdCBhY29uZmlnIGZsYWdzIHN0b3JhZ2UgZmxhZyBpbmZvIGZpbGUgKG91dCkKKyMgJCg1KTogaW5zdGFsbGVkIGFjb25maWcgZmxhZ3Mgc3RvcmFnZSBwYWNrYWdlIG1hcCBmaWxlIChvdXQpCisjICQoNik6IGluc3RhbGxlZCBhY29uZmlnIGZsYWdzIHN0b3JhZ2UgZmxhZyBtYXAgZmlsZSAob3V0KQorIyAkKDcpOiBpbnN0YWxsZWQgYWNvbmZpZyBmbGFncyBzdG9yYWdlIGZsYWcgdmFsdWUgZmlsZSAob3V0KQorIyAkKDgpOiBpbnN0YWxsZWQgYWNvbmZpZyBmbGFncyBzdG9yYWdlIGZsYWcgaW5mbyBmaWxlIChvdXQpCisjICQoOSk6IGlucHV0IGFjb25maWcgZmlsZXMgZm9yIHRoZSBwYXJ0aXRpb24gKGluKQorIyAkKDEwKTogcGFydGl0aW9uIG5hbWUKIGRlZmluZSBnZW5lcmF0ZS1wYXJ0aXRpb24tYWNvbmZpZy1zdG9yYWdlLWZpbGUKICQoZXZhbCAkKHN0cmlwICQoMSkpOiBQUklWQVRFX09VVCA6PSAkKHN0cmlwICQoMSkpKQotJChldmFsICQoc3RyaXAgJCgxKSk6IFBSSVZBVEVfSU4gOj0gJChzdHJpcCAkKDcpKSkKLSQoc3RyaXAgJCgxKSk6ICQoQUNPTkZJRykgJChzdHJpcCAkKDcpKQorJChldmFsICQoc3RyaXAgJCgxKSk6IFBSSVZBVEVfSU4gOj0gJChzdHJpcCAkKDkpKSkKKworaWZuZXEgKCwkKFJFTEVBU0VfRklOR0VSUFJJTlRfQUNPTkZJR19QQUNLQUdFUykpCitTVE9SQUdFX0ZJTEVfVkVSU0lPTiA6PSAyCitlbHNlCitTVE9SQUdFX0ZJTEVfVkVSU0lPTiA6PSAxCitlbmRpZgorCiskKHN0cmlwICQoMSkpOiAkKEFDT05GSUcpICQoc3RyaXAgJCg5KSkKIAlta2RpciAtcCAkJChkaXIgJCQoUFJJVkFURV9PVVQpKQogCSQkKGlmICQkKFBSSVZBVEVfSU4pLCBcCi0JCSQkKEFDT05GSUcpIGNyZWF0ZS1zdG9yYWdlIC0tY29udGFpbmVyICQoOCkgLS1maWxlIHBhY2thZ2VfbWFwIC0tb3V0ICQkKFBSSVZBVEVfT1VUKSBcCisJCSQkKEFDT05GSUcpIGNyZWF0ZS1zdG9yYWdlIC0tY29udGFpbmVyICQoMTApIC0tZmlsZSBwYWNrYWdlX21hcCAtLW91dCAkJChQUklWQVRFX09VVCkgLS12ZXJzaW9uICQkKFNUT1JBR0VfRklMRV9WRVJTSU9OKSBcCiAJCQkkJChhZGRwcmVmaXggLS1jYWNoZSAsJCQoUFJJVkFURV9JTikpLCBcCiAJKQogCXRvdWNoICQkKFBSSVZBVEVfT1VUKQogJChldmFsICQoc3RyaXAgJCgyKSk6IFBSSVZBVEVfT1VUIDo9ICQoc3RyaXAgJCgyKSkpCi0kKGV2YWwgJChzdHJpcCAkKDIpKTogUFJJVkFURV9JTiA6PSAkKHN0cmlwICQoNykpKQotJChzdHJpcCAkKDIpKTogJChBQ09ORklHKSAkKHN0cmlwICQoNykpCiskKGV2YWwgJChzdHJpcCAkKDIpKTogUFJJVkFURV9JTiA6PSAkKHN0cmlwICQoOSkpKQorJChzdHJpcCAkKDIpKTogJChBQ09ORklHKSAkKHN0cmlwICQoOSkpCiAJbWtkaXIgLXAgJCQoZGlyICQkKFBSSVZBVEVfT1VUKSkKIAkkJChpZiAkJChQUklWQVRFX0lOKSwgXAotCQkkJChBQ09ORklHKSBjcmVhdGUtc3RvcmFnZSAtLWNvbnRhaW5lciAkKDgpIC0tZmlsZSBmbGFnX21hcCAtLW91dCAkJChQUklWQVRFX09VVCkgXAorCQkkJChBQ09ORklHKSBjcmVhdGUtc3RvcmFnZSAtLWNvbnRhaW5lciAkKDEwKSAtLWZpbGUgZmxhZ19tYXAgLS1vdXQgJCQoUFJJVkFURV9PVVQpIC0tdmVyc2lvbiAkJChTVE9SQUdFX0ZJTEVfVkVSU0lPTikgXAogCQkJJCQoYWRkcHJlZml4IC0tY2FjaGUgLCQkKFBSSVZBVEVfSU4pKSwgXAogCSkKIAl0b3VjaCAkJChQUklWQVRFX09VVCkKICQoZXZhbCAkKHN0cmlwICQoMykpOiBQUklWQVRFX09VVCA6PSAkKHN0cmlwICQoMykpKQotJChldmFsICQoc3RyaXAgJCgzKSk6IFBSSVZBVEVfSU4gOj0gJChzdHJpcCAkKDcpKSkKLSQoc3RyaXAgJCgzKSk6ICQoQUNPTkZJRykgJChzdHJpcCAkKDcpKQorJChldmFsICQoc3RyaXAgJCgzKSk6IFBSSVZBVEVfSU4gOj0gJChzdHJpcCAkKDkpKSkKKyQoc3RyaXAgJCgzKSk6ICQoQUNPTkZJRykgJChzdHJpcCAkKDkpKQogCW1rZGlyIC1wICQkKGRpciAkJChQUklWQVRFX09VVCkpCiAJJCQoaWYgJCQoUFJJVkFURV9JTiksIFwKLQkJJCQoQUNPTkZJRykgY3JlYXRlLXN0b3JhZ2UgLS1jb250YWluZXIgJCg4KSAtLWZpbGUgZmxhZ192YWwgLS1vdXQgJCQoUFJJVkFURV9PVVQpIFwKKwkJJCQoQUNPTkZJRykgY3JlYXRlLXN0b3JhZ2UgLS1jb250YWluZXIgJCgxMCkgLS1maWxlIGZsYWdfdmFsIC0tb3V0ICQkKFBSSVZBVEVfT1VUKSAtLXZlcnNpb24gJCQoU1RPUkFHRV9GSUxFX1ZFUlNJT04pIFwKIAkJJCQoYWRkcHJlZml4IC0tY2FjaGUgLCQkKFBSSVZBVEVfSU4pKSwgXAogCSkKIAl0b3VjaCAkJChQUklWQVRFX09VVCkKLSQoY2FsbCBjb3B5LW9uZS1maWxlLCAkKHN0cmlwICQoMSkpLCAkKDQpKQotJChjYWxsIGNvcHktb25lLWZpbGUsICQoc3RyaXAgJCgyKSksICQoNSkpCi0kKGNhbGwgY29weS1vbmUtZmlsZSwgJChzdHJpcCAkKDMpKSwgJCg2KSkKKyQoZXZhbCAkKHN0cmlwICQoNCkpOiBQUklWQVRFX09VVCA6PSAkKHN0cmlwICQoNCkpKQorJChldmFsICQoc3RyaXAgJCg0KSk6IFBSSVZBVEVfSU4gOj0gJChzdHJpcCAkKDkpKSkKKyQoc3RyaXAgJCg0KSk6ICQoQUNPTkZJRykgJChzdHJpcCAkKDkpKQorCW1rZGlyIC1wICQkKGRpciAkJChQUklWQVRFX09VVCkpCisJJCQoaWYgJCQoUFJJVkFURV9JTiksIFwKKwkJJCQoQUNPTkZJRykgY3JlYXRlLXN0b3JhZ2UgLS1jb250YWluZXIgJCgxMCkgLS1maWxlIGZsYWdfaW5mbyAtLW91dCAkJChQUklWQVRFX09VVCkgLS12ZXJzaW9uICQkKFNUT1JBR0VfRklMRV9WRVJTSU9OKSBcCisJCSQkKGFkZHByZWZpeCAtLWNhY2hlICwkJChQUklWQVRFX0lOKSksIFwKKwkpCisJdG91Y2ggJCQoUFJJVkFURV9PVVQpCiskKGNhbGwgY29weS1vbmUtZmlsZSwgJChzdHJpcCAkKDEpKSwgJCg1KSkKKyQoY2FsbCBjb3B5LW9uZS1maWxlLCAkKHN0cmlwICQoMikpLCAkKDYpKQorJChjYWxsIGNvcHktb25lLWZpbGUsICQoc3RyaXAgJCgzKSksICQoNykpCiskKGNhbGwgY29weS1vbmUtZmlsZSwgJChzdHJpcCAkKDQpKSwgJCg4KSkKIGVuZGVmCiAKIGlmZXEgKCQoUkVMRUFTRV9DUkVBVEVfQUNPTkZJR19TVE9SQUdFX0ZJTEUpLHRydWUpCkBAIC0xMzMsMTMgKzE2MSwxNiBAQAogCSQoZXZhbCBhY29uZmlnX3N0b3JhZ2VfcGFja2FnZV9tYXAuJChwYXJ0aXRpb24pIDo9ICQoUFJPRFVDVF9PVVQpLyQocGFydGl0aW9uKS9ldGMvYWNvbmZpZy9wYWNrYWdlLm1hcCkgXAogCSQoZXZhbCBhY29uZmlnX3N0b3JhZ2VfZmxhZ19tYXAuJChwYXJ0aXRpb24pIDo9ICQoUFJPRFVDVF9PVVQpLyQocGFydGl0aW9uKS9ldGMvYWNvbmZpZy9mbGFnLm1hcCkgXAogCSQoZXZhbCBhY29uZmlnX3N0b3JhZ2VfZmxhZ192YWwuJChwYXJ0aXRpb24pIDo9ICQoUFJPRFVDVF9PVVQpLyQocGFydGl0aW9uKS9ldGMvYWNvbmZpZy9mbGFnLnZhbCkgXAorCSQoZXZhbCBhY29uZmlnX3N0b3JhZ2VfZmxhZ19pbmZvLiQocGFydGl0aW9uKSA6PSAkKFBST0RVQ1RfT1VUKS8kKHBhcnRpdGlvbikvZXRjL2Fjb25maWcvZmxhZy5pbmZvKSBcCiAJJChldmFsICQoY2FsbCBnZW5lcmF0ZS1wYXJ0aXRpb24tYWNvbmZpZy1zdG9yYWdlLWZpbGUsIFwKIAkJCQkkKFRBUkdFVF9PVVRfRkxBR1MpLyQocGFydGl0aW9uKS9wYWNrYWdlLm1hcCwgXAogCQkJCSQoVEFSR0VUX09VVF9GTEFHUykvJChwYXJ0aXRpb24pL2ZsYWcubWFwLCBcCiAJCQkJJChUQVJHRVRfT1VUX0ZMQUdTKS8kKHBhcnRpdGlvbikvZmxhZy52YWwsIFwKKwkJCQkkKFRBUkdFVF9PVVRfRkxBR1MpLyQocGFydGl0aW9uKS9mbGFnLmluZm8sIFwKIAkJCQkkKGFjb25maWdfc3RvcmFnZV9wYWNrYWdlX21hcC4kKHBhcnRpdGlvbikpLCBcCiAJCQkJJChhY29uZmlnX3N0b3JhZ2VfZmxhZ19tYXAuJChwYXJ0aXRpb24pKSwgXAogCQkJCSQoYWNvbmZpZ19zdG9yYWdlX2ZsYWdfdmFsLiQocGFydGl0aW9uKSksIFwKKwkJCQkkKGFjb25maWdfc3RvcmFnZV9mbGFnX2luZm8uJChwYXJ0aXRpb24pKSwgXAogCQkJCSQoYWNvbmZpZ19mbGFnX3N1bW1hcmllc19wcm90b2J1Zi4kKHBhcnRpdGlvbikpLCBcCiAJCQkJJChwYXJ0aXRpb24pLCBcCiAJKSkgXApAQCAtMTU1LDYgKzE4Niw3IEBACiAJCQkkKGFjb25maWdfc3RvcmFnZV9wYWNrYWdlX21hcC4kKHBhcnRpdGlvbikpIFwKIAkJCSQoYWNvbmZpZ19zdG9yYWdlX2ZsYWdfbWFwLiQocGFydGl0aW9uKSkgXAogCQkJJChhY29uZmlnX3N0b3JhZ2VfZmxhZ192YWwuJChwYXJ0aXRpb24pKSBcCisJCQkkKGFjb25maWdfc3RvcmFnZV9mbGFnX2luZm8uJChwYXJ0aXRpb24pKSBcCiAJCSkpCiAKIEFMTF9ERUZBVUxUX0lOU1RBTExFRF9NT0RVTEVTICs9ICQocmVxdWlyZWRfZmxhZ3NfZmlsZXMpCkBAIC0xNzQsNSArMjA2LDUgQEAKIAkkKGV2YWwgYWNvbmZpZ19zdG9yYWdlX3BhY2thZ2VfbWFwLiQocGFydGl0aW9uKTo9KSBcCiAJJChldmFsIGFjb25maWdfc3RvcmFnZV9mbGFnX21hcC4kKHBhcnRpdGlvbik6PSkgXAogCSQoZXZhbCBhY29uZmlnX3N0b3JhZ2VfZmxhZ192YWwuJChwYXJ0aXRpb24pOj0pIFwKKwkkKGV2YWwgYWNvbmZpZ19zdG9yYWdlX2ZsYWdfaW5mby4kKHBhcnRpdGlvbik6PSkgXAogKQotCmRpZmYgLS1naXQgYS9jb3JlL3Byb2R1Y3QubWsgYi9jb3JlL3Byb2R1Y3QubWsKaW5kZXggNGMyM2U1ZC4uMWZiYzNlZSAxMDA2NDQKLS0tIGEvY29yZS9wcm9kdWN0Lm1rCisrKyBiL2NvcmUvcHJvZHVjdC5tawpAQCAtMjg0LDYgKzI4NCw5IEBACiAjIFdoZXRoZXIgQVBFWCBzaG91bGQgYmUgY29tcHJlc3NlZCBvciBub3QKIF9wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfQ09NUFJFU1NFRF9BUEVYCiAKKyMgRGVmYXVsdCBmcyB0eXBlIGZvciBBUEVYIHBheWxvYWQgaW1hZ2UgKGFwZXhfcGF5bG9hZC5pbWcpCitfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX0RFRkFVTFRfQVBFWF9QQVlMT0FEX1RZUEUKKwogIyBWTkRLIHZlcnNpb24gb2YgcHJvZHVjdCBwYXJ0aXRpb24uIEl0IGNhbiBiZSAnY3VycmVudCcgaWYgdGhlIHByb2R1Y3QKICMgcGFydGl0aW9ucyB1c2VzIFBMQVRGT1JNX1ZOREtfVkVSU0lPTi4KIF9wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfUFJPRFVDVF9WTkRLX1ZFUlNJT04KQEAgLTM2Niw2ICszNjksOCBAQAogX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9CVUlMRF9WQk1FVEFfSU1BR0UKIF9wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfQlVJTERfU1VQRVJfRU1QVFlfSU1BR0UKIF9wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfQlVJTERfUFZNRldfSU1BR0UKK19wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfQlVJTERfREVTS1RPUF9SRUNPVkVSWV9JTUFHRQorX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9CVUlMRF9ERVNLVE9QX1VQREFURV9JTUFHRQogCiAjIExpc3Qgb2YgYm9vdCBqYXJzIGRlbGl2ZXJlZCB2aWEgdXBkYXRhYmxlIEFQRVhlcywgZm9sbG93aW5nIHRoZSBzYW1lIGZvcm1hdCBhcwogIyBQUk9EVUNUX0JPT1RfSkFSUy4KQEAgLTM5MCwyMCArMzk1LDYgQEAKICMgSWYgc2V0LCBKYXZhIG1vZHVsZSBpbiBwcm9kdWN0IHBhcnRpdGlvbiBjYW5ub3QgdXNlIGhpZGRlbiBBUElzLgogX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9FTkZPUkNFX1BST0RVQ1RfUEFSVElUSU9OX0lOVEVSRkFDRQogCi0jIElmIHNldCwgb25seSBqYXZhX3Nka19saWJyYXJ5IGNhbiBiZSB1c2VkIGF0IGludGVyLXBhcnRpdGlvbiBkZXBlbmRlbmN5LgotIyBOb3RlOiBCdWlsZCBlcnJvciBpZiBCT0FSRF9WTkRLX1ZFUlNJT04gaXMgbm90IHNldCB3aGlsZQotIyAgICAgICBQUk9EVUNUX0VORk9SQ0VfSU5URVJfUEFSVElUSU9OX0pBVkFfU0RLX0xJQlJBUlkgaXMgdHJ1ZSwgYmVjYXVzZQotIyAgICAgICBQUk9EVUNUX0VORk9SQ0VfSU5URVJfUEFSVElUSU9OX0pBVkFfU0RLX0xJQlJBUlkgaGFzIG5vIG1lYW5pbmcgaWYKLSMgICAgICAgQk9BUkRfVk5ES19WRVJTSU9OIGlzIG5vdCBzZXQuCi0jIE5vdGU6IFdoZW4gUFJPRFVDVF9FTkZPUkNFX1BST0RVQ1RfUEFSVElUSU9OX0lOVEVSRkFDRSBpcyBub3Qgc2V0LCB0aGVyZSBhcmUKLSMgICAgICAgbm8gcmVzdHJpY3Rpb25zIGF0IGRlcGVuZGVuY3kgYmV0d2VlbiBzeXN0ZW0gYW5kIHByb2R1Y3QgcGFydGl0aW9uLgotX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9FTkZPUkNFX0lOVEVSX1BBUlRJVElPTl9KQVZBX1NES19MSUJSQVJZCi0KLSMgQWxsb3dsaXN0IGZvciBQUk9EVUNUX0VORk9SQ0VfSU5URVJfUEFSVElUSU9OX0pBVkFfU0RLX0xJQlJBUlkgb3B0aW9uLgotIyBMaXN0ZWQgbW9kdWxlcyBhcmUgYWxsb3dlZCBhdCBpbnRlci1wYXJ0aXRpb24gZGVwZW5kZW5jeSBldmVuIGlmIGl0IGlzbid0Ci0jIGEgamF2YV9zZGtfbGlicmFyeSBtb2R1bGUuCi1fcHJvZHVjdF9saXN0X3ZhcnMgKz0gUFJPRFVDVF9JTlRFUl9QQVJUSVRJT05fSkFWQV9MSUJSQVJZX0FMTE9XTElTVAotCiAjIEluc3RhbGwgYSBjb3B5IG9mIHRoZSBkZWJ1ZyBwb2xpY3kgdG8gdGhlIHN5c3RlbV9leHQgcGFydGl0aW9uLCBhbmQgYWxsb3cKICMgaW5pdC1zZWNvbmQtc3RhZ2UgdG8gbG9hZCBkZWJ1ZyBwb2xpY3kgZnJvbSBzeXN0ZW1fZXh0LgogIyBUaGlzIG9wdGlvbiBpcyBvbmx5IG1lYW50IHRvIGJlIHNldCBieSBjb21wbGlhbmNlIEdTSSB0YXJnZXRzLgpAQCAtNDM2LDggKzQyNyw5IEBACiAjIElmIHRydWUsIHRoZSBjZ3JvdXAgdjIgaGllcmFyY2h5IHdpbGwgYmUgc3BsaXQgaW50byBhcHBzL3N5c3RlbSBzdWJ0cmVlcwogX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9DR1JPVVBfVjJfU1lTX0FQUF9JU09MQVRJT05fRU5BQkxFRAogCi0jIExpc3Qgb2YgLmpzb24gZmlsZXMgdG8gYmUgbWVyZ2VkL2NvbXBpbGVkIGludG8gdmVuZG9yL2V0Yy9saW5rZXIuY29uZmlnLnBiCisjIExpc3Qgb2YgLmpzb24gZmlsZXMgdG8gYmUgbWVyZ2VkL2NvbXBpbGVkIGludG8gdmVuZG9yL2V0Yy9saW5rZXIuY29uZmlnLnBiIGFuZCBwcm9kdWN0L2V0Yy9saW5rZXIuY29uZmlnLnBiCiBfcHJvZHVjdF9saXN0X3ZhcnMgKz0gUFJPRFVDVF9WRU5ET1JfTElOS0VSX0NPTkZJR19GUkFHTUVOVFMKK19wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX1BST0RVQ1RfTElOS0VSX0NPTkZJR19GUkFHTUVOVFMKIAogIyBXaGV0aGVyIHRvIHVzZSB1c2VyZmF1bHRmZCBHQy4KICMgUG9zc2libGUgdmFsdWVzIGFyZToKQEAgLTQ5OSw2ICs0OTEsMjMgQEAKICMgSWYgc2V0LCBidWlsZCB3b3VsZCBnZW5lcmF0ZSBzeXN0ZW0gaW1hZ2UgZnJvbSBTb29uZy1kZWZpbmVkIG1vZHVsZS4KIF9wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzICs9IFBST0RVQ1RfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UKIAorIyBMaXN0IG9mIHN0dWIgbGlicmFyaWVzIHNwZWNpZmljIHRvIHRoZSBwcm9kdWN0IHRoYXQgYXJlIGFscmVhZHkgcHJlc2VudCBpbiB0aGUgc3lzdGVtIGltYWdlIGFuZAorIyBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIHN5c3RlbV9saW5rZXJfY29uZmlnLgorX3Byb2R1Y3RfbGlzdF92YXJzICs9IFBST0RVQ1RfRVhUUkFfU1RVQl9MSUJSQVJJRVMKKworIyBJZiBzZXQgdG8gdHJ1ZSwgYWxsIEFuZHJvaWQubWsgZmlsZXMgd2lsbCBiZSBpZ25vcmVkLgorX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9JR05PUkVfQUxMX0FORFJPSURNSworIyBXaGVuIFBST0RVQ1RfSUdOT1JFX0FMTF9BTkRST0lETUsgaXMgc2V0IHRvIHRydWUsIHRoaXMgdmFyaWFibGUgd2lsbCBiZSB1c2VkIHRvIGFsbG93IHNvbWUgQW5kcm9pZC5tayBmaWxlcy4KK19wcm9kdWN0X2xpc3RfdmFycyArPSBQUk9EVUNUX0FMTE9XRURfQU5EUk9JRE1LX0ZJTEVTCisjIFdoZW4gUFJPRFVDVF9JR05PUkVfQUxMX0FORFJPSURNSyBpcyBzZXQgdG8gdHJ1ZSwgcGF0aCBvZiBmaWxlIHRoYXQgY29udGFpbnMgYSBsaXN0IG9mIGFsbG93ZWQgQW5kcm9pZC5tayBmaWxlcworX3Byb2R1Y3Rfc2luZ2xlX3ZhbHVlX3ZhcnMgKz0gUFJPRFVDVF9BTkRST0lETUtfQUxMT1dMSVNUX0ZJTEUKKyMgU2V0dGluZyBQUk9EVUNUX1NPT05HX09OTFkgd2lsbCBjYXVzZSB0aGUgYnVpbGQgdG8gZGVmYXVsdCB0byAtLXNvb25nLW9ubHkgbW9kZSwgYW5kIHRoZSBtYWluCisjIGthdGkgaW52b2NhdGlvbiB3aWxsIG5vdCBiZSBydW4uCitfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX1NPT05HX09OTFkKKworIyBJZiBzZXQgdG8gdHJ1ZSwgdXNlIE5PVElDRS54bWwuZ3ogZ2VuZXJhdGVkIGJ5IHNvb25nCitfcHJvZHVjdF9zaW5nbGVfdmFsdWVfdmFycyArPSBQUk9EVUNUX1VTRV9TT09OR19OT1RJQ0VfWE1MCisKIC5LQVRJX1JFQURPTkxZIDo9IF9wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzIF9wcm9kdWN0X2xpc3RfdmFycwogX3Byb2R1Y3RfdmFyX2xpc3QgOj0kPSAkKF9wcm9kdWN0X3NpbmdsZV92YWx1ZV92YXJzKSAkKF9wcm9kdWN0X2xpc3RfdmFycykKIApkaWZmIC0tZ2l0IGEvY29yZS9wcm9kdWN0X2NvbmZpZy5tayBiL2NvcmUvcHJvZHVjdF9jb25maWcubWsKaW5kZXggNzM4ZDRjZi4uMDE5ZDcxMSAxMDA2NDQKLS0tIGEvY29yZS9wcm9kdWN0X2NvbmZpZy5taworKysgYi9jb3JlL3Byb2R1Y3RfY29uZmlnLm1rCkBAIC00MjQsMTAgKzQyNCwxMiBAQAogICBlbmRpZgogZW5kaWYKIAotJChmb3JlYWNoIHBhaXIsJChQUk9EVUNUX0FQRVhfQk9PVF9KQVJTKSwgXAotICAkKGV2YWwgamFyIDo9ICQoY2FsbCB3b3JkLWNvbG9uLDIsJChwYWlyKSkpIFwKLSAgJChpZiAkKGZpbmRzdHJpbmcgJChqYXIpLCAkKFBST0RVQ1RfQk9PVF9KQVJTKSksIFwKLSAgICAkKGVycm9yIEEgamFyIGluIFBST0RVQ1RfQVBFWF9CT09UX0pBUlMgbXVzdCBub3QgYmUgaW4gUFJPRFVDVF9CT09UX0pBUlMsIGJ1dCAkKGphcikgaXMpKSkKKyQoZm9yZWFjaCBhcGV4cGFpciwkKFBST0RVQ1RfQVBFWF9CT09UX0pBUlMpLCBcCisgICQoZm9yZWFjaCBwbGF0Zm9ybXBhaXIsJChQUk9EVUNUX0JPT1RfSkFSUyksIFwKKyAgICAkKGV2YWwgYXBleGphciA6PSAkKGNhbGwgd29yZC1jb2xvbiwyLCQoYXBleHBhaXIpKSkgXAorICAgICQoZXZhbCBwbGF0Zm9ybWphciA6PSAkKGNhbGwgd29yZC1jb2xvbiwyLCQocGxhdGZvcm1wYWlyKSkpIFwKKyAgICAkKGlmICQoZmlsdGVyICQoYXBleGphciksICQocGxhdGZvcm1qYXIpKSwgXAorICAgICAgJChlcnJvciBBIGphciBpbiBQUk9EVUNUX0FQRVhfQk9PVF9KQVJTIG11c3Qgbm90IGJlIGluIFBST0RVQ1RfQk9PVF9KQVJTLCBidXQgJChhcGV4amFyKSBpcykpKSkKIAogRU5GT1JDRV9TWVNURU1fQ0VSVElGSUNBVEUgOj0gJChQUk9EVUNUX0VORk9SQ0VfQVJUSUZBQ1RfU1lTVEVNX0NFUlRJRklDQVRFX1JFUVVJUkVNRU5UKQogRU5GT1JDRV9TWVNURU1fQ0VSVElGSUNBVEVfQUxMT1dfTElTVCA6PSAkKFBST0RVQ1RfQVJUSUZBQ1RfU1lTVEVNX0NFUlRJRklDQVRFX1JFUVVJUkVNRU5UX0FMTE9XX0xJU1QpCkBAIC00NjYsMTAgKzQ2OCwxNyBAQAogICAgICQoZXZhbCBTQU5JVElaRVIuJChUQVJHRVRfUFJPRFVDVCkuJChtKS5DT05GSUcgOj0gJChjZikpKSkKIF9wc21jX21vZHVsZXMgOj0KIAotIyBSZXNldCBBREIga2V5cyBmb3Igbm9uLWRlYnVnZ2FibGUgYnVpbGRzCi1pZmVxICgsJChmaWx0ZXIgZW5nIHVzZXJkZWJ1ZywkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSkpCisjIFJlc2V0IEFEQiBrZXlzLiBJZiBSRUxFQVNFX0JVSUxEX1VTRV9WQVJJQU5UX0ZMQUdTIGlzIHNldCBsb29rIGZvcgorIyB0aGUgdmFsdWUgb2YgYSBkZWRpY2F0ZWQgZmxhZy4gT3RoZXJ3aXNlIGNoZWNrIGlmIGJ1aWxkIHZhcmlhbnQgaXMKKyMgbm9uLWRlYnVnZ2FibGUuCitpZm5lcSAoLCQoUkVMRUFTRV9CVUlMRF9VU0VfVkFSSUFOVF9GTEFHUykpCitpZm5lcSAoLCQoUkVMRUFTRV9CVUlMRF9QVVJHRV9QUk9EVUNUX0FEQl9LRVlTKSkKICAgUFJPRFVDVF9BREJfS0VZUyA6PQogZW5kaWYKK2Vsc2UgaWZlcSAoLCQoZmlsdGVyIGVuZyB1c2VyZGVidWcsJChUQVJHRVRfQlVJTERfVkFSSUFOVCkpKQorICBQUk9EVUNUX0FEQl9LRVlTIDo9CitlbmRpZgorCiBpZm5lcSAoJChmaWx0ZXItb3V0IDAgMSwkKHdvcmRzICQoUFJPRFVDVF9BREJfS0VZUykpKSwpCiAgICQoZXJyb3IgT25seSBvbmUgZmlsZSBtYXkgYmUgaW4gUFJPRFVDVF9BREJfS0VZUzogJChQUk9EVUNUX0FEQl9LRVlTKSkKIGVuZGlmCkBAIC01MzIsNiArNTQxLDE3IEBACiAgIFBST0RVQ1RfQ09NUFJFU1NFRF9BUEVYIDo9ICQoT1ZFUlJJREVfUFJPRFVDVF9DT01QUkVTU0VEX0FQRVgpCiBlbmRpZgogCitpZmRlZiBPVkVSUklERV9QUk9EVUNUX0RFRkFVTFRfQVBFWF9QQVlMT0FEX1RZUEUKKyAgUFJPRFVDVF9ERUZBVUxUX0FQRVhfUEFZTE9BRF9UWVBFIDo9ICQoT1ZFUlJJREVfUFJPRFVDVF9ERUZBVUxUX0FQRVhfUEFZTE9BRF9UWVBFKQorZWxzZSBpZmVxICgkKFBST0RVQ1RfREVGQVVMVF9BUEVYX1BBWUxPQURfVFlQRSksKQorICAjIFVzZSBleHQ0IGFzIGEgZGVmYXVsdCBwYXlsb2FkIGZzIHR5cGUKKyAgUFJPRFVDVF9ERUZBVUxUX0FQRVhfUEFZTE9BRF9UWVBFIDo9IGV4dDQKK2VuZGlmCitpZmVxICgkKGZpbHRlciBleHQ0IGVyb2ZzLCQoUFJPRFVDVF9ERUZBVUxUX0FQRVhfUEFZTE9BRF9UWVBFKSksKQorICAkKGVycm9yIFBST0RVQ1RfREVGQVVMVF9BUEVYX1BBWUxPQURfVFlQRSBzaG91bGQgYmUgZWl0aGVyIGVyb2ZzIG9yIGV4dDQsXAorICAgIG5vdCAkKFBST0RVQ1RfREVGQVVMVF9BUEVYX1BBWUxPQURfVFlQRSkuKQorZW5kaWYKKwogJChLQVRJX29ic29sZXRlX3ZhciBPVkVSUklERV9QUk9EVUNUX0VYVFJBX1ZOREtfVkVSU0lPTlMgXAogICAgICxVc2UgUFJPRFVDVF9FWFRSQV9WTkRLX1ZFUlNJT05TIGluc3RlYWQpCiAKQEAgLTYwMiw3ICs2MjIsMTIgQEAKICAgICAjIFZlbmRvcnMgd2l0aCBHUkYgbXVzdCBkZWZpbmUgQk9BUkRfU0hJUFBJTkdfQVBJX0xFVkVMIGZvciB0aGUgdmVuZG9yIEFQSSBsZXZlbC4KICAgICAjIEluIHRoaXMgY2FzZSwgdGhlIFZTUiBBUEkgbGV2ZWwgaXMgdGhlIG1pbmltdW0gb2YgdGhlIFBST0RVQ1RfU0hJUFBJTkdfQVBJX0xFVkVMCiAgICAgIyBhbmQgUkVMRUFTRV9CT0FSRF9BUElfTEVWRUwKLSAgICBWU1JfVkVORE9SX0FQSV9MRVZFTCA6PSAkKGNhbGwgbWF0aF9taW4sJChWU1JfVkVORE9SX0FQSV9MRVZFTCksJChSRUxFQVNFX0JPQVJEX0FQSV9MRVZFTCkpCisgICAgYm9hcmRfYXBpX2xldmVsIDo9ICQoUkVMRUFTRV9CT0FSRF9BUElfTEVWRUwpCisgICAgaWZkZWYgQk9BUkRfQVBJX0xFVkVMX1BST1BfT1ZFUlJJREUKKyAgICAgIGJvYXJkX2FwaV9sZXZlbCA6PSAkKEJPQVJEX0FQSV9MRVZFTF9QUk9QX09WRVJSSURFKQorICAgIGVuZGlmCisgICAgVlNSX1ZFTkRPUl9BUElfTEVWRUwgOj0gJChjYWxsIG1hdGhfbWluLCQoVlNSX1ZFTkRPUl9BUElfTEVWRUwpLCQoYm9hcmRfYXBpX2xldmVsKSkKKyAgICBib2FyZF9hcGlfbGV2ZWwgOj0KICAgZW5kaWYKIGVuZGlmCiAuS0FUSV9SRUFET05MWSA6PSBWU1JfVkVORE9SX0FQSV9MRVZFTApAQCAtNjc0LDQgKzY5OSwxMiBAQAogCiBwcm9kdWN0LWJ1aWxkLWltYWdlLWNvbmZpZyA6PQogCitpZmRlZiBQUk9EVUNUX1NPT05HX09OTFkKKyAgaWZuZXEgKCQoUFJPRFVDVF9TT09OR19PTkxZKSx0cnVlKQorICAgIGlmbmVxICgkKFBST0RVQ1RfU09PTkdfT05MWSksZmFsc2UpCisgICAgICAkKGVycm9yIFBST0RVQ1RfU09PTkdfT05MWSBjYW4gb25seSBiZSB0cnVlLCBmYWxzZSBvciB1bnNldCkKKyAgICBlbmRpZgorICBlbmRpZgorZW5kaWYKKwogJChjYWxsIHJlYWRvbmx5LXByb2R1Y3QtdmFycykKZGlmZiAtLWdpdCBhL2NvcmUvcHJvZ3VhcmQuZmxhZ3MgYi9jb3JlL3Byb2d1YXJkLmZsYWdzCmluZGV4IGFhNDA2YjkuLjc2NjU1Y2EgMTAwNjQ0Ci0tLSBhL2NvcmUvcHJvZ3VhcmQuZmxhZ3MKKysrIGIvY29yZS9wcm9ndWFyZC5mbGFncwpAQCAtMSwxNCArMSwzIEBACi0jIFdlIGhhdmUgbW92ZWQgLWRvbnRvYmZ1c2NhdGUgYW5kIC1kb250b3B0aW1pemUgdG8gdGhlIG1ha2VmaWxlcy4KLSMgZGV4IGRvZXMgbm90IGxpa2UgY29kZSBydW4gdGhyb3VnaCBwcm9ndWFyZCBvcHRpbWl6ZSBhbmQgcHJldmVyaWZ5IHN0ZXBzLgotIyAtZG9udG9wdGltaXplCi0tZG9udHByZXZlcmlmeQotCi0jIERvbid0IG9iZnVzY2F0ZS4gV2Ugb25seSBuZWVkIGRlYWQgY29kZSBzdHJpcGluZy4KLSMgLWRvbnRvYmZ1c2NhdGUKLQotIyBBZGQgdGhpcyBmbGFnIGluIHlvdXIgcGFja2FnZSdzIG93biBjb25maWd1cmF0aW9uIGlmIGl0J3MgbmVlZGVkLgotIy1mbGF0dGVucGFja2FnZWhpZXJhcmNoeQotCiAjIEtlZXAgY2xhc3NlcyBhbmQgbWVtYmVycyB3aXRoIHRoZSBwbGF0Zm9ybS1kZWZpbmVkIEBWaXNpYmxlRm9yVGVzdGluZyBhbm5vdGF0aW9uLgogLWtlZXAgQGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nIGNsYXNzICoKIC1rZWVwY2xhc3NtZW1iZXJzIGNsYXNzICogewpAQCAtMzgsNiArMjcsMTcgQEAKICAgQGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLktlZXBGb3JXZWFrUmVmZXJlbmNlIDxmaWVsZHM+OwogfQogCisjIE5lZWRlZCB0byBlbnN1cmUgY2FsbGJhY2sgZmllbGQgcmVmZXJlbmNlcyBhcmUga2VwdCBpbiB0aGVpciByZXNwZWN0aXZlCisjIG93bmluZyBjbGFzc2VzIHdoZW4gdGhlIGRvd25zdHJlYW0gY2FsbGJhY2sgcmVnaXN0cmFycyBvbmx5IHN0b3JlIHdlYWsgcmVmcy4KKy1pZiBAY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuV2Vha2x5UmVmZXJlbmNlZENhbGxiYWNrIGNsYXNzICoKKy1rZWVwY2xhc3NtZW1iZXJzLGFsbG93YWNjZXNzbW9kaWZpY2F0aW9uLGFsbG93b2JmdXNjYXRpb24sYWxsb3dzaHJpbmtpbmcgY2xhc3MgKiB7CisgICFzeW50aGV0aWMgPDE+ICo7Cit9CistaWYgY2xhc3MgKiBleHRlbmRzIEBjb20uYW5kcm9pZC5pbnRlcm5hbC5hbm5vdGF0aW9ucy5XZWFrbHlSZWZlcmVuY2VkQ2FsbGJhY2sgKioKKy1rZWVwY2xhc3NtZW1iZXJzLGFsbG93YWNjZXNzbW9kaWZpY2F0aW9uLGFsbG93b2JmdXNjYXRpb24sYWxsb3dzaHJpbmtpbmcgY2xhc3MgKiB7CisgICFzeW50aGV0aWMgPDE+ICo7Cit9CisKICMgVW5kZXJzdGFuZCB0aGUgY29tbW9uIEBLZWVwIGFubm90YXRpb24gZnJvbSB2YXJpb3VzIEFuZHJvaWQgcGFja2FnZXM6CiAjICAqIGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uCiAjICAqIGFuZHJvaWR4LmFubm90YXRpb24KZGlmZiAtLWdpdCBhL2NvcmUvcHJvZ3VhcmQvY2hlY2tub3RudWxsLmZsYWdzIGIvY29yZS9wcm9ndWFyZC9jaGVja25vdG51bGwuZmxhZ3MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUxZTVjZQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvcHJvZ3VhcmQvY2hlY2tub3RudWxsLmZsYWdzCkBAIC0wLDAgKzEsMjUgQEAKKyMgVGVsbCBSOCB0aGF0IHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgY2hlY2sgbm90IG51bGwgbWV0aG9kcywgYW5kIHRvCisjIHJlcGxhY2UgaW52b2NhdGlvbnMgdG8gdGhlbSB3aXRoIGEgbW9yZSBjb25jaXNlIG51bGxuZXNzIGNoZWNrIHRoYXQgcHJvZHVjZXMKKyMgKHNsaWdodGx5KSBsZXNzIGluZm9ybWF0aXZlIGVycm9yIG1lc3NhZ2VzCisKKy1jb252ZXJ0Y2hlY2tub3RudWxsIGNsYXNzIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuUHJlY29uZGl0aW9ucyB7CisgICoqIGNoZWNrTm90TnVsbCguLi4pOworfQorCistY29udmVydGNoZWNrbm90bnVsbCBjbGFzcyBqYXZhLnV0aWwuT2JqZWN0cyB7CisgICoqIHJlcXVpcmVOb25OdWxsKC4uLik7Cit9CisKKy1jb252ZXJ0Y2hlY2tub3RudWxsIGNsYXNzIGtvdGxpbi5qdm0uaW50ZXJuYWwuSW50cmluc2ljcyB7CisgIHZvaWQgY2hlY2tOb3ROdWxsKC4uLik7CisgIHZvaWQgY2hlY2tFeHByZXNzaW9uVmFsdWVJc05vdE51bGwoLi4uKTsKKyAgdm9pZCBjaGVja05vdE51bGxFeHByZXNzaW9uVmFsdWUoLi4uKTsKKyAgdm9pZCBjaGVja1JldHVybmVkVmFsdWVJc05vdE51bGwoLi4uKTsKKyAgdm9pZCBjaGVja0ZpZWxkSXNOb3ROdWxsKC4uLik7CisgIHZvaWQgY2hlY2tQYXJhbWV0ZXJJc05vdE51bGwoLi4uKTsKKyAgdm9pZCBjaGVja05vdE51bGxQYXJhbWV0ZXIoLi4uKTsKK30KKworLWNvbnZlcnRjaGVja25vdG51bGwgY2xhc3MgZGFnZ2VyLmludGVybmFsLlByZWNvbmRpdGlvbnMgeworICAqKiBjaGVja05vdE51bGwqKC4uLik7Cit9CmRpZmYgLS1naXQgYS9jb3JlL3Byb2d1YXJkX2Jhc2ljX2tlZXBzLmZsYWdzIGIvY29yZS9wcm9ndWFyZF9iYXNpY19rZWVwcy5mbGFncwppbmRleCBmNmIzNGI4Li5hOTQxNmQ1IDEwMDY0NAotLS0gYS9jb3JlL3Byb2d1YXJkX2Jhc2ljX2tlZXBzLmZsYWdzCisrKyBiL2NvcmUvcHJvZ3VhcmRfYmFzaWNfa2VlcHMuZmxhZ3MKQEAgLTEsNyArMSwzIEBACi0jIFNvbWUgY2xhc3NlcyBpbiB0aGUgbGlicmFyaWVzIGV4dGVuZCBwYWNrYWdlIHByaXZhdGUgY2xhc3NlcyB0byBjaGFyZSBjb21tb24gZnVuY3Rpb25hbGl0eQotIyB0aGF0IGlzbid0IGV4cGxpY2l0bHkgcGFydCBvZiB0aGUgQVBJCi0tZG9udHNraXBub25wdWJsaWNsaWJyYXJ5Y2xhc3NlcyAtZG9udHNraXBub25wdWJsaWNsaWJyYXJ5Y2xhc3NtZW1iZXJzCi0KICMgUHJlc2VydmUgbGluZSBudW1iZXIgaW5mb3JtYXRpb24gZm9yIGRlYnVnZ2luZyBzdGFjayB0cmFjZXMuCiAta2VlcGF0dHJpYnV0ZXMgU291cmNlRmlsZSxMaW5lTnVtYmVyVGFibGUKIApkaWZmIC0tZ2l0IGEvY29yZS9yYXZlbndvb2RfdGVzdF9jb25maWdfdGVtcGxhdGUueG1sIGIvY29yZS9yYXZlbndvb2RfdGVzdF9jb25maWdfdGVtcGxhdGUueG1sCmluZGV4IDJmMjFiYWUuLjllOWRkNzYgMTAwNjQ0Ci0tLSBhL2NvcmUvcmF2ZW53b29kX3Rlc3RfY29uZmlnX3RlbXBsYXRlLnhtbAorKysgYi9jb3JlL3JhdmVud29vZF90ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwKQEAgLTIyLDYgKzIyLDcgQEAKICAgICA8b3B0aW9uIG5hbWU9InVzZS1yYXZlbndvb2QtcmVzb3VyY2VzIiB2YWx1ZT0idHJ1ZSIgLz4KICAgICA8b3B0aW9uIG5hbWU9ImV4Y2x1ZGUtcGF0aHMiIHZhbHVlPSJqYXZhIiAvPgogICAgIDxvcHRpb24gbmFtZT0ibnVsbC1kZXZpY2UiIHZhbHVlPSJ0cnVlIiAvPgorICAgIDxvcHRpb24gbmFtZT0iZG8tbm90LXN3YWxsb3ctcnVubmVyLWVycm9ycyIgdmFsdWU9InRydWUiIC8+CiAKICAgICB7RVhUUkFfQ09ORklHU30KIApkaWZmIC0tZ2l0IGEvY29yZS9yZWxlYXNlX2NvbmZpZy5tayBiL2NvcmUvcmVsZWFzZV9jb25maWcubWsKaW5kZXggZmUyMTcwZS4uYzY5ODZjNyAxMDA2NDQKLS0tIGEvY29yZS9yZWxlYXNlX2NvbmZpZy5taworKysgYi9jb3JlL3JlbGVhc2VfY29uZmlnLm1rCkBAIC0xNDYsNiArMTQ2LDkgQEAKICAgICAgICAgIyBUaGlzIHdpbGwgYWxzbyBzZXQgQUxMX1JFTEVBU0VfQ09ORklHU19GT1JfUFJPRFVDVCBhbmQgX3VzZWRfZmlsZXMgZm9yIHVzLgogICAgICAgICAkKGV2YWwgaW5jbHVkZSAkKF9mbGFnc19maWxlKSkKICAgICAgICAgJChLQVRJX2V4dHJhX2ZpbGVfZGVwcyAkKE9VVF9ESVIpL3JlbGVhc2UtY29uZmlnICQocHJvdG9idWZfbWFwX2ZpbGVzKSAkKF9mbGFnc19maWxlKSkKKyAgICAgICAgaWZuZXEgKCwkKF9kaXNhbGxvd19sdW5jaF91c2UpKQorICAgICAgICAgICAgJChlcnJvciBSZWxlYXNlIGNvbmZpZyAke1RBUkdFVF9SRUxFQVNFfSBpcyBkaXNhbGxvd2VkIGZvciBidWlsZC4gIFBsZWFzZSB1c2Ugb25lIG9mOiAkKEFMTF9SRUxFQVNFX0NPTkZJR1NfRk9SX1BST0RVQ1QpKQorICAgICAgICBlbmRpZgogICAgIGVsc2UKICAgICAgICAgIyBUaGlzIGlzIHRoZSBmaXJzdCBwYXNzIG9mIHByb2R1Y3QgY29uZmlnLgogICAgICAgICAkKGV2YWwgaW5jbHVkZSAkKF9mbGFnc192YXJtaykpCkBAIC0xNTMsMjAgKzE1Niw2IEBACiAgICAgX3VzZWRfZmlsZXMgOj0KICAgICBpZmVxICgsJChfbXVzdF9wcm90b2J1ZikkKFJFTEVBU0VfQlVJTERfRkxBR1NfSU5fUFJPVE9CVUYpKQogICAgICAgICBfdXNlX3Byb3RvYnVmIDo9Ci0gICAgZWxzZQotICAgICAgICBfYmFzZV9hbGxfcmVsZWFzZSA6PSBhbGxfcmVsZWFzZV9jb25maWdzLSQoVEFSR0VUX1BST0RVQ1QpCi0gICAgICAgICQoY2FsbCBkaXN0LWZvci1nb2Fscyxkcm9pZCxcCi0gICAgICAgICAgICAkKF9mbGFnc19kaXIpLyQoX2Jhc2VfYWxsX3JlbGVhc2UpLnBiOmJ1aWxkX2ZsYWdzL2FsbF9yZWxlYXNlX2NvbmZpZ3MucGIgXAotICAgICAgICAgICAgJChfZmxhZ3NfZGlyKS8kKF9iYXNlX2FsbF9yZWxlYXNlKS50ZXh0cHJvdG86YnVpbGRfZmxhZ3MvYWxsX3JlbGVhc2VfY29uZmlncy50ZXh0cHJvdG8gXAotICAgICAgICAgICAgJChfZmxhZ3NfZGlyKS8kKF9iYXNlX2FsbF9yZWxlYXNlKS5qc29uOmJ1aWxkX2ZsYWdzL2FsbF9yZWxlYXNlX2NvbmZpZ3MuanNvbiBcCi0gICAgICAgICAgICAkKF9mbGFnc19kaXIpL2luaGVyaXRhbmNlX2dyYXBoLSQoVEFSR0VUX1BST0RVQ1QpLmRvdDpidWlsZF9mbGFncy9pbmhlcml0YW5jZV9ncmFwaC0kKFRBUkdFVF9QUk9EVUNUKS5kb3QgXAotICAgICAgICApCi0jIFRoZXNlIGFyZSBhbHdheXMgY3JlYXRlZCwgYWRkIGFuIGVtcHR5IHJ1bGUgZm9yIHRoZW0gdG8ga2VlcCBuaW5qYSBoYXBweS4KLSQoX2ZsYWdzX2RpcikvaW5oZXJpdGFuY2VfZ3JhcGgtJChUQVJHRVRfUFJPRFVDVCkuZG90OgotCTogY3JlYXRlZCBieSAkKE9VVF9ESVIpL3JlbGVhc2UtY29uZmlnCi0kKF9mbGFnc19kaXIpLyQoX2Jhc2VfYWxsX3JlbGVhc2UpLnBiICQoX2ZsYWdzX2RpcikvJChfYmFzZV9hbGxfcmVsZWFzZSkudGV4dHByb3RvICQoX2ZsYWdzX2RpcikvJChfYmFzZV9hbGxfcmVsZWFzZSkuanNvbjoKLQk6IGNyZWF0ZWQgYnkgJChPVVRfRElSKS9yZWxlYXNlLWNvbmZpZwotICAgICAgICBfYmFzZV9hbGxfcmVsZWFzZSA6PQogICAgIGVuZGlmCiAgICAgX2ZsYWdzX2Rpcjo9CiAgICAgX2ZsYWdzX2ZpbGU6PQpkaWZmIC0tZ2l0IGEvY29yZS9yb2JvbGVjdHJpY190ZXN0X2NvbmZpZ190ZW1wbGF0ZS54bWwgYi9jb3JlL3JvYm9sZWN0cmljX3Rlc3RfY29uZmlnX3RlbXBsYXRlLnhtbAppbmRleCBiMWQwYzJmLi41MDlhYzdiIDEwMDY0NAotLS0gYS9jb3JlL3JvYm9sZWN0cmljX3Rlc3RfY29uZmlnX3RlbXBsYXRlLnhtbAorKysgYi9jb3JlL3JvYm9sZWN0cmljX3Rlc3RfY29uZmlnX3RlbXBsYXRlLnhtbApAQCAtMTgsMTMgKzE4LDIyIEBACiAgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9InJvYm9sZWN0cmljIiAvPgogICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJyb2JvbGVjdHJpYy10ZXN0cyIgLz4KIAotICAgIDxvcHRpb24gbmFtZT0iamF2YS1mb2xkZXIiIHZhbHVlPSJwcmVidWlsdHMvamRrL2pkazIxL2xpbnV4LXg4Ni8iIC8+CiAgICAgPG9wdGlvbiBuYW1lPSJleGNsdWRlLXBhdGhzIiB2YWx1ZT0iamF2YSIgLz4KICAgICA8b3B0aW9uIG5hbWU9InVzZS1yb2JvbGVjdHJpYy1yZXNvdXJjZXMiIHZhbHVlPSJ0cnVlIiAvPgogCisgICAgPCEtLSBhdHRlbXB0IHRvIGFsd2F5cyBzaG93IFRyYWRlZmVkIGVycm9ycyAtLT4KKyAgICA8b3B0aW9uIG5hbWU9ImRvLW5vdC1zd2FsbG93LXJ1bm5lci1lcnJvcnMiIHZhbHVlPSJ0cnVlIiAvPgorCisgICAgPCEtLSBwcmV2ZW50IFRyYWRlZmVkIGZyb20gaGFuZ2luZyBpbmRlZmluaXRlbHkgaW4gQ0kgLS0+CisgICAgPG9wdGlvbiBuYW1lPSJzb2NrZXQtdGltZW91dCIgdmFsdWU9IjYwMDAwMCIgLz4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3QtY2FzZS10aW1lb3V0IiB2YWx1ZT0iMm0iIC8+CisKICAgICB7RVhUUkFfQ09ORklHU30KIAogICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5Jc29sYXRlZEhvc3RUZXN0IiA+CisKKyAgICAgICAge0VYVFJBX1RFU1RfUlVOTkVSX0NPTkZJR1N9CisKICAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXIiIHZhbHVlPSJ7TU9EVUxFfS5qYXIiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iamF2YS1mbGFncyIgdmFsdWU9Ii0tYWRkLW1vZHVsZXM9amRrLmNvbXBpbGVyIi8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iamF2YS1mbGFncyIgdmFsdWU9Ii0tYWRkLW9wZW5zPWphdmEuYmFzZS9qYXZhLmxhbmc9QUxMLVVOTkFNRUQiLz4KQEAgLTMzLDUgKzQyLDE1IEBACiAgICAgICAgIDxvcHRpb24gbmFtZT0iamF2YS1mbGFncyIgdmFsdWU9Ii0tYWRkLW9wZW5zPWphdmEuYmFzZS9qZGsuaW50ZXJuYWwudXRpbC5yYW5kb209QUxMLVVOTkFNRUQiLz4KICAgICAgICAgPCEtLSBiLzI1MTM4NzI1NSAtLT4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXZhLWZsYWdzIiB2YWx1ZT0iLS1hZGQtb3BlbnM9amF2YS5iYXNlL2phdmEuaW89QUxMLVVOTkFNRUQiLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXZhLWZsYWdzIiB2YWx1ZT0iLS1hZGQtb3BlbnM9amF2YS5iYXNlL2phdmEubmV0PUFMTC1VTk5BTUVEIi8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iamF2YS1mbGFncyIgdmFsdWU9Ii0tYWRkLW9wZW5zPWphdmEuYmFzZS9qYXZhLm5pbz1BTEwtVU5OQU1FRCIvPiA8IS0tIHJlcXVpcmVkIGZvciBTaGFkb3dWTVJ1bnRpbWUgLS0+CisgICAgICAgIDxvcHRpb24gbmFtZT0iamF2YS1mbGFncyIgdmFsdWU9Ii0tYWRkLW9wZW5zPWphdmEuYmFzZS9qYXZhLnNlY3VyaXR5PUFMTC1VTk5BTUVEIi8+CisgICAgICAgIDxvcHRpb24gbmFtZT0iamF2YS1mbGFncyIgdmFsdWU9Ii0tYWRkLW9wZW5zPWphdmEuYmFzZS9qYXZhLnRleHQ9QUxMLVVOTkFNRUQiLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXZhLWZsYWdzIiB2YWx1ZT0iLS1hZGQtb3BlbnM9amF2YS5iYXNlL2phdmEudXRpbD1BTEwtVU5OQU1FRCIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphdmEtZmxhZ3MiIHZhbHVlPSItLWFkZC1vcGVucz1qYXZhLmJhc2UvamRrLmludGVybmFsLmFjY2Vzcz1BTEwtVU5OQU1FRCIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphdmEtZmxhZ3MiIHZhbHVlPSItLWFkZC1vcGVucz1qYXZhLmRlc2t0b3AvamF2YS5hd3QuZm9udD1BTEwtVU5OQU1FRCIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphdmEtZmxhZ3MiIHZhbHVlPSItLWFkZC1vcGVucz1qZGsuY29tcGlsZXIvY29tLnN1bi50b29scy5qYXZhYy5hcGk9QUxMLVVOTkFNRUQiLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJqYXZhLWZsYWdzIiB2YWx1ZT0iLS1hZGQtb3BlbnM9amRrLmNvbXBpbGVyL2NvbS5zdW4udG9vbHMuamF2YWMubWFpbj1BTEwtVU5OQU1FRCIvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImphdmEtZmxhZ3MiIHZhbHVlPSItLWFkZC1vcGVucz1qZGsuY29tcGlsZXIvY29tLnN1bi50b29scy5qYXZhYy51dGlsPUFMTC1VTk5BTUVEIi8+CiAgICAgPC90ZXN0PgogPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvY29yZS9zb29uZ19hcHBfcHJlYnVpbHQubWsgYi9jb3JlL3Nvb25nX2FwcF9wcmVidWlsdC5tawppbmRleCBkZjFjZjJkLi5hYjkyMjdmIDEwMDY0NAotLS0gYS9jb3JlL3Nvb25nX2FwcF9wcmVidWlsdC5taworKysgYi9jb3JlL3Nvb25nX2FwcF9wcmVidWlsdC5tawpAQCAtMjI0LDMwICsyMjQsNiBAQAogaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvbGlua190eXBlLm1rCiBlbmRpZiAjICFMT0NBTF9JU19IT1NUX01PRFVMRQogCi1pZmVxICgsJChmaWx0ZXIgdGVzdHMsJChMT0NBTF9NT0RVTEVfVEFHUykpKQotICBpZmRlZiBMT0NBTF9TT09OR19ERVZJQ0VfUlJPX0RJUlMKLSAgICAkKGNhbGwgYXBwZW5kX2VuZm9yY2VfcnJvX3NvdXJjZXMsIFwKLSAgICAgICAgJChteV9yZWdpc3Rlcl9uYW1lKSwgXAotICAgICAgICBmYWxzZSwgXAotICAgICAgICAkKExPQ0FMX0ZVTExfTUFOSUZFU1RfRklMRSksIFwKLSAgICAgICAgJChpZiAkKExPQ0FMX0VYUE9SVF9QQUNLQUdFX1JFU09VUkNFUyksdHJ1ZSxmYWxzZSksIFwKLSAgICAgICAgJChMT0NBTF9TT09OR19ERVZJQ0VfUlJPX0RJUlMpLCBcCi0gICAgICAgIHZlbmRvciBcCi0gICAgKQotICBlbmRpZgotCi0gIGlmZGVmIExPQ0FMX1NPT05HX1BST0RVQ1RfUlJPX0RJUlMKLSAgICAkKGNhbGwgYXBwZW5kX2VuZm9yY2VfcnJvX3NvdXJjZXMsIFwKLSAgICAgICAgJChteV9yZWdpc3Rlcl9uYW1lKSwgXAotICAgICAgICBmYWxzZSwgXAotICAgICAgICAkKExPQ0FMX0ZVTExfTUFOSUZFU1RfRklMRSksIFwKLSAgICAgICAgJChpZiAkKExPQ0FMX0VYUE9SVF9QQUNLQUdFX1JFU09VUkNFUyksdHJ1ZSxmYWxzZSksIFwKLSAgICAgICAgJChMT0NBTF9TT09OR19QUk9EVUNUX1JST19ESVJTKSwgXAotICAgICAgICBwcm9kdWN0IFwKLSAgICApCi0gIGVuZGlmCi1lbmRpZgotCiBpZmRlZiBMT0NBTF9QUkVCVUlMVF9DT1ZFUkFHRV9BUkNISVZFCiAgIG15X2NvdmVyYWdlX2RpciA6PSAkKFRBUkdFVF9PVVRfQ09WRVJBR0UpLyQocGF0c3Vic3QgJChQUk9EVUNUX09VVCkvJSwlLCQobXlfbW9kdWxlX3BhdGgpKQogICBteV9jb3ZlcmFnZV9jb3B5X3BhaXJzIDo9ICQoZm9yZWFjaCBmLCQoTE9DQUxfUFJFQlVJTFRfQ09WRVJBR0VfQVJDSElWRSksJChmKTokKG15X2NvdmVyYWdlX2RpcikvJChub3RkaXIgICQoZikpKQpkaWZmIC0tZ2l0IGEvY29yZS9zb29uZ19jb25maWcubWsgYi9jb3JlL3Nvb25nX2NvbmZpZy5tawppbmRleCAxZTYzODhhLi5iZDUyZDg4IDEwMDY0NAotLS0gYS9jb3JlL3Nvb25nX2NvbmZpZy5taworKysgYi9jb3JlL3Nvb25nX2NvbmZpZy5tawpAQCAtMTUwLDYgKzE1MCw3IEBACiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgQnRDb25maWdJbmNsdWRlRGlyLCAgICAgICAgICAgICAgICAkKEJPQVJEX0JMVUVUT09USF9CRFJPSURfQlVJTERDRkdfSU5DTFVERV9ESVIpKQogJChjYWxsIGFkZF9qc29uX2xpc3QsIERldmljZUtlcm5lbEhlYWRlcnMsICAgICAgICAgICAgICAgJChUQVJHRVRfREVWSUNFX0tFUk5FTF9IRUFERVJTKSAkKFRBUkdFVF9CT0FSRF9LRVJORUxfSEVBREVSUykgJChUQVJHRVRfUFJPRFVDVF9LRVJORUxfSEVBREVSUykpCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgVmVuZG9yQXBpTGV2ZWwsICAgICAgICAgICAgICAgICAgICAkKEJPQVJEX0FQSV9MRVZFTCkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgVmVuZG9yQXBpTGV2ZWxQcm9wT3ZlcnJpZGUsICAgICAgICAkKEJPQVJEX0FQSV9MRVZFTF9QUk9QX09WRVJSSURFKSkKICQoY2FsbCBhZGRfanNvbl9saXN0LCBFeHRyYVZuZGtWZXJzaW9ucywgICAgICAgICAgICAgICAgICQoUFJPRFVDVF9FWFRSQV9WTkRLX1ZFUlNJT05TKSkKICQoY2FsbCBhZGRfanNvbl9saXN0LCBEZXZpY2VTeXN0ZW1TZGtWZXJzaW9ucywgICAgICAgICAgICQoQk9BUkRfU1lTVEVNU0RLX1ZFUlNJT05TKSkKICQoY2FsbCBhZGRfanNvbl9saXN0LCBQbGF0Zm9ybV9zeXN0ZW1zZGtfdmVyc2lvbnMsICAgICAgICQoUExBVEZPUk1fU1lTVEVNU0RLX1ZFUlNJT05TKSkKQEAgLTE4MiwxMCArMTgzLDIxIEBACiAKICQoY2FsbCBhZGRfanNvbl9ib29sLCBVbWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoZmlsdGVyIHRydWUsJChUQVJHRVRfVVNFUl9NT0RFX0xJTlVYKSkpCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgVmVuZG9yUGF0aCwgICAgICAgICAgICAgICAgICAgICAgICAkKFRBUkdFVF9DT1BZX09VVF9WRU5ET1IpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgIFZlbmRvckRsa21QYXRoLCAgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfQ09QWV9PVVRfVkVORE9SX0RMS00pKQorJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJ1aWxkaW5nVmVuZG9ySW1hZ2UsICAgICAgICAgICAgICAgJChCVUlMRElOR19WRU5ET1JfSU1BR0UpKQogJChjYWxsIGFkZF9qc29uX3N0ciwgIE9kbVBhdGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfQ09QWV9PVVRfT0RNKSkKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBCdWlsZGluZ09kbUltYWdlLCAgICAgICAgICAgICAgICAgICQoQlVJTERJTkdfT0RNX0lNQUdFKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsICBPZG1EbGttUGF0aCwgICAgICAgICAgICAgICAgICAgICAgICQoVEFSR0VUX0NPUFlfT1VUX09ETV9ETEtNKSkKICQoY2FsbCBhZGRfanNvbl9zdHIsICBQcm9kdWN0UGF0aCwgICAgICAgICAgICAgICAgICAgICAgICQoVEFSR0VUX0NPUFlfT1VUX1BST0RVQ1QpKQorJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJ1aWxkaW5nUHJvZHVjdEltYWdlLCAgICAgICAgICAgICAgJChCVUlMRElOR19QUk9EVUNUX0lNQUdFKSkKICQoY2FsbCBhZGRfanNvbl9zdHIsICBTeXN0ZW1FeHRQYXRoLCAgICAgICAgICAgICAgICAgICAgICQoVEFSR0VUX0NPUFlfT1VUX1NZU1RFTV9FWFQpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgIFN5c3RlbURsa21QYXRoLCAgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfQ09QWV9PVVRfU1lTVEVNX0RMS00pKQorJChjYWxsIGFkZF9qc29uX3N0ciwgIE9lbVBhdGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfQ09QWV9PVVRfT0VNKSkKICQoY2FsbCBhZGRfanNvbl9ib29sLCBNaW5pbWl6ZUphdmFEZWJ1Z0luZm8sICAgICAgICAgICAgICQoZmlsdGVyIHRydWUsJChQUk9EVUNUX01JTklNSVpFX0pBVkFfREVCVUdfSU5GTykpKQorJChjYWxsIGFkZF9qc29uX3N0ciwgIFJlY292ZXJ5UGF0aCwgICAgICAgICAgICAgICAgICAgICAgJChUQVJHRVRfQ09QWV9PVVRfUkVDT1ZFUlkpKQorJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJ1aWxkaW5nUmVjb3ZlcnlJbWFnZSwgICAgICAgICAgICAgJChCVUlMRElOR19SRUNPVkVSWV9JTUFHRSkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgVXNlcmRhdGFQYXRoLCAgICAgICAgICAgICAgICAgICAgICAkKFRBUkdFVF9DT1BZX09VVF9EQVRBKSkKKyQoY2FsbCBhZGRfanNvbl9ib29sLCBCdWlsZGluZ1VzZXJkYXRhSW1hZ2UsICAgICAgICAgICAgICQoQlVJTERJTkdfVVNFUkRBVEFfSU1BR0UpKQogCiAkKGNhbGwgYWRkX2pzb25fYm9vbCwgVXNlR29tYSwgICAgICAgICAgICAgICAgICAgICAgICAgICAkKGZpbHRlci1vdXQgZmFsc2UsJChVU0VfR09NQSkpKQogJChjYWxsIGFkZF9qc29uX2Jvb2wsIFVzZVJCRSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChmaWx0ZXItb3V0IGZhbHNlLCQoVVNFX1JCRSkpKQpAQCAtMjQyLDYgKzI1NCw4IEBACiAkKGNhbGwgYWRkX2pzb25fYm9vbCwgVXNlU29vbmdTeXN0ZW1JbWFnZSwgICAgICAgICAgICAgICAkKGZpbHRlciB0cnVlLCQoVVNFX1NPT05HX0RFRklORURfU1lTVEVNX0lNQUdFKSkpCiAkKGNhbGwgYWRkX2pzb25fc3RyLCAgUHJvZHVjdFNvb25nRGVmaW5lZFN5c3RlbUltYWdlLCAgICAkKFBST0RVQ1RfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UpKQogCiskKGNhbGwgYWRkX2pzb25fYm9vbCwgVXNlU29vbmdOb3RpY2VYTUwsICQoZmlsdGVyIHRydWUsJChQUk9EVUNUX1VTRV9TT09OR19OT1RJQ0VfWE1MKSkpCisKICQoY2FsbCBhZGRfanNvbl9tYXAsIFZlbmRvclZhcnMpCiAkKGZvcmVhY2ggbmFtZXNwYWNlLCQoc29ydCAkKFNPT05HX0NPTkZJR19OQU1FU1BBQ0VTKSksXAogICAkKGNhbGwgYWRkX2pzb25fbWFwLCAkKG5hbWVzcGFjZSkpXApAQCAtMjY1LDE0ICsyNzksOCBAQAogJChjYWxsIGFkZF9qc29uX2Jvb2wsIEVuZm9yY2VQcm9kdWN0UGFydGl0aW9uSW50ZXJmYWNlLCAgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfRU5GT1JDRV9QUk9EVUNUX1BBUlRJVElPTl9JTlRFUkZBQ0UpKSkKICQoY2FsbCBhZGRfanNvbl9zdHIsICBEZXZpY2VDdXJyZW50QXBpTGV2ZWxGb3JWZW5kb3JNb2R1bGVzLCAgJChCT0FSRF9DVVJSRU5UX0FQSV9MRVZFTF9GT1JfVkVORE9SX01PRFVMRVMpKQogCi0kKGNhbGwgYWRkX2pzb25fYm9vbCwgRW5mb3JjZUludGVyUGFydGl0aW9uSmF2YVNka0xpYnJhcnksICQoZmlsdGVyIHRydWUsJChQUk9EVUNUX0VORk9SQ0VfSU5URVJfUEFSVElUSU9OX0pBVkFfU0RLX0xJQlJBUlkpKSkKLSQoY2FsbCBhZGRfanNvbl9saXN0LCBJbnRlclBhcnRpdGlvbkphdmFMaWJyYXJ5QWxsb3dMaXN0LCAkKFBST0RVQ1RfSU5URVJfUEFSVElUSU9OX0pBVkFfTElCUkFSWV9BTExPV0xJU1QpKQotCiAkKGNhbGwgYWRkX2pzb25fYm9vbCwgQ29tcHJlc3NlZEFwZXgsICQoZmlsdGVyIHRydWUsJChQUk9EVUNUX0NPTVBSRVNTRURfQVBFWCkpKQotCi1pZm5kZWYgQVBFWF9CVUlMRF9GT1JfUFJFX1NfREVWSUNFUwotJChjYWxsIGFkZF9qc29uX2Jvb2wsIFRyaW1tZWRBcGV4LCAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9UUklNTUVEX0FQRVgpKSkKLWVuZGlmCiskKGNhbGwgYWRkX2pzb25fc3RyLCBEZWZhdWx0QXBleFBheWxvYWRUeXBlLCAkKFBST0RVQ1RfREVGQVVMVF9BUEVYX1BBWUxPQURfVFlQRSkpCiAKICQoY2FsbCBhZGRfanNvbl9ib29sLCBCb2FyZFVzZXNSZWNvdmVyeUFzQm9vdCwgJChmaWx0ZXIgdHJ1ZSwkKEJPQVJEX1VTRVNfUkVDT1ZFUllfQVNfQk9PVCkpKQogCkBAIC0zMTksNiArMzI3LDggQEAKIAogJChjYWxsIGFkZF9qc29uX3N0ciwgIFByb2R1Y3RNYW51ZmFjdHVyZXIsICQoUFJPRFVDVF9NQU5VRkFDVFVSRVIpKQogJChjYWxsIGFkZF9qc29uX3N0ciwgIFByb2R1Y3RCcmFuZCwgICAgICAgICQoUFJPRFVDVF9CUkFORCkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgUHJvZHVjdERldmljZSwgICAgICAgJChQUk9EVUNUX0RFVklDRSkpCiskKGNhbGwgYWRkX2pzb25fc3RyLCAgUHJvZHVjdE1vZGVsLCAgICAgICAgJChQUk9EVUNUX01PREVMKSkKIAogJChjYWxsIGFkZF9qc29uX3N0ciwgUmVsZWFzZVZlcnNpb24sICAgICQoX1JFTEVBU0VfVkVSU0lPTikpCiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgUmVsZWFzZUFjb25maWdWYWx1ZVNldHMsICAgICQoUkVMRUFTRV9BQ09ORklHX1ZBTFVFX1NFVFMpKQpAQCAtMzUwLDYgKzM2MCw3IEBACiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgU3lzdGVtRXh0UHJvcEZpbGVzLCAkKFRBUkdFVF9TWVNURU1fRVhUX1BST1ApKQogJChjYWxsIGFkZF9qc29uX2xpc3QsIFByb2R1Y3RQcm9wRmlsZXMsICQoVEFSR0VUX1BST0RVQ1RfUFJPUCkpCiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgT2RtUHJvcEZpbGVzLCAkKFRBUkdFVF9PRE1fUFJPUCkpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgVmVuZG9yUHJvcEZpbGVzLCAkKFRBUkdFVF9WRU5ET1JfUFJPUCkpCiAKICMgRG8gbm90IHNldCBBcnRUYXJnZXRJbmNsdWRlRGVidWdCdWlsZCBpbnRvIGFueSB2YWx1ZSBpZiBQUk9EVUNUX0FSVF9UQVJHRVRfSU5DTFVERV9ERUJVR19CVUlMRCBpcyBub3Qgc2V0LAogIyB0byBoYXZlIHRoZSBzYW1lIGJlaGF2aW9yIGZyb20gcnVudGltZV9saWJhcnQubWsuCkBAIC0zNjEsMTIgKzM3MiwyMjYgQEAKICAgJChmaXJzdHdvcmQgJChPVkVSUklERV9FTkFCTEVfVUZGRF9HQykgJChQUk9EVUNUX0VOQUJMRV9VRkZEX0dDKSBkZWZhdWx0KQogJChjYWxsIGFkZF9qc29uX3N0ciwgRW5hYmxlVWZmZEdjLCAkKF9jb25maWdfZW5hYmxlX3VmZmRfZ2MpKQogX2NvbmZpZ19lbmFibGVfdWZmZF9nYyA6PQorJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRLZXJuZWxWZXJzaW9uLCAkKEJPQVJEX0tFUk5FTF9WRVJTSU9OKSkKIAogJChjYWxsIGFkZF9qc29uX2xpc3QsIERldmljZUZyYW1ld29ya0NvbXBhdGliaWxpdHlNYXRyaXhGaWxlLCAkKERFVklDRV9GUkFNRVdPUktfQ09NUEFUSUJJTElUWV9NQVRSSVhfRklMRSkpCiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgRGV2aWNlUHJvZHVjdENvbXBhdGliaWxpdHlNYXRyaXhGaWxlLCAkKERFVklDRV9QUk9EVUNUX0NPTVBBVElCSUxJVFlfTUFUUklYX0ZJTEUpKQogJChjYWxsIGFkZF9qc29uX2xpc3QsIEJvYXJkQXZiU3lzdGVtQWRkSGFzaHRyZWVGb290ZXJBcmdzLCAkKEJPQVJEX0FWQl9TWVNURU1fQUREX0hBU0hUUkVFX0ZPT1RFUl9BUkdTKSkKICQoY2FsbCBhZGRfanNvbl9ib29sLCBCb2FyZEF2YkVuYWJsZSwgJChmaWx0ZXIgdHJ1ZSwkKEJPQVJEX0FWQl9FTkFCTEUpKSkKIAorJChjYWxsIGFkZF9qc29uX3N0ciwgQWRiS2V5cywgJChQUk9EVUNUX0FEQl9LRVlTKSkKKworJChjYWxsIGFkZF9qc29uX21hcCwgUGFydGl0aW9uVmFyc0ZvclNvb25nTWlncmF0aW9uT25seURvTm90VXNlKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCAgUHJvZHVjdERpcmVjdG9yeSwgICAgJChkaXIgJChJTlRFUk5BTF9QUk9EVUNUKSkpCisKKyAgJChjYWxsIGFkZF9qc29uX21hcCxQYXJ0aXRpb25RdWFsaWZpZWRWYXJpYWJsZXMpCisgICQoZm9yZWFjaCBpbWFnZV90eXBlLElOSVRfQk9PVCBCT09UIFZFTkRPUl9CT09UIFNZU1RFTSBWRU5ET1IgQ0FDSEUgVVNFUkRBVEEgUFJPRFVDVCBTWVNURU1fRVhUIE9FTSBPRE0gVkVORE9SX0RMS00gT0RNX0RMS00gU1lTVEVNX0RMS00gVkJNRVRBIFZCTUVUQV9TWVNURU0gVkJNRVRBX1NZU1RFTV9ETEtNIFZCTUVUQV9WRU5ET1JfRExLTSwgXAorICAgICQoY2FsbCBhZGRfanNvbl9tYXAsJChjYWxsIHRvLWxvd2VyLCQoaW1hZ2VfdHlwZSkpKSBcCisgICAgJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJ1aWxkaW5nSW1hZ2UsICQoZmlsdGVyIHRydWUsJChCVUlMRElOR18kKGltYWdlX3R5cGUpX0lNQUdFKSkpIFwKKyAgICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgUHJlYnVpbHRJbWFnZSwgJChmaWx0ZXIgdHJ1ZSwkKEJPQVJEX1BSRUJVSUxUXyQoaW1hZ2VfdHlwZSlJTUFHRSkpKSBcCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRFcm9mc0NvbXByZXNzb3IsICQoQk9BUkRfJChpbWFnZV90eXBlKUlNQUdFX0VST0ZTX0NPTVBSRVNTT1IpKSBcCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRFcm9mc0NvbXByZXNzSGludHMsICQoQk9BUkRfJChpbWFnZV90eXBlKUlNQUdFX0VST0ZTX0NPTVBSRVNTX0hJTlRTKSkgXAorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkRXJvZnNQY2x1c3RlclNpemUsICQoQk9BUkRfJChpbWFnZV90eXBlKUlNQUdFX0VST0ZTX1BDTFVTVEVSX1NJWkUpKSBcCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRFeHRmc0lub2RlQ291bnQsICQoQk9BUkRfJChpbWFnZV90eXBlKUlNQUdFX0VYVEZTX0lOT0RFX0NPVU5UKSkgXAorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkRXh0ZnNSc3ZQY3QsICQoQk9BUkRfJChpbWFnZV90eXBlKUlNQUdFX0VYVEZTX1JTVl9QQ1QpKSBcCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRGMmZzU2xvYWRDb21wcmVzc0ZsYWdzLCAkKEJPQVJEXyQoaW1hZ2VfdHlwZSlJTUFHRV9GMkZTX1NMT0FEX0NPTVBSRVNTX0ZMQUdTKSkgXAorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkRmlsZVN5c3RlbUNvbXByZXNzLCAkKEJPQVJEXyQoaW1hZ2VfdHlwZSlJTUFHRV9GSUxFX1NZU1RFTV9DT01QUkVTUykpIFwKKyAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZEZpbGVTeXN0ZW1UeXBlLCAkKEJPQVJEXyQoaW1hZ2VfdHlwZSlJTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSkgXAorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkSm91cm5hbFNpemUsICQoQk9BUkRfJChpbWFnZV90eXBlKUlNQUdFX0pPVVJOQUxfU0laRSkpIFwKKyAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZFBhcnRpdGlvblJlc2VydmVkU2l6ZSwgJChCT0FSRF8kKGltYWdlX3R5cGUpSU1BR0VfUEFSVElUSU9OX1JFU0VSVkVEX1NJWkUpKSBcCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRQYXJ0aXRpb25TaXplLCAkKEJPQVJEXyQoaW1hZ2VfdHlwZSlJTUFHRV9QQVJUSVRJT05fU0laRSkpIFwKKyAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZFNxdWFzaGZzQmxvY2tTaXplLCAkKEJPQVJEXyQoaW1hZ2VfdHlwZSlJTUFHRV9TUVVBU0hGU19CTE9DS19TSVpFKSkgXAorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkU3F1YXNoZnNDb21wcmVzc29yLCAkKEJPQVJEXyQoaW1hZ2VfdHlwZSlJTUFHRV9TUVVBU0hGU19DT01QUkVTU09SKSkgXAorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkU3F1YXNoZnNDb21wcmVzc29yT3B0LCAkKEJPQVJEXyQoaW1hZ2VfdHlwZSlJTUFHRV9TUVVBU0hGU19DT01QUkVTU09SX09QVCkpIFwKKyAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZFNxdWFzaGZzRGlzYWJsZTRrQWxpZ24sICQoQk9BUkRfJChpbWFnZV90eXBlKUlNQUdFX1NRVUFTSEZTX0RJU0FCTEVfNEtfQUxJR04pKSBcCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRBdmJLZXlQYXRoLCAkKEJPQVJEX0FWQl8kKGltYWdlX3R5cGUpX0tFWV9QQVRIKSkgXAorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkQXZiQWxnb3JpdGhtLCAkKEJPQVJEX0FWQl8kKGltYWdlX3R5cGUpX0FMR09SSVRITSkpIFwKKyAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZEF2YlJvbGxiYWNrSW5kZXgsICQoQk9BUkRfQVZCXyQoaW1hZ2VfdHlwZSlfUk9MTEJBQ0tfSU5ERVgpKSBcCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRBdmJSb2xsYmFja0luZGV4TG9jYXRpb24sICQoQk9BUkRfQVZCXyQoaW1hZ2VfdHlwZSlfUk9MTEJBQ0tfSU5ERVhfTE9DQVRJT04pKSBcCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRBdmJBZGRIYXNodHJlZUZvb3RlckFyZ3MsICQoQk9BUkRfQVZCXyQoaW1hZ2VfdHlwZSlfQUREX0hBU0hUUkVFX0ZPT1RFUl9BUkdTKSkgXAorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIFByb2R1Y3RCYXNlRnNQYXRoLCAkKFBST0RVQ1RfJChpbWFnZV90eXBlKV9CQVNFX0ZTX1BBVEgpKSBcCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgUHJvZHVjdEhlYWRyb29tLCAkKFBST0RVQ1RfJChpbWFnZV90eXBlKV9IRUFEUk9PTSkpIFwKKyAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCBQcm9kdWN0VmVyaXR5UGFydGl0aW9uLCAkKFBST0RVQ1RfJChpbWFnZV90eXBlKV9WRVJJVFlfUEFSVElUSU9OKSkgXAorICAgICQoY2FsbCBlbmRfanNvbl9tYXApIFwKKyAgKQorICAkKGNhbGwgZW5kX2pzb25fbWFwKQorCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBUYXJnZXRVc2VyaW1hZ2VzVXNlRXh0MiwgJChmaWx0ZXIgdHJ1ZSwkKFRBUkdFVF9VU0VSSU1BR0VTX1VTRV9FWFQyKSkpCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBUYXJnZXRVc2VyaW1hZ2VzVXNlRXh0MywgJChmaWx0ZXIgdHJ1ZSwkKFRBUkdFVF9VU0VSSU1BR0VTX1VTRV9FWFQzKSkpCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBUYXJnZXRVc2VyaW1hZ2VzVXNlRXh0NCwgJChmaWx0ZXIgdHJ1ZSwkKFRBUkdFVF9VU0VSSU1BR0VTX1VTRV9FWFQ0KSkpCisKKyAgJChjYWxsIGFkZF9qc29uX2Jvb2wsIFRhcmdldFVzZXJpbWFnZXNTcGFyc2VFeHREaXNhYmxlZCwgJChmaWx0ZXIgdHJ1ZSwkKFRBUkdFVF9VU0VSSU1BR0VTX1NQQVJTRV9FWFRfRElTQUJMRUQpKSkKKyAgJChjYWxsIGFkZF9qc29uX2Jvb2wsIFRhcmdldFVzZXJpbWFnZXNTcGFyc2VFcm9mc0Rpc2FibGVkLCAkKGZpbHRlciB0cnVlLCQoVEFSR0VUX1VTRVJJTUFHRVNfU1BBUlNFX0VST0ZTX0RJU0FCTEVEKSkpCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBUYXJnZXRVc2VyaW1hZ2VzU3BhcnNlU3F1YXNoZnNEaXNhYmxlZCwgJChmaWx0ZXIgdHJ1ZSwkKFRBUkdFVF9VU0VSSU1BR0VTX1NQQVJTRV9TUVVBU0hGU19ESVNBQkxFRCkpKQorICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgVGFyZ2V0VXNlcmltYWdlc1NwYXJzZUYyZnNEaXNhYmxlZCwgJChmaWx0ZXIgdHJ1ZSwkKFRBUkdFVF9VU0VSSU1BR0VTX1NQQVJTRV9GMkZTX0RJU0FCTEVEKSkpCisKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRFcm9mc0NvbXByZXNzb3IsICQoQk9BUkRfRVJPRlNfQ09NUFJFU1NPUikpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkRXJvZnNDb21wcmVzc29ySGludHMsICQoQk9BUkRfRVJPRlNfQ09NUFJFU1NfSElOVFMpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZEVyb2ZzUGNsdXN0ZXJTaXplLCAkKEJPQVJEX0VST0ZTX1BDTFVTVEVSX1NJWkUpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZEVyb2ZzU2hhcmVEdXBCbG9ja3MsICQoQk9BUkRfRVJPRlNfU0hBUkVfRFVQX0JMT0NLUykpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkRXJvZnNVc2VMZWdhY3lDb21wcmVzc2lvbiwgJChCT0FSRF9FUk9GU19VU0VfTEVHQUNZX0NPTVBSRVNTSU9OKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRFeHQ0U2hhcmVEdXBCbG9ja3MsICQoQk9BUkRfRVhUNF9TSEFSRV9EVVBfQkxPQ0tTKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRGbGFzaExvZ2ljYWxCbG9ja1NpemUsICQoQk9BUkRfRkxBU0hfTE9HSUNBTF9CTE9DS19TSVpFKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRGbGFzaEVyYXNlQmxvY2tTaXplLCAkKEJPQVJEX0ZMQVNIX0VSQVNFX0JMT0NLX1NJWkUpKQorICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRpbmdWYm1ldGFJbWFnZSwgJChCVUlMRElOR19WQk1FVEFfSU1BR0UpKQorCisgICMgYm9vdCBpbWFnZSBzdHVmZgorICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRpbmdSYW1kaXNrSW1hZ2UsICQoZmlsdGVyIHRydWUsJChCVUlMRElOR19SQU1ESVNLX0lNQUdFKSkpCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBQcm9kdWN0QnVpbGRCb290SW1hZ2UsICQoZmlsdGVyIHRydWUsJChQUk9EVUNUX0JVSUxEX0JPT1RfSU1BR0UpKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgUHJvZHVjdEJ1aWxkVmVuZG9yQm9vdEltYWdlLCAkKFBST0RVQ1RfQlVJTERfVkVORE9SX0JPT1RfSU1BR0UpKQorICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgUHJvZHVjdEJ1aWxkSW5pdEJvb3RJbWFnZSwgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfQlVJTERfSU5JVF9CT09UX0lNQUdFKSkpCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBCb2FyZFVzZXNSZWNvdmVyeUFzQm9vdCwgJChmaWx0ZXIgdHJ1ZSwkKEJPQVJEX1VTRVNfUkVDT1ZFUllfQVNfQk9PVCkpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZFByZWJ1aWx0Qm9vdGltYWdlLCAkKEJPQVJEX1BSRUJVSUxUX0JPT1RfSU1BR0UpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZFByZWJ1aWx0SW5pdEJvb3RpbWFnZSwgJChCT0FSRF9QUkVCVUlMVF9JTklUX0JPT1RfSU1BR0UpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZEJvb3RpbWFnZVBhcnRpdGlvblNpemUsICQoQk9BUkRfQk9PVElNQUdFX1BBUlRJVElPTl9TSVpFKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRWZW5kb3JCb290aW1hZ2VQYXJ0aXRpb25TaXplLCAkKEJPQVJEX1ZFTkRPUl9CT09USU1BR0VfUEFSVElUSU9OX1NJWkUpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZEluaXRCb290aW1hZ2VQYXJ0aXRpb25TaXplLCAkKEJPQVJEX0lOSVRfQk9PVF9JTUFHRV9QQVJUSVRJT05fU0laRSkpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkQm9vdEhlYWRlclZlcnNpb24sICQoQk9BUkRfQk9PVF9IRUFERVJfVkVSU0lPTikpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIFRhcmdldEtlcm5lbFBhdGgsICQoVEFSR0VUX0tFUk5FTF9QQVRIKSkKKyAgJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJvYXJkVXNlc0dlbmVyaWNLZXJuZWxJbWFnZSwgJChCT0FSRF9VU0VTX0dFTkVSSUNfS0VSTkVMX0lNQUdFKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9vdFNlY3VyaXR5UGF0Y2gsICQoQk9PVF9TRUNVUklUWV9QQVRDSCkpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIEluaXRCb290U2VjdXJpdHlQYXRjaCwgJChJTklUX0JPT1RfU0VDVVJJVFlfUEFUQ0gpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBWZW5kb3JTZWN1cml0eVBhdGNoLCAkKFZFTkRPUl9TRUNVUklUWV9QQVRDSCkpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIE9kbVNlY3VyaXR5UGF0Y2gsICQoT0RNX1NFQ1VSSVRZX1BBVENIKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgU3lzdGVtRGxrbVNlY3VyaXR5UGF0Y2gsICQoU1lTVEVNX0RMS01fU0VDVVJJVFlfUEFUQ0gpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBWZW5kb3JEbGttU2VjdXJpdHlQYXRjaCwgJChWRU5ET1JfRExLTV9TRUNVUklUWV9QQVRDSCkpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIE9kbURsa21TZWN1cml0eVBhdGNoLCAkKE9ETV9ETEtNX1NFQ1VSSVRZX1BBVENIKSkKKyAgJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJvYXJkSW5jbHVkZUR0YkluQm9vdGltZywgJChCT0FSRF9JTkNMVURFX0RUQl9JTl9CT09USU1HKSkKKyAgJChjYWxsIGFkZF9qc29uX2xpc3QsIEludGVybmFsS2VybmVsQ21kbGluZSwgJChJTlRFUk5BTF9LRVJORUxfQ01ETElORSkpCisgICQoY2FsbCBhZGRfanNvbl9saXN0LCBJbnRlcm5hbEJvb3Rjb25maWcsICQoSU5URVJOQUxfQk9PVENPTkZJRykpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIEludGVybmFsQm9vdGNvbmZpZ0ZpbGUsICQoSU5URVJOQUxfQk9PVENPTkZJR19GSUxFKSkKKworICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRpbmdTeXN0ZW1PdGhlckltYWdlLCAkKEJVSUxESU5HX1NZU1RFTV9PVEhFUl9JTUFHRSkpCisKKyAgIyBzdXBlciBpbWFnZSBzdHVmZgorICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgUHJvZHVjdFVzZUR5bmFtaWNQYXJ0aXRpb25zLCAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9VU0VfRFlOQU1JQ19QQVJUSVRJT05TKSkpCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBQcm9kdWN0UmV0cm9maXREeW5hbWljUGFydGl0aW9ucywgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfUkVUUk9GSVRfRFlOQU1JQ19QQVJUSVRJT05TKSkpCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBQcm9kdWN0QnVpbGRTdXBlclBhcnRpdGlvbiwgJChmaWx0ZXIgdHJ1ZSwkKFBST0RVQ1RfQlVJTERfU1VQRVJfUEFSVElUSU9OKSkpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkU3VwZXJQYXJ0aXRpb25TaXplLCAkKEJPQVJEX1NVUEVSX1BBUlRJVElPTl9TSVpFKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRTdXBlclBhcnRpdGlvbk1ldGFkYXRhRGV2aWNlLCAkKEJPQVJEX1NVUEVSX1BBUlRJVElPTl9NRVRBREFUQV9ERVZJQ0UpKQorICAkKGNhbGwgYWRkX2pzb25fbGlzdCwgQm9hcmRTdXBlclBhcnRpdGlvbkJsb2NrRGV2aWNlcywgJChCT0FSRF9TVVBFUl9QQVJUSVRJT05fQkxPQ0tfREVWSUNFUykpCisgICQoY2FsbCBhZGRfanNvbl9tYXAsIEJvYXJkU3VwZXJQYXJ0aXRpb25Hcm91cHMpCisgICAgJChmb3JlYWNoIGdyb3VwLCAkKEJPQVJEX1NVUEVSX1BBUlRJVElPTl9HUk9VUFMpLCBcCisgICAgICAkKGNhbGwgYWRkX2pzb25fbWFwLCAkKGdyb3VwKSkgXAorICAgICAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCBHcm91cFNpemUsICQoQk9BUkRfJChjYWxsIHRvLXVwcGVyLCQoZ3JvdXApKV9TSVpFKSkgXAorICAgICAgICAkKGlmICQoQk9BUkRfJChjYWxsIHRvLXVwcGVyLCQoZ3JvdXApKV9QQVJUSVRJT05fTElTVCksIFwKKyAgICAgICAgICAkKGNhbGwgYWRkX2pzb25fbGlzdCwgUGFydGl0aW9uTGlzdCwgJChCT0FSRF8kKGNhbGwgdG8tdXBwZXIsJChncm91cCkpX1BBUlRJVElPTl9MSVNUKSkpIFwKKyAgICAgICQoY2FsbCBlbmRfanNvbl9tYXApKQorICAgICQoY2FsbCBlbmRfanNvbl9tYXApCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBQcm9kdWN0VmlydHVhbEFiT3RhLCAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9WSVJUVUFMX0FCX09UQSkpKQorICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgUHJvZHVjdFZpcnR1YWxBYk90YVJldHJvZml0LCAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9WSVJUVUFMX0FCX09UQV9SRVRST0ZJVCkpKQorICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgUHJvZHVjdFZpcnR1YWxBYkNvbXByZXNzaW9uLCAkKGZpbHRlciB0cnVlLCQoUFJPRFVDVF9WSVJUVUFMX0FCX0NPTVBSRVNTSU9OKSkpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIFByb2R1Y3RWaXJ0dWFsQWJDb21wcmVzc2lvbk1ldGhvZCwgJChQUk9EVUNUX1ZJUlRVQUxfQUJfQ09NUFJFU1NJT05fTUVUSE9EKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgUHJvZHVjdFZpcnR1YWxBYkNvbXByZXNzaW9uRmFjdG9yLCAkKFBST0RVQ1RfVklSVFVBTF9BQl9DT01QUkVTU0lPTl9GQUNUT1IpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBQcm9kdWN0VmlydHVhbEFiQ293VmVyc2lvbiwgJChQUk9EVUNUX1ZJUlRVQUxfQUJfQ09XX1ZFUlNJT04pKQorICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgQWJPdGFVcGRhdGVyLCAkKGZpbHRlciB0cnVlLCQoQUJfT1RBX1VQREFURVIpKSkKKyAgJChjYWxsIGFkZF9qc29uX2xpc3QsIEFiT3RhUGFydGl0aW9ucywgJChBQl9PVEFfUEFSVElUSU9OUykpCisgICQoY2FsbCBhZGRfanNvbl9saXN0LCBBYk90YUtleXMsICQoUFJPRFVDVF9PVEFfUFVCTElDX0tFWVMpKQorICAkKGNhbGwgYWRkX2pzb25fbGlzdCwgQWJPdGFQb3N0SW5zdGFsbENvbmZpZywgJChBQl9PVEFfUE9TVElOU1RBTExfQ09ORklHKSkKKworICAjIEF2YiAoYW5kcm9pZCB2ZXJpZmllZCBib290KSBzdHVmZgorICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgQm9hcmRBdmJFbmFibGUsICQoZmlsdGVyIHRydWUsJChCT0FSRF9BVkJfRU5BQkxFKSkpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvYXJkQXZiQWxnb3JpdGhtLCAkKEJPQVJEX0FWQl9BTEdPUklUSE0pKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb2FyZEF2YktleVBhdGgsICQoQk9BUkRfQVZCX0tFWV9QQVRIKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgQm9hcmRBdmJSb2xsYmFja0luZGV4LCAkKEJPQVJEX0FWQl9ST0xMQkFDS19JTkRFWCkpCisgICQoY2FsbCBhZGRfanNvbl9tYXAsIENoYWluZWRWYm1ldGFQYXJ0aXRpb25zKQorICAkKGZvcmVhY2ggcGFydGl0aW9uLHN5c3RlbSB2ZW5kb3IgJChCT0FSRF9BVkJfVkJNRVRBX0NVU1RPTV9QQVJUSVRJT05TKSxcCisgICAgJChjYWxsIGFkZF9qc29uX21hcCwgJChwYXJ0aXRpb24pKSBcCisgICAgICAkKGNhbGwgYWRkX2pzb25fbGlzdCxQYXJ0aXRpb25zLCQoQk9BUkRfQVZCX1ZCTUVUQV8kKGNhbGwgdG8tdXBwZXIsJChwYXJ0aXRpb24pKSkpIFwKKyAgICAgICQoY2FsbCBhZGRfanNvbl9zdHIsS2V5LCQoQk9BUkRfQVZCX1ZCTUVUQV8kKGNhbGwgdG8tdXBwZXIsJChwYXJ0aXRpb24pKV9LRVlfUEFUSCkpIFwKKyAgICAgICQoY2FsbCBhZGRfanNvbl9zdHIsQWxnb3JpdGhtLCQoQk9BUkRfQVZCX1ZCTUVUQV8kKGNhbGwgdG8tdXBwZXIsJChwYXJ0aXRpb24pKV9BTEdPUklUSE0pKSBcCisgICAgICAkKGNhbGwgYWRkX2pzb25fc3RyLFJvbGxiYWNrSW5kZXgsJChCT0FSRF9BVkJfVkJNRVRBXyQoY2FsbCB0by11cHBlciwkKHBhcnRpdGlvbikpX1JPTExCQUNLX0lOREVYKSkgXAorICAgICAgJChjYWxsIGFkZF9qc29uX3N0cixSb2xsYmFja0luZGV4TG9jYXRpb24sJChCT0FSRF9BVkJfVkJNRVRBXyQoY2FsbCB0by11cHBlciwkKHBhcnRpdGlvbikpX1JPTExCQUNLX0lOREVYX0xPQ0FUSU9OKSkgXAorICAgICQoY2FsbCBlbmRfanNvbl9tYXApKQorICAkKGNhbGwgZW5kX2pzb25fbWFwKQorCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBQcm9kdWN0VXNlRHluYW1pY1BhcnRpdGlvblNpemUsICQoZmlsdGVyIHRydWUsJChQUk9EVUNUX1VTRV9EWU5BTUlDX1BBUlRJVElPTl9TSVpFKSkpCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBDb3B5SW1hZ2VzRm9yVGFyZ2V0RmlsZXNaaXAsICQoZmlsdGVyIHRydWUsJChDT1BZX0lNQUdFU19GT1JfVEFSR0VUX0ZJTEVTX1pJUCkpKQorCisgICQoY2FsbCBhZGRfanNvbl9saXN0LCBQcm9kdWN0UGFja2FnZXMsICQoUFJPRFVDVF9QQUNLQUdFUykpCisgICQoY2FsbCBhZGRfanNvbl9saXN0LCBQcm9kdWN0UGFja2FnZXNEZWJ1ZywgJChQUk9EVUNUX1BBQ0tBR0VTX0RFQlVHKSkKKworICAjIFVzZWQgdG8gZ2VuZXJhdGUgL3ZlbmRvci9saW5rZXIuY29uZmlnLnBiCisgICQoY2FsbCBhZGRfanNvbl9saXN0LCBWZW5kb3JMaW5rZXJDb25maWdTcmNzLCAkKFBST0RVQ1RfVkVORE9SX0xJTktFUl9DT05GSUdfRlJBR01FTlRTKSkKKyAgJChjYWxsIGFkZF9qc29uX2xpc3QsIFByb2R1Y3RMaW5rZXJDb25maWdTcmNzLCAkKFBST0RVQ1RfUFJPRFVDVF9MSU5LRVJfQ09ORklHX0ZSQUdNRU5UUykpCisKKyAgIyBVc2VkIHRvIGdlbmVyYXRlIF9kbGttIHBhcnRpdGlvbnMKKyAgJChjYWxsIGFkZF9qc29uX2Jvb2wsIEJ1aWxkaW5nU3lzdGVtRGxrbUltYWdlLCAgICAgICAgICAgICAgICQoQlVJTERJTkdfU1lTVEVNX0RMS01fSU1BR0UpKQorICAkKGNhbGwgYWRkX2pzb25fbGlzdCwgU3lzdGVtS2VybmVsTW9kdWxlcywgJChCT0FSRF9TWVNURU1fS0VSTkVMX01PRFVMRVMpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBTeXN0ZW1LZXJuZWxCbG9ja2xpc3RGaWxlLCAkKEJPQVJEX1NZU1RFTV9LRVJORUxfTU9EVUxFU19CTE9DS0xJU1RfRklMRSkpCisgICQoY2FsbCBhZGRfanNvbl9saXN0LCBTeXN0ZW1LZXJuZWxMb2FkTW9kdWxlcywgJChCT0FSRF9TWVNURU1fS0VSTkVMX01PRFVMRVNfTE9BRCkpCisgICQoY2FsbCBhZGRfanNvbl9ib29sLCBCdWlsZGluZ1ZlbmRvckRsa21JbWFnZSwgICAgICAgICAgICAgICAkKEJVSUxESU5HX1ZFTkRPUl9ETEtNX0lNQUdFKSkKKyAgJChjYWxsIGFkZF9qc29uX2xpc3QsIFZlbmRvcktlcm5lbE1vZHVsZXMsICQoQk9BUkRfVkVORE9SX0tFUk5FTF9NT0RVTEVTKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgVmVuZG9yS2VybmVsQmxvY2tsaXN0RmlsZSwgJChCT0FSRF9WRU5ET1JfS0VSTkVMX01PRFVMRVNfQkxPQ0tMSVNUX0ZJTEUpKQorICAkKGNhbGwgYWRkX2pzb25fYm9vbCwgQnVpbGRpbmdPZG1EbGttSW1hZ2UsICAgICAgICAgICAgICAgJChCVUlMRElOR19PRE1fRExLTV9JTUFHRSkpCisgICQoY2FsbCBhZGRfanNvbl9saXN0LCBPZG1LZXJuZWxNb2R1bGVzLCAkKEJPQVJEX09ETV9LRVJORUxfTU9EVUxFUykpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIE9kbUtlcm5lbEJsb2NrbGlzdEZpbGUsICQoQk9BUkRfT0RNX0tFUk5FTF9NT0RVTEVTX0JMT0NLTElTVF9GSUxFKSkKKyAgJChjYWxsIGFkZF9qc29uX2xpc3QsIFZlbmRvclJhbWRpc2tLZXJuZWxNb2R1bGVzLCAkKEJPQVJEX1ZFTkRPUl9SQU1ESVNLX0tFUk5FTF9NT0RVTEVTKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgVmVuZG9yUmFtZGlza0tlcm5lbEJsb2NrbGlzdEZpbGUsICQoQk9BUkRfVkVORE9SX1JBTURJU0tfS0VSTkVMX01PRFVMRVNfQkxPQ0tMSVNUX0ZJTEUpKQorICAkKGNhbGwgYWRkX2pzb25fbGlzdCwgVmVuZG9yUmFtZGlza0tlcm5lbExvYWRNb2R1bGVzLCAkKEJPQVJEX1ZFTkRPUl9SQU1ESVNLX0tFUk5FTF9NT0RVTEVTX0xPQUQpKQorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBWZW5kb3JSYW1kaXNrS2VybmVsT3B0aW9uc0ZpbGUsICQoQk9BUkRfVkVORE9SX1JBTURJU0tfS0VSTkVMX01PRFVMRVNfT1BUSU9OU19GSUxFKSkKKworICAjIFVzZWQgdG8gZ2VuZXJhdGUgL3ZlbmRvci9idWlsZC5wcm9wCisgICQoY2FsbCBhZGRfanNvbl9saXN0LCBCb2FyZEluZm9GaWxlcywgJChpZiAkKFRBUkdFVF9CT0FSRF9JTkZPX0ZJTEVTKSwkKFRBUkdFVF9CT0FSRF9JTkZPX0ZJTEVTKSwkKGZpcnN0d29yZCAkKFRBUkdFVF9CT0FSRF9JTkZPX0ZJTEUpICQod2lsZGNhcmQgJChUQVJHRVRfREVWSUNFX0RJUikvYm9hcmQtaW5mby50eHQpKSkpCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIEJvb3RMb2FkZXJCb2FyZE5hbWUsICQoVEFSR0VUX0JPT1RMT0FERVJfQk9BUkRfTkFNRSkpCisKKyAgJChjYWxsIGFkZF9qc29uX2xpc3QsIFByb2R1Y3RDb3B5RmlsZXMsICQoUFJPRFVDVF9DT1BZX0ZJTEVTKSkKKworICAjIFVzZWQgdG8gZ2VuZXJhdGUgZnN2IG1ldGEKKyAgJChjYWxsIGFkZF9qc29uX2Jvb2wsIFByb2R1Y3RGc3Zlcml0eUdlbmVyYXRlTWV0YWRhdGEsICAgICAgICAgICAgICAgJChQUk9EVUNUX0ZTVkVSSVRZX0dFTkVSQVRFX01FVEFEQVRBKSkKKworICAjIFVzZWQgdG8gZ2VuZXJhdGUgcmVjb3ZlcnkgcGFydGl0aW9uCisgICQoY2FsbCBhZGRfanNvbl9zdHIsIFRhcmdldFNjcmVlbkRlbnNpdHksICQoVEFSR0VUX1NDUkVFTl9ERU5TSVRZKSkKKworICAjIFVzZWQgdG8gZ2VuZXJhdGUgL3JlY292ZXJ5L3Jvb3QvYnVpbGQucHJvcAorICAkKGNhbGwgYWRkX2pzb25fbWFwLCBQcml2YXRlUmVjb3ZlcnlVaVByb3BlcnRpZXMpCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgYW5pbWF0aW9uX2ZwcywgJChUQVJHRVRfUkVDT1ZFUllfVUlfQU5JTUFUSU9OX0ZQUykpCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgbWFyZ2luX2hlaWdodCwgJChUQVJHRVRfUkVDT1ZFUllfVUlfTUFSR0lOX0hFSUdIVCkpCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgbWFyZ2luX3dpZHRoLCAkKFRBUkdFVF9SRUNPVkVSWV9VSV9NQVJHSU5fV0lEVEgpKQorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIG1lbnVfdW51c2FibGVfcm93cywgJChUQVJHRVRfUkVDT1ZFUllfVUlfTUVOVV9VTlVTQUJMRV9ST1dTKSkKKyAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCBwcm9ncmVzc19iYXJfYmFzZWxpbmUsICQoVEFSR0VUX1JFQ09WRVJZX1VJX1BST0dSRVNTX0JBUl9CQVNFTElORSkpCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgdG91Y2hfbG93X3RocmVzaG9sZCwgJChUQVJHRVRfUkVDT1ZFUllfVUlfVE9VQ0hfTE9XX1RIUkVTSE9MRCkpCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgdG91Y2hfaGlnaF90aHJlc2hvbGQsICQoVEFSR0VUX1JFQ09WRVJZX1VJX1RPVUNIX0hJR0hfVEhSRVNIT0xEKSkKKyAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCB2cl9zdGVyZW9fb2Zmc2V0LCAkKFRBUkdFVF9SRUNPVkVSWV9VSV9WUl9TVEVSRU9fT0ZGU0VUKSkKKyAgICAkKGNhbGwgYWRkX2pzb25fc3RyLCBicmlnaHRuZXNzX2ZpbGUsICQoVEFSR0VUX1JFQ09WRVJZX1VJX0JSSUdIVE5FU1NfRklMRSkpCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgbWF4X2JyaWdodG5lc3NfZmlsZSwgJChUQVJHRVRfUkVDT1ZFUllfVUlfTUFYX0JSSUdIVE5FU1NfRklMRSkpCisgICAgJChjYWxsIGFkZF9qc29uX3N0ciwgYnJpZ2h0bmVzc19ub3JtYWxfcGVyY2VudCwgJChUQVJHRVRfUkVDT1ZFUllfVUlfQlJJR0hUTkVTU19OT1JNQUwpKQorICAgICQoY2FsbCBhZGRfanNvbl9zdHIsIGJyaWdodG5lc3NfZGltbWVkX3BlcmNlbnQsICQoVEFSR0VUX1JFQ09WRVJZX1VJX0JSSUdIVE5FU1NfRElNTUVEKSkKKyAgJChjYWxsIGVuZF9qc29uX21hcCkKKworICAkKGNhbGwgYWRkX2pzb25fc3RyLCBQcmVidWlsdEJvb3Rsb2FkZXIsICQoQk9BUkRfUFJFQlVJTFRfQk9PVExPQURFUikpCisKKyAgIyBVc2VkIHRvIGdlbmVyYXRlIHVzZXJkYXRhIHBhcnRpdGlvbgorICAkKGNhbGwgYWRkX2pzb25fc3RyLCBQcm9kdWN0RnNDYXNlZm9sZCwgJChQUk9EVUNUX0ZTX0NBU0VGT0xEKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgUHJvZHVjdFF1b3RhUHJvamlkLCAkKFBST0RVQ1RfUVVPVEFfUFJPSklEKSkKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgUHJvZHVjdEZzQ29tcHJlc3Npb24sICQoUFJPRFVDVF9GU19DT01QUkVTU0lPTikpCisKKyAgJChjYWxsIGFkZF9qc29uX3N0ciwgUmVsZWFzZVRvb2xzRXh0ZW5zaW9uRGlyLCAkKGZpcnN0d29yZCAkKFRBUkdFVF9SRUxFQVNFVE9PTFNfRVhURU5TSU9OUykgJCgkKFRBUkdFVF9ERVZJQ0VfRElSKS8uLi9jb21tb24pKSkKKworJChjYWxsIGVuZF9qc29uX21hcCkKKworIyBGb3IgY29udmVydGluZyB2aW50Zl9kYXRhCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgRGV2aWNlTWF0cml4RmlsZSwgJChERVZJQ0VfTUFUUklYX0ZJTEUpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIFByb2R1Y3RNYW5pZmVzdEZpbGVzLCAkKFBST0RVQ1RfTUFOSUZFU1RfRklMRVMpKQorJChjYWxsIGFkZF9qc29uX2xpc3QsIFN5c3RlbU1hbmlmZXN0RmlsZSwgJChERVZJQ0VfRlJBTUVXT1JLX01BTklGRVNUX0ZJTEUpKQorU1lTVEVNX0VYVF9IV1NFUlZJQ0VfRklMRVMgOj0KK2lmZXEgKCQoUFJPRFVDVF9ISURMX0VOQUJMRUQpLHRydWUpCisgIGlmbmVxICgkKGZpbHRlciBod3NlcnZpY2VtYW5hZ2VyLCQoUFJPRFVDVF9QQUNLQUdFUykpLCkKKyAgICBTWVNURU1fRVhUX0hXU0VSVklDRV9GSUxFUyArPSBzeXN0ZW0vaHdzZXJ2aWNlbWFuYWdlci9od3NlcnZpY2VtYW5hZ2VyX25vX21heC54bWwKKyAgZWxzZQorICAgICQoZXJyb3IgSWYgUFJPRFVDVF9ISURMX0VOQUJMRUQgaXMgc2V0LCBod3NlcnZpY2VtYW5hZ2VyIG11c3QgYmUgYWRkZWQgdG8gUFJPRFVDVF9QQUNLQUdFUyBleHBsaWNpdGx5KQorICBlbmRpZgorZWxzZQorICBpZm5lcSAoJChmaWx0ZXIgaHdzZXJ2aWNlbWFuYWdlciwkKFBST0RVQ1RfUEFDS0FHRVMpKSwpCisgICAgU1lTVEVNX0VYVF9IV1NFUlZJQ0VfRklMRVMgKz0gc3lzdGVtL2h3c2VydmljZW1hbmFnZXIvaHdzZXJ2aWNlbWFuYWdlci54bWwKKyAgZWxzZSBpZm5lcSAoJChmaWx0ZXIgaHdzZXJ2aWNlbWFuYWdlciwkKFBST0RVQ1RfUEFDS0FHRVNfU0hJUFBJTkdfQVBJX0xFVkVMXzM0KSksKQorICAgIFNZU1RFTV9FWFRfSFdTRVJWSUNFX0ZJTEVTICs9IHN5c3RlbS9od3NlcnZpY2VtYW5hZ2VyL2h3c2VydmljZW1hbmFnZXIueG1sCisgIGVuZGlmCitlbmRpZgorJChjYWxsIGFkZF9qc29uX2xpc3QsIFN5c3RlbUV4dE1hbmlmZXN0RmlsZXMsICQoU1lTVEVNX0VYVF9NQU5JRkVTVF9GSUxFUykgJChTWVNURU1fRVhUX0hXU0VSVklDRV9GSUxFUykpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgRGV2aWNlTWFuaWZlc3RGaWxlcywgJChERVZJQ0VfTUFOSUZFU1RfRklMRSkpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgT2RtTWFuaWZlc3RGaWxlcywgJChPRE1fTUFOSUZFU1RfRklMRVMpKQorCiAkKGNhbGwganNvbl9lbmQpCiAKICQoZmlsZSA+JChTT09OR19WQVJJQUJMRVMpLnRtcCwkKGpzb25fY29udGVudHMpKQpkaWZmIC0tZ2l0IGEvY29yZS9zb29uZ19leHRyYV9jb25maWcubWsgYi9jb3JlL3Nvb25nX2V4dHJhX2NvbmZpZy5tawppbmRleCAwMGI1YzBmLi44ZWVlNTBhIDEwMDY0NAotLS0gYS9jb3JlL3Nvb25nX2V4dHJhX2NvbmZpZy5taworKysgYi9jb3JlL3Nvb25nX2V4dHJhX2NvbmZpZy5tawpAQCAtNDMsNiArNDMsNyBAQAogJChjYWxsIGFkZF9qc29uX2xpc3QsIFBST0RVQ1RfUFJPRFVDVF9QUk9QRVJUSUVTLCAgICAgICAgJChjYWxsIGNvbGxhcHNlLXByb3AtcGFpcnMsUFJPRFVDVF9QUk9EVUNUX1BST1BFUlRJRVMpKQogJChjYWxsIGFkZF9qc29uX2xpc3QsIFBST0RVQ1RfT0RNX1BST1BFUlRJRVMsICAgICAgICAgICAgJChjYWxsIGNvbGxhcHNlLXByb3AtcGFpcnMsUFJPRFVDVF9PRE1fUFJPUEVSVElFUykpCiAkKGNhbGwgYWRkX2pzb25fbGlzdCwgUFJPRFVDVF9QUk9QRVJUWV9PVkVSUklERVMsICAgICAgICAkKGNhbGwgY29sbGFwc2UtcHJvcC1wYWlycyxQUk9EVUNUX1BST1BFUlRZX09WRVJSSURFUykpCiskKGNhbGwgYWRkX2pzb25fbGlzdCwgUFJPRFVDVF9ERUZBVUxUX1BST1BFUlRZX09WRVJSSURFUywgICAgICAgICQoY2FsbCBjb2xsYXBzZS1wcm9wLXBhaXJzLFBST0RVQ1RfREVGQVVMVF9QUk9QRVJUWV9PVkVSUklERVMpKQogCiAkKGNhbGwgYWRkX2pzb25fc3RyLCBCb290bG9hZGVyQm9hcmROYW1lLCAkKFRBUkdFVF9CT09UTE9BREVSX0JPQVJEX05BTUUpKQogCkBAIC03OSw3ICs4MCw3IEBACiAKICQoY2FsbCBhZGRfanNvbl9zdHIsIFNjcmVlbkRlbnNpdHksICQoVEFSR0VUX1NDUkVFTl9ERU5TSVRZKSkKIAotJChjYWxsIGFkZF9qc29uX2Jvb2wsIFVzZXNWdWxrYW4sICQoZmlsdGVyIHRydWUsJChUQVJHRVRfVVNFU19WVUxLQU4pKSkKKyQoY2FsbCBhZGRfanNvbl9zdHIsIFVzZXNWdWxrYW4sICQoVEFSR0VUX1VTRVNfVlVMS0FOKSkKIAogJChjYWxsIGFkZF9qc29uX2Jvb2wsIFp5Z290ZUZvcmNlNjQsICQoZmlsdGVyIHRydWUsJChaWUdPVEVfRk9SQ0VfNjQpKSkKIApkaWZmIC0tZ2l0IGEvY29yZS9zeXNwcm9wLm1rIGIvY29yZS9zeXNwcm9wLm1rCmluZGV4IGRjNmYyYzQuLjlhOWY1MDkgMTAwNjQ0Ci0tLSBhL2NvcmUvc3lzcHJvcC5taworKysgYi9jb3JlL3N5c3Byb3AubWsKQEAgLTEyMiwxMSArMTIyLDE5IEBACiBpZm5lcSAoJChzdHJpcCAkKDcpKSwgdHJ1ZSkKIAkkKGhpZGUpICQkKGNhbGwgZ2VuZXJhdGUtY29tbW9uLWJ1aWxkLXByb3BzLCQoY2FsbCB0by1sb3dlciwkKHN0cmlwICQoMSkpKSwkJEApCiBlbmRpZgorICAgICAgICAjIE1ha2UgYW5kIFNvb25nIHVzZSBkaWZmZXJlbnQgaW50ZXJtZWRpYXRlIGZpbGVzIHRvIGJ1aWxkIHZlbmRvci9idWlsZC5wcm9wLgorICAgICAgICAjIEFsdGhvdWdoIHRoZSBzeXNwcm9wIGNvbnRlbnRzIGFyZSBzYW1lLCB0aGUgYWJzb2x1dGUgcGF0aHMgb2YgYW5kcm9pZC1pbmZvLnByb3AgYXJlIGRpZmZlcmVudC4KKyAgICAgICAgIyBQcmludCB0aGUgZmlsZW5hbWUgZm9yIHRoZSBpbnRlcm1lZGlhdGUgZmlsZXMgKGZpbGVzIGluIE9VVF9ESVIpLgorICAgICAgICAjIFRoaXMgaGVscHMgd2l0aCB2YWxpZGF0aW5nIG1rLT5zb29uZyBtaWdyYXRpb24gb2YgYW5kcm9pZCBwYXJ0aXRpb25zLgogCSQoaGlkZSkgJChmb3JlYWNoIGZpbGUsJChzdHJpcCAkKDMpKSxcCiAJICAgIGlmIFsgLWYgIiQoZmlsZSkiIF07IHRoZW5cCiAJICAgICAgICBlY2hvICIiID4+ICQkQDtcCiAJICAgICAgICBlY2hvICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiID4+ICQkQDtcCi0JICAgICAgICBlY2hvICIjIGZyb20gJChmaWxlKSIgPj4gJCRAO1wKKwkgICAgICAgICQoaWYgJChmaWx0ZXIgJChPVVRfRElSKS8lLCQoZmlsZSkpLCBcCisJCWVjaG8gIiMgZnJvbSAkKG5vdGRpciAkKGZpbGUpKSIgPj4gJCRAO1wKKwkJLFwKKwkJZWNobyAiIyBmcm9tICQoZmlsZSkiID4+ICQkQDtcCisJCSlcCiAJICAgICAgICBlY2hvICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMiID4+ICQkQDtcCiAJICAgICAgICBjYXQgJChmaWxlKSA+PiAkJEA7XAogCSAgICBmaTspCkBAIC0xNTIsNjEgKzE2MCw2IEBACiAkKGNhbGwgZGVjbGFyZS0xcC10YXJnZXQsJCgyKSkKIGVuZGVmCiAKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgRGVmaW5lIGZpbmdlcnByaW50LCB0aHVtYnByaW50LCBhbmQgdmVyc2lvbiB0YWdzIGZvciB0aGUgY3VycmVudCBidWlsZAotIwotIyBCVUlMRF9WRVJTSU9OX1RBR1MgaXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiB0YWdzIGNob3NlbiBieSB0aGUgZGV2aWNlCi0jIGltcGxlbWVudGVyIHRoYXQgZnVydGhlciBkaXN0aW5ndWlzaGVzIHRoZSBidWlsZC4gSXQncyBiYXNpY2FsbHkgZGVmaW5lZAotIyBieSB0aGUgZGV2aWNlIGltcGxlbWVudGVyLiBIZXJlLCB3ZSBhcmUgYWRkaW5nIGEgbWFuZGF0b3J5IHRhZyB0aGF0Ci0jIGlkZW50aWZpZXMgdGhlIHNpZ25pbmcgY29uZmlnIG9mIHRoZSBidWlsZC4KLUJVSUxEX1ZFUlNJT05fVEFHUyA6PSAkKEJVSUxEX1ZFUlNJT05fVEFHUykKLWlmZXEgKCQoVEFSR0VUX0JVSUxEX1RZUEUpLGRlYnVnKQotICBCVUlMRF9WRVJTSU9OX1RBR1MgKz0gZGVidWcKLWVuZGlmCi0jIFRoZSAidGVzdC1rZXlzIiB0YWcgbWFya3MgYnVpbGRzIHNpZ25lZCB3aXRoIHRoZSBvbGQgdGVzdCBrZXlzLAotIyB3aGljaCBhcmUgYXZhaWxhYmxlIGluIHRoZSBTREsuICAiZGV2LWtleXMiIG1hcmtzIGJ1aWxkcyBzaWduZWQgd2l0aAotIyBub24tZGVmYXVsdCBkZXYga2V5cyAodXN1YWxseSBwcml2YXRlIGtleXMgZnJvbSBhIHZlbmRvciBkaXJlY3RvcnkpLgotIyBCb3RoIG9mIHRoZXNlIHRhZ3Mgd2lsbCBiZSByZW1vdmVkIGFuZCByZXBsYWNlZCB3aXRoICJyZWxlYXNlLWtleXMiCi0jIHdoZW4gdGhlIHRhcmdldC1maWxlcyBpcyBzaWduZWQgaW4gYSBwb3N0LWJ1aWxkIHN0ZXAuCi1pZmVxICgkKERFRkFVTFRfU1lTVEVNX0RFVl9DRVJUSUZJQ0FURSksYnVpbGQvbWFrZS90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS90ZXN0a2V5KQotQlVJTERfS0VZUyA6PSB0ZXN0LWtleXMKLWVsc2UKLUJVSUxEX0tFWVMgOj0gZGV2LWtleXMKLWVuZGlmCi1CVUlMRF9WRVJTSU9OX1RBR1MgKz0gJChCVUlMRF9LRVlTKQotQlVJTERfVkVSU0lPTl9UQUdTIDo9ICQoc3Vic3QgJChzcGFjZSksJChjb21tYSksJChzb3J0ICQoQlVJTERfVkVSU0lPTl9UQUdTKSkpCi0KLSMgQlVJTERfRklOR0VSUFJJTlQgaXMgdXNlZCB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBjb21iaW5lZCBidWlsZCBhbmQKLSMgcHJvZHVjdDsgdXNlZCBieSB0aGUgT1RBIHNlcnZlci4KLWlmZXEgKCwkKHN0cmlwICQoQlVJTERfRklOR0VSUFJJTlQpKSkKLSAgQlVJTERfRklOR0VSUFJJTlQgOj0gJChQUk9EVUNUX0JSQU5EKS8kKFRBUkdFVF9QUk9EVUNUKS8kKFRBUkdFVF9ERVZJQ0UpOiQoUExBVEZPUk1fVkVSU0lPTikvJChCVUlMRF9JRCkvJChCVUlMRF9OVU1CRVJfRlJPTV9GSUxFKTokKFRBUkdFVF9CVUlMRF9WQVJJQU5UKS8kKEJVSUxEX1ZFUlNJT05fVEFHUykKLWVuZGlmCi0KLUJVSUxEX0ZJTkdFUlBSSU5UX0ZJTEUgOj0gJChQUk9EVUNUX09VVCkvYnVpbGRfZmluZ2VycHJpbnQudHh0Ci1pZm5lcSAoLCQoc2hlbGwgbWtkaXIgLXAgJChQUk9EVUNUX09VVCkgJiYgZWNobyAkKEJVSUxEX0ZJTkdFUlBSSU5UKSA+JChCVUlMRF9GSU5HRVJQUklOVF9GSUxFKSAmJiBncmVwICIgIiAkKEJVSUxEX0ZJTkdFUlBSSU5UX0ZJTEUpKSkKLSAgJChlcnJvciBCVUlMRF9GSU5HRVJQUklOVCBjYW5ub3QgY29udGFpbiBzcGFjZXM6ICIkKGZpbGUgPCQoQlVJTERfRklOR0VSUFJJTlRfRklMRSkpIikKLWVuZGlmCi1CVUlMRF9GSU5HRVJQUklOVF9GUk9NX0ZJTEUgOj0gJCQoY2F0ICQoQlVJTERfRklOR0VSUFJJTlRfRklMRSkpCi0jIHVuc2V0IGl0IGZvciBzYWZldHkuCi1CVUlMRF9GSU5HRVJQUklOVCA6PQotCi0jIEJVSUxEX1RIVU1CUFJJTlQgaXMgdXNlZCB0byB1bmlxdWVseSBpZGVudGlmeSB0aGUgc3lzdGVtIGJ1aWxkOyB1c2VkIGJ5IHRoZQotIyBPVEEgc2VydmVyLiBUaGlzIHB1cnBvc2VmdWxseSBleGNsdWRlcyBhbnkgcHJvZHVjdC1zcGVjaWZpYyB2YXJpYWJsZXMuCi1pZmVxICgsJChzdHJpcCAkKEJVSUxEX1RIVU1CUFJJTlQpKSkKLSAgQlVJTERfVEhVTUJQUklOVCA6PSAkKFBMQVRGT1JNX1ZFUlNJT04pLyQoQlVJTERfSUQpLyQoQlVJTERfTlVNQkVSX0ZST01fRklMRSk6JChUQVJHRVRfQlVJTERfVkFSSUFOVCkvJChCVUlMRF9WRVJTSU9OX1RBR1MpCi1lbmRpZgotCi1CVUlMRF9USFVNQlBSSU5UX0ZJTEUgOj0gJChQUk9EVUNUX09VVCkvYnVpbGRfdGh1bWJwcmludC50eHQKLWlmZXEgKCQoc3RyaXAgJChIQVNfQlVJTERfTlVNQkVSKSksdHJ1ZSkKLSQoQlVJTERfVEhVTUJQUklOVF9GSUxFKTogJChCVUlMRF9OVU1CRVJfRklMRSkKLWVuZGlmCi1pZm5lcSAoLCQoc2hlbGwgbWtkaXIgLXAgJChQUk9EVUNUX09VVCkgJiYgZWNobyAkKEJVSUxEX1RIVU1CUFJJTlQpID4kKEJVSUxEX1RIVU1CUFJJTlRfRklMRSkgJiYgZ3JlcCAiICIgJChCVUlMRF9USFVNQlBSSU5UX0ZJTEUpKSkKLSAgJChlcnJvciBCVUlMRF9USFVNQlBSSU5UIGNhbm5vdCBjb250YWluIHNwYWNlczogIiQoZmlsZSA8JChCVUlMRF9USFVNQlBSSU5UX0ZJTEUpKSIpCi1lbmRpZgotIyB1bnNldCBpdCBmb3Igc2FmZXR5LgotQlVJTERfVEhVTUJQUklOVF9GSUxFIDo9Ci1CVUlMRF9USFVNQlBSSU5UIDo9Ci0KIEtOT1dOX09FTV9USFVNQlBSSU5UX1BST1BFUlRJRVMgOj0gXAogICAgIHJvLnByb2R1Y3QuYnJhbmQgXAogICAgIHJvLnByb2R1Y3QubmFtZSBcCkBAIC0yMzAsNyArMTgzLDcgQEAKICAgICAkKFRBUkdFVF9WRU5ET1JfUFJPUCksXAogICAgICQod2lsZGNhcmQgJChUQVJHRVRfREVWSUNFX0RJUikvdmVuZG9yLnByb3ApKQogCi1hbmRyb2lkX2luZm9fcHJvcCA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLEVUQyxhbmRyb2lkX2luZm9fcHJvcCkvYW5kcm9pZF9pbmZvLnByb3AKK2FuZHJvaWRfaW5mb19wcm9wIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsRVRDLGFuZHJvaWRfaW5mb19wcm9wKS9hbmRyb2lkLWluZm8ucHJvcAogJChhbmRyb2lkX2luZm9fcHJvcCk6ICQoSU5TVEFMTEVEX0FORFJPSURfSU5GT19UWFRfVEFSR0VUKQogCWNhdCAkPCB8IGdyZXAgJ3JlcXVpcmUgdmVyc2lvbi0nIHwgc2VkIC1lICdzL3JlcXVpcmUgdmVyc2lvbi0vcm8uYnVpbGQuZXhwZWN0Li9nJyA+ICRACiAKQEAgLTI4MSw1MSArMjM0LDE3IEBACiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogIyB2ZW5kb3JfZGxrbS9ldGMvYnVpbGQucHJvcAotIworIyBvZG1fZGxrbS9ldGMvYnVpbGQucHJvcAorIyBzeXN0ZW1fZGxrbS9idWlsZC5wcm9wCisjIFRoZXNlIGFyZSBidWlsdCBieSBTb29uZy4gU2VlIGJ1aWxkL3Nvb25nL0FuZHJvaWQuYnAKIAogSU5TVEFMTEVEX1ZFTkRPUl9ETEtNX0JVSUxEX1BST1BfVEFSR0VUIDo9ICQoVEFSR0VUX09VVF9WRU5ET1JfRExLTSkvZXRjL2J1aWxkLnByb3AKLSQoZXZhbCAkKGNhbGwgYnVpbGQtcHJvcGVydGllcyxcCi0gICAgdmVuZG9yX2Rsa20sXAotICAgICQoSU5TVEFMTEVEX1ZFTkRPUl9ETEtNX0JVSUxEX1BST1BfVEFSR0VUKSxcCi0gICAgJChlbXB0eSksXAotICAgICQoZW1wdHkpLFwKLSAgICAkKGVtcHR5KSxcCi0gICAgJChlbXB0eSksXAotICAgICQoZW1wdHkpKSkKLQotJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLXRhcmdldCwkKElOU1RBTExFRF9WRU5ET1JfRExLTV9CVUlMRF9QUk9QX1RBUkdFVCkpKQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgb2RtX2Rsa20vZXRjL2J1aWxkLnByb3AKLSMKLQogSU5TVEFMTEVEX09ETV9ETEtNX0JVSUxEX1BST1BfVEFSR0VUIDo9ICQoVEFSR0VUX09VVF9PRE1fRExLTSkvZXRjL2J1aWxkLnByb3AKLSQoZXZhbCAkKGNhbGwgYnVpbGQtcHJvcGVydGllcyxcCi0gICAgb2RtX2Rsa20sXAotICAgICQoSU5TVEFMTEVEX09ETV9ETEtNX0JVSUxEX1BST1BfVEFSR0VUKSxcCi0gICAgJChlbXB0eSksXAotICAgICQoZW1wdHkpLFwKLSAgICAkKGVtcHR5KSxcCi0gICAgJChlbXB0eSksXAotICAgICQoZW1wdHkpKSkKLQotJChldmFsICQoY2FsbCBkZWNsYXJlLTFwLXRhcmdldCwkKElOU1RBTExFRF9PRE1fRExLTV9CVUlMRF9QUk9QX1RBUkdFVCkpKQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgc3lzdGVtX2Rsa20vYnVpbGQucHJvcAotIwotCiBJTlNUQUxMRURfU1lTVEVNX0RMS01fQlVJTERfUFJPUF9UQVJHRVQgOj0gJChUQVJHRVRfT1VUX1NZU1RFTV9ETEtNKS9ldGMvYnVpbGQucHJvcAotJChldmFsICQoY2FsbCBidWlsZC1wcm9wZXJ0aWVzLFwKLSAgICBzeXN0ZW1fZGxrbSxcCi0gICAgJChJTlNUQUxMRURfU1lTVEVNX0RMS01fQlVJTERfUFJPUF9UQVJHRVQpLFwKLSAgICAkKGVtcHR5KSxcCi0gICAgJChlbXB0eSksXAotICAgICQoZW1wdHkpLFwKLSAgICAkKGVtcHR5KSxcCi0gICAgJChlbXB0eSkpKQotCi0kKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtdGFyZ2V0LCQoSU5TVEFMTEVEX1NZU1RFTV9ETEtNX0JVSUxEX1BST1BfVEFSR0VUKSkpCitBTExfREVGQVVMVF9JTlNUQUxMRURfTU9EVUxFUyArPSBcCisgICQoSU5TVEFMTEVEX1ZFTkRPUl9ETEtNX0JVSUxEX1BST1BfVEFSR0VUKSBcCisgICQoSU5TVEFMTEVEX09ETV9ETEtNX0JVSUxEX1BST1BfVEFSR0VUKSBcCisgICQoSU5TVEFMTEVEX1NZU1RFTV9ETEtNX0JVSUxEX1BST1BfVEFSR0VUKSBcCiAKICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICMgc3lzdGVtX2V4dC9ldGMvYnVpbGQucHJvcApAQCAtMzM1LDIyICsyNTQsMTIgQEAKIAogSU5TVEFMTEVEX1NZU1RFTV9FWFRfQlVJTERfUFJPUF9UQVJHRVQgOj0gJChUQVJHRVRfT1VUX1NZU1RFTV9FWFQpL2V0Yy9idWlsZC5wcm9wCiAKLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyByYW1kaXNrL2Jvb3QvZXRjL2J1aWxkLnByb3AKLSMKLQogUkFNRElTS19CVUlMRF9QUk9QX1JFTF9QQVRIIDo9IHN5c3RlbS9ldGMvcmFtZGlzay9idWlsZC5wcm9wCitpZmVxICh0cnVlLCQoQk9BUkRfVVNFU19SRUNPVkVSWV9BU19CT09UKSkKK0lOU1RBTExFRF9SQU1ESVNLX0JVSUxEX1BST1BfVEFSR0VUIDo9ICQoVEFSR0VUX1JFQ09WRVJZX1JPT1RfT1VUKS9maXJzdF9zdGFnZV9yYW1kaXNrLyQoUkFNRElTS19CVUlMRF9QUk9QX1JFTF9QQVRIKQorZWxzZQogSU5TVEFMTEVEX1JBTURJU0tfQlVJTERfUFJPUF9UQVJHRVQgOj0gJChUQVJHRVRfUkFNRElTS19PVVQpLyQoUkFNRElTS19CVUlMRF9QUk9QX1JFTF9QQVRIKQotJChldmFsICQoY2FsbCBidWlsZC1wcm9wZXJ0aWVzLFwKLSAgICBib290aW1hZ2UsXAotICAgICQoSU5TVEFMTEVEX1JBTURJU0tfQlVJTERfUFJPUF9UQVJHRVQpLFwKLSAgICAkKGVtcHR5KSxcCi0gICAgJChlbXB0eSksXAotICAgICQoZW1wdHkpLFwKLSAgICAkKGVtcHR5KSxcCi0gICAgJChlbXB0eSkpKQotCi0kKGV2YWwgJChjYWxsIGRlY2xhcmUtMXAtdGFyZ2V0LCQoSU5TVEFMTEVEX1JBTURJU0tfQlVJTERfUFJPUF9UQVJHRVQpKSkKK2VuZGlmCiAKIEFMTF9JTlNUQUxMRURfQlVJTERfUFJPUF9GSUxFUyA6PSBcCiAgICQoSU5TVEFMTEVEX0JVSUxEX1BST1BfVEFSR0VUKSBcCmRpZmYgLS1naXQgYS9jb3JlL3N5c3Byb3BfY29uZmlnLm1rIGIvY29yZS9zeXNwcm9wX2NvbmZpZy5tawppbmRleCA2OTA2NjExLi4xOTkxNTAzIDEwMDY0NAotLS0gYS9jb3JlL3N5c3Byb3BfY29uZmlnLm1rCisrKyBiL2NvcmUvc3lzcHJvcF9jb25maWcubWsKQEAgLTkxLDggKzkxLDEyIEBACiAjIEJ1aWxkIHN5c3RlbSBzZXQgQk9BUkRfQVBJX0xFVkVMIHRvIHNob3cgdGhlIGFwaSBsZXZlbCBvZiB0aGUgdmVuZG9yIEFQSSBzdXJmYWNlLgogIyBUaGlzIG11c3Qgbm90IGJlIGFsdGVyZWQgb3V0c2lkZSBvZiBidWlsZCBzeXN0ZW0uCiBpZmRlZiBCT0FSRF9BUElfTEVWRUwKLUFERElUSU9OQUxfVkVORE9SX1BST1BFUlRJRVMgKz0gXAotICAgIHJvLmJvYXJkLmFwaV9sZXZlbD0kKEJPQVJEX0FQSV9MRVZFTCkKKyAgQURESVRJT05BTF9WRU5ET1JfUFJPUEVSVElFUyArPSBcCisgICAgcm8uYm9hcmQuYXBpX2xldmVsPz0kKEJPQVJEX0FQSV9MRVZFTCkKKyAgaWZkZWYgQk9BUkRfQVBJX0xFVkVMX1BST1BfT1ZFUlJJREUKKyAgICBBRERJVElPTkFMX1ZFTkRPUl9QUk9QRVJUSUVTICs9IFwKKyAgICAgIHJvLmJvYXJkLmFwaV9sZXZlbD0kKEJPQVJEX0FQSV9MRVZFTF9QUk9QX09WRVJSSURFKQorICBlbmRpZgogZW5kaWYKICMgUkVMRUFTRV9CT0FSRF9BUElfTEVWRUxfRlJPWkVOIGlzIHRydWUgd2hlbiB0aGUgdmVuZG9yIEFQSSBzdXJmYWNlIGlzIGZyb3plbi4KIGlmZGVmIFJFTEVBU0VfQk9BUkRfQVBJX0xFVkVMX0ZST1pFTgpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9hdXRvcmVwcm8ubWsgYi9jb3JlL3Rhc2tzL2F1dG9yZXByby5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjgxZjliCi0tLSAvZGV2L251bGwKKysrIGIvY29yZS90YXNrcy9hdXRvcmVwcm8ubWsKQEAgLTAsMCArMSwzOSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaWZuZXEgKCQod2lsZGNhcmQgdGVzdC9zdHMvUkVBRE1FLWF1dG9yZXByby5tZCksKQordGVzdF9zdWl0ZV9uYW1lIDo9IGF1dG9yZXBybwordGVzdF9zdWl0ZV90cmFkZWZlZCA6PSBzdHMtdHJhZGVmZWQKK3Rlc3Rfc3VpdGVfcmVhZG1lIDo9IHRlc3Qvc3RzL1JFQURNRS1hdXRvcmVwcm8ubWQKK2F1dG9yZXByb196aXAgOj0gJChIT1NUX09VVCkvJCh0ZXN0X3N1aXRlX25hbWUpL2F1dG9yZXByby56aXAKKworaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvdGFza3MvdG9vbHMvY29tcGF0aWJpbGl0eS5taworCithdXRvcmVwcm9fcGx1Z2luX3NrZWwgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixFVEMsYXV0b3JlcHJvLXBsdWdpbi1za2VsLnppcCkvYXV0b3JlcHJvLXBsdWdpbi1za2VsLnppcAorCiskKGF1dG9yZXByb196aXApOiBBVVRPUkVQUk9fWklQIDo9ICQoY29tcGF0aWJpbGl0eV96aXApCiskKGF1dG9yZXByb196aXApOiBBVVRPUkVQUk9fUExVR0lOX1NLRUwgOj0gJChhdXRvcmVwcm9fcGx1Z2luX3NrZWwpCiskKGF1dG9yZXByb196aXApOiAkKE1FUkdFX1pJUFMpICQoWklQMlpJUCkgJChjb21wYXRpYmlsaXR5X3ppcCkgJChhdXRvcmVwcm9fcGx1Z2luX3NrZWwpCisJcm0gLWYgJEAgJChBVVRPUkVQUk9fWklQKV9maWx0ZXJlZAorCSQoWklQMlpJUCkgLWkgJChBVVRPUkVQUk9fWklQKSAtbyAkKEFVVE9SRVBST19aSVApX2ZpbHRlcmVkIFwKKwkJLXggYW5kcm9pZC1hdXRvcmVwcm8vdG9vbHMvc3RzLXRyYWRlZmVkLXRlc3RzLmphciBcCisJCSdhbmRyb2lkLWF1dG9yZXByby90b29scy8qOmF1dG9yZXByby9zcmMvbWFpbi9yZXNvdXJjZXMvc3RzLXRyYWRlZmVkLXRvb2xzLycKKwkkKE1FUkdFX1pJUFMpICRAICQoQVVUT1JFUFJPX1pJUClfZmlsdGVyZWQgJChBVVRPUkVQUk9fUExVR0lOX1NLRUwpCisJcm0gLWYgJChBVVRPUkVQUk9fWklQKV9maWx0ZXJlZAorCisuUEhPTlk6IGF1dG9yZXBybworYXV0b3JlcHJvOiAkKGF1dG9yZXByb196aXApCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGF1dG9yZXBybywgJChhdXRvcmVwcm9femlwKSkKKworZW5kaWYKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2dzaS9BbmRyb2lkLm1rIGIvY29yZS90YXNrcy9jaGVjay1hYmktZHVtcC1saXN0Lm1rCnNpbWlsYXJpdHkgaW5kZXggNzElCnJlbmFtZSBmcm9tIHRhcmdldC9wcm9kdWN0L2dzaS9BbmRyb2lkLm1rCnJlbmFtZSB0byBjb3JlL3Rhc2tzL2NoZWNrLWFiaS1kdW1wLWxpc3QubWsKaW5kZXggMzY4OTdmZS4uODFkNTQ5ZSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvZ3NpL0FuZHJvaWQubWsKKysrIGIvY29yZS90YXNrcy9jaGVjay1hYmktZHVtcC1saXN0Lm1rCkBAIC0xLDQgKzEsMTYgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorIyBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCiAjIENoZWNrIHRoZSBnZW5lcmF0ZSBsaXN0IGFnYWluc3QgdGhlIGxhdGVzdCBsaXN0IHN0b3JlZCBpbiB0aGUKQEAgLTEwOSw2MCArMTIxLDMgQEAKIAkkKGlmICQoYWRkZWRfdm5ka19hYmlfZHVtcHMpJChhZGRlZF9wbGF0Zm9ybV9hYmlfZHVtcHMpLGV4aXQgMSkKIAkkKGhpZGUpIG1rZGlyIC1wICQoZGlyICRAKQogCSQoaGlkZSkgdG91Y2ggJEAKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFZOREsgcGFja2FnZSBhbmQgc25hcHNob3QuCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gdm5ka19hcGV4X3NuYXBzaG90X3BhY2thZ2UKLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSAkKGZvcmVhY2ggdm5ka192ZXIsJChQUk9EVUNUX0VYVFJBX1ZOREtfVkVSU0lPTlMpLGNvbS5hbmRyb2lkLnZuZGsudiQodm5ka192ZXIpKQotaW5jbHVkZSAkKEJVSUxEX1BIT05ZX1BBQ0tBR0UpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBEZWZpbmUgUGhvbnkgbW9kdWxlIHRvIGluc3RhbGwgTExOREsgbW9kdWxlcyB3aGljaCBhcmUgaW5zdGFsbGVkIGluCi0jIHRoZSBzeXN0ZW0gaW1hZ2UKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IGxsbmRrX2luX3N5c3RlbQotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi0KLSMgRmlsdGVyIExMTkRLIGxpYnMgbW92ZWQgdG8gQVBFWCB0byBhdm9pZCBwdWxsaW5nIHRoZW0gaW50byAvc3lzdGVtL0xJQgotTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBcCi0gICAgJChmaWx0ZXItb3V0ICQoTExOREtfTU9WRURfVE9fQVBFWF9MSUJSQVJJRVMpLCQoTExOREtfTElCUkFSSUVTKSkgXAotICAgIGxsbmRrLmxpYnJhcmllcy50eHQKLQotCi1pbmNsdWRlICQoQlVJTERfUEhPTllfUEFDS0FHRSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGluaXQuZ3NpLnJjLCBHU0ktc3BlY2lmaWMgaW5pdCBzY3JpcHQuCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IGluaXQuZ3NpLnJjCi1MT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKExPQ0FMX01PRFVMRSkKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX1NZU1RFTV9FWFRfTU9EVUxFIDo9IHRydWUKLUxPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IGluaXQKLQotaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQotCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IGluaXQudm5kay1ub2RlZi5yYwotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9TUkNfRklMRVMgOj0gJChMT0NBTF9NT0RVTEUpCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9TWVNURU1fRVhUX01PRFVMRSA6PSB0cnVlCi1MT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBnc2kKLQotaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9jdHMubWsgYi9jb3JlL3Rhc2tzL2N0cy5tawppbmRleCAyOTRjYjU3Li4xYTU1YmY0IDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL2N0cy5taworKysgYi9jb3JlL3Rhc2tzL2N0cy5tawpAQCAtOTcsMTIgKzk3LDI4IEBACiBjb3ZlcmFnZV9vdXQgOj0gJChIT1NUX09VVCkvY3RzLWFwaS1jb3ZlcmFnZQogYXBpX21hcF9vdXQgOj0gJChIT1NUX09VVCkvY3RzLWFwaS1tYXAKIAotY3RzX2phcl9maWxlcyA6PSAkKGFwaV9tYXBfb3V0KS9hcGlfbWFwX2ZpbGVzLnR4dAorY3RzX2phcl9maWxlcyA6PSAkKGFwaV9tYXBfb3V0KS9jdHNfamFyX2ZpbGVzLnR4dAorY3RzX3ZfaG9zdF9qYXJfZmlsZXMgOj0gJChhcGlfbWFwX291dCkvY3RzX3ZfaG9zdF9qYXJfZmlsZXMudHh0CitjdHNfYWxsX2phcl9maWxlcyA6PSAkKGFwaV9tYXBfb3V0KS9jdHNfYWxsX2phcl9maWxlcy50eHQKKwogJChjdHNfamFyX2ZpbGVzKTogUFJJVkFURV9BUElfTUFQX0ZJTEVTIDo9ICQoc29ydCAkKENPTVBBVElCSUxJVFkuY3RzLkFQSV9NQVBfRklMRVMpKQogJChjdHNfamFyX2ZpbGVzKToKIAlta2RpciAtcCAkKGRpciAkQCkKIAllY2hvICQoUFJJVkFURV9BUElfTUFQX0ZJTEVTKSA+ICRACiAKKyQoY3RzX3ZfaG9zdF9qYXJfZmlsZXMpOiBQUklWQVRFX0FQSV9NQVBfRklMRVMgOj0gJChzb3J0ICQoQ09NUEFUSUJJTElUWS5jdHMtdi1ob3N0LkFQSV9NQVBfRklMRVMpKQorJChjdHNfdl9ob3N0X2phcl9maWxlcyk6ICQoU09PTkdfQU5EUk9JRF9DVFNfVkVSSUZJRVJfQVBQX0xJU1QpCisJbWtkaXIgLXAgJChkaXIgJEApCisJY3AgJDwgJEAKKwllY2hvICQoUFJJVkFURV9BUElfTUFQX0ZJTEVTKSA+PiAkQAorCiskKGN0c19hbGxfamFyX2ZpbGVzKTogUFJJVkFURV9BUElfTUFQX0ZJTEVTIDo9ICQoc29ydCAkKENPTVBBVElCSUxJVFkuY3RzLkFQSV9NQVBfRklMRVMpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoQ09NUEFUSUJJTElUWS5jdHMtdi1ob3N0LkFQSV9NQVBfRklMRVMpKQorJChjdHNfYWxsX2phcl9maWxlcyk6ICQoU09PTkdfQU5EUk9JRF9DVFNfVkVSSUZJRVJfQVBQX0xJU1QpCisJbWtkaXIgLXAgJChkaXIgJEApCisJY3AgJDwgJEAKKwllY2hvICQoUFJJVkFURV9BUElfTUFQX0ZJTEVTKSA+PiAkQAorCiBhcGlfeG1sX2Rlc2NyaXB0aW9uIDo9ICQoVEFSR0VUX09VVF9DT01NT05fSU5URVJNRURJQVRFUykvYXBpLnhtbAogCiBuYXBpX3RleHRfZGVzY3JpcHRpb24gOj0gY3RzL3Rvb2xzL2N0cy1hcGktY292ZXJhZ2UvZXRjL25kay1hcGkueG1sCkBAIC0xMTMsNiArMTI5LDEzIEBACiAJCSQoaGlkZSkgJChBQ1ApICAkPCAkQAogCiBzeXN0ZW1fYXBpX3htbF9kZXNjcmlwdGlvbiA6PSAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL3N5c3RlbS1hcGkueG1sCittb2R1bGVfbGliX2FwaV94bWxfZGVzY3JpcHRpb24gOj0gJChUQVJHRVRfT1VUX0NPTU1PTl9JTlRFUk1FRElBVEVTKS9tb2R1bGUtbGliLWFwaS54bWwKK3N5c3RlbV9zZXJ2aWNlX2FwaV9kZXNjcmlwdGlvbiA6PSAkKFRBUkdFVF9PVVRfQ09NTU9OX0lOVEVSTUVESUFURVMpL3N5c3RlbS1zZXJ2ZXItYXBpLnhtbAorCitjb21iaW5lZF9hcGlfeG1sX2Rlc2NyaXB0aW9uIDo9ICQoYXBpX3htbF9kZXNjcmlwdGlvbikgXAorICAkKHN5c3RlbV9hcGlfeG1sX2Rlc2NyaXB0aW9uKSBcCisgICQobW9kdWxlX2xpYl9hcGlfeG1sX2Rlc2NyaXB0aW9uKSBcCisgICQoc3lzdGVtX3NlcnZpY2VfYXBpX2Rlc2NyaXB0aW9uKQogCiBjdHMtdGVzdC1jb3ZlcmFnZS1yZXBvcnQgOj0gJChjb3ZlcmFnZV9vdXQpL3Rlc3QtY292ZXJhZ2UuaHRtbAogY3RzLXN5c3RlbS1hcGktY292ZXJhZ2UtcmVwb3J0IDo9ICQoY292ZXJhZ2Vfb3V0KS9zeXN0ZW0tYXBpLWNvdmVyYWdlLmh0bWwKQEAgLTEyNCwxMyArMTQ3LDE0IEBACiBjdHNfYXBpX2NvdmVyYWdlX2RlcGVuZGVuY2llcyA6PSAkKGN0c19hcGlfY292ZXJhZ2VfZXhlKSAkKGRleGRlcHNfZXhlKSAkKGFwaV94bWxfZGVzY3JpcHRpb24pICQobmFwaV94bWxfZGVzY3JpcHRpb24pCiBjdHNfc3lzdGVtX2FwaV9jb3ZlcmFnZV9kZXBlbmRlbmNpZXMgOj0gJChjdHNfYXBpX2NvdmVyYWdlX2V4ZSkgJChkZXhkZXBzX2V4ZSkgJChzeXN0ZW1fYXBpX3htbF9kZXNjcmlwdGlvbikKIAotY3RzLWFwaS14bWwtYXBpLW1hcC1yZXBvcnQgOj0gJChhcGlfbWFwX291dCkvYXBpLW1hcC54bWwKLWN0cy1hcGktaHRtbC1hcGktbWFwLXJlcG9ydCA6PSAkKGFwaV9tYXBfb3V0KS9hcGktbWFwLmh0bWwKLWN0cy1zeXN0ZW0tYXBpLXhtbC1hcGktbWFwLXJlcG9ydCA6PSAkKGFwaV9tYXBfb3V0KS9zeXN0ZW0tYXBpLW1hcC54bWwKLWN0cy1zeXN0ZW0tYXBpLWh0bWwtYXBpLW1hcC1yZXBvcnQgOj0gJChhcGlfbWFwX291dCkvc3lzdGVtLWFwaS1tYXAuaHRtbAorY3RzLWFwaS1tYXAteG1sLXJlcG9ydCA6PSAkKGFwaV9tYXBfb3V0KS9jdHMtYXBpLW1hcC54bWwKK2N0cy12LWhvc3QtYXBpLW1hcC14bWwtcmVwb3J0IDo9ICQoYXBpX21hcF9vdXQpL2N0cy12LWhvc3QtYXBpLW1hcC54bWwKK2N0cy1jb21iaW5lZC1hcGktbWFwLXhtbC1yZXBvcnQgOj0gJChhcGlfbWFwX291dCkvY3RzLWNvbWJpbmVkLWFwaS1tYXAueG1sCitjdHMtY29tYmluZWQtYXBpLW1hcC1odG1sLXJlcG9ydCA6PSAkKGFwaV9tYXBfb3V0KS9jdHMtY29tYmluZWQtYXBpLW1hcC5odG1sCiAKLWN0c19zeXN0ZW1fYXBpX21hcF9kZXBlbmRlbmNpZXMgOj0gJChjdHNfYXBpX21hcF9leGUpICQoc3lzdGVtX2FwaV94bWxfZGVzY3JpcHRpb24pICQoY3RzX2phcl9maWxlcykKLWN0c19hcGlfbWFwX2RlcGVuZGVuY2llcyA6PSAkKGN0c19hcGlfbWFwX2V4ZSkgJChhcGlfeG1sX2Rlc2NyaXB0aW9uKSAkKGN0c19qYXJfZmlsZXMpCitjdHNfYXBpX21hcF9kZXBlbmRlbmNpZXMgOj0gJChjdHNfYXBpX21hcF9leGUpICQoY29tYmluZWRfYXBpX3htbF9kZXNjcmlwdGlvbikgJChjdHNfamFyX2ZpbGVzKQorY3RzX3ZfaG9zdF9hcGlfbWFwX2RlcGVuZGVuY2llcyA6PSAkKGN0c19hcGlfbWFwX2V4ZSkgJChjb21iaW5lZF9hcGlfeG1sX2Rlc2NyaXB0aW9uKSAkKGN0c192X2hvc3RfamFyX2ZpbGVzKQorY3RzX2NvbWJpbmVkX2FwaV9tYXBfZGVwZW5kZW5jaWVzIDo9ICQoY3RzX2FwaV9tYXBfZXhlKSAkKGNvbWJpbmVkX2FwaV94bWxfZGVzY3JpcHRpb24pICQoY3RzX2FsbF9qYXJfZmlsZXMpCiAKIGFuZHJvaWRfY3RzX3ppcCA6PSAkKEhPU1RfT1VUKS9jdHMvYW5kcm9pZC1jdHMuemlwCiBjdHNfdmVyaWZpZXJfYXBrIDo9ICQoY2FsbCBpbnRlcm1lZGlhdGVzLWRpci1mb3IsQVBQUyxDdHNWZXJpZmllcikvcGFja2FnZS5hcGsKQEAgLTIxMCw0NSArMjM0LDQyIEBACiAuUEhPTlk6IGN0cy1jb3ZlcmFnZS1yZXBvcnQtYWxsIGN0cy1hcGktY292ZXJhZ2UKIGN0cy1jb3ZlcmFnZS1yZXBvcnQtYWxsOiBjdHMtdGVzdC1jb3ZlcmFnZSBjdHMtdmVyaWZpZXItY292ZXJhZ2UgY3RzLWNvbWJpbmVkLWNvdmVyYWdlIGN0cy1jb21iaW5lZC14bWwtY292ZXJhZ2UKIAotJChjdHMtc3lzdGVtLWFwaS14bWwtYXBpLW1hcC1yZXBvcnQpOiBQUklWQVRFX0NUU19BUElfTUFQX0VYRSA6PSAkKGN0c19hcGlfbWFwX2V4ZSkKLSQoY3RzLXN5c3RlbS1hcGkteG1sLWFwaS1tYXAtcmVwb3J0KTogUFJJVkFURV9BUElfWE1MX0RFU0MgOj0gJChzeXN0ZW1fYXBpX3htbF9kZXNjcmlwdGlvbikKLSQoY3RzLXN5c3RlbS1hcGkteG1sLWFwaS1tYXAtcmVwb3J0KTogUFJJVkFURV9KQVJfRklMRVMgOj0gJChjdHNfamFyX2ZpbGVzKQotJChjdHMtc3lzdGVtLWFwaS14bWwtYXBpLW1hcC1yZXBvcnQpIDogJChhbmRyb2lkX2N0c196aXApICQoY3RzX3N5c3RlbV9hcGlfbWFwX2RlcGVuZGVuY2llcykgfCAkKEFDUCkKLQkkKGNhbGwgZ2VuZXJhdGUtYXBpLW1hcC1yZXBvcnQtY3RzLCJDVFMgU3lzdGVtIEFQSSBNQVAgUmVwb3J0IC0gWE1MIixcCi0JCQkkKFBSSVZBVEVfSkFSX0ZJTEVTKSx4bWwpCi0KLSQoY3RzLXN5c3RlbS1hcGktaHRtbC1hcGktbWFwLXJlcG9ydCk6IFBSSVZBVEVfQ1RTX0FQSV9NQVBfRVhFIDo9ICQoY3RzX2FwaV9tYXBfZXhlKQotJChjdHMtc3lzdGVtLWFwaS1odG1sLWFwaS1tYXAtcmVwb3J0KTogUFJJVkFURV9BUElfWE1MX0RFU0MgOj0gJChzeXN0ZW1fYXBpX3htbF9kZXNjcmlwdGlvbikKLSQoY3RzLXN5c3RlbS1hcGktaHRtbC1hcGktbWFwLXJlcG9ydCk6IFBSSVZBVEVfSkFSX0ZJTEVTIDo9ICQoY3RzX2phcl9maWxlcykKLSQoY3RzLXN5c3RlbS1hcGktaHRtbC1hcGktbWFwLXJlcG9ydCkgOiAkKGFuZHJvaWRfY3RzX3ppcCkgJChjdHNfc3lzdGVtX2FwaV9tYXBfZGVwZW5kZW5jaWVzKSB8ICQoQUNQKQotCSQoY2FsbCBnZW5lcmF0ZS1hcGktbWFwLXJlcG9ydC1jdHMsIkNUUyBTeXN0ZW0gQVBJIE1BUCBSZXBvcnQgLSBIVE1MIixcCi0JCQkkKFBSSVZBVEVfSkFSX0ZJTEVTKSxodG1sKQotCi0kKGN0cy1hcGkteG1sLWFwaS1tYXAtcmVwb3J0KTogUFJJVkFURV9DVFNfQVBJX01BUF9FWEUgOj0gJChjdHNfYXBpX21hcF9leGUpCi0kKGN0cy1hcGkteG1sLWFwaS1tYXAtcmVwb3J0KTogUFJJVkFURV9BUElfWE1MX0RFU0MgOj0gJChhcGlfeG1sX2Rlc2NyaXB0aW9uKQotJChjdHMtYXBpLXhtbC1hcGktbWFwLXJlcG9ydCk6IFBSSVZBVEVfSkFSX0ZJTEVTIDo9ICQoY3RzX2phcl9maWxlcykKLSQoY3RzLWFwaS14bWwtYXBpLW1hcC1yZXBvcnQpIDogJChhbmRyb2lkX2N0c196aXApICQoY3RzX2FwaV9tYXBfZGVwZW5kZW5jaWVzKSB8ICQoQUNQKQorJChjdHMtYXBpLW1hcC14bWwtcmVwb3J0KTogUFJJVkFURV9DVFNfQVBJX01BUF9FWEUgOj0gJChjdHNfYXBpX21hcF9leGUpCiskKGN0cy1hcGktbWFwLXhtbC1yZXBvcnQpOiBQUklWQVRFX0FQSV9YTUxfREVTQyA6PSAkKGNvbWJpbmVkX2FwaV94bWxfZGVzY3JpcHRpb24pCiskKGN0cy1hcGktbWFwLXhtbC1yZXBvcnQpOiBQUklWQVRFX0pBUl9GSUxFUyA6PSAkKGN0c19qYXJfZmlsZXMpCiskKGN0cy1hcGktbWFwLXhtbC1yZXBvcnQpIDogJChhbmRyb2lkX2N0c196aXApICQoY3RzX2FwaV9tYXBfZGVwZW5kZW5jaWVzKSB8ICQoQUNQKQogCSQoY2FsbCBnZW5lcmF0ZS1hcGktbWFwLXJlcG9ydC1jdHMsIkNUUyBBUEkgTUFQIFJlcG9ydCAtIFhNTCIsXAogCQkJJChQUklWQVRFX0pBUl9GSUxFUykseG1sKQogCi0kKGN0cy1hcGktaHRtbC1hcGktbWFwLXJlcG9ydCk6IFBSSVZBVEVfQ1RTX0FQSV9NQVBfRVhFIDo9ICQoY3RzX2FwaV9tYXBfZXhlKQotJChjdHMtYXBpLWh0bWwtYXBpLW1hcC1yZXBvcnQpOiBQUklWQVRFX0FQSV9YTUxfREVTQyA6PSAkKGFwaV94bWxfZGVzY3JpcHRpb24pCi0kKGN0cy1hcGktaHRtbC1hcGktbWFwLXJlcG9ydCk6IFBSSVZBVEVfSkFSX0ZJTEVTIDo9ICQoY3RzX2phcl9maWxlcykKLSQoY3RzLWFwaS1odG1sLWFwaS1tYXAtcmVwb3J0KSA6ICQoYW5kcm9pZF9jdHNfemlwKSAkKGN0c19hcGlfbWFwX2RlcGVuZGVuY2llcykgfCAkKEFDUCkKLQkkKGNhbGwgZ2VuZXJhdGUtYXBpLW1hcC1yZXBvcnQtY3RzLCJDVFMgQVBJIE1BUCBSZXBvcnQgLSBIVE1MIixcCiskKGN0cy12LWhvc3QtYXBpLW1hcC14bWwtcmVwb3J0KTogUFJJVkFURV9DVFNfQVBJX01BUF9FWEUgOj0gJChjdHNfYXBpX21hcF9leGUpCiskKGN0cy12LWhvc3QtYXBpLW1hcC14bWwtcmVwb3J0KTogUFJJVkFURV9BUElfWE1MX0RFU0MgOj0gJChjb21iaW5lZF9hcGlfeG1sX2Rlc2NyaXB0aW9uKQorJChjdHMtdi1ob3N0LWFwaS1tYXAteG1sLXJlcG9ydCk6IFBSSVZBVEVfSkFSX0ZJTEVTIDo9ICQoY3RzX3ZfaG9zdF9qYXJfZmlsZXMpCiskKGN0cy12LWhvc3QtYXBpLW1hcC14bWwtcmVwb3J0KSA6ICQodmVyaWZpZXJfemlwKSAkKGN0c192X2hvc3RfYXBpX21hcF9kZXBlbmRlbmNpZXMpIHwgJChBQ1ApCisJJChjYWxsIGdlbmVyYXRlLWFwaS1tYXAtcmVwb3J0LWN0cywiQ1RTLVYtSE9TVCBBUEkgTUFQIFJlcG9ydCAtIFhNTCIsXAorCQkJJChQUklWQVRFX0pBUl9GSUxFUykseG1sKQorCiskKGN0cy1jb21iaW5lZC1hcGktbWFwLXhtbC1yZXBvcnQpOiBQUklWQVRFX0NUU19BUElfTUFQX0VYRSA6PSAkKGN0c19hcGlfbWFwX2V4ZSkKKyQoY3RzLWNvbWJpbmVkLWFwaS1tYXAteG1sLXJlcG9ydCk6IFBSSVZBVEVfQVBJX1hNTF9ERVNDIDo9ICQoY29tYmluZWRfYXBpX3htbF9kZXNjcmlwdGlvbikKKyQoY3RzLWNvbWJpbmVkLWFwaS1tYXAteG1sLXJlcG9ydCk6IFBSSVZBVEVfSkFSX0ZJTEVTIDo9ICQoY3RzX2FsbF9qYXJfZmlsZXMpCiskKGN0cy1jb21iaW5lZC1hcGktbWFwLXhtbC1yZXBvcnQpIDogJCh2ZXJpZmllcl96aXApICQoYW5kcm9pZF9jdHNfemlwKSAkKGN0c19jb21iaW5lZF9hcGlfbWFwX2RlcGVuZGVuY2llcykgfCAkKEFDUCkKKwkkKGNhbGwgZ2VuZXJhdGUtYXBpLW1hcC1yZXBvcnQtY3RzLCJDVFMgQ29tYmluZWQgQVBJIE1BUCBSZXBvcnQgLSBYTUwiLFwKKwkJCSQoUFJJVkFURV9KQVJfRklMRVMpLHhtbCkKKworJChjdHMtY29tYmluZWQtYXBpLW1hcC1odG1sLXJlcG9ydCk6IFBSSVZBVEVfQ1RTX0FQSV9NQVBfRVhFIDo9ICQoY3RzX2FwaV9tYXBfZXhlKQorJChjdHMtY29tYmluZWQtYXBpLW1hcC1odG1sLXJlcG9ydCk6IFBSSVZBVEVfQVBJX1hNTF9ERVNDIDo9ICQoY29tYmluZWRfYXBpX3htbF9kZXNjcmlwdGlvbikKKyQoY3RzLWNvbWJpbmVkLWFwaS1tYXAtaHRtbC1yZXBvcnQpOiBQUklWQVRFX0pBUl9GSUxFUyA6PSAkKGN0c19hbGxfamFyX2ZpbGVzKQorJChjdHMtY29tYmluZWQtYXBpLW1hcC1odG1sLXJlcG9ydCkgOiAkKHZlcmlmaWVyX3ppcCkgJChhbmRyb2lkX2N0c196aXApICQoY3RzX2NvbWJpbmVkX2FwaV9tYXBfZGVwZW5kZW5jaWVzKSB8ICQoQUNQKQorCSQoY2FsbCBnZW5lcmF0ZS1hcGktbWFwLXJlcG9ydC1jdHMsIkNUUyBDb21iaW5lZCBBUEkgTUFQIFJlcG9ydCAtIEhUTUwiLFwKIAkJCSQoUFJJVkFURV9KQVJfRklMRVMpLGh0bWwpCiAKLS5QSE9OWTogY3RzLXN5c3RlbS1hcGkteG1sLWFwaS1tYXAKLWN0cy1zeXN0ZW0tYXBpLXhtbC1hcGktbWFwIDogJChjdHMtc3lzdGVtLWFwaS14bWwtYXBpLW1hcC1yZXBvcnQpCisuUEhPTlk6IGN0cy1hcGktbWFwLXhtbAorY3RzLWFwaS1tYXAteG1sIDogJChjdHMtYXBpLW1hcC14bWwtcmVwb3J0KQogCi0uUEhPTlk6IGN0cy1zeXN0ZW0tYXBpLWh0bWwtYXBpLW1hcAotY3RzLXN5c3RlbS1hcGktaHRtbC1hcGktbWFwIDogJChjdHMtc3lzdGVtLWFwaS1odG1sLWFwaS1tYXAtcmVwb3J0KQorLlBIT05ZOiBjdHMtdi1ob3N0LWFwaS1tYXAteG1sCitjdHMtdi1ob3N0LWFwaS1tYXAteG1sOiAkKGN0cy12LWhvc3QtYXBpLW1hcC14bWwtcmVwb3J0KQogCi0uUEhPTlk6IGN0cy1hcGkteG1sLWFwaS1tYXAKLWN0cy1hcGkteG1sLWFwaS1tYXAgOiAkKGN0cy1hcGkteG1sLWFwaS1tYXAtcmVwb3J0KQotCi0uUEhPTlk6IGN0cy1hcGktaHRtbC1hcGktbWFwCi1jdHMtYXBpLWh0bWwtYXBpLW1hcCA6ICQoY3RzLWFwaS1odG1sLWFwaS1tYXAtcmVwb3J0KQorLlBIT05ZOiBjdHMtY29tYmluZWQtYXBpLW1hcC14bWwKK2N0cy1jb21iaW5lZC1hcGktbWFwLXhtbCA6ICQoY3RzLWNvbWJpbmVkLWFwaS1tYXAteG1sLXJlcG9ydCkKIAogLlBIT05ZOiBjdHMtYXBpLW1hcC1hbGwKIApAQCAtMjY4LDE1ICsyODksMTMgQEAKIEFMTF9UQVJHRVRTLiQoY3RzLWNvbWJpbmVkLXhtbC1jb3ZlcmFnZS1yZXBvcnQpLk1FVEFfTElDOj0kKG1vZHVsZV9saWNlbnNlX21ldGFkYXRhKQogCiAjIFB1dCB0aGUgdGVzdCBhcGkgbWFwIHJlcG9ydCBpbiB0aGUgZGlzdCBkaXIgaWYgImN0cy1hcGktbWFwLWFsbCIgaXMgYW1vbmcgdGhlIGJ1aWxkIGdvYWxzLgotJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBjdHMtYXBpLW1hcC1hbGwsICQoY3RzLXN5c3RlbS1hcGkteG1sLWFwaS1tYXAtcmVwb3J0KTpjdHMtc3lzdGVtLWFwaS14bWwtYXBpLW1hcC1yZXBvcnQueG1sKQotJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBjdHMtYXBpLW1hcC1hbGwsICQoY3RzLXN5c3RlbS1hcGktaHRtbC1hcGktbWFwLXJlcG9ydCk6Y3RzLXN5c3RlbS1hcGktaHRtbC1hcGktbWFwLXJlcG9ydC5odG1sKQotJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBjdHMtYXBpLW1hcC1hbGwsICQoY3RzLWFwaS14bWwtYXBpLW1hcC1yZXBvcnQpOmN0cy1hcGkteG1sLWFwaS1tYXAtcmVwb3J0LnhtbCkKLSQoY2FsbCBkaXN0LWZvci1nb2FscywgY3RzLWFwaS1tYXAtYWxsLCAkKGN0cy1hcGktaHRtbC1hcGktbWFwLXJlcG9ydCk6Y3RzLWFwaS1odG1sLWFwaS1tYXAtcmVwb3J0Lmh0bWwpCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGN0cy1hcGktbWFwLWFsbCwgJChjdHMtY29tYmluZWQtYXBpLW1hcC14bWwtcmVwb3J0KTpjdHMtYXBpLW1hcC1yZXBvcnQueG1sKQorJChjYWxsIGRpc3QtZm9yLWdvYWxzLCBjdHMtYXBpLW1hcC1hbGwsICQoY3RzLWNvbWJpbmVkLWFwaS1tYXAtaHRtbC1yZXBvcnQpOmN0cy1hcGktbWFwLXJlcG9ydC5odG1sKQogCi1BTExfVEFSR0VUUy4kKGN0cy1zeXN0ZW0tYXBpLXhtbC1hcGktbWFwLXJlcG9ydCkuTUVUQV9MSUM6PSQobW9kdWxlX2xpY2Vuc2VfbWV0YWRhdGEpCi1BTExfVEFSR0VUUy4kKGN0cy1zeXN0ZW0tYXBpLWh0bWwtYXBpLW1hcC1yZXBvcnQpLk1FVEFfTElDOj0kKG1vZHVsZV9saWNlbnNlX21ldGFkYXRhKQotQUxMX1RBUkdFVFMuJChjdHMtYXBpLXhtbC1hcGktbWFwLXJlcG9ydCkuTUVUQV9MSUM6PSQobW9kdWxlX2xpY2Vuc2VfbWV0YWRhdGEpCi1BTExfVEFSR0VUUy4kKGN0cy1hcGktaHRtbC1hcGktbWFwLXJlcG9ydCkuTUVUQV9MSUM6PSQobW9kdWxlX2xpY2Vuc2VfbWV0YWRhdGEpCitBTExfVEFSR0VUUy4kKGN0cy1hcGktbWFwLXhtbC1yZXBvcnQpLk1FVEFfTElDOj0kKG1vZHVsZV9saWNlbnNlX21ldGFkYXRhKQorQUxMX1RBUkdFVFMuJChjdHMtdi1ob3N0LWFwaS1tYXAteG1sLXJlcG9ydCkuTUVUQV9MSUM6PSQobW9kdWxlX2xpY2Vuc2VfbWV0YWRhdGEpCitBTExfVEFSR0VUUy4kKGN0cy1jb21iaW5lZC1hcGktbWFwLXhtbC1yZXBvcnQpLk1FVEFfTElDOj0kKG1vZHVsZV9saWNlbnNlX21ldGFkYXRhKQorQUxMX1RBUkdFVFMuJChjdHMtY29tYmluZWQtYXBpLW1hcC1odG1sLXJlcG9ydCkuTUVUQV9MSUM6PSQobW9kdWxlX2xpY2Vuc2VfbWV0YWRhdGEpCiAKICMgQXJndW1lbnRzOwogIyAgMSAtIE5hbWUgb2YgdGhlIHJlcG9ydCBwcmludGVkIG91dCBvbiB0aGUgc2NyZWVuCkBAIC0yOTQsNyArMzEzLDcgQEAKICMgIDMgLSBGb3JtYXQgb2YgdGhlIHJlcG9ydAogZGVmaW5lIGdlbmVyYXRlLWFwaS1tYXAtcmVwb3J0LWN0cwogCSQoaGlkZSkgbWtkaXIgLXAgJChkaXIgJEApCi0JJChoaWRlKSAkKFBSSVZBVEVfQ1RTX0FQSV9NQVBfRVhFKSAtaiA4IC1hICQoUFJJVkFURV9BUElfWE1MX0RFU0MpIC1pICQoMikgLWYgJCgzKSAtbyAkQAorCSQoaGlkZSkgJChQUklWQVRFX0NUU19BUElfTUFQX0VYRSkgLWogOCAtYSAkKHNoZWxsIGVjaG8gIiQoUFJJVkFURV9BUElfWE1MX0RFU0MpIiB8IHRyICcgJyAnLCcpIC1pICQoMikgLWYgJCgzKSAtbyAkQAogCUAgZWNobyAkKDEpOiBmaWxlOi8vJCQoY2QgJChkaXIgJEApOyBwd2QpLyQobm90ZGlyICRAKQogZW5kZWYKIApAQCAtMzAyLDIwICszMjEsMjIgQEAKIGN0c19hcGlfY292ZXJhZ2VfZGVwZW5kZW5jaWVzIDo9CiBjdHNfc3lzdGVtX2FwaV9jb3ZlcmFnZV9kZXBlbmRlbmNpZXMgOj0KIGN0c19hcGlfbWFwX2RlcGVuZGVuY2llcyA6PQotY3RzX3N5c3RlbV9hcGlfbWFwX2RlcGVuZGVuY2llcyA6PQorY3RzX3ZfaG9zdF9hcGlfbWFwX2RlcGVuZGVuY2llcyA6PQorY3RzX2NvbWJpbmVkX2FwaV9tYXBfZGVwZW5kZW5jaWVzIDo9CiBjdHMtY29tYmluZWQtY292ZXJhZ2UtcmVwb3J0IDo9CiBjdHMtY29tYmluZWQteG1sLWNvdmVyYWdlLXJlcG9ydCA6PQogY3RzLXZlcmlmaWVyLWNvdmVyYWdlLXJlcG9ydCA6PQogY3RzLXRlc3QtY292ZXJhZ2UtcmVwb3J0IDo9CiBjdHMtc3lzdGVtLWFwaS1jb3ZlcmFnZS1yZXBvcnQgOj0KIGN0cy1zeXN0ZW0tYXBpLXhtbC1jb3ZlcmFnZS1yZXBvcnQgOj0KLWN0cy1hcGkteG1sLWFwaS1tYXAtcmVwb3J0IDo9Ci1jdHMtYXBpLWh0bWwtYXBpLW1hcC1yZXBvcnQgOj0KLWN0cy1zeXN0ZW0tYXBpLXhtbC1hcGktbWFwLXJlcG9ydCA6PQotY3RzLXN5c3RlbS1hcGktaHRtbC1hcGktbWFwLXJlcG9ydCA6PQorY3RzLWFwaS1tYXAteG1sLXJlcG9ydCA6PQorY3RzLXYtaG9zdC1hcGktbWFwLXhtbC1yZXBvcnQgOj0KK2N0cy1jb21iaW5lZC1hcGktbWFwLXhtbC1yZXBvcnQgOj0KK2N0cy1jb21iaW5lZC1hcGktbWFwLWh0bWwtcmVwb3J0IDo9CiBhcGlfeG1sX2Rlc2NyaXB0aW9uIDo9CiBhcGlfdGV4dF9kZXNjcmlwdGlvbiA6PQogc3lzdGVtX2FwaV94bWxfZGVzY3JpcHRpb24gOj0KK2NvbWJpbmVkX2FwaV94bWxfZGVzY3JpcHRpb24gOj0KIG5hcGlfeG1sX2Rlc2NyaXB0aW9uIDo9CiBuYXBpX3RleHRfZGVzY3JpcHRpb24gOj0KIGNvdmVyYWdlX291dCA6PQpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9kZXZpY2UtdGVzdHMubWsgYi9jb3JlL3Rhc2tzL2RldmljZS10ZXN0cy5tawppbmRleCA1ODUwYzRlLi4wNjJhYzIzIDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL2RldmljZS10ZXN0cy5taworKysgYi9jb3JlL3Rhc2tzL2RldmljZS10ZXN0cy5tawpAQCAtMjEsMzkgKzIxLDMzIEBACiAjIENyZWF0ZSBhbiBhcnRpZmFjdCB0byBpbmNsdWRlIGFsbCB0ZXN0IGNvbmZpZyBmaWxlcyBpbiBkZXZpY2UtdGVzdHMuCiBkZXZpY2UtdGVzdHMtY29uZmlncy16aXAgOj0gJChQUk9EVUNUX09VVCkvZGV2aWNlLXRlc3RzX2NvbmZpZ3MuemlwCiBteV9ob3N0X3NoYXJlZF9saWJfZm9yX2RldmljZV90ZXN0cyA6PSAkKGNhbGwgY29weS1tYW55LWZpbGVzLCQoQ09NUEFUSUJJTElUWS5kZXZpY2UtdGVzdHMuSE9TVF9TSEFSRURfTElCUkFSWS5GSUxFUykpCi1kZXZpY2VfdGVzdHNfaG9zdF9zaGFyZWRfbGlic196aXAgOj0gJChQUk9EVUNUX09VVCkvZGV2aWNlLXRlc3RzX2hvc3Qtc2hhcmVkLWxpYnMuemlwCiAKLSQoZGV2aWNlLXRlc3RzLXppcCkgOiAuS0FUSV9JTVBMSUNJVF9PVVRQVVRTIDo9ICQoZGV2aWNlLXRlc3RzLWxpc3QtemlwKSAkKGRldmljZS10ZXN0cy1jb25maWdzLXppcCkgJChkZXZpY2VfdGVzdHNfaG9zdF9zaGFyZWRfbGlic196aXApCiskKGRldmljZS10ZXN0cy16aXApIDogLktBVElfSU1QTElDSVRfT1VUUFVUUyA6PSAkKGRldmljZS10ZXN0cy1saXN0LXppcCkgJChkZXZpY2UtdGVzdHMtY29uZmlncy16aXApCiAkKGRldmljZS10ZXN0cy16aXApIDogUFJJVkFURV9kZXZpY2VfdGVzdHNfbGlzdCA6PSAkKFBST0RVQ1RfT1VUKS9kZXZpY2UtdGVzdHNfbGlzdAogJChkZXZpY2UtdGVzdHMtemlwKSA6IFBSSVZBVEVfSE9TVF9TSEFSRURfTElCUyA6PSAkKG15X2hvc3Rfc2hhcmVkX2xpYl9mb3JfZGV2aWNlX3Rlc3RzKQotJChkZXZpY2UtdGVzdHMtemlwKSA6IFBSSVZBVEVfZGV2aWNlX2hvc3Rfc2hhcmVkX2xpYnNfemlwIDo9ICQoZGV2aWNlX3Rlc3RzX2hvc3Rfc2hhcmVkX2xpYnNfemlwKQogJChkZXZpY2UtdGVzdHMtemlwKSA6ICQoQ09NUEFUSUJJTElUWS5kZXZpY2UtdGVzdHMuRklMRVMpICQoQ09NUEFUSUJJTElUWS5kZXZpY2UtdGVzdHMuU09PTkdfSU5TVEFMTEVEX0NPTVBBVElCSUxJVFlfU1VQUE9SVF9GSUxFUykgJChteV9ob3N0X3NoYXJlZF9saWJfZm9yX2RldmljZV90ZXN0cykgJChTT09OR19aSVApCi0Jcm0gLWYgJEAtc2hhcmVkLWxpYnMubGlzdAogCWVjaG8gJChzb3J0ICQoQ09NUEFUSUJJTElUWS5kZXZpY2UtdGVzdHMuRklMRVMpICQoQ09NUEFUSUJJTElUWS5kZXZpY2UtdGVzdHMuU09PTkdfSU5TVEFMTEVEX0NPTVBBVElCSUxJVFlfU1VQUE9SVF9GSUxFUykpIHwgdHIgIiAiICJcbiIgPiAkQC5saXN0CiAJZ3JlcCAkKEhPU1RfT1VUX1RFU1RDQVNFUykgJEAubGlzdCA+ICRALWhvc3QubGlzdCB8fCB0cnVlCiAJZ3JlcCAtZSAuKlxcLmNvbmZpZyQkICRALWhvc3QubGlzdCA+ICRALWhvc3QtdGVzdC1jb25maWdzLmxpc3QgfHwgdHJ1ZQogCSQoaGlkZSkgZm9yIHNoYXJlZF9saWIgaW4gJChQUklWQVRFX0hPU1RfU0hBUkVEX0xJQlMpOyBkbyBcCiAJICBlY2hvICQkc2hhcmVkX2xpYiA+PiAkQC1ob3N0Lmxpc3Q7IFwKLQkgIGVjaG8gJCRzaGFyZWRfbGliID4+ICRALXNoYXJlZC1saWJzLmxpc3Q7IFwKIAlkb25lCi0JZ3JlcCAkKEhPU1RfT1VUX1RFU1RDQVNFUykgJEAtc2hhcmVkLWxpYnMubGlzdCA+ICRALWhvc3Qtc2hhcmVkLWxpYnMubGlzdCB8fCB0cnVlCiAJZ3JlcCAkKFRBUkdFVF9PVVRfVEVTVENBU0VTKSAkQC5saXN0ID4gJEAtdGFyZ2V0Lmxpc3QgfHwgdHJ1ZQogCWdyZXAgLWUgLipcXC5jb25maWckJCAkQC10YXJnZXQubGlzdCA+ICRALXRhcmdldC10ZXN0LWNvbmZpZ3MubGlzdCB8fCB0cnVlCiAJJChoaWRlKSAkKFNPT05HX1pJUCkgLWQgLW8gJEAgLVAgaG9zdCAtQyAkKEhPU1RfT1VUKSAtbCAkQC1ob3N0Lmxpc3QgLVAgdGFyZ2V0IC1DICQoUFJPRFVDVF9PVVQpIC1sICRALXRhcmdldC5saXN0IC1zaGEyNTYKIAkkKGhpZGUpICQoU09PTkdfWklQKSAtZCAtbyAkKGRldmljZS10ZXN0cy1jb25maWdzLXppcCkgXAogCSAgLVAgaG9zdCAtQyAkKEhPU1RfT1VUKSAtbCAkQC1ob3N0LXRlc3QtY29uZmlncy5saXN0IFwKIAkgIC1QIHRhcmdldCAtQyAkKFBST0RVQ1RfT1VUKSAtbCAkQC10YXJnZXQtdGVzdC1jb25maWdzLmxpc3QKLQkkKFNPT05HX1pJUCkgLWQgLW8gJChQUklWQVRFX2RldmljZV9ob3N0X3NoYXJlZF9saWJzX3ppcCkgXAotCSAgLVAgaG9zdCAtQyAkKEhPU1RfT1VUKSAtbCAkQC1ob3N0LXNoYXJlZC1saWJzLmxpc3QKIAlybSAtZiAkKFBSSVZBVEVfZGV2aWNlX3Rlc3RzX2xpc3QpCiAJJChoaWRlKSBncmVwIC1lIC4qXFwuY29uZmlnJCQgJEAtaG9zdC5saXN0IHwgc2VkIHMlJChIT1NUX09VVCklaG9zdCVnID4gJChQUklWQVRFX2RldmljZV90ZXN0c19saXN0KQogCSQoaGlkZSkgZ3JlcCAtZSAuKlxcLmNvbmZpZyQkICRALXRhcmdldC5saXN0IHwgc2VkIHMlJChQUk9EVUNUX09VVCkldGFyZ2V0JWcgPj4gJChQUklWQVRFX2RldmljZV90ZXN0c19saXN0KQogCSQoaGlkZSkgJChTT09OR19aSVApIC1kIC1vICQoZGV2aWNlLXRlc3RzLWxpc3QtemlwKSAtQyAkKGRpciAkQCkgLWYgJChQUklWQVRFX2RldmljZV90ZXN0c19saXN0KQogCXJtIC1mICRALmxpc3QgJEAtaG9zdC5saXN0ICRALXRhcmdldC5saXN0ICRALWhvc3QtdGVzdC1jb25maWdzLmxpc3QgJEAtdGFyZ2V0LXRlc3QtY29uZmlncy5saXN0IFwKLQkgICRALXNoYXJlZC1saWJzLmxpc3QgJEAtaG9zdC1zaGFyZWQtbGlicy5saXN0ICQoUFJJVkFURV9kZXZpY2VfdGVzdHNfbGlzdCkKKwkJJChQUklWQVRFX2RldmljZV90ZXN0c19saXN0KQogCiBkZXZpY2UtdGVzdHM6ICQoZGV2aWNlLXRlc3RzLXppcCkKLSQoY2FsbCBkaXN0LWZvci1nb2FscywgZGV2aWNlLXRlc3RzLCAkKGRldmljZS10ZXN0cy16aXApICQoZGV2aWNlLXRlc3RzLWxpc3QtemlwKSAkKGRldmljZS10ZXN0cy1jb25maWdzLXppcCkgJChkZXZpY2VfdGVzdHNfaG9zdF9zaGFyZWRfbGlic196aXApKQorCiskKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGRldmljZS10ZXN0cywgJChkZXZpY2UtdGVzdHMtemlwKSAkKGRldmljZS10ZXN0cy1saXN0LXppcCkgJChkZXZpY2UtdGVzdHMtY29uZmlncy16aXApKQogCiAkKGNhbGwgZGVjbGFyZS0xcC1jb250YWluZXIsJChkZXZpY2UtdGVzdHMtemlwKSwpCiAkKGNhbGwgZGVjbGFyZS1jb250YWluZXItbGljZW5zZS1kZXBzLCQoZGV2aWNlLXRlc3RzLXppcCksJChDT01QQVRJQklMSVRZLmRldmljZS10ZXN0cy5GSUxFUykgJChteV9ob3N0X3NoYXJlZF9saWJfZm9yX2RldmljZV90ZXN0cyksJChQUk9EVUNUX09VVCkvOi8pCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL2R0cy5tayBiL2NvcmUvdGFza3MvZHRzLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMDkwODIKLS0tIC9kZXYvbnVsbAorKysgYi9jb3JlL3Rhc2tzL2R0cy5tawpAQCAtMCwwICsxLDI4IEBACisjIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIERlc2t0b3AgdGVzdCBzdWl0ZQoraWZuZXEgKCQod2lsZGNhcmQgdGVzdC9kdHMvdG9vbHMvZHRzLXRyYWRlZmVkL1JFQURNRSksKQordGVzdF9zdWl0ZV9uYW1lIDo9IGR0cwordGVzdF9zdWl0ZV90cmFkZWZlZCA6PSBkdHMtdHJhZGVmZWQKK3Rlc3Rfc3VpdGVfcmVhZG1lIDo9IHRlc3QvZHRzL3Rvb2xzL2R0cy10cmFkZWZlZC9SRUFETUUKK3Rlc3Rfc3VpdGVfdG9vbHMgOj0gJChIT1NUX09VVF9KQVZBX0xJQlJBUklFUykvYXRzX2NvbnNvbGVfZGVwbG95LmphciBcCisgICQoSE9TVF9PVVRfSkFWQV9MSUJSQVJJRVMpL2F0c19vbGNfc2VydmVyX2xvY2FsX21vZGVfZGVwbG95LmphcgorCitpbmNsdWRlICQoQlVJTERfU1lTVEVNKS90YXNrcy90b29scy9jb21wYXRpYmlsaXR5Lm1rCisKKy5QSE9OWTogZHRzCitkdHM6ICQoY29tcGF0aWJpbGl0eV96aXApICQoY29tcGF0aWJpbGl0eV90ZXN0c19saXN0X3ppcCkKKyQoY2FsbCBkaXN0LWZvci1nb2FscywgZHRzLCAkKGNvbXBhdGliaWxpdHlfemlwKSAkKGNvbXBhdGliaWxpdHlfdGVzdHNfbGlzdF96aXApKQorZW5kaWYKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvZ2VuZXJhbC10ZXN0cy1zaGFyZWQtbGlicy5tayBiL2NvcmUvdGFza3MvZ2VuZXJhbC10ZXN0cy1zaGFyZWQtbGlicy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjQwNTE0MC4uMDAwMDAwMAotLS0gYS9jb3JlL3Rhc2tzL2dlbmVyYWwtdGVzdHMtc2hhcmVkLWxpYnMubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0uUEhPTlk6IGdlbmVyYWwtdGVzdHMtc2hhcmVkLWxpYnMKLQotaW50ZXJtZWRpYXRlc19kaXIgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsZ2VuZXJhbC10ZXN0cy1zaGFyZWQtbGlicykKLQotZ2VuZXJhbF90ZXN0c19zaGFyZWRfbGlic196aXAgOj0gJChQUk9EVUNUX09VVCkvZ2VuZXJhbC10ZXN0c19ob3N0LXNoYXJlZC1saWJzLnppcAotCi0jIEZpbHRlciBzaGFyZWQgZW50cmllcyBiZXR3ZWVuIGdlbmVyYWwtdGVzdHMgYW5kIGRldmljZS10ZXN0cydzIEhPU1RfU0hBUkVEX0xJQlJBUlkuRklMRVMsCi0jIHRvIGF2b2lkIHdhcm5pbmcgYWJvdXQgb3ZlcnJpZGluZyBjb21tYW5kcy4KLW15X2hvc3Rfc2hhcmVkX2xpYl9mb3JfZ2VuZXJhbF90ZXN0cyA6PSBcCi0gICQoZm9yZWFjaCBtLCQoZmlsdGVyICQoQ09NUEFUSUJJTElUWS5kZXZpY2UtdGVzdHMuSE9TVF9TSEFSRURfTElCUkFSWS5GSUxFUyksXAotCSAgICQoQ09NUEFUSUJJTElUWS5nZW5lcmFsLXRlc3RzLkhPU1RfU0hBUkVEX0xJQlJBUlkuRklMRVMpKSwkKGNhbGwgd29yZC1jb2xvbiwyLCQobSkpKQotbXlfZ2VuZXJhbF90ZXN0c19zaGFyZWRfbGliX2ZpbGVzIDo9IFwKLSAgJChmaWx0ZXItb3V0ICQoQ09NUEFUSUJJTElUWS5kZXZpY2UtdGVzdHMuSE9TVF9TSEFSRURfTElCUkFSWS5GSUxFUyksXAotCSAkKENPTVBBVElCSUxJVFkuZ2VuZXJhbC10ZXN0cy5IT1NUX1NIQVJFRF9MSUJSQVJZLkZJTEVTKSkKLQotbXlfaG9zdF9zaGFyZWRfbGliX2Zvcl9nZW5lcmFsX3Rlc3RzICs9ICQoY2FsbCBjb3B5LW1hbnktZmlsZXMsJChteV9nZW5lcmFsX3Rlc3RzX3NoYXJlZF9saWJfZmlsZXMpKQotCi0kKGdlbmVyYWxfdGVzdHNfc2hhcmVkX2xpYnNfemlwKSA6IFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIgOj0gJChpbnRlcm1lZGlhdGVzX2RpcikKLSQoZ2VuZXJhbF90ZXN0c19zaGFyZWRfbGlic196aXApIDogUFJJVkFURV9IT1NUX1NIQVJFRF9MSUJTIDo9ICQobXlfaG9zdF9zaGFyZWRfbGliX2Zvcl9nZW5lcmFsX3Rlc3RzKQotJChnZW5lcmFsX3Rlc3RzX3NoYXJlZF9saWJzX3ppcCkgOiBQUklWQVRFX2dlbmVyYWxfaG9zdF9zaGFyZWRfbGlic196aXAgOj0gJChnZW5lcmFsX3Rlc3RzX3NoYXJlZF9saWJzX3ppcCkKLSQoZ2VuZXJhbF90ZXN0c19zaGFyZWRfbGlic196aXApIDogJChteV9ob3N0X3NoYXJlZF9saWJfZm9yX2dlbmVyYWxfdGVzdHMpICQoU09PTkdfWklQKQotCXJtIC1yZiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpCi0JbWtkaXIgLXAgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKSAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL3Rvb2xzCi0JJChoaWRlKSBmb3Igc2hhcmVkX2xpYiBpbiAkKFBSSVZBVEVfSE9TVF9TSEFSRURfTElCUyk7IGRvIFwKLQkgIGVjaG8gJCRzaGFyZWRfbGliID4+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvc2hhcmVkLWxpYnMubGlzdDsgXAotCWRvbmUKLQlncmVwICQoSE9TVF9PVVRfVEVTVENBU0VTKSAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL3NoYXJlZC1saWJzLmxpc3QgPiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2hvc3Qtc2hhcmVkLWxpYnMubGlzdCB8fCB0cnVlCi0JJChTT09OR19aSVApIC1kIC1vICQoUFJJVkFURV9nZW5lcmFsX2hvc3Rfc2hhcmVkX2xpYnNfemlwKSBcCi0JICAtUCBob3N0IC1DICQoSE9TVF9PVVQpIC1sICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvaG9zdC1zaGFyZWQtbGlicy5saXN0Ci0KLWdlbmVyYWwtdGVzdHMtc2hhcmVkLWxpYnM6ICQoZ2VuZXJhbF90ZXN0c19zaGFyZWRfbGlic196aXApCi0kKGNhbGwgZGlzdC1mb3ItZ29hbHMsIGdlbmVyYWwtdGVzdHMtc2hhcmVkLWxpYnMsICQoZ2VuZXJhbF90ZXN0c19zaGFyZWRfbGlic196aXApKQotCi0kKGNhbGwgZGVjbGFyZS0xcC1jb250YWluZXIsJChnZW5lcmFsX3Rlc3RzX3NoYXJlZF9saWJzX3ppcCksKQotJChjYWxsIGRlY2xhcmUtY29udGFpbmVyLWxpY2Vuc2UtZGVwcywkKGdlbmVyYWxfdGVzdHNfc2hhcmVkX2xpYnNfemlwKSwkKG15X2hvc3Rfc2hhcmVkX2xpYl9mb3JfZ2VuZXJhbF90ZXN0cyksJChQUk9EVUNUX09VVCkvOi8pCi0KLWludGVybWVkaWF0ZXNfZGlyIDo9Ci1nZW5lcmFsX3Rlc3RzX3NoYXJlZF9saWJzX3ppcCA6PQpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9nZW5lcmFsLXRlc3RzLm1rIGIvY29yZS90YXNrcy9nZW5lcmFsLXRlc3RzLm1rCmluZGV4IGQ2ZmMwNzIuLmRjZmNmYWQgMTAwNjQ0Ci0tLSBhL2NvcmUvdGFza3MvZ2VuZXJhbC10ZXN0cy5taworKysgYi9jb3JlL3Rhc2tzL2dlbmVyYWwtdGVzdHMubWsKQEAgLTI3LDMyICsyNyw2MSBAQAogIyBDcmVhdGUgYW4gYXJ0aWZhY3QgdG8gaW5jbHVkZSBhbGwgdGVzdCBjb25maWcgZmlsZXMgaW4gZ2VuZXJhbC10ZXN0cy4KIGdlbmVyYWxfdGVzdHNfY29uZmlnc196aXAgOj0gJChQUk9EVUNUX09VVCkvZ2VuZXJhbC10ZXN0c19jb25maWdzLnppcAogCi0jIENvcHkga2VybmVsIHRlc3QgbW9kdWxlcyB0byB0ZXN0Y2FzZXMgZGlyZWN0b3JpZXMKLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL3Rhc2tzL3Rvb2xzL3Z0cy1rZXJuZWwtdGVzdHMubWsKLWx0cF9jb3B5X3BhaXJzIDo9IFwKLSAgJChjYWxsIHRhcmdldC1uYXRpdmUtY29weS1wYWlycywkKGtlcm5lbF9sdHBfbW9kdWxlcyksJChrZXJuZWxfbHRwX2hvc3Rfb3V0KSkKLWNvcHlfbHRwX3Rlc3RzIDo9ICQoY2FsbCBjb3B5LW1hbnktZmlsZXMsJChsdHBfY29weV9wYWlycykpCisjIEZpbHRlciBzaGFyZWQgZW50cmllcyBiZXR3ZWVuIGdlbmVyYWwtdGVzdHMgYW5kIGRldmljZS10ZXN0cydzIEhPU1RfU0hBUkVEX0xJQlJBUlkuRklMRVMsCisjIHRvIGF2b2lkIHdhcm5pbmcgYWJvdXQgb3ZlcnJpZGluZyBjb21tYW5kcy4KK215X2hvc3Rfc2hhcmVkX2xpYl9mb3JfZ2VuZXJhbF90ZXN0cyA6PSBcCisgICQoZm9yZWFjaCBtLCQoZmlsdGVyICQoQ09NUEFUSUJJTElUWS5kZXZpY2UtdGVzdHMuSE9TVF9TSEFSRURfTElCUkFSWS5GSUxFUyksXAorCSAgICQoQ09NUEFUSUJJTElUWS5nZW5lcmFsLXRlc3RzLkhPU1RfU0hBUkVEX0xJQlJBUlkuRklMRVMpKSwkKGNhbGwgd29yZC1jb2xvbiwyLCQobSkpKQorbXlfZ2VuZXJhbF90ZXN0c19zaGFyZWRfbGliX2ZpbGVzIDo9IFwKKyAgJChmaWx0ZXItb3V0ICQoQ09NUEFUSUJJTElUWS5kZXZpY2UtdGVzdHMuSE9TVF9TSEFSRURfTElCUkFSWS5GSUxFUyksXAorCSAkKENPTVBBVElCSUxJVFkuZ2VuZXJhbC10ZXN0cy5IT1NUX1NIQVJFRF9MSUJSQVJZLkZJTEVTKSkKIAotIyBQSE9OWSB0YXJnZXQgdG8gYmUgdXNlZCB0byBidWlsZCBhbmQgdGVzdCBgdnRzX2x0cF90ZXN0c2Agd2l0aG91dCBidWlsZGluZyBmdWxsIHZ0cwotLlBIT05ZOiB2dHNfa2VybmVsX2x0cF90ZXN0cwotdnRzX2tlcm5lbF9sdHBfdGVzdHM6ICQoY29weV9sdHBfdGVzdHMpCitteV9ob3N0X3NoYXJlZF9saWJfZm9yX2dlbmVyYWxfdGVzdHMgKz0gJChjYWxsIGNvcHktbWFueS1maWxlcywkKG15X2dlbmVyYWxfdGVzdHNfc2hhcmVkX2xpYl9maWxlcykpCiAKLWdlbmVyYWxfdGVzdHNfc2hhcmVkX2xpYnNfemlwIDo9ICQoUFJPRFVDVF9PVVQpL2dlbmVyYWwtdGVzdHNfaG9zdC1zaGFyZWQtbGlicy56aXAKK215X2hvc3Rfc2hhcmVkX2xpYl9zeW1saW5rcyA6PSBcCisgICAgJChmaWx0ZXIgJChDT01QQVRJQklMSVRZLmhvc3QtdW5pdC10ZXN0cy5TWU1MSU5LUyksXAorCSQoQ09NUEFUSUJJTElUWS5nZW5lcmFsLXRlc3RzLlNZTUxJTktTKSkKIAotJChnZW5lcmFsX3Rlc3RzX3ppcCkgOiAkKGdlbmVyYWxfdGVzdHNfc2hhcmVkX2xpYnNfemlwKQotJChnZW5lcmFsX3Rlc3RzX3ppcCkgOiAkKGNvcHlfbHRwX3Rlc3RzKQotJChnZW5lcmFsX3Rlc3RzX3ppcCkgOiBQUklWQVRFX0tFUk5FTF9MVFBfSE9TVF9PVVQgOj0gJChrZXJuZWxfbHRwX2hvc3Rfb3V0KQorbXlfZ2VuZXJhbF90ZXN0c19zeW1saW5rcyA6PSBcCisgICAgJChmaWx0ZXItb3V0ICQoQ09NUEFUSUJJTElUWS5jYW1lcmEtaGFsLXRlc3RzLlNZTUxJTktTKSxcCisgICAgJChmaWx0ZXItb3V0ICQoQ09NUEFUSUJJTElUWS5ob3N0LXVuaXQtdGVzdHMuU1lNTElOS1MpLFwKKwkgJChDT01QQVRJQklMSVRZLmdlbmVyYWwtdGVzdHMuU1lNTElOS1MpKSkKKworbXlfc3ltbGlua3NfZm9yX2dlbmVyYWxfdGVzdHMgOj0gJChmb3JlYWNoIGYsJChteV9nZW5lcmFsX3Rlc3RzX3N5bWxpbmtzKSxcCisJJChzdHJpcCAkKGV2YWwgX2NtZl90dXBsZSA6PSAkKHN1YnN0IDosICwkKGYpKSkgXAorCSQoZXZhbCBfY21mX2RlcCA6PSAkKHdvcmQgMSwkKF9jbWZfdHVwbGUpKSkgXAorCSQoZXZhbCBfY21mX3NyYyA6PSAkKHdvcmQgMiwkKF9jbWZfdHVwbGUpKSkgXAorCSQoZXZhbCBfY21mX2Rlc3QgOj0gJCh3b3JkIDMsJChfY21mX3R1cGxlKSkpIFwKKwkkKGNhbGwgc3ltbGluay1maWxlLCQoX2NtZl9kZXApLCQoX2NtZl9zcmMpLCQoX2NtZl9kZXN0KSkgXAorCSQoX2NtZl9kZXN0KSkpCisKKyMgSW4gdGhpcyBvbmUgZGlyZWN0bHkgdGFrZSB0aGUgb3ZlcmxhcCBpbnRvIHRoZSB6aXAgc2luY2Ugd2UgY2FuJ3QgcmV3cml0ZSBydWxlcworbXlfc3ltbGlua3NfZm9yX2dlbmVyYWxfdGVzdHMgKz0gJChmb3JlYWNoIGYsJChteV9ob3N0X3NoYXJlZF9saWJfc3ltbGlua3MpLFwKKyAgICAgICAgJChzdHJpcCAkKGV2YWwgX2NtZl90dXBsZSA6PSAkKHN1YnN0IDosICwkKGYpKSkgXAorICAgICAgICAkKGV2YWwgX2NtZl9kZXAgOj0gJCh3b3JkIDEsJChfY21mX3R1cGxlKSkpIFwKKyAgICAgICAgJChldmFsIF9jbWZfc3JjIDo9ICQod29yZCAyLCQoX2NtZl90dXBsZSkpKSBcCisgICAgICAgICQoZXZhbCBfY21mX2Rlc3QgOj0gJCh3b3JkIDMsJChfY21mX3R1cGxlKSkpIFwKKyAgICAgICAgJChfY21mX2Rlc3QpKSkKKwogJChnZW5lcmFsX3Rlc3RzX3ppcCkgOiBQUklWQVRFX2dlbmVyYWxfdGVzdHNfbGlzdF96aXAgOj0gJChnZW5lcmFsX3Rlc3RzX2xpc3RfemlwKQogJChnZW5lcmFsX3Rlc3RzX3ppcCkgOiAuS0FUSV9JTVBMSUNJVF9PVVRQVVRTIDo9ICQoZ2VuZXJhbF90ZXN0c19saXN0X3ppcCkgJChnZW5lcmFsX3Rlc3RzX2NvbmZpZ3NfemlwKQogJChnZW5lcmFsX3Rlc3RzX3ppcCkgOiBQUklWQVRFX1RPT0xTIDo9ICQoZ2VuZXJhbF90ZXN0c190b29scykKICQoZ2VuZXJhbF90ZXN0c196aXApIDogUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUiA6PSAkKGludGVybWVkaWF0ZXNfZGlyKQorJChnZW5lcmFsX3Rlc3RzX3ppcCkgOiBQUklWQVRFX0hPU1RfU0hBUkVEX0xJQlMgOj0gJChteV9ob3N0X3NoYXJlZF9saWJfZm9yX2dlbmVyYWxfdGVzdHMpCiskKGdlbmVyYWxfdGVzdHNfemlwKSA6IFBSSVZBVEVfU1lNTElOS1MgOj0gJChteV9zeW1saW5rc19mb3JfZ2VuZXJhbF90ZXN0cykKICQoZ2VuZXJhbF90ZXN0c196aXApIDogUFJJVkFURV9nZW5lcmFsX3Rlc3RzX2NvbmZpZ3NfemlwIDo9ICQoZ2VuZXJhbF90ZXN0c19jb25maWdzX3ppcCkKLSQoZ2VuZXJhbF90ZXN0c196aXApIDogJChDT01QQVRJQklMSVRZLmdlbmVyYWwtdGVzdHMuRklMRVMpICQoQ09NUEFUSUJJTElUWS5nZW5lcmFsLXRlc3RzLlNPT05HX0lOU1RBTExFRF9DT01QQVRJQklMSVRZX1NVUFBPUlRfRklMRVMpICQoZ2VuZXJhbF90ZXN0c190b29scykgJChTT09OR19aSVApCiskKGdlbmVyYWxfdGVzdHNfemlwKSA6ICQoQ09NUEFUSUJJTElUWS5nZW5lcmFsLXRlc3RzLkZJTEVTKSAkKG15X2hvc3Rfc2hhcmVkX2xpYl9mb3JfZ2VuZXJhbF90ZXN0cykgJChDT01QQVRJQklMSVRZLmdlbmVyYWwtdGVzdHMuU09PTkdfSU5TVEFMTEVEX0NPTVBBVElCSUxJVFlfU1VQUE9SVF9GSUxFUykgJChnZW5lcmFsX3Rlc3RzX3Rvb2xzKSAkKG15X3N5bWxpbmtzX2Zvcl9nZW5lcmFsX3Rlc3RzKSAkKFNPT05HX1pJUCkKIAlybSAtcmYgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKQogCXJtIC1mICRAICQoUFJJVkFURV9nZW5lcmFsX3Rlc3RzX2xpc3RfemlwKQogCW1rZGlyIC1wICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS90b29scwogCWVjaG8gJChzb3J0ICQoQ09NUEFUSUJJTElUWS5nZW5lcmFsLXRlc3RzLkZJTEVTKSAkKENPTVBBVElCSUxJVFkuZ2VuZXJhbC10ZXN0cy5TT09OR19JTlNUQUxMRURfQ09NUEFUSUJJTElUWV9TVVBQT1JUX0ZJTEVTKSkgfCB0ciAiICIgIlxuIiA+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvbGlzdAotCWZpbmQgJChQUklWQVRFX0tFUk5FTF9MVFBfSE9TVF9PVVQpID4+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvbGlzdAorCWZvciBzeW1saW5rIGluICQoUFJJVkFURV9TWU1MSU5LUyk7IGRvIFwKKwkgIGVjaG8gJCRzeW1saW5rID4+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvbGlzdDsgXAorCWRvbmUKKwkkKGhpZGUpIGZvciBzaGFyZWRfbGliIGluICQoUFJJVkFURV9IT1NUX1NIQVJFRF9MSUJTKTsgZG8gXAorCSAgZWNobyAkJHNoYXJlZF9saWIgPj4gJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS9zaGFyZWQtbGlicy5saXN0OyBcCisJZG9uZQorCWdyZXAgJChIT1NUX09VVF9URVNUQ0FTRVMpICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvc2hhcmVkLWxpYnMubGlzdCA+ICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvaG9zdC1zaGFyZWQtbGlicy5saXN0IHx8IHRydWUKIAlncmVwICQoSE9TVF9PVVRfVEVTVENBU0VTKSAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2xpc3QgPiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2hvc3QubGlzdCB8fCB0cnVlCiAJZ3JlcCAkKFRBUkdFVF9PVVRfVEVTVENBU0VTKSAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2xpc3QgPiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL3RhcmdldC5saXN0IHx8IHRydWUKIAlncmVwIC1lIC4qXFwuY29uZmlnJCQgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS9ob3N0Lmxpc3QgPiAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2hvc3QtdGVzdC1jb25maWdzLmxpc3QgfHwgdHJ1ZQpAQCAtNjIsNiArOTEsNyBAQAogCSAgLVAgaG9zdCAtQyAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpIC1EICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvdG9vbHMgXAogCSAgLVAgaG9zdCAtQyAkKEhPU1RfT1VUKSAtbCAkKFBSSVZBVEVfSU5URVJNRURJQVRFU19ESVIpL2hvc3QubGlzdCBcCiAJICAtUCB0YXJnZXQgLUMgJChQUk9EVUNUX09VVCkgLWwgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS90YXJnZXQubGlzdCBcCisJICAtUCBob3N0IC1DICQoSE9TVF9PVVQpIC1sICQoUFJJVkFURV9JTlRFUk1FRElBVEVTX0RJUikvaG9zdC1zaGFyZWQtbGlicy5saXN0IFwKIAkgIC1zaGEyNTYKIAkkKFNPT05HX1pJUCkgLWQgLW8gJChQUklWQVRFX2dlbmVyYWxfdGVzdHNfY29uZmlnc196aXApIFwKIAkgIC1QIGhvc3QgLUMgJChIT1NUX09VVCkgLWwgJChQUklWQVRFX0lOVEVSTUVESUFURVNfRElSKS9ob3N0LXRlc3QtY29uZmlncy5saXN0IFwKQEAgLTgyLDMgKzExMiw4IEBACiBnZW5lcmFsX3Rlc3RzX2xpc3RfemlwIDo9CiBnZW5lcmFsX3Rlc3RzX2NvbmZpZ3NfemlwIDo9CiBnZW5lcmFsX3Rlc3RzX3NoYXJlZF9saWJzX3ppcCA6PQorbXlfaG9zdF9zaGFyZWRfbGliX2Zvcl9nZW5lcmFsX3Rlc3RzIDo9CitteV9zeW1saW5rc19mb3JfZ2VuZXJhbF90ZXN0cyA6PQorbXlfZ2VuZXJhbF90ZXN0c19zaGFyZWRfbGliX2ZpbGVzIDo9CitteV9nZW5lcmFsX3Rlc3RzX3N5bWxpbmtzIDo9CitteV9ob3N0X3NoYXJlZF9saWJfc3ltbGlua3MgOj0KZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvbWN0cy5tayBiL2NvcmUvdGFza3MvbWN0cy5tawppbmRleCAwOWE0MTkxLi4wMmU5MTZhIDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL21jdHMubWsKKysrIGIvY29yZS90YXNrcy9tY3RzLm1rCkBAIC0xNSw3ICsxNSw4IEBACiBpZm5lcSAoJCh3aWxkY2FyZCB0ZXN0L210cy9SRUFETUUubWQpLCkKIAogbWN0c190ZXN0X3N1aXRlcyA6PQotbWN0c190ZXN0X3N1aXRlcyArPSBtY3RzCittY3RzX2FsbF90ZXN0X3N1aXRlcyA6PQorbWN0c19hbGxfdGVzdF9zdWl0ZXMgKz0gbWN0cwogCiAkKGZvcmVhY2ggbW9kdWxlLCAkKG10c19tb2R1bGVzKSwgJChldmFsIG1jdHNfdGVzdF9zdWl0ZXMgKz0gbWN0cy0kKG1vZHVsZSkpKQogCkBAIC0yOSw0ICszMCwxNCBAQAogCSQoZXZhbCAkKGNhbGwgZGlzdC1mb3ItZ29hbHMsICQoc3VpdGUpLCAkKGNvbXBhdGliaWxpdHlfemlwKSkpIFwKICkKIAorJChmb3JlYWNoIHN1aXRlLCAkKG1jdHNfYWxsX3Rlc3Rfc3VpdGVzKSwgXAorCSQoZXZhbCB0ZXN0X3N1aXRlX25hbWUgOj0gJChzdWl0ZSkpIFwKKwkkKGV2YWwgdGVzdF9zdWl0ZV90cmFkZWZlZCA6PSBtY3RzLXRyYWRlZmVkKSBcCisJJChldmFsIHRlc3Rfc3VpdGVfcmVhZG1lIDo9IHRlc3QvbXRzL1JFQURNRS5tZCkgXAorCSQoZXZhbCBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS90YXNrcy90b29scy9jb21wYXRpYmlsaXR5Lm1rKSBcCisJJChldmFsIC5QSE9OWTogJChzdWl0ZSkpIFwKKwkkKGV2YWwgJChzdWl0ZSk6ICQoY29tcGF0aWJpbGl0eV96aXApKSBcCisJJChldmFsICQoY2FsbCBkaXN0LWZvci1nb2FscywgJChzdWl0ZSksICQoY29tcGF0aWJpbGl0eV96aXApKSkgXAorKQorCiBlbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9tb2R1bGUtaW5mby5tayBiL2NvcmUvdGFza3MvbW9kdWxlLWluZm8ubWsKaW5kZXggMGNhMjdkOC4uZGQwMWY5NiAxMDA2NDQKLS0tIGEvY29yZS90YXNrcy9tb2R1bGUtaW5mby5taworKysgYi9jb3JlL3Rhc2tzL21vZHVsZS1pbmZvLm1rCkBAIC01MCw2ICs1MCw4IEBACiAJCQkkKGNhbGwgd3JpdGUtb3B0aW9uYWwtanNvbi1saXN0LCAiaG9zdF9kZXBlbmRlbmNpZXMiLCAkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLkhPU1RfUkVRVUlSRURfRlJPTV9UQVJHRVQpKSkgXAogCQkJJChjYWxsIHdyaXRlLW9wdGlvbmFsLWpzb24tbGlzdCwgInRhcmdldF9kZXBlbmRlbmNpZXMiLCAkKHNvcnQgJChBTExfTU9EVUxFUy4kKG0pLlRBUkdFVF9SRVFVSVJFRF9GUk9NX0hPU1QpKSkgXAogCQkJJChjYWxsIHdyaXRlLW9wdGlvbmFsLWpzb24tYm9vbCwgInRlc3RfbW9kdWxlX2NvbmZpZ19iYXNlIiwgJChBTExfTU9EVUxFUy4kKG0pLlRFU1RfTU9EVUxFX0NPTkZJR19CQVNFKSkgXAorCQkJJChjYWxsIHdyaXRlLW9wdGlvbmFsLWpzb24tYm9vbCwgIm1ha2UiLCAkKGlmICQoQUxMX01PRFVMRVMuJChtKS5JU19TT09OR19NT0RVTEUpLCx0cnVlKSkgXAorCQkJJChjYWxsIHdyaXRlLW9wdGlvbmFsLWpzb24tYm9vbCwgIm1ha2VfZ2VuZXJhdGVkX21vZHVsZV9pbmZvIiwgdHJ1ZSkgXAogCQknfScpJ1xufVxuJyA+PiAkQC50bXAKIAkkKFBSSVZBVEVfTUVSR0VfSlNPTl9PQkpFQ1RTKSAtbyAkQCAkKFBSSVZBVEVfU09PTkdfTU9EVUxFX0lORk8pICRALnRtcAogCXJtICRALnRtcApkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy9wcmVidWlsdF90cmFkZWZlZC5tayBiL2NvcmUvdGFza3MvcHJlYnVpbHRfdHJhZGVmZWQubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZjNTdkNQotLS0gL2Rldi9udWxsCisrKyBiL2NvcmUvdGFza3MvcHJlYnVpbHRfdHJhZGVmZWQubWsKQEAgLTAsMCArMSwyMiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaWZlcSAoLCQod2lsZGNhcmQgdG9vbHMvdHJhZGVmZWRlcmF0aW9uL2NvcmUpKQorLlBIT05ZOiB0cmFkZWZlZC1jb3JlCit0cmFkZWZlZC1jb3JlOiB0cmFkZWZlZCBhdGVzdF90cmFkZWZlZC5zaAorLlBIT05ZOiB0cmFkZWZlZC1hbGwKK3RyYWRlZmVkLWFsbDogdHJhZGVmZWQgYXRlc3RfdHJhZGVmZWQuc2gKKworJChjYWxsIGRpc3QtZm9yLWdvYWxzLCB0cmFkZWZlZCwgJChIT1NUX09VVCkvZXRjL3RyYWRlZmVkLnppcCkKK2VuZGlmCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL3N0cy1zZGsubWsgYi9jb3JlL3Rhc2tzL3N0cy1zZGsubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYmJjMjkuLjAwMDAwMDAKLS0tIGEvY29yZS90YXNrcy9zdHMtc2RrLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotIyBDb3B5cmlnaHQgKEMpIDIwMjIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotaWZuZXEgKCQod2lsZGNhcmQgdGVzdC9zdHMvUkVBRE1FLXN0cy1zZGsubWQpLCkKLXRlc3Rfc3VpdGVfbmFtZSA6PSBzdHMtc2RrCi10ZXN0X3N1aXRlX3RyYWRlZmVkIDo9IHN0cy10cmFkZWZlZAotdGVzdF9zdWl0ZV9yZWFkbWUgOj0gdGVzdC9zdHMvUkVBRE1FLXN0cy1zZGsubWQKLXN0c19zZGtfemlwIDo9ICQoSE9TVF9PVVQpLyQodGVzdF9zdWl0ZV9uYW1lKS9zdHMtc2RrLnppcAotCi1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS90YXNrcy90b29scy9jb21wYXRpYmlsaXR5Lm1rCi0KLXN0c19zZGtfcGx1Z2luX3NrZWwgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixFVEMsc3RzLXNkay1wbHVnaW4tc2tlbC56aXApL3N0cy1zZGstcGx1Z2luLXNrZWwuemlwCi0KLSQoc3RzX3Nka196aXApOiBTVFNfU0RLX1pJUCA6PSAkKGNvbXBhdGliaWxpdHlfemlwKQotJChzdHNfc2RrX3ppcCk6IFNUU19TREtfUExVR0lOX1NLRUwgOj0gJChzdHNfc2RrX3BsdWdpbl9za2VsKQotJChzdHNfc2RrX3ppcCk6ICQoTUVSR0VfWklQUykgJChaSVAyWklQKSAkKGNvbXBhdGliaWxpdHlfemlwKSAkKHN0c19zZGtfcGx1Z2luX3NrZWwpCi0Jcm0gLWYgJEAgJChTVFNfU0RLX1pJUClfZmlsdGVyZWQKLQkkKFpJUDJaSVApIC1pICQoU1RTX1NES19aSVApIC1vICQoU1RTX1NES19aSVApX2ZpbHRlcmVkIFwKLQkJLXggYW5kcm9pZC1zdHMtc2RrL3Rvb2xzL3N0cy10cmFkZWZlZC10ZXN0cy5qYXIgXAotCQknYW5kcm9pZC1zdHMtc2RrL3Rvb2xzLyo6c3RzLXNkay9zcmMvbWFpbi9yZXNvdXJjZXMvc3RzLXRyYWRlZmVkLXRvb2xzLycKLQkkKE1FUkdFX1pJUFMpICRAICQoU1RTX1NES19aSVApX2ZpbHRlcmVkICQoU1RTX1NES19QTFVHSU5fU0tFTCkKLQlybSAtZiAkKFNUU19TREtfWklQKV9maWx0ZXJlZAotCi0uUEhPTlk6IHN0cy1zZGsKLXN0cy1zZGs6ICQoc3RzX3Nka196aXApCi0kKGNhbGwgZGlzdC1mb3ItZ29hbHMsIHN0cy1zZGssICQoc3RzX3Nka196aXApKQotCi1lbmRpZgpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy90ZXN0X21hcHBpbmcubWsgYi9jb3JlL3Rhc2tzL3Rlc3RfbWFwcGluZy5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIyYTU4NS4uMDAwMDAwMAotLS0gYS9jb3JlL3Rhc2tzL3Rlc3RfbWFwcGluZy5taworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgQ3JlYXRlIGFuIGFydGlmYWN0IHRvIGluY2x1ZGUgVEVTVF9NQVBQSU5HIGZpbGVzIGluIHNvdXJjZSB0cmVlLiBBbHNvIGluY2x1ZGUKLSMgYSBmaWxlIChvdXQvZGlzYWJsZWQtcHJlc3VibWl0LXRlc3RzKSBjb250YWluaW5nIHRoZSB0ZXN0cyB0aGF0IHNob3VsZCBiZQotIyBza2lwcGVkIGluIHByZXN1Ym1pdCBjaGVjay4KLQotLlBIT05ZOiB0ZXN0X21hcHBpbmcKLQotaW50ZXJtZWRpYXRlcyA6PSAkKGNhbGwgaW50ZXJtZWRpYXRlcy1kaXItZm9yLFBBQ0tBR0lORyx0ZXN0X21hcHBpbmcpCi10ZXN0X21hcHBpbmdzX3ppcCA6PSAkKGludGVybWVkaWF0ZXMpL3Rlc3RfbWFwcGluZ3MuemlwCi10ZXN0X21hcHBpbmdfbGlzdCA6PSAkKE9VVF9ESVIpLy5tb2R1bGVfcGF0aHMvVEVTVF9NQVBQSU5HLmxpc3QKLSQodGVzdF9tYXBwaW5nc196aXApIDogUFJJVkFURV9hbGxfZGlzYWJsZWRfcHJlc3VibWl0X3Rlc3RzIDo9ICQoQUxMX0RJU0FCTEVEX1BSRVNVQk1JVF9URVNUUykKLSQodGVzdF9tYXBwaW5nc196aXApIDogUFJJVkFURV90ZXN0X21hcHBpbmdfbGlzdCA6PSAkKHRlc3RfbWFwcGluZ19saXN0KQotCi0kKHRlc3RfbWFwcGluZ3NfemlwKSA6IC5LQVRJX0RFUEZJTEUgOj0gJCh0ZXN0X21hcHBpbmdzX3ppcCkuZAotJCh0ZXN0X21hcHBpbmdzX3ppcCkgOiAkKHRlc3RfbWFwcGluZ19saXN0KSAkKFNPT05HX1pJUCkKLQlAZWNobyAiQnVpbGRpbmcgYXJ0aWZhY3QgdG8gaW5jbHVkZSBURVNUX01BUFBJTkcgZmlsZXMgYW5kIHRlc3RzIHRvIHNraXAgaW4gcHJlc3VibWl0IGNoZWNrLiIKLQlybSAtcmYgJEAgJChkaXIgJEApL2Rpc2FibGVkLXByZXN1Ym1pdC10ZXN0cwotCWVjaG8gJChzb3J0ICQoUFJJVkFURV9hbGxfZGlzYWJsZWRfcHJlc3VibWl0X3Rlc3RzKSkgfCB0ciAiICIgIlxuIiA+ICQoZGlyICRAKS9kaXNhYmxlZC1wcmVzdWJtaXQtdGVzdHMKLQkkKFNPT05HX1pJUCkgLW8gJEAgLUMgLiAtbCAkKFBSSVZBVEVfdGVzdF9tYXBwaW5nX2xpc3QpIC1DICQoZGlyICRAKSAtZiAkKGRpciAkQCkvZGlzYWJsZWQtcHJlc3VibWl0LXRlc3RzCi0JZWNobyAiJEAgOiAiICQkKGNhdCAkKFBSSVZBVEVfdGVzdF9tYXBwaW5nX2xpc3QpKSA+ICRALmQKLQlybSAtZiAkKGRpciAkQCkvZGlzYWJsZWQtcHJlc3VibWl0LXRlc3RzCi0KLXRlc3RfbWFwcGluZyA6ICQodGVzdF9tYXBwaW5nc196aXApCi0KLSQoY2FsbCBkaXN0LWZvci1nb2FscywgZGlzdF9maWxlcyB0ZXN0X21hcHBpbmcsJCh0ZXN0X21hcHBpbmdzX3ppcCkpCi0KLSQoY2FsbCBkZWNsYXJlLTFwLXRhcmdldCwkKHRlc3RfbWFwcGluZ3NfemlwKSwpCmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL3Rvb2xzL2NvbXBhdGliaWxpdHkubWsgYi9jb3JlL3Rhc2tzL3Rvb2xzL2NvbXBhdGliaWxpdHkubWsKaW5kZXggOTE4OWMyZC4uZjIwNWNlYSAxMDA2NDQKLS0tIGEvY29yZS90YXNrcy90b29scy9jb21wYXRpYmlsaXR5Lm1rCisrKyBiL2NvcmUvdGFza3MvdG9vbHMvY29tcGF0aWJpbGl0eS5tawpAQCAtMjcsNyArMjcsNiBAQAogIyAgIGNvbXBhdGliaWxpdHlfemlwOiB0aGUgcGF0aCB0byB0aGUgb3V0cHV0IHppcCBmaWxlLgogCiBzcGVjaWFsX210c190ZXN0X3N1aXRlcyA6PQotc3BlY2lhbF9tdHNfdGVzdF9zdWl0ZXMgKz0gbWN0cwogc3BlY2lhbF9tdHNfdGVzdF9zdWl0ZXMgKz0gJChtdHNfbW9kdWxlcykKIGlmbmVxICgkKGZpbHRlciAkKHNwZWNpYWxfbXRzX3Rlc3Rfc3VpdGVzKSwkKHBhdHN1YnN0IG1jdHMtJSwlLCQodGVzdF9zdWl0ZV9uYW1lKSkpLCkKIAl0ZXN0X3N1aXRlX3N1YmRpciA6PSBhbmRyb2lkLW10cwpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy90b29scy92dHMta2VybmVsLXRlc3RzLm1rIGIvY29yZS90YXNrcy90b29scy92dHMta2VybmVsLXRlc3RzLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzI3ZGMxLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGFza3MvdG9vbHMvdnRzLWtlcm5lbC10ZXN0cy5taworKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDIyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLS1pbmNsdWRlIGV4dGVybmFsL2x0cC9hbmRyb2lkL2x0cF9wYWNrYWdlX2xpc3QubWsKLQotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvdGFza3MvdG9vbHMvdnRzX3BhY2thZ2VfdXRpbHMubWsKLQotIyBDb3B5IGtlcm5lbCB0ZXN0IG1vZHVsZXMgdG8gdGVzdGNhc2VzIGRpcmVjdG9yaWVzCi1rZXJuZWxfbHRwX2hvc3Rfb3V0IDo9ICQoSE9TVF9PVVRfVEVTVENBU0VTKS92dHNfa2VybmVsX2x0cF90ZXN0cwota2VybmVsX2x0cF92dHNfb3V0IDo9ICQoSE9TVF9PVVQpLyQodGVzdF9zdWl0ZV9uYW1lKS9hbmRyb2lkLSQodGVzdF9zdWl0ZV9uYW1lKS90ZXN0Y2FzZXMvdnRzX2tlcm5lbF9sdHBfdGVzdHMKLWtlcm5lbF9sdHBfbW9kdWxlcyA6PSBcCi0gICAgbHRwIFwKLSAgICAkKGx0cF9wYWNrYWdlcykKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvdG9vbHMvdnRzX3BhY2thZ2VfdXRpbHMubWsgYi9jb3JlL3Rhc2tzL3Rvb2xzL3Z0c19wYWNrYWdlX3V0aWxzLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTgxOWYyLi4wMDAwMDAwCi0tLSBhL2NvcmUvdGFza3MvdG9vbHMvdnRzX3BhY2thZ2VfdXRpbHMubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzNCArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jICQoMSk6IExpc3Qgb2YgdGFyZ2V0IG5hdGl2ZSBmaWxlcyB0byBjb3B5LgotIyAkKDIpOiBDb3B5IGRlc3RpbmF0aW9uIGRpcmVjdG9yeS4KLSMgRXZhbHVhdGVzIHRvIGEgbGlzdCBvZiAiOiItc2VwYXJhdGVkIHBhaXJzIHNyYzpkc3QuCi1kZWZpbmUgdGFyZ2V0LW5hdGl2ZS1jb3B5LXBhaXJzCi0kKGZvcmVhY2ggbSwkKDEpLFwKLSAgJChldmFsIF9idWlsdF9maWxlcyA6PSAkKHN0cmlwICQoQUxMX01PRFVMRVMuJChtKS5CVUlMVF9JTlNUQUxMRUQpXAotICAkKEFMTF9NT0RVTEVTLiQobSkkKFRBUkdFVF8yTkRfQVJDSF9NT0RVTEVfU1VGRklYKS5CVUlMVF9JTlNUQUxMRUQpKSlcCi0gICQoZm9yZWFjaCBpLCAkKHNvcnQgJChfYnVpbHRfZmlsZXMpKSxcCi0gICAgJChldmFsIGJ1aV9pbnMgOj0gJChzdWJzdCA6LCQoc3BhY2UpLCQoaSkpKVwKLSAgICAkKGV2YWwgaW5zIDo9ICQod29yZCAyLCQoYnVpX2lucykpKVwKLSAgICAkKGlmICQoZmlsdGVyICQoVEFSR0VUX09VVF9ST09UKS8lLCQoaW5zKSksXAotICAgICAgJChldmFsIGJ1aSA6PSAkKHdvcmQgMSwkKGJ1aV9pbnMpKSlcCi0gICAgICAkKGV2YWwgbXlfY29weV9kZXN0IDo9ICQocGF0c3Vic3QgZGF0YS8lLERBVEEvJSxcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJChwYXRzdWJzdCBzeXN0ZW0vJSxEQVRBLyUsXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKHBhdHN1YnN0ICQoUFJPRFVDVF9PVVQpLyUsJSwkKGlucykpKSkpXAotICAgICAgJChjYWxsIGRlY2xhcmUtY29weS10YXJnZXQtbGljZW5zZS1tZXRhZGF0YSwkKDIpLyQobXlfY29weV9kZXN0KSwkKGJ1aSkpXAotICAgICAgJChidWkpOiQoMikvJChteV9jb3B5X2Rlc3QpKSkpCi1lbmRlZgpkaWZmIC0tZ2l0IGEvY29yZS90YXNrcy90cmFkZWZlZC10ZXN0cy1saXN0Lm1rIGIvY29yZS90YXNrcy90cmFkZWZlZC10ZXN0cy1saXN0Lm1rCmluZGV4IDQ3YzM2MGQuLmU0MzdmODkgMTAwNjQ0Ci0tLSBhL2NvcmUvdGFza3MvdHJhZGVmZWQtdGVzdHMtbGlzdC5taworKysgYi9jb3JlL3Rhc2tzL3RyYWRlZmVkLXRlc3RzLWxpc3QubWsKQEAgLTE4LDExICsxOCwxOSBAQAogQ09NUEFUSUJJTElUWS50cmFkZWZlZF90ZXN0c19kaXIgOj0gXAogICAkKENPTVBBVElCSUxJVFkudHJhZGVmZWRfdGVzdHNfZGlyKSBcCiAgIHRvb2xzL3RyYWRlZmVkZXJhdGlvbi9jb3JlL3Jlcy9jb25maWcgXAotICB0b29scy90cmFkZWZlZGVyYXRpb24vY29yZS9qYXZhdGVzdHMvcmVzL2NvbmZpZworICB0b29scy90cmFkZWZlZGVyYXRpb24vY29yZS9qYXZhdGVzdHMvcmVzL2NvbmZpZyBcCisgIHZlbmRvci9nb29nbGVfdHJhZGVmZWRlcmF0aW9uL2NvbnRyaWIvcmVzL2NvbmZpZyBcCisgIHZlbmRvci9nb29nbGVfdHJhZGVmZWRlcmF0aW9uL2NvcmUvcmVzL2NvbmZpZyBcCisgIHZlbmRvci9nb29nbGVfdHJhZGVmZWRlcmF0aW9uL2NvcmUvamF2YXRlc3RzL3Jlcy9jb25maWcgXAorICB2ZW5kb3IvZ29vZ2xlX3RyYWRlZmVkZXJhdGlvbi9jb3JlL3Byb2RfdGVzdHMvcmVzL2NvbmZpZwogCiB0cmFkZWZlZF90ZXN0cyA6PQogJChmb3JlYWNoIGRpciwgJChDT01QQVRJQklMSVRZLnRyYWRlZmVkX3Rlc3RzX2RpciksIFwKLSAgJChldmFsIHRyYWRlZmVkX3Rlc3RzICs9ICQoc2hlbGwgZmluZCAkKGRpcikgLXR5cGUgZiAtbmFtZSAiKi54bWwiKSkpCisgICQoaWYgJCh3aWxkY2FyZCAkKGRpcikvKiksIFwKKyAgICAkKGV2YWwgdHJhZGVmZWRfdGVzdHMgKz0gJChzaGVsbCBmaW5kICQoZGlyKSAtdHlwZSBmIC1uYW1lICIqLnhtbCIpKSBcCisgICkgXAorKQorCiB0cmFkZWZlZF90ZXN0c19saXN0X2ludGVybWVkaWF0ZXMgOj0gJChjYWxsIGludGVybWVkaWF0ZXMtZGlyLWZvcixQQUNLQUdJTkcsdHJhZGVmZWRfdGVzdHNfbGlzdCxIT1NULENPTU1PTikKIHRyYWRlZmVkX3Rlc3RzX2xpc3RfemlwIDo9ICQodHJhZGVmZWRfdGVzdHNfbGlzdF9pbnRlcm1lZGlhdGVzKS90cmFkZWZlZC10ZXN0c19saXN0LnppcAogYWxsX3Rlc3RzIDo9CmRpZmYgLS1naXQgYS9jb3JlL3Rhc2tzL3Z0cy1jb3JlLXRlc3RzLm1rIGIvY29yZS90YXNrcy92dHMtY29yZS10ZXN0cy5tawppbmRleCAxZWViMDc4Li4xMWJiOTMyIDEwMDY0NAotLS0gYS9jb3JlL3Rhc2tzL3Z0cy1jb3JlLXRlc3RzLm1rCisrKyBiL2NvcmUvdGFza3MvdnRzLWNvcmUtdGVzdHMubWsKQEAgLTE2LDE1ICsxNiw2IEBACiB0ZXN0X3N1aXRlX3RyYWRlZmVkIDo9IHZ0cy10cmFkZWZlZAogdGVzdF9zdWl0ZV9yZWFkbWUgOj0gdGVzdC92dHMvdG9vbHMvdnRzLWNvcmUtdHJhZGVmZWQvUkVBRE1FCiAKLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL3Rhc2tzL3Rvb2xzL3Z0cy1rZXJuZWwtdGVzdHMubWsKLQotbHRwX2NvcHlfcGFpcnMgOj0gXAotICAkKGNhbGwgdGFyZ2V0LW5hdGl2ZS1jb3B5LXBhaXJzLCQoa2VybmVsX2x0cF9tb2R1bGVzKSwkKGtlcm5lbF9sdHBfdnRzX291dCkpCi0KLWNvcHlfbHRwX3Rlc3RzIDo9ICQoY2FsbCBjb3B5LW1hbnktZmlsZXMsJChsdHBfY29weV9wYWlycykpCi0KLXRlc3Rfc3VpdGVfZXh0cmFfZGVwcyA6PSAkKGNvcHlfbHRwX3Rlc3RzKQotCiBpbmNsdWRlICQoQlVJTERfU1lTVEVNKS90YXNrcy90b29scy9jb21wYXRpYmlsaXR5Lm1rCiAKIC5QSE9OWTogdnRzCmRpZmYgLS1naXQgYS9jb3JlL3ZlcnNpb25fdXRpbC5tayBiL2NvcmUvdmVyc2lvbl91dGlsLm1rCmluZGV4IDBlMzQ2MzQuLjJiZjQxZWMgMTAwNjQ0Ci0tLSBhL2NvcmUvdmVyc2lvbl91dGlsLm1rCisrKyBiL2NvcmUvdmVyc2lvbl91dGlsLm1rCkBAIC0yMyw2ICsyMyw3IEBACiAjICAgICBQTEFURk9STV9ESVNQTEFZX1ZFUlNJT04KICMgICAgIFBMQVRGT1JNX1NES19WRVJTSU9OCiAjICAgICBQTEFURk9STV9TREtfRVhURU5TSU9OX1ZFUlNJT04KKyMgICAgIFBMQVRGT1JNX0JBU0VfU0RLX0VYVEVOU0lPTl9WRVJTSU9OCiAjICAgICBQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FCiAjICAgICBERUZBVUxUX0FQUF9UQVJHRVRfU0RLCiAjICAgICBCVUlMRF9JRApAQCAtNjcsOCArNjgsMTYgQEAKIFBMQVRGT1JNX1NES19FWFRFTlNJT05fVkVSU0lPTiA6PSAkKFJFTEVBU0VfUExBVEZPUk1fU0RLX0VYVEVOU0lPTl9WRVJTSU9OKQogLktBVElfUkVBRE9OTFkgOj0gUExBVEZPUk1fU0RLX0VYVEVOU0lPTl9WRVJTSU9OCiAKLSMgVGhpcyBpcyB0aGUgc2RrIGV4dGVuc2lvbiB2ZXJzaW9uIHRoYXQgUExBVEZPUk1fU0RLX1ZFUlNJT04gc2hpcHMgd2l0aC4KLVBMQVRGT1JNX0JBU0VfU0RLX0VYVEVOU0lPTl9WRVJTSU9OIDo9ICQoUExBVEZPUk1fU0RLX0VYVEVOU0lPTl9WRVJTSU9OKQoraWZkZWYgUExBVEZPUk1fQkFTRV9TREtfRVhURU5TSU9OX1ZFUlNJT04KKyAgJChlcnJvciBEbyBub3Qgc2V0IFBMQVRGT1JNX0JBU0VfU0RLX0VYVEVOU0lPTl9WRVJTSU9OIGRpcmVjdGx5LiBVc2UgUkVMRUFTRV9QTEFURk9STV9CQVNFX1NES19FWFRFTlNJT05fVkVSU0lPTi4gdmFsdWU6ICQoUExBVEZPUk1fQkFTRV9TREtfRVhURU5TSU9OX1ZFUlNJT04pKQorZW5kaWYKK2lmZGVmIFJFTEVBU0VfUExBVEZPUk1fQkFTRV9TREtfRVhURU5TSU9OX1ZFUlNJT04KKyAgIyBUaGlzIGlzIHRoZSBzZGsgZXh0ZW5zaW9uIHZlcnNpb24gdGhhdCBQTEFURk9STV9TREtfVkVSU0lPTiBzaGlwcyB3aXRoLgorICBQTEFURk9STV9CQVNFX1NES19FWFRFTlNJT05fVkVSU0lPTiA6PSAkKFJFTEVBU0VfUExBVEZPUk1fQkFTRV9TREtfRVhURU5TSU9OX1ZFUlNJT04pCitlbHNlCisgICMgRmFsbGJhY2sgdG8gUExBVEZPUk1fU0RLX0VYVEVOU0lPTl9WRVJTSU9OIGlmIFJFTEVBU0VfUExBVEZPUk1fQkFTRV9TREtfRVhURU5TSU9OX1ZFUlNJT04gaXMgdW5kZWZpbmVkLgorICBQTEFURk9STV9CQVNFX1NES19FWFRFTlNJT05fVkVSU0lPTiA6PSAkKFBMQVRGT1JNX1NES19FWFRFTlNJT05fVkVSU0lPTikKK2VuZGlmCiAuS0FUSV9SRUFET05MWSA6PSBQTEFURk9STV9CQVNFX1NES19FWFRFTlNJT05fVkVSU0lPTgogCiBpZmRlZiBQTEFURk9STV9WRVJTSU9OX0NPREVOQU1FCmRpZmYgLS1naXQgYS9lbnZzZXR1cC5zaCBiL2VudnNldHVwLnNoCmluZGV4IDA2ZGFkZDMuLmMwNDAzMTEgMTAwNjQ0Ci0tLSBhL2VudnNldHVwLnNoCisrKyBiL2VudnNldHVwLnNoCkBAIC0zNjIsNyArMzYyLDYgQEAKICAgICAgIHBhY2thZ2VzL21vZHVsZXMvYWRiL2FkYi5iYXNoCiAgICAgICBzeXN0ZW0vY29yZS9mYXN0Ym9vdC9mYXN0Ym9vdC5iYXNoCiAgICAgICB0b29scy9hc3VpdGUvYXN1aXRlLnNoCi0gICAgICBwcmVidWlsdHMvYmF6ZWwvY29tbW9uL2JhemVsLWNvbXBsZXRlLmJhc2gKICAgICApCiAgICAgIyBDb21wbGV0aW9uIGNhbiBiZSBkaXNhYmxlZCBzZWxlY3RpdmVseSB0byBhbGxvdyB1c2VycyB0byB1c2Ugbm9uLXN0YW5kYXJkIGNvbXBsZXRpb24uCiAgICAgIyBlLmcuCkBAIC00MzksNjcgKzQzOCw2IEBACiAgICAgZWNobwogfQogCi1mdW5jdGlvbiBsdW5jaCgpCi17Ci0gICAgbG9jYWwgYW5zd2VyCi0KLSAgICBpZiBbWyAkIyAtZ3QgMSBdXTsgdGhlbgotICAgICAgICBlY2hvICJ1c2FnZTogbHVuY2ggW3RhcmdldF0iID4mMgotICAgICAgICByZXR1cm4gMQotICAgIGZpCi0KLSAgICBsb2NhbCB1c2VkX2x1bmNoX21lbnU9MAotCi0gICAgaWYgWyAiJDEiIF07IHRoZW4KLSAgICAgICAgYW5zd2VyPSQxCi0gICAgZWxzZQotICAgICAgICBwcmludF9sdW5jaF9tZW51Ci0gICAgICAgIGVjaG8gIldoaWNoIHdvdWxkIHlvdSBsaWtlPyBbYW9zcF9jZl94ODZfNjRfcGhvbmUtdHJ1bmtfc3RhZ2luZy1lbmddIgotICAgICAgICBlY2hvIC1uICJQaWNrIGZyb20gY29tbW9uIGNob2ljZXMgYWJvdmUgKGUuZy4gMTMpIG9yIHNwZWNpZnkgeW91ciBvd24gKGUuZy4gYW9zcF9iYXJiZXQtdHJ1bmtfc3RhZ2luZy1lbmcpOiAiCi0gICAgICAgIHJlYWQgYW5zd2VyCi0gICAgICAgIHVzZWRfbHVuY2hfbWVudT0xCi0gICAgZmkKLQotICAgIGxvY2FsIHNlbGVjdGlvbj0KLQotICAgIGlmIFsgLXogIiRhbnN3ZXIiIF0KLSAgICB0aGVuCi0gICAgICAgIHNlbGVjdGlvbj1hb3NwX2NmX3g4Nl82NF9waG9uZS10cnVua19zdGFnaW5nLWVuZwotICAgIGVsaWYgKGVjaG8gLW4gJGFuc3dlciB8IGdyZXAgLXEgLWUgIl5bMC05XVswLTldKiQiKQotICAgIHRoZW4KLSAgICAgICAgbG9jYWwgY2hvaWNlcz0oJChUQVJHRVRfQlVJTERfQVBQUz0gVEFSR0VUX1BST0RVQ1Q9IFRBUkdFVF9SRUxFQVNFPSBUQVJHRVRfQlVJTERfVkFSSUFOVD0gX2dldF9idWlsZF92YXJfY2FjaGVkIENPTU1PTl9MVU5DSF9DSE9JQ0VTIDI+L2Rldi9udWxsKSkKLSAgICAgICAgaWYgWyAkYW5zd2VyIC1sZSAkeyNjaG9pY2VzW0BdfSBdCi0gICAgICAgIHRoZW4KLSAgICAgICAgICAgICMgYXJyYXkgaW4genNoIHN0YXJ0cyBmcm9tIDEgaW5zdGVhZCBvZiAwLgotICAgICAgICAgICAgaWYgWyAtbiAiJFpTSF9WRVJTSU9OIiBdCi0gICAgICAgICAgICB0aGVuCi0gICAgICAgICAgICAgICAgc2VsZWN0aW9uPSR7Y2hvaWNlc1skKCgkYW5zd2VyKSldfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHNlbGVjdGlvbj0ke2Nob2ljZXNbJCgoJGFuc3dlci0xKSldfQotICAgICAgICAgICAgZmkKLSAgICAgICAgZmkKLSAgICBlbHNlCi0gICAgICAgIHNlbGVjdGlvbj0kYW5zd2VyCi0gICAgZmkKLQotICAgIGV4cG9ydCBUQVJHRVRfQlVJTERfQVBQUz0KLQotICAgICMgVGhpcyBtdXN0IGJlIDxwcm9kdWN0Pi08cmVsZWFzZT4tPHZhcmlhbnQ+Ci0gICAgbG9jYWwgcHJvZHVjdCByZWxlYXNlIHZhcmlhbnQKLSAgICAjIFNwbGl0IHN0cmluZyBvbiB0aGUgJy0nIGNoYXJhY3Rlci4KLSAgICBJRlM9Ii0iIHJlYWQgLXIgcHJvZHVjdCByZWxlYXNlIHZhcmlhbnQgPDw8ICIkc2VsZWN0aW9uIgotCi0gICAgaWYgW1sgLXogIiRwcm9kdWN0IiBdXSB8fCBbWyAteiAiJHJlbGVhc2UiIF1dIHx8IFtbIC16ICIkdmFyaWFudCIgXV0KLSAgICB0aGVuCi0gICAgICAgIGVjaG8KLSAgICAgICAgZWNobyAiSW52YWxpZCBsdW5jaCBjb21ibzogJHNlbGVjdGlvbiIKLSAgICAgICAgZWNobyAiVmFsaWQgY29tYm9zIG11c3QgYmUgb2YgdGhlIGZvcm0gPHByb2R1Y3Q+LTxyZWxlYXNlPi08dmFyaWFudD4iCi0gICAgICAgIHJldHVybiAxCi0gICAgZmkKLQotICAgIF9sdW5jaF9tZWF0ICRwcm9kdWN0ICRyZWxlYXNlICR2YXJpYW50Ci19Ci0KIGZ1bmN0aW9uIF9sdW5jaF9tZWF0KCkKIHsKICAgICBsb2NhbCBwcm9kdWN0PSQxCkBAIC01ODIsMTMgKzUyMCwxMyBAQAogICAgICAgICBlY2hvICJOb3RlIHRoYXQgdGhlIHByZXZpb3VzIGludGVyYWN0aXZlIG1lbnUgYW5kIGxpc3Qgb2YgaGFyZC1jb2RlZCIKICAgICAgICAgZWNobyAibGlzdCBvZiBjdXJhdGVkIHRhcmdldHMgaGFzIGJlZW4gcmVtb3ZlZC4gSWYgeW91IHdvdWxkIGxpa2UgdGhlIgogICAgICAgICBlY2hvICJsaXN0IG9mIHByb2R1Y3RzLCByZWxlYXNlIGNvbmZpZ3MgZm9yIGEgcGFydGljdWxhciBwcm9kdWN0LCBvciIKLSAgICAgICAgZWNobyAidmFyaWFudHMsIHJ1biBsaXN0X3Byb2R1Y3RzLCBsaXN0X3JlbGVhc2VfY29uZmlncywgbGlzdF92YXJpYW50cyIKKyAgICAgICAgZWNobyAidmFyaWFudHMsIHJ1biBsaXN0X3Byb2R1Y3RzIGxpc3RfcmVsZWFzZXMgb3IgbGlzdF92YXJpYW50cyIKICAgICAgICAgZWNobyAicmVzcGVjdGl2ZWx5LiIKICAgICAgICAgZWNobwogICAgICkgMT4mMgogfQogCi1mdW5jdGlvbiBsdW5jaDIoKQorZnVuY3Rpb24gbHVuY2goKQogewogICAgIGlmIFtbICQjIC1lcSAxICYmICQxID0gIi0taGVscCIgXV07IHRoZW4KICAgICAgICAgX2x1bmNoX3VzYWdlCkBAIC0xMDc5LDEwICsxMDE3LDcgQEAKICAgICAgICAgZG9uZQogICAgIGRvbmUKIAotICAgIGlmIFtbICIke1BXRH0iID09IC9nb29nbGUvY29nLyogXV07IHRoZW4KLSAgICAgICAgZj0iYnVpbGQvbWFrZS9jb2dzZXR1cC5zaCIKLSAgICAgICAgZWNobyAiaW5jbHVkaW5nICRmIjsgLiAiJFQvJGYiCi0gICAgZmkKKyAgICBzZXR1cF9jb2dfZW52X2lmX25lZWRlZAogfQogCiBmdW5jdGlvbiBzaG93Y29tbWFuZHMoKSB7CmRpZmYgLS1naXQgYS9wYWNrYWdpbmcvZGlzdGRpci5tayBiL3BhY2thZ2luZy9kaXN0ZGlyLm1rCmluZGV4IDE1M2VjZjYuLjk3ZWQ5NWEgMTAwNjQ0Ci0tLSBhL3BhY2thZ2luZy9kaXN0ZGlyLm1rCisrKyBiL3BhY2thZ2luZy9kaXN0ZGlyLm1rCkBAIC00NSw1ICs0NSwzIEBACiBlbmRpZgogCiBjb3B5LW9uZS1kaXN0LWZpbGUgOj0KLURJU1RfR09BTF9PVVRQVVRfUEFJUlMgOj0KLURJU1RfU1JDX0RTVF9QQUlSUyA6PQpkaWZmIC0tZ2l0IGEvcGFja2FnaW5nL21haW5fc29vbmdfb25seS5tayBiL3BhY2thZ2luZy9tYWluX3Nvb25nX29ubHkubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI5ZTVmNgotLS0gL2Rldi9udWxsCisrKyBiL3BhY2thZ2luZy9tYWluX3Nvb25nX29ubHkubWsKQEAgLTAsMCArMSw2MCBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMjUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaWZuZGVmIEtBVEkKKyQoZXJyb3IgT25seSBLYXRpIGlzIHN1cHBvcnRlZC4pCitlbmRpZgorCiskKGluZm8gWzEvNF0gaW5pdGlhbGl6aW5nIHBhY2thZ2luZyBzeXN0ZW0gLi4uKQorCisuS0FUSV9SRUFET05MWSA6PSBLQVRJX1BBQ0tBR0VfTUtfRElSCisKK2luY2x1ZGUgYnVpbGQvbWFrZS9jb21tb24vY29yZS5taworaW5jbHVkZSBidWlsZC9tYWtlL2NvbW1vbi9zdHJpbmdzLm1rCisKKyMgRGVmaW5lIHdlbGwta25vd24gZ29hbHMgYW5kIHRoZWlyIGRlcGVuZGVuY3kgZ3JhcGggdGhhdCB0aGV5J3ZlCisjIHRyYWRpdGlvbmFsbHkgaGFkIGluIG1ha2UgYnVpbGRzLiBBbHNvIGl0J3MgaW1wb3J0YW50IHRvIGRlZmluZQorIyBkcm9pZCBmaXJzdCBzbyB0aGF0IGl0J3MgYnVpbHQgYnkgZGVmYXVsdC4KKworLlBIT05ZOiBkcm9pZAorZHJvaWQ6IGRyb2lkX3RhcmdldHMKKworLlBIT05ZOiBkcm9pZF90YXJnZXRzCitkcm9pZF90YXJnZXRzOiBkcm9pZGNvcmUgZGlzdF9maWxlcworCisuUEhPTlk6IGRpc3RfZmlsZXMKK2Rpc3RfZmlsZXM6CisKKy5QSE9OWTogZHJvaWRjb3JlCitkcm9pZGNvcmU6IGRyb2lkY29yZS11bmJ1bmRsZWQKKworLlBIT05ZOiBkcm9pZGNvcmUtdW5idW5kbGVkCitkcm9pZGNvcmUtdW5idW5kbGVkOgorCiskKGluZm8gWzIvNF0gaW5jbHVkaW5nIGRpc3RkaXIubWsgLi4uKQorCitpbmNsdWRlIGJ1aWxkL21ha2UvcGFja2FnaW5nL2Rpc3RkaXIubWsKKworJChpbmZvIFszLzRdIGRlZmluaW5nIHBob255IG1vZHVsZXMgLi4uKQorCitpbmNsdWRlICQoT1VUX0RJUikvc29vbmcvc29vbmdfcGhvbnlfdGFyZ2V0cy5taworCitnb2FscyA6PSAkKHNvcnQgJChmb3JlYWNoIHBhaXIsJChESVNUX0dPQUxfT1VUUFVUX1BBSVJTKSwkKGNhbGwgd29yZC1jb2xvbiwxLCQocGFpcikpKSkKKyQoZm9yZWFjaCBnb2FsLCQoZ29hbHMpLCBcCisgICQoZXZhbCAuUEhPTlk6ICQkKGdvYWwpKSBcCisgICQoZXZhbCAkJChnb2FsKTopIFwKKyAgJChpZiAkKGNhbGwgc3RyZXEsJChESVNUKSx0cnVlKSxcCisgICAgJChldmFsICQkKGdvYWwpOiBfZGlzdF8kJChnb2FsKSkpKQorCiskKGluZm8gWzQvNF0gd3JpdGluZyBwYWNrYWdpbmcgcnVsZXMgLi4uKQpkaWZmIC0tZ2l0IGEvc2hlbGxfdXRpbHMuc2ggYi9zaGVsbF91dGlscy5zaAppbmRleCA4NmYzZjQ5Li4zMTI0ZGI1IDEwMDY0NAotLS0gYS9zaGVsbF91dGlscy5zaAorKysgYi9zaGVsbF91dGlscy5zaApAQCAtNjMsNiArNjMsNzAgQEAKIH0KIGZpCiAKKyMgVGhpcyBmdW5jdGlvbiBzZXRzIHVwIHRoZSBidWlsZCBlbnZpcm9ubWVudCB0byBiZSBhcHByb3ByaWF0ZSBmb3IgQ29nLgorZnVuY3Rpb24gc2V0dXBfY29nX2Vudl9pZl9uZWVkZWQoKSB7CisgIGxvY2FsIHRvcD0kKGdldHRvcCkKKworICAjIHJldHVybiBlYXJseSBpZiBub3QgaW4gYSBjb2cgd29ya3NwYWNlCisgIGlmIFtbICEgIiR0b3AiID1+IF4vZ29vZ2xlL2NvZyBdXTsgdGhlbgorICAgIHJldHVybiAwCisgIGZpCisKKyAgc2V0dXBfY29nX3N5bWxpbmsKKworICBleHBvcnQgQU5EUk9JRF9CVUlMRF9FTlZJUk9OTUVOVF9DT05GSUc9Imdvb2dsZXItY29nIgorCisgICMgUnVubmluZyByZXBvIGNvbW1hbmQgd2l0aGluIENvZyB3b3Jrc3BhY2VzIGlzIG5vdCBzdXBwb3J0ZWQsIHNvIG92ZXJyaWRlCisgICMgaXQgd2l0aCB0aGlzIGZ1bmN0aW9uLiBJZiB0aGUgdXNlciBpcyBydW5uaW5nIHJlcG8gd2l0aGluIGEgQ29nIHdvcmtzcGFjZSwKKyAgIyB3ZSdsbCBmYWlsIHdpdGggYW4gZXJyb3IsIG90aGVyd2lzZSwgd2UgcnVuIHRoZSBvcmlnaW5hbCByZXBvIGNvbW1hbmQgd2l0aAorICAjIHRoZSBnaXZlbiBhcmdzLgorICBpZiAhIE9SSUdfUkVQT19QQVRIPWB3aGljaCByZXBvYDsgdGhlbgorICAgIHJldHVybiAwCisgIGZpCisgIGZ1bmN0aW9uIHJlcG8geworICAgIGlmIFtbICIke1BXRH0iID09IC9nb29nbGUvY29nLyogXV07IHRoZW4KKyAgICAgIGVjaG8gLWUgIlxlWzAxOzMxbUVSUk9SOlxlWzBtcmVwbyBjb21tYW5kIGlzIGRpc2FsbG93ZWQgd2l0aGluIENvZyB3b3Jrc3BhY2VzLiIKKyAgICAgIGtpbGwgLUlOVCAkJCAjIGV4aXRzIHRoZSBzY3JpcHQgd2l0aG91dCBleGl0aW5nIHRoZSB1c2VyJ3Mgc2hlbGwKKyAgICBmaQorICAgICR7T1JJR19SRVBPX1BBVEh9ICIkQCIKKyAgfQorfQorCisjIGNyZWF0ZXMgYSBzeW1saW5rIGZvciB0aGUgb3V0LyBkaXIgd2hlbiBpbnNpZGUgYSBjb2cgd29ya3NwYWNlLgorZnVuY3Rpb24gc2V0dXBfY29nX3N5bWxpbmsoKSB7CisgIGxvY2FsIG91dF9kaXI9JChnZXRvdXRkaXIpCisgIGxvY2FsIHRvcD0kKGdldHRvcCkKKworICAjIHJldHVybiBlYXJseSBpZiBvdXQgZGlyIGlzIGFscmVhZHkgYSBzeW1saW5rCisgIGlmIFtbIC1MICIkb3V0X2RpciIgXV07IHRoZW4KKyAgICByZXR1cm4gMAorICBmaQorCisgICMgcmV0dXJuIGVhcmx5IGlmIG91dCBkaXIgaXMgbm90IGluIHRoZSB3b3Jrc3BhY2UKKyAgaWYgW1sgISAiJG91dF9kaXIiID1+IF4kdG9wLyBdXTsgdGhlbgorICAgIHJldHVybiAwCisgIGZpCisKKyAgbG9jYWwgbGlua19kZXN0aW5hdGlvbj0iJHtIT01FfS8uY29nL2FuZHJvaWQtYnVpbGQtb3V0IgorCisgICMgcmVtb3ZlIGV4aXN0aW5nIG91dC8gZGlyIGlmIGl0IGV4aXN0cworICBpZiBbWyAtZCAiJG91dF9kaXIiIF1dOyB0aGVuCisgICAgZWNobyAiRGV0ZWN0ZWQgZXhpc3Rpbmcgb3V0LyBkaXJlY3RvcnkgaW4gdGhlIENvZyB3b3Jrc3BhY2Ugd2hpY2ggaXMgbm90IHN1cHBvcnRlZC4gUmVwYWlyaW5nIHdvcmtzcGFjZSBieSByZW1vdmluZyBpdCBhbmQgY3JlYXRpbmcgdGhlIHN5bWxpbmsgdG8gfi8uY29nL2FuZHJvaWQtYnVpbGQtb3V0IgorICAgIGlmICEgcm0gLXJmICIkb3V0X2RpciI7IHRoZW4KKyAgICAgIGVjaG8gIkZhaWxlZCB0byByZW1vdmUgZXhpc3Rpbmcgb3V0LyBkaXJlY3Rvcnk6ICRvdXRfZGlyIiA+JjIKKyAgICAgIGtpbGwgLUlOVCAkJCAjIGV4aXRzIHRoZSBzY3JpcHQgd2l0aG91dCBleGl0aW5nIHRoZSB1c2VyJ3Mgc2hlbGwKKyAgICBmaQorICBmaQorCisgICMgY3JlYXRlIHN5bWxpbmsKKyAgZWNobyAiQ3JlYXRpbmcgc3ltbGluazogJG91dF9kaXIgLT4gJGxpbmtfZGVzdGluYXRpb24iCisgIG1rZGlyIC1wICR7bGlua19kZXN0aW5hdGlvbn0KKyAgaWYgISBsbiAtcyAiJGxpbmtfZGVzdGluYXRpb24iICIkb3V0X2RpciI7IHRoZW4KKyAgICBlY2hvICJGYWlsZWQgdG8gY3JlYXRlIGNvZyBzeW1saW5rOiAkb3V0X2RpciAtPiAkbGlua19kZXN0aW5hdGlvbiIgPiYyCisgICAga2lsbCAtSU5UICQkICMgZXhpdHMgdGhlIHNjcmlwdCB3aXRob3V0IGV4aXRpbmcgdGhlIHVzZXIncyBzaGVsbAorICBmaQorfQorCiBmdW5jdGlvbiBnZXRvdXRkaXIKIHsKICAgICBsb2NhbCB0b3A9JChnZXR0b3ApCkBAIC0xMTQsMTEgKzE3OCwxMSBAQAogICAgICAgICBlY2hvIC1uICIke2NvbG9yX2ZhaWxlZH0jIyMjIGZhaWxlZCB0byBidWlsZCBzb21lIHRhcmdldHMgIgogICAgIGZpCiAgICAgaWYgWyAkaG91cnMgLWd0IDAgXSA7IHRoZW4KLSAgICAgICAgcHJpbnRmICIoJTAyZzolMDJnOiUwMmcgKGhoOm1tOnNzKSkiICRob3VycyAkbWlucyAkc2VjcworICAgICAgICBwcmludGYgIiglMDJkOiUwMmQ6JTAyZCAoaGg6bW06c3MpKSIgJGhvdXJzICRtaW5zICRzZWNzCiAgICAgZWxpZiBbICRtaW5zIC1ndCAwIF0gOyB0aGVuCi0gICAgICAgIHByaW50ZiAiKCUwMmc6JTAyZyAobW06c3MpKSIgJG1pbnMgJHNlY3MKKyAgICAgICAgcHJpbnRmICIoJTAyZDolMDJkIChtbTpzcykpIiAkbWlucyAkc2VjcwogICAgIGVsaWYgWyAkc2VjcyAtZ3QgMCBdIDsgdGhlbgotICAgICAgICBwcmludGYgIiglcyBzZWNvbmRzKSIgJHNlY3MKKyAgICAgICAgcHJpbnRmICIoJWQgc2Vjb25kcykiICRzZWNzCiAgICAgZmkKICAgICBlY2hvICIgIyMjIyR7Y29sb3JfcmVzZXR9IgogICAgIGVjaG8KQEAgLTE1MCwzICsyMTQsMTkgQEAKICAgICAnIFNJR0lOVCBTSUdURVJNIFNJR1FVSVQgRVhJVAogfQogCisjIEltcG9ydCB0aGUgYnVpbGQgdmFyaWFibGVzIHN1cHBsaWVkIGFzIGFyZ3VtZW50cyBpbnRvIHRoaXMgc2hlbGwncyBlbnZpcm9ubWVudC4KKyMgRm9yIGFic29sdXRlIHZhcmlhYmxlcywgcHJlZml4IHRoZSB2YXJpYWJsZSBuYW1lIHdpdGggYSAnLycuIEZvciBleGFtcGxlOgorIyAgICBpbXBvcnRfYnVpbGRfdmFycyBPVVRfRElSIERJU1RfRElSIC9IT1NUX09VVF9FWEVDVVRBQkxFUworIyBSZXR1cm5zIG5vbnplcm8gaWYgdGhlIGJ1aWxkIGNvbW1hbmQgZmFpbGVkLiBTdGRlcnIgaXMgcGFzc2VkIHRocm91Z2guCitmdW5jdGlvbiBpbXBvcnRfYnVpbGRfdmFycygpCit7CisgICAgcmVxdWlyZV90b3AKKyAgICBsb2NhbCBzY3JpcHQKKyAgICBzY3JpcHQ9JChjZCAkVE9QICYmIGJ1aWxkL3Nvb25nL2Jpbi9nZXRfYnVpbGRfdmFycyAiJEAiKQorICAgIGxvY2FsIHJldD0kPworICAgIGlmIFsgJHJldCAtbmUgMCBdIDsgdGhlbgorICAgICAgICByZXR1cm4gJHJldAorICAgIGZpCisgICAgZXZhbCAiJHNjcmlwdCIKKyAgICByZXR1cm4gJD8KK30KZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ0dzaUNvbW1vbi5tayBiL3RhcmdldC9ib2FyZC9Cb2FyZENvbmZpZ0dzaUNvbW1vbi5tawppbmRleCA2N2UzMWRmLi44YTYyNzk2IDEwMDY0NAotLS0gYS90YXJnZXQvYm9hcmQvQm9hcmRDb25maWdHc2lDb21tb24ubWsKKysrIGIvdGFyZ2V0L2JvYXJkL0JvYXJkQ29uZmlnR3NpQ29tbW9uLm1rCkBAIC02OSw2ICs2OSwxMSBAQAogQk9BUkRfU1VQRVJfUEFSVElUSU9OX0dST1VQUyA6PSBnc2lfZHluYW1pY19wYXJ0aXRpb25zCiBCT0FSRF9HU0lfRFlOQU1JQ19QQVJUSVRJT05TX1BBUlRJVElPTl9MSVNUIDo9IHN5c3RlbQogQk9BUkRfR1NJX0RZTkFNSUNfUEFSVElUSU9OU19TSVpFIDo9IDMyMjEyMjU0NzIKKworIyBCdWlsZCBwdm1mdyB3aXRoIEdTSTogYi8zNzYzNjM5ODkKK2lmZXEgKHRydWUsJChQUk9EVUNUX0JVSUxEX1BWTUZXX0lNQUdFKSkKK0JPQVJEX1BWTUZXSU1BR0VfUEFSVElUSU9OX1NJWkUgOj0gMHgwMDEwMDAwMAorZW5kaWYKIGVuZGlmCiAKICMgVE9ETyhiLzEyMzY5NTg2OCwgYi8xNDYxNDk2OTgpOgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL0FuZHJvaWQubWsgYi90YXJnZXQvYm9hcmQvYW5kcm9pZC1pbmZvLm1rCnNpbWlsYXJpdHkgaW5kZXggNzElCnJlbmFtZSBmcm9tIHRhcmdldC9ib2FyZC9BbmRyb2lkLm1rCnJlbmFtZSB0byB0YXJnZXQvYm9hcmQvYW5kcm9pZC1pbmZvLm1rCmluZGV4IDgxMzNhZjkuLjM2YmUwMDIgMTAwNjQ0Ci0tLSBhL3RhcmdldC9ib2FyZC9BbmRyb2lkLm1rCisrKyBiL3RhcmdldC9ib2FyZC9hbmRyb2lkLWluZm8ubWsKQEAgLTUxLDI5ICs1MSw2IEBACiAKICMgQ29weSBjb21wYXRpYmlsaXR5IG1ldGFkYXRhIHRvIHRoZSBkZXZpY2UuCiAKLSMgRGV2aWNlIE1hbmlmZXN0Ci1pZmRlZiBERVZJQ0VfTUFOSUZFU1RfRklMRQotIyAkKERFVklDRV9NQU5JRkVTVF9GSUxFKSBjYW4gYmUgYSBsaXN0IG9mIGZpbGVzCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSAgICAgICAgOj0gdmVuZG9yX21hbmlmZXN0LnhtbAotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wIGxlZ2FjeV9ub3RfYV9jb250cmlidXRpb24KLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBieV9leGNlcHRpb25fb25seSBub3RfYWxsb3dlZCBub3RpY2UKLUxPQ0FMX01PRFVMRV9TVEVNICAgOj0gbWFuaWZlc3QueG1sCi1MT0NBTF9NT0RVTEVfQ0xBU1MgIDo9IEVUQwotTE9DQUxfTU9EVUxFX1BBVEggICA6PSAkKFRBUkdFVF9PVVRfVkVORE9SKS9ldGMvdmludGYKLQotR0VOIDo9ICQobG9jYWwtZ2VuZXJhdGVkLXNvdXJjZXMtZGlyKS9tYW5pZmVzdC54bWwKLSQoR0VOKTogUFJJVkFURV9ERVZJQ0VfTUFOSUZFU1RfRklMRSA6PSAkKERFVklDRV9NQU5JRkVTVF9GSUxFKQotJChHRU4pOiAkKERFVklDRV9NQU5JRkVTVF9GSUxFKSAkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hc3NlbWJsZV92aW50ZgotCUJPQVJEX1NFUE9MSUNZX1ZFUlM9JChCT0FSRF9TRVBPTElDWV9WRVJTKSBcCi0JUFJPRFVDVF9FTkZPUkNFX1ZJTlRGX01BTklGRVNUPSQoUFJPRFVDVF9FTkZPUkNFX1ZJTlRGX01BTklGRVNUKSBcCi0JJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYXNzZW1ibGVfdmludGYgLW8gJEAgXAotCQktaSAkKGNhbGwgbm9ybWFsaXplLXBhdGgtbGlzdCwkKFBSSVZBVEVfREVWSUNFX01BTklGRVNUX0ZJTEUpKQotCi1MT0NBTF9QUkVCVUlMVF9NT0RVTEVfRklMRSA6PSAkKEdFTikKLWluY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKLWVuZGlmCi0KICMgREVWSUNFX01BTklGRVNUX1NLVVM6IGEgbGlzdCBvZiBTS1VTIHdoZXJlIERFVklDRV9NQU5JRkVTVF88c2t1Pl9GSUxFUyBpcyBkZWZpbmVkLgogaWZkZWYgREVWSUNFX01BTklGRVNUX1NLVVMKIApAQCAtMTEyLDMwICs4OSw2IEBACiAKIGVuZGlmICMgREVWSUNFX01BTklGRVNUX1NLVVMKIAotIyBPRE0gbWFuaWZlc3QKLWlmZGVmIE9ETV9NQU5JRkVTVF9GSUxFUwotIyBPRE1fTUFOSUZFU1RfRklMRVMgaXMgYSBsaXN0IG9mIGZpbGVzIHRoYXQgaXMgY29tYmluZWQgYW5kIGluc3RhbGxlZCBhcyB0aGUgZGVmYXVsdCBPRE0gbWFuaWZlc3QuCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBvZG1fbWFuaWZlc3QueG1sCi1MT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAgbGVnYWN5X25vdF9hX2NvbnRyaWJ1dGlvbgotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IGJ5X2V4Y2VwdGlvbl9vbmx5IG5vdF9hbGxvd2VkIG5vdGljZQotTE9DQUxfTU9EVUxFX1NURU0gOj0gbWFuaWZlc3QueG1sCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSB2aW50ZgotTE9DQUxfT0RNX01PRFVMRSA6PSB0cnVlCi0KLUdFTiA6PSAkKGxvY2FsLWdlbmVyYXRlZC1zb3VyY2VzLWRpcikvbWFuaWZlc3QueG1sCi0kKEdFTik6IFBSSVZBVEVfU1JDX0ZJTEVTIDo9ICQoT0RNX01BTklGRVNUX0ZJTEVTKQotJChHRU4pOiAkKE9ETV9NQU5JRkVTVF9GSUxFUykgJChIT1NUX09VVF9FWEVDVVRBQkxFUykvYXNzZW1ibGVfdmludGYKLQkjIFNldCBWSU5URl9JR05PUkVfVEFSR0VUX0ZDTV9WRVJTSU9OIHRvIHRydWUgYmVjYXVzZSBpdCBzaG91bGQgb25seSBiZSBpbiBkZXZpY2UgbWFuaWZlc3QuCi0JVklOVEZfSUdOT1JFX1RBUkdFVF9GQ01fVkVSU0lPTj10cnVlIFwKLQkkKEhPU1RfT1VUX0VYRUNVVEFCTEVTKS9hc3NlbWJsZV92aW50ZiAtbyAkQCBcCi0JCS1pICQoY2FsbCBub3JtYWxpemUtcGF0aC1saXN0LCQoUFJJVkFURV9TUkNfRklMRVMpKQotCi1MT0NBTF9QUkVCVUlMVF9NT0RVTEVfRklMRSA6PSAkKEdFTikKLWluY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKLWVuZGlmICMgT0RNX01BTklGRVNUX0ZJTEVTCi0KICMgT0RNX01BTklGRVNUX1NLVVM6IGEgbGlzdCBvZiBTS1VTIHdoZXJlIE9ETV9NQU5JRkVTVF88c2t1Pl9GSUxFUyBhcmUgZGVmaW5lZC4KIGlmZGVmIE9ETV9NQU5JRkVTVF9TS1VTCiAKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljXzY0Yml0b25seV94ODZfNjQvZGV2aWNlLm1rIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfNjRiaXRvbmx5X3g4Nl82NC9kZXZpY2UubWsKaW5kZXggYmI0OTA1Ny4uNWVkZjVlMCAxMDA2NDQKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfNjRiaXRvbmx5X3g4Nl82NC9kZXZpY2UubWsKKysrIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfNjRiaXRvbmx5X3g4Nl82NC9kZXZpY2UubWsKQEAgLTE3LDggKzE3LDMgQEAKIGlmZGVmIE5FVF9FVEgwX1NUQVJUT05CT09UCiAgIFBST0RVQ1RfUFJPUEVSVFlfT1ZFUlJJREVTICs9IG5ldC5ldGgwLnN0YXJ0b25ib290PTEKIGVuZGlmCi0KLSMgRW5zdXJlIHdlIHBhY2thZ2UgdGhlIEJJT1MgZmlsZXMgdG9vLgotUFJPRFVDVF9IT1NUX1BBQ0tBR0VTICs9IFwKLSAgICBiaW9zLmJpbiBcCi0gICAgdmdhYmlvcy1jaXJydXMuYmluIFwKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybTY0L0JvYXJkQ29uZmlnLm1rIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtNjQvQm9hcmRDb25maWcubWsKaW5kZXggZTJkNWZiNC4uMWEwNTU0OSAxMDA2NDQKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtNjQvQm9hcmRDb25maWcubWsKKysrIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtNjQvQm9hcmRDb25maWcubWsKQEAgLTIzLDE0ICsyMywxNCBAQAogVEFSR0VUXzJORF9DUFVfQUJJIDo9IGFybWVhYmktdjdhCiBUQVJHRVRfMk5EX0NQVV9BQkkyIDo9IGFybWVhYmkKIAotaWZuZXEgKCQoVEFSR0VUX0JVSUxEX0FQUFMpJChmaWx0ZXIgY3RzIHNkaywkKE1BS0VDTURHT0FMUykpLCkKK2lmbmVxICgkKFRBUkdFVF9CVUlMRF9BUFBTKSQoZmlsdGVyIHNkaywkKE1BS0VDTURHT0FMUykpLCkKICMgRE8gTk9UIFVTRQogIyBETyBOT1QgVVNFCiAjCiAjIFRoaXMgYXJjaGl0ZWN0dXJlIC8gQ1BVIHZhcmlhbnQgbXVzdCBOT1QgYmUgdXNlZCBmb3IgYW55IDY0IGJpdAogIyBwbGF0Zm9ybSBidWlsZHMuIEl0IGlzIHRoZSBsb3dlc3QgY29tbW9uIGRlbm9taW5hdG9yIHJlcXVpcmVkCiAjIHRvIGJ1aWxkIGFuIHVuYnVuZGxlZCBhcHBsaWNhdGlvbiBvciBjdHMgZm9yIGFsbCBzdXBwb3J0ZWQgMzIgYW5kIDY0IGJpdAotIyBwbGF0Zm9ybXMuCisjIHBsYXRmb3Jtcy4gSXQgbm93IHJlY29tbWVuZGVkIHRvIHVzZSBnZW5lcmljX2FybTY0X3BsdXNfYXJtdjcgdG8gYWNoaWV2ZSB0aGlzLgogIwogIyBJZiB5b3UncmUgYnVpbGRpbmcgYSA2NCBiaXQgcGxhdGZvcm0gKGFuZCBub3QgYW4gYXBwbGljYXRpb24pIHRoZQogIyBBUk0tdjggc3BlY2lmaWNhdGlvbiBhbGxvd3MgeW91IHRvIGFzc3VtZSBhbGwgdGhlIGZlYXR1cmVzIGF2YWlsYWJsZSBpbiBhbgpAQCAtNjYsNiArNjYsOCBAQAogQk9BUkRfUk9PVF9FWFRSQV9TWU1MSU5LUyArPSAvdmVuZG9yL2xpYi9kc3A6L2RzcAogQk9BUkRfUk9PVF9FWFRSQV9TWU1MSU5LUyArPSAvbW50L3ZlbmRvci9wZXJzaXN0Oi9wZXJzaXN0CiBCT0FSRF9ST09UX0VYVFJBX1NZTUxJTktTICs9IC92ZW5kb3IvZmlybXdhcmVfbW50Oi9maXJtd2FyZQorIyBmb3IgQW5kcm9pZC5icAorVEFSR0VUX0FERF9ST09UX0VYVFJBX1ZFTkRPUl9TWU1MSU5LUyA6PSB0cnVlCiAKICMgVE9ETyhiLzM2NzY0MjE1KTogcmVtb3ZlIHRoaXMgc2V0dGluZyB3aGVuIHRoZSBnZW5lcmljIHN5c3RlbSBpbWFnZQogIyBubyBsb25nZXIgaGFzIFFDT00tc3BlY2lmaWMgZGlyZWN0b3JpZXMgdW5kZXIgLy4KZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybTY0X3BsdXNfYXJtdjcvQm9hcmRDb25maWcubWsgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm02NF9wbHVzX2FybXY3L0JvYXJkQ29uZmlnLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkY2EwNGYKLS0tIC9kZXYvbnVsbAorKysgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm02NF9wbHVzX2FybXY3L0JvYXJkQ29uZmlnLm1rCkBAIC0wLDAgKzEsNTUgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDI1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgYXJtNjQgZW11bGF0b3Igc3BlY2lmaWMgZGVmaW5pdGlvbnMKK1RBUkdFVF9BUkNIIDo9IGFybTY0CitUQVJHRVRfQVJDSF9WQVJJQU5UIDo9IGFybXY4LWEKK1RBUkdFVF9DUFVfVkFSSUFOVCA6PSBnZW5lcmljCitUQVJHRVRfQ1BVX0FCSSA6PSBhcm02NC12OGEKKworVEFSR0VUXzJORF9BUkNIIDo9IGFybQorVEFSR0VUXzJORF9DUFVfQUJJIDo9IGFybWVhYmktdjdhCitUQVJHRVRfMk5EX0NQVV9BQkkyIDo9IGFybWVhYmkKKworIyBETyBOT1QgVVNFCisjIERPIE5PVCBVU0UKKyMKKyMgVGhpcyBhcmNoaXRlY3R1cmUgLyBDUFUgdmFyaWFudCBtdXN0IE5PVCBiZSB1c2VkIGZvciBhbnkgNjQgYml0CisjIHBsYXRmb3JtIGJ1aWxkcy4gSXQgaXMgdGhlIGxvd2VzdCBjb21tb24gZGVub21pbmF0b3IgcmVxdWlyZWQKKyMgdG8gYnVpbGQgYW4gdW5idW5kbGVkIGFwcGxpY2F0aW9uIG9yIGN0cyBmb3IgYWxsIHN1cHBvcnRlZCAzMiBhbmQgNjQgYml0CisjIHBsYXRmb3Jtcy4KKyMKKyMgSWYgeW91J3JlIGJ1aWxkaW5nIGEgNjQgYml0IHBsYXRmb3JtIChhbmQgbm90IGFuIGFwcGxpY2F0aW9uKSB0aGUKKyMgQVJNLXY4IHNwZWNpZmljYXRpb24gYWxsb3dzIHlvdSB0byBhc3N1bWUgYWxsIHRoZSBmZWF0dXJlcyBhdmFpbGFibGUgaW4gYW4KKyMgYXJtdjctYS1uZW9uIENQVS4gWW91IHNob3VsZCBzZXQgdGhlIGZvbGxvd2luZyBhcyAybmQgYXJjaC9jcHUgdmFyaWFudDoKKyMKKyMgVEFSR0VUXzJORF9BUkNIX1ZBUklBTlQgOj0gYXJtdjgtYQorIyBUQVJHRVRfMk5EX0NQVV9WQVJJQU5UIDo9IGdlbmVyaWMKKyMKKyMgRE8gTk9UIFVTRQorIyBETyBOT1QgVVNFCitUQVJHRVRfMk5EX0FSQ0hfVkFSSUFOVCA6PSBhcm12Ny1hLW5lb24KKyMgRE8gTk9UIFVTRQorIyBETyBOT1QgVVNFCitUQVJHRVRfMk5EX0NQVV9WQVJJQU5UIDo9IGdlbmVyaWMKKyMgRE8gTk9UIFVTRQorIyBETyBOT1QgVVNFCisKKyMgSW5jbHVkZSA2NC1iaXQgbWVkaWFzZXJ2ZXIgdG8gc3VwcG9ydCA2NC1iaXQgb25seSBkZXZpY2VzCitUQVJHRVRfRFlOQU1JQ182NF8zMl9NRURJQVNFUlZFUiA6PSB0cnVlCisjIEluY2x1ZGUgNjQtYml0IGRybXNlcnZlciB0byBzdXBwb3J0IDY0LWJpdCBvbmx5IGRldmljZXMKK1RBUkdFVF9EWU5BTUlDXzY0XzMyX0RSTVNFUlZFUiA6PSB0cnVlCisKK2luY2x1ZGUgYnVpbGQvbWFrZS90YXJnZXQvYm9hcmQvQm9hcmRDb25maWdHc2lDb21tb24ubWsKZGlmZiAtLWdpdCBhL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybTY0X3BsdXNfYXJtdjcvUkVBRE1FLnR4dCBiL3RhcmdldC9ib2FyZC9nZW5lcmljX2FybTY0X3BsdXNfYXJtdjcvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODRiZGMyCi0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtNjRfcGx1c19hcm12Ny9SRUFETUUudHh0CkBAIC0wLDAgKzEsNyBAQAorVGhlICJnZW5lcmljX2FybTY0X3BsdXNfYXJtdjciIHByb2R1Y3QgZGVmaW5lcyBhIG5vbi1oYXJkd2FyZS1zcGVjaWZpYyBhcm02NAordGFyZ2V0IHdpdGggYXJtdjcgY29tcGF0aWJsZSBhcm0zMi4gIEl0IGlzIHVzZWQgZm9yIGJ1aWxkaW5nIENUUyBhbmQgb3RoZXIKK3Rlc3Qgc3VpdGVzIGZvciB3aGljaCB0aGUgMzItYml0IGJpbmFyaWVzIG1heSBiZSBydW4gb24gb2xkZXIgZGV2aWNlcyB3aXRoCithcm12NyBDUFVzLgorCitJdCBpcyBub3QgYSBwcm9kdWN0ICJiYXNlIGNsYXNzIjsgbm8gb3RoZXIgcHJvZHVjdHMgaW5oZXJpdAorZnJvbSBpdCBvciB1c2UgaXQgaW4gYW55IHdheS4KZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvdG9vbHMvdXBkYXRlX2Jvb3Rsb2FkZXJfcmFkaW9faW1hZ2UubWsgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY19hcm02NF9wbHVzX2FybXY3L2RldmljZS5tawpzaW1pbGFyaXR5IGluZGV4IDY2JQpjb3B5IGZyb20gY29yZS90YXNrcy90b29scy91cGRhdGVfYm9vdGxvYWRlcl9yYWRpb19pbWFnZS5tawpjb3B5IHRvIHRhcmdldC9ib2FyZC9nZW5lcmljX2FybTY0X3BsdXNfYXJtdjcvZGV2aWNlLm1rCmluZGV4IDBlYmYyNDcuLmE5NTg2ZjMgMTAwNjQ0Ci0tLSBhL2NvcmUvdGFza3MvdG9vbHMvdXBkYXRlX2Jvb3Rsb2FkZXJfcmFkaW9faW1hZ2UubWsKKysrIGIvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfYXJtNjRfcGx1c19hcm12Ny9kZXZpY2UubWsKQEAgLTEsMTcgKzEsMTUgQEAKLSMgQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDI1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICMKICMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAjCi0jICAgICAgaHR0cDojd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotaWZlcSAoJChVU0VTX0RFVklDRV9HT09HTEVfWlVNQSksdHJ1ZSkKLSAgICAtaW5jbHVkZSB2ZW5kb3IvZ29vZ2xlX2RldmljZXMvenVtYS9wcmVidWlsdHMvbWlzY19iaW5zL3VwZGF0ZV9ib290bG9hZGVyX3JhZGlvX2ltYWdlLm1rCi1lbmRpZgorIwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2L2RldmljZS5tayBiL3RhcmdldC9ib2FyZC9nZW5lcmljX3g4Ni9kZXZpY2UubWsKaW5kZXggNjBmMGNjMy4uMjdmYjMxMCAxMDA2NDQKLS0tIGEvdGFyZ2V0L2JvYXJkL2dlbmVyaWNfeDg2L2RldmljZS5taworKysgYi90YXJnZXQvYm9hcmQvZ2VuZXJpY194ODYvZGV2aWNlLm1rCkBAIC0xNyw4ICsxNywzIEBACiBpZmRlZiBORVRfRVRIMF9TVEFSVE9OQk9PVAogICBQUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTICs9IG5ldC5ldGgwLnN0YXJ0b25ib290PTEKIGVuZGlmCi0KLSMgRW5zdXJlIHdlIHBhY2thZ2UgdGhlIEJJT1MgZmlsZXMgdG9vLgotUFJPRFVDVF9IT1NUX1BBQ0tBR0VTICs9IFwKLQliaW9zLmJpbiBcCi0JdmdhYmlvcy1jaXJydXMuYmluIFwKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L0FuZHJvaWRQcm9kdWN0cy5tayBiL3RhcmdldC9wcm9kdWN0L0FuZHJvaWRQcm9kdWN0cy5tawppbmRleCAwN2ViOTZkLi41YTc0MTRlIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9BbmRyb2lkUHJvZHVjdHMubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvQW5kcm9pZFByb2R1Y3RzLm1rCkBAIC0zNiw2ICszNiw3IEBACiBQUk9EVUNUX01BS0VGSUxFUyA6PSBcCiAgICAgJChMT0NBTF9ESVIpL2Fvc3BfYXJtNjQubWsgXAogICAgICQoTE9DQUxfRElSKS9hb3NwX2FybTY0X2Z1bGxtdGUubWsgXAorICAgICQoTE9DQUxfRElSKS9hb3NwX2FybTY0X3BsdXNfYXJtdjcubWsgXAogICAgICQoTE9DQUxfRElSKS9hb3NwX2FybS5tayBcCiAgICAgJChMT0NBTF9ESVIpL2Fvc3BfcmlzY3Y2NC5tayBcCiAgICAgJChMT0NBTF9ESVIpL2Fvc3BfeDg2XzY0Lm1rIFwKQEAgLTQ4LDYgKzQ5LDcgQEAKICAgICAkKExPQ0FMX0RJUikvYW9zcF82NGJpdG9ubHlfeDg2XzY0Lm1rIFwKICAgICAkKExPQ0FMX0RJUikvYW9zcF9hcm02NC5tayBcCiAgICAgJChMT0NBTF9ESVIpL2Fvc3BfYXJtNjRfZnVsbG10ZS5tayBcCisgICAgJChMT0NBTF9ESVIpL2Fvc3BfYXJtNjRfcGx1c19hcm12Ny5tayBcCiAgICAgJChMT0NBTF9ESVIpL2Fvc3BfYXJtLm1rIFwKICAgICAkKExPQ0FMX0RJUikvYW9zcF9yaXNjdjY0Lm1rIFwKICAgICAkKExPQ0FMX0RJUikvYW9zcF94ODZfNjQubWsgXApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvT1dORVJTIGIvdGFyZ2V0L3Byb2R1Y3QvT1dORVJTCmluZGV4IDQ4ZDNmMmEuLjI3NmM4ODUgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L09XTkVSUworKysgYi90YXJnZXQvcHJvZHVjdC9PV05FUlMKQEAgLTgsMyArOCw2IEBACiBwZXItZmlsZSBnb19kZWZhdWx0cy5tayA9IGdrYWlzZXJAZ29vZ2xlLmNvbSwga3VzaGdAZ29vZ2xlLmNvbSwgcmFqZWt1bWFyQGdvb2dsZS5jb20KIHBlci1maWxlIGdvX2RlZmF1bHRzXzUxMi5tayA9IGdrYWlzZXJAZ29vZ2xlLmNvbSwga3VzaGdAZ29vZ2xlLmNvbSwgcmFqZWt1bWFyQGdvb2dsZS5jb20KIHBlci1maWxlIGdvX2RlZmF1bHRzX2NvbW1vbi5tayA9IGdrYWlzZXJAZ29vZ2xlLmNvbSwga3VzaGdAZ29vZ2xlLmNvbSwgcmFqZWt1bWFyQGdvb2dsZS5jb20KKworIyBUcmFuc2xhdGlvbgorcGVyLWZpbGUgbGFuZ3VhZ2VzX2RlZmF1bHQubWsgPSBhYXBwbGVAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvYW9zcF9hcm0ubWsgYi90YXJnZXQvcHJvZHVjdC9hb3NwX2FybS5tawppbmRleCBkOWMzNjJlLi41OTVjM2RiIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9hb3NwX2FybS5taworKysgYi90YXJnZXQvcHJvZHVjdC9hb3NwX2FybS5tawpAQCAtNjAsOCArNjAsMTIgQEAKIE1PRFVMRV9CVUlMRF9GUk9NX1NPVVJDRSA/PSB0cnVlCiAKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvZ3NpX3JlbGVhc2UubWspCi1lbmRpZgogCitQUk9EVUNUX1NPT05HX0RFRklORURfU1lTVEVNX0lNQUdFIDo9IGFvc3Bfc3lzdGVtX2ltYWdlCitVU0VfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UgOj0gdHJ1ZQorUFJPRFVDVF9VU0VfU09PTkdfTk9USUNFX1hNTCA6PSB0cnVlCisKK2VuZGlmCiAKIFBST0RVQ1RfTkFNRSA6PSBhb3NwX2FybQogUFJPRFVDVF9ERVZJQ0UgOj0gZ2VuZXJpYwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvYW9zcF9hcm02NC5tayBiL3RhcmdldC9wcm9kdWN0L2Fvc3BfYXJtNjQubWsKaW5kZXggN2E5MzI1ZC4uY2QzZGU1MSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvYW9zcF9hcm02NC5taworKysgYi90YXJnZXQvcHJvZHVjdC9hb3NwX2FybTY0Lm1rCkBAIC02Niw4ICs2NiwxMiBAQAogTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFID89IHRydWUKIAogJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9nc2lfcmVsZWFzZS5taykKLWVuZGlmCiAKK1BST0RVQ1RfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UgOj0gYW9zcF9zeXN0ZW1faW1hZ2UKK1VTRV9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSA6PSB0cnVlCitQUk9EVUNUX1VTRV9TT09OR19OT1RJQ0VfWE1MIDo9IHRydWUKKworZW5kaWYKIAogUFJPRFVDVF9OQU1FIDo9IGFvc3BfYXJtNjQKIFBST0RVQ1RfREVWSUNFIDo9IGdlbmVyaWNfYXJtNjQKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2Fvc3BfYXJtNjRfcGx1c19hcm12Ny5tayBiL3RhcmdldC9wcm9kdWN0L2Fvc3BfYXJtNjRfcGx1c19hcm12Ny5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzIyNjI5Ci0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvYW9zcF9hcm02NF9wbHVzX2FybXY3Lm1rCkBAIC0wLDAgKzEsNjQgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDI1IFRoZSBBbmRyb2lkIE9wZW4tU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgYW9zcF9hcm02NF9wbHVzX2FybXY3IGlzIGZvciBidWlsZGluZyBDVFMgYW5kIG90aGVyIHRlc3Qgc3VpdGVzIHdpdGgKKyMgYXJtNjQgYXMgdGhlIHByaW1hcnkgYXJjaGl0ZWN0dXJlIGFuZCBhcm12NyBhcm0zMiBhcyB0aGUgc2Vjb25kYXJ5CisjIGFyY2hpdGVjdHVyZS4KKworIworIyBBbGwgY29tcG9uZW50cyBpbmhlcml0ZWQgaGVyZSBnbyB0byBzeXN0ZW0gaW1hZ2UKKyMKKyQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvY29yZV82NF9iaXQubWspCiskKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2dlbmVyaWNfc3lzdGVtLm1rKQorCitQUk9EVUNUX0VORk9SQ0VfQVJUSUZBQ1RfUEFUSF9SRVFVSVJFTUVOVFMgOj0gcmVsYXhlZAorCisjCisjIEFsbCBjb21wb25lbnRzIGluaGVyaXRlZCBoZXJlIGdvIHRvIHN5c3RlbV9leHQgaW1hZ2UKKyMKKyQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvaGFuZGhlbGRfc3lzdGVtX2V4dC5taykKKyQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvdGVsZXBob255X3N5c3RlbV9leHQubWspCisKKyMgcEtWTQorJChjYWxsIGluaGVyaXQtcHJvZHVjdC1pZi1leGlzdHMsIHBhY2thZ2VzL21vZHVsZXMvVmlydHVhbGl6YXRpb24vYXBleC9wcm9kdWN0X3BhY2thZ2VzLm1rKQorCisjCisjIEFsbCBjb21wb25lbnRzIGluaGVyaXRlZCBoZXJlIGdvIHRvIHByb2R1Y3QgaW1hZ2UKKyMKKyQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvYW9zcF9wcm9kdWN0Lm1rKQorCisjCisjIEFsbCBjb21wb25lbnRzIGluaGVyaXRlZCBoZXJlIGdvIHRvIHZlbmRvciBvciB2ZW5kb3JfYm9vdCBpbWFnZQorIworJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvYm9hcmQvZ2VuZXJpY19hcm02NC9kZXZpY2UubWspCitBQl9PVEFfVVBEQVRFUiA6PSB0cnVlCitBQl9PVEFfUEFSVElUSU9OUyA/PSBzeXN0ZW0KKworIworIyBTcGVjaWFsIHNldHRpbmdzIGZvciBHU0kgcmVsZWFzaW5nCisjCisjIEJ1aWxkIG1vZHVsZXMgZnJvbSBzb3VyY2UgaWYgdGhpcyBoYXMgbm90IGJlZW4gcHJlLWNvbmZpZ3VyZWQKK01PRFVMRV9CVUlMRF9GUk9NX1NPVVJDRSA/PSB0cnVlCisKKyQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvZ3NpX3JlbGVhc2UubWspCisKKworUFJPRFVDVF9OQU1FIDo9IGFvc3BfYXJtNjRfcGx1c19hcm12NworUFJPRFVDVF9ERVZJQ0UgOj0gZ2VuZXJpY19hcm02NF9wbHVzX2FybXY3CitQUk9EVUNUX0JSQU5EIDo9IEFuZHJvaWQKK1BST0RVQ1RfTU9ERUwgOj0gQU9TUCBvbiBBUk02NCB3aXRoIEFSTVY3CisKK1BST0RVQ1RfTk9fQklPTklDX1BBR0VfU0laRV9NQUNSTyA6PSB0cnVlCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9hb3NwX3g4Ni5tayBiL3RhcmdldC9wcm9kdWN0L2Fvc3BfeDg2Lm1rCmluZGV4IGMyNmE4YmYuLmQxNGFiYzIgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2Fvc3BfeDg2Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2Fvc3BfeDg2Lm1rCkBAIC01OCw4ICs1OCwxMiBAQAogTU9EVUxFX0JVSUxEX0ZST01fU09VUkNFID89IHRydWUKIAogJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9nc2lfcmVsZWFzZS5taykKLWVuZGlmCiAKK1BST0RVQ1RfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UgOj0gYW9zcF9zeXN0ZW1faW1hZ2UKK1VTRV9TT09OR19ERUZJTkVEX1NZU1RFTV9JTUFHRSA6PSB0cnVlCitQUk9EVUNUX1VTRV9TT09OR19OT1RJQ0VfWE1MIDo9IHRydWUKKworZW5kaWYKIAogUFJPRFVDVF9OQU1FIDo9IGFvc3BfeDg2CiBQUk9EVUNUX0RFVklDRSA6PSBnZW5lcmljX3g4NgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvYW9zcF94ODZfNjQubWsgYi90YXJnZXQvcHJvZHVjdC9hb3NwX3g4Nl82NC5tawppbmRleCA1OTU5NDBkLi5iZDEyMWUzIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9hb3NwX3g4Nl82NC5taworKysgYi90YXJnZXQvcHJvZHVjdC9hb3NwX3g4Nl82NC5tawpAQCAtNjgsOCArNjgsMTIgQEAKIE1PRFVMRV9CVUlMRF9GUk9NX1NPVVJDRSA/PSB0cnVlCiAKICQoY2FsbCBpbmhlcml0LXByb2R1Y3QsICQoU1JDX1RBUkdFVF9ESVIpL3Byb2R1Y3QvZ3NpX3JlbGVhc2UubWspCi1lbmRpZgogCitQUk9EVUNUX1NPT05HX0RFRklORURfU1lTVEVNX0lNQUdFIDo9IGFvc3Bfc3lzdGVtX2ltYWdlCitVU0VfU09PTkdfREVGSU5FRF9TWVNURU1fSU1BR0UgOj0gdHJ1ZQorUFJPRFVDVF9VU0VfU09PTkdfTk9USUNFX1hNTCA6PSB0cnVlCisKK2VuZGlmCiAKIFBST0RVQ1RfTkFNRSA6PSBhb3NwX3g4Nl82NAogUFJPRFVDVF9ERVZJQ0UgOj0gZ2VuZXJpY194ODZfNjQKZGlmZiAtLWdpdCBhL2NvcmUvdGFza3MvdG9vbHMvdXBkYXRlX2Jvb3Rsb2FkZXJfcmFkaW9faW1hZ2UubWsgYi90YXJnZXQvcHJvZHVjdC9hcHBfZnVuY3Rpb25fZXh0ZW5zaW9ucy5tawpzaW1pbGFyaXR5IGluZGV4IDcxJQpjb3B5IGZyb20gY29yZS90YXNrcy90b29scy91cGRhdGVfYm9vdGxvYWRlcl9yYWRpb19pbWFnZS5tawpjb3B5IHRvIHRhcmdldC9wcm9kdWN0L2FwcF9mdW5jdGlvbl9leHRlbnNpb25zLm1rCmluZGV4IDBlYmYyNDcuLmE2MWFmZGMgMTAwNjQ0Ci0tLSBhL2NvcmUvdGFza3MvdG9vbHMvdXBkYXRlX2Jvb3Rsb2FkZXJfcmFkaW9faW1hZ2UubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvYXBwX2Z1bmN0aW9uX2V4dGVuc2lvbnMubWsKQEAgLTEsMTcgKzEsMjIgQEAKKyMKICMgQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKICMKICMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KICMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAjCi0jICAgICAgaHR0cDojd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKICMKICMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQogIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAogIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKIAotaWZlcSAoJChVU0VTX0RFVklDRV9HT09HTEVfWlVNQSksdHJ1ZSkKLSAgICAtaW5jbHVkZSB2ZW5kb3IvZ29vZ2xlX2RldmljZXMvenVtYS9wcmVidWlsdHMvbWlzY19iaW5zL3VwZGF0ZV9ib290bG9hZGVyX3JhZGlvX2ltYWdlLm1rCi1lbmRpZgorIyBUaGUgYXBwIGZ1bmN0aW9uIHNpZGVjYXIgZXh0ZW5zaW9ucworCisjIC9zeXN0ZW1fZXh0IHBhY2thZ2VzCitQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKyAgICBjb20uZ29vZ2xlLmFuZHJvaWQuYXBwZnVuY3Rpb25zLnNpZGVjYXIgXAorICAgIGFwcGZ1bmN0aW9ucy5zaWRlY2FyLnhtbApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvYmFzZV9zeXN0ZW0ubWsgYi90YXJnZXQvcHJvZHVjdC9iYXNlX3N5c3RlbS5tawppbmRleCBkODA2YzA2Li40MGUyYWExIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9iYXNlX3N5c3RlbS5taworKysgYi90YXJnZXQvcHJvZHVjdC9iYXNlX3N5c3RlbS5tawpAQCAtMTcsNyArMTcsNyBAQAogIyBCYXNlIG1vZHVsZXMgYW5kIHNldHRpbmdzIGZvciB0aGUgc3lzdGVtIHBhcnRpdGlvbi4KIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAogICAgIGFieCBcCi0gICAgYWNvbmZpZ2QgXAorICAgIGFjb25maWdkLXN5c3RlbSBcCiAgICAgYWRiZF9zeXN0ZW1fYXBpIFwKICAgICBhZmxhZ3MgXAogICAgIGFtIFwKQEAgLTUyLDcgKzUyLDcgQEAKICAgICBjb20uYW5kcm9pZC5hZGJkIFwKICAgICBjb20uYW5kcm9pZC5hZHNlcnZpY2VzIFwKICAgICBjb20uYW5kcm9pZC5hcHBzZWFyY2ggXAotICAgIGNvbS5hbmRyb2lkLmJ0c2VydmljZXMgXAorICAgIGNvbS5hbmRyb2lkLmJ0IFwKICAgICBjb20uYW5kcm9pZC5jb25maWdpbmZyYXN0cnVjdHVyZSBcCiAgICAgY29tLmFuZHJvaWQuY29uc2NyeXB0IFwKICAgICBjb20uYW5kcm9pZC5kZXZpY2Vsb2NrIFwKQEAgLTE3OCw2ICsxNzgsNyBAQAogICAgIGxpYm1lZGlhIFwKICAgICBsaWJtZWRpYV9qbmkgXAogICAgIGxpYm1lZGlhbmRrIFwKKyAgICBsaWJtb25rZXlfam5pIFwKICAgICBsaWJtdHAgXAogICAgIGxpYm5ldGRfY2xpZW50IFwKICAgICBsaWJuZXRsaW5rIFwKQEAgLTIwNCw2ICsyMDUsNyBAQAogICAgIGxpYnN0ZGMrKyBcCiAgICAgbGlic3lzdXRpbHMgXAogICAgIGxpYnVpIFwKKyAgICBsaWJ1cHJvYmVzdGF0c19jbGllbnQgXAogICAgIGxpYnVzYmhvc3QgXAogICAgIGxpYnV0aWxzIFwKICAgICBsaWJ2aW50Zl9qbmkgXApAQCAtMjExLDYgKzIxMyw3IEBACiAgICAgbGlid2lsaGVsbSBcCiAgICAgbGlua2VyIFwKICAgICBsbGtkIFwKKyAgICBsbG5ka19saWJzIFwKICAgICBsbWtkIFwKICAgICBMb2NhbFRyYW5zcG9ydCBcCiAgICAgbG9ja3NldHRpbmdzIFwKQEAgLTIzOSw2ICsyNDIsNyBAQAogICAgIFBhY2thZ2VJbnN0YWxsZXIgXAogICAgIHBhY2thZ2Utc2hhcmVkdWlkLWFsbG93bGlzdC54bWwgXAogICAgIHBhc3N3ZF9zeXN0ZW0gXAorICAgIHBidG9tYnN0b25lIFwKICAgICBwZXJmZXR0byBcCiAgICAgcGVyZmV0dG8tZXh0cmFzIFwKICAgICBwaW5nIFwKQEAgLTI0Niw2ICsyNTAsNyBAQAogICAgIHBpbnRvb2wgXAogICAgIHBsYXRmb3JtLnhtbCBcCiAgICAgcG0gXAorICAgIHByZWZldGNoIFwKICAgICBwcmVpbnN0YWxsZWQtcGFja2FnZXMtYXNsLWZpbGVzLnhtbCBcCiAgICAgcHJlaW5zdGFsbGVkLXBhY2thZ2VzLXBsYXRmb3JtLnhtbCBcCiAgICAgcHJlaW5zdGFsbGVkLXBhY2thZ2VzLXN0cmljdC1zaWduYXR1cmUueG1sIFwKQEAgLTI3NCw3ICsyNzksNiBAQAogICAgIFNoZWxsIFwKICAgICBzaGVsbF9hbmRfdXRpbGl0aWVzX3N5c3RlbSBcCiAgICAgc20gXAotICAgIHNuYXBzaG90Y3RsIFwKICAgICBzbmFwdXNlcmQgXAogICAgIHN0b3JhZ2VkIFwKICAgICBzdXJmYWNlZmxpbmdlciBcCkBAIC0yODcsMTEgKzI5MSwxMSBAQAogICAgIHRvbWJzdG9uZWQgXAogICAgIHRyYWNlZCBcCiAgICAgdHJhY2VkX3Byb2JlcyBcCisgICAgdHJhZGVpbm1vZGUgXAogICAgIHR1bmUyZnMgXAogICAgIHVpYXV0b21hdG9yIFwKICAgICB1aW5wdXQgXAogICAgIHVuY3J5cHQgXAotICAgIHVwcm9iZXN0YXRzIFwKICAgICB1c2JkIFwKICAgICB2ZGMgXAogICAgIHZpbnRmIFwKQEAgLTMwOSw2ICszMTMsMTcgQEAKIAogZW5kaWYKIAorIyBXaGVuIHdlIHJlbGVhc2UgdXByb2Jlc3RhdHMgbW9kdWxlCitpZmVxICgkKFJFTEVBU0VfVVBST0JFU1RBVFNfTU9EVUxFKSx0cnVlKQorICAgIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgICAgICBjb20uYW5kcm9pZC51cHJvYmVzdGF0cyBcCisKK2Vsc2UKKyAgICBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKyAgICAgICAgdXByb2Jlc3RhdHMgXAorCitlbmRpZgorCiAjIFRoZXNlIHBhY2thZ2VzIGFyZSBub3QgdXNlZCBvbiBBbmRyb2lkIFRWCiBpZm5lcSAoJChQUk9EVUNUX0lTX0FUViksdHJ1ZSkKICAgUFJPRFVDVF9QQUNLQUdFUyArPSBcCkBAIC0zNDUsNiArMzYwLDIzIEBACiAgICAgICAgIGNvbS5hbmRyb2lkLndlYnZpZXcuYm9vdHN0cmFwCiBlbmRpZgogCisjIE9ubHkgYWRkIHRoZSBqYXIgd2hlbiBpdCBpcyBub3QgaW4gdGhlIFRldGhlcmluZyBtb2R1bGUuIE90aGVyd2lzZSwKKyMgaXQgd2lsbCBiZSBhZGRlZCB2aWEgY29tLmFuZHJvaWQudGV0aGVyaW5nCitpZm5lcSAoJChSRUxFQVNFX01PVkVfVkNOX1RPX01BSU5MSU5FKSx0cnVlKQorICAgIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgICAgICBmcmFtZXdvcmstY29ubmVjdGl2aXR5LWIKK2VuZGlmCisKK2lmbmVxICgsJChSRUxFQVNFX1JBTkdJTkdfU1RBQ0spKQorICAgIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgICAgICBjb20uYW5kcm9pZC5yYW5naW5nCitlbmRpZgorCitpZmVxICgkKFJFTEVBU0VfTUVNT1JZX01BTkFHRU1FTlRfREFFTU9OKSx0cnVlKQorICBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKKyAgICAgICAgbW1fZGFlbW9uCitlbmRpZgorCiAjIFZJTlRGIGRhdGEgZm9yIHN5c3RlbSBpbWFnZQogUFJPRFVDVF9QQUNLQUdFUyArPSBcCiAgICAgc3lzdGVtX21hbmlmZXN0LnhtbCBcCkBAIC00MTksNiArNDUxLDcgQEAKICAgICBscGR1bXAgXAogICAgIG1rZTJmcyBcCiAgICAgbWtmcy5lcm9mcyBcCisgICAgcGJ0b21ic3RvbmUgXAogICAgIHJlc2l6ZTJmcyBcCiAgICAgc2dkaXNrIFwKICAgICBzcWxpdGUzIFwKQEAgLTQ1Nyw2ICs0OTAsNyBAQAogCiBQUk9EVUNUX1NZU1RFTV9QUk9QRVJUSUVTICs9IGRlYnVnLmF0cmFjZS50YWdzLmVuYWJsZWZsYWdzPTAKIFBST0RVQ1RfU1lTVEVNX1BST1BFUlRJRVMgKz0gcGVyc2lzdC50cmFjZWQuZW5hYmxlPTEKK1BST0RVQ1RfU1lTVEVNX1BST1BFUlRJRVMgKz0gcm8uc3VyZmFjZV9mbGluZ2VyLmdhbWVfZGVmYXVsdF9mcmFtZV9yYXRlX292ZXJyaWRlPTYwCiAKICMgSW5jbHVkZSBrZXJuZWwgY29uZmlncy4KIFBST0RVQ1RfUEFDS0FHRVMgKz0gXApAQCAtNDgwLDEyICs1MTQsMTQgQEAKICAgICBsb2d0YWdkLnJjIFwKICAgICBvdC1jbGktZnRkIFwKICAgICBvdC1jdGwgXAorICAgIG92ZXJsYXlfcmVtb3VudGVyIFwKICAgICBwcm9jcmFuayBcCiAgICAgcHJvZmNvbGxlY3RkIFwKICAgICBwcm9mY29sbGVjdGN0bCBcCiAgICAgcmVjb3JkX2JpbmRlciBcCiAgICAgc2VydmljZWRpc3BhdGNoZXIgXAogICAgIHNob3dtYXAgXAorICAgIHNuYXBzaG90Y3RsIFwKICAgICBzcWxpdGUzIFwKICAgICBzcyBcCiAgICAgc3RhcnRfd2l0aF9sb2NrYWdlbnQgXApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvYmFzZV92ZW5kb3IubWsgYi90YXJnZXQvcHJvZHVjdC9iYXNlX3ZlbmRvci5tawppbmRleCBhODBlMGIzLi4xNmZjN2ZkIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9iYXNlX3ZlbmRvci5taworKysgYi90YXJnZXQvcHJvZHVjdC9iYXNlX3ZlbmRvci5tawpAQCAtMTcsNyArMTcsNiBAQAogIyBCYXNlIG1vZHVsZXMgYW5kIHNldHRpbmdzIGZvciByZWNvdmVyeS4KIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAogICAgIGFkYmQucmVjb3ZlcnkgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuaGVhbHRoQDIuMC1pbXBsLWRlZmF1bHQucmVjb3ZlcnkgXAogICAgIGJ1aWxkX2ZsYWdfdmVuZG9yIFwKICAgICBjZ3JvdXBzLnJlY292ZXJ5Lmpzb24gXAogICAgIGNoYXJnZXIucmVjb3ZlcnkgXApAQCAtNzIsNiArNzEsOCBAQAogICAgIHBhc3N3ZF9vZG0gXAogICAgIHBhc3N3ZF92ZW5kb3IgXAogICAgIHNlbGludXhfcG9saWN5X25vbnN5c3RlbSBcCisgICAgc2VsaW51eF9wb2xpY3lfdmVuZG9yIFwKKyAgICBzZWxpbnV4X3BvbGljeV9vZG0gXAogICAgIHNoZWxsX2FuZF91dGlsaXRpZXNfdmVuZG9yIFwKICAgICBvZG0tYnVpbGQucHJvcCBcCiAKQEAgLTEwNSw2ICsxMDYsNyBAQAogIyBWSU5URiBkYXRhIGZvciB2ZW5kb3IgaW1hZ2UKIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAogICAgIHZlbmRvcl9jb21wYXRpYmlsaXR5X21hdHJpeC54bWwgXAorICAgIHZlbmRvcl9tYW5pZmVzdC54bWwgXAogCiAjIEJhc2UgbW9kdWxlcyBhbmQgc2V0dGluZ3MgZm9yIHRoZSBkZWJ1ZyByYW1kaXNrLCB3aGljaCBpcyB0aGVuIHBhY2tlZAogIyBpbnRvIGEgYm9vdC1kZWJ1Zy5pbWcgYW5kIGEgdmVuZG9yX2Jvb3QtZGVidWcuaW1nLgpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvYnVpbGRfdmFyaWFibGVzLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvYnVpbGRfdmFyaWFibGVzLm1rCmluZGV4IDlmYzlmZjkuLmU5OWFiMDYgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2J1aWxkX3ZhcmlhYmxlcy5taworKysgYi90YXJnZXQvcHJvZHVjdC9idWlsZF92YXJpYWJsZXMubWsKQEAgLTIwLDUgKzIwLDE0IEBACiAjIENvbnRyb2wgbGliYmluZGVyIGNsaWVudCBjYWNoaW5nCiAkKGNhbGwgc29vbmdfY29uZmlnX3NldCwgbGliYmluZGVyLCByZWxlYXNlX2xpYmJpbmRlcl9jbGllbnRfY2FjaGUsICQoUkVMRUFTRV9MSUJCSU5ERVJfQ0xJRU5UX0NBQ0hFKSkKIAorIyBDb250cm9sIGNhY2hpbmcgd2hpbGUgYWRkaW5nIHNlcnZpY2UgaW4gbGliYmluZGVyIGNhY2hlCiskKGNhbGwgc29vbmdfY29uZmlnX3NldCwgbGliYmluZGVyLCByZWxlYXNlX2xpYmJpbmRlcl9hZGRzZXJ2aWNlX2NhY2hlLCAkKFJFTEVBU0VfTElCQklOREVSX0FERFNFUlZJQ0VfQ0FDSEUpKQorCisjIFJlbW92ZSBzdGF0aWMgbGlzdCBpbiBsaWJiaW5kZXIgY2FjaGUKKyQoY2FsbCBzb29uZ19jb25maWdfc2V0LCBsaWJiaW5kZXIsIHJlbGVhc2VfbGliYmluZGVyX3JlbW92ZV9jYWNoZV9zdGF0aWNfbGlzdCwgJChSRUxFQVNFX0xJQkJJTkRFUl9SRU1PVkVfQ0FDSEVfU1RBVElDX0xJU1QpKQorCiAjIFVzZSB0aGUgY29uZmlndXJlZCByZWxlYXNlIG9mIHNxbGl0ZQogJChjYWxsIHNvb25nX2NvbmZpZ19zZXQsIGxpYnNxbGl0ZTMsIHJlbGVhc2VfcGFja2FnZV9saWJzcWxpdGUzLCAkKFJFTEVBU0VfUEFDS0FHRV9MSUJTUUxJVEUzKSkKKworIyBVc2UgdGhlIGNvbmZpZ3VyZWQgTWVzc2FnZVF1ZXVlIGltcGxlbWVudGF0aW9uCiskKGNhbGwgc29vbmdfY29uZmlnX3NldCwgbWVzc2FnZXF1ZXVlLCByZWxlYXNlX3BhY2thZ2VfbWVzc2FnZXF1ZXVlX2ltcGxlbWVudGF0aW9uLCAkKFJFTEVBU0VfUEFDS0FHRV9NRVNTQUdFUVVFVUVfSU1QTEVNRU5UQVRJT04pKQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvZGVmYXVsdF9hcnRfY29uZmlnLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvZGVmYXVsdF9hcnRfY29uZmlnLm1rCmluZGV4IDYxZDcyMzUuLmU1NDNjY2YgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2RlZmF1bHRfYXJ0X2NvbmZpZy5taworKysgYi90YXJnZXQvcHJvZHVjdC9kZWZhdWx0X2FydF9jb25maWcubWsKQEAgLTY1LDcgKzY1LDcgQEAKICAgICBjb20uYW5kcm9pZC5hZHNlcnZpY2VzOmZyYW1ld29yay1hZHNlcnZpY2VzIFwKICAgICBjb20uYW5kcm9pZC5hZHNlcnZpY2VzOmZyYW1ld29yay1zZGtzYW5kYm94IFwKICAgICBjb20uYW5kcm9pZC5hcHBzZWFyY2g6ZnJhbWV3b3JrLWFwcHNlYXJjaCBcCi0gICAgY29tLmFuZHJvaWQuYnRzZXJ2aWNlczpmcmFtZXdvcmstYmx1ZXRvb3RoIFwKKyAgICBjb20uYW5kcm9pZC5idDpmcmFtZXdvcmstYmx1ZXRvb3RoIFwKICAgICBjb20uYW5kcm9pZC5jb25maWdpbmZyYXN0cnVjdHVyZTpmcmFtZXdvcmstY29uZmlnaW5mcmFzdHJ1Y3R1cmUgXAogICAgIGNvbS5hbmRyb2lkLmNvbnNjcnlwdDpjb25zY3J5cHQgXAogICAgIGNvbS5hbmRyb2lkLmRldmljZWxvY2s6ZnJhbWV3b3JrLWRldmljZWxvY2sgXApAQCAtMTE0LDYgKzExNCwyMyBAQAogCiBlbmRpZgogCitpZm5lcSAoLCQoUkVMRUFTRV9SQU5HSU5HX1NUQUNLKSkKKyAgICBQUk9EVUNUX0FQRVhfQk9PVF9KQVJTICs9IFwKKyAgICAgICAgY29tLmFuZHJvaWQudXdiOmZyYW1ld29yay1yYW5naW5nIFwKKyAgICAkKGNhbGwgc29vbmdfY29uZmlnX3NldCxib290Y2xhc3NwYXRoLHJlbGVhc2VfcmFuZ2luZ19zdGFjayx0cnVlKQorZW5kaWYKKworIyBDaGVjayBpZiBWQ04gc2hvdWxkIGJlIGJ1aWx0IGludG8gdGhlIHRldGhlcmluZyBtb2R1bGUgb3Igbm90CitpZmVxICgkKFJFTEVBU0VfTU9WRV9WQ05fVE9fTUFJTkxJTkUpLHRydWUpCisgICAgUFJPRFVDVF9BUEVYX0JPT1RfSkFSUyArPSBcCisgICAgICAgIGNvbS5hbmRyb2lkLnRldGhlcmluZzpmcmFtZXdvcmstY29ubmVjdGl2aXR5LWIgXAorCitlbHNlCisgICAgUFJPRFVDVF9CT09UX0pBUlMgKz0gXAorICAgICAgICBmcmFtZXdvcmstY29ubmVjdGl2aXR5LWIgXAorCitlbmRpZgorCiAjIExpc3Qgb2Ygc3lzdGVtX3NlcnZlciBjbGFzc3BhdGggamFycyBkZWxpdmVyZWQgdmlhIGFwZXguCiAjIEtlZXAgdGhlIGxpc3Qgc29ydGVkIGJ5IG1vZHVsZSBuYW1lcyBhbmQgdGhlbiBsaWJyYXJ5IG5hbWVzLgogIyBOb3RlOiBGb3IgbW9kdWxlcyBhdmFpbGFibGUgaW4gUSwgRE8gTk9UIGFkZCBuZXcgZW50cmllcyBoZXJlLgpAQCAtMTU0LDcgKzE3MSw3IEBACiAjIEtlZXAgdGhlIGxpc3Qgc29ydGVkIGJ5IG1vZHVsZSBuYW1lcyBhbmQgdGhlbiBsaWJyYXJ5IG5hbWVzLgogIyBOb3RlOiBGb3IgbW9kdWxlcyBhdmFpbGFibGUgaW4gUSwgRE8gTk9UIGFkZCBuZXcgZW50cmllcyBoZXJlLgogUFJPRFVDVF9BUEVYX1NUQU5EQUxPTkVfU1lTVEVNX1NFUlZFUl9KQVJTIDo9IFwKLSAgICBjb20uYW5kcm9pZC5idHNlcnZpY2VzOnNlcnZpY2UtYmx1ZXRvb3RoIFwKKyAgICBjb20uYW5kcm9pZC5idDpzZXJ2aWNlLWJsdWV0b290aCBcCiAgICAgY29tLmFuZHJvaWQuZGV2aWNlbG9jazpzZXJ2aWNlLWRldmljZWxvY2sgXAogICAgIGNvbS5hbmRyb2lkLm9zLnN0YXRzZDpzZXJ2aWNlLXN0YXRzZCBcCiAgICAgY29tLmFuZHJvaWQuc2NoZWR1bGluZzpzZXJ2aWNlLXNjaGVkdWxpbmcgXApAQCAtMTY5LDYgKzE4NiwxMSBAQAogCiBlbmRpZgogCitpZm5lcSAoLCQoUkVMRUFTRV9SQU5HSU5HX1NUQUNLKSkKKyAgICBQUk9EVUNUX0FQRVhfU1RBTkRBTE9ORV9TWVNURU1fU0VSVkVSX0pBUlMgKz0gXAorICAgICAgICBjb20uYW5kcm9pZC51d2I6c2VydmljZS1yYW5naW5nCitlbmRpZgorCiAjIE92ZXJyaWRlcyB0aGUgKGFwZXgsIGphcikgcGFpcnMgYWJvdmUgd2hlbiBkZXRlcm1pbmluZyB0aGUgb24tZGV2aWNlIGxvY2F0aW9uLiBUaGUgZm9ybWF0IGlzOgogIyA8b2xkX2FwZXg+OjxvbGRfamFyPjo8bmV3X2FwZXg+OjxuZXdfamFyPgogUFJPRFVDVF9DT05GSUdVUkVEX0pBUl9MT0NBVElPTl9PVkVSUklERVMgOj0gXApkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvZnVsbF94ODYubWsgYi90YXJnZXQvcHJvZHVjdC9mdWxsX3g4Ni5tawppbmRleCAwN2Y2NDcyLi5hMWI3MWNhIDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9mdWxsX3g4Ni5taworKysgYi90YXJnZXQvcHJvZHVjdC9mdWxsX3g4Ni5tawpAQCAtMzIsMTEgKzMyLDYgQEAKICAgUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSBuZXQuZXRoMC5zdGFydG9uYm9vdD0xCiBlbmRpZgogCi0jIEVuc3VyZSB3ZSBwYWNrYWdlIHRoZSBCSU9TIGZpbGVzIHRvby4KLVBST0RVQ1RfSE9TVF9QQUNLQUdFUyArPSBcCi0JYmlvcy5iaW4gXAotCXZnYWJpb3MtY2lycnVzLmJpbiBcCi0KICMgRW5hYmxlIGR5bmFtaWMgcGFydGl0aW9uIHNpemUKIFBST0RVQ1RfVVNFX0RZTkFNSUNfUEFSVElUSU9OX1NJWkUgOj0gdHJ1ZQogCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9mdWxsbXRlLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvZnVsbG10ZS5tawppbmRleCBiNjIyNDk2Li5mZWQ2NmU3IDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9mdWxsbXRlLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2Z1bGxtdGUubWsKQEAgLTIwLDcgKzIwLDcgQEAKICMgRm9yIG1vcmUgZGV0YWlscywgc2VlOgogIyBodHRwczovL3NvdXJjZS5hbmRyb2lkLmNvbS9kb2NzL3NlY3VyaXR5L3Rlc3QvbWVtb3J5LXNhZmV0eS9hcm0tbXRlCiBpZmVxICgkKGZpbHRlciBtZW10YWdfaGVhcCwkKFNBTklUSVpFX1RBUkdFVCkpLCkKLSAgU0FOSVRJWkVfVEFSR0VUIDo9ICQoc3RyaXAgJChTQU5JVElaRV9UQVJHRVQpIG1lbXRhZ19oZWFwIG1lbXRhZ19zdGFjaykKKyAgU0FOSVRJWkVfVEFSR0VUIDo9ICQoc3RyaXAgJChTQU5JVElaRV9UQVJHRVQpIG1lbXRhZ19oZWFwIG1lbXRhZ19zdGFjayBtZW10YWdfZ2xvYmFscykKICAgU0FOSVRJWkVfVEFSR0VUX0RJQUcgOj0gJChzdHJpcCAkKFNBTklUSVpFX1RBUkdFVF9ESUFHKSBtZW10YWdfaGVhcCkKIGVuZGlmCiBQUk9EVUNUX1BST0RVQ1RfUFJPUEVSVElFUyArPSBwZXJzaXN0LmFybTY0Lm1lbXRhZy5kZWZhdWx0PXN5bmMKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2dlbmVyaWMvQW5kcm9pZC5icCBiL3RhcmdldC9wcm9kdWN0L2dlbmVyaWMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmZmZjY2Ci0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpYy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTA1MiBAQAorZ2VuZXJpY19yb290ZGlycyA9IFsKKyAgICAiYXBleCIsCisgICAgImJvb3RzdHJhcC1hcGV4IiwKKyAgICAiY29uZmlnIiwKKyAgICAiZGF0YSIsCisgICAgImRhdGFfbWlycm9yIiwKKyAgICAiZGVidWdfcmFtZGlzayIsCisgICAgImRldiIsCisgICAgImxpbmtlcmNvbmZpZyIsCisgICAgIm1ldGFkYXRhIiwKKyAgICAibW50IiwKKyAgICAib2RtIiwKKyAgICAib2RtX2Rsa20iLAorICAgICJvZW0iLAorICAgICJwb3N0aW5zdGFsbCIsCisgICAgInByb2MiLAorICAgICJzZWNvbmRfc3RhZ2VfcmVzb3VyY2VzIiwKKyAgICAic3RvcmFnZSIsCisgICAgInN5cyIsCisgICAgInN5c3RlbSIsCisgICAgInN5c3RlbV9kbGttIiwKKyAgICAidG1wIiwKKyAgICAidmVuZG9yIiwKKyAgICAidmVuZG9yX2Rsa20iLAorXQorCithbmRyb2lkX3Jvb3RkaXJzID0gWworICAgICJzeXN0ZW1fZXh0IiwKKyAgICAicHJvZHVjdCIsCitdCisKK2dlbmVyaWNfc3ltbGlua3MgPSBbCisgICAgeworICAgICAgICB0YXJnZXQ6ICIvc3lzdGVtL2Jpbi9pbml0IiwKKyAgICAgICAgbmFtZTogImluaXQiLAorICAgIH0sCisgICAgeworICAgICAgICB0YXJnZXQ6ICIvc3lzdGVtL2V0YyIsCisgICAgICAgIG5hbWU6ICJldGMiLAorICAgIH0sCisgICAgeworICAgICAgICB0YXJnZXQ6ICIvc3lzdGVtL2JpbiIsCisgICAgICAgIG5hbWU6ICJiaW4iLAorICAgIH0sCisgICAgeworICAgICAgICB0YXJnZXQ6ICIvdmVuZG9yIiwKKyAgICAgICAgbmFtZTogInN5c3RlbS92ZW5kb3IiLAorICAgIH0sCisgICAgeworICAgICAgICB0YXJnZXQ6ICIvc3lzdGVtX2Rsa20vbGliL21vZHVsZXMiLAorICAgICAgICBuYW1lOiAic3lzdGVtL2xpYi9tb2R1bGVzIiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgdGFyZ2V0OiAiL2RhdGEvdXNlcl9kZS8wL2NvbS5hbmRyb2lkLnNoZWxsL2ZpbGVzL2J1Z3JlcG9ydHMiLAorICAgICAgICBuYW1lOiAiYnVncmVwb3J0cyIsCisgICAgfSwKKyAgICB7CisgICAgICAgIHRhcmdldDogIi9zeXMva2VybmVsL2RlYnVnIiwKKyAgICAgICAgbmFtZTogImQiLAorICAgIH0sCisgICAgeworICAgICAgICB0YXJnZXQ6ICIvc3RvcmFnZS9zZWxmL3ByaW1hcnkiLAorICAgICAgICBuYW1lOiAic2RjYXJkIiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgdGFyZ2V0OiAiL3Byb2R1Y3QvZXRjL3NlY3VyaXR5L2FkYl9rZXlzIiwKKyAgICAgICAgbmFtZTogImFkYl9rZXlzIiwKKyAgICB9LAorICAgIC8vIEZvciBUcmVibGUgR2VuZXJpYyBTeXN0ZW0gSW1hZ2UgKEdTSSksIHN5c3RlbS1hcy1yb290IEdTSSBuZWVkcyB0byB3b3JrIG9uIGJvdGggZGV2aWNlcyB3aXRoCisgICAgLy8gYW5kIHdpdGhvdXQgL29kbSBwYXJ0aXRpb24uIFRob3NlIHN5bWxpbmtzIGFyZSBmb3IgZGV2aWNlcyB3aXRob3V0IC9vZG0gcGFydGl0aW9uLiBGb3IKKyAgICAvLyBkZXZpY2VzIHdpdGggL29kbSBwYXJ0aXRpb24sIG1vdW50IG9kbS5pbWcgdW5kZXIgL29kbSB3aWxsIGhpZGUgdGhvc2Ugc3ltbGlua3MuCisgICAgeworICAgICAgICB0YXJnZXQ6ICIvdmVuZG9yL29kbS9hcHAiLAorICAgICAgICBuYW1lOiAib2RtL2FwcCIsCisgICAgfSwKKyAgICB7CisgICAgICAgIHRhcmdldDogIi92ZW5kb3Ivb2RtL2JpbiIsCisgICAgICAgIG5hbWU6ICJvZG0vYmluIiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgdGFyZ2V0OiAiL3ZlbmRvci9vZG0vZXRjIiwKKyAgICAgICAgbmFtZTogIm9kbS9ldGMiLAorICAgIH0sCisgICAgeworICAgICAgICB0YXJnZXQ6ICIvdmVuZG9yL29kbS9maXJtd2FyZSIsCisgICAgICAgIG5hbWU6ICJvZG0vZmlybXdhcmUiLAorICAgIH0sCisgICAgeworICAgICAgICB0YXJnZXQ6ICIvdmVuZG9yL29kbS9mcmFtZXdvcmsiLAorICAgICAgICBuYW1lOiAib2RtL2ZyYW1ld29yayIsCisgICAgfSwKKyAgICB7CisgICAgICAgIHRhcmdldDogIi92ZW5kb3Ivb2RtL2xpYiIsCisgICAgICAgIG5hbWU6ICJvZG0vbGliIiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgdGFyZ2V0OiAiL3ZlbmRvci9vZG0vbGliNjQiLAorICAgICAgICBuYW1lOiAib2RtL2xpYjY0IiwKKyAgICB9LAorICAgIHsKKyAgICAgICAgdGFyZ2V0OiAiL3ZlbmRvci9vZG0vb3ZlcmxheSIsCisgICAgICAgIG5hbWU6ICJvZG0vb3ZlcmxheSIsCisgICAgfSwKKyAgICB7CisgICAgICAgIHRhcmdldDogIi92ZW5kb3Ivb2RtL3ByaXYtYXBwIiwKKyAgICAgICAgbmFtZTogIm9kbS9wcml2LWFwcCIsCisgICAgfSwKKyAgICB7CisgICAgICAgIHRhcmdldDogIi92ZW5kb3Ivb2RtL3VzciIsCisgICAgICAgIG5hbWU6ICJvZG0vdXNyIiwKKyAgICB9LAorXQorCithbmRyb2lkX3N5bWxpbmtzID0gWworICAgIHsKKyAgICAgICAgdGFyZ2V0OiAiL3Byb2R1Y3QiLAorICAgICAgICBuYW1lOiAic3lzdGVtL3Byb2R1Y3QiLAorICAgIH0sCisgICAgeworICAgICAgICB0YXJnZXQ6ICIvc3lzdGVtX2V4dCIsCisgICAgICAgIG5hbWU6ICJzeXN0ZW0vc3lzdGVtX2V4dCIsCisgICAgfSwKKyAgICB7CisgICAgICAgIHRhcmdldDogIi9kYXRhL2NhY2hlIiwKKyAgICAgICAgbmFtZTogImNhY2hlIiwKKyAgICB9LAorXQorCitleHRyYV92ZW5kb3Jfc3ltbGlua3MgPSBbCisgICAgLy8gU29tZSB2ZW5kb3JzIHN0aWxsIGhhdmVuJ3QgY2xlYW5lZCB1cCBhbGwgZGV2aWNlIHNwZWNpZmljIGRpcmVjdG9yaWVzIHVuZGVyIHJvb3QhCisgICAgLy8gVE9ETyhiLzExMTQzNDc1OSwgYi8xMTEyODcwNjApIFNvQyBzcGVjaWZpYyBoYWNrcworICAgIHsKKyAgICAgICAgdGFyZ2V0OiAiL3ZlbmRvci9saWIvZHNwIiwKKyAgICAgICAgbmFtZTogImRzcCIsCisgICAgfSwKKyAgICB7CisgICAgICAgIHRhcmdldDogIi9tbnQvdmVuZG9yL3BlcnNpc3QiLAorICAgICAgICBuYW1lOiAicGVyc2lzdCIsCisgICAgfSwKKyAgICB7CisgICAgICAgIHRhcmdldDogIi92ZW5kb3IvZmlybXdhcmVfbW50IiwKKyAgICAgICAgbmFtZTogImZpcm13YXJlIiwKKyAgICB9LAorXQorCitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJnZW5lcmljX3N5c3RlbV9zaWduX2tleSIsCisgICAgc3JjczogWyI6YXZiX3Rlc3RrZXlfcnNhNDA5NiJdLAorfQorCitwaG9ueSB7CisgICAgbmFtZTogImdlbmVyaWNfc3lzdGVtX2ZvbnRzIiwKKyAgICByZXF1aXJlZDogWworICAgICAgICAiQW5kcm9pZENsb2NrLnR0ZiIsCisgICAgICAgICJDYXJyb2lzR290aGljU0MtUmVndWxhci50dGYiLAorICAgICAgICAiQ29taW5nU29vbi50dGYiLAorICAgICAgICAiQ3V0aXZlTW9uby50dGYiLAorICAgICAgICAiRGFuY2luZ1NjcmlwdC1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJEcm9pZFNhbnNNb25vLnR0ZiIsCisgICAgICAgICJOb3RvQ29sb3JFbW9qaS50dGYiLAorICAgICAgICAiTm90b0NvbG9yRW1vamlGbGFncy50dGYiLAorICAgICAgICAiTm90b05hc2toQXJhYmljLUJvbGQudHRmIiwKKyAgICAgICAgIk5vdG9OYXNraEFyYWJpYy1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvTmFza2hBcmFiaWNVSS1Cb2xkLnR0ZiIsCisgICAgICAgICJOb3RvTmFza2hBcmFiaWNVSS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0FkbGFtLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0Fob20tUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNBbmF0b2xpYW5IaWVyb2dseXBocy1SZWd1bGFyLm90ZiIsCisgICAgICAgICJOb3RvU2Fuc0FybWVuaWFuLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0F2ZXN0YW4tUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNCYWxpbmVzZS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0JhbXVtLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zQmFzc2FWYWgtUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNCYXRhay1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0JlbmdhbGktVkYudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zQmVuZ2FsaVVJLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0JoYWlrc3VraS1SZWd1bGFyLm90ZiIsCisgICAgICAgICJOb3RvU2Fuc0JyYWhtaS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0J1Z2luZXNlLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zQnVoaWQtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNDSkstUmVndWxhci50dGMiLAorICAgICAgICAiTm90b1NhbnNDYW5hZGlhbkFib3JpZ2luYWwtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNDYXJpYW4tUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNDaGFrbWEtUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNDaGFtLUJvbGQudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zQ2hhbS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0NoZXJva2VlLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zQ29wdGljLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zQ3VuZWlmb3JtLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zQ3lwcmlvdC1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0Rlc2VyZXQtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNEZXZhbmFnYXJpLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0RldmFuYWdhcmlVSS1WRi50dGYiLAorICAgICAgICAiTm90b1NhbnNFZ3lwdGlhbkhpZXJvZ2x5cGhzLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zRWxiYXNhbi1SZWd1bGFyLm90ZiIsCisgICAgICAgICJOb3RvU2Fuc0V0aGlvcGljLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0dlb3JnaWFuLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0dsYWdvbGl0aWMtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNHb3RoaWMtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNHcmFudGhhLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zR3VqYXJhdGktQm9sZC50dGYiLAorICAgICAgICAiTm90b1NhbnNHdWphcmF0aS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0d1amFyYXRpVUktQm9sZC50dGYiLAorICAgICAgICAiTm90b1NhbnNHdWphcmF0aVVJLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zR3VuamFsYUdvbmRpLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zR3VybXVraGktVkYudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zR3VybXVraGlVSS1WRi50dGYiLAorICAgICAgICAiTm90b1NhbnNIYW5pZmlSb2hpbmd5YS1SZWd1bGFyLm90ZiIsCisgICAgICAgICJOb3RvU2Fuc0hhbnVub28tUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNIYXRyYW4tUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNIZWJyZXctQm9sZC50dGYiLAorICAgICAgICAiTm90b1NhbnNIZWJyZXctUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNJbXBlcmlhbEFyYW1haWMtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNJbnNjcmlwdGlvbmFsUGFobGF2aS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0luc2NyaXB0aW9uYWxQYXJ0aGlhbi1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0phdmFuZXNlLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zS2FpdGhpLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zS2FubmFkYS1WRi50dGYiLAorICAgICAgICAiTm90b1NhbnNLYW5uYWRhVUktVkYudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zS2F5YWhMaS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0toYXJvc2h0aGktUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNLaG1lci1WRi50dGYiLAorICAgICAgICAiTm90b1NhbnNLaG1lclVJLUJvbGQudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zS2htZXJVSS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0tob2praS1SZWd1bGFyLm90ZiIsCisgICAgICAgICJOb3RvU2Fuc0xhby1Cb2xkLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0xhby1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0xhb1VJLUJvbGQudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zTGFvVUktUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNMZXBjaGEtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNMaW1idS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0xpbmVhckEtUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNMaW5lYXJCLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zTGlzdS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0x5Y2lhbi1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc0x5ZGlhbi1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc01hbGF5YWxhbS1WRi50dGYiLAorICAgICAgICAiTm90b1NhbnNNYWxheWFsYW1VSS1WRi50dGYiLAorICAgICAgICAiTm90b1NhbnNNYW5kYWljLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zTWFuaWNoYWVhbi1SZWd1bGFyLm90ZiIsCisgICAgICAgICJOb3RvU2Fuc01hcmNoZW4tUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNNYXNhcmFtR29uZGktUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNNZWRlZmFpZHJpbi1WRi50dGYiLAorICAgICAgICAiTm90b1NhbnNNZWV0ZWlNYXllay1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc01lcm9pdGljLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zTWlhby1SZWd1bGFyLm90ZiIsCisgICAgICAgICJOb3RvU2Fuc01vZGktUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNNb25nb2xpYW4tUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNNcm8tUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNNdWx0YW5pLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zTXlhbm1hci1Cb2xkLm90ZiIsCisgICAgICAgICJOb3RvU2Fuc015YW5tYXItTWVkaXVtLm90ZiIsCisgICAgICAgICJOb3RvU2Fuc015YW5tYXItUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNNeWFubWFyVUktQm9sZC5vdGYiLAorICAgICAgICAiTm90b1NhbnNNeWFubWFyVUktTWVkaXVtLm90ZiIsCisgICAgICAgICJOb3RvU2Fuc015YW5tYXJVSS1SZWd1bGFyLm90ZiIsCisgICAgICAgICJOb3RvU2Fuc05Lby1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc05hYmF0YWVhbi1SZWd1bGFyLm90ZiIsCisgICAgICAgICJOb3RvU2Fuc05ld1RhaUx1ZS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc05ld2EtUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNPZ2hhbS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc09sQ2hpa2ktUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNPbGRJdGFsaWMtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNPbGROb3J0aEFyYWJpYW4tUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNPbGRQZXJtaWMtUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNPbGRQZXJzaWFuLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zT2xkU291dGhBcmFiaWFuLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zT2xkVHVya2ljLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zT3JpeWEtQm9sZC50dGYiLAorICAgICAgICAiTm90b1NhbnNPcml5YS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc09yaXlhVUktQm9sZC50dGYiLAorICAgICAgICAiTm90b1NhbnNPcml5YVVJLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zT3NhZ2UtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNPc21hbnlhLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zUGFoYXdoSG1vbmctUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNQYWxteXJlbmUtUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNQYXVDaW5IYXUtUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNQaGFnc1BhLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zUGhvZW5pY2lhbi1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1JlamFuZy1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1J1bmljLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zU2FtYXJpdGFuLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zU2F1cmFzaHRyYS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1NoYXJhZGEtUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNTaGF2aWFuLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zU2luaGFsYS1WRi50dGYiLAorICAgICAgICAiTm90b1NhbnNTaW5oYWxhVUktVkYudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zU29yYVNvbXBlbmctUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NhbnNTb3lvbWJvLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1N1bmRhbmVzZS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1N5bG90aU5hZ3JpLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zU3ltYm9scy1SZWd1bGFyLVN1YnNldHRlZC50dGYiLAorICAgICAgICAiTm90b1NhbnNTeW1ib2xzLVJlZ3VsYXItU3Vic2V0dGVkMi50dGYiLAorICAgICAgICAiTm90b1NhbnNTeXJpYWNFYXN0ZXJuLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zU3lyaWFjRXN0cmFuZ2VsYS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1N5cmlhY1dlc3Rlcm4tUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNUYWdhbG9nLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zVGFnYmFud2EtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNUYWlMZS1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1RhaVRoYW0tUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNUYWlWaWV0LVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zVGFrcmktVkYudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zVGFtaWwtVkYudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zVGFtaWxVSS1WRi50dGYiLAorICAgICAgICAiTm90b1NhbnNUZWx1Z3UtVkYudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zVGVsdWd1VUktVkYudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zVGhhYW5hLUJvbGQudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zVGhhYW5hLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zVGhhaS1Cb2xkLnR0ZiIsCisgICAgICAgICJOb3RvU2Fuc1RoYWktUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNUaGFpVUktQm9sZC50dGYiLAorICAgICAgICAiTm90b1NhbnNUaGFpVUktUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NhbnNUaWZpbmFnaC1SZWd1bGFyLm90ZiIsCisgICAgICAgICJOb3RvU2Fuc1VnYXJpdGljLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zVmFpLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TYW5zV2FuY2hvLVJlZ3VsYXIub3RmIiwKKyAgICAgICAgIk5vdG9TYW5zV2FyYW5nQ2l0aS1SZWd1bGFyLm90ZiIsCisgICAgICAgICJOb3RvU2Fuc1lpLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZi1Cb2xkLnR0ZiIsCisgICAgICAgICJOb3RvU2VyaWYtQm9sZEl0YWxpYy50dGYiLAorICAgICAgICAiTm90b1NlcmlmLUl0YWxpYy50dGYiLAorICAgICAgICAiTm90b1NlcmlmLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZkFybWVuaWFuLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2VyaWZCZW5nYWxpLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2VyaWZDSkstUmVndWxhci50dGMiLAorICAgICAgICAiTm90b1NlcmlmRGV2YW5hZ2FyaS1WRi50dGYiLAorICAgICAgICAiTm90b1NlcmlmRG9ncmEtUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NlcmlmRXRoaW9waWMtVkYudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZkdlb3JnaWFuLVZGLnR0ZiIsCisgICAgICAgICJOb3RvU2VyaWZHdWphcmF0aS1WRi50dGYiLAorICAgICAgICAiTm90b1NlcmlmR3VybXVraGktVkYudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZkhlYnJldy1Cb2xkLnR0ZiIsCisgICAgICAgICJOb3RvU2VyaWZIZWJyZXctUmVndWxhci50dGYiLAorICAgICAgICAiTm90b1NlcmlmSGVudGFpZ2FuYS50dGYiLAorICAgICAgICAiTm90b1NlcmlmS2FubmFkYS1WRi50dGYiLAorICAgICAgICAiTm90b1NlcmlmS2htZXItQm9sZC5vdGYiLAorICAgICAgICAiTm90b1NlcmlmS2htZXItUmVndWxhci5vdGYiLAorICAgICAgICAiTm90b1NlcmlmTGFvLUJvbGQudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZkxhby1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJOb3RvU2VyaWZNYWxheWFsYW0tVkYudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZk15YW5tYXItQm9sZC5vdGYiLAorICAgICAgICAiTm90b1NlcmlmTXlhbm1hci1SZWd1bGFyLm90ZiIsCisgICAgICAgICJOb3RvU2VyaWZOeWlha2VuZ1B1YWNodWVIbW9uZy1WRi50dGYiLAorICAgICAgICAiTm90b1NlcmlmU2luaGFsYS1WRi50dGYiLAorICAgICAgICAiTm90b1NlcmlmVGFtaWwtVkYudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZlRlbHVndS1WRi50dGYiLAorICAgICAgICAiTm90b1NlcmlmVGhhaS1Cb2xkLnR0ZiIsCisgICAgICAgICJOb3RvU2VyaWZUaGFpLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZlRpYmV0YW4tVkYudHRmIiwKKyAgICAgICAgIk5vdG9TZXJpZlllemlkaS1WRi50dGYiLAorICAgICAgICAiUm9ib3RvLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIlJvYm90b0ZsZXgtUmVndWxhci50dGYiLAorICAgICAgICAiUm9ib3RvU3RhdGljLVJlZ3VsYXIudHRmIiwKKyAgICAgICAgIlNvdXJjZVNhbnNQcm8tQm9sZC50dGYiLAorICAgICAgICAiU291cmNlU2Fuc1Byby1Cb2xkSXRhbGljLnR0ZiIsCisgICAgICAgICJTb3VyY2VTYW5zUHJvLUl0YWxpYy50dGYiLAorICAgICAgICAiU291cmNlU2Fuc1Byby1SZWd1bGFyLnR0ZiIsCisgICAgICAgICJTb3VyY2VTYW5zUHJvLVNlbWlCb2xkLnR0ZiIsCisgICAgICAgICJTb3VyY2VTYW5zUHJvLVNlbWlCb2xkSXRhbGljLnR0ZiIsCisgICAgICAgICJmb250X2ZhbGxiYWNrLnhtbCIsCisgICAgICAgICJmb250cy54bWwiLAorICAgIF0sCit9CisKK2FuZHJvaWRfZmlsZXN5c3RlbV9kZWZhdWx0cyB7CisgICAgbmFtZTogInN5c3RlbV9leHRfaW1hZ2VfZGVmYXVsdHMiLAorICAgIGRlcHM6IFsKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAvLyBiYXNlX3N5c3RlbV9leHQKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAiYnVpbGRfZmxhZ19zeXN0ZW1fZXh0IiwKKyAgICAgICAgImZzX2NvbmZpZ19kaXJzX3N5c3RlbV9leHQiLAorICAgICAgICAiZnNfY29uZmlnX2ZpbGVzX3N5c3RlbV9leHQiLAorICAgICAgICAiZ3JvdXBfc3lzdGVtX2V4dCIsCisgICAgICAgICJwYXNzd2Rfc3lzdGVtX2V4dCIsCisgICAgICAgICJTYXRlbGxpdGVDbGllbnQiLAorICAgICAgICAic2VsaW51eF9wb2xpY3lfc3lzdGVtX2V4dCIsCisgICAgICAgICJzeXN0ZW1fZXh0X21hbmlmZXN0LnhtbCIsCisgICAgICAgICJzeXN0ZW1fZXh0LWJ1aWxkLnByb3AiLAorICAgICAgICAvLyBCYXNlIG1vZHVsZXMgd2hlbiBzaGlwcGluZyBhcGkgbGV2ZWwgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDM0CisgICAgICAgICJod3NlcnZpY2VtYW5hZ2VyIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wLXNlcnZpY2UiLAorCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgLy8gd2luZG93X2V4dGVuc2lvbnNfYmFzZQorICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICJhbmRyb2lkeC53aW5kb3cuZXh0ZW5zaW9ucyIsCisgICAgICAgICJhbmRyb2lkeC53aW5kb3cuc2lkZWNhciIsCisKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAvLyBiYXNlX3N5c3RlbQorICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICJjaGFyZ2VyIiwKKyAgICBdICsgc2VsZWN0KHJlbGVhc2VfZmxhZygiUkVMRUFTRV9BUFBGVU5DVElPTl9TSURFQ0FSIiksIHsKKyAgICAgICAgdHJ1ZTogWworICAgICAgICAgICAgImNvbS5nb29nbGUuYW5kcm9pZC5hcHBmdW5jdGlvbnMuc2lkZWNhciIsCisgICAgICAgICAgICAiYXBwZnVuY3Rpb25zLnNpZGVjYXIueG1sIiwKKyAgICAgICAgXSwKKyAgICAgICAgZGVmYXVsdDogW10sCisgICAgfSksCit9CisKK2FuZHJvaWRfZmlsZXN5c3RlbV9kZWZhdWx0cyB7CisgICAgbmFtZTogInByb2R1Y3RfaW1hZ2VfZGVmYXVsdHMiLAorICAgIGRlcHM6IFsKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAvLyBtZWRpYV9wcm9kdWN0CisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgIndlYnZpZXciLAorCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgLy8gYmFzZV9wcm9kdWN0CisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgICAgICAvLyBCYXNlIG1vZHVsZXMgYW5kIHNldHRpbmdzIGZvciB0aGUgcHJvZHVjdCBwYXJ0aXRpb24uCisgICAgICAgICJidWlsZF9mbGFnX3Byb2R1Y3QiLAorICAgICAgICAiZnNfY29uZmlnX2RpcnNfcHJvZHVjdCIsCisgICAgICAgICJmc19jb25maWdfZmlsZXNfcHJvZHVjdCIsCisgICAgICAgICJncm91cF9wcm9kdWN0IiwKKyAgICAgICAgIk1vZHVsZU1ldGFkYXRhIiwKKyAgICAgICAgInBhc3N3ZF9wcm9kdWN0IiwKKyAgICAgICAgInByb2R1Y3RfY29tcGF0aWJpbGl0eV9tYXRyaXgueG1sIiwKKyAgICAgICAgInByb2R1Y3RfbWFuaWZlc3QueG1sIiwKKyAgICAgICAgInNlbGludXhfcG9saWN5X3Byb2R1Y3QiLAorICAgICAgICAicHJvZHVjdC1idWlsZC5wcm9wIiwKKworICAgICAgICAvLyBBVURJTworICAgICAgICAiZnJhbWV3b3Jrc19zb3VuZHMiLAorICAgIF0gKyBzZWxlY3QocHJvZHVjdF92YXJpYWJsZSgiZGVidWdnYWJsZSIpLCB7CisgICAgICAgIC8vIFBhY2thZ2VzIGluY2x1ZGVkIG9ubHkgZm9yIGVuZyBvciB1c2VyZGVidWcgYnVpbGRzLCBwcmV2aW91c2x5IGRlYnVnIHRhZ2dlZAorICAgICAgICB0cnVlOiBbImFkYl9rZXlzIl0sCisgICAgICAgIGRlZmF1bHQ6IFtdLAorICAgIH0pLAorfQorCitzeXN0ZW1faW1hZ2VfZnN2ZXJpdHlfZGVmYXVsdCA9IHsKKyAgICBpbnB1dHM6IFsKKyAgICAgICAgImV0Yy9ib290LWltYWdlLnByb2YiLAorICAgICAgICAiZXRjL2NsYXNzcGF0aHMvKi5wYiIsCisgICAgICAgICJldGMvZGlydHktaW1hZ2Utb2JqZWN0cyIsCisgICAgICAgICJldGMvcHJlbG9hZGVkLWNsYXNzZXMiLAorICAgICAgICAiZnJhbWV3b3JrLyoiLAorICAgICAgICAiZnJhbWV3b3JrLyovKiIsIC8vIGZyYW1ld29yay97YXJjaH0KKyAgICAgICAgImZyYW1ld29yay9vYXQvKi8qIiwgLy8gZnJhbWV3b3JrL29hdC97YXJjaH0KKyAgICBdLAorICAgIGxpYnM6IFsiOmZyYW1ld29yay1yZXN7LmV4cG9ydC1wYWNrYWdlLmFwa30iXSwKK30KKworc29vbmdfY29uZmlnX21vZHVsZV90eXBlIHsKKyAgICBuYW1lOiAic3lzdGVtX2ltYWdlX2RlZmF1bHRzIiwKKyAgICBtb2R1bGVfdHlwZTogImFuZHJvaWRfZmlsZXN5c3RlbV9kZWZhdWx0cyIsCisgICAgY29uZmlnX25hbWVzcGFjZTogIkFORFJPSUQiLAorICAgIGJvb2xfdmFyaWFibGVzOiBbIlRBUkdFVF9BRERfUk9PVF9FWFRSQV9WRU5ET1JfU1lNTElOS1MiXSwKKyAgICBwcm9wZXJ0aWVzOiBbInN5bWxpbmtzIl0sCit9CisKK2dlbnJ1bGUgeworICAgIG5hbWU6ICJwbGF0X2FuZF92ZW5kb3JfZmlsZV9jb250ZXh0cyIsCisgICAgZGV2aWNlX2NvbW1vbl9zcmNzOiBbCisgICAgICAgICI6cGxhdF9maWxlX2NvbnRleHRzIiwKKyAgICAgICAgIjp2ZW5kb3JfZmlsZV9jb250ZXh0cyIsCisgICAgXSwKKyAgICBvdXQ6IFsiZmlsZV9jb250ZXh0cyJdLAorICAgIGNtZDogImNhdCAkKGluKSA+ICQob3V0KSIsCit9CisKK3N5c3RlbV9pbWFnZV9kZWZhdWx0cyB7CisgICAgbmFtZTogInN5c3RlbV9pbWFnZV9kZWZhdWx0cyIsCisgICAgcGFydGl0aW9uX25hbWU6ICJzeXN0ZW0iLAorICAgIGJhc2VfZGlyOiAic3lzdGVtIiwKKyAgICBzdGVtOiAic3lzdGVtLmltZyIsCisgICAgbm9fZnVsbF9pbnN0YWxsOiB0cnVlLAorICAgIGRpcnM6IGdlbmVyaWNfcm9vdGRpcnMsCisgICAgc29vbmdfY29uZmlnX3ZhcmlhYmxlczogeworICAgICAgICBUQVJHRVRfQUREX1JPT1RfRVhUUkFfVkVORE9SX1NZTUxJTktTOiB7CisgICAgICAgICAgICBzeW1saW5rczogZ2VuZXJpY19zeW1saW5rcyArIGV4dHJhX3ZlbmRvcl9zeW1saW5rcywKKyAgICAgICAgICAgIGNvbmRpdGlvbnNfZGVmYXVsdDogeworICAgICAgICAgICAgICAgIHN5bWxpbmtzOiBnZW5lcmljX3N5bWxpbmtzLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICB9LAorICAgIGZpbGVfY29udGV4dHM6ICI6cGxhdF9hbmRfdmVuZG9yX2ZpbGVfY29udGV4dHMiLAorICAgIGxpbmtlcl9jb25maWc6IHsKKyAgICAgICAgZ2VuX2xpbmtlcl9jb25maWc6IHRydWUsCisgICAgICAgIGxpbmtlcl9jb25maWdfc3JjczogWyI6c3lzdGVtX2xpbmtlcl9jb25maWdfanNvbl9maWxlIl0sCisgICAgfSwKKyAgICBmc3Zlcml0eTogeworICAgICAgICBpbnB1dHM6IHNlbGVjdChzb29uZ19jb25maWdfdmFyaWFibGUoIkFORFJPSUQiLCAiUFJPRFVDVF9GU1ZFUklUWV9HRU5FUkFURV9NRVRBREFUQSIpLCB7CisgICAgICAgICAgICB0cnVlOiBbCisgICAgICAgICAgICAgICAgImV0Yy9ib290LWltYWdlLnByb2YiLAorICAgICAgICAgICAgICAgICJldGMvY2xhc3NwYXRocy8qLnBiIiwKKyAgICAgICAgICAgICAgICAiZXRjL2RpcnR5LWltYWdlLW9iamVjdHMiLAorICAgICAgICAgICAgICAgICJldGMvcHJlbG9hZGVkLWNsYXNzZXMiLAorICAgICAgICAgICAgICAgICJmcmFtZXdvcmsvKiIsCisgICAgICAgICAgICAgICAgImZyYW1ld29yay8qLyoiLCAvLyBmcmFtZXdvcmsve2FyY2h9CisgICAgICAgICAgICAgICAgImZyYW1ld29yay9vYXQvKi8qIiwgLy8gZnJhbWV3b3JrL29hdC97YXJjaH0KKyAgICAgICAgICAgIF0sCisgICAgICAgICAgICBkZWZhdWx0OiBbXSwKKyAgICAgICAgfSksCisgICAgICAgIGxpYnM6IHNlbGVjdChzb29uZ19jb25maWdfdmFyaWFibGUoIkFORFJPSUQiLCAiUFJPRFVDVF9GU1ZFUklUWV9HRU5FUkFURV9NRVRBREFUQSIpLCB7CisgICAgICAgICAgICB0cnVlOiBbIjpmcmFtZXdvcmstcmVzey5leHBvcnQtcGFja2FnZS5hcGt9Il0sCisgICAgICAgICAgICBkZWZhdWx0OiBbXSwKKyAgICAgICAgfSksCisgICAgfSwKKyAgICBidWlsZF9sb2d0YWdzOiB0cnVlLAorICAgIGdlbl9hY29uZmlnX2ZsYWdzX3BiOiB0cnVlLAorCisgICAgY29tcGlsZV9tdWx0aWxpYjogImJvdGgiLAorCisgICAgdXNlX2F2YjogdHJ1ZSwKKyAgICBhdmJfcHJpdmF0ZV9rZXk6ICI6Z2VuZXJpY19zeXN0ZW1fc2lnbl9rZXkiLAorICAgIGF2Yl9hbGdvcml0aG06ICJTSEEyNTZfUlNBNDA5NiIsCisgICAgYXZiX2hhc2hfYWxnb3JpdGhtOiAic2hhMjU2IiwKKyAgICByb2xsYmFja19pbmRleF9sb2NhdGlvbjogMSwKKworICAgIGRlcHM6IFsKKyAgICAgICAgImFieCIsCisgICAgICAgICJhY29uZmlnZC1zeXN0ZW0iLAorICAgICAgICAiYWZsYWdzIiwKKyAgICAgICAgImFtIiwKKyAgICAgICAgImFuZHJvaWQuc29mdHdhcmUuY3JlZGVudGlhbHMucHJlYnVpbHQueG1sIiwgLy8gZ2VuZXJpY19zeXN0ZW0KKyAgICAgICAgImFuZHJvaWQuc29mdHdhcmUud2Vidmlldy5wcmVidWlsdC54bWwiLCAvLyBtZWRpYV9zeXN0ZW0KKyAgICAgICAgImFuZHJvaWQuc29mdHdhcmUud2luZG93X21hZ25pZmljYXRpb24ucHJlYnVpbHQueG1sIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICJhbmRyb2lkLnN5c3RlbS5zdXNwZW5kLXNlcnZpY2UiLAorICAgICAgICAiYXBleGQiLAorICAgICAgICAiYXBwb3BzIiwKKyAgICAgICAgImFwcHJvdmVkLW9na2ktYnVpbGRzLnhtbCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJhcHB3aWRnZXQiLAorICAgICAgICAiYXRyYWNlIiwKKyAgICAgICAgImF1ZGlvc2VydmVyIiwKKyAgICAgICAgImJjYyIsCisgICAgICAgICJibGFua19zY3JlZW4iLAorICAgICAgICAiYmxraWQiLAorICAgICAgICAiYm1nciIsCisgICAgICAgICJib290YW5pbWF0aW9uIiwKKyAgICAgICAgImJvb3RzdGF0IiwKKyAgICAgICAgImJwZmxvYWRlciIsCisgICAgICAgICJidSIsCisgICAgICAgICJidWdyZXBvcnQiLAorICAgICAgICAiYnVncmVwb3J0eiIsCisgICAgICAgICJjYW1lcmFzZXJ2ZXIiLAorICAgICAgICAiY2dyb3Vwcy5qc29uIiwKKyAgICAgICAgImNtZCIsCisgICAgICAgICJjb250ZW50IiwKKyAgICAgICAgImNwcHJlb3B0cy5zaCIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICJjcmVkc3RvcmUiLAorICAgICAgICAiZGVidWdnZXJkIiwKKyAgICAgICAgImRldmljZV9jb25maWciLAorICAgICAgICAiZGlydHktaW1hZ2Utb2JqZWN0cyIsCisgICAgICAgICJkbWN0bCIsCisgICAgICAgICJkbWVzZ2QiLAorICAgICAgICAiZG5zbWFzcSIsCisgICAgICAgICJkcG0iLAorICAgICAgICAiZHVtcC5lcm9mcyIsCisgICAgICAgICJkdW1wc3RhdGUiLAorICAgICAgICAiZHVtcHN5cyIsCisgICAgICAgICJlMmZzY2siLAorICAgICAgICAiZW5oYW5jZWQtY29uZmlybWF0aW9uLnhtbCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJldGNfaG9zdHMiLAorICAgICAgICAiZmxhZ3NfaGVhbHRoX2NoZWNrIiwKKyAgICAgICAgImZyYW1ld29yay1hdWRpb19lZmZlY3RzLnhtbCIsIC8vIGZvciBoYW5kaGVsZCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgImZyYW1ld29yay1zeXNjb25maWcueG1sIiwKKyAgICAgICAgImZzX2NvbmZpZ19kaXJzX3N5c3RlbSIsCisgICAgICAgICJmc19jb25maWdfZmlsZXNfc3lzdGVtIiwKKyAgICAgICAgImZzY2suZXJvZnMiLAorICAgICAgICAiZnNjay5mMmZzIiwgLy8gZm9yIG1lZGlhX3N5c3RlbQorICAgICAgICAiZnNja19tc2RvcyIsCisgICAgICAgICJmc3Zlcml0eS1yZWxlYXNlLWNlcnQtZGVyIiwKKyAgICAgICAgImdhdGVrZWVwZXJkIiwKKyAgICAgICAgImdwdV9jb3VudGVyX3Byb2R1Y2VyIiwKKyAgICAgICAgImdwdXNlcnZpY2UiLAorICAgICAgICAiZ3JvdXBfc3lzdGVtIiwKKyAgICAgICAgImdzaV90b29sIiwKKyAgICAgICAgImdzaWQiLAorICAgICAgICAiaGVhcHByb2ZkIiwKKyAgICAgICAgImhpZCIsCisgICAgICAgICJoaWRkZW5hcGktcGFja2FnZS13aGl0ZWxpc3QueG1sIiwgLy8gZnJvbSBydW50aW1lX2xpYmFydAorICAgICAgICAiaWRjX2RhdGEiLAorICAgICAgICAiaWRtYXAyIiwKKyAgICAgICAgImlkbWFwMmQiLAorICAgICAgICAiaW1lIiwKKyAgICAgICAgImluY2lkZW50IiwKKyAgICAgICAgImluY2lkZW50LWhlbHBlci1jbWQiLAorICAgICAgICAiaW5jaWRlbnRfaGVscGVyIiwKKyAgICAgICAgImluY2lkZW50ZCIsCisgICAgICAgICJpbml0LmVudmlyb24ucmMtc29vbmciLAorICAgICAgICAiaW5pdC51c2IuY29uZmlnZnMucmMiLAorICAgICAgICAiaW5pdC51c2IucmMiLAorICAgICAgICAiaW5pdC56eWdvdGUzMi5yYyIsCisgICAgICAgICJpbml0Lnp5Z290ZTY0LnJjIiwKKyAgICAgICAgImluaXQuenlnb3RlNjRfMzIucmMiLAorICAgICAgICAiaW5pdGlhbC1wYWNrYWdlLXN0b3BwZWQtc3RhdGVzLnhtbCIsCisgICAgICAgICJpbnB1dCIsCisgICAgICAgICJpbnN0YWxsZCIsCisgICAgICAgICJpcCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJpcHRhYmxlcyIsCisgICAgICAgICJrY21kbGluZWN0cmwiLAorICAgICAgICAia2VybmVsLWxpZmV0aW1lcy54bWwiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAia2V5Y2hhcnNfZGF0YSIsCisgICAgICAgICJrZXlsYXlvdXRfZGF0YSIsCisgICAgICAgICJrZXlzdG9yZTIiLAorICAgICAgICAibGQubWMiLAorICAgICAgICAibGxrZCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJsbWtkIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgImxvY2tzZXR0aW5ncyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJsb2djYXQiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAibG9nZCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJscGR1bXAiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAibHNoYWwiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAibWFrZV9mMmZzIiwgLy8gbWVkaWFfc3lzdGVtCisgICAgICAgICJtZG5zZCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJtZWRpYV9wcm9maWxlc19WMV8wLmR0ZCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJtZWRpYWNvZGVjLnBvbGljeSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJtZWRpYWV4dHJhY3RvciIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJtZWRpYW1ldHJpY3MiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAibWlzY3RybCIsIC8vIGZyb20gYmFzZV9zeXN0ZW0KKyAgICAgICAgIm1rZTJmcyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJta2ZzLmVyb2ZzIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgIm1vbmtleSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJtdGVjdHJsIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgIm5kYyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJuZXRkIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgIm5ldHV0aWxzLXdyYXBwZXItMS4wIiwgLy8gZnVsbF9iYXNlCisgICAgICAgICJub3RpY2VfeG1sX3N5c3RlbSIsCisgICAgICAgICJvZHNpZ24iLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAib3RhcHJlb3B0X3NjcmlwdCIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICJwYWNrYWdlLXNoYXJlZHVpZC1hbGxvd2xpc3QueG1sIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInBhc3N3ZF9zeXN0ZW0iLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAicGJ0b21ic3RvbmUiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAicGVyZmV0dG8iLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAicGluZyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJwaW5nNiIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJwaW50b29sIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInBsYXRmb3JtLnhtbCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJwbSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJwcmVmZXRjaCIsIC8vYmFzZV9zeXN0ZW0KKyAgICAgICAgInByZWluc3RhbGxlZC1wYWNrYWdlcy1hc2wtZmlsZXMueG1sIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInByZWluc3RhbGxlZC1wYWNrYWdlcy1wbGF0Zm9ybS1nZW5lcmljLXN5c3RlbS54bWwiLCAvLyBnZW5lcmljX3N5c3RlbQorICAgICAgICAicHJlaW5zdGFsbGVkLXBhY2thZ2VzLXBsYXRmb3JtLWhhbmRoZWxkLXN5c3RlbS54bWwiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgInByZWluc3RhbGxlZC1wYWNrYWdlcy1wbGF0Zm9ybS54bWwiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAicHJlaW5zdGFsbGVkLXBhY2thZ2VzLXN0cmljdC1zaWduYXR1cmUueG1sIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInByZWxvYWRlZC1jbGFzc2VzIiwgLy8gb2sKKyAgICAgICAgInByaW50ZmxhZ3MiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAicHJpdmFwcC1wZXJtaXNzaW9ucy1wbGF0Zm9ybS54bWwiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAicHJuZ19zZWVkZXIiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAicHVibGljLmxpYnJhcmllcy5hbmRyb2lkLnR4dCIsCisgICAgICAgICJyZWNvdmVyeS1wZXJzaXN0IiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInJlY292ZXJ5LXJlZnJlc2giLCAvLyBnZW5lcmljX3N5c3RlbQorICAgICAgICAicmVxdWVzdHN5bmMiLCAvLyBtZWRpYV9zeXN0ZW0KKyAgICAgICAgInJlc2l6ZTJmcyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJyc3NfaHdtX3Jlc2V0IiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInJ1bi1hcyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJzY2hlZHRlc3QiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAic2NyZWVuY2FwIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInNjcmVlbnJlY29yZCIsIC8vIGhhbmRoZWxkX3N5c3RlbQorICAgICAgICAic2RjYXJkIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInNlY2Rpc2NhcmQiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAic2Vuc29yc2VydmljZSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJzZXJ2aWNlIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInNlcnZpY2VtYW5hZ2VyIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInNldHRpbmdzIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInNmZG8iLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAic2dkaXNrIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInNtIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInNuYXB1c2VyZCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJzdG9yYWdlZCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJzdXJmYWNlZmxpbmdlciIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJzdmMiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAic3lzdGVtX21hbmlmZXN0LnhtbCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJ0YXNrX3Byb2ZpbGVzLmpzb24iLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAidGMiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAidGVsZWNvbSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJ0b21ic3RvbmVkIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInRyYWNlZCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJ0cmFjZWRfcHJvYmVzIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInRyYWRlaW5tb2RlIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInR1bmUyZnMiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAidWlhdXRvbWF0b3IiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAidWlucHV0IiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInVuY3J5cHQiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAidXBkYXRlX2VuZ2luZSIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICJ1cGRhdGVfZW5naW5lX3NpZGVsb2FkIiwgLy8gcmVjb3ZlcnkKKyAgICAgICAgInVwZGF0ZV92ZXJpZmllciIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICJ1c2JkIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgInZkYyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJ2aXJ0dWFsX2NhbWVyYSIsIC8vIGhhbmRoZWxkX3N5c3RlbSAvLyByZWxlYXNlX3BhY2thZ2VfdmlydHVhbF9jYW1lcmEKKyAgICAgICAgInZvbGQiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAidnIiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgIndhdGNoZG9nZCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICJ3aWZpLnJjIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgIndpZmljb25kIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgIndtIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICBdICsgc2VsZWN0KHJlbGVhc2VfZmxhZygiUkVMRUFTRV9QTEFURk9STV9WRVJTSU9OX0NPREVOQU1FIiksIHsKKyAgICAgICAgIlJFTCI6IFtdLAorICAgICAgICBkZWZhdWx0OiBbCisgICAgICAgICAgICAiYW5kcm9pZC5zb2Z0d2FyZS5wcmV2aWV3X3Nkay5wcmVidWlsdC54bWwiLCAvLyBtZWRpYV9zeXN0ZW0KKyAgICAgICAgXSwKKyAgICB9KSArIHNlbGVjdChzb29uZ19jb25maWdfdmFyaWFibGUoIkFORFJPSUQiLCAicmVsZWFzZV9wYWNrYWdlX3Byb2ZpbGluZ19tb2R1bGUiKSwgeworICAgICAgICAidHJ1ZSI6IFsKKyAgICAgICAgICAgICJ0cmFjZV9yZWRhY3RvciIsIC8vIGJhc2Vfc3lzdGVtIChSRUxFQVNFX1BBQ0tBR0VfUFJPRklMSU5HX01PRFVMRSkKKyAgICAgICAgXSwKKyAgICAgICAgZGVmYXVsdDogW10sCisgICAgfSkgKyBzZWxlY3QocmVsZWFzZV9mbGFnKCJSRUxFQVNFX01FTU9SWV9NQU5BR0VNRU5UX0RBRU1PTiIpLCB7CisgICAgICAgIHRydWU6IFsKKyAgICAgICAgICAgICJtbV9kYWVtb24iLCAvLyBiYXNlX3N5c3RlbSAoUkVMRUFTRV9NRU1PUllfTUFOQUdFTUVOVF9EQUVNT04pCisgICAgICAgIF0sCisgICAgICAgIGRlZmF1bHQ6IFtdLAorICAgIH0pICsgc2VsZWN0KHByb2R1Y3RfdmFyaWFibGUoImRlYnVnZ2FibGUiKSwgeworICAgICAgICB0cnVlOiBbCisgICAgICAgICAgICAiYWxsb2N0b3AiLAorICAgICAgICAgICAgImFkZXZpY2VfZmluZ2VycHJpbnQiLAorICAgICAgICAgICAgImFycGluZyIsCisgICAgICAgICAgICAiYXZiY3RsIiwKKyAgICAgICAgICAgICJib290Y3RsIiwKKyAgICAgICAgICAgICJkbXVzZXJkIiwKKyAgICAgICAgICAgICJldmVtdS1yZWNvcmQiLAorICAgICAgICAgICAgImlkbGNsaSIsCisgICAgICAgICAgICAiaW5pdC1kZWJ1Zy5yYyIsCisgICAgICAgICAgICAiaW90b3AiLAorICAgICAgICAgICAgImlwZXJmMyIsCisgICAgICAgICAgICAiaXciLAorICAgICAgICAgICAgImxheWVydHJhY2VnZW5lcmF0b3IiLAorICAgICAgICAgICAgImxvZ3BlcnNpc3Quc3RhcnQiLAorICAgICAgICAgICAgImxvZ3RhZ2QucmMiLAorICAgICAgICAgICAgIm90LWNsaS1mdGQiLAorICAgICAgICAgICAgIm90LWN0bCIsCisgICAgICAgICAgICAib3ZlcmxheV9yZW1vdW50ZXIiLAorICAgICAgICAgICAgInByb2NyYW5rIiwKKyAgICAgICAgICAgICJwcm9mY29sbGVjdGN0bCIsCisgICAgICAgICAgICAicHJvZmNvbGxlY3RkIiwKKyAgICAgICAgICAgICJyZWNvcmRfYmluZGVyIiwKKyAgICAgICAgICAgICJzYW5pdGl6ZXItc3RhdHVzIiwKKyAgICAgICAgICAgICJzZXJ2aWNlZGlzcGF0Y2hlciIsCisgICAgICAgICAgICAic2hvd21hcCIsCisgICAgICAgICAgICAic25hcHNob3RjdGwiLAorICAgICAgICAgICAgInNxbGl0ZTMiLAorICAgICAgICAgICAgInNzIiwKKyAgICAgICAgICAgICJzdGFydF93aXRoX2xvY2thZ2VudCIsCisgICAgICAgICAgICAic3RyYWNlIiwKKyAgICAgICAgICAgICJzdSIsCisgICAgICAgICAgICAidGlueWNhcCIsCisgICAgICAgICAgICAidGlueWhvc3RsZXNzIiwKKyAgICAgICAgICAgICJ0aW55bWl4IiwKKyAgICAgICAgICAgICJ0aW55cGNtaW5mbyIsCisgICAgICAgICAgICAidGlueXBsYXkiLCAvLyBob3N0CisgICAgICAgICAgICAidHJhY2VwYXRoIiwKKyAgICAgICAgICAgICJ0cmFjZXBhdGg2IiwKKyAgICAgICAgICAgICJ0cmFjZXJvdXRlNiIsCisgICAgICAgICAgICAidW53aW5kX2luZm8iLAorICAgICAgICAgICAgInVud2luZF9yZWdfaW5mbyIsCisgICAgICAgICAgICAidW53aW5kX3N5bWJvbHMiLAorICAgICAgICAgICAgInVwZGF0ZV9lbmdpbmVfY2xpZW50IiwKKyAgICAgICAgXSwKKyAgICAgICAgZGVmYXVsdDogW10sCisgICAgfSkgKyBzZWxlY3QocmVsZWFzZV9mbGFnKCJSRUxFQVNFX1VQUk9CRVNUQVRTX01PRFVMRSIpLCB7CisgICAgICAgIHRydWU6IFtdLAorICAgICAgICBkZWZhdWx0OiBbCisgICAgICAgICAgICAidXByb2Jlc3RhdHMiLCAvLyBiYXNlX3N5c3RlbSBpbnRlcm5hbAorICAgICAgICBdLAorICAgIH0pLAorICAgIG11bHRpbGliOiB7CisgICAgICAgIGNvbW1vbjogeworICAgICAgICAgICAgZGVwczogWworICAgICAgICAgICAgICAgICJCYWNrdXBSZXN0b3JlQ29uZmlybWF0aW9uIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiQmFzaWNEcmVhbXMiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiQmxvY2tlZE51bWJlclByb3ZpZGVyIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICAgICAgICAgIkJsdWV0b290aE1pZGlTZXJ2aWNlIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICAgICAgICAgIkJvb2ttYXJrUHJvdmlkZXIiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiQnVpbHRJblByaW50U2VydmljZSIsIC8vIGhhbmRoZWxkX3N5c3RlbQorICAgICAgICAgICAgICAgICJDYWxlbmRhclByb3ZpZGVyIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICAgICAgICAgIkNhbGxMb2dCYWNrdXAiLCAvLyB0ZWxlcGhvbnlfc3lzdGVtCisgICAgICAgICAgICAgICAgIkNhbWVyYUV4dGVuc2lvbnNQcm94eSIsIC8vIGhhbmRoZWxkX3N5c3RlbQorICAgICAgICAgICAgICAgICJDYXB0aXZlUG9ydGFsTG9naW4iLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiQ2FycmllckRlZmF1bHRBcHAiLCAvLyB0ZWxlcGhvbnlfc3lzdGVtCisgICAgICAgICAgICAgICAgIkNlbGxCcm9hZGNhc3RMZWdhY3lBcHAiLCAvLyB0ZWxlcGhvbnlfc3lzdGVtCisgICAgICAgICAgICAgICAgIkNlcnRJbnN0YWxsZXIiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiQ29tcGFuaW9uRGV2aWNlTWFuYWdlciIsIC8vIG1lZGlhX3N5c3RlbQorICAgICAgICAgICAgICAgICJDb250YWN0c1Byb3ZpZGVyIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiQ3JlZGVudGlhbE1hbmFnZXIiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiRGV2aWNlQXNXZWJjYW0iLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiRGV2aWNlRGlhZ25vc3RpY3MiLCAvLyBoYW5kaGVsZF9zeXN0ZW0gLSBpbnRlcm5hbAorICAgICAgICAgICAgICAgICJEb2N1bWVudHNVSSIsIC8vIGhhbmRoZWxkX3N5c3RlbQorICAgICAgICAgICAgICAgICJEb3dubG9hZFByb3ZpZGVyIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiRG93bmxvYWRQcm92aWRlclVpIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICAgICAgICAgIkR5bmFtaWNTeXN0ZW1JbnN0YWxsYXRpb25TZXJ2aWNlIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiRTJlZUNvbnRhY3RLZXlzUHJvdmlkZXIiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJFYXN0ZXJFZ2ciLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiRXh0U2hhcmVkIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiRXh0ZXJuYWxTdG9yYWdlUHJvdmlkZXIiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiRnVzZWRMb2NhdGlvbiIsIC8vIGhhbmRoZWxkX3N5c3RlbQorICAgICAgICAgICAgICAgICJIVE1MVmlld2VyIiwgLy8gbWVkaWFfc3lzdGVtCisgICAgICAgICAgICAgICAgIklucHV0RGV2aWNlcyIsIC8vIGhhbmRoZWxkX3N5c3RlbQorICAgICAgICAgICAgICAgICJJbnRlbnRSZXNvbHZlciIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgIktleUNoYWluIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICAgICAgICAgIkxpdmVXYWxscGFwZXJzUGlja2VyIiwgLy8gZ2VuZXJpY19zeXN0ZW0sIGZ1bGxfYmFzZQorICAgICAgICAgICAgICAgICJMb2NhbFRyYW5zcG9ydCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgIk1hbmFnZWRQcm92aXNpb25pbmciLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiTWVkaWFQcm92aWRlckxlZ2FjeSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgIk1tc1NlcnZpY2UiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiTXRwU2VydmljZSIsIC8vIGhhbmRoZWxkX3N5c3RlbQorICAgICAgICAgICAgICAgICJNdXNpY0ZYIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICAgICAgICAgIk5ldHdvcmtTdGFjayIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgIk9OUyIsIC8vIHRlbGVwaG9ueV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiUGFjUHJvY2Vzc29yIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICAgICAgICAgIlBhY2thZ2VJbnN0YWxsZXIiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJQYXJ0bmVyQm9va21hcmtzUHJvdmlkZXIiLCAvLyBnZW5lcmljX3N5c3RlbQorICAgICAgICAgICAgICAgICJQcmludFJlY29tbWVuZGF0aW9uU2VydmljZSIsIC8vIGhhbmRoZWxkX3N5c3RlbQorICAgICAgICAgICAgICAgICJQcmludFNwb29sZXIiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiUHJveHlIYW5kbGVyIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICAgICAgICAgIlNlY3VyZUVsZW1lbnQiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiU2V0dGluZ3NQcm92aWRlciIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgIlNoYXJlZFN0b3JhZ2VCYWNrdXAiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiU2hlbGwiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJTaW1BcHBEaWFsb2ciLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiU291bmRQaWNrZXIiLCAvLyBub3QgaW5zdGFsbGVkIGJ5IGFueW9uZQorICAgICAgICAgICAgICAgICJTdGF0ZW1lbnRTZXJ2aWNlIiwgLy8gbWVkaWFfc3lzdGVtCisgICAgICAgICAgICAgICAgIlN0ayIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICAgICAgICAgIlRhZyIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICAgICAgICAgIlRlbGVTZXJ2aWNlIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICAgICAgICAgIlRlbGVjb20iLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiVGVsZXBob255UHJvdmlkZXIiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiVHJhY2V1ciIsIC8vIGhhbmRoZWxkX3N5c3RlbQorICAgICAgICAgICAgICAgICJVc2VyRGljdGlvbmFyeVByb3ZpZGVyIiwgLy8gaGFuZGhlbGRfc3lzdGVtCisgICAgICAgICAgICAgICAgIlZwbkRpYWxvZ3MiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiV2FsbHBhcGVyQmFja3VwIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiYWRiZF9zeXN0ZW1fYXBpIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5oaWRsLmJhc2UtVjEuMC1qYXZhIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5oaWRsLm1hbmFnZXItVjEuMC1qYXZhIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiYW5kcm9pZC50ZXN0LmJhc2UiLCAvLyBmcm9tIHJ1bnRpbWVfbGliYXJ0CisgICAgICAgICAgICAgICAgImFuZHJvaWQudGVzdC5tb2NrIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiYW5kcm9pZC50ZXN0LnJ1bm5lciIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImFvc3BfbWFpbmxpbmVfbW9kdWxlcyIsIC8vIG9rCisgICAgICAgICAgICAgICAgImJ1aWxkX2ZsYWdfc3lzdGVtIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiY2hhcmdlcl9yZXNfaW1hZ2VzIiwgLy8gZ2VuZXJpY19zeXN0ZW0KKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYXBleC5jdHMuc2hpbS52MV9wcmVidWlsdCIsIC8vIG9rCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmNlbGxicm9hZGNhc3QiLCAvLyB0ZWxlcGhvbnlfc3lzdGVtCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmZ1dHVyZS51c2IuYWNjZXNzb3J5IiwgLy8gbWVkaWFfc3lzdGVtCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmxvY2F0aW9uLnByb3ZpZGVyIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQubWVkaWEucmVtb3RlZGlzcGxheSIsIC8vIG1lZGlhX3N5c3RlbQorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYS5yZW1vdGVkaXNwbGF5LnhtbCIsIC8vIG1lZGlhX3N5c3RlbQorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5tZWRpYWRybS5zaWduZXIiLCAvLyBtZWRpYV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQubmZjX2V4dHJhcyIsIC8vIG9rCisgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLm5mY3NlcnZpY2VzIiwgLy8gYmFzZV9zeXN0ZW0gKFJFTEVBU0VfUEFDS0FHRV9ORkNfU1RBQ0sgIT0gTmZjTmNpKQorICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5ydW50aW1lIiwgLy8gb2sKKyAgICAgICAgICAgICAgICAiZGV4X2Jvb3RqYXJzIiwKKyAgICAgICAgICAgICAgICAiZXh0IiwgLy8gZnJvbSBydW50aW1lX2xpYmFydAorICAgICAgICAgICAgICAgICJmcmFtZXdvcmstZ3JhcGhpY3MiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJmcmFtZXdvcmstbG9jYXRpb24iLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJmcmFtZXdvcmstbWludXMtYXBleC1pbnN0YWxsLWRlcGVuZGVuY2llcyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImZyYW1ld29ya19jb21wYXRpYmlsaXR5X21hdHJpeC5kZXZpY2UueG1sIiwKKyAgICAgICAgICAgICAgICAiZ2VuZXJpY19zeXN0ZW1fZm9udHMiLCAvLyBvaworICAgICAgICAgICAgICAgICJod3NlcnZpY2VtYW5hZ2VyX2NvbXBhdF9zeW1saW5rX21vZHVsZSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImh5cGgtZGF0YSIsCisgICAgICAgICAgICAgICAgImltcy1jb21tb24iLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJpbml0X3N5c3RlbSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImphdmF4Lm9iZXgiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsbG5kay5saWJyYXJpZXMudHh0IiwgLy9vaworICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLmh0dHAubGVnYWN5IiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAicGVyZmV0dG8tZXh0cmFzIiwgLy8gc3lzdGVtCisgICAgICAgICAgICAgICAgInNhbml0aXplci5saWJyYXJpZXMudHh0IiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAic2VsaW51eF9wb2xpY3lfc3lzdGVtX3Nvb25nIiwgLy8gb2sKKyAgICAgICAgICAgICAgICAic2VydmljZXMiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJzaGVsbF9hbmRfdXRpbGl0aWVzX3N5c3RlbSIsIC8vIG9rCisgICAgICAgICAgICAgICAgInN5c3RlbS1idWlsZC5wcm9wIiwKKyAgICAgICAgICAgICAgICAic3lzdGVtX2NvbXBhdGliaWxpdHlfbWF0cml4LnhtbCIsIC8vYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAidGVsZXBob255LWNvbW1vbiIsIC8vIGxpYnMgZnJvbSBUZWxlU2VydmljZQorICAgICAgICAgICAgICAgICJ2b2lwLWNvbW1vbiIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICBdICsgc2VsZWN0KHNvb25nX2NvbmZpZ192YXJpYWJsZSgiQU5EUk9JRCIsICJyZWxlYXNlX2NyYXNocmVjb3ZlcnlfbW9kdWxlIiksIHsKKyAgICAgICAgICAgICAgICAidHJ1ZSI6IFsKKyAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmNyYXNocmVjb3ZlcnkiLCAvLyBiYXNlX3N5c3RlbSAoUkVMRUFTRV9DUkFTSFJFQ09WRVJZX01PRFVMRSkKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFtdLAorICAgICAgICAgICAgfSkgKyBzZWxlY3Qoc29vbmdfY29uZmlnX3ZhcmlhYmxlKCJBTkRST0lEIiwgInJlbGVhc2VfcGFja2FnZV9wcm9maWxpbmdfbW9kdWxlIiksIHsKKyAgICAgICAgICAgICAgICAidHJ1ZSI6IFsKKyAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLnByb2ZpbGluZyIsIC8vIGJhc2Vfc3lzdGVtIChSRUxFQVNFX1BBQ0tBR0VfUFJPRklMSU5HX01PRFVMRSkKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFtdLAorICAgICAgICAgICAgfSkgKyBzZWxlY3QocmVsZWFzZV9mbGFnKCJSRUxFQVNFX01PVkVfVkNOX1RPX01BSU5MSU5FIiksIHsKKyAgICAgICAgICAgICAgICB0cnVlOiBbXSwKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBbCisgICAgICAgICAgICAgICAgICAgICJmcmFtZXdvcmstY29ubmVjdGl2aXR5LWIiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICB9KSArIHNlbGVjdChyZWxlYXNlX2ZsYWcoIlJFTEVBU0VfVVBST0JFU1RBVFNfTU9EVUxFIiksIHsKKyAgICAgICAgICAgICAgICB0cnVlOiBbCisgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC51cHJvYmVzdGF0cyIsIC8vIGJhc2Vfc3lzdGVtIChSRUxFQVNFX1VQUk9CRVNUQVRTX01PRFVMRSkKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFtdLAorICAgICAgICAgICAgfSksCisgICAgICAgIH0sCisgICAgICAgIHByZWZlcjMyOiB7CisgICAgICAgICAgICBkZXBzOiBbCisgICAgICAgICAgICAgICAgImRybXNlcnZlciIsIC8vIG1lZGlhX3N5c3RlbQorICAgICAgICAgICAgICAgICJtZWRpYXNlcnZlciIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICBdLAorICAgICAgICB9LAorICAgICAgICBsaWI2NDogeworICAgICAgICAgICAgZGVwczogWworICAgICAgICAgICAgICAgICJhbmRyb2lkLnN5c3RlbS52aXJ0dWFsaXphdGlvbmNvbW1vbi1uZGsiLAorICAgICAgICAgICAgICAgICJhbmRyb2lkLnN5c3RlbS52aXJ0dWFsaXphdGlvbnNlcnZpY2UtbmRrIiwKKyAgICAgICAgICAgICAgICAibGliZ3NpIiwKKyAgICAgICAgICAgICAgICAic2VydmljZW1hbmFnZXIiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICAgICAgYm90aDogeworICAgICAgICAgICAgZGVwczogWworICAgICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmJpb21ldHJpY3MuZmluZ2VycHJpbnRAMi4xIiwgLy8gZ2VuZXJpY19zeXN0ZW0KKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5yYWRpby5jb25maWdAMS4wIiwgLy8gZ2VuZXJpY19zeXN0ZW0KKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5yYWRpby5kZXByZWNhdGVkQDEuMCIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUucmFkaW9AMS4wIiwgLy8gZ2VuZXJpY19zeXN0ZW0KKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5yYWRpb0AxLjEiLCAvLyBnZW5lcmljX3N5c3RlbQorICAgICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnJhZGlvQDEuMiIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUucmFkaW9AMS4zIiwgLy8gZ2VuZXJpY19zeXN0ZW0KKyAgICAgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5yYWRpb0AxLjQiLCAvLyBnZW5lcmljX3N5c3RlbQorICAgICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnNlY3VyZV9lbGVtZW50QDEuMCIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICAgICAgICAgImFwcF9wcm9jZXNzIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAiYm9yaW5nc3NsX3NlbGZfdGVzdCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImhlYXBwcm9mZF9jbGllbnQiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJFR0wiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJFR0xfYW5nbGUiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJFVEMxIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGliRkZURW0iLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJHTEVTdjFfQ00iLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJHTEVTdjFfQ01fYW5nbGUiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJHTEVTdjIiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJHTEVTdjJfYW5nbGUiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJHTEVTdjMiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJPcGVuTUFYQUwiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJPcGVuU0xFUyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYmFhdWRpbyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYmFsYXJtX2puaSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYmFtaWRpIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGliYW5kcm9pZCIsCisgICAgICAgICAgICAgICAgImxpYmFuZHJvaWRfcnVudGltZSIsCisgICAgICAgICAgICAgICAgImxpYmFuZHJvaWRfc2VydmVycyIsCisgICAgICAgICAgICAgICAgImxpYmFuZHJvaWRmdyIsCisgICAgICAgICAgICAgICAgImxpYmFydHBhbGV0dGUtc3lzdGVtIiwKKyAgICAgICAgICAgICAgICAibGliYXVkaW8tcmVzYW1wbGVyIiwgLy8gZ2VuZXJpYy1zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGliYXVkaW9lZmZlY3Rfam5pIiwKKyAgICAgICAgICAgICAgICAibGliYXVkaW9oYWwiLCAvLyBnZW5lcmljLXN5c3RlbQorICAgICAgICAgICAgICAgICJsaWJhdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYWJsZSIsIC8vIGdlbmVyaWMtc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICAgICAgICAgImxpYmJpbmRlcl9uZGsiLAorICAgICAgICAgICAgICAgICJsaWJiaW5kZXJfcnBjX3Vuc3RhYmxlIiwKKyAgICAgICAgICAgICAgICAibGliY2FtZXJhMm5kayIsCisgICAgICAgICAgICAgICAgImxpYmNncm91cHJjIiwgLy8gbGxuZGsgbGlicmFyeQorICAgICAgICAgICAgICAgICJsaWJjbGFuZ19ydC5hc2FuIiwKKyAgICAgICAgICAgICAgICAibGliY29tcGlsZXJfcnQiLAorICAgICAgICAgICAgICAgICJsaWJjdXRpbHMiLCAvLyB1c2VkIGJ5IG1hbnkgbGlicworICAgICAgICAgICAgICAgICJsaWJkbWFidWZoZWFwIiwgLy8gdXNlZCBieSBtYW55IGxpYnMKKyAgICAgICAgICAgICAgICAibGliZHJtIiwgLy8gdXNlZCBieSBtYW55IGxpYnMgLy8gZ2VuZXJpY19zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGliZHJtZnJhbWV3b3JrIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGliZHJtZnJhbWV3b3JrX2puaSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYmZkdHJhY2siLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJmaWx0ZXJmdyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYmZpbHRlcnBhY2tfaW1hZ2Vwcm9jIiwgLy8gbWVkaWFfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYmZ3ZGxvY2tlbmdpbmUiLCAvLyBnZW5lcmljX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJnYXRla2VlcGVyIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGliZ3VpIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGliaGFyZHdhcmUiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJoYXJkd2FyZV9sZWdhY3kiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwgLy8gZ2VuZXJpY19zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGliaHdiaW5kZXIiLCAvLyBnZW5lcmljX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJpbnB1dCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYmlucHV0ZmxpbmdlciIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYmlwcm91dGV1dGlsIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGliam5pZ3JhcGhpY3MiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJqcGVnIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlibG9nIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlibG9nd3JhcCIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYmx6NCIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYm1lZGlhIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlibWVkaWFfam5pIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlibWVkaWFuZGsiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJtaW51aSIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYm1vbmtleV9qbmkiLCAvLyBiYXNlX3N5c3RlbSAtIGludGVybmFsCisgICAgICAgICAgICAgICAgImxpYm10cCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYm5ldGRfY2xpZW50IiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlibmV0bGluayIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYm5ldHV0aWxzIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlibmV1cmFsbmV0d29ya3NfcGFja2FnZWluZm8iLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJubCIsIC8vIGdlbmVyaWNfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYnBkZml1bSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYnBvbGljeS1zdWJzeXN0ZW0iLCAvLyBnZW5lcmljX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJwb3dlciIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYnBvd2VybWFuYWdlciIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYnByb3RvYnVmLWNwcC1mdWxsIiwgLy8gZ2VuZXJpY19zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlicmFkaW9fbWV0YWRhdGEiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJyc19qbmkiLCAvLyBoYW5kaGVsZF9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlicnRwX2puaSIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYnNlbnNvcnNlcnZpY2UiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJzZnBsdWdpbl9jY29kZWMiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJza2lhIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlic29uaWMiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJzb25pdm94IiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlic291bmRwb29sIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlic3BlZXhyZXNhbXBsZXIiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJzcWxpdGUiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJzdGFnZWZyaWdodCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJzdGRjKysiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJzeXN1dGlscyIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYnVpIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlidXNiaG9zdCIsIC8vIGJhc2Vfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYnV0aWxzIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlidmVuZG9yc3VwcG9ydCIsIC8vIGxsbmRrIGxpYnJhcnkKKyAgICAgICAgICAgICAgICAibGlidmludGZfam5pIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlidnVsa2FuIiwgLy8gYmFzZV9zeXN0ZW0KKyAgICAgICAgICAgICAgICAibGlid2Vidmlld2Nocm9taXVtX2xvYWRlciIsIC8vIG1lZGlhX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaWJ3ZWJ2aWV3Y2hyb21pdW1fcGxhdF9zdXBwb3J0IiwgLy8gbWVkaWFfc3lzdGVtCisgICAgICAgICAgICAgICAgImxpYndpbGhlbG0iLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgICAgICJsaW5rZXIiLCAvLyBiYXNlX3N5c3RlbQorICAgICAgICAgICAgXSArIHNlbGVjdChzb29uZ19jb25maWdfdmFyaWFibGUoIkFORFJPSUQiLCAiVEFSR0VUX0RZTkFNSUNfNjRfMzJfRFJNU0VSVkVSIiksIHsKKyAgICAgICAgICAgICAgICAidHJ1ZSI6IFsiZHJtc2VydmVyIl0sCisgICAgICAgICAgICAgICAgZGVmYXVsdDogW10sCisgICAgICAgICAgICB9KSArIHNlbGVjdChzb29uZ19jb25maWdfdmFyaWFibGUoIkFORFJPSUQiLCAiVEFSR0VUX0RZTkFNSUNfNjRfMzJfTUVESUFTRVJWRVIiKSwgeworICAgICAgICAgICAgICAgICJ0cnVlIjogWyJtZWRpYXNlcnZlciJdLAorICAgICAgICAgICAgICAgIGRlZmF1bHQ6IFtdLAorICAgICAgICAgICAgfSkgKyBzZWxlY3QocmVsZWFzZV9mbGFnKCJSRUxFQVNFX1VQUk9CRVNUQVRTX01PRFVMRSIpLCB7CisgICAgICAgICAgICAgICAgdHJ1ZTogW10sCisgICAgICAgICAgICAgICAgZGVmYXVsdDogWworICAgICAgICAgICAgICAgICAgICAibGlidXByb2Jlc3RhdHNfY2xpZW50IiwgLy8gYmFzZV9zeXN0ZW0gaW50ZXJuYWwKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgfSksCisgICAgICAgIH0sCisgICAgfSwKKyAgICBhcmNoOiB7CisgICAgICAgIGFybTY0OiB7CisgICAgICAgICAgICBkZXBzOiBbCisgICAgICAgICAgICAgICAgImxpYmNsYW5nX3J0Lmh3YXNhbiIsCisgICAgICAgICAgICAgICAgImxpYmNfaHdhc2FuIiwKKyAgICAgICAgICAgIF0sCisgICAgICAgIH0sCisgICAgfSwKK30KKworYW5kcm9pZF9zeXN0ZW1faW1hZ2UgeworICAgIG5hbWU6ICJhb3NwX3NoYXJlZF9zeXN0ZW1faW1hZ2UiLAorICAgIGRlZmF1bHRzOiBbInN5c3RlbV9pbWFnZV9kZWZhdWx0cyJdLAorICAgIGRpcnM6IGFuZHJvaWRfcm9vdGRpcnMsCisgICAgc3ltbGlua3M6IGFuZHJvaWRfc3ltbGlua3MsCisgICAgdHlwZTogImVyb2ZzIiwKKyAgICBlcm9mczogeworICAgICAgICBjb21wcmVzc29yOiAibHo0aGMsOSIsCisgICAgICAgIGNvbXByZXNzX2hpbnRzOiAiZXJvZnNfY29tcHJlc3NfaGludHMudHh0IiwKKyAgICB9LAorICAgIGRlcHM6IFsKKyAgICAgICAgLy8gRE8gTk9UIHVwZGF0ZSB0aGlzIGxpc3QuIEluc3RlYWQsIHVwZGF0ZSB0aGUgc3lzdGVtX2ltYWdlX2RlZmF1bHRzIHRvCisgICAgICAgIC8vIHN5bmMgd2l0aCB0aGUgYmFzZV9zeXN0ZW0ubWsKKyAgICAgICAgImxvZ3BlcnNpc3Quc3RhcnQiLCAvLyBjZiBvbmx5CisgICAgXSwKK30KZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2dlbmVyaWMvT1dORVJTIGIvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpYy9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQxNDQ2ZgotLS0gL2Rldi9udWxsCisrKyBiL3RhcmdldC9wcm9kdWN0L2dlbmVyaWMvT1dORVJTCkBAIC0wLDAgKzEsNiBAQAorIyBCdWcgY29tcG9uZW50OiAxMzIyNzEzCitpbnNlb2JAZ29vZ2xlLmNvbQoramVvbmdpa0Bnb29nbGUuY29tCitqaXlvbmdAZ29vZ2xlLmNvbQoranVzdGlueXVuQGdvb2dsZS5jb20KK2tpeW91bmdraW1AZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpYy9lcm9mc19jb21wcmVzc19oaW50cy50eHQgYi90YXJnZXQvcHJvZHVjdC9nZW5lcmljL2Vyb2ZzX2NvbXByZXNzX2hpbnRzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjJhNzExCi0tLSAvZGV2L251bGwKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpYy9lcm9mc19jb21wcmVzc19oaW50cy50eHQKQEAgLTAsMCArMSBAQAorMCAuKlwuYXBleCQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9nZW5lcmljX3JhbWRpc2subWsgYi90YXJnZXQvcHJvZHVjdC9nZW5lcmljX3JhbWRpc2subWsKaW5kZXggZWJhYzYyZi4uMzIyNzdlYyAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvZ2VuZXJpY19yYW1kaXNrLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2dlbmVyaWNfcmFtZGlzay5tawpAQCAtMjMsNiArMjMsOCBAQAogUFJPRFVDVF9QQUNLQUdFUyArPSBcCiAgICAgaW5pdF9maXJzdF9zdGFnZSBcCiAgICAgc25hcHVzZXJkX3JhbWRpc2sgXAorICAgIHJhbWRpc2stYnVpbGQucHJvcCBcCisgICAgdG9vbGJveF9yYW1kaXNrIFwKIAogIyBEZWJ1ZyByYW1kaXNrCiBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKQEAgLTM1LDggKzM3LDYgQEAKIF9teV9wYXRocyA6PSBcCiAgICAgJChUQVJHRVRfQ09QWV9PVVRfUkFNRElTSykvIFwKICAgICAkKFRBUkdFVF9DT1BZX09VVF9ERUJVR19SQU1ESVNLKS8gXAotICAgIHN5c3RlbS91c3Ivc2hhcmUvem9uZWluZm8vdHpfdmVyc2lvbiBcCi0gICAgc3lzdGVtL3Vzci9zaGFyZS96b25laW5mby90emRhdGEgXAogICAgICQoVEFSR0VUX0NPUFlfT1VUX1JFQ09WRVJZKS9yb290L2ZpcnN0X3N0YWdlX3JhbWRpc2svc3lzdGVtIFwKIAogCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9nZW5lcmljX3N5c3RlbS5tayBiL3RhcmdldC9wcm9kdWN0L2dlbmVyaWNfc3lzdGVtLm1rCmluZGV4IDBhMDllYjEuLjI0ODJhZmMgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2dlbmVyaWNfc3lzdGVtLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2dlbmVyaWNfc3lzdGVtLm1rCkBAIC0zNiwxMSArMzYsNiBAQAogICAgIFN0ayBcCiAgICAgVGFnIFwKIAotaWZlcSAoJChSRUxFQVNFX0FWQVRBUl9QSUNLRVJfQVBQKSx0cnVlKQotICBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKLSAgICBBdmF0YXJQaWNrZXIKLWVuZGlmCi0KICMgT1RBIHN1cHBvcnQKIFBST0RVQ1RfUEFDS0FHRVMgKz0gXAogICAgIHJlY292ZXJ5LXJlZnJlc2ggXApAQCAtMTUyLDQgKzE0Nyw1IEBACiAkKGNhbGwgcmVxdWlyZS1hcnRpZmFjdHMtaW4tcGF0aCwgJChfbXlfcGF0aHMpLCAkKF9teV9hbGxvd2VkX2xpc3QpKQogCiAjIFByb2R1Y3QgY29uZmlnIG1hcCB0byB0b2dnbGUgYmV0d2VlbiBzb3VyY2VzIGFuZCBwcmVidWlsdHMgb2YgcmVxdWlyZWQgbWFpbmxpbmUgbW9kdWxlcworUFJPRFVDVF9SRUxFQVNFX0NPTkZJR19NQVBTICs9ICQod2lsZGNhcmQgYnVpbGQvcmVsZWFzZS9nbXNfbWFpbmxpbmUvcmVxdWlyZWQvcmVsZWFzZV9jb25maWdfbWFwLnRleHRwcm90bykKIFBST0RVQ1RfUkVMRUFTRV9DT05GSUdfTUFQUyArPSAkKHdpbGRjYXJkIHZlbmRvci9nb29nbGVfc2hhcmVkL2J1aWxkL3JlbGVhc2UvZ21zX21haW5saW5lL3JlcXVpcmVkL3JlbGVhc2VfY29uZmlnX21hcC50ZXh0cHJvdG8pCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9nb19kZWZhdWx0cy5tayBiL3RhcmdldC9wcm9kdWN0L2dvX2RlZmF1bHRzLm1rCmluZGV4IGM5Mjg1MzAuLmNjYzRmMzYgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2dvX2RlZmF1bHRzLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2dvX2RlZmF1bHRzLm1rCkBAIC0xOCw2ICsxOCw3IEBACiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCBidWlsZC9tYWtlL3RhcmdldC9wcm9kdWN0L2dvX2RlZmF1bHRzX2NvbW1vbi5taykKIAogIyBQcm9kdWN0IGNvbmZpZyBtYXAgdG8gdG9nZ2xlIGJldHdlZW4gc291cmNlcyBhbmQgcHJlYnVpbHRzIG9mIHJlcXVpcmVkIG1haW5saW5lIG1vZHVsZXMKK1BST0RVQ1RfUkVMRUFTRV9DT05GSUdfTUFQUyArPSAkKHdpbGRjYXJkIGJ1aWxkL3JlbGVhc2UvZ21zX21haW5saW5lX2dvL3JlcXVpcmVkL3JlbGVhc2VfY29uZmlnX21hcC50ZXh0cHJvdG8pCiBQUk9EVUNUX1JFTEVBU0VfQ09ORklHX01BUFMgKz0gJCh3aWxkY2FyZCB2ZW5kb3IvZ29vZ2xlX3NoYXJlZC9idWlsZC9yZWxlYXNlL2dtc19tYWlubGluZV9nby9yZXF1aXJlZC9yZWxlYXNlX2NvbmZpZ19tYXAudGV4dHByb3RvKQogCiAjIEFkZCB0aGUgc3lzdGVtIHByb3BlcnRpZXMuCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9nb19kZWZhdWx0c19jb21tb24ubWsgYi90YXJnZXQvcHJvZHVjdC9nb19kZWZhdWx0c19jb21tb24ubWsKaW5kZXggZmQ0MDQ3YS4uMGZjZjE2YiAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvZ29fZGVmYXVsdHNfY29tbW9uLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2dvX2RlZmF1bHRzX2NvbW1vbi5tawpAQCAtMjQsMTEgKzI0LDYgQEAKICMgU3BlZWQgcHJvZmlsZSBzZXJ2aWNlcyBhbmQgd2lmaS1zZXJ2aWNlIHRvIHJlZHVjZSBSQU0gYW5kIHN0b3JhZ2UuCiBQUk9EVUNUX1NZU1RFTV9TRVJWRVJfQ09NUElMRVJfRklMVEVSIDo9IHNwZWVkLXByb2ZpbGUKIAotIyBVc2UgYSBwcm9maWxlIGJhc2VkIGJvb3QgaW1hZ2UgZm9yIHRoaXMgZGV2aWNlLiBOb3RlIHRoYXQgdGhpcyBpcyBjdXJyZW50bHkgYQotIyBnZW5lcmljIHByb2ZpbGUgYW5kIG5vdCBBbmRyb2lkIEdvIG9wdGltaXplZC4KLVBST0RVQ1RfVVNFX1BST0ZJTEVfRk9SX0JPT1RfSU1BR0UgOj0gdHJ1ZQotUFJPRFVDVF9ERVhfUFJFT1BUX0JPT1RfSU1BR0VfUFJPRklMRV9MT0NBVElPTiA6PSBmcmFtZXdvcmtzL2Jhc2UvY29uZmlnL2Jvb3QtaW1hZ2UtcHJvZmlsZS50eHQKLQogIyBEbyBub3QgZ2VuZXJhdGUgbGliYXJ0ZC4KIFBST0RVQ1RfQVJUX1RBUkdFVF9JTkNMVURFX0RFQlVHX0JVSUxEIDo9IGZhbHNlCiAKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2dzaS9BbmRyb2lkLmJwIGIvdGFyZ2V0L3Byb2R1Y3QvZ3NpL0FuZHJvaWQuYnAKaW5kZXggNDViYTE0My4uOGMyMDBhMSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvZ3NpL0FuZHJvaWQuYnAKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvZ3NpL0FuZHJvaWQuYnAKQEAgLTQ2LDMgKzQ2LDE3NyBAQAogICAgIGluc3RhbGxlZF9sb2NhdGlvbjogImV0Yy9pbml0L2NvbmZpZyIsCiAgICAgc3ltbGlua190YXJnZXQ6ICIvc3lzdGVtL3N5c3RlbV9leHQvZXRjL2luaXQvY29uZmlnIiwKIH0KKworLy8gaW5pdC5nc2kucmMsIEdTSS1zcGVjaWZpYyBpbml0IHNjcmlwdC4KK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImluaXQuZ3NpLnJjIiwKKyAgICBzcmM6ICJpbml0LmdzaS5yYyIsCisgICAgc3lzdGVtX2V4dF9zcGVjaWZpYzogdHJ1ZSwKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJpbml0IiwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiaW5pdC52bmRrLW5vZGVmLnJjIiwKKyAgICBzcmM6ICJpbml0LnZuZGstbm9kZWYucmMiLAorICAgIHN5c3RlbV9leHRfc3BlY2lmaWM6IHRydWUsCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiZ3NpIiwKK30KKworZ3NpX3N5bWxpbmtzID0gWworICAgIHsKKyAgICAgICAgdGFyZ2V0OiAiL3N5c3RlbS9zeXN0ZW1fZXh0IiwKKyAgICAgICAgbmFtZTogInN5c3RlbV9leHQiLAorICAgIH0sCisgICAgeworICAgICAgICB0YXJnZXQ6ICIvc3lzdGVtL3Byb2R1Y3QiLAorICAgICAgICBuYW1lOiAicHJvZHVjdCIsCisgICAgfSwKKyAgICB7CisgICAgICAgIHRhcmdldDogIi9vZG0vb2RtX2Rsa20vZXRjIiwKKyAgICAgICAgbmFtZTogIm9kbV9kbGttL2V0YyIsCisgICAgfSwKKyAgICB7CisgICAgICAgIHRhcmdldDogIi92ZW5kb3IvdmVuZG9yX2Rsa20vZXRjIiwKKyAgICAgICAgbmFtZTogInZlbmRvcl9kbGttL2V0YyIsCisgICAgfSwKK10KKworYW5kcm9pZF9maWxlc3lzdGVtX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiYW5kcm9pZF9nc2lfZGVmYXVsdHMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJzeXN0ZW1faW1hZ2VfZGVmYXVsdHMiLAorICAgICAgICAic3lzdGVtX2V4dF9pbWFnZV9kZWZhdWx0cyIsCisgICAgICAgICJwcm9kdWN0X2ltYWdlX2RlZmF1bHRzIiwKKyAgICBdLAorICAgIHN5bWxpbmtzOiBnc2lfc3ltbGlua3MsCisgICAgZGlyczogWyJjYWNoZSJdLAorICAgIGRlcHM6IFsKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAvLyBnc2lfc3lzdGVtX2V4dAorICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKyAgICAgICAgLy8gaGFuZGhlbGQgcGFja2FnZXMKKyAgICAgICAgIkxhdW5jaGVyM1F1aWNrU3RlcCIsCisgICAgICAgICJQcm92aXNpb24iLAorICAgICAgICAiU2V0dGluZ3MiLAorICAgICAgICAiU3RvcmFnZU1hbmFnZXIiLAorICAgICAgICAiU3lzdGVtVUkiLAorCisgICAgICAgIC8vIHRlbGVwaG9ueSBwYWNrYWdlcworICAgICAgICAiQ2FycmllckNvbmZpZyIsCisKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAvLyBnc2lfcmVsZWFzZQorICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICJnc2lfc2tpcF9tb3VudC5jZmciLAorICAgICAgICAiaW5pdC5nc2kucmMiLAorICAgICAgICAiaW5pdC52bmRrLW5vZGVmLnJjIiwKKyAgICAgICAgLy8gT3ZlcmxheSB0aGUgR1NJIHNwZWNpZmljIHNldHRpbmcgZm9yIGZyYW1ld29yayBhbmQgU3lzdGVtVUkKKyAgICAgICAgImdzaV9vdmVybGF5X2ZyYW1ld29yayIsCisgICAgICAgICJnc2lfb3ZlcmxheV9zeXN0ZW11aSIsCisKKyAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAvLyBWTkRLCisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgImNvbS5hbmRyb2lkLnZuZGsudjMwIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLnZuZGsudjMxIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLnZuZGsudjMyIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLnZuZGsudjMzIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLnZuZGsudjM0IiwKKworICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgIC8vIGdzaV9wcm9kdWN0CisgICAgICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyAgICAgICAgIkJyb3dzZXIyIiwKKyAgICAgICAgIkNhbWVyYTIiLAorICAgICAgICAiRGlhbGVyIiwKKyAgICAgICAgIkxhdGluSU1FIiwKKyAgICAgICAgImFwbnMtZnVsbC1jb25mLnhtbCIsCisgICAgICAgICJmcmFtZXdvcmtzLWJhc2Utb3ZlcmxheXMiLAorICAgIF0sCisgICAgbXVsdGlsaWI6IHsKKyAgICAgICAgbGliNjQ6IHsKKyAgICAgICAgICAgIGRlcHM6IFsKKyAgICAgICAgICAgICAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisgICAgICAgICAgICAgICAgLy8gQVZGCisgICAgICAgICAgICAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5jb21wb3MiLAorICAgICAgICAgICAgICAgICJmZWF0dXJlc19jb20uYW5kcm9pZC52aXJ0LnhtbCIsCisgICAgICAgICAgICBdLAorICAgICAgICB9LAorICAgICAgICBib3RoOiB7CisgICAgICAgICAgICAvLyBQUk9EVUNUX1BBQ0tBR0VTX1NISVBQSU5HX0FQSV9MRVZFTF8zNAorICAgICAgICAgICAgZGVwczogWyJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMC1pbXBsIl0sCisgICAgICAgIH0sCisgICAgfSwKKyAgICB0eXBlOiAiZXh0NCIsCit9CisKKy8vIHN5c3RlbS5pbWcgZm9yIGdzaV97YXJjaH0gdGFyZ2V0cworYW5kcm9pZF9zeXN0ZW1faW1hZ2UgeworICAgIG5hbWU6ICJhbmRyb2lkX2dzaSIsCisgICAgZGVmYXVsdHM6IFsiYW5kcm9pZF9nc2lfZGVmYXVsdHMiXSwKKyAgICBlbmFibGVkOiBzZWxlY3Qoc29vbmdfY29uZmlnX3ZhcmlhYmxlKCJBTkRST0lEIiwgIlBST0RVQ1RfSU5TVEFMTF9ERUJVR19QT0xJQ1lfVE9fU1lTVEVNX0VYVCIpLCB7CisgICAgICAgICJ0cnVlIjogdHJ1ZSwKKyAgICAgICAgZGVmYXVsdDogZmFsc2UsCisgICAgfSksCisgICAgZGVwczogWworICAgICAgICAvLyBJbnN0YWxsIGEgY29weSBvZiB0aGUgZGVidWcgcG9saWN5IHRvIHRoZSBzeXN0ZW1fZXh0IHBhcnRpdGlvbiwgYW5kIGFsbG93CisgICAgICAgIC8vIGluaXQtc2Vjb25kLXN0YWdlIHRvIGxvYWQgZGVidWcgcG9saWN5IGZyb20gc3lzdGVtX2V4dC4KKyAgICAgICAgLy8gVGhpcyBvcHRpb24gaXMgb25seSBtZWFudCB0byBiZSBzZXQgYnkgY29tcGxpYW5jZSBHU0kgdGFyZ2V0cy4KKyAgICAgICAgInN5c3RlbV9leHRfdXNlcmRlYnVnX3BsYXRfc2Vwb2xpY3kuY2lsIiwKKyAgICBdLAorfQorCisvLyBzeXN0ZW0uaW1nIGZvciBhb3NwX3thcmNofSB0YXJnZXRzCithbmRyb2lkX3N5c3RlbV9pbWFnZSB7CisgICAgbmFtZTogImFvc3Bfc3lzdGVtX2ltYWdlIiwKKyAgICBkZWZhdWx0czogWyJhbmRyb2lkX2dzaV9kZWZhdWx0cyJdLAorICAgIGRlcHM6IFsKKyAgICAgICAgLy8gaGFuZGhlbGRfc3lzdGVtX2V4dAorICAgICAgICAiQWNjZXNzaWJpbGl0eU1lbnUiLAorICAgICAgICAiV2FsbHBhcGVyQ3JvcHBlciIsCisKKyAgICAgICAgLy8gdGVsZXBob255X3N5c3RlbV9leHQKKyAgICAgICAgIkVtZXJnZW5jeUluZm8iLAorCisgICAgICAgIC8vIGhhbmRoZWxkX3Byb2R1Y3QKKyAgICAgICAgIkNhbGVuZGFyIiwKKyAgICAgICAgIkNvbnRhY3RzIiwKKyAgICAgICAgIkRlc2tDbG9jayIsCisgICAgICAgICJHYWxsZXJ5MiIsCisgICAgICAgICJNdXNpYyIsCisgICAgICAgICJwcmVpbnN0YWxsZWQtcGFja2FnZXMtcGxhdGZvcm0taGFuZGhlbGQtcHJvZHVjdC54bWwiLAorICAgICAgICAiUXVpY2tTZWFyY2hCb3giLAorICAgICAgICAiU2V0dGluZ3NJbnRlbGxpZ2VuY2UiLAorICAgICAgICAiZnJhbWV3b3Jrcy1iYXNlLW92ZXJsYXlzIiwKKworICAgICAgICAvLyB0ZWxlcGhvbnlfcHJvZHVjdAorICAgICAgICAiSW1zU2VydmljZUVudGl0bGVtZW50IiwKKyAgICAgICAgInByZWluc3RhbGxlZC1wYWNrYWdlcy1wbGF0Zm9ybS10ZWxlcGhvbnktcHJvZHVjdC54bWwiLAorCisgICAgICAgIC8vIG1vcmUgQU9TUCBwYWNrYWdlcworICAgICAgICAiaW5pdGlhbC1wYWNrYWdlLXN0b3BwZWQtc3RhdGVzLWFvc3AueG1sIiwKKyAgICAgICAgIm1lc3NhZ2luZyIsCisgICAgICAgICJQaG90b1RhYmxlIiwKKyAgICAgICAgInByZWluc3RhbGxlZC1wYWNrYWdlcy1wbGF0Zm9ybS1hb3NwLXByb2R1Y3QueG1sIiwKKyAgICAgICAgIlRoZW1lUGlja2VyIiwKKyAgICBdICsgc2VsZWN0KHByb2R1Y3RfdmFyaWFibGUoImRlYnVnZ2FibGUiKSwgeworICAgICAgICB0cnVlOiBbImZyYW1ld29ya3MtYmFzZS1vdmVybGF5cy1kZWJ1ZyJdLAorICAgICAgICBkZWZhdWx0OiBbXSwKKyAgICB9KSwKKyAgICBlbmFibGVkOiBzZWxlY3Qoc29vbmdfY29uZmlnX3ZhcmlhYmxlKCJnc2kiLCAiYnVpbGRpbmdfZ3NpIiksIHsKKyAgICAgICAgdHJ1ZTogdHJ1ZSwKKyAgICAgICAgZGVmYXVsdDogZmFsc2UsCisgICAgfSksCisgICAgbXVsdGlsaWI6IHsKKyAgICAgICAgY29tbW9uOiB7CisgICAgICAgICAgICBkZXBzOiBzZWxlY3QocmVsZWFzZV9mbGFnKCJSRUxFQVNFX0FWQVRBUl9QSUNLRVJfQVBQIiksIHsKKyAgICAgICAgICAgICAgICB0cnVlOiBbCisgICAgICAgICAgICAgICAgICAgICJBdmF0YXJQaWNrZXIiLCAvLyBoYW5kaGVsZF9zeXN0ZW1fZXh0IChSRUxFQVNFX0FWQVRBUl9QSUNLRVJfQVBQKQorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICAgICAgZGVmYXVsdDogW10sCisgICAgICAgICAgICB9KSwKKyAgICAgICAgfSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvZ3NpL2N1cnJlbnQudHh0IGIvdGFyZ2V0L3Byb2R1Y3QvZ3NpL2N1cnJlbnQudHh0CmluZGV4IGY3NzE5MTYuLmNiYjhhMGUgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L2dzaS9jdXJyZW50LnR4dAorKysgYi90YXJnZXQvcHJvZHVjdC9nc2kvY3VycmVudC50eHQKQEAgLTI0LDcgKzI0LDcgQEAKIFZOREstU1A6IGFuZHJvaWQuaGFyZHdhcmUuY29tbW9uLVYyLW5kay5zbwogVk5ESy1TUDogYW5kcm9pZC5oYXJkd2FyZS5jb21tb24uZm1xLVYxLW5kay5zbwogVk5ESy1TUDogYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5hbGxvY2F0b3ItVjItbmRrLnNvCi1WTkRLLVNQOiBhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmNvbW1vbi1WNS1uZGsuc28KK1ZOREstU1A6IGFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuY29tbW9uLVY2LW5kay5zbwogVk5ESy1TUDogYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5jb21tb25AMS4wLnNvCiBWTkRLLVNQOiBhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmNvbW1vbkAxLjEuc28KIFZOREstU1A6IGFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuY29tbW9uQDEuMi5zbwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvZ3NpX3JlbGVhc2UubWsgYi90YXJnZXQvcHJvZHVjdC9nc2lfcmVsZWFzZS5tawppbmRleCAzOTQyOGQyLi4xMTViMzU1IDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9nc2lfcmVsZWFzZS5taworKysgYi90YXJnZXQvcHJvZHVjdC9nc2lfcmVsZWFzZS5tawpAQCAtNzksOSArNzksMTUgQEAKIFBST0RVQ1RfQlVJTERfU1lTVEVNX0RMS01fSU1BR0UgOj0gZmFsc2UKIFBST0RVQ1RfRVhQT1JUX0JPT1RfSU1BR0VfVE9fRElTVCA6PSB0cnVlCiAKKyMgQnVpbGQgcHZtZncgd2l0aCBHU0k6IGIvMzc2MzYzOTg5LCBwdm1mdyBjdXJyZW50bHkgb25seSBzdXBwb3J0cyBBQXJjaDY0CitpZm5lcSAoLCQoZmlsdGVyICVfYXJtNjQsJChUQVJHRVRfUFJPRFVDVCkpKQorUFJPRFVDVF9CVUlMRF9QVk1GV19JTUFHRSA6PSB0cnVlCitlbmRpZgorCiAjIEFkZGl0aW9uYWwgc2V0dGluZ3MgdXNlZCBpbiBhbGwgR1NJIGJ1aWxkcwogUFJPRFVDVF9QUk9EVUNUX1BST1BFUlRJRVMgKz0gXAogICAgIHJvLmNyeXB0by5tZXRhZGF0YV9pbml0X2RlbGV0ZV9hbGxfa2V5cy5lbmFibGVkPWZhbHNlIFwKKyAgICBkZWJ1Zy5jb2RlYzIuYnFwb29sX2RlYWxsb2NfYWZ0ZXJfc3RvcD0xIFwKIAogIyBXaW5kb3cgRXh0ZW5zaW9ucwogaWZuZXEgKCQoUFJPRFVDVF9JU19BVFYpLHRydWUpCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9oYW5kaGVsZF9zeXN0ZW0ubWsgYi90YXJnZXQvcHJvZHVjdC9oYW5kaGVsZF9zeXN0ZW0ubWsKaW5kZXggNTQ2YmJlNy4uMmIwNTVjNyAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvaGFuZGhlbGRfc3lzdGVtLm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L2hhbmRoZWxkX3N5c3RlbS5tawpAQCAtNjksMTMgKzY5LDE5IEBACiAgICAgU2hhcmVkU3RvcmFnZUJhY2t1cCBcCiAgICAgU2ltQXBwRGlhbG9nIFwKICAgICBUZWxlY29tIFwKLSAgICBUZWxlcGhvbnlQcm92aWRlciBcCiAgICAgVGVsZVNlcnZpY2UgXAogICAgIFRyYWNldXIgXAogICAgIFVzZXJEaWN0aW9uYXJ5UHJvdmlkZXIgXAogICAgIFZwbkRpYWxvZ3MgXAogICAgIHZyIFwKIAorIyBDaG9vc2UgdGhlIGNvcnJlY3QgcHJvZHVjdHMgYmFzZWQgb24gSFNVTSBzdGF0dXMKK2lmZXEgKCQoUFJPRFVDVF9VU0VfSFNVTSksdHJ1ZSkKKyAgUFJPRFVDVF9QQUNLQUdFUyArPSBUZWxlcGhvbnlQcm92aWRlckhzdW0KK2Vsc2UKKyAgUFJPRFVDVF9QQUNLQUdFUyArPSBUZWxlcGhvbnlQcm92aWRlcgorZW5kaWYKKwogUFJPRFVDVF9QQUNLQUdFUyArPSAkKFJFTEVBU0VfUEFDS0FHRV9WSVJUVUFMX0NBTUVSQSkKICMgU2V0IHZpcnR1YWxfY2FtZXJhX3NlcnZpY2VfZW5hYmxlZCBzb29uZyBjb25maWcgdmFyaWFibGUgYmFzZWQgb24gdGhlCiAjIFJFTEVBU0VfUEFDS0FHRV9WSVJUVUFMX0NBTUVSQSBidWlsZC4gdmlydHVhbF9jYW1lcmFfc2VydmljZV9lbmFibGVkIHNvb25nIGNvbmZpZwpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvaGFuZGhlbGRfc3lzdGVtX2V4dC5tayBiL3RhcmdldC9wcm9kdWN0L2hhbmRoZWxkX3N5c3RlbV9leHQubWsKaW5kZXggMTg3YjYyNy4uNmQ2ODZjNSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvaGFuZGhlbGRfc3lzdGVtX2V4dC5taworKysgYi90YXJnZXQvcHJvZHVjdC9oYW5kaGVsZF9zeXN0ZW1fZXh0Lm1rCkBAIC0yMyw2ICsyMyw3IEBACiAjIC9zeXN0ZW1fZXh0IHBhY2thZ2VzCiBQUk9EVUNUX1BBQ0tBR0VTICs9IFwKICAgICBBY2Nlc3NpYmlsaXR5TWVudSBcCisgICAgJChpZiAkKFJFTEVBU0VfQVZBVEFSX1BJQ0tFUl9BUFApLCBBdmF0YXJQaWNrZXIsKSBcCiAgICAgTGF1bmNoZXIzUXVpY2tTdGVwIFwKICAgICBQcm92aXNpb24gXAogICAgIFNldHRpbmdzIFwKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L2hzdW1fY29tbW9uLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvaHN1bV9jb21tb24ubWsKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE5YmM2NQotLS0gL2Rldi9udWxsCisrKyBiL3RhcmdldC9wcm9kdWN0L2hzdW1fY29tbW9uLm1rCkBAIC0wLDAgKzEsMjkgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisjCisKKyMgQ29udGFpbnMgY29tbW9uIGRlZmF1bHQgZWxlbWVudHMgZm9yIGRldmljZXMgcnVubmluZyBpbiBIZWFkbGVzcyBTeXN0ZW0gVXNlciBNb2RlLgorCisjIFNob3VsZCBnZW5lcmFsbHkgYmUgaW5oZXJpdGVkIGZpcnN0IGFzIHVzaW5nIGFuIEhTVU0gY29uZmlndXJhdGlvbiBjYW4gYWZmZWN0IGRvd25zdHJlYW0gY2hvaWNlcworIyAoc3VjaCBhcyBlbnN1cmluZyB0aGF0IHRoZSBIU1VNLXZhcmlhbnRzIG9mIHBhY2thZ2VzIGFyZSBzZWxlY3RlZCkuCisKK1BST0RVQ1RfU1lTVEVNX0RFRkFVTFRfUFJPUEVSVElFUyArPSBcCisgICAgcm8uZncubXUuaGVhZGxlc3Nfc3lzdGVtX3VzZXI9dHJ1ZQorCisjIFZhcmlhYmxlIGZvciBlbHNld2hlcmUgY2hvb3NpbmcgdGhlIGFwcHJvcHJpYXRlIHByb2R1Y3RzIGJhc2VkIG9uIEhTVU0gc3RhdHVzLgorUFJPRFVDVF9VU0VfSFNVTSA6PSB0cnVlCisKK1BST0RVQ1RfUEFDS0FHRVMgKz0gXAorICAgIEhzdW1EZWZhdWx0Q29uZmlnT3ZlcmxheQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvbWVkaWFfc3lzdGVtX2V4dC5tayBiL3RhcmdldC9wcm9kdWN0L21lZGlhX3N5c3RlbV9leHQubWsKaW5kZXggMzBkZDJlMi4uMTE3OTk2NiAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvbWVkaWFfc3lzdGVtX2V4dC5taworKysgYi90YXJnZXQvcHJvZHVjdC9tZWRpYV9zeXN0ZW1fZXh0Lm1rCkBAIC0yMCw5ICsyMCwxMCBAQAogIyBiYXNlX3N5c3RlbV9leHQubWsuCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L2Jhc2Vfc3lzdGVtX2V4dC5taykKIAotIyAvc3lzdGVtX2V4dCBwYWNrYWdlcwotUFJPRFVDVF9QQUNLQUdFUyArPSBcCi0gICAgdm5ka19hcGV4X3NuYXBzaG90X3BhY2thZ2UgXAotCiAjIFdpbmRvdyBFeHRlbnNpb25zCiAkKGNhbGwgaW5oZXJpdC1wcm9kdWN0LCAkKFNSQ19UQVJHRVRfRElSKS9wcm9kdWN0L3dpbmRvd19leHRlbnNpb25zX2Jhc2UubWspCisKKyMgQXBwRnVuY3Rpb24gRXh0ZW5zaW9ucworaWZuZXEgKCwkKFJFTEVBU0VfQVBQRlVOQ1RJT05fU0lERUNBUikpCisgICAgJChjYWxsIGluaGVyaXQtcHJvZHVjdCwgJChTUkNfVEFSR0VUX0RJUikvcHJvZHVjdC9hcHBfZnVuY3Rpb25fZXh0ZW5zaW9ucy5taykKK2VuZGlmCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9ydW50aW1lX2xpYmFydC5tayBiL3RhcmdldC9wcm9kdWN0L3J1bnRpbWVfbGliYXJ0Lm1rCmluZGV4IDllOGFmYTguLjcxMTM4YWMgMTAwNjQ0Ci0tLSBhL3RhcmdldC9wcm9kdWN0L3J1bnRpbWVfbGliYXJ0Lm1rCisrKyBiL3RhcmdldC9wcm9kdWN0L3J1bnRpbWVfbGliYXJ0Lm1rCkBAIC0xNDIsNiArMTQyLDcgQEAKICAgIyBiZSB0b28gbXVjaCBvZiBhIHByb2JsZW0gZm9yIHBsYXRmb3JtIGRldmVsb3BlcnMgYmVjYXVzZSBhIGNoYW5nZSB0byBmcmFtZXdvcmsgY29kZSBzaG91bGQgbm90CiAgICMgdHJpZ2dlciBkZXhwcmVvcHQgZm9yIHRoZSBBUlQgYm9vdCBpbWFnZS4KICAgV0lUSF9ERVhQUkVPUFRfQVJUX0JPT1RfSU1HX09OTFkgOj0gdHJ1ZQorICAkKGNhbGwgc29vbmdfY29uZmlnX3NldF9ib29sLFByZWJ1aWx0R21zQ29yZSxFeGNsdWRlRXh0cmFjdEFwayx0cnVlKQogZW5kaWYKIAogIyBFbmFibGUgcmVzb2x1dGlvbiBvZiBzdGFydHVwIGNvbnN0IHN0cmluZ3MuCkBAIC0xNTcsMTUgKzE1OCwxNCBAQAogICAgIGRhbHZpay52bS5taW5pZGVidWdpbmZvPXRydWUgXAogICAgIGRhbHZpay52bS5kZXgyb2F0LW1pbmlkZWJ1Z2luZm89dHJ1ZQogCi0jIEVuYWJsZSBNYWR2aXNpbmcgb2YgdGhlIHdob2xlIGFydCwgb2RleCBhbmQgdmRleCBmaWxlcyB0byBNQURWX1dJTExORUVELgorIyBFbmFibGUgTWFkdmlzaW5nIG9mIHRoZSB3aG9sZSBvZGV4IGFuZCB2ZGV4IGZpbGVzIHRvIE1BRFZfV0lMTE5FRUQuCiAjIFRoZSBzaXplIHNwZWNpZmllZCBoZXJlIGlzIHRoZSBzaXplIGxpbWl0IG9mIGhvdyBtdWNoIG9mIHRoZSBmaWxlCiAjIChpbiBieXRlcykgaXMgbWFkdmlzZWQuCi0jIFdlIG1hZHZpc2UgdGhlIHdob2xlIC5hcnQgZmlsZSB0byBNQURWX1dJTExORUVEIHdpdGggVUlOVF9NQVggbGltaXQuCiAjIEZvciBvZGV4IGFuZCB2ZGV4IGZpbGVzLCB3ZSBsaW1pdCBtYWR2aXNpbmcgdG8gMTAwTUIuCisjIEZvciBhcnQgZmlsZXMsIHdlIGRlZmVyIHRvIHRoZSBydW50aW1lIGZvciBkZWZhdWx0IGJlaGF2aW9yLgogUFJPRFVDVF9TWVNURU1fUFJPUEVSVElFUyArPSBcCiAgICAgZGFsdmlrLnZtLm1hZHZpc2UudmRleGZpbGUuc2l6ZT0xMDQ4NTc2MDAgXAotICAgIGRhbHZpay52bS5tYWR2aXNlLm9kZXhmaWxlLnNpemU9MTA0ODU3NjAwIFwKLSAgICBkYWx2aWsudm0ubWFkdmlzZS5hcnRmaWxlLnNpemU9NDI5NDk2NzI5NQorICAgIGRhbHZpay52bS5tYWR2aXNlLm9kZXhmaWxlLnNpemU9MTA0ODU3NjAwCiAKICMgUHJvcGVydGllcyBmb3IgdGhlIFVuc3BlY2lhbGl6ZWQgQXBwIFByb2Nlc3MgUG9vbAogUFJPRFVDVF9TWVNURU1fUFJPUEVSVElFUyArPSBcCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9BbmRyb2lkLmJwIGIvdGFyZ2V0L3Byb2R1Y3Qvc2VjdXJpdHkvQW5kcm9pZC5icAppbmRleCAwZDdiMzVlLi4yMTRjMDA5IDEwMDY0NAotLS0gYS90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9BbmRyb2lkLmJwCisrKyBiL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L0FuZHJvaWQuYnAKQEAgLTMzLDcgKzMzLDE4IEBACiAvLyBpbWFnZQogb3RhY2VydHNfemlwIHsKICAgICBuYW1lOiAib3RhY2VydHMiLAotICAgIHJlY292ZXJ5X2F2YWlsYWJsZTogdHJ1ZSwKICAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJzZWN1cml0eSIsCiAgICAgZmlsZW5hbWU6ICJvdGFjZXJ0cy56aXAiLAogfQorCitvdGFjZXJ0c196aXAgeworICAgIG5hbWU6ICJvdGFjZXJ0cy5yZWNvdmVyeSIsCisgICAgcmVjb3Zlcnk6IHRydWUsCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAic2VjdXJpdHkiLAorICAgIGZpbGVuYW1lOiAib3RhY2VydHMuemlwIiwKK30KKworYWRiX2tleXMgeworICAgIG5hbWU6ICJhZGJfa2V5cyIsCisgICAgcHJvZHVjdF9zcGVjaWZpYzogdHJ1ZSwKK30KZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L0FuZHJvaWQubWsgYi90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzhlNWJiLi4wMDAwMDAwCi0tLSBhL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIGFkYiBrZXksIGlmIGNvbmZpZ3VyZWQgdmlhIFBST0RVQ1RfQURCX0tFWVMKLWlmZGVmIFBST0RVQ1RfQURCX0tFWVMKLSAgaWZuZXEgKCQoZmlsdGVyIGVuZyB1c2VyZGVidWcsJChUQVJHRVRfQlVJTERfVkFSSUFOVCkpLCkKLSAgICBpbmNsdWRlICQoQ0xFQVJfVkFSUykKLSAgICBMT0NBTF9NT0RVTEUgOj0gYWRiX2tleXMKLSAgICBMT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLSAgICBMT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi0gICAgTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotICAgIExPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLSAgICBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfUFJPRFVDVF9FVEMpL3NlY3VyaXR5Ci0gICAgTE9DQUxfUFJFQlVJTFRfTU9EVUxFX0ZJTEUgOj0gJChQUk9EVUNUX0FEQl9LRVlTKQotICAgIGluY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKLSAgZW5kaWYKLWVuZGlmCmRpZmYgLS1naXQgYS90YXJnZXQvcHJvZHVjdC9zZWN1cml0eS9CVUlMRC5iYXplbCBiL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L0JVSUxELmJhemVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTJiZTc5Li4wMDAwMDAwCi0tLSBhL3RhcmdldC9wcm9kdWN0L3NlY3VyaXR5L0JVSUxELmJhemVsCisrKyAvZGV2L251bGwKQEAgLTEsOCArMCwwIEBACi1maWxlZ3JvdXAoCi0gICAgbmFtZSA9ICJhbmRyb2lkX2NlcnRpZmljYXRlX2RpcmVjdG9yeSIsCi0gICAgc3JjcyA9IGdsb2IoWwotICAgICAgICAiKi5wazgiLAotICAgICAgICAiKi5wZW0iLAotICAgIF0pLAotICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKLSkKZGlmZiAtLWdpdCBhL3RhcmdldC9wcm9kdWN0L3ZpcnR1YWxfYWJfb3RhL2NvbXByZXNzaW9uLm1rIGIvdGFyZ2V0L3Byb2R1Y3QvdmlydHVhbF9hYl9vdGEvY29tcHJlc3Npb24ubWsKaW5kZXggZGMxZWUzZS4uZTc3YzM2ZiAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvdmlydHVhbF9hYl9vdGEvY29tcHJlc3Npb24ubWsKKysrIGIvdGFyZ2V0L3Byb2R1Y3QvdmlydHVhbF9hYl9vdGEvY29tcHJlc3Npb24ubWsKQEAgLTE4LDkgKzE4LDEyIEBACiAKIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8udmlydHVhbF9hYi5jb21wcmVzc2lvbi5lbmFibGVkPXRydWUKIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8udmlydHVhbF9hYi51c2Vyc3BhY2Uuc25hcHNob3RzLmVuYWJsZWQ9dHJ1ZQotUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSByby52aXJ0dWFsX2FiLmlvX3VyaW5nLmVuYWJsZWQ9dHJ1ZQogUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSByby52aXJ0dWFsX2FiLmJhdGNoX3dyaXRlcz10cnVlCiAKKyMgT3B0aW9uYWwgYXNzaWdubWVudC4gT24gbG93IG1lbW9yeSBkZXZpY2VzLCBkaXNhYmxpbmcgaW9fdXJpbmcgY2FuIHJlbGlldmUgY3B1IGFuZCBtZW1vcnkKKyMgcHJlc3N1cmUgZHVyaW5nIGFuIE9UQS4KK1BST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8udmlydHVhbF9hYi5pb191cmluZy5lbmFibGVkPz10cnVlCisKICMgRW5hYmxpbmcgdGhpcyBwcm9wZXJ0eSwgd2lsbCBpbXByb3ZlIE9UQSBpbnN0YWxsIHRpbWUKICMgYnV0IHdpbGwgdXNlIGFuIGFkZGl0aW9uYWwgQ1BVIGNvcmUKICMgUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSByby52aXJ0dWFsX2FiLmNvbXByZXNzaW9uLnRocmVhZHM9dHJ1ZQpkaWZmIC0tZ2l0IGEvdGFyZ2V0L3Byb2R1Y3QvdmlydHVhbF9hYl9vdGEvdmFiY19mZWF0dXJlcy5tayBiL3RhcmdldC9wcm9kdWN0L3ZpcnR1YWxfYWJfb3RhL3ZhYmNfZmVhdHVyZXMubWsKaW5kZXggZTI3NDVhMS4uZDA5MjY5OSAxMDA2NDQKLS0tIGEvdGFyZ2V0L3Byb2R1Y3QvdmlydHVhbF9hYl9vdGEvdmFiY19mZWF0dXJlcy5taworKysgYi90YXJnZXQvcHJvZHVjdC92aXJ0dWFsX2FiX290YS92YWJjX2ZlYXR1cmVzLm1rCkBAIC0zMSwxNCArMzEsMTUgQEAKIAogUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSByby52aXJ0dWFsX2FiLmNvbXByZXNzaW9uLmVuYWJsZWQ9dHJ1ZQogUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSByby52aXJ0dWFsX2FiLnVzZXJzcGFjZS5zbmFwc2hvdHMuZW5hYmxlZD10cnVlCi1QUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLnZpcnR1YWxfYWIuaW9fdXJpbmcuZW5hYmxlZD10cnVlCi1QUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLnZpcnR1YWxfYWIuY29tcHJlc3Npb24ueG9yLmVuYWJsZWQ9dHJ1ZQogUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSByby52aXJ0dWFsX2FiLmJhdGNoX3dyaXRlcz10cnVlCisKKyMgT3B0aW9uYWwgYXNzaWdubWVudHMsIGxvdyBtZW1vcnkgZGV2aWNlcyBtYXkgYmVuZWZpdCBmcm9tIG92ZXJyaWRpbmcgdGhlc2UuCitQUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLnZpcnR1YWxfYWIuaW9fdXJpbmcuZW5hYmxlZD89dHJ1ZQorUFJPRFVDVF9WRU5ET1JfUFJPUEVSVElFUyArPSByby52aXJ0dWFsX2FiLmNvbXByZXNzaW9uLnhvci5lbmFibGVkPz10cnVlCisKICMgTG93IG1lbW9yeSBkZXZpY2UgY29uZmlndXJhdGlvbnMuIElmIG1lbW9yeSB1c2FnZSBhbmQgY3B1IHV0aWxpemF0aW9uIGlzCiAjIGEgYm90dGxlbmVjayBkdXJpbmcgT1RBLCB0aGUgYmVsb3cgY29uZmlndXJhdGlvbnMgY2FuIGJlIGFkZGVkIHRvIGEKLSMgZGV2aWNlJ3MgLm1rIGZpbGUgaW1wcm92ZSBwZXJmb3JtYW5jZSBmb3IgbG93IG1lbSBkZXZpY2VzLiBEaXNhYmxpbmcKLSMgcm8udmlydHVhbF9hYi5jb21wcmVzc2lvbi54b3IuZW5hYmxlZCBhbmQgcm8udmlydHVhbF9hYi5pb191cmluZy5lbmFibGVkCi0jIGlzIGFsc28gcmVjb21tZW5kZWQKKyMgZGV2aWNlJ3MgLm1rIGZpbGUgaW1wcm92ZSBwZXJmb3JtYW5jZSBmb3IgbG93IG1lbSBkZXZpY2VzLgogIwogIyBQUk9EVUNUX1ZFTkRPUl9QUk9QRVJUSUVTICs9IHJvLnZpcnR1YWxfYWIucmVhZF9haGVhZF9zaXplPTE2CiAjIFBST0RVQ1RfVkVORE9SX1BST1BFUlRJRVMgKz0gcm8udmlydHVhbF9hYi5vX2RpcmVjdC5lbmFibGVkPXRydWUKZGlmZiAtLWdpdCBhL3RlYW1zL0FuZHJvaWQuYnAgYi90ZWFtcy9BbmRyb2lkLmJwCmluZGV4IDk0NTg1ZmMuLjg2ODkyNjcgMTAwNjQ0Ci0tLSBhL3RlYW1zL0FuZHJvaWQuYnAKKysrIGIvdGVhbXMvQW5kcm9pZC5icApAQCAtMTMsNiArMTMsOSBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKKy8vIERPTidUIEFERCBORVcgUlVMRVMgSEVSRS4gRm9yIG1vcmUgZGV0YWlscyByZWZlciB0bworLy8gZ28vbmV3LWFuZHJvaWQtb3duZXJzaGlwLW1vZGVsCisKIHBhY2thZ2UgewogICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKIH0KQEAgLTY3LDEzICs3MCw2IEBACiB9CiAKIHRlYW0gewotICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfY2xvdWRfcGxhdGZvcm0iLAotCi0gICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTkxNzc2MjUyNjI4MTcyOAotICAgIHRyZW5keV90ZWFtX2lkOiAiNTkxNzc2MjUyNjI4MTcyOCIsCi19Ci0KLXRlYW0gewogICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9waXhlbF9zeXN0ZW1fc29mdHdhcmUiLAogCiAgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDg1NjAwNTEyMDYyMjU5MgpAQCAtNTE1LDEzICs1MTEsNiBAQAogfQogCiB0ZWFtIHsKLSAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl93ZWFyX25vdGlmaWNhdGlvbnNfYWxlcnRzX2F0dGVudGlvbl9tYW5hZ2VtZW50IiwKLQotICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYyNjc2NDM2ODE5OTY4MDAKLSAgICB0cmVuZHlfdGVhbV9pZDogIjYyNjc2NDM2ODE5OTY4MDAiLAotfQotCi10ZWFtIHsKICAgICBuYW1lOiAidHJlbmR5X3RlYW1fZndrX25mYyIsCiAKICAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81OTYyMzEyNTEyODY0MjU2CkBAIC01MjksMTMgKzUxOCw2IEBACiB9CiAKIHRlYW0gewotICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3BlcnNvbmFsaXphdGlvbl9kZXZlbG9wZXJfc3VyZmFjZXMiLAotCi0gICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDgxOTg5MDk4ODgxMDI0MAotICAgIHRyZW5keV90ZWFtX2lkOiAiNDgxOTg5MDk4ODgxMDI0MCIsCi19Ci0KLXRlYW0gewogICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9zcmFqa3VtYXJfdGVhbSIsCiAKICAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTcwMDUzODk0MDEyOTI4CkBAIC02OTAsMTMgKzY3Miw2IEBACiB9CiAKIHRlYW0gewotICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV90ZXN0X2VuZ19hbmRyb2lkX3dlYXIiLAotCi0gICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDk3OTE1MDQyMjkzMzUwNAotICAgIHRyZW5keV90ZWFtX2lkOiAiNDk3OTE1MDQyMjkzMzUwNCIsCi19Ci0KLXRlYW0gewogICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9tZXNjaF90ZWFtIiwKIAogICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUyMDU0NjU4OTkzNjg0NDgKQEAgLTcxOCwxMyArNjkzLDYgQEAKIH0KIAogdGVhbSB7Ci0gICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2Vhcl9kZXZlbG9wZXJfZGV2eCIsCi0KLSAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80ODk0ODkwNzY0Njk3NjAwCi0gICAgdHJlbmR5X3RlYW1faWQ6ICI0ODk0ODkwNzY0Njk3NjAwIiwKLX0KLQotdGVhbSB7CiAgICAgbmFtZTogInRyZW5keV90ZWFtX2FuZHJvaWRfcnVzdCIsCiAKICAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80ODQ0NjAwNTg2MzA1NTM2CkBAIC05MjgsMTMgKzg5Niw2IEBACiB9CiAKIHRlYW0gewotICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dhbGxldF9vbl93ZWFyIiwKLQotICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU3MjQ5NjA0Mzc3MzEzMjgKLSAgICB0cmVuZHlfdGVhbV9pZDogIjU3MjQ5NjA0Mzc3MzEzMjgiLAotfQotCi10ZWFtIHsKICAgICBuYW1lOiAidHJlbmR5X3RlYW1fZ2xhbmNlYWJsZXMiLAogCiAgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNDY1ODIyMjAwNDYwMDgzMgpAQCAtOTcwLDcgKzkzMSw3IEBACiB9CiAKIHRlYW0gewotICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9jYW1lcmF4IiwKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9jYW1lcmFfaW5ub3ZhdGlvbl90ZWFtIiwKIAogICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUyNzI1OTA2Njk0Nzk5MzYKICAgICB0cmVuZHlfdGVhbV9pZDogIjUyNzI1OTA2Njk0Nzk5MzYiLApAQCAtMTA2OCwxMyArMTAyOSw2IEBACiB9CiAKIHRlYW0gewotICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyXzN4cCIsCi0KLSAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NjkyMzE3NjEyNTM5OTA0Ci0gICAgdHJlbmR5X3RlYW1faWQ6ICI1NjkyMzE3NjEyNTM5OTA0IiwKLX0KLQotdGVhbSB7CiAgICAgbmFtZTogInRyZW5keV90ZWFtX2Nsb2Nrd29yayIsCiAKICAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy80OTA4NzgxNjc4NzU1ODQwCkBAIC0xMjA4LDEzICsxMTYyLDYgQEAKIH0KIAogdGVhbSB7Ci0gICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfc29mdHdhcmVfbnRpIiwKLQotICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxNjQ5NzM1NTg3NTk0MjQKLSAgICB0cmVuZHlfdGVhbV9pZDogIjUxNjQ5NzM1NTg3NTk0MjQiLAotfQotCi10ZWFtIHsKICAgICBuYW1lOiAidHJlbmR5X3RlYW1fbWFjaGluZV9sZWFybmluZyIsCiAKICAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81Mjc2NTY4MzE4MjQ2OTEyCkBAIC0xMzA2LDEzICsxMjUzLDYgQEAKIH0KIAogdGVhbSB7Ci0gICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2Vhcl9wb3dlcl9lbXVsYXRvciIsCi0KLSAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MTYwMzM4OTM2NzI1NTA0Ci0gICAgdHJlbmR5X3RlYW1faWQ6ICI1MTYwMzM4OTM2NzI1NTA0IiwKLX0KLQotdGVhbSB7CiAgICAgbmFtZTogInRyZW5keV90ZWFtX2RlcHJlY2F0ZWRfZnJhbWV3b3JrX3N2ZXRvc2xhdmdhbm92IiwKIAogICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY0MDQxMTc0OTI1MzEyMDAKQEAgLTEzMjcsMTMgKzEyNjcsNiBAQAogfQogCiB0ZWFtIHsKLSAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl9vcHVzIiwKLQotICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUwOTgzNTE2MzY2NzY2MDgKLSAgICB0cmVuZHlfdGVhbV9pZDogIjUwOTgzNTE2MzY2NzY2MDgiLAotfQotCi10ZWFtIHsKICAgICBuYW1lOiAidHJlbmR5X3RlYW1fdGV4dF90b19zcGVlY2giLAogCiAgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjM2ODkzMzEyMDQ0MjM2OApAQCAtMTQzOSwxMyArMTM3Miw2IEBACiB9CiAKIHRlYW0gewotICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX2RldmVsb3Blcl9mb3VuZGF0aW9uIiwKLQotICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUyMzkxMjcxMDg2NDg5NjAKLSAgICB0cmVuZHlfdGVhbV9pZDogIjUyMzkxMjcxMDg2NDg5NjAiLAotfQotCi10ZWFtIHsKICAgICBuYW1lOiAidHJlbmR5X3RlYW1fdHBtX3R2YyIsCiAKICAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81MzkwNjgzMzMzMjMwNTkyCkBAIC0xNDUzLDEzICsxMzc5LDYgQEAKIH0KIAogdGVhbSB7Ci0gICAgbmFtZTogInRyZW5keV90ZWFtX3dlYXJfd2Vhcl91eCIsCi0KLSAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy81NzgyMDk3NDExMDgwMTkyCi0gICAgdHJlbmR5X3RlYW1faWQ6ICI1NzgyMDk3NDExMDgwMTkyIiwKLX0KLQotdGVhbSB7CiAgICAgbmFtZTogInRyZW5keV90ZWFtX2xzZV9kZXNrdG9wX29zX2V4cGVyaWVuY2UiLAogCiAgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTEyNTIzNDkwMDQzNDk0NApAQCAtMTY3MCwxMyArMTU4OSw2IEBACiB9CiAKIHRlYW0gewotICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV93ZWFyX3dlYXJfYXNzaXN0YW50IiwKLQotICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU4NDgwNzUzMDYxNzI0MTYKLSAgICB0cmVuZHlfdGVhbV9pZDogIjU4NDgwNzUzMDYxNzI0MTYiLAotfQotCi10ZWFtIHsKICAgICBuYW1lOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9wb3dlcl9hbmRfY29tbXNfaW5mcmEiLAogCiAgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTMyNTU0NzY1MzMzMjk5MgpAQCAtMzQ1NSw2ICszMzY3LDEzIEBACiB9CiAKIHRlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9hYW9zX2Rpc3BsYXlfc2FmZXR5X3RyaWFnZSIsCisKKyAgICAvLyBnby90cmVuZHkvbWFuYWdlL2VuZ2luZWVycy82NTIyMDkzNjYzNzgwODY0CisgICAgdHJlbmR5X3RlYW1faWQ6ICI2NTIyMDkzNjYzNzgwODY0IiwKK30KKwordGVhbSB7CiAgICAgbmFtZTogInRyZW5keV90ZWFtX2NhbWVyYV9odGNfbGdfcXVhbGNvbW0iLAogCiAgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjMzMjA5OTQ4MDkxMTg3MgpAQCAtNDQ0MCwzICs0MzU5LDU1IEBACiAgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNTA5NzAwMzc0NjQyNjg4MAogICAgIHRyZW5keV90ZWFtX2lkOiAiNTA5NzAwMzc0NjQyNjg4MCIsCiB9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kZXNrdG9wX2Zpcm13YXJlIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU3ODc5Mzg0NTQ4NjM4NzIKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU3ODc5Mzg0NTQ4NjM4NzIiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYXJ0X2Nsb3VkIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUxMjE0NDA2NDc1Nzc2MDAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUxMjE0NDA2NDc1Nzc2MDAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fcmF2ZW53b29kIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzYwMjcxODE1MDA0OTc5MjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjYwMjcxODE1MDA0OTc5MjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fYXV0b21vdGl2ZV9jYXN0IiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzUyOTM2ODMwMjYyNjQwNjQKKyAgICB0cmVuZHlfdGVhbV9pZDogIjUyOTM2ODMwMjYyNjQwNjQiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fd2Vhcl9zdGFuZGFsb25lX2tpZHMiLAorCisgICAgLy8gZ28vdHJlbmR5L21hbmFnZS9lbmdpbmVlcnMvNjMwMzI5ODcwMzk0OTgyNAorICAgIHRyZW5keV90ZWFtX2lkOiAiNjMwMzI5ODcwMzk0OTgyNCIsCit9CisKK3RlYW0geworICAgIG5hbWU6ICJ0cmVuZHlfdGVhbV9kZXNrdG9wX3N0YXRzIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzU0NDA3NjQxMTQyMDY3MjAKKyAgICB0cmVuZHlfdGVhbV9pZDogIjU0NDA3NjQxMTQyMDY3MjAiLAorfQorCit0ZWFtIHsKKyAgICBuYW1lOiAidHJlbmR5X3RlYW1fZGVza3RvcF93aWZpIiwKKworICAgIC8vIGdvL3RyZW5keS9tYW5hZ2UvZW5naW5lZXJzLzY0NjM2ODk2OTcwOTk3NzYKKyAgICB0cmVuZHlfdGVhbV9pZDogIjY0NjM2ODk2OTcwOTk3NzYiLAorfQorCisvLyBET04nVCBBREQgTkVXIFJVTEVTIEhFUkUuIEZvciBtb3JlIGRldGFpbHMgcmVmZXIgdG8KKy8vIGdvL25ldy1hbmRyb2lkLW93bmVyc2hpcC1tb2RlbApkaWZmIC0tZ2l0IGEvdGVhbXMvT1dORVJTIGIvdGVhbXMvT1dORVJTCmluZGV4IDg1ZTY5ZjMuLjAyODQ2ZWIgMTAwNjQ0Ci0tLSBhL3RlYW1zL09XTkVSUworKysgYi90ZWFtcy9PV05FUlMKQEAgLTEsMyArMSwyIEBACiBkYXJpb2ZyZW5pQGdvb2dsZS5jb20KIHJvbmlzaEBnb29nbGUuY29tCi1jYWRpdHlhQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3Rvb2xzL0FuZHJvaWQuYnAgYi90b29scy9BbmRyb2lkLmJwCmluZGV4IDU5ODMxYTYuLjI0M2NiNTYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL0FuZHJvaWQuYnAKKysrIGIvdG9vbHMvQW5kcm9pZC5icApAQCAtMTIzLDMgKzEyMywxMSBAQAogICAgICAgICAibWVyZ2UtZXZlbnQtbG9nLXRhZ3MucHkiLAogICAgIF0sCiB9CisKK3B5dGhvbl9iaW5hcnlfaG9zdCB7CisgICAgbmFtZTogImphdmEtZXZlbnQtbG9nLXRhZ3MiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImV2ZW50X2xvZ190YWdzLnB5IiwKKyAgICAgICAgImphdmEtZXZlbnQtbG9nLXRhZ3MucHkiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS90b29scy9CVUlMRC5iYXplbCBiL3Rvb2xzL0JVSUxELmJhemVsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWMwZGNlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL0JVSUxELmJhemVsCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotcHlfbGlicmFyeSgKLSAgICBuYW1lID0gImV2ZW50X2xvZ190YWdzIiwKLSAgICBzcmNzID0gWyJldmVudF9sb2dfdGFncy5weSJdLAotICAgIGltcG9ydHMgPSBbIi4iXSwKLSkKLQotcHlfYmluYXJ5KAotICAgIG5hbWUgPSAiamF2YS1ldmVudC1sb2ctdGFncyIsCi0gICAgc3JjcyA9IFsiamF2YS1ldmVudC1sb2ctdGFncy5weSJdLAotICAgIHB5dGhvbl92ZXJzaW9uID0gIlBZMyIsCi0gICAgdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdLAotICAgIGRlcHMgPSBbIjpldmVudF9sb2dfdGFncyJdLAotKQotCi1weV9iaW5hcnkoCi0gICAgbmFtZSA9ICJtZXJnZS1ldmVudC1sb2ctdGFncyIsCi0gICAgc3JjcyA9IFsibWVyZ2UtZXZlbnQtbG9nLXRhZ3MucHkiXSwKLSAgICBweXRob25fdmVyc2lvbiA9ICJQWTMiLAotICAgIHZpc2liaWxpdHkgPSBbIi8vdmlzaWJpbGl0eTpwdWJsaWMiXSwKLSAgICBkZXBzID0gWyI6ZXZlbnRfbG9nX3RhZ3MiXSwKLSkKLQotcHlfYmluYXJ5KAotICAgIG5hbWUgPSAiY2hlY2tfZWxmX2ZpbGUiLAotICAgIHNyY3MgPSBbImNoZWNrX2VsZl9maWxlLnB5Il0sCi0gICAgcHl0aG9uX3ZlcnNpb24gPSAiUFkzIiwKLSAgICB2aXNpYmlsaXR5ID0gWyIvL3Zpc2liaWxpdHk6cHVibGljIl0sCi0pCi0KLXB5X2JpbmFyeSgKLSAgICBuYW1lID0gImF1dG9fZ2VuX3Rlc3RfY29uZmlnIiwKLSAgICBzcmNzID0gWyJhdXRvX2dlbl90ZXN0X2NvbmZpZy5weSJdLAotICAgIHB5dGhvbl92ZXJzaW9uID0gIlBZMyIsCi0gICAgdmlzaWJpbGl0eSA9IFsiLy92aXNpYmlsaXR5OnB1YmxpYyJdLAotKQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9DYXJnby50b21sIGIvdG9vbHMvYWNvbmZpZy9DYXJnby50b21sCmluZGV4IGJmNWUxYTkuLmEwMzFiN2YgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvQ2FyZ28udG9tbAorKysgYi90b29scy9hY29uZmlnL0NhcmdvLnRvbWwKQEAgLTgsNyArOCw4IEBACiAgICAgImFjb25maWdfc3RvcmFnZV9yZWFkX2FwaSIsCiAgICAgImFjb25maWdfc3RvcmFnZV93cml0ZV9hcGkiLAogICAgICJhZmxhZ3MiLAotICAgICJwcmludGZsYWdzIgorICAgICJwcmludGZsYWdzIiwKKyAgICAiY29udmVydF9maW5hbGl6ZWRfZmxhZ3MiCiBdCiAKIHJlc29sdmVyID0gIjIiCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL09XTkVSUyBiL3Rvb2xzL2Fjb25maWcvT1dORVJTCmluZGV4IDlhNzYyNzkuLmM5MmZjN2MgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvT1dORVJTCisrKyBiL3Rvb2xzL2Fjb25maWcvT1dORVJTCkBAIC0xLDcgKzEsOCBAQAotYW1oa0Bnb29nbGUuY29tCiBkenNoZW5AZ29vZ2xlLmNvbQotamhhbUBnb29nbGUuY29tCi1qb2VvQGdvb2dsZS5jb20KIG9wZ0Bnb29nbGUuY29tCiB0ZWRiYXVlckBnb29nbGUuY29tCiB6aGlkb3VAZ29vZ2xlLmNvbQorCithbWhrQGdvb2dsZS5jb20gICN7TEFTVF9SRVNPUlRfU1VHR0VTVElPTn0KK2poYW1AZ29vZ2xlLmNvbSAgI3tMQVNUX1JFU09SVF9TVUdHRVNUSU9OfQoram9lb0Bnb29nbGUuY29tICAje0xBU1RfUkVTT1JUX1NVR0dFU1RJT059CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL1RFU1RfTUFQUElORyBiL3Rvb2xzL2Fjb25maWcvVEVTVF9NQVBQSU5HCmluZGV4IDE1ZTQxODcuLjZlNTMwMTggMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvVEVTVF9NQVBQSU5HCisrKyBiL3Rvb2xzL2Fjb25maWcvVEVTVF9NQVBQSU5HCkBAIC0xMDIsMTIgKzEwMiwxMCBAQAogICAgIHsKICAgICAgIC8vIGFjb25maWdfc3RvcmFnZSBmaWxlIGphdmEgaW50ZWdyYXRpb24gdGVzdHMKICAgICAgICJuYW1lIjogImFjb25maWdfc3RvcmFnZV9maWxlLnRlc3QuamF2YSIKLSAgICB9Ci0gIF0sCi0gICJwb3N0c3VibWl0IjogWworICAgIH0sCiAgICAgewotICAgICAgLy8gYWNvbmZpZ19zdG9yYWdlIHJlYWQgYXBpIGphdmEgaW50ZWdyYXRpb24gdGVzdHMKLSAgICAgICJuYW1lIjogImFjb25maWdfc3RvcmFnZV9yZWFkX2FwaS50ZXN0LmphdmEiCisgICAgICAvLyBhY29uZmlnX3N0b3JhZ2UgcmVhZCBmdW5jdGlvbmFsIHRlc3QKKyAgICAgICJuYW1lIjogImFjb25maWdfc3RvcmFnZV9yZWFkX2Z1bmN0aW9uYWwiCiAgICAgfQogICBdCiB9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvQW5kcm9pZC5icCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9BbmRyb2lkLmJwCmluZGV4IDY4NTIxYWYuLjdiZGVjNTggMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9BbmRyb2lkLmJwCkBAIC03LDcgKzcsMTAgQEAKICAgICBlZGl0aW9uOiAiMjAyMSIsCiAgICAgY2xpcHB5X2xpbnRzOiAiYW5kcm9pZCIsCiAgICAgbGludHM6ICJhbmRyb2lkIiwKLSAgICBzcmNzOiBbInNyYy9tYWluLnJzIl0sCisgICAgc3JjczogWworICAgICAgICAic3JjL21haW4ucnMiLAorICAgICAgICAiOmZpbmFsaXplZF9mbGFnc19yZWNvcmQuanNvbiIsCisgICAgXSwKICAgICBydXN0bGliczogWwogICAgICAgICAibGliYWNvbmZpZ19wcm90b3MiLAogICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX2ZpbGUiLApAQCAtMTgsNiArMjEsNyBAQAogICAgICAgICAibGlic2VyZGUiLAogICAgICAgICAibGlic2VyZGVfanNvbiIsCiAgICAgICAgICJsaWJ0aW55dGVtcGxhdGUiLAorICAgICAgICAibGliY29udmVydF9maW5hbGl6ZWRfZmxhZ3MiLAogICAgIF0sCiB9CiAKQEAgLTY4LDYgKzcyLDE0IEBACiAgICAgXSwKIH0KIAorYWNvbmZpZ192YWx1ZXMgeworICAgIG5hbWU6ICJhY29uZmlnLnRlc3QuZmxhZy5zZWNvbmRfdmFsdWVzIiwKKyAgICBwYWNrYWdlOiAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJ0ZXN0cy90aGlyZC52YWx1ZXMiLAorICAgIF0sCit9CisKIGFjb25maWdfdmFsdWVfc2V0IHsKICAgICBuYW1lOiAiYWNvbmZpZy50ZXN0LmZsYWcudmFsdWVfc2V0IiwKICAgICB2YWx1ZXM6IFsKQEAgLTIzNCw2ICsyNDYsMTIgQEAKICAgICBuYW1lOiAibGliYWNvbmZpZ190ZXN0X3J1c3RfbGlicmFyeSIsCiAgICAgY3JhdGVfbmFtZTogImFjb25maWdfdGVzdF9ydXN0X2xpYnJhcnkiLAogICAgIGFjb25maWdfZGVjbGFyYXRpb25zOiAiYWNvbmZpZy50ZXN0LmZsYWdzIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5jb25maWdpbmZyYXN0cnVjdHVyZSIsCisgICAgXSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIzNCIsCiB9CiAKIHJ1c3RfdGVzdCB7CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvQ2FyZ28udG9tbCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9DYXJnby50b21sCmluZGV4IGFiZDNlZTAuLjdlNGJkZjIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9DYXJnby50b21sCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9DYXJnby50b21sCkBAIC0xNywzICsxNywxMSBAQAogdGlueXRlbXBsYXRlID0gIjEuMi4xIgogYWNvbmZpZ19wcm90b3MgPSB7IHBhdGggPSAiLi4vYWNvbmZpZ19wcm90b3MiIH0KIGFjb25maWdfc3RvcmFnZV9maWxlID0geyBwYXRoID0gIi4uL2Fjb25maWdfc3RvcmFnZV9maWxlIiB9Citjb252ZXJ0X2ZpbmFsaXplZF9mbGFncyA9IHsgcGF0aCA9ICIuLi9jb252ZXJ0X2ZpbmFsaXplZF9mbGFncyIgfQorCitbYnVpbGQtZGVwZW5kZW5jaWVzXQorYW55aG93ID0gIjEuMC42OSIKK2l0ZXJ0b29scyA9ICIwLjEwLjUiCitzZXJkZSA9IHsgdmVyc2lvbiA9ICIxLjAuMTUyIiwgZmVhdHVyZXMgPSBbImRlcml2ZSJdIH0KK3NlcmRlX2pzb24gPSAiMS4wLjkzIgorY29udmVydF9maW5hbGl6ZWRfZmxhZ3MgPSB7IHBhdGggPSAiLi4vY29udmVydF9maW5hbGl6ZWRfZmxhZ3MiIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9idWlsZC5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9idWlsZC5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YWFlYzNjCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL2J1aWxkLnJzCkBAIC0wLDAgKzEsOTMgQEAKK3VzZSBhbnlob3c6Onthbnlob3csIFJlc3VsdH07Cit1c2Ugc3RkOjplbnY7Cit1c2Ugc3RkOjpmczsKK3VzZSBzdGQ6OmZzOjpGaWxlOwordXNlIHN0ZDo6aW86OldyaXRlOwordXNlIHN0ZDo6cGF0aDo6e1BhdGgsIFBhdGhCdWZ9OworCit1c2UgY29udmVydF9maW5hbGl6ZWRfZmxhZ3M6OnJlYWRfZmlsZXNfdG9fbWFwX3VzaW5nX3BhdGg7Cit1c2UgY29udmVydF9maW5hbGl6ZWRfZmxhZ3M6OkZpbmFsaXplZEZsYWdNYXA7CisKKy8vIFRoaXMgZm4gbWFrZXMgYXNzdW1wdGlvbnMgYWJvdXQgdGhlIHdvcmtpbmcgZGlyZWN0b3J5IHdoaWNoIHdlIHNob3VsZCBub3QgcmVseQorLy8gb24gZm9yIGFjdHVhbCAoU29vbmcpIGJ1aWxkcy4gSXQgaXMgcmVhc29uYWJsZSB0byBhc3N1bWUgdGhhdCB0aGlzIGlzIGJlaW5nCisvLyBjYWxsZWQgZnJvbSB0aGUgYWNvbmZpZyBkaXJlY3RvcnkgYXMgY2FyZ28gaXMgdXNlZCBmb3IgbG9jYWwgZGV2ZWxvcG1lbnQgYW5kCisvLyB0aGUgY2FyZ28gd29ya3NwYWNlIGZvciBvdXIgcHJvamVjdCBpcyBidWlsZC9tYWtlL3Rvb2xzL2Fjb25maWcuCisvLyBUaGlzIGlzIG1lYW50IHRvIGdldCB0aGUgbGlzdCBvZiBmaW5hbGl6ZWQgZmxhZworLy8gZmlsZXMgcHJvdmlkZWQgYnkgdGhlIGZpbGVncm91cCArICJsb2NhdGlvbnMiIGluIHNvb25nLgorLy8gQ2FyZ28tb25seSB1c2FnZSBpcyBhc3NlcnRlZCB2aWEgaW1wbGVtZW50YXRpb24gb2YKKy8vIHJlYWRfZmlsZXNfdG9fbWFwX3VzaW5nX2VudiwgdGhlIG9ubHkgcHVibGljIGNhcmdvLW9ubHkgZm4uCitmbiByZWFkX2ZpbGVzX3RvX21hcF91c2luZ19lbnYoKSAtPiBSZXN1bHQ8RmluYWxpemVkRmxhZ01hcD4geworICAgIGxldCBtdXQgY3VycmVudF9kaXIgPSBzdGQ6OmVudjo6Y3VycmVudF9kaXIoKT87CisKKyAgICAvLyBQYXRoIG9mIGFjb25maWcgZnJvbSB0aGUgdG9wIG9mIHRyZWUuCisgICAgbGV0IGFjb25maWdfcGF0aCA9IFBhdGhCdWY6OmZyb20oImJ1aWxkL21ha2UvdG9vbHMvYWNvbmZpZyIpOworCisgICAgLy8gUGF0aCBvZiBTREsgZmlsZXMgZnJvbSB0aGUgdG9wIG9mIHRyZWUuCisgICAgbGV0IHNka19kaXJfcGF0aCA9IFBhdGhCdWY6OmZyb20oInByZWJ1aWx0cy9zZGsiKTsKKworICAgIC8vIEl0ZXJhdGUgdXAgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUgdW50aWwgd2UgaGF2ZSB0aGUgYmFzZSBhY29uZmlnIGRpci4KKyAgICB3aGlsZSAhY3VycmVudF9kaXIuY2Fub25pY2FsaXplKCk/LmVuZHNfd2l0aCgmYWNvbmZpZ19wYXRoKSB7CisgICAgICAgIGlmIGxldCBTb21lKHBhcmVudCkgPSBjdXJyZW50X2Rpci5wYXJlbnQoKSB7CisgICAgICAgICAgICBjdXJyZW50X2RpciA9IHBhcmVudC50b19wYXRoX2J1ZigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEVycihhbnlob3chKCJDYW5ub3QgZXhlY3V0ZSBvdXRzaWRlIG9mIGFjb25maWcuIikpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUmVtb3ZlIHRoZSBhY29uZmlnIHBhdGgsIGxlYXZpbmcgdGhlIHRvcCBvZiB0aGUgdHJlZS4KKyAgICBmb3IgXyBpbiAwLi5hY29uZmlnX3BhdGguY29tcG9uZW50cygpLmNvdW50KCkgeworICAgICAgICBjdXJyZW50X2Rpci5wb3AoKTsKKyAgICB9CisKKyAgICAvLyBHZXQgdGhlIGFic29sdXRlIHBhdGggb2YgdGhlIHNkayBmaWxlcy4KKyAgICBjdXJyZW50X2Rpci5wdXNoKHNka19kaXJfcGF0aCk7CisKKyAgICBsZXQgbXV0IGZsYWdfZmlsZXMgPSBWZWM6Om5ldygpOworCisgICAgLy8gU2VhcmNoIGFsbCBzdWItZGlycyBpbiBwcmVidWlsdHMvc2RrIGZvciBmaW5hbGl6ZWQtZmxhZ3MudHh0IGZpbGVzLgorICAgIC8vIFRoZSBmaWxlcyBhcmUgaW4gcHJlYnVpbHRzL3Nkay88YXBpIGxldmVsPi9maW5hbGl6ZWQtZmxhZ3MudHh0LgorICAgIGxldCBhcGlfbGV2ZWxfZGlycyA9IGZzOjpyZWFkX2RpcihjdXJyZW50X2Rpcik/OworICAgIGZvciBhcGlfbGV2ZWxfZGlyIGluIGFwaV9sZXZlbF9kaXJzIHsKKyAgICAgICAgaWYgYXBpX2xldmVsX2Rpci5pc19lcnIoKSB7CisgICAgICAgICAgICBlcHJpbnRsbiEoIkVycm9yIG9wZW5pbmcgZGlyZWN0b3J5OiB7fSIsIGFwaV9sZXZlbF9kaXIuZXJyKCkudW53cmFwKCkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBTa2lwIG5vbi1kaXJlY3Rvcmllcy4KKyAgICAgICAgbGV0IGFwaV9sZXZlbF9kaXJfcGF0aCA9IGFwaV9sZXZlbF9kaXIudW53cmFwKCkucGF0aCgpOworICAgICAgICBpZiAhYXBpX2xldmVsX2Rpcl9wYXRoLmlzX2RpcigpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gU29tZSBkaXJlY3RvcmllcyB3ZXJlIGNyZWF0ZWQgYmVmb3JlIHRydW5rIHN0YWJsZSBhbmQgZG9uJ3QgaGF2ZQorICAgICAgICAvLyBmbGFncywgb3IgYXJlbid0IGFwaSBsZXZlbCBkaXJlY3RvcmllcyBhdCBhbGwuCisgICAgICAgIGxldCBmbGFnX2ZpbGVfcGF0aCA9IGFwaV9sZXZlbF9kaXJfcGF0aC5qb2luKCJmaW5hbGl6ZWQtZmxhZ3MudHh0Iik7CisgICAgICAgIGlmICFmbGFnX2ZpbGVfcGF0aC5leGlzdHMoKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIGxldCBTb21lKHBhdGgpID0gZmxhZ19maWxlX3BhdGgudG9fc3RyKCkgeworICAgICAgICAgICAgZmxhZ19maWxlcy5wdXNoKHBhdGgudG9fc3RyaW5nKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZXByaW50bG4hKCJFcnJvciBjb252ZXJ0aW5nIHBhdGggdG8gc3RyaW5nOiB7Oj99IiwgZmxhZ19maWxlX3BhdGgpOworICAgICAgICB9CisgICAgfQorCisgICAgcmVhZF9maWxlc190b19tYXBfdXNpbmdfcGF0aChmbGFnX2ZpbGVzKQorfQorCitmbiBtYWluKCkgeworICAgIGxldCBvdXRfZGlyID0gZW52Ojp2YXJfb3MoIk9VVF9ESVIiKS51bndyYXAoKTsKKyAgICBsZXQgZGVzdF9wYXRoID0gUGF0aDo6bmV3KCZvdXRfZGlyKS5qb2luKCJmaW5hbGl6ZWRfZmxhZ3NfcmVjb3JkLmpzb24iKTsKKworICAgIGxldCBmaW5hbGl6ZWRfZmxhZ3NfbWFwOiBSZXN1bHQ8RmluYWxpemVkRmxhZ01hcD4gPSByZWFkX2ZpbGVzX3RvX21hcF91c2luZ19lbnYoKTsKKyAgICBpZiBmaW5hbGl6ZWRfZmxhZ3NfbWFwLmlzX2VycigpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBsZXQganNvbl9zdHIgPSBzZXJkZV9qc29uOjp0b19zdHJpbmcoJmZpbmFsaXplZF9mbGFnc19tYXAudW53cmFwKCkpLnVud3JhcCgpOworCisgICAgbGV0IG11dCBmID0gRmlsZTo6Y3JlYXRlKCZkZXN0X3BhdGgpLnVud3JhcCgpOworICAgIGYud3JpdGVfYWxsKGpzb25fc3RyLmFzX2J5dGVzKCkpLnVud3JhcCgpOworCisgICAgLy9wcmludGxuISgiY2FyZ286cmVydW4taWYtY2hhbmdlZD1pbnB1dC50eHQiKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29kZWdlbi9jcHAucnMgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvZGVnZW4vY3BwLnJzCmluZGV4IDJjNTY5ZGEuLmI4NTVkNzggMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29kZWdlbi9jcHAucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9jb2RlZ2VuL2NwcC5ycwpAQCAtMjQsMTQgKzI0LDEzIEBACiAKIHVzZSBjcmF0ZTo6Y29kZWdlbjsKIHVzZSBjcmF0ZTo6Y29kZWdlbjo6Q29kZWdlbk1vZGU7Ci11c2UgY3JhdGU6OmNvbW1hbmRzOjpPdXRwdXRGaWxlOwordXNlIGNyYXRlOjpjb21tYW5kczo6e3Nob3VsZF9pbmNsdWRlX2ZsYWcsIE91dHB1dEZpbGV9OwogCiBwdWIgZm4gZ2VuZXJhdGVfY3BwX2NvZGU8ST4oCiAgICAgcGFja2FnZTogJnN0ciwKICAgICBwYXJzZWRfZmxhZ3NfaXRlcjogSSwKICAgICBjb2RlZ2VuX21vZGU6IENvZGVnZW5Nb2RlLAogICAgIGZsYWdfaWRzOiBIYXNoTWFwPFN0cmluZywgdTE2PiwKLSAgICBhbGxvd19pbnN0cnVtZW50YXRpb246IGJvb2wsCiApIC0+IFJlc3VsdDxWZWM8T3V0cHV0RmlsZT4+CiB3aGVyZQogICAgIEk6IEl0ZXJhdG9yPEl0ZW0gPSBQcm90b1BhcnNlZEZsYWc+LApAQCAtNTksNyArNTgsNiBAQAogICAgICAgICBpc190ZXN0X21vZGU6IGNvZGVnZW5fbW9kZSA9PSBDb2RlZ2VuTW9kZTo6VGVzdCwKICAgICAgICAgY2xhc3NfZWxlbWVudHMsCiAgICAgICAgIGNvbnRhaW5lciwKLSAgICAgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uLAogICAgIH07CiAKICAgICBsZXQgZmlsZXMgPSBbCkBAIC0xMDQsNyArMTAyLDYgQEAKICAgICBwdWIgaXNfdGVzdF9tb2RlOiBib29sLAogICAgIHB1YiBjbGFzc19lbGVtZW50czogVmVjPENsYXNzRWxlbWVudD4sCiAgICAgcHViIGNvbnRhaW5lcjogU3RyaW5nLAotICAgIHB1YiBhbGxvd19pbnN0cnVtZW50YXRpb246IGJvb2wsCiB9CiAKICNbZGVyaXZlKFNlcmlhbGl6ZSldCkBAIC0xMjcsNiArMTI0LDIzIEBACiAgICAgZmxhZ19pZHM6IEhhc2hNYXA8U3RyaW5nLCB1MTY+LAogICAgIHJ3X2NvdW50OiAmbXV0IGkzMiwKICkgLT4gQ2xhc3NFbGVtZW50IHsKKyAgICBsZXQgbm9fYXNzaWduZWRfb2Zmc2V0ID0gIXNob3VsZF9pbmNsdWRlX2ZsYWcocGYpOworCisgICAgbGV0IGZsYWdfb2Zmc2V0ID0gbWF0Y2ggZmxhZ19pZHMuZ2V0KHBmLm5hbWUoKSkgeworICAgICAgICBTb21lKG9mZnNldCkgPT4gb2Zmc2V0LAorICAgICAgICBOb25lID0+IHsKKyAgICAgICAgICAgIC8vIFN5c3RlbS92ZW5kb3IvcHJvZHVjdCBSTytkaXNhYmxlZCBmbGFncyBoYXZlIG5vIG9mZnNldCBpbiBzdG9yYWdlIGZpbGVzLgorICAgICAgICAgICAgLy8gQXNzaWduIHBsYWNlaG9sZGVyIHZhbHVlLgorICAgICAgICAgICAgaWYgbm9fYXNzaWduZWRfb2Zmc2V0IHsKKyAgICAgICAgICAgICAgICAmMAorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQWxsIG90aGVyIGZsYWdzIF9tdXN0XyBoYXZlIGFuIG9mZnNldC4KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHBhbmljISgie30iLCBmb3JtYXQhKCJtaXNzaW5nIGZsYWcgb2Zmc2V0IGZvciB7fSIsIHBmLm5hbWUoKSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKwogICAgIENsYXNzRWxlbWVudCB7CiAgICAgICAgIHJlYWR3cml0ZV9pZHg6IGlmIHBmLnBlcm1pc3Npb24oKSA9PSBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX1dSSVRFIHsKICAgICAgICAgICAgIGxldCBpbmRleCA9ICpyd19jb3VudDsKQEAgLTE0NCw3ICsxNTgsNyBAQAogICAgICAgICB9LAogICAgICAgICBmbGFnX25hbWU6IHBmLm5hbWUoKS50b19zdHJpbmcoKSwKICAgICAgICAgZmxhZ19tYWNybzogcGYubmFtZSgpLnRvX3VwcGVyY2FzZSgpLAotICAgICAgICBmbGFnX29mZnNldDogKmZsYWdfaWRzLmdldChwZi5uYW1lKCkpLmV4cGVjdCgidmFsdWVzIGNoZWNrZWQgYXQgZmxhZyBwYXJzZSB0aW1lIiksCisgICAgICAgIGZsYWdfb2Zmc2V0OiAqZmxhZ19vZmZzZXQsCiAgICAgICAgIGRldmljZV9jb25maWdfbmFtZXNwYWNlOiBwZi5uYW1lc3BhY2UoKS50b19zdHJpbmcoKSwKICAgICAgICAgZGV2aWNlX2NvbmZpZ19mbGFnOiBjb2RlZ2VuOjpjcmVhdGVfZGV2aWNlX2NvbmZpZ19pZGVudChwYWNrYWdlLCBwZi5uYW1lKCkpCiAgICAgICAgICAgICAuZXhwZWN0KCJ2YWx1ZXMgY2hlY2tlZCBhdCBmbGFnIHBhcnNlIHRpbWUiKSwKQEAgLTIyMCwxMSArMjM0LDExIEBACiAgICAgcmV0dXJuIHByb3ZpZGVyXy0+ZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKCk7CiB9CiAKLWlubGluZSBib29sIGVuYWJsZWRfZml4ZWRfcm8oKSB7Citjb25zdGV4cHIgaW5saW5lIGJvb2wgZW5hYmxlZF9maXhlZF9ybygpIHsKICAgICByZXR1cm4gQ09NX0FORFJPSURfQUNPTkZJR19URVNUX0VOQUJMRURfRklYRURfUk87CiB9CiAKLWlubGluZSBib29sIGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQoKSB7Citjb25zdGV4cHIgaW5saW5lIGJvb2wgZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgpIHsKICAgICByZXR1cm4gQ09NX0FORFJPSURfQUNPTkZJR19URVNUX0VOQUJMRURfRklYRURfUk9fRVhQT1JURUQ7CiB9CiAKQEAgLTI4MywzOSArMjk3LDIzIEBACiAgICAgdmlydHVhbCB+ZmxhZ19wcm92aWRlcl9pbnRlcmZhY2UoKSA9IGRlZmF1bHQ7CiAKICAgICB2aXJ0dWFsIGJvb2wgZGlzYWJsZWRfcm8oKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZGlzYWJsZWRfcm8oYm9vbCB2YWwpID0gMDsKLQogICAgIHZpcnR1YWwgYm9vbCBkaXNhYmxlZF9ydygpID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCBkaXNhYmxlZF9ydyhib29sIHZhbCkgPSAwOwotCiAgICAgdmlydHVhbCBib29sIGRpc2FibGVkX3J3X2V4cG9ydGVkKCkgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkIGRpc2FibGVkX3J3X2V4cG9ydGVkKGJvb2wgdmFsKSA9IDA7Ci0KICAgICB2aXJ0dWFsIGJvb2wgZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKCkgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkIGRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZShib29sIHZhbCkgPSAwOwotCiAgICAgdmlydHVhbCBib29sIGVuYWJsZWRfZml4ZWRfcm8oKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZW5hYmxlZF9maXhlZF9ybyhib29sIHZhbCkgPSAwOwotCiAgICAgdmlydHVhbCBib29sIGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZChib29sIHZhbCkgPSAwOwotCiAgICAgdmlydHVhbCBib29sIGVuYWJsZWRfcm8oKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZW5hYmxlZF9ybyhib29sIHZhbCkgPSAwOwotCiAgICAgdmlydHVhbCBib29sIGVuYWJsZWRfcm9fZXhwb3J0ZWQoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZW5hYmxlZF9yb19leHBvcnRlZChib29sIHZhbCkgPSAwOwotCiAgICAgdmlydHVhbCBib29sIGVuYWJsZWRfcncoKSA9IDA7CiAKKyAgICB2aXJ0dWFsIHZvaWQgZGlzYWJsZWRfcm8oYm9vbCB2YWwpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzYWJsZWRfcncoYm9vbCB2YWwpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzYWJsZWRfcndfZXhwb3J0ZWQoYm9vbCB2YWwpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKGJvb2wgdmFsKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGVuYWJsZWRfZml4ZWRfcm8oYm9vbCB2YWwpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZChib29sIHZhbCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBlbmFibGVkX3JvKGJvb2wgdmFsKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGVuYWJsZWRfcm9fZXhwb3J0ZWQoYm9vbCB2YWwpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgZW5hYmxlZF9ydyhib29sIHZhbCkgPSAwOwogCiAgICAgdmlydHVhbCB2b2lkIHJlc2V0X2ZsYWdzKCkge30KQEAgLTQ1MCw1NiArNDQ4LDYgQEAKIAogIiM7CiAKLSAgICBjb25zdCBFWFBPUlRFRF9FWFBPUlRFRF9IRUFERVJfRVhQRUNURUQ6ICZzdHIgPSByIyIKLSNwcmFnbWEgb25jZQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotI2luY2x1ZGUgPG1lbW9yeT4KLQotbmFtZXNwYWNlIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdCB7Ci0KLWNsYXNzIGZsYWdfcHJvdmlkZXJfaW50ZXJmYWNlIHsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5mbGFnX3Byb3ZpZGVyX2ludGVyZmFjZSgpID0gZGVmYXVsdDsKLQotICAgIHZpcnR1YWwgYm9vbCBkaXNhYmxlZF9yd19leHBvcnRlZCgpID0gMDsKLQotICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCkgPSAwOwotCi0gICAgdmlydHVhbCBib29sIGVuYWJsZWRfcm9fZXhwb3J0ZWQoKSA9IDA7Ci19OwotCi1leHRlcm4gc3RkOjp1bmlxdWVfcHRyPGZsYWdfcHJvdmlkZXJfaW50ZXJmYWNlPiBwcm92aWRlcl87Ci0KLWlubGluZSBib29sIGRpc2FibGVkX3J3X2V4cG9ydGVkKCkgewotICAgIHJldHVybiBwcm92aWRlcl8tPmRpc2FibGVkX3J3X2V4cG9ydGVkKCk7Ci19Ci0KLWlubGluZSBib29sIGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQoKSB7Ci0gICAgcmV0dXJuIHByb3ZpZGVyXy0+ZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgpOwotfQotCi1pbmxpbmUgYm9vbCBlbmFibGVkX3JvX2V4cG9ydGVkKCkgewotICAgIHJldHVybiBwcm92aWRlcl8tPmVuYWJsZWRfcm9fZXhwb3J0ZWQoKTsKLX0KLQotfQotCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvLyBfX2NwbHVzcGx1cwotCi1ib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9kaXNhYmxlZF9yd19leHBvcnRlZCgpOwotCi1ib29sIGNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdF9lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCk7Ci0KLWJvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcm9fZXhwb3J0ZWQoKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19IC8vIGV4dGVybiAiQyIKLSNlbmRpZgotIiM7Ci0KICAgICBjb25zdCBFWFBPUlRFRF9GT1JDRV9SRUFEX09OTFlfSEVBREVSX0VYUEVDVEVEOiAmc3RyID0gciMiCiAjcHJhZ21hIG9uY2UKIApAQCAtNTQ4LDcgKzQ5Niw3IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1pbmxpbmUgYm9vbCBlbmFibGVkX2ZpeGVkX3JvKCkgeworY29uc3RleHByIGlubGluZSBib29sIGVuYWJsZWRfZml4ZWRfcm8oKSB7CiAgICAgcmV0dXJuIENPTV9BTkRST0lEX0FDT05GSUdfVEVTVF9FTkFCTEVEX0ZJWEVEX1JPOwogfQogCkBAIC01ODQsNyArNTMyLDEzIEBACiAKICAgICBjb25zdCBQUk9EX1NPVVJDRV9GSUxFX0VYUEVDVEVEOiAmc3RyID0gciMiCiAjaW5jbHVkZSAiY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0LmgiCi0jaW5jbHVkZSA8c2VydmVyX2NvbmZpZ3VyYWJsZV9mbGFncy9nZXRfZmxhZ3MuaD4KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgImFjb25maWdfc3RvcmFnZS9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkuaHBwIgorI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisjZGVmaW5lIExPR19UQUcgImFjb25maWdfY3BwX2NvZGVnZW4iCisjZGVmaW5lIEFMT0dFKC4uLikgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19FUlJPUiwgTE9HX1RBRywgX19WQV9BUkdTX18pCisKICNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBjb206OmFuZHJvaWQ6OmFjb25maWc6OnRlc3QgewpAQCAtNTkyLDM2ICs1NDYsMTE2IEBACiAgICAgY2xhc3MgZmxhZ19wcm92aWRlciA6IHB1YmxpYyBmbGFnX3Byb3ZpZGVyX2ludGVyZmFjZSB7CiAgICAgICAgIHB1YmxpYzoKIAorICAgICAgICAgICAgZmxhZ19wcm92aWRlcigpCisgICAgICAgICAgICAgICAgOiBjYWNoZV8oNCwgLTEpCisgICAgICAgICAgICAgICAgLCBib29sZWFuX3N0YXJ0X2luZGV4XygpCisgICAgICAgICAgICAgICAgLCBmbGFnX3ZhbHVlX2ZpbGVfKG51bGxwdHIpCisgICAgICAgICAgICAgICAgLCBwYWNrYWdlX2V4aXN0c19pbl9zdG9yYWdlXyh0cnVlKSB7CisKKyAgICAgICAgICAgICAgICBhdXRvIHBhY2thZ2VfbWFwX2ZpbGUgPSBhY29uZmlnX3N0b3JhZ2U6OmdldF9tYXBwZWRfZmlsZSgKKyAgICAgICAgICAgICAgICAgICAgInN5c3RlbSIsCisgICAgICAgICAgICAgICAgICAgIGFjb25maWdfc3RvcmFnZTo6U3RvcmFnZUZpbGVUeXBlOjpwYWNrYWdlX21hcCk7CisgICAgICAgICAgICAgICAgaWYgKCFwYWNrYWdlX21hcF9maWxlLm9rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImVycm9yOiBmYWlsZWQgdG8gZ2V0IHBhY2thZ2UgbWFwIGZpbGU6ICVzIiwgcGFja2FnZV9tYXBfZmlsZS5lcnJvcigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBwYWNrYWdlX2V4aXN0c19pbl9zdG9yYWdlXyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXV0byBjb250ZXh0ID0gYWNvbmZpZ19zdG9yYWdlOjpnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoCisgICAgICAgICAgICAgICAgICAgICoqcGFja2FnZV9tYXBfZmlsZSwgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIpOworICAgICAgICAgICAgICAgIGlmICghY29udGV4dC5vaygpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJlcnJvcjogZmFpbGVkIHRvIGdldCBwYWNrYWdlIHJlYWQgY29udGV4dDogJXMiLCBjb250ZXh0LmVycm9yKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VfZXhpc3RzX2luX3N0b3JhZ2VfID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIShjb250ZXh0LT5wYWNrYWdlX2V4aXN0cykpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFja2FnZV9leGlzdHNfaW5fc3RvcmFnZV8gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGNhY2hlIHBhY2thZ2UgYm9vbGVhbiBmbGFnIHN0YXJ0IGluZGV4CisgICAgICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleF8gPSBjb250ZXh0LT5ib29sZWFuX3N0YXJ0X2luZGV4OworCisgICAgICAgICAgICAgICAgLy8gdW5tYXAgcGFja2FnZSBtYXAgZmlsZSBhbmQgZnJlZSBtZW1vcnkKKyAgICAgICAgICAgICAgICBkZWxldGUgKnBhY2thZ2VfbWFwX2ZpbGU7CisKKyAgICAgICAgICAgICAgICBhdXRvIGZsYWdfdmFsdWVfZmlsZSA9IGFjb25maWdfc3RvcmFnZTo6Z2V0X21hcHBlZF9maWxlKAorICAgICAgICAgICAgICAgICAgICAic3lzdGVtIiwKKyAgICAgICAgICAgICAgICAgICAgYWNvbmZpZ19zdG9yYWdlOjpTdG9yYWdlRmlsZVR5cGU6OmZsYWdfdmFsKTsKKyAgICAgICAgICAgICAgICBpZiAoIWZsYWdfdmFsdWVfZmlsZS5vaygpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJlcnJvcjogZmFpbGVkIHRvIGdldCBmbGFnIHZhbHVlIGZpbGU6ICVzIiwgZmxhZ192YWx1ZV9maWxlLmVycm9yKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VfZXhpc3RzX2luX3N0b3JhZ2VfID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBjYWNoZSBmbGFnIHZhbHVlIGZpbGUKKyAgICAgICAgICAgICAgICBmbGFnX3ZhbHVlX2ZpbGVfID0gc3RkOjp1bmlxdWVfcHRyPGFjb25maWdfc3RvcmFnZTo6TWFwcGVkU3RvcmFnZUZpbGU+KAorICAgICAgICAgICAgICAgICAgICAqZmxhZ192YWx1ZV9maWxlKTsKKworICAgICAgICAgICAgfQorCisKICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBkaXNhYmxlZF9ybygpIG92ZXJyaWRlIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBkaXNhYmxlZF9ydygpIG92ZXJyaWRlIHsKICAgICAgICAgICAgICAgICBpZiAoY2FjaGVfWzBdID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhY2hlX1swXSA9IHNlcnZlcl9jb25maWd1cmFibGVfZmxhZ3M6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAiYWNvbmZpZ19mbGFncy5hY29uZmlnX3Rlc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9ydyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSI7CisgICAgICAgICAgICAgICAgICAgIGlmICghcGFja2FnZV9leGlzdHNfaW5fc3RvcmFnZV8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGF1dG8gdmFsdWUgPSBhY29uZmlnX3N0b3JhZ2U6OmdldF9ib29sZWFuX2ZsYWdfdmFsdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAqZmxhZ192YWx1ZV9maWxlXywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW5fc3RhcnRfaW5kZXhfICsgMCk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZS5vaygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgdmFsdWU6ICVzIiwgdmFsdWUuZXJyb3IoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNhY2hlX1swXSA9ICp2YWx1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlX1swXTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdmlydHVhbCBib29sIGRpc2FibGVkX3J3X2V4cG9ydGVkKCkgb3ZlcnJpZGUgewogICAgICAgICAgICAgICAgIGlmIChjYWNoZV9bMV0gPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FjaGVfWzFdID0gc2VydmVyX2NvbmZpZ3VyYWJsZV9mbGFnczo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKLSAgICAgICAgICAgICAgICAgICAgICAgICJhY29uZmlnX2ZsYWdzLmFjb25maWdfdGVzdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2V4cG9ydGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJmYWxzZSIpID09ICJ0cnVlIjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwYWNrYWdlX2V4aXN0c19pbl9zdG9yYWdlXykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYXV0byB2YWx1ZSA9IGFjb25maWdfc3RvcmFnZTo6Z2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICpmbGFnX3ZhbHVlX2ZpbGVfLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleF8gKyAxKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlLm9rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyB2YWx1ZTogJXMiLCB2YWx1ZS5lcnJvcigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgY2FjaGVfWzFdID0gKnZhbHVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVfWzFdOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKCkgb3ZlcnJpZGUgewogICAgICAgICAgICAgICAgIGlmIChjYWNoZV9bMl0gPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FjaGVfWzJdID0gc2VydmVyX2NvbmZpZ3VyYWJsZV9mbGFnczo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKLSAgICAgICAgICAgICAgICAgICAgICAgICJhY29uZmlnX2ZsYWdzLm90aGVyX25hbWVzcGFjZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSI7CisgICAgICAgICAgICAgICAgICAgIGlmICghcGFja2FnZV9leGlzdHNfaW5fc3RvcmFnZV8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGF1dG8gdmFsdWUgPSBhY29uZmlnX3N0b3JhZ2U6OmdldF9ib29sZWFuX2ZsYWdfdmFsdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAqZmxhZ192YWx1ZV9maWxlXywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW5fc3RhcnRfaW5kZXhfICsgMik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZS5vaygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgdmFsdWU6ICVzIiwgdmFsdWUuZXJyb3IoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNhY2hlX1syXSA9ICp2YWx1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlX1syXTsKICAgICAgICAgICAgIH0KQEAgLTY0NCwxNiArNjc4LDMyIEBACiAKICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBlbmFibGVkX3J3KCkgb3ZlcnJpZGUgewogICAgICAgICAgICAgICAgIGlmIChjYWNoZV9bM10gPT0gLTEpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FjaGVfWzNdID0gc2VydmVyX2NvbmZpZ3VyYWJsZV9mbGFnczo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKLSAgICAgICAgICAgICAgICAgICAgICAgICJhY29uZmlnX2ZsYWdzLmFjb25maWdfdGVzdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfcnciLAotICAgICAgICAgICAgICAgICAgICAgICAgInRydWUiKSA9PSAidHJ1ZSI7CisgICAgICAgICAgICAgICAgICAgIGlmICghcGFja2FnZV9leGlzdHNfaW5fc3RvcmFnZV8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYXV0byB2YWx1ZSA9IGFjb25maWdfc3RvcmFnZTo6Z2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICpmbGFnX3ZhbHVlX2ZpbGVfLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleF8gKyA3KTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlLm9rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyB2YWx1ZTogJXMiLCB2YWx1ZS5lcnJvcigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBjYWNoZV9bM10gPSAqdmFsdWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZV9bM107CiAgICAgICAgICAgICB9CiAKICAgICBwcml2YXRlOgogICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ4X3Q+IGNhY2hlXyA9IHN0ZDo6dmVjdG9yPGludDhfdD4oNCwgLTEpOworCisgICAgICAgIHVpbnQzMl90IGJvb2xlYW5fc3RhcnRfaW5kZXhfOworCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxhY29uZmlnX3N0b3JhZ2U6Ok1hcHBlZFN0b3JhZ2VGaWxlPiBmbGFnX3ZhbHVlX2ZpbGVfOworCisgICAgICAgIGJvb2wgcGFja2FnZV9leGlzdHNfaW5fc3RvcmFnZV87CiAgICAgfTsKIAogICAgIHN0ZDo6dW5pcXVlX3B0cjxmbGFnX3Byb3ZpZGVyX2ludGVyZmFjZT4gcHJvdmlkZXJfID0KQEAgLTcwMCw3ICs3NTAsMTMgQEAKIAogICAgIGNvbnN0IFRFU1RfU09VUkNFX0ZJTEVfRVhQRUNURUQ6ICZzdHIgPSByIyIKICNpbmNsdWRlICJjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3QuaCIKLSNpbmNsdWRlIDxzZXJ2ZXJfY29uZmlndXJhYmxlX2ZsYWdzL2dldF9mbGFncy5oPgorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSAiYWNvbmZpZ19zdG9yYWdlL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS5ocHAiCisjaW5jbHVkZSA8YW5kcm9pZC9sb2cuaD4KKyNkZWZpbmUgTE9HX1RBRyAiYWNvbmZpZ19jcHBfY29kZWdlbiIKKyNkZWZpbmUgQUxPR0UoLi4uKSBfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0VSUk9SLCBMT0dfVEFHLCBfX1ZBX0FSR1NfXykKKwogI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiAjaW5jbHVkZSA8c3RyaW5nPgogCkBAIC03MTAsMTAgKzc2Niw2MyBAQAogICAgICAgICBwcml2YXRlOgogICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBib29sPiBvdmVycmlkZXNfOwogCisgICAgICAgICAgICB1aW50MzJfdCBib29sZWFuX3N0YXJ0X2luZGV4XzsKKworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGFjb25maWdfc3RvcmFnZTo6TWFwcGVkU3RvcmFnZUZpbGU+IGZsYWdfdmFsdWVfZmlsZV87CisKKyAgICAgICAgICAgIGJvb2wgcGFja2FnZV9leGlzdHNfaW5fc3RvcmFnZV87CisKICAgICAgICAgcHVibGljOgogICAgICAgICAgICAgZmxhZ19wcm92aWRlcigpCiAgICAgICAgICAgICAgICAgOiBvdmVycmlkZXNfKCkKLSAgICAgICAgICAgIHt9CisgICAgICAgICAgICAgICAgLCBib29sZWFuX3N0YXJ0X2luZGV4XygpCisgICAgICAgICAgICAgICAgLCBmbGFnX3ZhbHVlX2ZpbGVfKG51bGxwdHIpCisgICAgICAgICAgICAgICAgLCBwYWNrYWdlX2V4aXN0c19pbl9zdG9yYWdlXyh0cnVlKSB7CisKKyAgICAgICAgICAgICAgICBhdXRvIHBhY2thZ2VfbWFwX2ZpbGUgPSBhY29uZmlnX3N0b3JhZ2U6OmdldF9tYXBwZWRfZmlsZSgKKyAgICAgICAgICAgICAgICAgICAgICJzeXN0ZW0iLAorICAgICAgICAgICAgICAgICAgICBhY29uZmlnX3N0b3JhZ2U6OlN0b3JhZ2VGaWxlVHlwZTo6cGFja2FnZV9tYXApOworCisgICAgICAgICAgICAgICAgaWYgKCFwYWNrYWdlX21hcF9maWxlLm9rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImVycm9yOiBmYWlsZWQgdG8gZ2V0IHBhY2thZ2UgbWFwIGZpbGU6ICVzIiwgcGFja2FnZV9tYXBfZmlsZS5lcnJvcigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBwYWNrYWdlX2V4aXN0c19pbl9zdG9yYWdlXyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXV0byBjb250ZXh0ID0gYWNvbmZpZ19zdG9yYWdlOjpnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoCisgICAgICAgICAgICAgICAgICAgICoqcGFja2FnZV9tYXBfZmlsZSwgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIpOworCisgICAgICAgICAgICAgICAgaWYgKCFjb250ZXh0Lm9rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImVycm9yOiBmYWlsZWQgdG8gZ2V0IHBhY2thZ2UgcmVhZCBjb250ZXh0OiAlcyIsIGNvbnRleHQuZXJyb3IoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgcGFja2FnZV9leGlzdHNfaW5fc3RvcmFnZV8gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghKGNvbnRleHQtPnBhY2thZ2VfZXhpc3RzKSkgeworICAgICAgICAgICAgICAgICAgICBwYWNrYWdlX2V4aXN0c19pbl9zdG9yYWdlXyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gY2FjaGUgcGFja2FnZSBib29sZWFuIGZsYWcgc3RhcnQgaW5kZXgKKyAgICAgICAgICAgICAgICBib29sZWFuX3N0YXJ0X2luZGV4XyA9IGNvbnRleHQtPmJvb2xlYW5fc3RhcnRfaW5kZXg7CisKKyAgICAgICAgICAgICAgICAvLyB1bm1hcCBwYWNrYWdlIG1hcCBmaWxlIGFuZCBmcmVlIG1lbW9yeQorICAgICAgICAgICAgICAgIGRlbGV0ZSAqcGFja2FnZV9tYXBfZmlsZTsKKworICAgICAgICAgICAgICAgIGF1dG8gZmxhZ192YWx1ZV9maWxlID0gYWNvbmZpZ19zdG9yYWdlOjpnZXRfbWFwcGVkX2ZpbGUoCisgICAgICAgICAgICAgICAgICAgICJzeXN0ZW0iLAorICAgICAgICAgICAgICAgIGFjb25maWdfc3RvcmFnZTo6U3RvcmFnZUZpbGVUeXBlOjpmbGFnX3ZhbCk7CisgICAgICAgICAgICAgICAgaWYgKCFmbGFnX3ZhbHVlX2ZpbGUub2soKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZXJyb3I6IGZhaWxlZCB0byBnZXQgZmxhZyB2YWx1ZSBmaWxlOiAlcyIsIGZsYWdfdmFsdWVfZmlsZS5lcnJvcigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBwYWNrYWdlX2V4aXN0c19pbl9zdG9yYWdlXyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gY2FjaGUgZmxhZyB2YWx1ZSBmaWxlCisgICAgICAgICAgICAgICAgZmxhZ192YWx1ZV9maWxlXyA9IHN0ZDo6dW5pcXVlX3B0cjxhY29uZmlnX3N0b3JhZ2U6Ok1hcHBlZFN0b3JhZ2VGaWxlPigKKyAgICAgICAgICAgICAgICAqZmxhZ192YWx1ZV9maWxlKTsKKworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgZGlzYWJsZWRfcm8oKSBvdmVycmlkZSB7CiAgICAgICAgICAgICAgICAgYXV0byBpdCA9IG92ZXJyaWRlc18uZmluZCgiZGlzYWJsZWRfcm8iKTsKQEAgLTczMywxMCArODQyLDIwIEBACiAgICAgICAgICAgICAgICAgICBpZiAoaXQgIT0gb3ZlcnJpZGVzXy5lbmQoKSkgewogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmVyX2NvbmZpZ3VyYWJsZV9mbGFnczo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKLSAgICAgICAgICAgICAgICAgICAgICAiYWNvbmZpZ19mbGFncy5hY29uZmlnX3Rlc3QiLAotICAgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcnciLAotICAgICAgICAgICAgICAgICAgICAgICJmYWxzZSIpID09ICJ0cnVlIjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwYWNrYWdlX2V4aXN0c19pbl9zdG9yYWdlXykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgYXV0byB2YWx1ZSA9IGFjb25maWdfc3RvcmFnZTo6Z2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICpmbGFnX3ZhbHVlX2ZpbGVfLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleF8gKyAwKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIXZhbHVlLm9rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyB2YWx1ZTogJXMiLCB2YWx1ZS5lcnJvcigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICp2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtNzQ5LDEwICs4NjgsMjAgQEAKICAgICAgICAgICAgICAgICAgIGlmIChpdCAhPSBvdmVycmlkZXNfLmVuZCgpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2ZXJfY29uZmlndXJhYmxlX2ZsYWdzOjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAotICAgICAgICAgICAgICAgICAgICAgICJhY29uZmlnX2ZsYWdzLmFjb25maWdfdGVzdCIsCi0gICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9yd19leHBvcnRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgImZhbHNlIikgPT0gInRydWUiOworICAgICAgICAgICAgICAgICAgICBpZiAoIXBhY2thZ2VfZXhpc3RzX2luX3N0b3JhZ2VfKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBhdXRvIHZhbHVlID0gYWNvbmZpZ19zdG9yYWdlOjpnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKAorICAgICAgICAgICAgICAgICAgICAgICAgKmZsYWdfdmFsdWVfZmlsZV8sCisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuX3N0YXJ0X2luZGV4XyArIDEpOworCisgICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUub2soKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnIHZhbHVlOiAlcyIsIHZhbHVlLmVycm9yKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKnZhbHVlOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC03NjUsMTAgKzg5NCwyMCBAQAogICAgICAgICAgICAgICAgICAgaWYgKGl0ICE9IG92ZXJyaWRlc18uZW5kKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZlcl9jb25maWd1cmFibGVfZmxhZ3M6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCi0gICAgICAgICAgICAgICAgICAgICAgImFjb25maWdfZmxhZ3Mub3RoZXJfbmFtZXNwYWNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSIsCi0gICAgICAgICAgICAgICAgICAgICAgImZhbHNlIikgPT0gInRydWUiOworICAgICAgICAgICAgICAgICAgICBpZiAoIXBhY2thZ2VfZXhpc3RzX2luX3N0b3JhZ2VfKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBhdXRvIHZhbHVlID0gYWNvbmZpZ19zdG9yYWdlOjpnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKAorICAgICAgICAgICAgICAgICAgICAgICAgKmZsYWdfdmFsdWVfZmlsZV8sCisgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuX3N0YXJ0X2luZGV4XyArIDIpOworCisgICAgICAgICAgICAgICAgICAgIGlmICghdmFsdWUub2soKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnIHZhbHVlOiAlcyIsIHZhbHVlLmVycm9yKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKnZhbHVlOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCkBAIC04MzMsMTAgKzk3MiwyMCBAQAogICAgICAgICAgICAgICAgICAgaWYgKGl0ICE9IG92ZXJyaWRlc18uZW5kKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZlcl9jb25maWd1cmFibGVfZmxhZ3M6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCi0gICAgICAgICAgICAgICAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfcnciLAotICAgICAgICAgICAgICAgICAgICAgICJ0cnVlIikgPT0gInRydWUiOworICAgICAgICAgICAgICAgICAgICBpZiAoIXBhY2thZ2VfZXhpc3RzX2luX3N0b3JhZ2VfKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGF1dG8gdmFsdWUgPSBhY29uZmlnX3N0b3JhZ2U6OmdldF9ib29sZWFuX2ZsYWdfdmFsdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAqZmxhZ192YWx1ZV9maWxlXywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW5fc3RhcnRfaW5kZXhfICsgNyk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZS5vaygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgdmFsdWU6ICVzIiwgdmFsdWUuZXJyb3IoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICp2YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtOTQxLDY4ICsxMDkwLDYgQEAKIAogIiM7CiAKLSAgICBjb25zdCBFWFBPUlRFRF9TT1VSQ0VfRklMRV9FWFBFQ1RFRDogJnN0ciA9IHIjIgotI2luY2x1ZGUgImNvbV9hbmRyb2lkX2Fjb25maWdfdGVzdC5oIgotI2luY2x1ZGUgPHNlcnZlcl9jb25maWd1cmFibGVfZmxhZ3MvZ2V0X2ZsYWdzLmg+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi1uYW1lc3BhY2UgY29tOjphbmRyb2lkOjphY29uZmlnOjp0ZXN0IHsKLQotICAgIGNsYXNzIGZsYWdfcHJvdmlkZXIgOiBwdWJsaWMgZmxhZ19wcm92aWRlcl9pbnRlcmZhY2UgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICB2aXJ0dWFsIGJvb2wgZGlzYWJsZWRfcndfZXhwb3J0ZWQoKSBvdmVycmlkZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNhY2hlX1swXSA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBjYWNoZV9bMF0gPSBzZXJ2ZXJfY29uZmlndXJhYmxlX2ZsYWdzOjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAotICAgICAgICAgICAgICAgICAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcndfZXhwb3J0ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgImZhbHNlIikgPT0gInRydWUiOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVfWzBdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2aXJ0dWFsIGJvb2wgZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgpIG92ZXJyaWRlIHsKLSAgICAgICAgICAgICAgICBpZiAoY2FjaGVfWzFdID09IC0xKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhY2hlX1sxXSA9IHNlcnZlcl9jb25maWd1cmFibGVfZmxhZ3M6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAiYWNvbmZpZ19mbGFncy5hY29uZmlnX3Rlc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJmYWxzZSIpID09ICJ0cnVlIjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlX1sxXTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdmlydHVhbCBib29sIGVuYWJsZWRfcm9fZXhwb3J0ZWQoKSBvdmVycmlkZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNhY2hlX1syXSA9PSAtMSkgewotICAgICAgICAgICAgICAgICAgICBjYWNoZV9bMl0gPSBzZXJ2ZXJfY29uZmlndXJhYmxlX2ZsYWdzOjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAotICAgICAgICAgICAgICAgICAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9yb19leHBvcnRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBjYWNoZV9bMl07Ci0gICAgICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ4X3Q+IGNhY2hlXyA9IHN0ZDo6dmVjdG9yPGludDhfdD4oMywgLTEpOwotICAgIH07Ci0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8ZmxhZ19wcm92aWRlcl9pbnRlcmZhY2U+IHByb3ZpZGVyXyA9Ci0gICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8ZmxhZ19wcm92aWRlcj4oKTsKLX0KLQotYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZGlzYWJsZWRfcndfZXhwb3J0ZWQoKSB7Ci0gICAgcmV0dXJuIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDo6ZGlzYWJsZWRfcndfZXhwb3J0ZWQoKTsKLX0KLQotYm9vbCBjb21fYW5kcm9pZF9hY29uZmlnX3Rlc3RfZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgpIHsKLSAgICByZXR1cm4gY29tOjphbmRyb2lkOjphY29uZmlnOjp0ZXN0OjplbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCk7Ci19Ci0KLWJvb2wgY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0X2VuYWJsZWRfcm9fZXhwb3J0ZWQoKSB7Ci0gICAgcmV0dXJuIGNvbTo6YW5kcm9pZDo6YWNvbmZpZzo6dGVzdDo6ZW5hYmxlZF9yb19leHBvcnRlZCgpOwotfQotCi0KLSIjOwotCiAgICAgY29uc3QgRk9SQ0VfUkVBRF9PTkxZX1NPVVJDRV9GSUxFX0VYUEVDVEVEOiAmc3RyID0gciMiCiAjaW5jbHVkZSAiY29tX2FuZHJvaWRfYWNvbmZpZ190ZXN0LmgiCiAKQEAgLTExMDIsNyArMTE4OSw3IEBACiAKIGV4dGVybiBzdGQ6OnVuaXF1ZV9wdHI8ZmxhZ19wcm92aWRlcl9pbnRlcmZhY2U+IHByb3ZpZGVyXzsKIAotaW5saW5lIGJvb2wgZGlzYWJsZWRfZml4ZWRfcm8oKSB7Citjb25zdGV4cHIgaW5saW5lIGJvb2wgZGlzYWJsZWRfZml4ZWRfcm8oKSB7CiAgICAgcmV0dXJuIENPTV9BTkRST0lEX0FDT05GSUdfVEVTVF9ESVNBQkxFRF9GSVhFRF9STzsKIH0KIApAQCAtMTExMCw3ICsxMTk3LDcgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWlubGluZSBib29sIGVuYWJsZWRfZml4ZWRfcm8oKSB7Citjb25zdGV4cHIgaW5saW5lIGJvb2wgZW5hYmxlZF9maXhlZF9ybygpIHsKICAgICByZXR1cm4gQ09NX0FORFJPSURfQUNPTkZJR19URVNUX0VOQUJMRURfRklYRURfUk87CiB9CiAKQEAgLTExODcsNyArMTI3NCw2IEBACiAgICAgICAgIG1vZGU6IENvZGVnZW5Nb2RlLAogICAgICAgICBleHBlY3RlZF9oZWFkZXI6ICZzdHIsCiAgICAgICAgIGV4cGVjdGVkX3NyYzogJnN0ciwKLSAgICAgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uOiBib29sLAogICAgICkgewogICAgICAgICBsZXQgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzID0KICAgICAgICAgICAgIGNyYXRlOjpjb21tYW5kczo6bW9kaWZ5X3BhcnNlZF9mbGFnc19iYXNlZF9vbl9tb2RlKHBhcnNlZF9mbGFncywgbW9kZSkudW53cmFwKCk7CkBAIC0xMTk4LDcgKzEyODQsNiBAQAogICAgICAgICAgICAgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzLmludG9faXRlcigpLAogICAgICAgICAgICAgbW9kZSwKICAgICAgICAgICAgIGZsYWdfaWRzLAotICAgICAgICAgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uLAogICAgICAgICApCiAgICAgICAgIC51bndyYXAoKTsKICAgICAgICAgbGV0IG11dCBnZW5lcmF0ZWRfZmlsZXNfbWFwID0gSGFzaE1hcDo6bmV3KCk7CkBAIC0xMjM4LDcgKzEzMjMsNiBAQAogICAgICAgICAgICAgQ29kZWdlbk1vZGU6OlByb2R1Y3Rpb24sCiAgICAgICAgICAgICBFWFBPUlRFRF9QUk9EX0hFQURFUl9FWFBFQ1RFRCwKICAgICAgICAgICAgIFBST0RfU09VUkNFX0ZJTEVfRVhQRUNURUQsCi0gICAgICAgICAgICBmYWxzZSwKICAgICAgICAgKTsKICAgICB9CiAKQEAgLTEyNTAsMTkgKzEzMzQsNiBAQAogICAgICAgICAgICAgQ29kZWdlbk1vZGU6OlRlc3QsCiAgICAgICAgICAgICBFWFBPUlRFRF9URVNUX0hFQURFUl9FWFBFQ1RFRCwKICAgICAgICAgICAgIFRFU1RfU09VUkNFX0ZJTEVfRVhQRUNURUQsCi0gICAgICAgICAgICBmYWxzZSwKLSAgICAgICAgKTsKLSAgICB9Ci0KLSAgICAjW3Rlc3RdCi0gICAgZm4gdGVzdF9nZW5lcmF0ZV9jcHBfY29kZV9mb3JfZXhwb3J0ZWQoKSB7Ci0gICAgICAgIGxldCBwYXJzZWRfZmxhZ3MgPSBjcmF0ZTo6dGVzdDo6cGFyc2VfdGVzdF9mbGFncygpOwotICAgICAgICB0ZXN0X2dlbmVyYXRlX2NwcF9jb2RlKAotICAgICAgICAgICAgcGFyc2VkX2ZsYWdzLAotICAgICAgICAgICAgQ29kZWdlbk1vZGU6OkV4cG9ydGVkLAotICAgICAgICAgICAgRVhQT1JURURfRVhQT1JURURfSEVBREVSX0VYUEVDVEVELAotICAgICAgICAgICAgRVhQT1JURURfU09VUkNFX0ZJTEVfRVhQRUNURUQsCi0gICAgICAgICAgICBmYWxzZSwKICAgICAgICAgKTsKICAgICB9CiAKQEAgLTEyNzQsNyArMTM0NSw2IEBACiAgICAgICAgICAgICBDb2RlZ2VuTW9kZTo6Rm9yY2VSZWFkT25seSwKICAgICAgICAgICAgIEVYUE9SVEVEX0ZPUkNFX1JFQURfT05MWV9IRUFERVJfRVhQRUNURUQsCiAgICAgICAgICAgICBGT1JDRV9SRUFEX09OTFlfU09VUkNFX0ZJTEVfRVhQRUNURUQsCi0gICAgICAgICAgICBmYWxzZSwKICAgICAgICAgKTsKICAgICB9CiAKQEAgLTEyODYsNyArMTM1Niw2IEBACiAgICAgICAgICAgICBDb2RlZ2VuTW9kZTo6UHJvZHVjdGlvbiwKICAgICAgICAgICAgIFJFQURfT05MWV9FWFBPUlRFRF9QUk9EX0hFQURFUl9FWFBFQ1RFRCwKICAgICAgICAgICAgIFJFQURfT05MWV9QUk9EX1NPVVJDRV9GSUxFX0VYUEVDVEVELAotICAgICAgICAgICAgZmFsc2UsCiAgICAgICAgICk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9jb2RlZ2VuL2phdmEucnMgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvZGVnZW4vamF2YS5ycwppbmRleCBkYmM0YWI1Li40YjY3MGEwIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvZGVnZW4vamF2YS5ycworKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvZGVnZW4vamF2YS5ycwpAQCAtMjIsMzAgKzIyLDQ0IEBACiAKIHVzZSBjcmF0ZTo6Y29kZWdlbjsKIHVzZSBjcmF0ZTo6Y29kZWdlbjo6Q29kZWdlbk1vZGU7Ci11c2UgY3JhdGU6OmNvbW1hbmRzOjpPdXRwdXRGaWxlOwordXNlIGNyYXRlOjpjb21tYW5kczo6e3Nob3VsZF9pbmNsdWRlX2ZsYWcsIE91dHB1dEZpbGV9OwogdXNlIGFjb25maWdfcHJvdG9zOjp7UHJvdG9GbGFnUGVybWlzc2lvbiwgUHJvdG9GbGFnU3RhdGUsIFByb3RvUGFyc2VkRmxhZ307Cit1c2UgY29udmVydF9maW5hbGl6ZWRfZmxhZ3M6OntGaW5hbGl6ZWRGbGFnLCBGaW5hbGl6ZWRGbGFnTWFwfTsKIHVzZSBzdGQ6OmNvbGxlY3Rpb25zOjpIYXNoTWFwOwogCisvLyBBcmd1bWVudHMgdG8gY29uZmlndXJlIGNvZGVnZW4gZm9yIGdlbmVyYXRlX2phdmFfY29kZS4KK3B1YiBzdHJ1Y3QgSmF2YUNvZGVnZW5Db25maWcgeworICAgIHB1YiBjb2RlZ2VuX21vZGU6IENvZGVnZW5Nb2RlLAorICAgIHB1YiBmbGFnX2lkczogSGFzaE1hcDxTdHJpbmcsIHUxNj4sCisgICAgcHViIGFsbG93X2luc3RydW1lbnRhdGlvbjogYm9vbCwKKyAgICBwdWIgcGFja2FnZV9maW5nZXJwcmludDogdTY0LAorICAgIHB1YiBuZXdfZXhwb3J0ZWQ6IGJvb2wsCisgICAgcHViIHNpbmdsZV9leHBvcnRlZF9maWxlOiBib29sLAorICAgIHB1YiBmaW5hbGl6ZWRfZmxhZ3M6IEZpbmFsaXplZEZsYWdNYXAsCit9CisKIHB1YiBmbiBnZW5lcmF0ZV9qYXZhX2NvZGU8ST4oCiAgICAgcGFja2FnZTogJnN0ciwKICAgICBwYXJzZWRfZmxhZ3NfaXRlcjogSSwKLSAgICBjb2RlZ2VuX21vZGU6IENvZGVnZW5Nb2RlLAotICAgIGZsYWdfaWRzOiBIYXNoTWFwPFN0cmluZywgdTE2PiwKLSAgICBhbGxvd19pbnN0cnVtZW50YXRpb246IGJvb2wsCisgICAgY29uZmlnOiBKYXZhQ29kZWdlbkNvbmZpZywKICkgLT4gUmVzdWx0PFZlYzxPdXRwdXRGaWxlPj4KIHdoZXJlCiAgICAgSTogSXRlcmF0b3I8SXRlbSA9IFByb3RvUGFyc2VkRmxhZz4sCiB7Ci0gICAgbGV0IGZsYWdfZWxlbWVudHM6IFZlYzxGbGFnRWxlbWVudD4gPQotICAgICAgICBwYXJzZWRfZmxhZ3NfaXRlci5tYXAofHBmfCBjcmVhdGVfZmxhZ19lbGVtZW50KHBhY2thZ2UsICZwZiwgZmxhZ19pZHMuY2xvbmUoKSkpLmNvbGxlY3QoKTsKKyAgICBsZXQgZmxhZ19lbGVtZW50czogVmVjPEZsYWdFbGVtZW50PiA9IHBhcnNlZF9mbGFnc19pdGVyCisgICAgICAgIC5tYXAofHBmfCB7CisgICAgICAgICAgICBjcmVhdGVfZmxhZ19lbGVtZW50KHBhY2thZ2UsICZwZiwgY29uZmlnLmZsYWdfaWRzLmNsb25lKCksICZjb25maWcuZmluYWxpemVkX2ZsYWdzKQorICAgICAgICB9KQorICAgICAgICAuY29sbGVjdCgpOwogICAgIGxldCBuYW1lc3BhY2VfZmxhZ3MgPSBnZW5fZmxhZ3NfYnlfbmFtZXNwYWNlKCZmbGFnX2VsZW1lbnRzKTsKICAgICBsZXQgcHJvcGVydGllc19zZXQ6IEJUcmVlU2V0PFN0cmluZz4gPQogICAgICAgICBmbGFnX2VsZW1lbnRzLml0ZXIoKS5tYXAofGZlfCBmb3JtYXRfcHJvcGVydHlfbmFtZSgmZmUuZGV2aWNlX2NvbmZpZ19uYW1lc3BhY2UpKS5jb2xsZWN0KCk7Ci0gICAgbGV0IGlzX3Rlc3RfbW9kZSA9IGNvZGVnZW5fbW9kZSA9PSBDb2RlZ2VuTW9kZTo6VGVzdDsKLSAgICBsZXQgbGlicmFyeV9leHBvcnRlZCA9IGNvZGVnZW5fbW9kZSA9PSBDb2RlZ2VuTW9kZTo6RXhwb3J0ZWQ7CisgICAgbGV0IGlzX3Rlc3RfbW9kZSA9IGNvbmZpZy5jb2RlZ2VuX21vZGUgPT0gQ29kZWdlbk1vZGU6OlRlc3Q7CisgICAgbGV0IGxpYnJhcnlfZXhwb3J0ZWQgPSBjb25maWcuY29kZWdlbl9tb2RlID09IENvZGVnZW5Nb2RlOjpFeHBvcnRlZDsKICAgICBsZXQgcnVudGltZV9sb29rdXBfcmVxdWlyZWQgPQogICAgICAgICBmbGFnX2VsZW1lbnRzLml0ZXIoKS5hbnkofGVsZW18IGVsZW0uaXNfcmVhZF93cml0ZSkgfHwgbGlicmFyeV9leHBvcnRlZDsKICAgICBsZXQgY29udGFpbmVyID0gKGZsYWdfZWxlbWVudHMuZmlyc3QoKS5leHBlY3QoInplcm8gdGVtcGxhdGUgZmxhZ3MiKS5jb250YWluZXIpLnRvX3N0cmluZygpOworICAgIGxldCBpc19wbGF0Zm9ybV9jb250YWluZXIgPSBtYXRjaGVzIShjb250YWluZXIuYXNfc3RyKCksICJzeXN0ZW0iIHwgInByb2R1Y3QiIHwgInZlbmRvciIpOwogICAgIGxldCBjb250ZXh0ID0gQ29udGV4dCB7CiAgICAgICAgIGZsYWdfZWxlbWVudHMsCiAgICAgICAgIG5hbWVzcGFjZV9mbGFncywKQEAgLTU0LDE1ICs2OCwyMiBAQAogICAgICAgICBwcm9wZXJ0aWVzX3NldCwKICAgICAgICAgcGFja2FnZV9uYW1lOiBwYWNrYWdlLnRvX3N0cmluZygpLAogICAgICAgICBsaWJyYXJ5X2V4cG9ydGVkLAotICAgICAgICBhbGxvd19pbnN0cnVtZW50YXRpb24sCisgICAgICAgIGFsbG93X2luc3RydW1lbnRhdGlvbjogY29uZmlnLmFsbG93X2luc3RydW1lbnRhdGlvbiwKICAgICAgICAgY29udGFpbmVyLAorICAgICAgICBpc19wbGF0Zm9ybV9jb250YWluZXIsCisgICAgICAgIHBhY2thZ2VfZmluZ2VycHJpbnQ6IGZvcm1hdCEoIjB4ezpYfUwiLCBjb25maWcucGFja2FnZV9maW5nZXJwcmludCksCisgICAgICAgIG5ld19leHBvcnRlZDogY29uZmlnLm5ld19leHBvcnRlZCwKKyAgICAgICAgc2luZ2xlX2V4cG9ydGVkX2ZpbGU6IGNvbmZpZy5zaW5nbGVfZXhwb3J0ZWRfZmlsZSwKICAgICB9OwogICAgIGxldCBtdXQgdGVtcGxhdGUgPSBUaW55VGVtcGxhdGU6Om5ldygpOworICAgIGlmIGxpYnJhcnlfZXhwb3J0ZWQgJiYgY29uZmlnLnNpbmdsZV9leHBvcnRlZF9maWxlIHsKKyAgICAgICAgdGVtcGxhdGUuYWRkX3RlbXBsYXRlKAorICAgICAgICAgICAgIkV4cG9ydGVkRmxhZ3MuamF2YSIsCisgICAgICAgICAgICBpbmNsdWRlX3N0ciEoIi4uLy4uL3RlbXBsYXRlcy9FeHBvcnRlZEZsYWdzLmphdmEudGVtcGxhdGUiKSwKKyAgICAgICAgKT87CisgICAgfQogICAgIHRlbXBsYXRlLmFkZF90ZW1wbGF0ZSgiRmxhZ3MuamF2YSIsIGluY2x1ZGVfc3RyISgiLi4vLi4vdGVtcGxhdGVzL0ZsYWdzLmphdmEudGVtcGxhdGUiKSk/OwotICAgIHRlbXBsYXRlLmFkZF90ZW1wbGF0ZSgKLSAgICAgICAgIkZlYXR1cmVGbGFnc0ltcGwuamF2YSIsCi0gICAgICAgIGluY2x1ZGVfc3RyISgiLi4vLi4vdGVtcGxhdGVzL0ZlYXR1cmVGbGFnc0ltcGwuamF2YS50ZW1wbGF0ZSIpLAotICAgICk/OworICAgIGFkZF9mZWF0dXJlX2ZsYWdzX2ltcGxfdGVtcGxhdGUoJmNvbnRleHQsICZtdXQgdGVtcGxhdGUpPzsKICAgICB0ZW1wbGF0ZS5hZGRfdGVtcGxhdGUoCiAgICAgICAgICJGZWF0dXJlRmxhZ3MuamF2YSIsCiAgICAgICAgIGluY2x1ZGVfc3RyISgiLi4vLi4vdGVtcGxhdGVzL0ZlYXR1cmVGbGFncy5qYXZhLnRlbXBsYXRlIiksCkBAIC03NywxOCArOTgsMjUgQEAKICAgICApPzsKIAogICAgIGxldCBwYXRoOiBQYXRoQnVmID0gcGFja2FnZS5zcGxpdCgnLicpLmNvbGxlY3QoKTsKLSAgICBbCisgICAgbGV0IG11dCBmaWxlcyA9IHZlYyFbCiAgICAgICAgICJGbGFncy5qYXZhIiwKICAgICAgICAgIkZlYXR1cmVGbGFncy5qYXZhIiwKICAgICAgICAgIkZlYXR1cmVGbGFnc0ltcGwuamF2YSIsCiAgICAgICAgICJDdXN0b21GZWF0dXJlRmxhZ3MuamF2YSIsCiAgICAgICAgICJGYWtlRmVhdHVyZUZsYWdzSW1wbC5qYXZhIiwKLSAgICBdCi0gICAgLml0ZXIoKQotICAgIC5tYXAofGZpbGV8IHsKLSAgICAgICAgT2soT3V0cHV0RmlsZSB7IGNvbnRlbnRzOiB0ZW1wbGF0ZS5yZW5kZXIoZmlsZSwgJmNvbnRleHQpPy5pbnRvKCksIHBhdGg6IHBhdGguam9pbihmaWxlKSB9KQotICAgIH0pCi0gICAgLmNvbGxlY3Q6OjxSZXN1bHQ8VmVjPE91dHB1dEZpbGU+Pj4oKQorICAgIF07CisgICAgaWYgbGlicmFyeV9leHBvcnRlZCAmJiBjb25maWcuc2luZ2xlX2V4cG9ydGVkX2ZpbGUgeworICAgICAgICBmaWxlcy5wdXNoKCJFeHBvcnRlZEZsYWdzLmphdmEiKTsKKyAgICB9CisgICAgZmlsZXMKKyAgICAgICAgLml0ZXIoKQorICAgICAgICAubWFwKHxmaWxlfCB7CisgICAgICAgICAgICBPayhPdXRwdXRGaWxlIHsKKyAgICAgICAgICAgICAgICBjb250ZW50czogdGVtcGxhdGUucmVuZGVyKGZpbGUsICZjb250ZXh0KT8uaW50bygpLAorICAgICAgICAgICAgICAgIHBhdGg6IHBhdGguam9pbihmaWxlKSwKKyAgICAgICAgICAgIH0pCisgICAgICAgIH0pCisgICAgICAgIC5jb2xsZWN0Ojo8UmVzdWx0PFZlYzxPdXRwdXRGaWxlPj4+KCkKIH0KIAogZm4gZ2VuX2ZsYWdzX2J5X25hbWVzcGFjZShmbGFnczogJltGbGFnRWxlbWVudF0pIC0+IFZlYzxOYW1lc3BhY2VGbGFncz4gewpAQCAtMTIzLDYgKzE1MSwxMCBAQAogICAgIHB1YiBsaWJyYXJ5X2V4cG9ydGVkOiBib29sLAogICAgIHB1YiBhbGxvd19pbnN0cnVtZW50YXRpb246IGJvb2wsCiAgICAgcHViIGNvbnRhaW5lcjogU3RyaW5nLAorICAgIHB1YiBpc19wbGF0Zm9ybV9jb250YWluZXI6IGJvb2wsCisgICAgcHViIHBhY2thZ2VfZmluZ2VycHJpbnQ6IFN0cmluZywKKyAgICBwdWIgbmV3X2V4cG9ydGVkOiBib29sLAorICAgIHB1YiBzaW5nbGVfZXhwb3J0ZWRfZmlsZTogYm9vbCwKIH0KIAogI1tkZXJpdmUoU2VyaWFsaXplLCBEZWJ1ZyldCkBAIC0xMzcsMzAgKzE2OSw2NyBAQAogICAgIHB1YiBkZWZhdWx0X3ZhbHVlOiBib29sLAogICAgIHB1YiBkZXZpY2VfY29uZmlnX25hbWVzcGFjZTogU3RyaW5nLAogICAgIHB1YiBkZXZpY2VfY29uZmlnX2ZsYWc6IFN0cmluZywKKyAgICBwdWIgZmxhZ19uYW1lOiBTdHJpbmcsCiAgICAgcHViIGZsYWdfbmFtZV9jb25zdGFudF9zdWZmaXg6IFN0cmluZywKICAgICBwdWIgZmxhZ19vZmZzZXQ6IHUxNiwKICAgICBwdWIgaXNfcmVhZF93cml0ZTogYm9vbCwKICAgICBwdWIgbWV0aG9kX25hbWU6IFN0cmluZywKICAgICBwdWIgcHJvcGVydGllczogU3RyaW5nLAorICAgIHB1YiBmaW5hbGl6ZWRfc2RrX3ByZXNlbnQ6IGJvb2wsCisgICAgcHViIGZpbmFsaXplZF9zZGtfdmFsdWU6IGkzMiwKIH0KIAogZm4gY3JlYXRlX2ZsYWdfZWxlbWVudCgKICAgICBwYWNrYWdlOiAmc3RyLAogICAgIHBmOiAmUHJvdG9QYXJzZWRGbGFnLAogICAgIGZsYWdfb2Zmc2V0czogSGFzaE1hcDxTdHJpbmcsIHUxNj4sCisgICAgZmluYWxpemVkX2ZsYWdzOiAmRmluYWxpemVkRmxhZ01hcCwKICkgLT4gRmxhZ0VsZW1lbnQgewogICAgIGxldCBkZXZpY2VfY29uZmlnX2ZsYWcgPSBjb2RlZ2VuOjpjcmVhdGVfZGV2aWNlX2NvbmZpZ19pZGVudChwYWNrYWdlLCBwZi5uYW1lKCkpCiAgICAgICAgIC5leHBlY3QoInZhbHVlcyBjaGVja2VkIGF0IGZsYWcgcGFyc2UgdGltZSIpOworCisgICAgbGV0IG5vX2Fzc2lnbmVkX29mZnNldCA9ICFzaG91bGRfaW5jbHVkZV9mbGFnKHBmKTsKKworICAgIGxldCBmbGFnX29mZnNldCA9IG1hdGNoIGZsYWdfb2Zmc2V0cy5nZXQocGYubmFtZSgpKSB7CisgICAgICAgIFNvbWUob2Zmc2V0KSA9PiBvZmZzZXQsCisgICAgICAgIE5vbmUgPT4geworICAgICAgICAgICAgLy8gU3lzdGVtL3ZlbmRvci9wcm9kdWN0IFJPK2Rpc2FibGVkIGZsYWdzIGhhdmUgbm8gb2Zmc2V0IGluIHN0b3JhZ2UgZmlsZXMuCisgICAgICAgICAgICAvLyBBc3NpZ24gcGxhY2Vob2xkZXIgdmFsdWUuCisgICAgICAgICAgICBpZiBub19hc3NpZ25lZF9vZmZzZXQgeworICAgICAgICAgICAgICAgICYwCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBBbGwgb3RoZXIgZmxhZ3MgX211c3RfIGhhdmUgYW4gb2Zmc2V0LgorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgcGFuaWMhKCJ7fSIsIGZvcm1hdCEoIm1pc3NpbmcgZmxhZyBvZmZzZXQgZm9yIHt9IiwgcGYubmFtZSgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgLy8gQW4gZW1wdHkgbWFwIGlzIHByb3ZpZGVkIGlmIGNoZWNrX2FwaV9sZXZlbCBpcyBkaXNhYmxlZC4KKyAgICBsZXQgbXV0IGZpbmFsaXplZF9zZGtfcHJlc2VudDogYm9vbCA9IGZhbHNlOworICAgIGxldCBtdXQgZmluYWxpemVkX3Nka192YWx1ZTogaTMyID0gMDsKKyAgICBpZiAhZmluYWxpemVkX2ZsYWdzLmlzX2VtcHR5KCkgeworICAgICAgICBsZXQgZmluYWxpemVkX3NkayA9IGZpbmFsaXplZF9mbGFncy5nZXRfZmluYWxpemVkX2xldmVsKCZGaW5hbGl6ZWRGbGFnIHsKKyAgICAgICAgICAgIGZsYWdfbmFtZTogcGYubmFtZSgpLnRvX3N0cmluZygpLAorICAgICAgICAgICAgcGFja2FnZV9uYW1lOiBwYWNrYWdlLnRvX3N0cmluZygpLAorICAgICAgICB9KTsKKyAgICAgICAgZmluYWxpemVkX3Nka19wcmVzZW50ID0gZmluYWxpemVkX3Nkay5pc19zb21lKCk7CisgICAgICAgIGZpbmFsaXplZF9zZGtfdmFsdWUgPSBmaW5hbGl6ZWRfc2RrLm1hcCh8ZnwgZi4wKS51bndyYXBfb3JfZGVmYXVsdCgpOworICAgIH0KKwogICAgIEZsYWdFbGVtZW50IHsKICAgICAgICAgY29udGFpbmVyOiBwZi5jb250YWluZXIoKS50b19zdHJpbmcoKSwKICAgICAgICAgZGVmYXVsdF92YWx1ZTogcGYuc3RhdGUoKSA9PSBQcm90b0ZsYWdTdGF0ZTo6RU5BQkxFRCwKICAgICAgICAgZGV2aWNlX2NvbmZpZ19uYW1lc3BhY2U6IHBmLm5hbWVzcGFjZSgpLnRvX3N0cmluZygpLAogICAgICAgICBkZXZpY2VfY29uZmlnX2ZsYWcsCisgICAgICAgIGZsYWdfbmFtZTogcGYubmFtZSgpLnRvX3N0cmluZygpLAogICAgICAgICBmbGFnX25hbWVfY29uc3RhbnRfc3VmZml4OiBwZi5uYW1lKCkudG9fYXNjaWlfdXBwZXJjYXNlKCksCi0gICAgICAgIGZsYWdfb2Zmc2V0OiAqZmxhZ19vZmZzZXRzLmdldChwZi5uYW1lKCkpLmV4cGVjdCgiZGlkbnQgZmluZCBwYWNrYWdlIG9mZnNldCA6KCIpLAorICAgICAgICBmbGFnX29mZnNldDogKmZsYWdfb2Zmc2V0LAogICAgICAgICBpc19yZWFkX3dyaXRlOiBwZi5wZXJtaXNzaW9uKCkgPT0gUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9XUklURSwKICAgICAgICAgbWV0aG9kX25hbWU6IGZvcm1hdF9qYXZhX21ldGhvZF9uYW1lKHBmLm5hbWUoKSksCiAgICAgICAgIHByb3BlcnRpZXM6IGZvcm1hdF9wcm9wZXJ0eV9uYW1lKHBmLm5hbWVzcGFjZSgpKSwKKyAgICAgICAgZmluYWxpemVkX3Nka19wcmVzZW50LAorICAgICAgICBmaW5hbGl6ZWRfc2RrX3ZhbHVlLAogICAgIH0KIH0KIApAQCAtMTkwLDggKzI1OSw2MiBAQAogICAgIGZvcm1hdCEoIm1Qcm9wZXJ0aWVze317fSIsICZuYW1lWzAuLjFdLnRvX2FzY2lpX3VwcGVyY2FzZSgpLCAmbmFtZVsxLi5dKQogfQogCitmbiBhZGRfZmVhdHVyZV9mbGFnc19pbXBsX3RlbXBsYXRlKAorICAgIGNvbnRleHQ6ICZDb250ZXh0LAorICAgIHRlbXBsYXRlOiAmbXV0IFRpbnlUZW1wbGF0ZSwKKykgLT4gUmVzdWx0PCgpLCB0aW55dGVtcGxhdGU6OmVycm9yOjpFcnJvcj4geworICAgIGlmIGNvbnRleHQuaXNfdGVzdF9tb2RlIHsKKyAgICAgICAgLy8gVGVzdCBtb2RlIGhhcyBpdHMgb3duIHRlbXBsYXRlLCBzbyB1c2UgcmVnYXJkbGVzcyBvZiBhbnkgb3RoZXIgc2V0dGluZ3MuCisgICAgICAgIHRlbXBsYXRlLmFkZF90ZW1wbGF0ZSgKKyAgICAgICAgICAgICJGZWF0dXJlRmxhZ3NJbXBsLmphdmEiLAorICAgICAgICAgICAgaW5jbHVkZV9zdHIhKCIuLi8uLi90ZW1wbGF0ZXMvRmVhdHVyZUZsYWdzSW1wbC50ZXN0X21vZGUuamF2YS50ZW1wbGF0ZSIpLAorICAgICAgICApPzsKKyAgICAgICAgcmV0dXJuIE9rKCgpKTsKKyAgICB9CisKKyAgICBtYXRjaCAoY29udGV4dC5saWJyYXJ5X2V4cG9ydGVkLCBjb250ZXh0Lm5ld19leHBvcnRlZCwgY29udGV4dC5hbGxvd19pbnN0cnVtZW50YXRpb24pIHsKKyAgICAgICAgLy8gRXhwb3J0ZWQgbGlicmFyeSB3aXRoIG5ld19leHBvcnRlZCBlbmFibGVkLCB1c2UgbmV3IHN0b3JhZ2UgZXhwb3J0ZWQgdGVtcGxhdGUuCisgICAgICAgICh0cnVlLCB0cnVlLCBfKSA9PiB7CisgICAgICAgICAgICB0ZW1wbGF0ZS5hZGRfdGVtcGxhdGUoCisgICAgICAgICAgICAgICAgIkZlYXR1cmVGbGFnc0ltcGwuamF2YSIsCisgICAgICAgICAgICAgICAgaW5jbHVkZV9zdHIhKCIuLi8uLi90ZW1wbGF0ZXMvRmVhdHVyZUZsYWdzSW1wbC5leHBvcnRlZC5qYXZhLnRlbXBsYXRlIiksCisgICAgICAgICAgICApPzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEV4cG9ydGVkIGxpYnJhcnkgd2l0aCBuZXdfZXhwb3J0ZWQgTk9UIGVuYWJsZWQsIHVzZSBsZWdhY3kgKGRldmljZQorICAgICAgICAvLyBjb25maWcpIHRlbXBsYXRlLCBiZWNhdXNlIHJlZ2FyZGxlc3Mgb2YgYWxsb3dfaW5zdHJ1bWVudGF0aW9uLCB3ZSB1c2UKKyAgICAgICAgLy8gZGV2aWNlIGNvbmZpZyBmb3IgZXhwb3J0ZWQgbGlicyBpZiBuZXdfZXhwb3J0ZWQgaXNuJ3QgZW5hYmxlZC4KKyAgICAgICAgLy8gUmVtb3ZlIG9uY2UgbmV3X2V4cG9ydGVkIGlzIGZ1bGx5IHJvbGxlZCBvdXQuCisgICAgICAgICh0cnVlLCBmYWxzZSwgXykgPT4geworICAgICAgICAgICAgdGVtcGxhdGUuYWRkX3RlbXBsYXRlKAorICAgICAgICAgICAgICAgICJGZWF0dXJlRmxhZ3NJbXBsLmphdmEiLAorICAgICAgICAgICAgICAgIGluY2x1ZGVfc3RyISgiLi4vLi4vdGVtcGxhdGVzL0ZlYXR1cmVGbGFnc0ltcGwuZGV2aWNlQ29uZmlnLmphdmEudGVtcGxhdGUiKSwKKyAgICAgICAgICAgICk/OworICAgICAgICB9CisKKyAgICAgICAgLy8gTmV3IHN0b3JhZ2UgaW50ZXJuYWwgbW9kZS4KKyAgICAgICAgKGZhbHNlLCBfLCB0cnVlKSA9PiB7CisgICAgICAgICAgICB0ZW1wbGF0ZS5hZGRfdGVtcGxhdGUoCisgICAgICAgICAgICAgICAgIkZlYXR1cmVGbGFnc0ltcGwuamF2YSIsCisgICAgICAgICAgICAgICAgaW5jbHVkZV9zdHIhKCIuLi8uLi90ZW1wbGF0ZXMvRmVhdHVyZUZsYWdzSW1wbC5uZXdfc3RvcmFnZS5qYXZhLnRlbXBsYXRlIiksCisgICAgICAgICAgICApPzsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERldmljZSBjb25maWcgaW50ZXJuYWwgbW9kZS4gVXNlIGxlZ2FjeSAoZGV2aWNlIGNvbmZpZykgdGVtcGxhdGUuCisgICAgICAgIChmYWxzZSwgXywgZmFsc2UpID0+IHsKKyAgICAgICAgICAgIHRlbXBsYXRlLmFkZF90ZW1wbGF0ZSgKKyAgICAgICAgICAgICAgICAiRmVhdHVyZUZsYWdzSW1wbC5qYXZhIiwKKyAgICAgICAgICAgICAgICBpbmNsdWRlX3N0ciEoIi4uLy4uL3RlbXBsYXRlcy9GZWF0dXJlRmxhZ3NJbXBsLmRldmljZUNvbmZpZy5qYXZhLnRlbXBsYXRlIiksCisgICAgICAgICAgICApPzsKKyAgICAgICAgfQorICAgIH07CisgICAgT2soKCkpCit9CisKICNbY2ZnKHRlc3QpXQogbW9kIHRlc3RzIHsKKyAgICB1c2UgY29udmVydF9maW5hbGl6ZWRfZmxhZ3M6OkFwaUxldmVsOworCiAgICAgdXNlIHN1cGVyOjoqOwogICAgIHVzZSBjcmF0ZTo6Y29tbWFuZHM6OmFzc2lnbl9mbGFnX2lkczsKICAgICB1c2Ugc3RkOjpjb2xsZWN0aW9uczo6SGFzaE1hcDsKQEAgLTQ5NCwxMiArNjE3LDE5IEBACiAgICAgICAgICAgICBjcmF0ZTo6Y29tbWFuZHM6Om1vZGlmeV9wYXJzZWRfZmxhZ3NfYmFzZWRfb25fbW9kZShwYXJzZWRfZmxhZ3MsIG1vZGUpLnVud3JhcCgpOwogICAgICAgICBsZXQgZmxhZ19pZHMgPQogICAgICAgICAgICAgYXNzaWduX2ZsYWdfaWRzKGNyYXRlOjp0ZXN0OjpURVNUX1BBQ0tBR0UsIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pdGVyKCkpLnVud3JhcCgpOworICAgICAgICBsZXQgY29uZmlnID0gSmF2YUNvZGVnZW5Db25maWcgeworICAgICAgICAgICAgY29kZWdlbl9tb2RlOiBtb2RlLAorICAgICAgICAgICAgZmxhZ19pZHMsCisgICAgICAgICAgICBhbGxvd19pbnN0cnVtZW50YXRpb246IHRydWUsCisgICAgICAgICAgICBwYWNrYWdlX2ZpbmdlcnByaW50OiA1ODAxMTQ0Nzg0NjE4MjIxNjY4LAorICAgICAgICAgICAgbmV3X2V4cG9ydGVkOiBmYWxzZSwKKyAgICAgICAgICAgIHNpbmdsZV9leHBvcnRlZF9maWxlOiBmYWxzZSwKKyAgICAgICAgICAgIGZpbmFsaXplZF9mbGFnczogRmluYWxpemVkRmxhZ01hcDo6bmV3KCksCisgICAgICAgIH07CiAgICAgICAgIGxldCBnZW5lcmF0ZWRfZmlsZXMgPSBnZW5lcmF0ZV9qYXZhX2NvZGUoCiAgICAgICAgICAgICBjcmF0ZTo6dGVzdDo6VEVTVF9QQUNLQUdFLAogICAgICAgICAgICAgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzLmludG9faXRlcigpLAotICAgICAgICAgICAgbW9kZSwKLSAgICAgICAgICAgIGZsYWdfaWRzLAotICAgICAgICAgICAgZmFsc2UsCisgICAgICAgICAgICBjb25maWcsCiAgICAgICAgICkKICAgICAgICAgLnVud3JhcCgpOwogICAgICAgICBsZXQgZXhwZWN0X2ZsYWdzX2NvbnRlbnQgPSBFWFBFQ1RFRF9GTEFHX0NPTU1PTl9DT05URU5ULnRvX3N0cmluZygpCkBAIC01MDcsMjUgKzYzNywzOCBAQAogICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRmVhdHVyZUZsYWdzIEZFQVRVUkVfRkxBR1MgPSBuZXcgRmVhdHVyZUZsYWdzSW1wbCgpOwogICAgICAgICB9IiM7CiAKLSAgICAgICAgbGV0IGV4cGVjdGVkX2ZlYXR1cmVmbGFnc21wbF9jb250ZW50XzAgPSByIyIKKyAgICAgICAgbGV0IGV4cGVjdGVkX2ZlYXR1cmVmbGFnc21wbF9jb250ZW50ID0gciMiCiAgICAgICAgIHBhY2thZ2UgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0OwogICAgICAgICAvLyBUT0RPKGIvMzAzNzczMDU1KTogUmVtb3ZlIHRoZSBhbm5vdGF0aW9uIGFmdGVyIGFjY2VzcyBpc3N1ZSBpcyByZXNvbHZlZC4KICAgICAgICAgaW1wb3J0IGFuZHJvaWQuY29tcGF0LmFubm90YXRpb24uVW5zdXBwb3J0ZWRBcHBVc2FnZTsKLSAgICAgICAgaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuRGV2aWNlQ29uZmlnOwotICAgICAgICBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5EZXZpY2VDb25maWcuUHJvcGVydGllczsKLSAgICAgICAgIiM7Ci0KLSAgICAgICAgbGV0IGV4cGVjdGVkX2ZlYXR1cmVmbGFnc21wbF9jb250ZW50XzEgPSByIyIKKyAgICAgICAgaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CisgICAgICAgIGltcG9ydCBhbmRyb2lkLm9zLmZsYWdnaW5nLlBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbDsKKyAgICAgICAgaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CiAgICAgICAgIC8qKiBAaGlkZSAqLwogICAgICAgICBwdWJsaWMgZmluYWwgY2xhc3MgRmVhdHVyZUZsYWdzSW1wbCBpbXBsZW1lbnRzIEZlYXR1cmVGbGFncyB7Ci0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIGFjb25maWdfdGVzdF9pc19jYWNoZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gb3RoZXJfbmFtZXNwYWNlX2lzX2NhY2hlZCA9IGZhbHNlOworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJGZWF0dXJlRmxhZ3NJbXBsIjsKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gaXNDYWNoZWQgPSBmYWxzZTsKICAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGlzYWJsZWRSdyA9IGZhbHNlOwogICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBkaXNhYmxlZFJ3RXhwb3J0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGlzYWJsZWRSd0luT3RoZXJOYW1lc3BhY2UgPSBmYWxzZTsKICAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZW5hYmxlZFJ3ID0gdHJ1ZTsKLSAgICAgICAgIiM7Ci0gICAgICAgIGxldCBleHBlY3RlZF9mZWF0dXJlZmxhZ3NtcGxfY29udGVudF8yID0gciMiCisgICAgICAgICAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwgcmVhZGVyID0gUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsLmxvYWQoImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIsIDB4NTA4MUNFNzIyMUM3NzA2NEwpOworICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZFJ3ID0gcmVhZGVyLmdldEJvb2xlYW5GbGFnVmFsdWUoMCk7CisgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkUndFeHBvcnRlZCA9IHJlYWRlci5nZXRCb29sZWFuRmxhZ1ZhbHVlKDEpOworICAgICAgICAgICAgICAgICAgICBlbmFibGVkUncgPSByZWFkZXIuZ2V0Qm9vbGVhbkZsYWdWYWx1ZSg3KTsKKyAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWRSd0luT3RoZXJOYW1lc3BhY2UgPSByZWFkZXIuZ2V0Qm9vbGVhbkZsYWdWYWx1ZSgyKTsKKyAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsIGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTGlua2FnZUVycm9yIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZm9yIG1haW5saW5lIG1vZHVsZSBydW5uaW5nIG9uIG9sZGVyIGRldmljZXMuCisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIHJlcGxhY2VzIHRvIHZlcnNpb24gY2hlY2ssIGFmdGVyIHRoZSB2ZXJzaW9uIGJ1bXAuCisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXNDYWNoZWQgPSB0cnVlOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKICAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCkBAIC01MzYsOCArNjc5LDggQEAKICAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKICAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlZFJ3KCkgewotICAgICAgICAgICAgICAgIGlmICghYWNvbmZpZ190ZXN0X2lzX2NhY2hlZCkgewotICAgICAgICAgICAgICAgICAgICBsb2FkX292ZXJyaWRlc19hY29uZmlnX3Rlc3QoKTsKKyAgICAgICAgICAgICAgICBpZiAoIWlzQ2FjaGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGluaXQoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIGRpc2FibGVkUnc7CiAgICAgICAgICAgICB9CkBAIC01NDUsOCArNjg4LDggQEAKICAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKICAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlZFJ3RXhwb3J0ZWQoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFhY29uZmlnX3Rlc3RfaXNfY2FjaGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvYWRfb3ZlcnJpZGVzX2Fjb25maWdfdGVzdCgpOworICAgICAgICAgICAgICAgIGlmICghaXNDYWNoZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5pdCgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gZGlzYWJsZWRSd0V4cG9ydGVkOwogICAgICAgICAgICAgfQpAQCAtNTU0LDggKzY5Nyw4IEBACiAgICAgICAgICAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCiAgICAgICAgICAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzYWJsZWRSd0luT3RoZXJOYW1lc3BhY2UoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFvdGhlcl9uYW1lc3BhY2VfaXNfY2FjaGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvYWRfb3ZlcnJpZGVzX290aGVyX25hbWVzcGFjZSgpOworICAgICAgICAgICAgICAgIGlmICghaXNDYWNoZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5pdCgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gZGlzYWJsZWRSd0luT3RoZXJOYW1lc3BhY2U7CiAgICAgICAgICAgICB9CkBAIC01ODcsMjQ1ICs3MzAsMTcgQEAKICAgICAgICAgICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKICAgICAgICAgICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkUncoKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFhY29uZmlnX3Rlc3RfaXNfY2FjaGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvYWRfb3ZlcnJpZGVzX2Fjb25maWdfdGVzdCgpOworICAgICAgICAgICAgICAgIGlmICghaXNDYWNoZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5pdCgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gZW5hYmxlZFJ3OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgICIjOwogCi0gICAgICAgIGxldCBleHBlY3RfZmVhdHVyZWZsYWdzaW1wbF9jb250ZW50X29sZCA9IGV4cGVjdGVkX2ZlYXR1cmVmbGFnc21wbF9jb250ZW50XzAudG9fb3duZWQoKQotICAgICAgICAgICAgKyBleHBlY3RlZF9mZWF0dXJlZmxhZ3NtcGxfY29udGVudF8xCi0gICAgICAgICAgICArIHIjIgotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGxvYWRfb3ZlcnJpZGVzX2Fjb25maWdfdGVzdCgpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBEZXZpY2VDb25maWcuZ2V0UHJvcGVydGllcygiYWNvbmZpZ190ZXN0Iik7Ci0gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkUncgPQotICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRCb29sZWFuKEZsYWdzLkZMQUdfRElTQUJMRURfUlcsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWRSd0V4cG9ydGVkID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuZ2V0Qm9vbGVhbihGbGFncy5GTEFHX0RJU0FCTEVEX1JXX0VYUE9SVEVELCBmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIGVuYWJsZWRSdyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldEJvb2xlYW4oRmxhZ3MuRkxBR19FTkFCTEVEX1JXLCB0cnVlKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZWFkIHZhbHVlIGZyb20gbmFtZXNwYWNlIGFjb25maWdfdGVzdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJmcm9tIERldmljZUNvbmZpZy4gSXQgY291bGQgYmUgdGhhdCB0aGUgY29kZSB1c2luZyBmbGFnICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImV4ZWN1dGVkIGJlZm9yZSBTZXR0aW5nc1Byb3ZpZGVyIGluaXRpYWxpemF0aW9uLiBQbGVhc2UgdXNlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImZpeGVkIHJlYWQtb25seSBmbGFnIGJ5IGFkZGluZyBpc19maXhlZF9yZWFkX29ubHk6IHRydWUgaW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiZmxhZyBkZWNsYXJhdGlvbi4iLAotICAgICAgICAgICAgICAgICAgICAgICAgZQotICAgICAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhY29uZmlnX3Rlc3RfaXNfY2FjaGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGxvYWRfb3ZlcnJpZGVzX290aGVyX25hbWVzcGFjZSgpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBEZXZpY2VDb25maWcuZ2V0UHJvcGVydGllcygib3RoZXJfbmFtZXNwYWNlIik7Ci0gICAgICAgICAgICAgICAgICAgIGRpc2FibGVkUndJbk90aGVyTmFtZXNwYWNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuZ2V0Qm9vbGVhbihGbGFncy5GTEFHX0RJU0FCTEVEX1JXX0lOX09USEVSX05BTUVTUEFDRSwgZmFsc2UpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHJlYWQgdmFsdWUgZnJvbSBuYW1lc3BhY2Ugb3RoZXJfbmFtZXNwYWNlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImZyb20gRGV2aWNlQ29uZmlnLiBJdCBjb3VsZCBiZSB0aGF0IHRoZSBjb2RlIHVzaW5nIGZsYWcgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiZXhlY3V0ZWQgYmVmb3JlIFNldHRpbmdzUHJvdmlkZXIgaW5pdGlhbGl6YXRpb24uIFBsZWFzZSB1c2UgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiZml4ZWQgcmVhZC1vbmx5IGZsYWcgYnkgYWRkaW5nIGlzX2ZpeGVkX3JlYWRfb25seTogdHJ1ZSBpbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJmbGFnIGRlY2xhcmF0aW9uLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBlCi0gICAgICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG90aGVyX25hbWVzcGFjZV9pc19jYWNoZWQgPSB0cnVlOwotICAgICAgICAgICAgfSIjCi0gICAgICAgICAgICArIGV4cGVjdGVkX2ZlYXR1cmVmbGFnc21wbF9jb250ZW50XzI7Ci0KICAgICAgICAgbGV0IG11dCBmaWxlX3NldCA9IEhhc2hNYXA6OmZyb20oWwogICAgICAgICAgICAgKCJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvRmxhZ3MuamF2YSIsIGV4cGVjdF9mbGFnc19jb250ZW50LmFzX3N0cigpKSwKLSAgICAgICAgICAgICgKLSAgICAgICAgICAgICAgICAiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0ZlYXR1cmVGbGFnc0ltcGwuamF2YSIsCi0gICAgICAgICAgICAgICAgJmV4cGVjdF9mZWF0dXJlZmxhZ3NpbXBsX2NvbnRlbnRfb2xkLAotICAgICAgICAgICAgKSwKLSAgICAgICAgICAgICgiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0ZlYXR1cmVGbGFncy5qYXZhIiwgRVhQRUNURURfRkVBVFVSRUZMQUdTX0NPTU1PTl9DT05URU5UKSwKLSAgICAgICAgICAgICgKLSAgICAgICAgICAgICAgICAiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0N1c3RvbUZlYXR1cmVGbGFncy5qYXZhIiwKLSAgICAgICAgICAgICAgICBFWFBFQ1RFRF9DVVNUT01GRUFUVVJFRkxBR1NfQ09OVEVOVCwKLSAgICAgICAgICAgICksCi0gICAgICAgICAgICAoCi0gICAgICAgICAgICAgICAgImNvbS9hbmRyb2lkL2Fjb25maWcvdGVzdC9GYWtlRmVhdHVyZUZsYWdzSW1wbC5qYXZhIiwKLSAgICAgICAgICAgICAgICBFWFBFQ1RFRF9GQUtFRkVBVFVSRUZMQUdTSU1QTF9DT05URU5ULAotICAgICAgICAgICAgKSwKLSAgICAgICAgXSk7Ci0KLSAgICAgICAgZm9yIGZpbGUgaW4gZ2VuZXJhdGVkX2ZpbGVzIHsKLSAgICAgICAgICAgIGxldCBmaWxlX3BhdGggPSBmaWxlLnBhdGgudG9fc3RyKCkudW53cmFwKCk7Ci0gICAgICAgICAgICBhc3NlcnQhKGZpbGVfc2V0LmNvbnRhaW5zX2tleShmaWxlX3BhdGgpLCAiQ2Fubm90IGZpbmQge30iLCBmaWxlX3BhdGgpOwotICAgICAgICAgICAgYXNzZXJ0X2VxISgKLSAgICAgICAgICAgICAgICBOb25lLAotICAgICAgICAgICAgICAgIGNyYXRlOjp0ZXN0OjpmaXJzdF9zaWduaWZpY2FudF9jb2RlX2RpZmYoCi0gICAgICAgICAgICAgICAgICAgIGZpbGVfc2V0LmdldChmaWxlX3BhdGgpLnVud3JhcCgpLAotICAgICAgICAgICAgICAgICAgICAmU3RyaW5nOjpmcm9tX3V0ZjgoZmlsZS5jb250ZW50cykudW53cmFwKCkKLSAgICAgICAgICAgICAgICApLAotICAgICAgICAgICAgICAgICJGaWxlIHt9IGNvbnRlbnQgaXMgbm90IGNvcnJlY3QiLAotICAgICAgICAgICAgICAgIGZpbGVfcGF0aAotICAgICAgICAgICAgKTsKLSAgICAgICAgICAgIGZpbGVfc2V0LnJlbW92ZShmaWxlX3BhdGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgYXNzZXJ0IShmaWxlX3NldC5pc19lbXB0eSgpKTsKLQotICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzID0gY3JhdGU6OnRlc3Q6OnBhcnNlX3Rlc3RfZmxhZ3MoKTsKLSAgICAgICAgbGV0IG1vZGUgPSBDb2RlZ2VuTW9kZTo6UHJvZHVjdGlvbjsKLSAgICAgICAgbGV0IG1vZGlmaWVkX3BhcnNlZF9mbGFncyA9Ci0gICAgICAgICAgICBjcmF0ZTo6Y29tbWFuZHM6Om1vZGlmeV9wYXJzZWRfZmxhZ3NfYmFzZWRfb25fbW9kZShwYXJzZWRfZmxhZ3MsIG1vZGUpLnVud3JhcCgpOwotICAgICAgICBsZXQgZmxhZ19pZHMgPQotICAgICAgICAgICAgYXNzaWduX2ZsYWdfaWRzKGNyYXRlOjp0ZXN0OjpURVNUX1BBQ0tBR0UsIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pdGVyKCkpLnVud3JhcCgpOwotICAgICAgICBsZXQgZ2VuZXJhdGVkX2ZpbGVzID0gZ2VuZXJhdGVfamF2YV9jb2RlKAotICAgICAgICAgICAgY3JhdGU6OnRlc3Q6OlRFU1RfUEFDS0FHRSwKLSAgICAgICAgICAgIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pbnRvX2l0ZXIoKSwKLSAgICAgICAgICAgIG1vZGUsCi0gICAgICAgICAgICBmbGFnX2lkcywKLSAgICAgICAgICAgIHRydWUsCi0gICAgICAgICkKLSAgICAgICAgLnVud3JhcCgpOwotCi0gICAgICAgIGxldCBleHBlY3RfZmVhdHVyZWZsYWdzaW1wbF9jb250ZW50X25ldyA9IGV4cGVjdGVkX2ZlYXR1cmVmbGFnc21wbF9jb250ZW50XzAudG9fb3duZWQoKQotICAgICAgICAgICAgKyByIyIKLSAgICAgICAgICAgIGltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5TdG9yYWdlSW50ZXJuYWxSZWFkZXI7Ci0gICAgICAgICAgICBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLSAgICAgICAgICAgICIjCi0gICAgICAgICAgICArIGV4cGVjdGVkX2ZlYXR1cmVmbGFnc21wbF9jb250ZW50XzEKLSAgICAgICAgICAgICsgciMiCi0gICAgICAgIFN0b3JhZ2VJbnRlcm5hbFJlYWRlciByZWFkZXI7Ci0gICAgICAgIGJvb2xlYW4gcmVhZEZyb21OZXdTdG9yYWdlOwotCi0gICAgICAgIGJvb2xlYW4gdXNlTmV3U3RvcmFnZVZhbHVlQW5kRGlzY2FyZE9sZCA9IGZhbHNlOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUcgPSAiQWNvbmZpZ0phdmFDb2RlZ2VuIjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIFNVQ0NFU1NfTE9HID0gInN1Y2Nlc3M6ICVzIHZhbHVlIG1hdGNoZXMiOwotICAgICAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgTUlTTUFUQ0hfTE9HID0gImVycm9yOiAlcyB2YWx1ZSBtaXNtYXRjaCwgbmV3IHN0b3JhZ2UgdmFsdWUgaXMgJXMsIG9sZCBzdG9yYWdlIHZhbHVlIGlzICVzIjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEVSUk9SX0xPRyA9ICJlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyB2YWx1ZSI7Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGluaXQoKSB7Ci0gICAgICAgICAgICBpZiAocmVhZGVyICE9IG51bGwpIHJldHVybjsKLSAgICAgICAgICAgIGlmIChEZXZpY2VDb25maWcuZ2V0Qm9vbGVhbigiY29yZV9leHBlcmltZW50c190ZWFtX2ludGVybmFsIiwgImNvbS5hbmRyb2lkLnByb3ZpZGVycy5zZXR0aW5ncy5zdG9yYWdlX3Rlc3RfbWlzc2lvbl8xIiwgZmFsc2UpKSB7Ci0gICAgICAgICAgICAgICAgcmVhZEZyb21OZXdTdG9yYWdlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZWFkZXIgPSBuZXcgU3RvcmFnZUludGVybmFsUmVhZGVyKCJzeXN0ZW0iLCAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0Iik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVhZGVyID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHVzZU5ld1N0b3JhZ2VWYWx1ZUFuZERpc2NhcmRPbGQgPQotICAgICAgICAgICAgICAgIERldmljZUNvbmZpZy5nZXRCb29sZWFuKCJjb3JlX2V4cGVyaW1lbnRzX3RlYW1faW50ZXJuYWwiLCAiY29tLmFuZHJvaWQucHJvdmlkZXJzLnNldHRpbmdzLnVzZV9uZXdfc3RvcmFnZV92YWx1ZSIsIGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBsb2FkX292ZXJyaWRlc19hY29uZmlnX3Rlc3QoKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IERldmljZUNvbmZpZy5nZXRQcm9wZXJ0aWVzKCJhY29uZmlnX3Rlc3QiKTsKLSAgICAgICAgICAgICAgICBkaXNhYmxlZFJ3ID0KLSAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcy5nZXRCb29sZWFuKEZsYWdzLkZMQUdfRElTQUJMRURfUlcsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICBkaXNhYmxlZFJ3RXhwb3J0ZWQgPQotICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldEJvb2xlYW4oRmxhZ3MuRkxBR19ESVNBQkxFRF9SV19FWFBPUlRFRCwgZmFsc2UpOwotICAgICAgICAgICAgICAgIGVuYWJsZWRSdyA9Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuZ2V0Qm9vbGVhbihGbGFncy5GTEFHX0VOQUJMRURfUlcsIHRydWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHJlYWQgdmFsdWUgZnJvbSBuYW1lc3BhY2UgYWNvbmZpZ190ZXN0ICIKLSAgICAgICAgICAgICAgICAgICAgKyAiZnJvbSBEZXZpY2VDb25maWcuIEl0IGNvdWxkIGJlIHRoYXQgdGhlIGNvZGUgdXNpbmcgZmxhZyAiCi0gICAgICAgICAgICAgICAgICAgICsgImV4ZWN1dGVkIGJlZm9yZSBTZXR0aW5nc1Byb3ZpZGVyIGluaXRpYWxpemF0aW9uLiBQbGVhc2UgdXNlICIKLSAgICAgICAgICAgICAgICAgICAgKyAiZml4ZWQgcmVhZC1vbmx5IGZsYWcgYnkgYWRkaW5nIGlzX2ZpeGVkX3JlYWRfb25seTogdHJ1ZSBpbiAiCi0gICAgICAgICAgICAgICAgICAgICsgImZsYWcgZGVjbGFyYXRpb24uIiwKLSAgICAgICAgICAgICAgICAgICAgZQotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhY29uZmlnX3Rlc3RfaXNfY2FjaGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGluaXQoKTsKLSAgICAgICAgICAgIGlmIChyZWFkRnJvbU5ld1N0b3JhZ2UgJiYgcmVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHZhbDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB2YWwgPSByZWFkZXIuZ2V0Qm9vbGVhbkZsYWdWYWx1ZSgxKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSBkaXNhYmxlZFJ3KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoU1VDQ0VTU19MT0csICJkaXNhYmxlZFJ3IikpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCBTdHJpbmcuZm9ybWF0KE1JU01BVENIX0xPRywgImRpc2FibGVkUnciLCB2YWwsIGRpc2FibGVkUncpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICh1c2VOZXdTdG9yYWdlVmFsdWVBbmREaXNjYXJkT2xkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZFJ3ID0gdmFsOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgdmFsID0gcmVhZGVyLmdldEJvb2xlYW5GbGFnVmFsdWUoMik7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gZGlzYWJsZWRSd0V4cG9ydGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoU1VDQ0VTU19MT0csICJkaXNhYmxlZFJ3RXhwb3J0ZWQiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoTUlTTUFUQ0hfTE9HLCAiZGlzYWJsZWRSd0V4cG9ydGVkIiwgdmFsLCBkaXNhYmxlZFJ3RXhwb3J0ZWQpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmICh1c2VOZXdTdG9yYWdlVmFsdWVBbmREaXNjYXJkT2xkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZFJ3RXhwb3J0ZWQgPSB2YWw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICB2YWwgPSByZWFkZXIuZ2V0Qm9vbGVhbkZsYWdWYWx1ZSg4KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSBlbmFibGVkUncpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgU3RyaW5nLmZvcm1hdChTVUNDRVNTX0xPRywgImVuYWJsZWRSdyIpKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgU3RyaW5nLmZvcm1hdChNSVNNQVRDSF9MT0csICJlbmFibGVkUnciLCB2YWwsIGVuYWJsZWRSdykpOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHVzZU5ld1N0b3JhZ2VWYWx1ZUFuZERpc2NhcmRPbGQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVuYWJsZWRSdyA9IHZhbDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCBFUlJPUl9MT0csIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBsb2FkX292ZXJyaWRlc19vdGhlcl9uYW1lc3BhY2UoKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IERldmljZUNvbmZpZy5nZXRQcm9wZXJ0aWVzKCJvdGhlcl9uYW1lc3BhY2UiKTsKLSAgICAgICAgICAgICAgICBkaXNhYmxlZFJ3SW5PdGhlck5hbWVzcGFjZSA9Ci0gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuZ2V0Qm9vbGVhbihGbGFncy5GTEFHX0RJU0FCTEVEX1JXX0lOX09USEVSX05BTUVTUEFDRSwgZmFsc2UpOwotICAgICAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAiQ2Fubm90IHJlYWQgdmFsdWUgZnJvbSBuYW1lc3BhY2Ugb3RoZXJfbmFtZXNwYWNlICIKLSAgICAgICAgICAgICAgICAgICAgKyAiZnJvbSBEZXZpY2VDb25maWcuIEl0IGNvdWxkIGJlIHRoYXQgdGhlIGNvZGUgdXNpbmcgZmxhZyAiCi0gICAgICAgICAgICAgICAgICAgICsgImV4ZWN1dGVkIGJlZm9yZSBTZXR0aW5nc1Byb3ZpZGVyIGluaXRpYWxpemF0aW9uLiBQbGVhc2UgdXNlICIKLSAgICAgICAgICAgICAgICAgICAgKyAiZml4ZWQgcmVhZC1vbmx5IGZsYWcgYnkgYWRkaW5nIGlzX2ZpeGVkX3JlYWRfb25seTogdHJ1ZSBpbiAiCi0gICAgICAgICAgICAgICAgICAgICsgImZsYWcgZGVjbGFyYXRpb24uIiwKLSAgICAgICAgICAgICAgICAgICAgZQotICAgICAgICAgICAgICAgICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvdGhlcl9uYW1lc3BhY2VfaXNfY2FjaGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGluaXQoKTsKLSAgICAgICAgICAgIGlmIChyZWFkRnJvbU5ld1N0b3JhZ2UgJiYgcmVhZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBib29sZWFuIHZhbDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICB2YWwgPSByZWFkZXIuZ2V0Qm9vbGVhbkZsYWdWYWx1ZSgzKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbCA9PSBkaXNhYmxlZFJ3SW5PdGhlck5hbWVzcGFjZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCBTdHJpbmcuZm9ybWF0KFNVQ0NFU1NfTE9HLCAiZGlzYWJsZWRSd0luT3RoZXJOYW1lc3BhY2UiKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoTUlTTUFUQ0hfTE9HLCAiZGlzYWJsZWRSd0luT3RoZXJOYW1lc3BhY2UiLCB2YWwsIGRpc2FibGVkUndJbk90aGVyTmFtZXNwYWNlKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAodXNlTmV3U3RvcmFnZVZhbHVlQW5kRGlzY2FyZE9sZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWRSd0luT3RoZXJOYW1lc3BhY2UgPSB2YWw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgRVJST1JfTE9HLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0iIyArIGV4cGVjdGVkX2ZlYXR1cmVmbGFnc21wbF9jb250ZW50XzI7Ci0KLSAgICAgICAgbGV0IG11dCBmaWxlX3NldCA9IEhhc2hNYXA6OmZyb20oWwotICAgICAgICAgICAgKCJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvRmxhZ3MuamF2YSIsIGV4cGVjdF9mbGFnc19jb250ZW50LmFzX3N0cigpKSwKLSAgICAgICAgICAgICgKLSAgICAgICAgICAgICAgICAiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0ZlYXR1cmVGbGFnc0ltcGwuamF2YSIsCi0gICAgICAgICAgICAgICAgJmV4cGVjdF9mZWF0dXJlZmxhZ3NpbXBsX2NvbnRlbnRfbmV3LAotICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0ZlYXR1cmVGbGFnc0ltcGwuamF2YSIsIGV4cGVjdGVkX2ZlYXR1cmVmbGFnc21wbF9jb250ZW50KSwKICAgICAgICAgICAgICgiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0ZlYXR1cmVGbGFncy5qYXZhIiwgRVhQRUNURURfRkVBVFVSRUZMQUdTX0NPTU1PTl9DT05URU5UKSwKICAgICAgICAgICAgICgKICAgICAgICAgICAgICAgICAiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0N1c3RvbUZlYXR1cmVGbGFncy5qYXZhIiwKQEAgLTg2MywxMiArNzc4LDE5IEBACiAgICAgICAgICAgICBjcmF0ZTo6Y29tbWFuZHM6Om1vZGlmeV9wYXJzZWRfZmxhZ3NfYmFzZWRfb25fbW9kZShwYXJzZWRfZmxhZ3MsIG1vZGUpLnVud3JhcCgpOwogICAgICAgICBsZXQgZmxhZ19pZHMgPQogICAgICAgICAgICAgYXNzaWduX2ZsYWdfaWRzKGNyYXRlOjp0ZXN0OjpURVNUX1BBQ0tBR0UsIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pdGVyKCkpLnVud3JhcCgpOworICAgICAgICBsZXQgY29uZmlnID0gSmF2YUNvZGVnZW5Db25maWcgeworICAgICAgICAgICAgY29kZWdlbl9tb2RlOiBtb2RlLAorICAgICAgICAgICAgZmxhZ19pZHMsCisgICAgICAgICAgICBhbGxvd19pbnN0cnVtZW50YXRpb246IHRydWUsCisgICAgICAgICAgICBwYWNrYWdlX2ZpbmdlcnByaW50OiA1ODAxMTQ0Nzg0NjE4MjIxNjY4LAorICAgICAgICAgICAgbmV3X2V4cG9ydGVkOiBmYWxzZSwKKyAgICAgICAgICAgIHNpbmdsZV9leHBvcnRlZF9maWxlOiBmYWxzZSwKKyAgICAgICAgICAgIGZpbmFsaXplZF9mbGFnczogRmluYWxpemVkRmxhZ01hcDo6bmV3KCksCisgICAgICAgIH07CiAgICAgICAgIGxldCBnZW5lcmF0ZWRfZmlsZXMgPSBnZW5lcmF0ZV9qYXZhX2NvZGUoCiAgICAgICAgICAgICBjcmF0ZTo6dGVzdDo6VEVTVF9QQUNLQUdFLAogICAgICAgICAgICAgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzLmludG9faXRlcigpLAotICAgICAgICAgICAgbW9kZSwKLSAgICAgICAgICAgIGZsYWdfaWRzLAotICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgIGNvbmZpZywKICAgICAgICAgKQogICAgICAgICAudW53cmFwKCk7CiAKQEAgLTkwNyw2ICs4MjksNyBAQAogCiAgICAgICAgIGxldCBleHBlY3RfZmVhdHVyZV9mbGFnc19pbXBsX2NvbnRlbnQgPSByIyIKICAgICAgICAgcGFja2FnZSBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3Q7CisgICAgICAgIGltcG9ydCBhbmRyb2lkLm9zLkJpbmRlcjsKICAgICAgICAgaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuRGV2aWNlQ29uZmlnOwogICAgICAgICBpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5EZXZpY2VDb25maWcuUHJvcGVydGllczsKICAgICAgICAgLyoqIEBoaWRlICovCkBAIC05MTYsOCArODM5LDggQEAKICAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZW5hYmxlZEZpeGVkUm9FeHBvcnRlZCA9IGZhbHNlOwogICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlbmFibGVkUm9FeHBvcnRlZCA9IGZhbHNlOwogCi0KICAgICAgICAgICAgIHByaXZhdGUgdm9pZCBsb2FkX292ZXJyaWRlc19hY29uZmlnX3Rlc3QoKSB7CisgICAgICAgICAgICAgICAgZmluYWwgbG9uZyBpZGVudCA9IEJpbmRlci5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICAgICAgICAgIHRyeSB7CiAgICAgICAgICAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IERldmljZUNvbmZpZy5nZXRQcm9wZXJ0aWVzKCJhY29uZmlnX3Rlc3QiKTsKICAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWRSd0V4cG9ydGVkID0KQEAgLTkzNSwyNyArODU4LDQyOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgKyAiZmxhZyBkZWNsYXJhdGlvbi4iLAogICAgICAgICAgICAgICAgICAgICAgICAgZQogICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGlzb2xhdGVkIHByb2Nlc3MgY2FzZSwgc2tpcCBsb2FkaW5nIGZsYWcgdmFsdWUgZnJvbSB0aGUgc3RvcmFnZSwgdXNlIHRoZSBkZWZhdWx0CisgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgICAgICAgICAgQmluZGVyLnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaWRlbnQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBhY29uZmlnX3Rlc3RfaXNfY2FjaGVkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzYWJsZWRSd0V4cG9ydGVkKCkgewogICAgICAgICAgICAgICAgIGlmICghYWNvbmZpZ190ZXN0X2lzX2NhY2hlZCkgewotICAgICAgICAgICAgICAgICAgICBsb2FkX292ZXJyaWRlc19hY29uZmlnX3Rlc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfb3ZlcnJpZGVzX2Fjb25maWdfdGVzdCgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gZGlzYWJsZWRSd0V4cG9ydGVkOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkRml4ZWRSb0V4cG9ydGVkKCkgewogICAgICAgICAgICAgICAgIGlmICghYWNvbmZpZ190ZXN0X2lzX2NhY2hlZCkgewotICAgICAgICAgICAgICAgICAgICBsb2FkX292ZXJyaWRlc19hY29uZmlnX3Rlc3QoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvYWRfb3ZlcnJpZGVzX2Fjb25maWdfdGVzdCgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICByZXR1cm4gZW5hYmxlZEZpeGVkUm9FeHBvcnRlZDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEBPdmVycmlkZQogICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlZFJvRXhwb3J0ZWQoKSB7CiAgICAgICAgICAgICAgICAgaWYgKCFhY29uZmlnX3Rlc3RfaXNfY2FjaGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxvYWRfb3ZlcnJpZGVzX2Fjb25maWdfdGVzdCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbG9hZF9vdmVycmlkZXNfYWNvbmZpZ190ZXN0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBlbmFibGVkUm9FeHBvcnRlZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSIjOworCisgICAgICAgIGxldCBleHBlY3RfY3VzdG9tX2ZlYXR1cmVfZmxhZ3NfY29udGVudCA9IHIjIgorICAgICAgICBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdDsKKworICAgICAgICBpbXBvcnQgamF2YS51dGlsLkFycmF5czsKKyAgICAgICAgaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworICAgICAgICBpbXBvcnQgamF2YS51dGlsLkxpc3Q7CisgICAgICAgIGltcG9ydCBqYXZhLnV0aWwuU2V0OworICAgICAgICBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLkJpUHJlZGljYXRlOworICAgICAgICBpbXBvcnQgamF2YS51dGlsLmZ1bmN0aW9uLlByZWRpY2F0ZTsKKworICAgICAgICAvKiogQGhpZGUgKi8KKyAgICAgICAgcHVibGljIGNsYXNzIEN1c3RvbUZlYXR1cmVGbGFncyBpbXBsZW1lbnRzIEZlYXR1cmVGbGFncyB7CisKKyAgICAgICAgICAgIHByaXZhdGUgQmlQcmVkaWNhdGU8U3RyaW5nLCBQcmVkaWNhdGU8RmVhdHVyZUZsYWdzPj4gbUdldFZhbHVlSW1wbDsKKworICAgICAgICAgICAgcHVibGljIEN1c3RvbUZlYXR1cmVGbGFncyhCaVByZWRpY2F0ZTxTdHJpbmcsIFByZWRpY2F0ZTxGZWF0dXJlRmxhZ3M+PiBnZXRWYWx1ZUltcGwpIHsKKyAgICAgICAgICAgICAgICBtR2V0VmFsdWVJbXBsID0gZ2V0VmFsdWVJbXBsOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGRpc2FibGVkUndFeHBvcnRlZCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWUoRmxhZ3MuRkxBR19ESVNBQkxFRF9SV19FWFBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgRmVhdHVyZUZsYWdzOjpkaXNhYmxlZFJ3RXhwb3J0ZWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkRml4ZWRSb0V4cG9ydGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZShGbGFncy5GTEFHX0VOQUJMRURfRklYRURfUk9fRVhQT1JURUQsCisgICAgICAgICAgICAgICAgICAgIEZlYXR1cmVGbGFnczo6ZW5hYmxlZEZpeGVkUm9FeHBvcnRlZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWRSb0V4cG9ydGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZShGbGFncy5GTEFHX0VOQUJMRURfUk9fRVhQT1JURUQsCisgICAgICAgICAgICAgICAgICAgIEZlYXR1cmVGbGFnczo6ZW5hYmxlZFJvRXhwb3J0ZWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBnZXRWYWx1ZShTdHJpbmcgZmxhZ05hbWUsIFByZWRpY2F0ZTxGZWF0dXJlRmxhZ3M+IGdldHRlcikgeworICAgICAgICAgICAgICAgIHJldHVybiBtR2V0VmFsdWVJbXBsLnRlc3QoZmxhZ05hbWUsIGdldHRlcik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0RmxhZ05hbWVzKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KAorICAgICAgICAgICAgICAgICAgICBGbGFncy5GTEFHX0RJU0FCTEVEX1JXX0VYUE9SVEVELAorICAgICAgICAgICAgICAgICAgICBGbGFncy5GTEFHX0VOQUJMRURfRklYRURfUk9fRVhQT1JURUQsCisgICAgICAgICAgICAgICAgICAgIEZsYWdzLkZMQUdfRU5BQkxFRF9ST19FWFBPUlRFRAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByaXZhdGUgU2V0PFN0cmluZz4gbVJlYWRPbmx5RmxhZ3NTZXQgPSBuZXcgSGFzaFNldDw+KAorICAgICAgICAgICAgICAgIEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgICAgICIiCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICIjOworCisgICAgICAgIGxldCBtdXQgZmlsZV9zZXQgPSBIYXNoTWFwOjpmcm9tKFsKKyAgICAgICAgICAgICgiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0ZsYWdzLmphdmEiLCBleHBlY3RfZmxhZ3NfY29udGVudCksCisgICAgICAgICAgICAoImNvbS9hbmRyb2lkL2Fjb25maWcvdGVzdC9GZWF0dXJlRmxhZ3MuamF2YSIsIGV4cGVjdF9mZWF0dXJlX2ZsYWdzX2NvbnRlbnQpLAorICAgICAgICAgICAgKCJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvRmVhdHVyZUZsYWdzSW1wbC5qYXZhIiwgZXhwZWN0X2ZlYXR1cmVfZmxhZ3NfaW1wbF9jb250ZW50KSwKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0N1c3RvbUZlYXR1cmVGbGFncy5qYXZhIiwKKyAgICAgICAgICAgICAgICBleHBlY3RfY3VzdG9tX2ZlYXR1cmVfZmxhZ3NfY29udGVudCwKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoCisgICAgICAgICAgICAgICAgImNvbS9hbmRyb2lkL2Fjb25maWcvdGVzdC9GYWtlRmVhdHVyZUZsYWdzSW1wbC5qYXZhIiwKKyAgICAgICAgICAgICAgICBFWFBFQ1RFRF9GQUtFRkVBVFVSRUZMQUdTSU1QTF9DT05URU5ULAorICAgICAgICAgICAgKSwKKyAgICAgICAgXSk7CisKKyAgICAgICAgZm9yIGZpbGUgaW4gZ2VuZXJhdGVkX2ZpbGVzIHsKKyAgICAgICAgICAgIGxldCBmaWxlX3BhdGggPSBmaWxlLnBhdGgudG9fc3RyKCkudW53cmFwKCk7CisgICAgICAgICAgICBhc3NlcnQhKGZpbGVfc2V0LmNvbnRhaW5zX2tleShmaWxlX3BhdGgpLCAiQ2Fubm90IGZpbmQge30iLCBmaWxlX3BhdGgpOworICAgICAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgICAgIGNyYXRlOjp0ZXN0OjpmaXJzdF9zaWduaWZpY2FudF9jb2RlX2RpZmYoCisgICAgICAgICAgICAgICAgICAgIGZpbGVfc2V0LmdldChmaWxlX3BhdGgpLnVud3JhcCgpLAorICAgICAgICAgICAgICAgICAgICAmU3RyaW5nOjpmcm9tX3V0ZjgoZmlsZS5jb250ZW50cykudW53cmFwKCkKKyAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgICAgICJGaWxlIHt9IGNvbnRlbnQgaXMgbm90IGNvcnJlY3QiLAorICAgICAgICAgICAgICAgIGZpbGVfcGF0aAorICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGZpbGVfc2V0LnJlbW92ZShmaWxlX3BhdGgpOworICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0IShmaWxlX3NldC5pc19lbXB0eSgpKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9nZW5lcmF0ZV9qYXZhX2NvZGVfbmV3X2V4cG9ydGVkKCkgeworICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzID0gY3JhdGU6OnRlc3Q6OnBhcnNlX3Rlc3RfZmxhZ3MoKTsKKyAgICAgICAgbGV0IG1vZGUgPSBDb2RlZ2VuTW9kZTo6RXhwb3J0ZWQ7CisgICAgICAgIGxldCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MgPQorICAgICAgICAgICAgY3JhdGU6OmNvbW1hbmRzOjptb2RpZnlfcGFyc2VkX2ZsYWdzX2Jhc2VkX29uX21vZGUocGFyc2VkX2ZsYWdzLCBtb2RlKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGZsYWdfaWRzID0KKyAgICAgICAgICAgIGFzc2lnbl9mbGFnX2lkcyhjcmF0ZTo6dGVzdDo6VEVTVF9QQUNLQUdFLCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaXRlcigpKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGNvbmZpZyA9IEphdmFDb2RlZ2VuQ29uZmlnIHsKKyAgICAgICAgICAgIGNvZGVnZW5fbW9kZTogbW9kZSwKKyAgICAgICAgICAgIGZsYWdfaWRzLAorICAgICAgICAgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uOiB0cnVlLAorICAgICAgICAgICAgcGFja2FnZV9maW5nZXJwcmludDogNTgwMTE0NDc4NDYxODIyMTY2OCwKKyAgICAgICAgICAgIG5ld19leHBvcnRlZDogdHJ1ZSwKKyAgICAgICAgICAgIHNpbmdsZV9leHBvcnRlZF9maWxlOiBmYWxzZSwKKyAgICAgICAgICAgIGZpbmFsaXplZF9mbGFnczogRmluYWxpemVkRmxhZ01hcDo6bmV3KCksCisgICAgICAgIH07CisgICAgICAgIGxldCBnZW5lcmF0ZWRfZmlsZXMgPSBnZW5lcmF0ZV9qYXZhX2NvZGUoCisgICAgICAgICAgICBjcmF0ZTo6dGVzdDo6VEVTVF9QQUNLQUdFLAorICAgICAgICAgICAgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzLmludG9faXRlcigpLAorICAgICAgICAgICAgY29uZmlnLAorICAgICAgICApCisgICAgICAgIC51bndyYXAoKTsKKworICAgICAgICBsZXQgZXhwZWN0X2ZsYWdzX2NvbnRlbnQgPSByIyIKKyAgICAgICAgcGFja2FnZSBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3Q7CisgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICBwdWJsaWMgZmluYWwgY2xhc3MgRmxhZ3MgeworICAgICAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBGTEFHX0RJU0FCTEVEX1JXX0VYUE9SVEVEID0gImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9yd19leHBvcnRlZCI7CisgICAgICAgICAgICAvKiogQGhpZGUgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfRU5BQkxFRF9GSVhFRF9ST19FWFBPUlRFRCA9ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCI7CisgICAgICAgICAgICAvKiogQGhpZGUgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfRU5BQkxFRF9ST19FWFBPUlRFRCA9ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9yb19leHBvcnRlZCI7CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZGlzYWJsZWRSd0V4cG9ydGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBGRUFUVVJFX0ZMQUdTLmRpc2FibGVkUndFeHBvcnRlZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGVuYWJsZWRGaXhlZFJvRXhwb3J0ZWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZFQVRVUkVfRkxBR1MuZW5hYmxlZEZpeGVkUm9FeHBvcnRlZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHVibGljIHN0YXRpYyBib29sZWFuIGVuYWJsZWRSb0V4cG9ydGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBGRUFUVVJFX0ZMQUdTLmVuYWJsZWRSb0V4cG9ydGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBGZWF0dXJlRmxhZ3MgRkVBVFVSRV9GTEFHUyA9IG5ldyBGZWF0dXJlRmxhZ3NJbXBsKCk7CisgICAgICAgIH0KKyAgICAgICAgIiM7CisKKyAgICAgICAgbGV0IGV4cGVjdF9mZWF0dXJlX2ZsYWdzX2NvbnRlbnQgPSByIyIKKyAgICAgICAgcGFja2FnZSBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3Q7CisgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICBwdWJsaWMgaW50ZXJmYWNlIEZlYXR1cmVGbGFncyB7CisgICAgICAgICAgICBib29sZWFuIGRpc2FibGVkUndFeHBvcnRlZCgpOworICAgICAgICAgICAgYm9vbGVhbiBlbmFibGVkRml4ZWRSb0V4cG9ydGVkKCk7CisgICAgICAgICAgICBib29sZWFuIGVuYWJsZWRSb0V4cG9ydGVkKCk7CisgICAgICAgIH0KKyAgICAgICAgIiM7CisKKyAgICAgICAgbGV0IGV4cGVjdF9mZWF0dXJlX2ZsYWdzX2ltcGxfY29udGVudCA9IHIjIgorICAgICAgICBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdDsKKyAgICAgICAgaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7CisgICAgICAgIGltcG9ydCBhbmRyb2lkLm9zLmZsYWdnaW5nLkFjb25maWdQYWNrYWdlOworICAgICAgICBpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBjbGFzcyBGZWF0dXJlRmxhZ3NJbXBsIGltcGxlbWVudHMgRmVhdHVyZUZsYWdzIHsKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRmVhdHVyZUZsYWdzSW1wbEV4cG9ydCI7CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIGlzQ2FjaGVkID0gZmFsc2U7CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGRpc2FibGVkUndFeHBvcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlbmFibGVkRml4ZWRSb0V4cG9ydGVkID0gZmFsc2U7CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVuYWJsZWRSb0V4cG9ydGVkID0gZmFsc2U7CisgICAgICAgICAgICBwcml2YXRlIHZvaWQgaW5pdCgpIHsKKyAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICBBY29uZmlnUGFja2FnZSByZWFkZXIgPSBBY29uZmlnUGFja2FnZS5sb2FkKCJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgZGlzYWJsZWRSd0V4cG9ydGVkID0gcmVhZGVyLmdldEJvb2xlYW5GbGFnVmFsdWUoImRpc2FibGVkX3J3X2V4cG9ydGVkIiwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBlbmFibGVkRml4ZWRSb0V4cG9ydGVkID0gcmVhZGVyLmdldEJvb2xlYW5GbGFnVmFsdWUoImVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQiLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGVuYWJsZWRSb0V4cG9ydGVkID0gcmVhZGVyLmdldEJvb2xlYW5GbGFnVmFsdWUoImVuYWJsZWRfcm9fZXhwb3J0ZWQiLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcGFzcworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsIGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTGlua2FnZUVycm9yIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZm9yIG1haW5saW5lIG1vZHVsZSBydW5uaW5nIG9uIG9sZGVyIGRldmljZXMuCisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIHJlcGxhY2VzIHRvIHZlcnNpb24gY2hlY2ssIGFmdGVyIHRoZSB2ZXJzaW9uIGJ1bXAuCisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXNDYWNoZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlZFJ3RXhwb3J0ZWQoKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpc0NhY2hlZCkgeworICAgICAgICAgICAgICAgICAgICBpbml0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBkaXNhYmxlZFJ3RXhwb3J0ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWRGaXhlZFJvRXhwb3J0ZWQoKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpc0NhY2hlZCkgeworICAgICAgICAgICAgICAgICAgICBpbml0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBlbmFibGVkRml4ZWRSb0V4cG9ydGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkUm9FeHBvcnRlZCgpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzQ2FjaGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGluaXQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGVuYWJsZWRSb0V4cG9ydGVkOworICAgICAgICAgICAgfQorICAgICAgICB9IiM7CisKKyAgICAgICAgbGV0IGV4cGVjdF9jdXN0b21fZmVhdHVyZV9mbGFnc19jb250ZW50ID0gciMiCisgICAgICAgIHBhY2thZ2UgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0OworCisgICAgICAgIGltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworICAgICAgICBpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CisgICAgICAgIGltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKyAgICAgICAgaW1wb3J0IGphdmEudXRpbC5TZXQ7CisgICAgICAgIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uQmlQcmVkaWNhdGU7CisgICAgICAgIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOworCisgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICBwdWJsaWMgY2xhc3MgQ3VzdG9tRmVhdHVyZUZsYWdzIGltcGxlbWVudHMgRmVhdHVyZUZsYWdzIHsKKworICAgICAgICAgICAgcHJpdmF0ZSBCaVByZWRpY2F0ZTxTdHJpbmcsIFByZWRpY2F0ZTxGZWF0dXJlRmxhZ3M+PiBtR2V0VmFsdWVJbXBsOworCisgICAgICAgICAgICBwdWJsaWMgQ3VzdG9tRmVhdHVyZUZsYWdzKEJpUHJlZGljYXRlPFN0cmluZywgUHJlZGljYXRlPEZlYXR1cmVGbGFncz4+IGdldFZhbHVlSW1wbCkgeworICAgICAgICAgICAgICAgIG1HZXRWYWx1ZUltcGwgPSBnZXRWYWx1ZUltcGw7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZGlzYWJsZWRSd0V4cG9ydGVkKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXRWYWx1ZShGbGFncy5GTEFHX0RJU0FCTEVEX1JXX0VYUE9SVEVELAorICAgICAgICAgICAgICAgICAgICBGZWF0dXJlRmxhZ3M6OmRpc2FibGVkUndFeHBvcnRlZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWRGaXhlZFJvRXhwb3J0ZWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlKEZsYWdzLkZMQUdfRU5BQkxFRF9GSVhFRF9ST19FWFBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgRmVhdHVyZUZsYWdzOjplbmFibGVkRml4ZWRSb0V4cG9ydGVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgcHVibGljIGJvb2xlYW4gZW5hYmxlZFJvRXhwb3J0ZWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGdldFZhbHVlKEZsYWdzLkZMQUdfRU5BQkxFRF9ST19FWFBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgRmVhdHVyZUZsYWdzOjplbmFibGVkUm9FeHBvcnRlZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHByb3RlY3RlZCBib29sZWFuIGdldFZhbHVlKFN0cmluZyBmbGFnTmFtZSwgUHJlZGljYXRlPEZlYXR1cmVGbGFncz4gZ2V0dGVyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1HZXRWYWx1ZUltcGwudGVzdChmbGFnTmFtZSwgZ2V0dGVyKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRGbGFnTmFtZXMoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QoCisgICAgICAgICAgICAgICAgICAgIEZsYWdzLkZMQUdfRElTQUJMRURfUldfRVhQT1JURUQsCisgICAgICAgICAgICAgICAgICAgIEZsYWdzLkZMQUdfRU5BQkxFRF9GSVhFRF9ST19FWFBPUlRFRCwKKyAgICAgICAgICAgICAgICAgICAgRmxhZ3MuRkxBR19FTkFCTEVEX1JPX0VYUE9SVEVECisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBtUmVhZE9ubHlGbGFnc1NldCA9IG5ldyBIYXNoU2V0PD4oCisgICAgICAgICAgICAgICAgQXJyYXlzLmFzTGlzdCgKKyAgICAgICAgICAgICAgICAgICAgIiIKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICApOworICAgICAgICB9CisgICAgIiM7CisKKyAgICAgICAgbGV0IG11dCBmaWxlX3NldCA9IEhhc2hNYXA6OmZyb20oWworICAgICAgICAgICAgKCJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvRmxhZ3MuamF2YSIsIGV4cGVjdF9mbGFnc19jb250ZW50KSwKKyAgICAgICAgICAgICgiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0ZlYXR1cmVGbGFncy5qYXZhIiwgZXhwZWN0X2ZlYXR1cmVfZmxhZ3NfY29udGVudCksCisgICAgICAgICAgICAoImNvbS9hbmRyb2lkL2Fjb25maWcvdGVzdC9GZWF0dXJlRmxhZ3NJbXBsLmphdmEiLCBleHBlY3RfZmVhdHVyZV9mbGFnc19pbXBsX2NvbnRlbnQpLAorICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICJjb20vYW5kcm9pZC9hY29uZmlnL3Rlc3QvQ3VzdG9tRmVhdHVyZUZsYWdzLmphdmEiLAorICAgICAgICAgICAgICAgIGV4cGVjdF9jdXN0b21fZmVhdHVyZV9mbGFnc19jb250ZW50LAorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAiY29tL2FuZHJvaWQvYWNvbmZpZy90ZXN0L0Zha2VGZWF0dXJlRmxhZ3NJbXBsLmphdmEiLAorICAgICAgICAgICAgICAgIEVYUEVDVEVEX0ZBS0VGRUFUVVJFRkxBR1NJTVBMX0NPTlRFTlQsCisgICAgICAgICAgICApLAorICAgICAgICBdKTsKKworICAgICAgICBmb3IgZmlsZSBpbiBnZW5lcmF0ZWRfZmlsZXMgeworICAgICAgICAgICAgbGV0IGZpbGVfcGF0aCA9IGZpbGUucGF0aC50b19zdHIoKS51bndyYXAoKTsKKyAgICAgICAgICAgIGFzc2VydCEoZmlsZV9zZXQuY29udGFpbnNfa2V5KGZpbGVfcGF0aCksICJDYW5ub3QgZmluZCB7fSIsIGZpbGVfcGF0aCk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAgICAgY3JhdGU6OnRlc3Q6OmZpcnN0X3NpZ25pZmljYW50X2NvZGVfZGlmZigKKyAgICAgICAgICAgICAgICAgICAgZmlsZV9zZXQuZ2V0KGZpbGVfcGF0aCkudW53cmFwKCksCisgICAgICAgICAgICAgICAgICAgICZTdHJpbmc6OmZyb21fdXRmOChmaWxlLmNvbnRlbnRzKS51bndyYXAoKQorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgIkZpbGUge30gY29udGVudCBpcyBub3QgY29ycmVjdCIsCisgICAgICAgICAgICAgICAgZmlsZV9wYXRoCisgICAgICAgICAgICApOworICAgICAgICAgICAgZmlsZV9zZXQucmVtb3ZlKGZpbGVfcGF0aCk7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQhKGZpbGVfc2V0LmlzX2VtcHR5KCkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2dlbmVyYXRlX2phdmFfY29kZV9uZXdfZXhwb3J0ZWRfd2l0aF9zZGtfY2hlY2soKSB7CisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3MgPSBjcmF0ZTo6dGVzdDo6cGFyc2VfdGVzdF9mbGFncygpOworICAgICAgICBsZXQgbW9kZSA9IENvZGVnZW5Nb2RlOjpFeHBvcnRlZDsKKyAgICAgICAgbGV0IG1vZGlmaWVkX3BhcnNlZF9mbGFncyA9CisgICAgICAgICAgICBjcmF0ZTo6Y29tbWFuZHM6Om1vZGlmeV9wYXJzZWRfZmxhZ3NfYmFzZWRfb25fbW9kZShwYXJzZWRfZmxhZ3MsIG1vZGUpLnVud3JhcCgpOworICAgICAgICBsZXQgZmxhZ19pZHMgPQorICAgICAgICAgICAgYXNzaWduX2ZsYWdfaWRzKGNyYXRlOjp0ZXN0OjpURVNUX1BBQ0tBR0UsIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pdGVyKCkpLnVud3JhcCgpOworICAgICAgICBsZXQgbXV0IGZpbmFsaXplZF9mbGFncyA9IEZpbmFsaXplZEZsYWdNYXA6Om5ldygpOworICAgICAgICBmaW5hbGl6ZWRfZmxhZ3MuaW5zZXJ0X2lmX25ldygKKyAgICAgICAgICAgIEFwaUxldmVsKDM2KSwKKyAgICAgICAgICAgIEZpbmFsaXplZEZsYWcgeworICAgICAgICAgICAgICAgIGZsYWdfbmFtZTogImRpc2FibGVkX3J3X2V4cG9ydGVkIi50b19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICBwYWNrYWdlX25hbWU6ICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiLnRvX3N0cmluZygpLAorICAgICAgICAgICAgfSwKKyAgICAgICAgKTsKKyAgICAgICAgbGV0IGNvbmZpZyA9IEphdmFDb2RlZ2VuQ29uZmlnIHsKKyAgICAgICAgICAgIGNvZGVnZW5fbW9kZTogbW9kZSwKKyAgICAgICAgICAgIGZsYWdfaWRzLAorICAgICAgICAgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uOiB0cnVlLAorICAgICAgICAgICAgcGFja2FnZV9maW5nZXJwcmludDogNTgwMTE0NDc4NDYxODIyMTY2OCwKKyAgICAgICAgICAgIG5ld19leHBvcnRlZDogdHJ1ZSwKKyAgICAgICAgICAgIHNpbmdsZV9leHBvcnRlZF9maWxlOiBmYWxzZSwKKyAgICAgICAgICAgIGZpbmFsaXplZF9mbGFncywKKyAgICAgICAgfTsKKyAgICAgICAgbGV0IGdlbmVyYXRlZF9maWxlcyA9IGdlbmVyYXRlX2phdmFfY29kZSgKKyAgICAgICAgICAgIGNyYXRlOjp0ZXN0OjpURVNUX1BBQ0tBR0UsCisgICAgICAgICAgICBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaW50b19pdGVyKCksCisgICAgICAgICAgICBjb25maWcsCisgICAgICAgICkKKyAgICAgICAgLnVud3JhcCgpOworCisgICAgICAgIGxldCBleHBlY3RfZmxhZ3NfY29udGVudCA9IHIjIgorICAgICAgICBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdDsKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIHB1YmxpYyBmaW5hbCBjbGFzcyBGbGFncyB7CisgICAgICAgICAgICAvKiogQGhpZGUgKi8KKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfRElTQUJMRURfUldfRVhQT1JURUQgPSAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2V4cG9ydGVkIjsKKyAgICAgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19FTkFCTEVEX0ZJWEVEX1JPX0VYUE9SVEVEID0gImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkIjsKKyAgICAgICAgICAgIC8qKiBAaGlkZSAqLworICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRkxBR19FTkFCTEVEX1JPX0VYUE9SVEVEID0gImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3JvX2V4cG9ydGVkIjsKKyAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBkaXNhYmxlZFJ3RXhwb3J0ZWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZFQVRVUkVfRkxBR1MuZGlzYWJsZWRSd0V4cG9ydGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5hYmxlZEZpeGVkUm9FeHBvcnRlZCgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkVBVFVSRV9GTEFHUy5lbmFibGVkRml4ZWRSb0V4cG9ydGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZW5hYmxlZFJvRXhwb3J0ZWQoKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEZFQVRVUkVfRkxBR1MuZW5hYmxlZFJvRXhwb3J0ZWQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIEZlYXR1cmVGbGFncyBGRUFUVVJFX0ZMQUdTID0gbmV3IEZlYXR1cmVGbGFnc0ltcGwoKTsKKyAgICAgICAgfQorICAgICAgICAiIzsKKworICAgICAgICBsZXQgZXhwZWN0X2ZlYXR1cmVfZmxhZ3NfY29udGVudCA9IHIjIgorICAgICAgICBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdDsKKyAgICAgICAgLyoqIEBoaWRlICovCisgICAgICAgIHB1YmxpYyBpbnRlcmZhY2UgRmVhdHVyZUZsYWdzIHsKKyAgICAgICAgICAgIGJvb2xlYW4gZGlzYWJsZWRSd0V4cG9ydGVkKCk7CisgICAgICAgICAgICBib29sZWFuIGVuYWJsZWRGaXhlZFJvRXhwb3J0ZWQoKTsKKyAgICAgICAgICAgIGJvb2xlYW4gZW5hYmxlZFJvRXhwb3J0ZWQoKTsKKyAgICAgICAgfQorICAgICAgICAiIzsKKworICAgICAgICBsZXQgZXhwZWN0X2ZlYXR1cmVfZmxhZ3NfaW1wbF9jb250ZW50ID0gciMiCisgICAgICAgIHBhY2thZ2UgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0OworICAgICAgICBpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKKyAgICAgICAgaW1wb3J0IGFuZHJvaWQub3MuZmxhZ2dpbmcuQWNvbmZpZ1BhY2thZ2U7CisgICAgICAgIGltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworICAgICAgICAvKiogQGhpZGUgKi8KKyAgICAgICAgcHVibGljIGZpbmFsIGNsYXNzIEZlYXR1cmVGbGFnc0ltcGwgaW1wbGVtZW50cyBGZWF0dXJlRmxhZ3MgeworICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJGZWF0dXJlRmxhZ3NJbXBsRXhwb3J0IjsKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gaXNDYWNoZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZGlzYWJsZWRSd0V4cG9ydGVkID0gZmFsc2U7CisgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVuYWJsZWRGaXhlZFJvRXhwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZW5hYmxlZFJvRXhwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIHByaXZhdGUgdm9pZCBpbml0KCkgeworICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgIEFjb25maWdQYWNrYWdlIHJlYWRlciA9IEFjb25maWdQYWNrYWdlLmxvYWQoImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIpOworICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZFJ3RXhwb3J0ZWQgPSBCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMzYgPyB0cnVlIDogcmVhZGVyLmdldEJvb2xlYW5GbGFnVmFsdWUoImRpc2FibGVkX3J3X2V4cG9ydGVkIiwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICBlbmFibGVkRml4ZWRSb0V4cG9ydGVkID0gcmVhZGVyLmdldEJvb2xlYW5GbGFnVmFsdWUoImVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQiLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgIGVuYWJsZWRSb0V4cG9ydGVkID0gcmVhZGVyLmdldEJvb2xlYW5GbGFnVmFsdWUoImVuYWJsZWRfcm9fZXhwb3J0ZWQiLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcGFzcworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsIGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfSBjYXRjaCAoTGlua2FnZUVycm9yIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZm9yIG1haW5saW5lIG1vZHVsZSBydW5uaW5nIG9uIG9sZGVyIGRldmljZXMuCisgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGJlIHJlcGxhY2VzIHRvIHZlcnNpb24gY2hlY2ssIGFmdGVyIHRoZSB2ZXJzaW9uIGJ1bXAuCisgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaXNDYWNoZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBkaXNhYmxlZFJ3RXhwb3J0ZWQoKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpc0NhY2hlZCkgeworICAgICAgICAgICAgICAgICAgICBpbml0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBkaXNhYmxlZFJ3RXhwb3J0ZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgIHB1YmxpYyBib29sZWFuIGVuYWJsZWRGaXhlZFJvRXhwb3J0ZWQoKSB7CisgICAgICAgICAgICAgICAgaWYgKCFpc0NhY2hlZCkgeworICAgICAgICAgICAgICAgICAgICBpbml0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBlbmFibGVkRml4ZWRSb0V4cG9ydGVkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBlbmFibGVkUm9FeHBvcnRlZCgpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWlzQ2FjaGVkKSB7CisgICAgICAgICAgICAgICAgICAgIGluaXQoKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVuYWJsZWRSb0V4cG9ydGVkOwogICAgICAgICAgICAgfQpAQCAtMTA1NiwxMiArMTM4MSwxOSBAQAogICAgICAgICAgICAgY3JhdGU6OmNvbW1hbmRzOjptb2RpZnlfcGFyc2VkX2ZsYWdzX2Jhc2VkX29uX21vZGUocGFyc2VkX2ZsYWdzLCBtb2RlKS51bndyYXAoKTsKICAgICAgICAgbGV0IGZsYWdfaWRzID0KICAgICAgICAgICAgIGFzc2lnbl9mbGFnX2lkcyhjcmF0ZTo6dGVzdDo6VEVTVF9QQUNLQUdFLCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaXRlcigpKS51bndyYXAoKTsKKyAgICAgICAgbGV0IGNvbmZpZyA9IEphdmFDb2RlZ2VuQ29uZmlnIHsKKyAgICAgICAgICAgIGNvZGVnZW5fbW9kZTogbW9kZSwKKyAgICAgICAgICAgIGZsYWdfaWRzLAorICAgICAgICAgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uOiB0cnVlLAorICAgICAgICAgICAgcGFja2FnZV9maW5nZXJwcmludDogNTgwMTE0NDc4NDYxODIyMTY2OCwKKyAgICAgICAgICAgIG5ld19leHBvcnRlZDogZmFsc2UsCisgICAgICAgICAgICBzaW5nbGVfZXhwb3J0ZWRfZmlsZTogZmFsc2UsCisgICAgICAgICAgICBmaW5hbGl6ZWRfZmxhZ3M6IEZpbmFsaXplZEZsYWdNYXA6Om5ldygpLAorICAgICAgICB9OwogICAgICAgICBsZXQgZ2VuZXJhdGVkX2ZpbGVzID0gZ2VuZXJhdGVfamF2YV9jb2RlKAogICAgICAgICAgICAgY3JhdGU6OnRlc3Q6OlRFU1RfUEFDS0FHRSwKICAgICAgICAgICAgIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pbnRvX2l0ZXIoKSwKLSAgICAgICAgICAgIG1vZGUsCi0gICAgICAgICAgICBmbGFnX2lkcywKLSAgICAgICAgICAgIHRydWUsCisgICAgICAgICAgICBjb25maWcsCiAgICAgICAgICkKICAgICAgICAgLnVud3JhcCgpOwogCkBAIC0xMTc3LDEyICsxNTA5LDE5IEBACiAgICAgICAgICAgICBjcmF0ZTo6Y29tbWFuZHM6Om1vZGlmeV9wYXJzZWRfZmxhZ3NfYmFzZWRfb25fbW9kZShwYXJzZWRfZmxhZ3MsIG1vZGUpLnVud3JhcCgpOwogICAgICAgICBsZXQgZmxhZ19pZHMgPQogICAgICAgICAgICAgYXNzaWduX2ZsYWdfaWRzKGNyYXRlOjp0ZXN0OjpURVNUX1BBQ0tBR0UsIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pdGVyKCkpLnVud3JhcCgpOworICAgICAgICBsZXQgY29uZmlnID0gSmF2YUNvZGVnZW5Db25maWcgeworICAgICAgICAgICAgY29kZWdlbl9tb2RlOiBtb2RlLAorICAgICAgICAgICAgZmxhZ19pZHMsCisgICAgICAgICAgICBhbGxvd19pbnN0cnVtZW50YXRpb246IHRydWUsCisgICAgICAgICAgICBwYWNrYWdlX2ZpbmdlcnByaW50OiA1ODAxMTQ0Nzg0NjE4MjIxNjY4LAorICAgICAgICAgICAgbmV3X2V4cG9ydGVkOiBmYWxzZSwKKyAgICAgICAgICAgIHNpbmdsZV9leHBvcnRlZF9maWxlOiBmYWxzZSwKKyAgICAgICAgICAgIGZpbmFsaXplZF9mbGFnczogRmluYWxpemVkRmxhZ01hcDo6bmV3KCksCisgICAgICAgIH07CiAgICAgICAgIGxldCBnZW5lcmF0ZWRfZmlsZXMgPSBnZW5lcmF0ZV9qYXZhX2NvZGUoCiAgICAgICAgICAgICBjcmF0ZTo6dGVzdDo6VEVTVF9QQUNLQUdFLAogICAgICAgICAgICAgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzLmludG9faXRlcigpLAotICAgICAgICAgICAgbW9kZSwKLSAgICAgICAgICAgIGZsYWdfaWRzLAotICAgICAgICAgICAgdHJ1ZSwKKyAgICAgICAgICAgIGNvbmZpZywKICAgICAgICAgKQogICAgICAgICAudW53cmFwKCk7CiAgICAgICAgIGxldCBleHBlY3RfZmVhdHVyZWZsYWdzX2NvbnRlbnQgPSByIyIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29kZWdlbi9tb2QucnMgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvZGVnZW4vbW9kLnJzCmluZGV4IDFlYTNiMzcuLjllZDY2ZGIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29kZWdlbi9tb2QucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9jb2RlZ2VuL21vZC5ycwpAQCAtNTAsNjcgKzUwLDYgQEAKICNbY2ZnKHRlc3QpXQogbW9kIHRlc3RzIHsKICAgICB1c2Ugc3VwZXI6Oio7Ci0gICAgdXNlIGFjb25maWdfcHJvdG9zOjppc192YWxpZF9jb250YWluZXJfaWRlbnQ7Ci0KLSAgICAjW3Rlc3RdCi0gICAgZm4gdGVzdF9pc192YWxpZF9uYW1lX2lkZW50KCkgewotICAgICAgICBhc3NlcnQhKGlzX3ZhbGlkX25hbWVfaWRlbnQoImZvbyIpKTsKLSAgICAgICAgYXNzZXJ0IShpc192YWxpZF9uYW1lX2lkZW50KCJmb29fYmFyXzEyMyIpKTsKLSAgICAgICAgYXNzZXJ0IShpc192YWxpZF9uYW1lX2lkZW50KCJmb29fIikpOwotCi0gICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX25hbWVfaWRlbnQoIiIpKTsKLSAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfbmFtZV9pZGVudCgiMTIzX2ZvbyIpKTsKLSAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfbmFtZV9pZGVudCgiZm9vLWJhciIpKTsKLSAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfbmFtZV9pZGVudCgiZm9vLWJcdXswMGU1fXIiKSk7Ci0gICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX25hbWVfaWRlbnQoImZvb19fYmFyIikpOwotICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9uYW1lX2lkZW50KCJfZm9vIikpOwotICAgIH0KLQotICAgICNbdGVzdF0KLSAgICBmbiB0ZXN0X2lzX3ZhbGlkX3BhY2thZ2VfaWRlbnQoKSB7Ci0gICAgICAgIGFzc2VydCEoaXNfdmFsaWRfcGFja2FnZV9pZGVudCgiZm9vLmJhciIpKTsKLSAgICAgICAgYXNzZXJ0IShpc192YWxpZF9wYWNrYWdlX2lkZW50KCJmb28uYmFyX2JheiIpKTsKLSAgICAgICAgYXNzZXJ0IShpc192YWxpZF9wYWNrYWdlX2lkZW50KCJmb28uYmFyLmExMjMiKSk7Ci0KLSAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfcGFja2FnZV9pZGVudCgiZm9vX2Jhcl8xMjMiKSk7Ci0gICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX3BhY2thZ2VfaWRlbnQoImZvbyIpKTsKLSAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfcGFja2FnZV9pZGVudCgiZm9vLl9iYXIiKSk7Ci0gICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX3BhY2thZ2VfaWRlbnQoIiIpKTsKLSAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfcGFja2FnZV9pZGVudCgiMTIzX2ZvbyIpKTsKLSAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfcGFja2FnZV9pZGVudCgiZm9vLWJhciIpKTsKLSAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfcGFja2FnZV9pZGVudCgiZm9vLWJcdXswMGU1fXIiKSk7Ci0gICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX3BhY2thZ2VfaWRlbnQoImZvby5iYXIuMTIzIikpOwotICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9wYWNrYWdlX2lkZW50KCIuZm9vLmJhciIpKTsKLSAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfcGFja2FnZV9pZGVudCgiZm9vLmJhci4iKSk7Ci0gICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX3BhY2thZ2VfaWRlbnQoIi4iKSk7Ci0gICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX3BhY2thZ2VfaWRlbnQoIi4uIikpOwotICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9wYWNrYWdlX2lkZW50KCJmb28uLmJhciIpKTsKLSAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfcGFja2FnZV9pZGVudCgiZm9vLl9fYmFyIikpOwotICAgIH0KLQotICAgICNbdGVzdF0KLSAgICBmbiB0ZXN0X2lzX3ZhbGlkX2NvbnRhaW5lcl9pZGVudCgpIHsKLSAgICAgICAgYXNzZXJ0IShpc192YWxpZF9jb250YWluZXJfaWRlbnQoImZvby5iYXIiKSk7Ci0gICAgICAgIGFzc2VydCEoaXNfdmFsaWRfY29udGFpbmVyX2lkZW50KCJmb28uYmFyX2JheiIpKTsKLSAgICAgICAgYXNzZXJ0IShpc192YWxpZF9jb250YWluZXJfaWRlbnQoImZvby5iYXIuYTEyMyIpKTsKLSAgICAgICAgYXNzZXJ0IShpc192YWxpZF9jb250YWluZXJfaWRlbnQoImZvbyIpKTsKLSAgICAgICAgYXNzZXJ0IShpc192YWxpZF9jb250YWluZXJfaWRlbnQoImZvb19iYXJfMTIzIikpOwotCi0gICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX2NvbnRhaW5lcl9pZGVudCgiIikpOwotICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9jb250YWluZXJfaWRlbnQoImZvby5fYmFyIikpOwotICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9jb250YWluZXJfaWRlbnQoIl9mb28iKSk7Ci0gICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX2NvbnRhaW5lcl9pZGVudCgiMTIzX2ZvbyIpKTsKLSAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfY29udGFpbmVyX2lkZW50KCJmb28tYmFyIikpOwotICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9jb250YWluZXJfaWRlbnQoImZvby1iXHV7MDBlNX1yIikpOwotICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9jb250YWluZXJfaWRlbnQoImZvby5iYXIuMTIzIikpOwotICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9jb250YWluZXJfaWRlbnQoIi5mb28uYmFyIikpOwotICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9jb250YWluZXJfaWRlbnQoImZvby5iYXIuIikpOwotICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9jb250YWluZXJfaWRlbnQoIi4iKSk7Ci0gICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX2NvbnRhaW5lcl9pZGVudCgiLi4iKSk7Ci0gICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX2NvbnRhaW5lcl9pZGVudCgiZm9vLi5iYXIiKSk7Ci0gICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX2NvbnRhaW5lcl9pZGVudCgiZm9vLl9fYmFyIikpOwotICAgIH0KLQogICAgICNbdGVzdF0KICAgICBmbiB0ZXN0X2NyZWF0ZV9kZXZpY2VfY29uZmlnX2lkZW50KCkgewogICAgICAgICBhc3NlcnRfZXEhKApkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9jb2RlZ2VuL3J1c3QucnMgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvZGVnZW4vcnVzdC5ycwppbmRleCA2ZjNmN2JmLi4yZWU1ZjM2IDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvZGVnZW4vcnVzdC5ycworKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvZGVnZW4vcnVzdC5ycwpAQCAtMjQsMTQgKzI0LDEzIEBACiAKIHVzZSBjcmF0ZTo6Y29kZWdlbjsKIHVzZSBjcmF0ZTo6Y29kZWdlbjo6Q29kZWdlbk1vZGU7Ci11c2UgY3JhdGU6OmNvbW1hbmRzOjpPdXRwdXRGaWxlOwordXNlIGNyYXRlOjpjb21tYW5kczo6e3Nob3VsZF9pbmNsdWRlX2ZsYWcsIE91dHB1dEZpbGV9OwogCiBwdWIgZm4gZ2VuZXJhdGVfcnVzdF9jb2RlPEk+KAogICAgIHBhY2thZ2U6ICZzdHIsCiAgICAgZmxhZ19pZHM6IEhhc2hNYXA8U3RyaW5nLCB1MTY+LAogICAgIHBhcnNlZF9mbGFnc19pdGVyOiBJLAogICAgIGNvZGVnZW5fbW9kZTogQ29kZWdlbk1vZGUsCi0gICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uOiBib29sLAogKSAtPiBSZXN1bHQ8T3V0cHV0RmlsZT4KIHdoZXJlCiAgICAgSTogSXRlcmF0b3I8SXRlbSA9IFByb3RvUGFyc2VkRmxhZz4sCkBAIC00Niw3ICs0NSw2IEBACiAgICAgICAgIHRlbXBsYXRlX2ZsYWdzLAogICAgICAgICBtb2R1bGVzOiBwYWNrYWdlLnNwbGl0KCcuJykubWFwKHxzfCBzLnRvX3N0cmluZygpKS5jb2xsZWN0Ojo8VmVjPF8+PigpLAogICAgICAgICBoYXNfcmVhZHdyaXRlLAotICAgICAgICBhbGxvd19pbnN0cnVtZW50YXRpb24sCiAgICAgICAgIGNvbnRhaW5lciwKICAgICB9OwogICAgIGxldCBtdXQgdGVtcGxhdGUgPSBUaW55VGVtcGxhdGU6Om5ldygpOwpAQCAtNzAsNyArNjgsNiBAQAogICAgIHB1YiB0ZW1wbGF0ZV9mbGFnczogVmVjPFRlbXBsYXRlUGFyc2VkRmxhZz4sCiAgICAgcHViIG1vZHVsZXM6IFZlYzxTdHJpbmc+LAogICAgIHB1YiBoYXNfcmVhZHdyaXRlOiBib29sLAotICAgIHB1YiBhbGxvd19pbnN0cnVtZW50YXRpb246IGJvb2wsCiAgICAgcHViIGNvbnRhaW5lcjogU3RyaW5nLAogfQogCkBAIC04OCw2ICs4NSwyMSBAQAogaW1wbCBUZW1wbGF0ZVBhcnNlZEZsYWcgewogICAgICNbYWxsb3coY2xpcHB5Ojpub25taW5pbWFsX2Jvb2wpXQogICAgIGZuIG5ldyhwYWNrYWdlOiAmc3RyLCBmbGFnX29mZnNldHM6IEhhc2hNYXA8U3RyaW5nLCB1MTY+LCBwZjogJlByb3RvUGFyc2VkRmxhZykgLT4gU2VsZiB7CisgICAgICAgIGxldCBmbGFnX29mZnNldCA9IG1hdGNoIGZsYWdfb2Zmc2V0cy5nZXQocGYubmFtZSgpKSB7CisgICAgICAgICAgICBTb21lKG9mZnNldCkgPT4gb2Zmc2V0LAorICAgICAgICAgICAgTm9uZSA9PiB7CisgICAgICAgICAgICAgICAgLy8gU3lzdGVtL3ZlbmRvci9wcm9kdWN0IFJPK2Rpc2FibGVkIGZsYWdzIGhhdmUgbm8gb2Zmc2V0IGluIHN0b3JhZ2UgZmlsZXMuCisgICAgICAgICAgICAgICAgLy8gQXNzaWduIHBsYWNlaG9sZGVyIHZhbHVlLgorICAgICAgICAgICAgICAgIGlmICFzaG91bGRfaW5jbHVkZV9mbGFnKHBmKSB7CisgICAgICAgICAgICAgICAgICAgICYwCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEFsbCBvdGhlciBmbGFncyBfbXVzdF8gaGF2ZSBhbiBvZmZzZXQuCisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHBhbmljISgie30iLCBmb3JtYXQhKCJtaXNzaW5nIGZsYWcgb2Zmc2V0IGZvciB7fSIsIHBmLm5hbWUoKSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfTsKKwogICAgICAgICBTZWxmIHsKICAgICAgICAgICAgIHJlYWR3cml0ZTogcGYucGVybWlzc2lvbigpID09IFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfV1JJVEUsCiAgICAgICAgICAgICBkZWZhdWx0X3ZhbHVlOiBtYXRjaCBwZi5zdGF0ZSgpIHsKQEAgLTk2LDcgKzEwOCw3IEBACiAgICAgICAgICAgICB9LAogICAgICAgICAgICAgbmFtZTogcGYubmFtZSgpLnRvX3N0cmluZygpLAogICAgICAgICAgICAgY29udGFpbmVyOiBwZi5jb250YWluZXIoKS50b19zdHJpbmcoKSwKLSAgICAgICAgICAgIGZsYWdfb2Zmc2V0OiAqZmxhZ19vZmZzZXRzLmdldChwZi5uYW1lKCkpLmV4cGVjdCgiZGlkbnQgZmluZCBwYWNrYWdlIG9mZnNldCA6KCIpLAorICAgICAgICAgICAgZmxhZ19vZmZzZXQ6ICpmbGFnX29mZnNldCwKICAgICAgICAgICAgIGRldmljZV9jb25maWdfbmFtZXNwYWNlOiBwZi5uYW1lc3BhY2UoKS50b19zdHJpbmcoKSwKICAgICAgICAgICAgIGRldmljZV9jb25maWdfZmxhZzogY29kZWdlbjo6Y3JlYXRlX2RldmljZV9jb25maWdfaWRlbnQocGFja2FnZSwgcGYubmFtZSgpKQogICAgICAgICAgICAgICAgIC5leHBlY3QoInZhbHVlcyBjaGVja2VkIGF0IGZsYWcgcGFyc2UgdGltZSIpLApAQCAtMTE2LDE1NCArMTI4LDYgQEAKIHVzZSBzdGQ6OnN5bmM6OkxhenlMb2NrOwogdXNlIGxvZzo6e2xvZywgTGV2ZWxGaWx0ZXIsIExldmVsfTsKIAotc3RhdGljIFNUT1JBR0VfTUlHUkFUSU9OX01BUktFUl9GSUxFOiAmc3RyID0KLSAgICAiL21ldGFkYXRhL2Fjb25maWdfdGVzdF9taXNzaW9ucy9taXNzaW9uXzEiOwotc3RhdGljIE1JR1JBVElPTl9MT0dfVEFHOiAmc3RyID0gIkFjb25maWdUZXN0TWlzc2lvbjEiOwotCi0vLy8gZmxhZyBwcm92aWRlcgotcHViIHN0cnVjdCBGbGFnUHJvdmlkZXI7Ci0KLSAgICAvLy8gZmxhZyB2YWx1ZSBjYWNoZSBmb3IgZGlzYWJsZWRfcncKLSAgICBzdGF0aWMgQ0FDSEVEX2Rpc2FibGVkX3J3OiBMYXp5TG9jazxib29sPiA9IExhenlMb2NrOjpuZXcofHwgZmxhZ3NfcnVzdDo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKLSAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKLSAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9ydyIsCi0gICAgICAgICJmYWxzZSIpID09ICJ0cnVlIik7Ci0KLSAgICAvLy8gZmxhZyB2YWx1ZSBjYWNoZSBmb3IgZGlzYWJsZWRfcndfZXhwb3J0ZWQKLSAgICBzdGF0aWMgQ0FDSEVEX2Rpc2FibGVkX3J3X2V4cG9ydGVkOiBMYXp5TG9jazxib29sPiA9IExhenlMb2NrOjpuZXcofHwgZmxhZ3NfcnVzdDo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKLSAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKLSAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9yd19leHBvcnRlZCIsCi0gICAgICAgICJmYWxzZSIpID09ICJ0cnVlIik7Ci0KLSAgICAvLy8gZmxhZyB2YWx1ZSBjYWNoZSBmb3IgZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlCi0gICAgc3RhdGljIENBQ0hFRF9kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2U6IExhenlMb2NrPGJvb2w+ID0gTGF6eUxvY2s6Om5ldyh8fCBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAotICAgICAgICAiYWNvbmZpZ19mbGFncy5vdGhlcl9uYW1lc3BhY2UiLAotICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSIsCi0gICAgICAgICJmYWxzZSIpID09ICJ0cnVlIik7Ci0KLSAgICAvLy8gZmxhZyB2YWx1ZSBjYWNoZSBmb3IgZW5hYmxlZF9ydwotICAgIHN0YXRpYyBDQUNIRURfZW5hYmxlZF9ydzogTGF6eUxvY2s8Ym9vbD4gPSBMYXp5TG9jazo6bmV3KHx8IGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCi0gICAgICAgICJhY29uZmlnX2ZsYWdzLmFjb25maWdfdGVzdCIsCi0gICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9ydyIsCi0gICAgICAgICJ0cnVlIikgPT0gInRydWUiKTsKLQotaW1wbCBGbGFnUHJvdmlkZXIgewotICAgIC8vLyBxdWVyeSBmbGFnIGRpc2FibGVkX3JvCi0gICAgcHViIGZuIGRpc2FibGVkX3JvKCZzZWxmKSAtPiBib29sIHsKLSAgICAgICAgZmFsc2UKLSAgICB9Ci0KLSAgICAvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9ydwotICAgIHB1YiBmbiBkaXNhYmxlZF9ydygmc2VsZikgLT4gYm9vbCB7Ci0gICAgICAgICpDQUNIRURfZGlzYWJsZWRfcncKLSAgICB9Ci0KLSAgICAvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9yd19leHBvcnRlZAotICAgIHB1YiBmbiBkaXNhYmxlZF9yd19leHBvcnRlZCgmc2VsZikgLT4gYm9vbCB7Ci0gICAgICAgICpDQUNIRURfZGlzYWJsZWRfcndfZXhwb3J0ZWQKLSAgICB9Ci0KLSAgICAvLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UKLSAgICBwdWIgZm4gZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlKCZzZWxmKSAtPiBib29sIHsKLSAgICAgICAgKkNBQ0hFRF9kaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UKLSAgICB9Ci0KLSAgICAvLy8gcXVlcnkgZmxhZyBlbmFibGVkX2ZpeGVkX3JvCi0gICAgcHViIGZuIGVuYWJsZWRfZml4ZWRfcm8oJnNlbGYpIC0+IGJvb2wgewotICAgICAgICB0cnVlCi0gICAgfQotCi0gICAgLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZAotICAgIHB1YiBmbiBlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCZzZWxmKSAtPiBib29sIHsKLSAgICAgICAgdHJ1ZQotICAgIH0KLQotICAgIC8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfcm8KLSAgICBwdWIgZm4gZW5hYmxlZF9ybygmc2VsZikgLT4gYm9vbCB7Ci0gICAgICAgIHRydWUKLSAgICB9Ci0KLSAgICAvLy8gcXVlcnkgZmxhZyBlbmFibGVkX3JvX2V4cG9ydGVkCi0gICAgcHViIGZuIGVuYWJsZWRfcm9fZXhwb3J0ZWQoJnNlbGYpIC0+IGJvb2wgewotICAgICAgICB0cnVlCi0gICAgfQotCi0gICAgLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9ydwotICAgIHB1YiBmbiBlbmFibGVkX3J3KCZzZWxmKSAtPiBib29sIHsKLSAgICAgICAgKkNBQ0hFRF9lbmFibGVkX3J3Ci0gICAgfQotfQotCi0vLy8gZmxhZyBwcm92aWRlcgotcHViIHN0YXRpYyBQUk9WSURFUjogRmxhZ1Byb3ZpZGVyID0gRmxhZ1Byb3ZpZGVyOwotCi0vLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9ybwotI1tpbmxpbmUoYWx3YXlzKV0KLXB1YiBmbiBkaXNhYmxlZF9ybygpIC0+IGJvb2wgewotICAgIGZhbHNlCi19Ci0KLS8vLyBxdWVyeSBmbGFnIGRpc2FibGVkX3J3Ci0jW2lubGluZShhbHdheXMpXQotcHViIGZuIGRpc2FibGVkX3J3KCkgLT4gYm9vbCB7Ci0gICAgUFJPVklERVIuZGlzYWJsZWRfcncoKQotfQotCi0vLy8gcXVlcnkgZmxhZyBkaXNhYmxlZF9yd19leHBvcnRlZAotI1tpbmxpbmUoYWx3YXlzKV0KLXB1YiBmbiBkaXNhYmxlZF9yd19leHBvcnRlZCgpIC0+IGJvb2wgewotICAgIFBST1ZJREVSLmRpc2FibGVkX3J3X2V4cG9ydGVkKCkKLX0KLQotLy8vIHF1ZXJ5IGZsYWcgZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlCi0jW2lubGluZShhbHdheXMpXQotcHViIGZuIGRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSgpIC0+IGJvb2wgewotICAgIFBST1ZJREVSLmRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSgpCi19Ci0KLS8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfZml4ZWRfcm8KLSNbaW5saW5lKGFsd2F5cyldCi1wdWIgZm4gZW5hYmxlZF9maXhlZF9ybygpIC0+IGJvb2wgewotICAgIHRydWUKLX0KLQotLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZAotI1tpbmxpbmUoYWx3YXlzKV0KLXB1YiBmbiBlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCkgLT4gYm9vbCB7Ci0gICAgdHJ1ZQotfQotCi0vLy8gcXVlcnkgZmxhZyBlbmFibGVkX3JvCi0jW2lubGluZShhbHdheXMpXQotcHViIGZuIGVuYWJsZWRfcm8oKSAtPiBib29sIHsKLSAgICB0cnVlCi19Ci0KLS8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfcm9fZXhwb3J0ZWQKLSNbaW5saW5lKGFsd2F5cyldCi1wdWIgZm4gZW5hYmxlZF9yb19leHBvcnRlZCgpIC0+IGJvb2wgewotICAgIHRydWUKLX0KLQotLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9ydwotI1tpbmxpbmUoYWx3YXlzKV0KLXB1YiBmbiBlbmFibGVkX3J3KCkgLT4gYm9vbCB7Ci0gICAgUFJPVklERVIuZW5hYmxlZF9ydygpCi19Ci0iIzsKLQotICAgIGNvbnN0IFBST0RfSU5TVFJVTUVOVEVEX0VYUEVDVEVEOiAmc3RyID0gciMiCi0vLyEgY29kZWdlbmVyYXRlZCBydXN0IGZsYWcgbGliCi11c2UgYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpOjp7TW1hcCwgQWNvbmZpZ1N0b3JhZ2VFcnJvciwgU3RvcmFnZUZpbGVUeXBlLCBQYWNrYWdlUmVhZENvbnRleHQsIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlLCBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlLCBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHR9OwotdXNlIHN0ZDo6cGF0aDo6UGF0aDsKLXVzZSBzdGQ6OmlvOjpXcml0ZTsKLXVzZSBzdGQ6OnN5bmM6OkxhenlMb2NrOwotdXNlIGxvZzo6e2xvZywgTGV2ZWxGaWx0ZXIsIExldmVsfTsKLQotc3RhdGljIFNUT1JBR0VfTUlHUkFUSU9OX01BUktFUl9GSUxFOiAmc3RyID0KLSAgICAiL21ldGFkYXRhL2Fjb25maWdfdGVzdF9taXNzaW9ucy9taXNzaW9uXzEiOwotc3RhdGljIE1JR1JBVElPTl9MT0dfVEFHOiAmc3RyID0gIkFjb25maWdUZXN0TWlzc2lvbjEiOwotCiAvLy8gZmxhZyBwcm92aWRlcgogcHViIHN0cnVjdCBGbGFnUHJvdmlkZXI7CiAKQEAgLTI3OSwyNCArMTQzLDUzIEBACiAKIC8vLyBmbGFnIHZhbHVlIGNhY2hlIGZvciBkaXNhYmxlZF9ydwogc3RhdGljIENBQ0hFRF9kaXNhYmxlZF9ydzogTGF6eUxvY2s8Ym9vbD4gPSBMYXp5TG9jazo6bmV3KHx8IHsKLSAgICBsZXQgcmVzdWx0ID0gZmxhZ3NfcnVzdDo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKLSAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKLSAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9ydyIsCi0gICAgICAgICJmYWxzZSIpID09ICJ0cnVlIjsKKyAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiBTdWJzZXF1ZW50IGNhbGxzIGFmdGVyIHRoZSBmaXJzdCBhcmUgbm9vcHMuCisgICAgbG9nZ2VyOjppbml0KAorICAgICAgICBsb2dnZXI6OkNvbmZpZzo6ZGVmYXVsdCgpCisgICAgICAgICAgICAud2l0aF90YWdfb25fZGV2aWNlKCJhY29uZmlnX3J1c3RfY29kZWdlbiIpCisgICAgICAgICAgICAud2l0aF9tYXhfbGV2ZWwoTGV2ZWxGaWx0ZXI6OkluZm8pKTsKIAotICAgIGxldCB1c2VfbmV3X3N0b3JhZ2VfdmFsdWUgPSBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAotICAgICAgICAiYWNvbmZpZ19mbGFncy5jb3JlX2V4cGVyaW1lbnRzX3RlYW1faW50ZXJuYWwiLAotICAgICAgICAiY29tLmFuZHJvaWQucHJvdmlkZXJzLnNldHRpbmdzLnVzZV9uZXdfc3RvcmFnZV92YWx1ZSIsCi0gICAgICAgICJmYWxzZSIpID09ICJ0cnVlIjsKKyAgICBsZXQgZmxhZ192YWx1ZV9yZXN1bHQgPSBGTEFHX1ZBTF9NQVAKKyAgICAgICAgLmFzX3JlZigpCisgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgZmxhZyB2YWwgbWFwOiB7ZXJyfSIpKQorICAgICAgICAuYW5kX3RoZW4ofGZsYWdfdmFsX21hcHwgeworICAgICAgICAgICAgUEFDS0FHRV9PRkZTRVQKKyAgICAgICAgICAgICAgIC5hc19yZWYoKQorICAgICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBwYWNrYWdlIHJlYWQgb2Zmc2V0OiB7ZXJyfSIpKQorICAgICAgICAgICAgICAgLmFuZF90aGVuKHxwYWNrYWdlX29mZnNldHwgeworICAgICAgICAgICAgICAgICAgIG1hdGNoIHBhY2thZ2Vfb2Zmc2V0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgU29tZShvZmZzZXQpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsX21hcCwgb2Zmc2V0ICsgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IGZsYWc6IHtlcnJ9IikpCisgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgIE5vbmUgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJubyBjb250ZXh0IGZvdW5kIGZvciBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyKGZvcm1hdCEoImZhaWxlZCB0byBmbGFnIHBhY2thZ2UgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IikpCisgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICB9KTsKIAotICAgIGlmIFBhdGg6Om5ldyhTVE9SQUdFX01JR1JBVElPTl9NQVJLRVJfRklMRSkuZXhpc3RzKCkgeworICAgIG1hdGNoIGZsYWdfdmFsdWVfcmVzdWx0IHsKKyAgICAgICAgT2soZmxhZ192YWx1ZSkgPT4geworICAgICAgICAgICAgcmV0dXJuIGZsYWdfdmFsdWU7CisgICAgICAgIH0sCisgICAgICAgIEVycihlcnIpID0+IHsKKyAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiYWNvbmZpZ19ydXN0X2NvZGVnZW46IGVycm9yOiB7ZXJyfSIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorfSk7CisKKy8vLyBmbGFnIHZhbHVlIGNhY2hlIGZvciBkaXNhYmxlZF9yd19leHBvcnRlZAorc3RhdGljIENBQ0hFRF9kaXNhYmxlZF9yd19leHBvcnRlZDogTGF6eUxvY2s8Ym9vbD4gPSBMYXp5TG9jazo6bmV3KHx8IHsKICAgICAgICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gU3Vic2VxdWVudCBjYWxscyBhZnRlciB0aGUgZmlyc3QgYXJlIG5vb3BzLgogICAgICAgICBsb2dnZXI6OmluaXQoCiAgICAgICAgICAgICBsb2dnZXI6OkNvbmZpZzo6ZGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgLndpdGhfdGFnX29uX2RldmljZShNSUdSQVRJT05fTE9HX1RBRykKKyAgICAgICAgICAgICAgICAud2l0aF90YWdfb25fZGV2aWNlKCJhY29uZmlnX3J1c3RfY29kZWdlbiIpCiAgICAgICAgICAgICAgICAgLndpdGhfbWF4X2xldmVsKExldmVsRmlsdGVyOjpJbmZvKSk7CiAKLSAgICAgICAgbGV0IGFjb25maWdfc3RvcmFnZV9yZXN1bHQgPSBGTEFHX1ZBTF9NQVAKKyAgICAgICAgbGV0IGZsYWdfdmFsdWVfcmVzdWx0ID0gRkxBR19WQUxfTUFQCiAgICAgICAgICAgICAuYXNfcmVmKCkKICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgZmxhZyB2YWwgbWFwOiB7ZXJyfSIpKQogICAgICAgICAgICAgLmFuZF90aGVuKHxmbGFnX3ZhbF9tYXB8IHsKQEAgLTMwOSw1OSArMjAyLDM0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsX21hcCwgb2Zmc2V0ICsgMSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgZmxhZzoge2Vycn0iKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUgPT4gRXJyKCJubyBjb250ZXh0IGZvdW5kIGZvciBwYWNrYWdlICdjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QnIi50b19zdHJpbmcoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJubyBjb250ZXh0IGZvdW5kIGZvciBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnIoZm9ybWF0ISgiZmFpbGVkIHRvIGZsYWcgcGFja2FnZSBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgfSk7CiAKLSAgICAgICAgbWF0Y2ggYWNvbmZpZ19zdG9yYWdlX3Jlc3VsdCB7Ci0gICAgICAgICAgICBPayhzdG9yYWdlX3Jlc3VsdCkgaWYgc3RvcmFnZV9yZXN1bHQgPT0gcmVzdWx0ID0+IHsKLSAgICAgICAgICAgICAgICBpZiB1c2VfbmV3X3N0b3JhZ2VfdmFsdWUgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmFnZV9yZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgT2soc3RvcmFnZV9yZXN1bHQpID0+IHsKLSAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBtaXNtYXRjaCBmb3IgZmxhZyAnZGlzYWJsZWRfcncnLiBMZWdhY3kgc3RvcmFnZSB3YXMge3Jlc3VsdH0sIG5ldyBzdG9yYWdlIHdhcyB7c3RvcmFnZV9yZXN1bHR9Iik7Ci0gICAgICAgICAgICAgICAgaWYgdXNlX25ld19zdG9yYWdlX3ZhbHVlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JhZ2VfcmVzdWx0OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICBtYXRjaCBmbGFnX3ZhbHVlX3Jlc3VsdCB7CisgICAgICAgICAgICBPayhmbGFnX3ZhbHVlKSA9PiB7CisgICAgICAgICAgICAgICAgIHJldHVybiBmbGFnX3ZhbHVlOwogICAgICAgICAgICAgfSwKICAgICAgICAgICAgIEVycihlcnIpID0+IHsKLSAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiB7ZXJyfSIpOwotICAgICAgICAgICAgICAgIGlmIHVzZV9uZXdfc3RvcmFnZV92YWx1ZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhbmljISgiZmFpbGVkIHRvIHJlYWQgZmxhZyB2YWx1ZToge2Vycn0iKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJhY29uZmlnX3J1c3RfY29kZWdlbjogZXJyb3I6IHtlcnJ9Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfQotCi0gICAgcmVzdWx0CiB9KTsKIAotLy8vIGZsYWcgdmFsdWUgY2FjaGUgZm9yIGRpc2FibGVkX3J3X2V4cG9ydGVkCi1zdGF0aWMgQ0FDSEVEX2Rpc2FibGVkX3J3X2V4cG9ydGVkOiBMYXp5TG9jazxib29sPiA9IExhenlMb2NrOjpuZXcofHwgewotICAgIGxldCByZXN1bHQgPSBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAotICAgICAgICAiYWNvbmZpZ19mbGFncy5hY29uZmlnX3Rlc3QiLAotICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2V4cG9ydGVkIiwKLSAgICAgICAgImZhbHNlIikgPT0gInRydWUiOwotCi0gICAgbGV0IHVzZV9uZXdfc3RvcmFnZV92YWx1ZSA9IGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCi0gICAgICAgICJhY29uZmlnX2ZsYWdzLmNvcmVfZXhwZXJpbWVudHNfdGVhbV9pbnRlcm5hbCIsCi0gICAgICAgICJjb20uYW5kcm9pZC5wcm92aWRlcnMuc2V0dGluZ3MudXNlX25ld19zdG9yYWdlX3ZhbHVlIiwKLSAgICAgICAgImZhbHNlIikgPT0gInRydWUiOwotCi0gICAgaWYgUGF0aDo6bmV3KFNUT1JBR0VfTUlHUkFUSU9OX01BUktFUl9GSUxFKS5leGlzdHMoKSB7CisvLy8gZmxhZyB2YWx1ZSBjYWNoZSBmb3IgZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlCitzdGF0aWMgQ0FDSEVEX2Rpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZTogTGF6eUxvY2s8Ym9vbD4gPSBMYXp5TG9jazo6bmV3KHx8IHsKICAgICAgICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gU3Vic2VxdWVudCBjYWxscyBhZnRlciB0aGUgZmlyc3QgYXJlIG5vb3BzLgogICAgICAgICBsb2dnZXI6OmluaXQoCiAgICAgICAgICAgICBsb2dnZXI6OkNvbmZpZzo6ZGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgLndpdGhfdGFnX29uX2RldmljZShNSUdSQVRJT05fTE9HX1RBRykKKyAgICAgICAgICAgICAgICAud2l0aF90YWdfb25fZGV2aWNlKCJhY29uZmlnX3J1c3RfY29kZWdlbiIpCiAgICAgICAgICAgICAgICAgLndpdGhfbWF4X2xldmVsKExldmVsRmlsdGVyOjpJbmZvKSk7CiAKLSAgICAgICAgbGV0IGFjb25maWdfc3RvcmFnZV9yZXN1bHQgPSBGTEFHX1ZBTF9NQVAKKyAgICAgICAgbGV0IGZsYWdfdmFsdWVfcmVzdWx0ID0gRkxBR19WQUxfTUFQCiAgICAgICAgICAgICAuYXNfcmVmKCkKICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgZmxhZyB2YWwgbWFwOiB7ZXJyfSIpKQogICAgICAgICAgICAgLmFuZF90aGVuKHxmbGFnX3ZhbF9tYXB8IHsKQEAgLTM3NCwxMjUgKzI0MiwzNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZmbGFnX3ZhbF9tYXAsIG9mZnNldCArIDIpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IGZsYWc6IHtlcnJ9IikpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lID0+IEVycigibm8gY29udGV4dCBmb3VuZCBmb3IgcGFja2FnZSAnY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0JyIudG9fc3RyaW5nKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAibm8gY29udGV4dCBmb3VuZCBmb3IgcGFja2FnZSBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyKGZvcm1hdCEoImZhaWxlZCB0byBmbGFnIHBhY2thZ2UgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9KQogICAgICAgICAgICAgICAgIH0pOwogCi0gICAgICAgIG1hdGNoIGFjb25maWdfc3RvcmFnZV9yZXN1bHQgewotICAgICAgICAgICAgT2soc3RvcmFnZV9yZXN1bHQpIGlmIHN0b3JhZ2VfcmVzdWx0ID09IHJlc3VsdCA9PiB7Ci0gICAgICAgICAgICAgICAgaWYgdXNlX25ld19zdG9yYWdlX3ZhbHVlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JhZ2VfcmVzdWx0OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIE9rKHN0b3JhZ2VfcmVzdWx0KSA9PiB7Ci0gICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogbWlzbWF0Y2ggZm9yIGZsYWcgJ2Rpc2FibGVkX3J3X2V4cG9ydGVkJy4gTGVnYWN5IHN0b3JhZ2Ugd2FzIHtyZXN1bHR9LCBuZXcgc3RvcmFnZSB3YXMge3N0b3JhZ2VfcmVzdWx0fSIpOwotICAgICAgICAgICAgICAgIGlmIHVzZV9uZXdfc3RvcmFnZV92YWx1ZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdG9yYWdlX3Jlc3VsdDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgbWF0Y2ggZmxhZ192YWx1ZV9yZXN1bHQgeworICAgICAgICAgICAgT2soZmxhZ192YWx1ZSkgPT4geworICAgICAgICAgICAgICAgICByZXR1cm4gZmxhZ192YWx1ZTsKICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICBFcnIoZXJyKSA9PiB7Ci0gICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjoge2Vycn0iKTsKLSAgICAgICAgICAgICAgICBpZiB1c2VfbmV3X3N0b3JhZ2VfdmFsdWUgewotICAgICAgICAgICAgICAgICAgICBwYW5pYyEoImZhaWxlZCB0byByZWFkIGZsYWcgdmFsdWU6IHtlcnJ9Iik7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiYWNvbmZpZ19ydXN0X2NvZGVnZW46IGVycm9yOiB7ZXJyfSIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0KLQotICAgIHJlc3VsdAotfSk7Ci0KLS8vLyBmbGFnIHZhbHVlIGNhY2hlIGZvciBkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UKLXN0YXRpYyBDQUNIRURfZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlOiBMYXp5TG9jazxib29sPiA9IExhenlMb2NrOjpuZXcofHwgewotICAgIGxldCByZXN1bHQgPSBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAotICAgICAgICAiYWNvbmZpZ19mbGFncy5vdGhlcl9uYW1lc3BhY2UiLAotICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSIsCi0gICAgICAgICJmYWxzZSIpID09ICJ0cnVlIjsKLQotICAgIGxldCB1c2VfbmV3X3N0b3JhZ2VfdmFsdWUgPSBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAotICAgICAgICAiYWNvbmZpZ19mbGFncy5jb3JlX2V4cGVyaW1lbnRzX3RlYW1faW50ZXJuYWwiLAotICAgICAgICAiY29tLmFuZHJvaWQucHJvdmlkZXJzLnNldHRpbmdzLnVzZV9uZXdfc3RvcmFnZV92YWx1ZSIsCi0gICAgICAgICJmYWxzZSIpID09ICJ0cnVlIjsKLQotICAgIGlmIFBhdGg6Om5ldyhTVE9SQUdFX01JR1JBVElPTl9NQVJLRVJfRklMRSkuZXhpc3RzKCkgewotICAgICAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiBTdWJzZXF1ZW50IGNhbGxzIGFmdGVyIHRoZSBmaXJzdCBhcmUgbm9vcHMuCi0gICAgICAgIGxvZ2dlcjo6aW5pdCgKLSAgICAgICAgICAgIGxvZ2dlcjo6Q29uZmlnOjpkZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAud2l0aF90YWdfb25fZGV2aWNlKE1JR1JBVElPTl9MT0dfVEFHKQotICAgICAgICAgICAgICAgIC53aXRoX21heF9sZXZlbChMZXZlbEZpbHRlcjo6SW5mbykpOwotCi0gICAgICAgIGxldCBhY29uZmlnX3N0b3JhZ2VfcmVzdWx0ID0gRkxBR19WQUxfTUFQCi0gICAgICAgICAgICAuYXNfcmVmKCkKLSAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgZmxhZyB2YWwgbWFwOiB7ZXJyfSIpKQotICAgICAgICAgICAgLmFuZF90aGVuKHxmbGFnX3ZhbF9tYXB8IHsKLSAgICAgICAgICAgICAgICBQQUNLQUdFX09GRlNFVAotICAgICAgICAgICAgICAgICAgICAuYXNfcmVmKCkKLSAgICAgICAgICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBwYWNrYWdlIHJlYWQgb2Zmc2V0OiB7ZXJyfSIpKQotICAgICAgICAgICAgICAgICAgICAuYW5kX3RoZW4ofHBhY2thZ2Vfb2Zmc2V0fCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCBwYWNrYWdlX29mZnNldCB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU29tZShvZmZzZXQpID0+IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgmZmxhZ192YWxfbWFwLCBvZmZzZXQgKyAzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBmbGFnOiB7ZXJyfSIpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSA9PiBFcnIoIm5vIGNvbnRleHQgZm91bmQgZm9yIHBhY2thZ2UgJ2NvbS5hbmRyb2lkLmFjb25maWcudGVzdCciLnRvX3N0cmluZygpKQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9KQotICAgICAgICAgICAgICAgIH0pOwotCi0gICAgICAgIG1hdGNoIGFjb25maWdfc3RvcmFnZV9yZXN1bHQgewotICAgICAgICAgICAgT2soc3RvcmFnZV9yZXN1bHQpIGlmIHN0b3JhZ2VfcmVzdWx0ID09IHJlc3VsdCA9PiB7Ci0gICAgICAgICAgICAgICAgaWYgdXNlX25ld19zdG9yYWdlX3ZhbHVlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0b3JhZ2VfcmVzdWx0OwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIE9rKHN0b3JhZ2VfcmVzdWx0KSA9PiB7Ci0gICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogbWlzbWF0Y2ggZm9yIGZsYWcgJ2Rpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZScuIExlZ2FjeSBzdG9yYWdlIHdhcyB7cmVzdWx0fSwgbmV3IHN0b3JhZ2Ugd2FzIHtzdG9yYWdlX3Jlc3VsdH0iKTsKLSAgICAgICAgICAgICAgICBpZiB1c2VfbmV3X3N0b3JhZ2VfdmFsdWUgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmFnZV9yZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgRXJyKGVycikgPT4gewotICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IHtlcnJ9Iik7Ci0gICAgICAgICAgICAgICAgaWYgdXNlX25ld19zdG9yYWdlX3ZhbHVlIHsKLSAgICAgICAgICAgICAgICAgICAgcGFuaWMhKCJmYWlsZWQgdG8gcmVhZCBmbGFnIHZhbHVlOiB7ZXJyfSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHJlc3VsdAogfSk7CiAKIAogLy8vIGZsYWcgdmFsdWUgY2FjaGUgZm9yIGVuYWJsZWRfcncKIHN0YXRpYyBDQUNIRURfZW5hYmxlZF9ydzogTGF6eUxvY2s8Ym9vbD4gPSBMYXp5TG9jazo6bmV3KHx8IHsKLSAgICBsZXQgcmVzdWx0ID0gZmxhZ3NfcnVzdDo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKLSAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKLSAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3J3IiwKLSAgICAgICAgInRydWUiKSA9PSAidHJ1ZSI7Ci0KLSAgICBsZXQgdXNlX25ld19zdG9yYWdlX3ZhbHVlID0gZmxhZ3NfcnVzdDo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKLSAgICAgICAgImFjb25maWdfZmxhZ3MuY29yZV9leHBlcmltZW50c190ZWFtX2ludGVybmFsIiwKLSAgICAgICAgImNvbS5hbmRyb2lkLnByb3ZpZGVycy5zZXR0aW5ncy51c2VfbmV3X3N0b3JhZ2VfdmFsdWUiLAotICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSI7Ci0KLSAgICBpZiBQYXRoOjpuZXcoU1RPUkFHRV9NSUdSQVRJT05fTUFSS0VSX0ZJTEUpLmV4aXN0cygpIHsKICAgICAgICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gU3Vic2VxdWVudCBjYWxscyBhZnRlciB0aGUgZmlyc3QgYXJlIG5vb3BzLgogICAgICAgICBsb2dnZXI6OmluaXQoCiAgICAgICAgICAgICBsb2dnZXI6OkNvbmZpZzo6ZGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgLndpdGhfdGFnX29uX2RldmljZShNSUdSQVRJT05fTE9HX1RBRykKKyAgICAgICAgICAgICAgICAud2l0aF90YWdfb25fZGV2aWNlKCJhY29uZmlnX3J1c3RfY29kZWdlbiIpCiAgICAgICAgICAgICAgICAgLndpdGhfbWF4X2xldmVsKExldmVsRmlsdGVyOjpJbmZvKSk7CiAKLSAgICAgICAgbGV0IGFjb25maWdfc3RvcmFnZV9yZXN1bHQgPSBGTEFHX1ZBTF9NQVAKKyAgICAgICAgbGV0IGZsYWdfdmFsdWVfcmVzdWx0ID0gRkxBR19WQUxfTUFQCiAgICAgICAgICAgICAuYXNfcmVmKCkKICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgZmxhZyB2YWwgbWFwOiB7ZXJyfSIpKQogICAgICAgICAgICAgLmFuZF90aGVuKHxmbGFnX3ZhbF9tYXB8IHsKQEAgLTUwMiw0MCArMjgwLDI2IEBACiAgICAgICAgICAgICAgICAgICAgIC5hbmRfdGhlbih8cGFja2FnZV9vZmZzZXR8IHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIHBhY2thZ2Vfb2Zmc2V0IHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb21lKG9mZnNldCkgPT4gewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZmbGFnX3ZhbF9tYXAsIG9mZnNldCArIDgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsX21hcCwgb2Zmc2V0ICsgNykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgZmxhZzoge2Vycn0iKSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUgPT4gRXJyKCJubyBjb250ZXh0IGZvdW5kIGZvciBwYWNrYWdlICdjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QnIi50b19zdHJpbmcoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJubyBjb250ZXh0IGZvdW5kIGZvciBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnIoZm9ybWF0ISgiZmFpbGVkIHRvIGZsYWcgcGFja2FnZSBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0pCiAgICAgICAgICAgICAgICAgfSk7CiAKLSAgICAgICAgbWF0Y2ggYWNvbmZpZ19zdG9yYWdlX3Jlc3VsdCB7Ci0gICAgICAgICAgICBPayhzdG9yYWdlX3Jlc3VsdCkgaWYgc3RvcmFnZV9yZXN1bHQgPT0gcmVzdWx0ID0+IHsKLSAgICAgICAgICAgICAgICBpZiB1c2VfbmV3X3N0b3JhZ2VfdmFsdWUgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmFnZV9yZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgT2soc3RvcmFnZV9yZXN1bHQpID0+IHsKLSAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBtaXNtYXRjaCBmb3IgZmxhZyAnZW5hYmxlZF9ydycuIExlZ2FjeSBzdG9yYWdlIHdhcyB7cmVzdWx0fSwgbmV3IHN0b3JhZ2Ugd2FzIHtzdG9yYWdlX3Jlc3VsdH0iKTsKLSAgICAgICAgICAgICAgICBpZiB1c2VfbmV3X3N0b3JhZ2VfdmFsdWUgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmFnZV9yZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgIG1hdGNoIGZsYWdfdmFsdWVfcmVzdWx0IHsKKyAgICAgICAgICAgIE9rKGZsYWdfdmFsdWUpID0+IHsKKyAgICAgICAgICAgICAgICAgcmV0dXJuIGZsYWdfdmFsdWU7CiAgICAgICAgICAgICB9LAogICAgICAgICAgICAgRXJyKGVycikgPT4gewotICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IHtlcnJ9Iik7Ci0gICAgICAgICAgICAgICAgaWYgdXNlX25ld19zdG9yYWdlX3ZhbHVlIHsKLSAgICAgICAgICAgICAgICAgICAgcGFuaWMhKCJmYWlsZWQgdG8gcmVhZCBmbGFnIHZhbHVlOiB7ZXJyfSIpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgImFjb25maWdfcnVzdF9jb2RlZ2VuOiBlcnJvcjoge2Vycn0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgIH0KLQotICAgIHJlc3VsdAogfSk7CiAKIGltcGwgRmxhZ1Byb3ZpZGVyIHsKQEAgLTU5Niw2NSArMzYwLDcgQEAKIC8vLyBxdWVyeSBmbGFnIGRpc2FibGVkX3JvCiAjW2lubGluZShhbHdheXMpXQogcHViIGZuIGRpc2FibGVkX3JvKCkgLT4gYm9vbCB7Ci0KLQotICAgIGxldCByZXN1bHQgPSBmYWxzZTsKLSAgICBpZiAhUGF0aDo6bmV3KFNUT1JBR0VfTUlHUkFUSU9OX01BUktFUl9GSUxFKS5leGlzdHMoKSB7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gU3Vic2VxdWVudCBjYWxscyBhZnRlciB0aGUgZmlyc3QKLSAgICAvLyBhcmUgbm9vcHMuCi0gICAgbG9nZ2VyOjppbml0KAotICAgICAgICBsb2dnZXI6OkNvbmZpZzo6ZGVmYXVsdCgpCi0gICAgICAgICAgICAud2l0aF90YWdfb25fZGV2aWNlKE1JR1JBVElPTl9MT0dfVEFHKQotICAgICAgICAgICAgLndpdGhfbWF4X2xldmVsKExldmVsRmlsdGVyOjpJbmZvKSwKLSAgICApOwotCi0gICAgdW5zYWZlIHsKLSAgICAgICAgbGV0IHBhY2thZ2VfbWFwID0gbWF0Y2ggZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUoInN5c3RlbSIsIFN0b3JhZ2VGaWxlVHlwZTo6UGFja2FnZU1hcCkgewotICAgICAgICAgICAgT2soZmlsZSkgPT4gZmlsZSwKLSAgICAgICAgICAgIEVycihlcnIpID0+IHsKLSAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdkaXNhYmxlZF9ybyc6IHtlcnJ9Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBsZXQgcGFja2FnZV9yZWFkX2NvbnRleHQgPSBtYXRjaCBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfbWFwLCAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IikgewotICAgICAgICAgICAgT2soU29tZShjb250ZXh0KSkgPT4gY29udGV4dCwKLSAgICAgICAgICAgIE9rKE5vbmUpID0+IHsKLSAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdkaXNhYmxlZF9ybyc6IGRpZCBub3QgZ2V0IGNvbnRleHQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIEVycihlcnIpID0+IHsKLSAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdkaXNhYmxlZF9ybyc6IHtlcnJ9Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgbGV0IGZsYWdfdmFsX21hcCA9IG1hdGNoIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlKCJzeXN0ZW0iLCBTdG9yYWdlRmlsZVR5cGU6OkZsYWdWYWwpIHsKLSAgICAgICAgICAgIE9rKHZhbF9tYXApID0+IHZhbF9tYXAsCi0gICAgICAgICAgICBFcnIoZXJyKSA9PiB7Ci0gICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZGlzYWJsZWRfcm8nOiB7ZXJyfSIpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGxldCB2YWx1ZSA9IG1hdGNoIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsX21hcCwgMCArIHBhY2thZ2VfcmVhZF9jb250ZXh0LmJvb2xlYW5fc3RhcnRfaW5kZXgpIHsKLSAgICAgICAgICAgIE9rKHZhbCkgPT4gdmFsLAotICAgICAgICAgICAgRXJyKGVycikgPT4gewotICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2Rpc2FibGVkX3JvJzoge2Vycn0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIGlmIHJlc3VsdCAhPSB2YWx1ZSB7Ci0gICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmbGFnIG1pc21hdGNoIGZvciAnZGlzYWJsZWRfcm8nLiBMZWdhY3kgc3RvcmFnZSB3YXMge3Jlc3VsdH0sIG5ldyBzdG9yYWdlIHdhcyB7dmFsdWV9Iik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsZXQgZGVmYXVsdF92YWx1ZSA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmVzdWx0Ci0KKyAgIGZhbHNlCiB9CiAKIC8vLyBxdWVyeSBmbGFnIGRpc2FibGVkX3J3CkBAIC02NzgsMjU3ICszODQsMjUgQEAKIC8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfZml4ZWRfcm8KICNbaW5saW5lKGFsd2F5cyldCiBwdWIgZm4gZW5hYmxlZF9maXhlZF9ybygpIC0+IGJvb2wgewotCi0KLSAgICBsZXQgcmVzdWx0ID0gdHJ1ZTsKLSAgICBpZiAhUGF0aDo6bmV3KFNUT1JBR0VfTUlHUkFUSU9OX01BUktFUl9GSUxFKS5leGlzdHMoKSB7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gU3Vic2VxdWVudCBjYWxscyBhZnRlciB0aGUgZmlyc3QKLSAgICAvLyBhcmUgbm9vcHMuCi0gICAgbG9nZ2VyOjppbml0KAotICAgICAgICBsb2dnZXI6OkNvbmZpZzo6ZGVmYXVsdCgpCi0gICAgICAgICAgICAud2l0aF90YWdfb25fZGV2aWNlKE1JR1JBVElPTl9MT0dfVEFHKQotICAgICAgICAgICAgLndpdGhfbWF4X2xldmVsKExldmVsRmlsdGVyOjpJbmZvKSwKLSAgICApOwotCi0gICAgdW5zYWZlIHsKLSAgICAgICAgbGV0IHBhY2thZ2VfbWFwID0gbWF0Y2ggZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUoInN5c3RlbSIsIFN0b3JhZ2VGaWxlVHlwZTo6UGFja2FnZU1hcCkgewotICAgICAgICAgICAgT2soZmlsZSkgPT4gZmlsZSwKLSAgICAgICAgICAgIEVycihlcnIpID0+IHsKLSAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdlbmFibGVkX2ZpeGVkX3JvJzoge2Vycn0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIGxldCBwYWNrYWdlX3JlYWRfY29udGV4dCA9IG1hdGNoIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV9tYXAsICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiKSB7Ci0gICAgICAgICAgICBPayhTb21lKGNvbnRleHQpKSA9PiBjb250ZXh0LAotICAgICAgICAgICAgT2soTm9uZSkgPT4gewotICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2VuYWJsZWRfZml4ZWRfcm8nOiBkaWQgbm90IGdldCBjb250ZXh0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBFcnIoZXJyKSA9PiB7Ci0gICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZW5hYmxlZF9maXhlZF9ybyc6IHtlcnJ9Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgbGV0IGZsYWdfdmFsX21hcCA9IG1hdGNoIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlKCJzeXN0ZW0iLCBTdG9yYWdlRmlsZVR5cGU6OkZsYWdWYWwpIHsKLSAgICAgICAgICAgIE9rKHZhbF9tYXApID0+IHZhbF9tYXAsCi0gICAgICAgICAgICBFcnIoZXJyKSA9PiB7Ci0gICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZW5hYmxlZF9maXhlZF9ybyc6IHtlcnJ9Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgbGV0IHZhbHVlID0gbWF0Y2ggZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgmZmxhZ192YWxfbWFwLCA0ICsgcGFja2FnZV9yZWFkX2NvbnRleHQuYm9vbGVhbl9zdGFydF9pbmRleCkgewotICAgICAgICAgICAgT2sodmFsKSA9PiB2YWwsCi0gICAgICAgICAgICBFcnIoZXJyKSA9PiB7Ci0gICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZW5hYmxlZF9maXhlZF9ybyc6IHtlcnJ9Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBpZiByZXN1bHQgIT0gdmFsdWUgewotICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmxhZyBtaXNtYXRjaCBmb3IgJ2VuYWJsZWRfZml4ZWRfcm8nLiBMZWdhY3kgc3RvcmFnZSB3YXMge3Jlc3VsdH0sIG5ldyBzdG9yYWdlIHdhcyB7dmFsdWV9Iik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsZXQgZGVmYXVsdF92YWx1ZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXN1bHQKLQorICAgIHRydWUKIH0KIAogLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZAogI1tpbmxpbmUoYWx3YXlzKV0KIHB1YiBmbiBlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkKCkgLT4gYm9vbCB7Ci0KLQotICAgIGxldCByZXN1bHQgPSB0cnVlOwotICAgIGlmICFQYXRoOjpuZXcoU1RPUkFHRV9NSUdSQVRJT05fTUFSS0VSX0ZJTEUpLmV4aXN0cygpIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiBTdWJzZXF1ZW50IGNhbGxzIGFmdGVyIHRoZSBmaXJzdAotICAgIC8vIGFyZSBub29wcy4KLSAgICBsb2dnZXI6OmluaXQoCi0gICAgICAgIGxvZ2dlcjo6Q29uZmlnOjpkZWZhdWx0KCkKLSAgICAgICAgICAgIC53aXRoX3RhZ19vbl9kZXZpY2UoTUlHUkFUSU9OX0xPR19UQUcpCi0gICAgICAgICAgICAud2l0aF9tYXhfbGV2ZWwoTGV2ZWxGaWx0ZXI6OkluZm8pLAotICAgICk7Ci0KLSAgICB1bnNhZmUgewotICAgICAgICBsZXQgcGFja2FnZV9tYXAgPSBtYXRjaCBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSgic3lzdGVtIiwgU3RvcmFnZUZpbGVUeXBlOjpQYWNrYWdlTWFwKSB7Ci0gICAgICAgICAgICBPayhmaWxlKSA9PiBmaWxlLAotICAgICAgICAgICAgRXJyKGVycikgPT4gewotICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2VuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQnOiB7ZXJyfSIpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgbGV0IHBhY2thZ2VfcmVhZF9jb250ZXh0ID0gbWF0Y2ggZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX21hcCwgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIpIHsKLSAgICAgICAgICAgIE9rKFNvbWUoY29udGV4dCkpID0+IGNvbnRleHQsCi0gICAgICAgICAgICBPayhOb25lKSA9PiB7Ci0gICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCc6IGRpZCBub3QgZ2V0IGNvbnRleHQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIEVycihlcnIpID0+IHsKLSAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkJzoge2Vycn0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBsZXQgZmxhZ192YWxfbWFwID0gbWF0Y2ggZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUoInN5c3RlbSIsIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ1ZhbCkgewotICAgICAgICAgICAgT2sodmFsX21hcCkgPT4gdmFsX21hcCwKLSAgICAgICAgICAgIEVycihlcnIpID0+IHsKLSAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkJzoge2Vycn0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBsZXQgdmFsdWUgPSBtYXRjaCBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZmbGFnX3ZhbF9tYXAsIDUgKyBwYWNrYWdlX3JlYWRfY29udGV4dC5ib29sZWFuX3N0YXJ0X2luZGV4KSB7Ci0gICAgICAgICAgICBPayh2YWwpID0+IHZhbCwKLSAgICAgICAgICAgIEVycihlcnIpID0+IHsKLSAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkJzoge2Vycn0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIGlmIHJlc3VsdCAhPSB2YWx1ZSB7Ci0gICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmbGFnIG1pc21hdGNoIGZvciAnZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCcuIExlZ2FjeSBzdG9yYWdlIHdhcyB7cmVzdWx0fSwgbmV3IHN0b3JhZ2Ugd2FzIHt2YWx1ZX0iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxldCBkZWZhdWx0X3ZhbHVlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJlc3VsdAotCisgICAgdHJ1ZQogfQogCiAvLy8gcXVlcnkgZmxhZyBlbmFibGVkX3JvCiAjW2lubGluZShhbHdheXMpXQogcHViIGZuIGVuYWJsZWRfcm8oKSAtPiBib29sIHsKLQotCi0gICAgbGV0IHJlc3VsdCA9IHRydWU7Ci0gICAgaWYgIVBhdGg6Om5ldyhTVE9SQUdFX01JR1JBVElPTl9NQVJLRVJfRklMRSkuZXhpc3RzKCkgewotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuIFN1YnNlcXVlbnQgY2FsbHMgYWZ0ZXIgdGhlIGZpcnN0Ci0gICAgLy8gYXJlIG5vb3BzLgotICAgIGxvZ2dlcjo6aW5pdCgKLSAgICAgICAgbG9nZ2VyOjpDb25maWc6OmRlZmF1bHQoKQotICAgICAgICAgICAgLndpdGhfdGFnX29uX2RldmljZShNSUdSQVRJT05fTE9HX1RBRykKLSAgICAgICAgICAgIC53aXRoX21heF9sZXZlbChMZXZlbEZpbHRlcjo6SW5mbyksCi0gICAgKTsKLQotICAgIHVuc2FmZSB7Ci0gICAgICAgIGxldCBwYWNrYWdlX21hcCA9IG1hdGNoIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlKCJzeXN0ZW0iLCBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXApIHsKLSAgICAgICAgICAgIE9rKGZpbGUpID0+IGZpbGUsCi0gICAgICAgICAgICBFcnIoZXJyKSA9PiB7Ci0gICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZW5hYmxlZF9ybyc6IHtlcnJ9Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBsZXQgcGFja2FnZV9yZWFkX2NvbnRleHQgPSBtYXRjaCBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfbWFwLCAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IikgewotICAgICAgICAgICAgT2soU29tZShjb250ZXh0KSkgPT4gY29udGV4dCwKLSAgICAgICAgICAgIE9rKE5vbmUpID0+IHsKLSAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdlbmFibGVkX3JvJzogZGlkIG5vdCBnZXQgY29udGV4dCIpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9LAotICAgICAgICAgICAgRXJyKGVycikgPT4gewotICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2VuYWJsZWRfcm8nOiB7ZXJyfSIpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGxldCBmbGFnX3ZhbF9tYXAgPSBtYXRjaCBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSgic3lzdGVtIiwgU3RvcmFnZUZpbGVUeXBlOjpGbGFnVmFsKSB7Ci0gICAgICAgICAgICBPayh2YWxfbWFwKSA9PiB2YWxfbWFwLAotICAgICAgICAgICAgRXJyKGVycikgPT4gewotICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2VuYWJsZWRfcm8nOiB7ZXJyfSIpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIGxldCB2YWx1ZSA9IG1hdGNoIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsX21hcCwgNiArIHBhY2thZ2VfcmVhZF9jb250ZXh0LmJvb2xlYW5fc3RhcnRfaW5kZXgpIHsKLSAgICAgICAgICAgIE9rKHZhbCkgPT4gdmFsLAotICAgICAgICAgICAgRXJyKGVycikgPT4gewotICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2VuYWJsZWRfcm8nOiB7ZXJyfSIpOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgaWYgcmVzdWx0ICE9IHZhbHVlIHsKLSAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZsYWcgbWlzbWF0Y2ggZm9yICdlbmFibGVkX3JvJy4gTGVnYWN5IHN0b3JhZ2Ugd2FzIHtyZXN1bHR9LCBuZXcgc3RvcmFnZSB3YXMge3ZhbHVlfSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGV0IGRlZmF1bHRfdmFsdWUgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmVzdWx0Ci0KKyAgICB0cnVlCiB9CiAKIC8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfcm9fZXhwb3J0ZWQKICNbaW5saW5lKGFsd2F5cyldCiBwdWIgZm4gZW5hYmxlZF9yb19leHBvcnRlZCgpIC0+IGJvb2wgewotCi0KLSAgICBsZXQgcmVzdWx0ID0gdHJ1ZTsKLSAgICBpZiAhUGF0aDo6bmV3KFNUT1JBR0VfTUlHUkFUSU9OX01BUktFUl9GSUxFKS5leGlzdHMoKSB7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gU3Vic2VxdWVudCBjYWxscyBhZnRlciB0aGUgZmlyc3QKLSAgICAvLyBhcmUgbm9vcHMuCi0gICAgbG9nZ2VyOjppbml0KAotICAgICAgICBsb2dnZXI6OkNvbmZpZzo6ZGVmYXVsdCgpCi0gICAgICAgICAgICAud2l0aF90YWdfb25fZGV2aWNlKE1JR1JBVElPTl9MT0dfVEFHKQotICAgICAgICAgICAgLndpdGhfbWF4X2xldmVsKExldmVsRmlsdGVyOjpJbmZvKSwKLSAgICApOwotCi0gICAgdW5zYWZlIHsKLSAgICAgICAgbGV0IHBhY2thZ2VfbWFwID0gbWF0Y2ggZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUoInN5c3RlbSIsIFN0b3JhZ2VGaWxlVHlwZTo6UGFja2FnZU1hcCkgewotICAgICAgICAgICAgT2soZmlsZSkgPT4gZmlsZSwKLSAgICAgICAgICAgIEVycihlcnIpID0+IHsKLSAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIkFjb25maWdUZXN0TWlzc2lvbjE6IGVycm9yOiBmYWlsZWQgdG8gcmVhZCBmbGFnICdlbmFibGVkX3JvX2V4cG9ydGVkJzoge2Vycn0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIGxldCBwYWNrYWdlX3JlYWRfY29udGV4dCA9IG1hdGNoIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV9tYXAsICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiKSB7Ci0gICAgICAgICAgICBPayhTb21lKGNvbnRleHQpKSA9PiBjb250ZXh0LAotICAgICAgICAgICAgT2soTm9uZSkgPT4gewotICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ2VuYWJsZWRfcm9fZXhwb3J0ZWQnOiBkaWQgbm90IGdldCBjb250ZXh0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBFcnIoZXJyKSA9PiB7Ci0gICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZW5hYmxlZF9yb19leHBvcnRlZCc6IHtlcnJ9Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgbGV0IGZsYWdfdmFsX21hcCA9IG1hdGNoIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlKCJzeXN0ZW0iLCBTdG9yYWdlRmlsZVR5cGU6OkZsYWdWYWwpIHsKLSAgICAgICAgICAgIE9rKHZhbF9tYXApID0+IHZhbF9tYXAsCi0gICAgICAgICAgICBFcnIoZXJyKSA9PiB7Ci0gICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZW5hYmxlZF9yb19leHBvcnRlZCc6IHtlcnJ9Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgbGV0IHZhbHVlID0gbWF0Y2ggZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSgmZmxhZ192YWxfbWFwLCA3ICsgcGFja2FnZV9yZWFkX2NvbnRleHQuYm9vbGVhbl9zdGFydF9pbmRleCkgewotICAgICAgICAgICAgT2sodmFsKSA9PiB2YWwsCi0gICAgICAgICAgICBFcnIoZXJyKSA9PiB7Ci0gICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAnZW5hYmxlZF9yb19leHBvcnRlZCc6IHtlcnJ9Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBpZiByZXN1bHQgIT0gdmFsdWUgewotICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmxhZyBtaXNtYXRjaCBmb3IgJ2VuYWJsZWRfcm9fZXhwb3J0ZWQnLiBMZWdhY3kgc3RvcmFnZSB3YXMge3Jlc3VsdH0sIG5ldyBzdG9yYWdlIHdhcyB7dmFsdWV9Iik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsZXQgZGVmYXVsdF92YWx1ZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXN1bHQKLQorICAgIHRydWUKIH0KIAogLy8vIHF1ZXJ5IGZsYWcgZW5hYmxlZF9ydwpAQCAtOTQwLDE1ICs0MTQsMTg5IEBACiAKICAgICBjb25zdCBURVNUX0VYUEVDVEVEOiAmc3RyID0gciMiCiAvLyEgY29kZWdlbmVyYXRlZCBydXN0IGZsYWcgbGliCi0KK3VzZSBhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGk6OntNbWFwLCBBY29uZmlnU3RvcmFnZUVycm9yLCBTdG9yYWdlRmlsZVR5cGUsIFBhY2thZ2VSZWFkQ29udGV4dCwgZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUsIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUsIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dH07CiB1c2Ugc3RkOjpjb2xsZWN0aW9uczo6QlRyZWVNYXA7Ci11c2Ugc3RkOjpzeW5jOjpNdXRleDsKK3VzZSBzdGQ6OnBhdGg6OlBhdGg7Cit1c2Ugc3RkOjppbzo6V3JpdGU7Cit1c2Ugc3RkOjpzeW5jOjp7TGF6eUxvY2ssIE11dGV4fTsKK3VzZSBsb2c6Ontsb2csIExldmVsRmlsdGVyLCBMZXZlbH07CiAKIC8vLyBmbGFnIHByb3ZpZGVyCiBwdWIgc3RydWN0IEZsYWdQcm92aWRlciB7CiAgICAgb3ZlcnJpZGVzOiBCVHJlZU1hcDwmJ3N0YXRpYyBzdHIsIGJvb2w+LAogfQogCitzdGF0aWMgUEFDS0FHRV9PRkZTRVQ6IExhenlMb2NrPFJlc3VsdDxPcHRpb248dTMyPiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4+ID0gTGF6eUxvY2s6Om5ldyh8fCB1bnNhZmUgeworICAgIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlKCJzeXN0ZW0iLCBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXApCisgICAgLmFuZF90aGVuKHxwYWNrYWdlX21hcHwgZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX21hcCwgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIpKQorICAgIC5tYXAofGNvbnRleHR8IGNvbnRleHQubWFwKHxjfCBjLmJvb2xlYW5fc3RhcnRfaW5kZXgpKQorfSk7CisKK3N0YXRpYyBGTEFHX1ZBTF9NQVA6IExhenlMb2NrPFJlc3VsdDxNbWFwLCBBY29uZmlnU3RvcmFnZUVycm9yPj4gPSBMYXp5TG9jazo6bmV3KHx8IHVuc2FmZSB7CisgICAgZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUoInN5c3RlbSIsIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ1ZhbCkKK30pOworCisvLy8gZmxhZyB2YWx1ZSBjYWNoZSBmb3IgZGlzYWJsZWRfcncKK3N0YXRpYyBDQUNIRURfZGlzYWJsZWRfcnc6IExhenlMb2NrPGJvb2w+ID0gTGF6eUxvY2s6Om5ldyh8fCB7CisgICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gU3Vic2VxdWVudCBjYWxscyBhZnRlciB0aGUgZmlyc3QgYXJlIG5vb3BzLgorICAgIGxvZ2dlcjo6aW5pdCgKKyAgICAgICAgbG9nZ2VyOjpDb25maWc6OmRlZmF1bHQoKQorICAgICAgICAgICAgLndpdGhfdGFnX29uX2RldmljZSgiYWNvbmZpZ19ydXN0X2NvZGVnZW4iKQorICAgICAgICAgICAgLndpdGhfbWF4X2xldmVsKExldmVsRmlsdGVyOjpJbmZvKSk7CisKKyAgICBsZXQgZmxhZ192YWx1ZV9yZXN1bHQgPSBGTEFHX1ZBTF9NQVAKKyAgICAgICAgLmFzX3JlZigpCisgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgZmxhZyB2YWwgbWFwOiB7ZXJyfSIpKQorICAgICAgICAuYW5kX3RoZW4ofGZsYWdfdmFsX21hcHwgeworICAgICAgICAgICAgUEFDS0FHRV9PRkZTRVQKKyAgICAgICAgICAgICAgIC5hc19yZWYoKQorICAgICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBwYWNrYWdlIHJlYWQgb2Zmc2V0OiB7ZXJyfSIpKQorICAgICAgICAgICAgICAgLmFuZF90aGVuKHxwYWNrYWdlX29mZnNldHwgeworICAgICAgICAgICAgICAgICAgIG1hdGNoIHBhY2thZ2Vfb2Zmc2V0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgU29tZShvZmZzZXQpID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsX21hcCwgb2Zmc2V0ICsgMCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IGZsYWc6IHtlcnJ9IikpCisgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgIE5vbmUgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJubyBjb250ZXh0IGZvdW5kIGZvciBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyKGZvcm1hdCEoImZhaWxlZCB0byBmbGFnIHBhY2thZ2UgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0IikpCisgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICB9KTsKKworICAgIG1hdGNoIGZsYWdfdmFsdWVfcmVzdWx0IHsKKyAgICAgICAgT2soZmxhZ192YWx1ZSkgPT4geworICAgICAgICAgICAgcmV0dXJuIGZsYWdfdmFsdWU7CisgICAgICAgIH0sCisgICAgICAgIEVycihlcnIpID0+IHsKKyAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiYWNvbmZpZ19ydXN0X2NvZGVnZW46IGVycm9yOiB7ZXJyfSIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorfSk7CisKKy8vLyBmbGFnIHZhbHVlIGNhY2hlIGZvciBkaXNhYmxlZF9yd19leHBvcnRlZAorc3RhdGljIENBQ0hFRF9kaXNhYmxlZF9yd19leHBvcnRlZDogTGF6eUxvY2s8Ym9vbD4gPSBMYXp5TG9jazo6bmV3KHx8IHsKKyAgICAgICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gU3Vic2VxdWVudCBjYWxscyBhZnRlciB0aGUgZmlyc3QgYXJlIG5vb3BzLgorICAgICAgICBsb2dnZXI6OmluaXQoCisgICAgICAgICAgICBsb2dnZXI6OkNvbmZpZzo6ZGVmYXVsdCgpCisgICAgICAgICAgICAgICAgLndpdGhfdGFnX29uX2RldmljZSgiYWNvbmZpZ19ydXN0X2NvZGVnZW4iKQorICAgICAgICAgICAgICAgIC53aXRoX21heF9sZXZlbChMZXZlbEZpbHRlcjo6SW5mbykpOworCisgICAgICAgIGxldCBmbGFnX3ZhbHVlX3Jlc3VsdCA9IEZMQUdfVkFMX01BUAorICAgICAgICAgICAgLmFzX3JlZigpCisgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IGZsYWcgdmFsIG1hcDoge2Vycn0iKSkKKyAgICAgICAgICAgIC5hbmRfdGhlbih8ZmxhZ192YWxfbWFwfCB7CisgICAgICAgICAgICAgICAgUEFDS0FHRV9PRkZTRVQKKyAgICAgICAgICAgICAgICAgICAgLmFzX3JlZigpCisgICAgICAgICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgcGFja2FnZSByZWFkIG9mZnNldDoge2Vycn0iKSkKKyAgICAgICAgICAgICAgICAgICAgLmFuZF90aGVuKHxwYWNrYWdlX29mZnNldHwgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggcGFja2FnZV9vZmZzZXQgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWUob2Zmc2V0KSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsX21hcCwgb2Zmc2V0ICsgMSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgZmxhZzoge2Vycn0iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIm5vIGNvbnRleHQgZm91bmQgZm9yIHBhY2thZ2UgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycihmb3JtYXQhKCJmYWlsZWQgdG8gZmxhZyBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBtYXRjaCBmbGFnX3ZhbHVlX3Jlc3VsdCB7CisgICAgICAgICAgICBPayhmbGFnX3ZhbHVlKSA9PiB7CisgICAgICAgICAgICAgICAgIHJldHVybiBmbGFnX3ZhbHVlOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEVycihlcnIpID0+IHsKKyAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgImFjb25maWdfcnVzdF9jb2RlZ2VuOiBlcnJvcjoge2Vycn0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KK30pOworCisvLy8gZmxhZyB2YWx1ZSBjYWNoZSBmb3IgZGlzYWJsZWRfcndfaW5fb3RoZXJfbmFtZXNwYWNlCitzdGF0aWMgQ0FDSEVEX2Rpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZTogTGF6eUxvY2s8Ym9vbD4gPSBMYXp5TG9jazo6bmV3KHx8IHsKKyAgICAgICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gU3Vic2VxdWVudCBjYWxscyBhZnRlciB0aGUgZmlyc3QgYXJlIG5vb3BzLgorICAgICAgICBsb2dnZXI6OmluaXQoCisgICAgICAgICAgICBsb2dnZXI6OkNvbmZpZzo6ZGVmYXVsdCgpCisgICAgICAgICAgICAgICAgLndpdGhfdGFnX29uX2RldmljZSgiYWNvbmZpZ19ydXN0X2NvZGVnZW4iKQorICAgICAgICAgICAgICAgIC53aXRoX21heF9sZXZlbChMZXZlbEZpbHRlcjo6SW5mbykpOworCisgICAgICAgIGxldCBmbGFnX3ZhbHVlX3Jlc3VsdCA9IEZMQUdfVkFMX01BUAorICAgICAgICAgICAgLmFzX3JlZigpCisgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IGZsYWcgdmFsIG1hcDoge2Vycn0iKSkKKyAgICAgICAgICAgIC5hbmRfdGhlbih8ZmxhZ192YWxfbWFwfCB7CisgICAgICAgICAgICAgICAgUEFDS0FHRV9PRkZTRVQKKyAgICAgICAgICAgICAgICAgICAgLmFzX3JlZigpCisgICAgICAgICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgcGFja2FnZSByZWFkIG9mZnNldDoge2Vycn0iKSkKKyAgICAgICAgICAgICAgICAgICAgLmFuZF90aGVuKHxwYWNrYWdlX29mZnNldHwgeworICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2ggcGFja2FnZV9vZmZzZXQgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvbWUob2Zmc2V0KSA9PiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsX21hcCwgb2Zmc2V0ICsgMikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgZmxhZzoge2Vycn0iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIm5vIGNvbnRleHQgZm91bmQgZm9yIHBhY2thZ2UgY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycihmb3JtYXQhKCJmYWlsZWQgdG8gZmxhZyBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgICBtYXRjaCBmbGFnX3ZhbHVlX3Jlc3VsdCB7CisgICAgICAgICAgICBPayhmbGFnX3ZhbHVlKSA9PiB7CisgICAgICAgICAgICAgICAgIHJldHVybiBmbGFnX3ZhbHVlOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEVycihlcnIpID0+IHsKKyAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgImFjb25maWdfcnVzdF9jb2RlZ2VuOiBlcnJvcjoge2Vycn0iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KK30pOworCisKKy8vLyBmbGFnIHZhbHVlIGNhY2hlIGZvciBlbmFibGVkX3J3CitzdGF0aWMgQ0FDSEVEX2VuYWJsZWRfcnc6IExhenlMb2NrPGJvb2w+ID0gTGF6eUxvY2s6Om5ldyh8fCB7CisgICAgICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuIFN1YnNlcXVlbnQgY2FsbHMgYWZ0ZXIgdGhlIGZpcnN0IGFyZSBub29wcy4KKyAgICAgICAgbG9nZ2VyOjppbml0KAorICAgICAgICAgICAgbG9nZ2VyOjpDb25maWc6OmRlZmF1bHQoKQorICAgICAgICAgICAgICAgIC53aXRoX3RhZ19vbl9kZXZpY2UoImFjb25maWdfcnVzdF9jb2RlZ2VuIikKKyAgICAgICAgICAgICAgICAud2l0aF9tYXhfbGV2ZWwoTGV2ZWxGaWx0ZXI6OkluZm8pKTsKKworICAgICAgICBsZXQgZmxhZ192YWx1ZV9yZXN1bHQgPSBGTEFHX1ZBTF9NQVAKKyAgICAgICAgICAgIC5hc19yZWYoKQorICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBmbGFnIHZhbCBtYXA6IHtlcnJ9IikpCisgICAgICAgICAgICAuYW5kX3RoZW4ofGZsYWdfdmFsX21hcHwgeworICAgICAgICAgICAgICAgIFBBQ0tBR0VfT0ZGU0VUCisgICAgICAgICAgICAgICAgICAgIC5hc19yZWYoKQorICAgICAgICAgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IHBhY2thZ2UgcmVhZCBvZmZzZXQ6IHtlcnJ9IikpCisgICAgICAgICAgICAgICAgICAgIC5hbmRfdGhlbih8cGFja2FnZV9vZmZzZXR8IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIHBhY2thZ2Vfb2Zmc2V0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb21lKG9mZnNldCkgPT4geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZmbGFnX3ZhbF9tYXAsIG9mZnNldCArIDcpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IGZsYWc6IHtlcnJ9IikpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lID0+IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJubyBjb250ZXh0IGZvdW5kIGZvciBwYWNrYWdlIGNvbS5hbmRyb2lkLmFjb25maWcudGVzdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnIoZm9ybWF0ISgiZmFpbGVkIHRvIGZsYWcgcGFja2FnZSBjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QiKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgfSk7CisKKyAgICAgICAgbWF0Y2ggZmxhZ192YWx1ZV9yZXN1bHQgeworICAgICAgICAgICAgT2soZmxhZ192YWx1ZSkgPT4geworICAgICAgICAgICAgICAgICByZXR1cm4gZmxhZ192YWx1ZTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBFcnIoZXJyKSA9PiB7CisgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJhY29uZmlnX3J1c3RfY29kZWdlbjogZXJyb3I6IHtlcnJ9Iik7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KK30pOworCiBpbXBsIEZsYWdQcm92aWRlciB7CiAgICAgLy8vIHF1ZXJ5IGZsYWcgZGlzYWJsZWRfcm8KICAgICBwdWIgZm4gZGlzYWJsZWRfcm8oJnNlbGYpIC0+IGJvb2wgewpAQCAtOTY1LDEwICs2MTMsNyBAQAogICAgIC8vLyBxdWVyeSBmbGFnIGRpc2FibGVkX3J3CiAgICAgcHViIGZuIGRpc2FibGVkX3J3KCZzZWxmKSAtPiBib29sIHsKICAgICAgICAgc2VsZi5vdmVycmlkZXMuZ2V0KCJkaXNhYmxlZF9ydyIpLmNvcGllZCgpLnVud3JhcF9vcigKLSAgICAgICAgICAgIGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCi0gICAgICAgICAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3IiwKLSAgICAgICAgICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSIKKyAgICAgICAgICAgICpDQUNIRURfZGlzYWJsZWRfcncKICAgICAgICAgKQogICAgIH0KIApAQCAtOTgwLDEwICs2MjUsNyBAQAogICAgIC8vLyBxdWVyeSBmbGFnIGRpc2FibGVkX3J3X2V4cG9ydGVkCiAgICAgcHViIGZuIGRpc2FibGVkX3J3X2V4cG9ydGVkKCZzZWxmKSAtPiBib29sIHsKICAgICAgICAgc2VsZi5vdmVycmlkZXMuZ2V0KCJkaXNhYmxlZF9yd19leHBvcnRlZCIpLmNvcGllZCgpLnVud3JhcF9vcigKLSAgICAgICAgICAgIGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCi0gICAgICAgICAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2V4cG9ydGVkIiwKLSAgICAgICAgICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSIKKyAgICAgICAgICAgICpDQUNIRURfZGlzYWJsZWRfcndfZXhwb3J0ZWQKICAgICAgICAgKQogICAgIH0KIApAQCAtOTk1LDEwICs2MzcsNyBAQAogICAgIC8vLyBxdWVyeSBmbGFnIGRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZQogICAgIHB1YiBmbiBkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UoJnNlbGYpIC0+IGJvb2wgewogICAgICAgICBzZWxmLm92ZXJyaWRlcy5nZXQoImRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSIpLmNvcGllZCgpLnVud3JhcF9vcigKLSAgICAgICAgICAgIGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCi0gICAgICAgICAgICAgICAgImFjb25maWdfZmxhZ3Mub3RoZXJfbmFtZXNwYWNlIiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSIsCi0gICAgICAgICAgICAgICAgImZhbHNlIikgPT0gInRydWUiCisgICAgICAgICAgICAqQ0FDSEVEX2Rpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZQogICAgICAgICApCiAgICAgfQogCkBAIC0xMDU4LDEwICs2OTcsNyBAQAogICAgIC8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfcncKICAgICBwdWIgZm4gZW5hYmxlZF9ydygmc2VsZikgLT4gYm9vbCB7CiAgICAgICAgIHNlbGYub3ZlcnJpZGVzLmdldCgiZW5hYmxlZF9ydyIpLmNvcGllZCgpLnVud3JhcF9vcigKLSAgICAgICAgICAgIGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCi0gICAgICAgICAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKLSAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfcnciLAotICAgICAgICAgICAgICAgICJ0cnVlIikgPT0gInRydWUiCisgICAgICAgICAgICAqQ0FDSEVEX2VuYWJsZWRfcncKICAgICAgICAgKQogICAgIH0KIApAQCAtMTE5NSw3OCArODMxLDYgQEAKIH0KICIjOwogCi0gICAgY29uc3QgRVhQT1JURURfRVhQRUNURUQ6ICZzdHIgPSByIyIKLS8vISBjb2RlZ2VuZXJhdGVkIHJ1c3QgZmxhZyBsaWIKLXVzZSBhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGk6OntNbWFwLCBBY29uZmlnU3RvcmFnZUVycm9yLCBTdG9yYWdlRmlsZVR5cGUsIFBhY2thZ2VSZWFkQ29udGV4dCwgZ2V0X21hcHBlZF9zdG9yYWdlX2ZpbGUsIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUsIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dH07Ci11c2Ugc3RkOjpwYXRoOjpQYXRoOwotdXNlIHN0ZDo6aW86OldyaXRlOwotdXNlIHN0ZDo6c3luYzo6TGF6eUxvY2s7Ci11c2UgbG9nOjp7bG9nLCBMZXZlbEZpbHRlciwgTGV2ZWx9OwotCi1zdGF0aWMgU1RPUkFHRV9NSUdSQVRJT05fTUFSS0VSX0ZJTEU6ICZzdHIgPQotICAgICIvbWV0YWRhdGEvYWNvbmZpZ190ZXN0X21pc3Npb25zL21pc3Npb25fMSI7Ci1zdGF0aWMgTUlHUkFUSU9OX0xPR19UQUc6ICZzdHIgPSAiQWNvbmZpZ1Rlc3RNaXNzaW9uMSI7Ci0KLS8vLyBmbGFnIHByb3ZpZGVyCi1wdWIgc3RydWN0IEZsYWdQcm92aWRlcjsKLQotICAgIC8vLyBmbGFnIHZhbHVlIGNhY2hlIGZvciBkaXNhYmxlZF9yd19leHBvcnRlZAotICAgIHN0YXRpYyBDQUNIRURfZGlzYWJsZWRfcndfZXhwb3J0ZWQ6IExhenlMb2NrPGJvb2w+ID0gTGF6eUxvY2s6Om5ldyh8fCBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAotICAgICAgICAiYWNvbmZpZ19mbGFncy5hY29uZmlnX3Rlc3QiLAotICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2V4cG9ydGVkIiwKLSAgICAgICAgImZhbHNlIikgPT0gInRydWUiKTsKLQotICAgIC8vLyBmbGFnIHZhbHVlIGNhY2hlIGZvciBlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkCi0gICAgc3RhdGljIENBQ0hFRF9lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkOiBMYXp5TG9jazxib29sPiA9IExhenlMb2NrOjpuZXcofHwgZmxhZ3NfcnVzdDo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKLSAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKLSAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkIiwKLSAgICAgICAgImZhbHNlIikgPT0gInRydWUiKTsKLQotICAgIC8vLyBmbGFnIHZhbHVlIGNhY2hlIGZvciBlbmFibGVkX3JvX2V4cG9ydGVkCi0gICAgc3RhdGljIENBQ0hFRF9lbmFibGVkX3JvX2V4cG9ydGVkOiBMYXp5TG9jazxib29sPiA9IExhenlMb2NrOjpuZXcofHwgZmxhZ3NfcnVzdDo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKLSAgICAgICAgImFjb25maWdfZmxhZ3MuYWNvbmZpZ190ZXN0IiwKLSAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3JvX2V4cG9ydGVkIiwKLSAgICAgICAgImZhbHNlIikgPT0gInRydWUiKTsKLQotaW1wbCBGbGFnUHJvdmlkZXIgewotICAgIC8vLyBxdWVyeSBmbGFnIGRpc2FibGVkX3J3X2V4cG9ydGVkCi0gICAgcHViIGZuIGRpc2FibGVkX3J3X2V4cG9ydGVkKCZzZWxmKSAtPiBib29sIHsKLSAgICAgICAgKkNBQ0hFRF9kaXNhYmxlZF9yd19leHBvcnRlZAotICAgIH0KLQotICAgIC8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQKLSAgICBwdWIgZm4gZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgmc2VsZikgLT4gYm9vbCB7Ci0gICAgICAgICpDQUNIRURfZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZAotICAgIH0KLQotICAgIC8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfcm9fZXhwb3J0ZWQKLSAgICBwdWIgZm4gZW5hYmxlZF9yb19leHBvcnRlZCgmc2VsZikgLT4gYm9vbCB7Ci0gICAgICAgICpDQUNIRURfZW5hYmxlZF9yb19leHBvcnRlZAotICAgIH0KLX0KLQotLy8vIGZsYWcgcHJvdmlkZXIKLXB1YiBzdGF0aWMgUFJPVklERVI6IEZsYWdQcm92aWRlciA9IEZsYWdQcm92aWRlcjsKLQotLy8vIHF1ZXJ5IGZsYWcgZGlzYWJsZWRfcndfZXhwb3J0ZWQKLSNbaW5saW5lKGFsd2F5cyldCi1wdWIgZm4gZGlzYWJsZWRfcndfZXhwb3J0ZWQoKSAtPiBib29sIHsKLSAgICBQUk9WSURFUi5kaXNhYmxlZF9yd19leHBvcnRlZCgpCi19Ci0KLS8vLyBxdWVyeSBmbGFnIGVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQKLSNbaW5saW5lKGFsd2F5cyldCi1wdWIgZm4gZW5hYmxlZF9maXhlZF9yb19leHBvcnRlZCgpIC0+IGJvb2wgewotICAgIFBST1ZJREVSLmVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQoKQotfQotCi0vLy8gcXVlcnkgZmxhZyBlbmFibGVkX3JvX2V4cG9ydGVkCi0jW2lubGluZShhbHdheXMpXQotcHViIGZuIGVuYWJsZWRfcm9fZXhwb3J0ZWQoKSAtPiBib29sIHsKLSAgICBQUk9WSURFUi5lbmFibGVkX3JvX2V4cG9ydGVkKCkKLX0KLSIjOwotCiAgICAgY29uc3QgRk9SQ0VfUkVBRF9PTkxZX0VYUEVDVEVEOiAmc3RyID0gciMiCiAvLyEgY29kZWdlbmVyYXRlZCBydXN0IGZsYWcgbGliCiB1c2UgYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpOjp7TW1hcCwgQWNvbmZpZ1N0b3JhZ2VFcnJvciwgU3RvcmFnZUZpbGVUeXBlLCBQYWNrYWdlUmVhZENvbnRleHQsIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlLCBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlLCBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHR9OwpAQCAtMTI3NSwxMCArODM5LDYgQEAKIHVzZSBzdGQ6OnN5bmM6OkxhenlMb2NrOwogdXNlIGxvZzo6e2xvZywgTGV2ZWxGaWx0ZXIsIExldmVsfTsKIAotc3RhdGljIFNUT1JBR0VfTUlHUkFUSU9OX01BUktFUl9GSUxFOiAmc3RyID0KLSAgICAiL21ldGFkYXRhL2Fjb25maWdfdGVzdF9taXNzaW9ucy9taXNzaW9uXzEiOwotc3RhdGljIE1JR1JBVElPTl9MT0dfVEFHOiAmc3RyID0gIkFjb25maWdUZXN0TWlzc2lvbjEiOwotCiAvLy8gZmxhZyBwcm92aWRlcgogcHViIHN0cnVjdCBGbGFnUHJvdmlkZXI7CiAKQEAgLTEzNTUsNyArOTE1LDcgQEAKICIjOwogICAgIHVzZSBjcmF0ZTo6Y29tbWFuZHM6OmFzc2lnbl9mbGFnX2lkczsKIAotICAgIGZuIHRlc3RfZ2VuZXJhdGVfcnVzdF9jb2RlKG1vZGU6IENvZGVnZW5Nb2RlLCBhbGxvd19pbnN0cnVtZW50YXRpb246IGJvb2wsIGV4cGVjdGVkOiAmc3RyKSB7CisgICAgZm4gdGVzdF9nZW5lcmF0ZV9ydXN0X2NvZGUobW9kZTogQ29kZWdlbk1vZGUsIGV4cGVjdGVkOiAmc3RyKSB7CiAgICAgICAgIGxldCBwYXJzZWRfZmxhZ3MgPSBjcmF0ZTo6dGVzdDo6cGFyc2VfdGVzdF9mbGFncygpOwogICAgICAgICBsZXQgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzID0KICAgICAgICAgICAgIGNyYXRlOjpjb21tYW5kczo6bW9kaWZ5X3BhcnNlZF9mbGFnc19iYXNlZF9vbl9tb2RlKHBhcnNlZF9mbGFncywgbW9kZSkudW53cmFwKCk7CkBAIC0xMzY2LDcgKzkyNiw2IEBACiAgICAgICAgICAgICBmbGFnX2lkcywKICAgICAgICAgICAgIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pbnRvX2l0ZXIoKSwKICAgICAgICAgICAgIG1vZGUsCi0gICAgICAgICAgICBhbGxvd19pbnN0cnVtZW50YXRpb24sCiAgICAgICAgICkKICAgICAgICAgLnVud3JhcCgpOwogICAgICAgICBhc3NlcnRfZXEhKCJzcmMvbGliLnJzIiwgZm9ybWF0ISgie30iLCBnZW5lcmF0ZWQucGF0aC5kaXNwbGF5KCkpKTsKQEAgLTEzODEsMjYgKzk0MCwxNiBAQAogCiAgICAgI1t0ZXN0XQogICAgIGZuIHRlc3RfZ2VuZXJhdGVfcnVzdF9jb2RlX2Zvcl9wcm9kKCkgewotICAgICAgICB0ZXN0X2dlbmVyYXRlX3J1c3RfY29kZShDb2RlZ2VuTW9kZTo6UHJvZHVjdGlvbiwgZmFsc2UsIFBST0RfRVhQRUNURUQpOwotICAgIH0KLQotICAgICNbdGVzdF0KLSAgICBmbiB0ZXN0X2dlbmVyYXRlX3J1c3RfY29kZV9mb3JfcHJvZF9pbnN0cnVtZW50ZWQoKSB7Ci0gICAgICAgIHRlc3RfZ2VuZXJhdGVfcnVzdF9jb2RlKENvZGVnZW5Nb2RlOjpQcm9kdWN0aW9uLCB0cnVlLCBQUk9EX0lOU1RSVU1FTlRFRF9FWFBFQ1RFRCk7CisgICAgICAgIHRlc3RfZ2VuZXJhdGVfcnVzdF9jb2RlKENvZGVnZW5Nb2RlOjpQcm9kdWN0aW9uLCBQUk9EX0VYUEVDVEVEKTsKICAgICB9CiAKICAgICAjW3Rlc3RdCiAgICAgZm4gdGVzdF9nZW5lcmF0ZV9ydXN0X2NvZGVfZm9yX3Rlc3QoKSB7Ci0gICAgICAgIHRlc3RfZ2VuZXJhdGVfcnVzdF9jb2RlKENvZGVnZW5Nb2RlOjpUZXN0LCBmYWxzZSwgVEVTVF9FWFBFQ1RFRCk7Ci0gICAgfQotCi0gICAgI1t0ZXN0XQotICAgIGZuIHRlc3RfZ2VuZXJhdGVfcnVzdF9jb2RlX2Zvcl9leHBvcnRlZCgpIHsKLSAgICAgICAgdGVzdF9nZW5lcmF0ZV9ydXN0X2NvZGUoQ29kZWdlbk1vZGU6OkV4cG9ydGVkLCBmYWxzZSwgRVhQT1JURURfRVhQRUNURUQpOworICAgICAgICB0ZXN0X2dlbmVyYXRlX3J1c3RfY29kZShDb2RlZ2VuTW9kZTo6VGVzdCwgVEVTVF9FWFBFQ1RFRCk7CiAgICAgfQogCiAgICAgI1t0ZXN0XQogICAgIGZuIHRlc3RfZ2VuZXJhdGVfcnVzdF9jb2RlX2Zvcl9mb3JjZV9yZWFkX29ubHkoKSB7Ci0gICAgICAgIHRlc3RfZ2VuZXJhdGVfcnVzdF9jb2RlKENvZGVnZW5Nb2RlOjpGb3JjZVJlYWRPbmx5LCBmYWxzZSwgRk9SQ0VfUkVBRF9PTkxZX0VYUEVDVEVEKTsKKyAgICAgICAgdGVzdF9nZW5lcmF0ZV9ydXN0X2NvZGUoQ29kZWdlbk1vZGU6OkZvcmNlUmVhZE9ubHksIEZPUkNFX1JFQURfT05MWV9FWFBFQ1RFRCk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9jb21tYW5kcy5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvY29tbWFuZHMucnMKaW5kZXggMWExNGY2NC4uMGM4MGQzYiAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9jb21tYW5kcy5ycworKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL2NvbW1hbmRzLnJzCkBAIC0xNSwxNSArMTUsMTYgQEAKICAqLwogCiB1c2UgYW55aG93Ojp7YmFpbCwgZW5zdXJlLCBDb250ZXh0LCBSZXN1bHR9OwordXNlIGNvbnZlcnRfZmluYWxpemVkX2ZsYWdzOjpGaW5hbGl6ZWRGbGFnTWFwOwogdXNlIGl0ZXJ0b29sczo6SXRlcnRvb2xzOwogdXNlIHByb3RvYnVmOjpNZXNzYWdlOwotdXNlIHN0ZDo6Y29sbGVjdGlvbnM6OntCVHJlZU1hcCwgSGFzaE1hcH07Cit1c2Ugc3RkOjpjb2xsZWN0aW9uczo6SGFzaE1hcDsKIHVzZSBzdGQ6Omhhc2g6Okhhc2hlcjsKIHVzZSBzdGQ6OmlvOjpSZWFkOwogdXNlIHN0ZDo6cGF0aDo6UGF0aEJ1ZjsKIAogdXNlIGNyYXRlOjpjb2RlZ2VuOjpjcHA6OmdlbmVyYXRlX2NwcF9jb2RlOwotdXNlIGNyYXRlOjpjb2RlZ2VuOjpqYXZhOjpnZW5lcmF0ZV9qYXZhX2NvZGU7Cit1c2UgY3JhdGU6OmNvZGVnZW46OmphdmE6OntnZW5lcmF0ZV9qYXZhX2NvZGUsIEphdmFDb2RlZ2VuQ29uZmlnfTsKIHVzZSBjcmF0ZTo6Y29kZWdlbjo6cnVzdDo6Z2VuZXJhdGVfcnVzdF9jb2RlOwogdXNlIGNyYXRlOjpjb2RlZ2VuOjpDb2RlZ2VuTW9kZTsKIHVzZSBjcmF0ZTo6ZHVtcDo6e0R1bXBGb3JtYXQsIER1bXBQcmVkaWNhdGV9OwpAQCAtNjksNiArNzAsNyBAQAogICAgIGRlY2xhcmF0aW9uczogVmVjPElucHV0PiwKICAgICB2YWx1ZXM6IFZlYzxJbnB1dD4sCiAgICAgZGVmYXVsdF9wZXJtaXNzaW9uOiBQcm90b0ZsYWdQZXJtaXNzaW9uLAorICAgIGFsbG93X3JlYWRfd3JpdGU6IGJvb2wsCiApIC0+IFJlc3VsdDxWZWM8dTg+PiB7CiAgICAgbGV0IG11dCBwYXJzZWRfZmxhZ3MgPSBQcm90b1BhcnNlZEZsYWdzOjpuZXcoKTsKIApAQCAtNzksOCArODEsMTggQEAKICAgICAgICAgICAgIC5yZWFkX3RvX3N0cmluZygmbXV0IGNvbnRlbnRzKQogICAgICAgICAgICAgLndpdGhfY29udGV4dCh8fCBmb3JtYXQhKCJmYWlsZWQgdG8gcmVhZCB7fSIsIGlucHV0LnNvdXJjZSkpPzsKIAotICAgICAgICBsZXQgZmxhZ19kZWNsYXJhdGlvbnMgPSBhY29uZmlnX3Byb3Rvczo6ZmxhZ19kZWNsYXJhdGlvbnM6OnRyeV9mcm9tX3RleHRfcHJvdG8oJmNvbnRlbnRzKQotICAgICAgICAgICAgLndpdGhfY29udGV4dCh8fCBpbnB1dC5lcnJvcl9jb250ZXh0KCkpPzsKKyAgICAgICAgbGV0IG11dCBmbGFnX2RlY2xhcmF0aW9ucyA9CisgICAgICAgICAgICBhY29uZmlnX3Byb3Rvczo6ZmxhZ19kZWNsYXJhdGlvbnM6OnRyeV9mcm9tX3RleHRfcHJvdG8oJmNvbnRlbnRzKQorICAgICAgICAgICAgICAgIC53aXRoX2NvbnRleHQofHwgaW5wdXQuZXJyb3JfY29udGV4dCgpKT87CisKKyAgICAgICAgLy8gc3lzdGVtX2V4dCBmbGFncyBzaG91bGQgYmUgdHJlYXRlZCBhcyBzeXN0ZW0gZmxhZ3MgYXMgd2UgYXJlIGNvbWJpbmluZyAvc3lzdGVtX2V4dAorICAgICAgICAvLyBhbmQgL3N5c3RlbSBhcyBvbmUgY29udGFpbmVyCisgICAgICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIGxvZ2ljIHdoZW4gd2Ugc3RhcnQgZW5mb3JjaW5nIHRoYXQgc3lzdGVtX2V4dCBjYW5ub3QgYmUgc2V0IGFzCisgICAgICAgIC8vIGNvbnRhaW5lciBpbiBhY29uZmlnIGRlY2xhcmF0aW9uIGZpbGVzLgorICAgICAgICBpZiBmbGFnX2RlY2xhcmF0aW9ucy5jb250YWluZXIoKSA9PSAic3lzdGVtX2V4dCIgeworICAgICAgICAgICAgZmxhZ19kZWNsYXJhdGlvbnMuc2V0X2NvbnRhaW5lcihTdHJpbmc6OmZyb20oInN5c3RlbSIpKTsKKyAgICAgICAgfQorCiAgICAgICAgIGVuc3VyZSEoCiAgICAgICAgICAgICBwYWNrYWdlID09IGZsYWdfZGVjbGFyYXRpb25zLnBhY2thZ2UoKSwKICAgICAgICAgICAgICJmYWlsZWQgdG8gcGFyc2Uge306IGV4cGVjdGVkIHBhY2thZ2Uge30sIGdvdCB7fSIsCkBAIC0xODUsNiArMTk3LDE2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpZiAhYWxsb3dfcmVhZF93cml0ZSB7CisgICAgICAgIGlmIGxldCBTb21lKHBmKSA9IHBhcnNlZF9mbGFncworICAgICAgICAgICAgLnBhcnNlZF9mbGFnCisgICAgICAgICAgICAuaXRlcigpCisgICAgICAgICAgICAuZmluZCh8cGZ8IHBmLnBlcm1pc3Npb24oKSA9PSBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX1dSSVRFKQorICAgICAgICB7CisgICAgICAgICAgICBiYWlsISgiZmxhZyB7fSBoYXMgcGVybWlzc2lvbiBSRUFEX1dSSVRFLCBidXQgYWxsb3dfcmVhZF93cml0ZSBpcyBmYWxzZSIsIHBmLm5hbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyBDcmVhdGUgYSBzb3J0ZWQgcGFyc2VkX2ZsYWdzCiAgICAgYWNvbmZpZ19wcm90b3M6OnBhcnNlZF9mbGFnczo6c29ydF9wYXJzZWRfZmxhZ3MoJm11dCBwYXJzZWRfZmxhZ3MpOwogICAgIGFjb25maWdfcHJvdG9zOjpwYXJzZWRfZmxhZ3M6OnZlcmlmeV9maWVsZHMoJnBhcnNlZF9mbGFncyk/OwpAQCAtMTk3LDI4ICsyMTksMzMgQEAKICAgICBtdXQgaW5wdXQ6IElucHV0LAogICAgIGNvZGVnZW5fbW9kZTogQ29kZWdlbk1vZGUsCiAgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uOiBib29sLAorICAgIG5ld19leHBvcnRlZDogYm9vbCwKKyAgICBzaW5nbGVfZXhwb3J0ZWRfZmlsZTogYm9vbCwKKyAgICBmaW5hbGl6ZWRfZmxhZ3M6IEZpbmFsaXplZEZsYWdNYXAsCiApIC0+IFJlc3VsdDxWZWM8T3V0cHV0RmlsZT4+IHsKICAgICBsZXQgcGFyc2VkX2ZsYWdzID0gaW5wdXQudHJ5X3BhcnNlX2ZsYWdzKCk/OwotICAgIGxldCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MgPSBtb2RpZnlfcGFyc2VkX2ZsYWdzX2Jhc2VkX29uX21vZGUocGFyc2VkX2ZsYWdzLCBjb2RlZ2VuX21vZGUpPzsKKyAgICBsZXQgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzID0KKyAgICAgICAgbW9kaWZ5X3BhcnNlZF9mbGFnc19iYXNlZF9vbl9tb2RlKHBhcnNlZF9mbGFncy5jbG9uZSgpLCBjb2RlZ2VuX21vZGUpPzsKICAgICBsZXQgU29tZShwYWNrYWdlKSA9IGZpbmRfdW5pcXVlX3BhY2thZ2UoJm1vZGlmaWVkX3BhcnNlZF9mbGFncykgZWxzZSB7CiAgICAgICAgIGJhaWwhKCJubyBwYXJzZWQgZmxhZ3MsIG9yIHRoZSBwYXJzZWQgZmxhZ3MgdXNlIGRpZmZlcmVudCBwYWNrYWdlcyIpOwogICAgIH07CiAgICAgbGV0IHBhY2thZ2UgPSBwYWNrYWdlLnRvX3N0cmluZygpOworICAgIGxldCBtdXQgZmxhZ19uYW1lcyA9IGV4dHJhY3RfZmxhZ19uYW1lcyhwYXJzZWRfZmxhZ3MpPzsKKyAgICBsZXQgcGFja2FnZV9maW5nZXJwcmludCA9IGNvbXB1dGVfZmxhZ3NfZmluZ2VycHJpbnQoJm11dCBmbGFnX25hbWVzKTsKICAgICBsZXQgZmxhZ19pZHMgPSBhc3NpZ25fZmxhZ19pZHMoJnBhY2thZ2UsIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pdGVyKCkpPzsKLSAgICBnZW5lcmF0ZV9qYXZhX2NvZGUoCi0gICAgICAgICZwYWNrYWdlLAotICAgICAgICBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaW50b19pdGVyKCksCisgICAgbGV0IGNvbmZpZyA9IEphdmFDb2RlZ2VuQ29uZmlnIHsKICAgICAgICAgY29kZWdlbl9tb2RlLAogICAgICAgICBmbGFnX2lkcywKICAgICAgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uLAotICAgICkKKyAgICAgICAgcGFja2FnZV9maW5nZXJwcmludCwKKyAgICAgICAgbmV3X2V4cG9ydGVkLAorICAgICAgICBzaW5nbGVfZXhwb3J0ZWRfZmlsZSwKKyAgICAgICAgZmluYWxpemVkX2ZsYWdzLAorICAgIH07CisgICAgZ2VuZXJhdGVfamF2YV9jb2RlKCZwYWNrYWdlLCBtb2RpZmllZF9wYXJzZWRfZmxhZ3MuaW50b19pdGVyKCksIGNvbmZpZykKIH0KIAotcHViIGZuIGNyZWF0ZV9jcHBfbGliKAotICAgIG11dCBpbnB1dDogSW5wdXQsCi0gICAgY29kZWdlbl9tb2RlOiBDb2RlZ2VuTW9kZSwKLSAgICBhbGxvd19pbnN0cnVtZW50YXRpb246IGJvb2wsCi0pIC0+IFJlc3VsdDxWZWM8T3V0cHV0RmlsZT4+IHsKK3B1YiBmbiBjcmVhdGVfY3BwX2xpYihtdXQgaW5wdXQ6IElucHV0LCBjb2RlZ2VuX21vZGU6IENvZGVnZW5Nb2RlKSAtPiBSZXN1bHQ8VmVjPE91dHB1dEZpbGU+PiB7CiAgICAgLy8gVE9ETygzMjc0MjA2NzkpOiBFbmFibGUgZXhwb3J0IG1vZGUgZm9yIG5hdGl2ZSBmbGFnIGxpYnJhcnkKICAgICBlbnN1cmUhKAogICAgICAgICBjb2RlZ2VuX21vZGUgIT0gQ29kZWdlbk1vZGU6OkV4cG9ydGVkLApAQCAtMjMxLDIwICsyNTgsMTAgQEAKICAgICB9OwogICAgIGxldCBwYWNrYWdlID0gcGFja2FnZS50b19zdHJpbmcoKTsKICAgICBsZXQgZmxhZ19pZHMgPSBhc3NpZ25fZmxhZ19pZHMoJnBhY2thZ2UsIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pdGVyKCkpPzsKLSAgICBnZW5lcmF0ZV9jcHBfY29kZSgKLSAgICAgICAgJnBhY2thZ2UsCi0gICAgICAgIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pbnRvX2l0ZXIoKSwKLSAgICAgICAgY29kZWdlbl9tb2RlLAotICAgICAgICBmbGFnX2lkcywKLSAgICAgICAgYWxsb3dfaW5zdHJ1bWVudGF0aW9uLAotICAgICkKKyAgICBnZW5lcmF0ZV9jcHBfY29kZSgmcGFja2FnZSwgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzLmludG9faXRlcigpLCBjb2RlZ2VuX21vZGUsIGZsYWdfaWRzKQogfQogCi1wdWIgZm4gY3JlYXRlX3J1c3RfbGliKAotICAgIG11dCBpbnB1dDogSW5wdXQsCi0gICAgY29kZWdlbl9tb2RlOiBDb2RlZ2VuTW9kZSwKLSAgICBhbGxvd19pbnN0cnVtZW50YXRpb246IGJvb2wsCi0pIC0+IFJlc3VsdDxPdXRwdXRGaWxlPiB7CitwdWIgZm4gY3JlYXRlX3J1c3RfbGliKG11dCBpbnB1dDogSW5wdXQsIGNvZGVnZW5fbW9kZTogQ29kZWdlbk1vZGUpIC0+IFJlc3VsdDxPdXRwdXRGaWxlPiB7CiAgICAgLy8gLy8gVE9ETygzMjc0MjA2NzkpOiBFbmFibGUgZXhwb3J0IG1vZGUgZm9yIG5hdGl2ZSBmbGFnIGxpYnJhcnkKICAgICBlbnN1cmUhKAogICAgICAgICBjb2RlZ2VuX21vZGUgIT0gQ29kZWdlbk1vZGU6OkV4cG9ydGVkLApAQCAtMjU3LDIzICsyNzQsMTggQEAKICAgICB9OwogICAgIGxldCBwYWNrYWdlID0gcGFja2FnZS50b19zdHJpbmcoKTsKICAgICBsZXQgZmxhZ19pZHMgPSBhc3NpZ25fZmxhZ19pZHMoJnBhY2thZ2UsIG1vZGlmaWVkX3BhcnNlZF9mbGFncy5pdGVyKCkpPzsKLSAgICBnZW5lcmF0ZV9ydXN0X2NvZGUoCi0gICAgICAgICZwYWNrYWdlLAotICAgICAgICBmbGFnX2lkcywKLSAgICAgICAgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzLmludG9faXRlcigpLAotICAgICAgICBjb2RlZ2VuX21vZGUsCi0gICAgICAgIGFsbG93X2luc3RydW1lbnRhdGlvbiwKLSAgICApCisgICAgZ2VuZXJhdGVfcnVzdF9jb2RlKCZwYWNrYWdlLCBmbGFnX2lkcywgbW9kaWZpZWRfcGFyc2VkX2ZsYWdzLmludG9faXRlcigpLCBjb2RlZ2VuX21vZGUpCiB9CiAKIHB1YiBmbiBjcmVhdGVfc3RvcmFnZSgKICAgICBjYWNoZXM6IFZlYzxJbnB1dD4sCiAgICAgY29udGFpbmVyOiAmc3RyLAogICAgIGZpbGU6ICZTdG9yYWdlRmlsZVR5cGUsCisgICAgdmVyc2lvbjogdTMyLAogKSAtPiBSZXN1bHQ8VmVjPHU4Pj4gewogICAgIGxldCBwYXJzZWRfZmxhZ3NfdmVjOiBWZWM8UHJvdG9QYXJzZWRGbGFncz4gPQogICAgICAgICBjYWNoZXMuaW50b19pdGVyKCkubWFwKHxtdXQgaW5wdXR8IGlucHV0LnRyeV9wYXJzZV9mbGFncygpKS5jb2xsZWN0Ojo8UmVzdWx0PFZlYzxfPj4+KCk/OwotICAgIGdlbmVyYXRlX3N0b3JhZ2VfZmlsZShjb250YWluZXIsIHBhcnNlZF9mbGFnc192ZWMuaXRlcigpLCBmaWxlKQorICAgIGdlbmVyYXRlX3N0b3JhZ2VfZmlsZShjb250YWluZXIsIHBhcnNlZF9mbGFnc192ZWMuaXRlcigpLCBmaWxlLCB2ZXJzaW9uKQogfQogCiBwdWIgZm4gY3JlYXRlX2RldmljZV9jb25maWdfZGVmYXVsdHMobXV0IGlucHV0OiBJbnB1dCkgLT4gUmVzdWx0PFZlYzx1OD4+IHsKQEAgLTM5NywzOCArNDA5LDY1IEBACiB7CiAgICAgYXNzZXJ0IShwYXJzZWRfZmxhZ3NfaXRlci5jbG9uZSgpLnR1cGxlX3dpbmRvd3MoKS5hbGwofChhLCBiKXwgYS5uYW1lKCkgPD0gYi5uYW1lKCkpKTsKICAgICBsZXQgbXV0IGZsYWdfaWRzID0gSGFzaE1hcDo6bmV3KCk7Ci0gICAgZm9yIChpZF90b19hc3NpZ24sIHBmKSBpbiAoMF91MzIuLikuemlwKHBhcnNlZF9mbGFnc19pdGVyKSB7CisgICAgbGV0IG11dCBmbGFnX2lkeCA9IDA7CisgICAgZm9yIHBmIGluIHBhcnNlZF9mbGFnc19pdGVyIHsKICAgICAgICAgaWYgcGFja2FnZSAhPSBwZi5wYWNrYWdlKCkgewogICAgICAgICAgICAgcmV0dXJuIEVycihhbnlob3c6OmFueWhvdyEoImVuY291bnRlcmVkIGEgZmxhZyBub3QgaW4gY3VycmVudCBwYWNrYWdlIikpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gcHV0IGEgY2FwIG9uIGhvdyBtYW55IGZsYWdzIGEgcGFja2FnZSBjYW4gY29udGFpbiB0byA2NTUzNQotICAgICAgICBpZiBpZF90b19hc3NpZ24gPiB1MTY6Ok1BWCBhcyB1MzIgeworICAgICAgICBpZiBmbGFnX2lkeCA+IHUxNjo6TUFYIGFzIHUzMiB7CiAgICAgICAgICAgICByZXR1cm4gRXJyKGFueWhvdzo6YW55aG93ISgidGhlIG51bWJlciBvZiBmbGFncyBpbiBhIHBhY2thZ2UgY2Fubm90IGV4Y2VlZCA2NTUzNSIpKTsKICAgICAgICAgfQogCi0gICAgICAgIGZsYWdfaWRzLmluc2VydChwZi5uYW1lKCkudG9fc3RyaW5nKCksIGlkX3RvX2Fzc2lnbiBhcyB1MTYpOworICAgICAgICBpZiBzaG91bGRfaW5jbHVkZV9mbGFnKHBmKSB7CisgICAgICAgICAgICBmbGFnX2lkcy5pbnNlcnQocGYubmFtZSgpLnRvX3N0cmluZygpLCBmbGFnX2lkeCBhcyB1MTYpOworICAgICAgICAgICAgZmxhZ19pZHggKz0gMTsKKyAgICAgICAgfQogICAgIH0KICAgICBPayhmbGFnX2lkcykKIH0KIAotI1thbGxvdyhkZWFkX2NvZGUpXSAvLyBUT0RPOiBiLzMxNjM1NzY4NiAtIFVzZSBmaW5nZXJwcmludCBpbiBjb2RlZ2VuIHRvCi0gICAgICAgICAgICAgICAgICAgIC8vIHByb3RlY3QgaGFyZGNvZGVkIG9mZnNldCByZWFkcy4KLXB1YiBmbiBjb21wdXRlX2ZsYWdfb2Zmc2V0c19maW5nZXJwcmludChmbGFnc19tYXA6ICZIYXNoTWFwPFN0cmluZywgdTE2PikgLT4gUmVzdWx0PHU2ND4geworLy8gQ3JlYXRlcyBhIGZpbmdlcnByaW50IG9mIHRoZSBmbGFnIG5hbWVzICh3aGljaCByZXF1aXJlcyBzb3J0aW5nIHRoZSB2ZWN0b3IpLgorLy8gRmluZ2VycHJpbnQgaXMgdXNlZCBieSBib3RoIGNvZGVnZW4gYW5kIHN0b3JhZ2UgZmlsZXMuCitwdWIgZm4gY29tcHV0ZV9mbGFnc19maW5nZXJwcmludChmbGFnX25hbWVzOiAmbXV0IFZlYzxTdHJpbmc+KSAtPiB1NjQgeworICAgIGZsYWdfbmFtZXMuc29ydCgpOworCiAgICAgbGV0IG11dCBoYXNoZXIgPSBTaXBIYXNoZXIxMzo6bmV3KCk7Ci0KLSAgICAvLyBOZWVkIHRvIHNvcnQgdG8gZW5zdXJlIHRoZSBkYXRhIGlzIGFkZGVkIHRvIHRoZSBoYXNoZXIgaW4gdGhlIHNhbWUgb3JkZXIKLSAgICAvLyBlYWNoIHJ1bi4KLSAgICBsZXQgc29ydGVkX21hcDogQlRyZWVNYXA8JlN0cmluZywgJnUxNj4gPSBmbGFnc19tYXAuaXRlcigpLmNvbGxlY3QoKTsKLQotICAgIGZvciAoZmxhZywgb2Zmc2V0KSBpbiBzb3J0ZWRfbWFwIHsKLSAgICAgICAgLy8gU2VlIGh0dHBzOi8vZG9jcy5ycy9zaXBoYXNoZXIvbGF0ZXN0L3NpcGhhc2hlci8jbm90ZSBmb3IgdXNlIG9mIHdyaXRlCi0gICAgICAgIC8vIG92ZXIgd3JpdGVfaTE2LiBTaW1pbGFybHksIHVzZSB0b19iZV9ieXRlcyByYXRoZXIgdGhhbiB0b19uZV9ieXRlcyB0bwotICAgICAgICAvLyBlbnN1cmUgY29uc2lzdGVuY3kuCisgICAgZm9yIGZsYWcgaW4gZmxhZ19uYW1lcyB7CiAgICAgICAgIGhhc2hlci53cml0ZShmbGFnLmFzX2J5dGVzKCkpOwotICAgICAgICBoYXNoZXIud3JpdGUoJm9mZnNldC50b19iZV9ieXRlcygpKTsKICAgICB9Ci0gICAgT2soaGFzaGVyLmZpbmlzaCgpKQorICAgIGhhc2hlci5maW5pc2goKQorfQorCisvLyBDb252ZXJ0cyBQcm90b1BhcnNlZEZsYWdzIGludG8gYSB2ZWN0b3Igb2Ygc3RyaW5ncyBjb250YWluaW5nIGFsbCBvZiB0aGUgZmxhZworLy8gbmFtZXMuIEhlbHBlciBmbiBmb3IgY3JlYXRpbmcgZmluZ2VycHJpbnQgZm9yIGNvZGVnZW4gZmlsZXMuIEZsYWdzIG11c3QgYWxsCisvLyBiZWxvbmcgdG8gdGhlIHNhbWUgcGFja2FnZS4KK2ZuIGV4dHJhY3RfZmxhZ19uYW1lcyhmbGFnczogUHJvdG9QYXJzZWRGbGFncykgLT4gUmVzdWx0PFZlYzxTdHJpbmc+PiB7CisgICAgbGV0IHNlcGFyYXRlZF9mbGFnczogVmVjPFByb3RvUGFyc2VkRmxhZz4gPSBmbGFncy5wYXJzZWRfZmxhZy5pbnRvX2l0ZXIoKS5jb2xsZWN0Ojo8VmVjPF8+PigpOworCisgICAgLy8gQWxsIGZsYWdzIG11c3QgYmVsb25nIHRvIHRoZSBzYW1lIHBhY2thZ2UgYXMgdGhlIGZpbmdlcnByaW50IGlzIHBlci1wYWNrYWdlLgorICAgIGxldCBTb21lKF9wYWNrYWdlKSA9IGZpbmRfdW5pcXVlX3BhY2thZ2UoJnNlcGFyYXRlZF9mbGFncykgZWxzZSB7CisgICAgICAgIGJhaWwhKCJObyBwYXJzZWQgZmxhZ3MsIG9yIHRoZSBwYXJzZWQgZmxhZ3MgdXNlIGRpZmZlcmVudCBwYWNrYWdlcy4iKTsKKyAgICB9OworCisgICAgT2soc2VwYXJhdGVkX2ZsYWdzCisgICAgICAgIC5pbnRvX2l0ZXIoKQorICAgICAgICAuZmlsdGVyKHNob3VsZF9pbmNsdWRlX2ZsYWcpCisgICAgICAgIC5tYXAofGZsYWd8IGZsYWcubmFtZS51bndyYXAoKSkKKyAgICAgICAgLmNvbGxlY3Q6OjxWZWM8Xz4+KCkpCit9CisKKy8vIEV4Y2x1ZGUgc3lzdGVtL3ZlbmRvci9wcm9kdWN0IGZsYWdzIHRoYXQgYXJlIFJPK2Rpc2FibGVkLgorcHViIGZuIHNob3VsZF9pbmNsdWRlX2ZsYWcocGY6ICZQcm90b1BhcnNlZEZsYWcpIC0+IGJvb2wgeworICAgIGxldCBzaG91bGRfZmlsdGVyX2NvbnRhaW5lciA9IHBmLmNvbnRhaW5lciA9PSBTb21lKCJ2ZW5kb3IiLnRvX3N0cmluZygpKQorICAgICAgICB8fCBwZi5jb250YWluZXIgPT0gU29tZSgic3lzdGVtIi50b19zdHJpbmcoKSkKKyAgICAgICAgfHwgcGYuY29udGFpbmVyID09IFNvbWUoInByb2R1Y3QiLnRvX3N0cmluZygpKTsKKworICAgIGxldCBkaXNhYmxlZF9ybyA9IHBmLnN0YXRlID09IFNvbWUoUHJvdG9GbGFnU3RhdGU6OkRJU0FCTEVELmludG8oKSkKKyAgICAgICAgJiYgcGYucGVybWlzc2lvbiA9PSBTb21lKFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfT05MWS5pbnRvKCkpOworCisgICAgIXNob3VsZF9maWx0ZXJfY29udGFpbmVyIHx8ICFkaXNhYmxlZF9ybwogfQogCiAjW2NmZyh0ZXN0KV0KQEAgLTQzOSwxMyArNDc4LDQ5IEBACiAgICAgI1t0ZXN0XQogICAgIGZuIHRlc3Rfb2Zmc2V0X2ZpbmdlcnByaW50KCkgewogICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzID0gY3JhdGU6OnRlc3Q6OnBhcnNlX3Rlc3RfZmxhZ3MoKTsKLSAgICAgICAgbGV0IHBhY2thZ2UgPSBmaW5kX3VuaXF1ZV9wYWNrYWdlKCZwYXJzZWRfZmxhZ3MucGFyc2VkX2ZsYWcpLnVud3JhcCgpLnRvX3N0cmluZygpOwotICAgICAgICBsZXQgZmxhZ19pZHMgPSBhc3NpZ25fZmxhZ19pZHMoJnBhY2thZ2UsIHBhcnNlZF9mbGFncy5wYXJzZWRfZmxhZy5pdGVyKCkpLnVud3JhcCgpOwotICAgICAgICBsZXQgZXhwZWN0ZWRfZmluZ2VycHJpbnQgPSAxMDcwOTg5MjQ4MTAwMjI1MjEzMnU2NDsKKyAgICAgICAgbGV0IGV4cGVjdGVkX2ZpbmdlcnByaW50OiB1NjQgPSAxMTU1MTM3OTk2MDMyNDI0MjM2MDsKIAotICAgICAgICBsZXQgaGFzaF9yZXN1bHQgPSBjb21wdXRlX2ZsYWdfb2Zmc2V0c19maW5nZXJwcmludCgmZmxhZ19pZHMpOworICAgICAgICBsZXQgbXV0IGV4dHJhY3RlZF9mbGFncyA9IGV4dHJhY3RfZmxhZ19uYW1lcyhwYXJzZWRfZmxhZ3MpLnVud3JhcCgpOworICAgICAgICBsZXQgaGFzaF9yZXN1bHQgPSBjb21wdXRlX2ZsYWdzX2ZpbmdlcnByaW50KCZtdXQgZXh0cmFjdGVkX2ZsYWdzKTsKIAotICAgICAgICBhc3NlcnRfZXEhKGhhc2hfcmVzdWx0LnVud3JhcCgpLCBleHBlY3RlZF9maW5nZXJwcmludCk7CisgICAgICAgIGFzc2VydF9lcSEoaGFzaF9yZXN1bHQsIGV4cGVjdGVkX2ZpbmdlcnByaW50KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9vZmZzZXRfZmluZ2VycHJpbnRfbWF0Y2hlc19mcm9tX3BhY2thZ2UoKSB7CisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3M6IFByb3RvUGFyc2VkRmxhZ3MgPSBjcmF0ZTo6dGVzdDo6cGFyc2VfdGVzdF9mbGFncygpOworCisgICAgICAgIC8vIEFsbCB0ZXN0IGZsYWdzIGFyZSBpbiB0aGUgc2FtZSBwYWNrYWdlLCBzbyBmaW5nZXJwcmludCBmcm9tIGFsbCBvZiB0aGVtLgorICAgICAgICBsZXQgbXV0IGV4dHJhY3RlZF9mbGFncyA9IGV4dHJhY3RfZmxhZ19uYW1lcyhwYXJzZWRfZmxhZ3MuY2xvbmUoKSkudW53cmFwKCk7CisgICAgICAgIGxldCByZXN1bHRfZnJvbV9wYXJzZWRfZmxhZ3MgPSBjb21wdXRlX2ZsYWdzX2ZpbmdlcnByaW50KCZtdXQgZXh0cmFjdGVkX2ZsYWdzKTsKKworICAgICAgICBsZXQgbXV0IGZsYWdfbmFtZXNfdmVjID0gcGFyc2VkX2ZsYWdzCisgICAgICAgICAgICAucGFyc2VkX2ZsYWcKKyAgICAgICAgICAgIC5jbG9uZSgpCisgICAgICAgICAgICAuaW50b19pdGVyKCkKKyAgICAgICAgICAgIC5maWx0ZXIoc2hvdWxkX2luY2x1ZGVfZmxhZykKKyAgICAgICAgICAgIC5tYXAofGZsYWd8IGZsYWcubmFtZS51bndyYXAoKSkKKyAgICAgICAgICAgIC5tYXAoU3RyaW5nOjpmcm9tKQorICAgICAgICAgICAgLmNvbGxlY3Q6OjxWZWM8Xz4+KCk7CisgICAgICAgIGxldCByZXN1bHRfZnJvbV9uYW1lcyA9IGNvbXB1dGVfZmxhZ3NfZmluZ2VycHJpbnQoJm11dCBmbGFnX25hbWVzX3ZlYyk7CisKKyAgICAgICAgLy8gQXNzZXJ0IHRoZSBzYW1lIGhhc2ggaXMgZ2VuZXJhdGVkIGZvciBlYWNoIGNhc2UuCisgICAgICAgIGFzc2VydF9lcSEocmVzdWx0X2Zyb21fcGFyc2VkX2ZsYWdzLCByZXN1bHRfZnJvbV9uYW1lcyk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3Rfb2Zmc2V0X2ZpbmdlcnByaW50X2RpZmZlcmVudF9wYWNrYWdlc19kb2VzX25vdF9tYXRjaCgpIHsKKyAgICAgICAgLy8gUGFyc2UgZmxhZ3MgZnJvbSB0d28gcGFja2FnZXMuCisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3M6IFByb3RvUGFyc2VkRmxhZ3MgPSBjcmF0ZTo6dGVzdDo6cGFyc2VfdGVzdF9mbGFncygpOworICAgICAgICBsZXQgc2Vjb25kX3BhcnNlZF9mbGFncyA9IGNyYXRlOjp0ZXN0OjpwYXJzZV9zZWNvbmRfcGFja2FnZV9mbGFncygpOworCisgICAgICAgIGxldCBtdXQgZXh0cmFjdGVkX2ZsYWdzID0gZXh0cmFjdF9mbGFnX25hbWVzKHBhcnNlZF9mbGFncykudW53cmFwKCk7CisgICAgICAgIGxldCByZXN1bHRfZnJvbV9wYXJzZWRfZmxhZ3MgPSBjb21wdXRlX2ZsYWdzX2ZpbmdlcnByaW50KCZtdXQgZXh0cmFjdGVkX2ZsYWdzKTsKKyAgICAgICAgbGV0IG11dCBzZWNvbmRfZXh0cmFjdGVkX2ZsYWdzID0gZXh0cmFjdF9mbGFnX25hbWVzKHNlY29uZF9wYXJzZWRfZmxhZ3MpLnVud3JhcCgpOworICAgICAgICBsZXQgc2Vjb25kX3Jlc3VsdCA9IGNvbXB1dGVfZmxhZ3NfZmluZ2VycHJpbnQoJm11dCBzZWNvbmRfZXh0cmFjdGVkX2ZsYWdzKTsKKworICAgICAgICAvLyBEaWZmZXJlbnQgZmxhZ3Mgc2hvdWxkIGhhdmUgYSBkaWZmZXJlbnQgZmluZ2VycHJpbnQuCisgICAgICAgIGFzc2VydF9uZSEocmVzdWx0X2Zyb21fcGFyc2VkX2ZsYWdzLCBzZWNvbmRfcmVzdWx0KTsKICAgICB9CiAKICAgICAjW3Rlc3RdCkBAIC01MTksNiArNTk0LDcgQEAKICAgICAgICAgICAgIGRlY2xhcmF0aW9uLAogICAgICAgICAgICAgdmFsdWUsCiAgICAgICAgICAgICBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX09OTFksCisgICAgICAgICAgICB0cnVlLAogICAgICAgICApCiAgICAgICAgIC51bndyYXAoKTsKICAgICAgICAgbGV0IHBhcnNlZF9mbGFncyA9CkBAIC01NTIsNiArNjI4LDcgQEAKICAgICAgICAgICAgIGRlY2xhcmF0aW9uLAogICAgICAgICAgICAgdmFsdWUsCiAgICAgICAgICAgICBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX1dSSVRFLAorICAgICAgICAgICAgdHJ1ZSwKICAgICAgICAgKQogICAgICAgICAudW53cmFwX2VycigpOwogICAgICAgICBhc3NlcnRfZXEhKApAQCAtNTgzLDYgKzY2MCw3IEBACiAgICAgICAgICAgICBkZWNsYXJhdGlvbiwKICAgICAgICAgICAgIHZhbHVlLAogICAgICAgICAgICAgUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9XUklURSwKKyAgICAgICAgICAgIHRydWUsCiAgICAgICAgICkKICAgICAgICAgLnVud3JhcF9lcnIoKTsKICAgICAgICAgYXNzZXJ0X2VxISgKQEAgLTU5MCw2ICs2NjgsMTIxIEBACiAgICAgICAgICAgICAiZmFpbGVkIHRvIHBhcnNlIG1lbW9yeTogZXhwZWN0ZWQgY29udGFpbmVyIGFyZ3VtZW50LmNvbnRhaW5lciwgZ290IGRlY2xhcmF0aW9uLmNvbnRhaW5lciIKICAgICAgICAgKTsKICAgICB9CisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfcGFyc2VfZmxhZ3Nfbm9fYWxsb3dfcmVhZF93cml0ZV9kZWZhdWx0X2Vycm9yKCkgeworICAgICAgICBsZXQgZmlyc3RfZmxhZyA9IHIjIgorICAgICAgICBwYWNrYWdlOiAiY29tLmZpcnN0IgorICAgICAgICBjb250YWluZXI6ICJjb20uZmlyc3QuY29udGFpbmVyIgorICAgICAgICBmbGFnIHsKKyAgICAgICAgICAgIG5hbWU6ICJmaXJzdCIKKyAgICAgICAgICAgIG5hbWVzcGFjZTogImZpcnN0X25zIgorICAgICAgICAgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlyc3QgZmxhZy4iCisgICAgICAgICAgICBidWc6ICIxMjMiCisgICAgICAgIH0KKyAgICAgICAgIiM7CisgICAgICAgIGxldCBkZWNsYXJhdGlvbiA9CisgICAgICAgICAgICB2ZWMhW0lucHV0IHsgc291cmNlOiAibWVtb3J5Ii50b19zdHJpbmcoKSwgcmVhZGVyOiBCb3g6Om5ldyhmaXJzdF9mbGFnLmFzX2J5dGVzKCkpIH1dOworCisgICAgICAgIGxldCBlcnJvciA9IGNyYXRlOjpjb21tYW5kczo6cGFyc2VfZmxhZ3MoCisgICAgICAgICAgICAiY29tLmZpcnN0IiwKKyAgICAgICAgICAgIFNvbWUoImNvbS5maXJzdC5jb250YWluZXIiKSwKKyAgICAgICAgICAgIGRlY2xhcmF0aW9uLAorICAgICAgICAgICAgdmVjIVtdLAorICAgICAgICAgICAgUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9XUklURSwKKyAgICAgICAgICAgIGZhbHNlLAorICAgICAgICApCisgICAgICAgIC51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICBmb3JtYXQhKCJ7Oj99IiwgZXJyb3IpLAorICAgICAgICAgICAgImZsYWcgZmlyc3QgaGFzIHBlcm1pc3Npb24gUkVBRF9XUklURSwgYnV0IGFsbG93X3JlYWRfd3JpdGUgaXMgZmFsc2UiCisgICAgICAgICk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfcGFyc2VfZmxhZ3Nfbm9fYWxsb3dfcmVhZF93cml0ZV92YWx1ZV9lcnJvcigpIHsKKyAgICAgICAgbGV0IGZpcnN0X2ZsYWcgPSByIyIKKyAgICAgICAgcGFja2FnZTogImNvbS5maXJzdCIKKyAgICAgICAgY29udGFpbmVyOiAiY29tLmZpcnN0LmNvbnRhaW5lciIKKyAgICAgICAgZmxhZyB7CisgICAgICAgICAgICBuYW1lOiAiZmlyc3QiCisgICAgICAgICAgICBuYW1lc3BhY2U6ICJmaXJzdF9ucyIKKyAgICAgICAgICAgIGRlc2NyaXB0aW9uOiAiVGhpcyBpcyB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIGZpcnN0IGZsYWcuIgorICAgICAgICAgICAgYnVnOiAiMTIzIgorICAgICAgICB9CisgICAgICAgICIjOworICAgICAgICBsZXQgZGVjbGFyYXRpb24gPQorICAgICAgICAgICAgdmVjIVtJbnB1dCB7IHNvdXJjZTogIm1lbW9yeSIudG9fc3RyaW5nKCksIHJlYWRlcjogQm94OjpuZXcoZmlyc3RfZmxhZy5hc19ieXRlcygpKSB9XTsKKworICAgICAgICBsZXQgZmlyc3RfZmxhZ192YWx1ZSA9IHIjIgorICAgICAgICBmbGFnX3ZhbHVlIHsKKyAgICAgICAgICAgIHBhY2thZ2U6ICJjb20uZmlyc3QiCisgICAgICAgICAgICBuYW1lOiAiZmlyc3QiCisgICAgICAgICAgICBzdGF0ZTogRElTQUJMRUQKKyAgICAgICAgICAgIHBlcm1pc3Npb246IFJFQURfV1JJVEUKKyAgICAgICAgfQorICAgICAgICAiIzsKKyAgICAgICAgbGV0IHZhbHVlID0gdmVjIVtJbnB1dCB7CisgICAgICAgICAgICBzb3VyY2U6ICJtZW1vcnkiLnRvX3N0cmluZygpLAorICAgICAgICAgICAgcmVhZGVyOiBCb3g6Om5ldyhmaXJzdF9mbGFnX3ZhbHVlLmFzX2J5dGVzKCkpLAorICAgICAgICB9XTsKKyAgICAgICAgbGV0IGVycm9yID0gY3JhdGU6OmNvbW1hbmRzOjpwYXJzZV9mbGFncygKKyAgICAgICAgICAgICJjb20uZmlyc3QiLAorICAgICAgICAgICAgU29tZSgiY29tLmZpcnN0LmNvbnRhaW5lciIpLAorICAgICAgICAgICAgZGVjbGFyYXRpb24sCisgICAgICAgICAgICB2YWx1ZSwKKyAgICAgICAgICAgIFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfT05MWSwKKyAgICAgICAgICAgIGZhbHNlLAorICAgICAgICApCisgICAgICAgIC51bndyYXBfZXJyKCk7CisgICAgICAgIGFzc2VydF9lcSEoCisgICAgICAgICAgICBmb3JtYXQhKCJ7Oj99IiwgZXJyb3IpLAorICAgICAgICAgICAgImZsYWcgZmlyc3QgaGFzIHBlcm1pc3Npb24gUkVBRF9XUklURSwgYnV0IGFsbG93X3JlYWRfd3JpdGUgaXMgZmFsc2UiCisgICAgICAgICk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfcGFyc2VfZmxhZ3Nfbm9fYWxsb3dfcmVhZF93cml0ZV9zdWNjZXNzKCkgeworICAgICAgICBsZXQgZmlyc3RfZmxhZyA9IHIjIgorICAgICAgICBwYWNrYWdlOiAiY29tLmZpcnN0IgorICAgICAgICBjb250YWluZXI6ICJjb20uZmlyc3QuY29udGFpbmVyIgorICAgICAgICBmbGFnIHsKKyAgICAgICAgICAgIG5hbWU6ICJmaXJzdCIKKyAgICAgICAgICAgIG5hbWVzcGFjZTogImZpcnN0X25zIgorICAgICAgICAgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgZmlyc3QgZmxhZy4iCisgICAgICAgICAgICBidWc6ICIxMjMiCisgICAgICAgIH0KKyAgICAgICAgIiM7CisgICAgICAgIGxldCBkZWNsYXJhdGlvbiA9CisgICAgICAgICAgICB2ZWMhW0lucHV0IHsgc291cmNlOiAibWVtb3J5Ii50b19zdHJpbmcoKSwgcmVhZGVyOiBCb3g6Om5ldyhmaXJzdF9mbGFnLmFzX2J5dGVzKCkpIH1dOworCisgICAgICAgIGxldCBmaXJzdF9mbGFnX3ZhbHVlID0gciMiCisgICAgICAgIGZsYWdfdmFsdWUgeworICAgICAgICAgICAgcGFja2FnZTogImNvbS5maXJzdCIKKyAgICAgICAgICAgIG5hbWU6ICJmaXJzdCIKKyAgICAgICAgICAgIHN0YXRlOiBESVNBQkxFRAorICAgICAgICAgICAgcGVybWlzc2lvbjogUkVBRF9PTkxZCisgICAgICAgIH0KKyAgICAgICAgIiM7CisgICAgICAgIGxldCB2YWx1ZSA9IHZlYyFbSW5wdXQgeworICAgICAgICAgICAgc291cmNlOiAibWVtb3J5Ii50b19zdHJpbmcoKSwKKyAgICAgICAgICAgIHJlYWRlcjogQm94OjpuZXcoZmlyc3RfZmxhZ192YWx1ZS5hc19ieXRlcygpKSwKKyAgICAgICAgfV07CisgICAgICAgIGxldCBmbGFnc19ieXRlcyA9IGNyYXRlOjpjb21tYW5kczo6cGFyc2VfZmxhZ3MoCisgICAgICAgICAgICAiY29tLmZpcnN0IiwKKyAgICAgICAgICAgIFNvbWUoImNvbS5maXJzdC5jb250YWluZXIiKSwKKyAgICAgICAgICAgIGRlY2xhcmF0aW9uLAorICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX09OTFksCisgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgKQorICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBwYXJzZWRfZmxhZ3MgPQorICAgICAgICAgICAgYWNvbmZpZ19wcm90b3M6OnBhcnNlZF9mbGFnczo6dHJ5X2Zyb21fYmluYXJ5X3Byb3RvKCZmbGFnc19ieXRlcykudW53cmFwKCk7CisgICAgICAgIGFzc2VydF9lcSEoMSwgcGFyc2VkX2ZsYWdzLnBhcnNlZF9mbGFnLmxlbigpKTsKKyAgICAgICAgbGV0IHBhcnNlZF9mbGFnID0gcGFyc2VkX2ZsYWdzLnBhcnNlZF9mbGFnLmZpcnN0KCkudW53cmFwKCk7CisgICAgICAgIGFzc2VydF9lcSEoUHJvdG9GbGFnU3RhdGU6OkRJU0FCTEVELCBwYXJzZWRfZmxhZy5zdGF0ZSgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX09OTFksIHBhcnNlZF9mbGFnLnBlcm1pc3Npb24oKSk7CisgICAgfQogCiAgICAgI1t0ZXN0XQogICAgIGZuIHRlc3RfcGFyc2VfZmxhZ3Nfb3ZlcnJpZGVfZml4ZWRfcmVhZF9vbmx5KCkgewpAQCAtNjI1LDYgKzgxOCw3IEBACiAgICAgICAgICAgICBkZWNsYXJhdGlvbiwKICAgICAgICAgICAgIHZhbHVlLAogICAgICAgICAgICAgUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9XUklURSwKKyAgICAgICAgICAgIHRydWUsCiAgICAgICAgICkKICAgICAgICAgLnVud3JhcF9lcnIoKTsKICAgICAgICAgYXNzZXJ0X2VxISgKQEAgLTY1OSw2ICs4NTMsNyBAQAogICAgICAgICAgICAgZGVjbGFyYXRpb24sCiAgICAgICAgICAgICB2YWx1ZSwKICAgICAgICAgICAgIFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfT05MWSwKKyAgICAgICAgICAgIHRydWUsCiAgICAgICAgICkKICAgICAgICAgLnVud3JhcCgpOwogICAgICAgICBsZXQgcGFyc2VkX2ZsYWdzID0KQEAgLTY5OSw2ICs4OTQsMzAgQEAKICAgICB9CiAKICAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9kdW1wX211bHRpcGxlX2ZpbHRlcnMoKSB7CisgICAgICAgIGxldCBpbnB1dCA9IHBhcnNlX3Rlc3RfZmxhZ3NfYXNfaW5wdXQoKTsKKyAgICAgICAgbGV0IGJ5dGVzID0gZHVtcF9wYXJzZWRfZmxhZ3MoCisgICAgICAgICAgICB2ZWMhW2lucHV0XSwKKyAgICAgICAgICAgIER1bXBGb3JtYXQ6OkN1c3RvbSgie2Z1bGx5X3F1YWxpZmllZF9uYW1lfSIudG9fc3RyaW5nKCkpLAorICAgICAgICAgICAgJlsiY29udGFpbmVyOnN5c3RlbStzdGF0ZTpFTkFCTEVEIiwgImNvbnRhaW5lcjpzeXN0ZW0rcGVybWlzc2lvbjpSRUFEX1dSSVRFIl0sCisgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgKQorICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCB0ZXh0ID0gc3RkOjpzdHI6OmZyb21fdXRmOCgmYnl0ZXMpLnVud3JhcCgpOworICAgICAgICBsZXQgZXhwZWN0ZWRfZmxhZ19saXN0ID0gJlsKKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZGlzYWJsZWRfcnciLAorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5kaXNhYmxlZF9yd19leHBvcnRlZCIsCisgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSIsCisgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfZml4ZWRfcm8iLAorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkIiwKKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnRlc3QuZW5hYmxlZF9ybyIsCisgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy50ZXN0LmVuYWJsZWRfcm9fZXhwb3J0ZWQiLAorICAgICAgICAgICAgImNvbS5hbmRyb2lkLmFjb25maWcudGVzdC5lbmFibGVkX3J3IiwKKyAgICAgICAgXTsKKyAgICAgICAgYXNzZXJ0X2VxIShleHBlY3RlZF9mbGFnX2xpc3QubWFwKHxzfCBmb3JtYXQhKCJ7fVxuIiwgcykpLmpvaW4oIiIpLCB0ZXh0KTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCiAgICAgZm4gdGVzdF9kdW1wX3RleHRwcm90b19mb3JtYXRfZGVkdXAoKSB7CiAgICAgICAgIGxldCBpbnB1dCA9IHBhcnNlX3Rlc3RfZmxhZ3NfYXNfaW5wdXQoKTsKICAgICAgICAgbGV0IGlucHV0MiA9IHBhcnNlX3Rlc3RfZmxhZ3NfYXNfaW5wdXQoKTsKQEAgLTc2MCwxNSArOTc5LDE0IEBACiAgICAgICAgIGxldCBwYWNrYWdlID0gZmluZF91bmlxdWVfcGFja2FnZSgmcGFyc2VkX2ZsYWdzLnBhcnNlZF9mbGFnKS51bndyYXAoKS50b19zdHJpbmcoKTsKICAgICAgICAgbGV0IGZsYWdfaWRzID0gYXNzaWduX2ZsYWdfaWRzKCZwYWNrYWdlLCBwYXJzZWRfZmxhZ3MucGFyc2VkX2ZsYWcuaXRlcigpKS51bndyYXAoKTsKICAgICAgICAgbGV0IGV4cGVjdGVkX2ZsYWdfaWRzID0gSGFzaE1hcDo6ZnJvbShbCi0gICAgICAgICAgICAoU3RyaW5nOjpmcm9tKCJkaXNhYmxlZF9ybyIpLCAwX3UxNiksCi0gICAgICAgICAgICAoU3RyaW5nOjpmcm9tKCJkaXNhYmxlZF9ydyIpLCAxX3UxNiksCi0gICAgICAgICAgICAoU3RyaW5nOjpmcm9tKCJkaXNhYmxlZF9yd19leHBvcnRlZCIpLCAyX3UxNiksCi0gICAgICAgICAgICAoU3RyaW5nOjpmcm9tKCJkaXNhYmxlZF9yd19pbl9vdGhlcl9uYW1lc3BhY2UiKSwgM191MTYpLAotICAgICAgICAgICAgKFN0cmluZzo6ZnJvbSgiZW5hYmxlZF9maXhlZF9ybyIpLCA0X3UxNiksCi0gICAgICAgICAgICAoU3RyaW5nOjpmcm9tKCJlbmFibGVkX2ZpeGVkX3JvX2V4cG9ydGVkIiksIDVfdTE2KSwKLSAgICAgICAgICAgIChTdHJpbmc6OmZyb20oImVuYWJsZWRfcm8iKSwgNl91MTYpLAotICAgICAgICAgICAgKFN0cmluZzo6ZnJvbSgiZW5hYmxlZF9yb19leHBvcnRlZCIpLCA3X3UxNiksCi0gICAgICAgICAgICAoU3RyaW5nOjpmcm9tKCJlbmFibGVkX3J3IiksIDhfdTE2KSwKKyAgICAgICAgICAgIChTdHJpbmc6OmZyb20oImRpc2FibGVkX3J3IiksIDBfdTE2KSwKKyAgICAgICAgICAgIChTdHJpbmc6OmZyb20oImRpc2FibGVkX3J3X2V4cG9ydGVkIiksIDFfdTE2KSwKKyAgICAgICAgICAgIChTdHJpbmc6OmZyb20oImRpc2FibGVkX3J3X2luX290aGVyX25hbWVzcGFjZSIpLCAyX3UxNiksCisgICAgICAgICAgICAoU3RyaW5nOjpmcm9tKCJlbmFibGVkX2ZpeGVkX3JvIiksIDNfdTE2KSwKKyAgICAgICAgICAgIChTdHJpbmc6OmZyb20oImVuYWJsZWRfZml4ZWRfcm9fZXhwb3J0ZWQiKSwgNF91MTYpLAorICAgICAgICAgICAgKFN0cmluZzo6ZnJvbSgiZW5hYmxlZF9ybyIpLCA1X3UxNiksCisgICAgICAgICAgICAoU3RyaW5nOjpmcm9tKCJlbmFibGVkX3JvX2V4cG9ydGVkIiksIDZfdTE2KSwKKyAgICAgICAgICAgIChTdHJpbmc6OmZyb20oImVuYWJsZWRfcnciKSwgN191MTYpLAogICAgICAgICBdKTsKICAgICAgICAgYXNzZXJ0X2VxIShmbGFnX2lkcywgZXhwZWN0ZWRfZmxhZ19pZHMpOwogICAgIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvbWFpbi5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvbWFpbi5ycwppbmRleCAxZmI2NGY5Li42YjI5NDIzIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL21haW4ucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9tYWluLnJzCkBAIC0xNiw2ICsxNiw4IEBACiAKIC8vISBgYWNvbmZpZ2AgaXMgYSBidWlsZCB0aW1lIHRvb2wgdG8gbWFuYWdlIGJ1aWxkIHRpbWUgY29uZmlndXJhdGlvbnMsIHN1Y2ggYXMgZmVhdHVyZSBmbGFncy4KIAordXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjpERUZBVUxUX0ZJTEVfVkVSU0lPTjsKK3VzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6TUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT047CiB1c2UgYW55aG93Ojp7YW55aG93LCBiYWlsLCBDb250ZXh0LCBSZXN1bHR9OwogdXNlIGNsYXA6OntidWlsZGVyOjpBcmdBY3Rpb24sIGJ1aWxkZXI6OkVudW1WYWx1ZVBhcnNlciwgQXJnLCBBcmdNYXRjaGVzLCBDb21tYW5kfTsKIHVzZSBjb3JlOjphbnk6OkFueTsKQEAgLTMxLDYgKzMzLDcgQEAKIAogdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjpTdG9yYWdlRmlsZVR5cGU7CiB1c2UgY29kZWdlbjo6Q29kZWdlbk1vZGU7Cit1c2UgY29udmVydF9maW5hbGl6ZWRfZmxhZ3M6OkZpbmFsaXplZEZsYWdNYXA7CiB1c2UgZHVtcDo6RHVtcEZvcm1hdDsKIAogI1tjZmcodGVzdCldCkBAIC0zOCw5ICs0MSw4NiBAQAogCiB1c2UgY29tbWFuZHM6OntJbnB1dCwgT3V0cHV0RmlsZX07CiAKK2NvbnN0IEhFTFBfRFVNUF9DQUNIRTogJnN0ciA9IHIjIgorQW4gYWNvbmZpZyBjYWNoZSBmaWxlLCBjcmVhdGVkIHZpYSBgYWNvbmZpZyBjcmVhdGUtY2FjaGVgLgorIiM7CisKK2NvbnN0IEhFTFBfRFVNUF9GT1JNQVQ6ICZzdHIgPSByIyIKK0NoYW5nZSB0aGUgb3V0cHV0IGZvcm1hdCBmb3IgZWFjaCBmbGFnLgorCitUaGUgYXJndW1lbnQgdG8gLS1mb3JtYXQgaXMgYSBmb3JtYXQgc3RyaW5nLiBFYWNoIGZsYWcgd2lsbCBiZSBhIGNvcHkgb2YgdGhpcyBzdHJpbmcsIHdpdGggY2VydGFpbgorcGxhY2Vob2xkZXJzIHJlcGxhY2VkIGJ5IGF0dHJpYnV0ZXMgb2YgdGhlIGZsYWcuIFRoZSBwbGFjZWhvbGRlcnMgYXJlCisKKyAge3BhY2thZ2V9CisgIHtuYW1lfQorICB7bmFtZXNwYWNlfQorICB7ZGVzY3JpcHRpb259CisgIHtidWd9CisgIHtzdGF0ZX0KKyAge3N0YXRlOmJvb2x9CisgIHtwZXJtaXNzaW9ufQorICB7dHJhY2V9CisgIHt0cmFjZTpwYXRoc30KKyAge2lzX2ZpeGVkX3JlYWRfb25seX0KKyAge2lzX2V4cG9ydGVkfQorICB7Y29udGFpbmVyfQorICB7bWV0YWRhdGF9CisgIHtmdWxseV9xdWFsaWZpZWRfbmFtZX0KKworTm90ZTogdGhlIGZvcm1hdCBzdHJpbmdzICJ0ZXh0cHJvdG8iIGFuZCAicHJvdG9idWYiIGFyZSBoYW5kbGVkIGluIGEgc3BlY2lhbCB3YXk6IHRoZXkgb3V0cHV0IGFsbAorZmxhZyBhdHRyaWJ1dGVzIGluIHRleHQgb3IgYmluYXJ5IHByb3RvYnVmIGZvcm1hdC4KKworRXhhbXBsZXM6CisKKyAgIyBTZWUgd2hpY2ggZmlsZXMgd2VyZSByZWFkIHRvIGRldGVybWluZSB0aGUgdmFsdWUgb2YgYSBmbGFnOyB0aGUgZmlsZXMgd2VyZSByZWFkIGluIHRoZSBvcmRlcgorICAjIGxpc3RlZC4KKyAgLS1mb3JtYXQ9J3tmdWxseV9xdWFsaWZpZWRfbmFtZX0ge3RyYWNlfScKKworICAjIFRyYWNlIHRoZSBmaWxlcyByZWFkIGZvciBhIHNwZWNpZmljIGZsYWcuIFVzZWZ1bCBkdXJpbmcgZGVidWdnaW5nLgorICAtLWZpbHRlcj1mdWxseV9xdWFsaWZpZWRfbmFtZTpjb20uZm9vLmZsYWdfbmFtZSAtLWZvcm1hdD0ne3RyYWNlfScKKworICAjIFByaW50IGEgc29tZXdoYXQgaHVtYW4gcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgZWFjaCBmbGFnLgorICAtLWZvcm1hdD0nVGhlIGZsYWcge25hbWV9IGluIHBhY2thZ2Uge3BhY2thZ2V9IGlzIHtzdGF0ZX0gYW5kIGhhcyBwZXJtaXNzaW9uIHtwZXJtaXNzaW9ufS4nCisiIzsKKwogY29uc3QgSEVMUF9EVU1QX0ZJTFRFUjogJnN0ciA9IHIjIgotTGltaXQgd2hpY2ggZmxhZ3MgdG8gb3V0cHV0LiBJZiBtdWx0aXBsZSAtLWZpbHRlciBhcmd1bWVudHMgYXJlIHByb3ZpZGVkLCB0aGUgb3V0cHV0IHdpbGwgYmUKLWxpbWl0ZWQgdG8gZmxhZ3MgdGhhdCBtYXRjaCBhbnkgb2YgdGhlIGZpbHRlcnMuCitMaW1pdCB3aGljaCBmbGFncyB0byBvdXRwdXQuIElmIC0tZmlsdGVyIGlzIG9taXR0ZWQsIGFsbCBmbGFncyB3aWxsIGJlIHByaW50ZWQuIElmIG11bHRpcGxlCistLWZpbHRlciBvcHRpb25zIGFyZSBwcm92aWRlZCwgdGhlIG91dHB1dCB3aWxsIGJlIGxpbWl0ZWQgdG8gZmxhZ3MgdGhhdCBtYXRjaCBhbnkgb2YgdGhlIGZpbHRlcnMuCisKK1RoZSBhcmd1bWVudCB0byAtLWZpbHRlciBpcyBhIHNlYXJjaCBxdWVyeS4gTXVsdGlwbGUgcXVlcmllcyBjYW4gYmUgQU5ELWVkIHRvZ2V0aGVyIGJ5Citjb25jYXRlbmF0aW5nIHRoZW0gd2l0aCBhIHBsdXMgc2lnbi4KKworVmFsaWQgcXVlcmllcyBhcmU6CisKKyAgcGFja2FnZTo8c3RyaW5nPgorICBuYW1lOjxzdHJpbmc+CisgIG5hbWVzcGFjZTo8c3RyaW5nPgorICBidWc6PHN0cmluZz4KKyAgc3RhdGU6RU5BQkxFRHxESVNBQkxFRAorICBwZXJtaXNzaW9uOlJFQURfT05MWXxSRUFEX1dSSVRFCisgIGlzX2ZpeGVkX3JlYWRfb25seTp0cnVlfGZhbHNlCisgIGlzX2V4cG9ydGVkOnRydWV8ZmFsc2UKKyAgY29udGFpbmVyOjxzdHJpbmc+CisgIGZ1bGx5X3F1YWxpZmllZF9uYW1lOjxzdHJpbmc+CisKK05vdGU6IHRoZXJlIGlzIGN1cnJlbnRseSBubyBzdXBwb3J0IGZvciBmaWx0ZXJpbmcgYmFzZWQgb24gdGhlc2UgZmxhZyBhdHRyaWJ1dGVzOiBkZXNjcmlwdGlvbiwKK3RyYWNlLCBtZXRhZGF0YS4KKworRXhhbXBsZXM6CisKKyAgIyBQcmludCBhIHNpbmdsZSBmbGFnOgorICAtLWZpbHRlcj1mdWxseV9xdWFsaWZpZWRfbmFtZTpjb20uZm9vLmZsYWdfbmFtZQorCisgICMgUHJpbnQgYWxsIGtub3duIGluZm9ybWF0aW9uIGFib3V0IGEgc2luZ2xlIGZsYWc6CisgIC0tZmlsdGVyPWZ1bGx5X3F1YWxpZmllZF9uYW1lOmNvbS5mb28uZmxhZ19uYW1lIC0tZm9ybWF0PXRleHRwcm90bworCisgICMgUHJpbnQgYWxsIGZsYWdzIGluIHRoZSBjb20uZm9vIHBhY2thZ2UsIGFuZCBhbGwgZW5hYmxlZCBmbGFncyBpbiB0aGUgY29tLmJhciBwYWNrYWdlOgorICAtLWZpbHRlcj1wYWNrYWdlOmNvbS5mb28gLS1maWx0ZXI9cGFja2FnZS5jb20uYmFyK3N0YXRlOkVOQUJMRUQKKyIjOworCitjb25zdCBIRUxQX0RVTVBfREVEVVA6ICZzdHIgPSByIyIKK0FsbG93IHRoZSBzYW1lIGZsYWcgdG8gYmUgcHJlc2VudCBpbiBtdWx0aXBsZSBjYWNoZSBmaWxlczsgaWYgZHVwbGljYXRlcyBhcmUgZm91bmQsIGNvbGxhcHNlIGludG8KK2Egc2luZ2xlIGluc3RhbmNlLgogIiM7CiAKIGZuIGNsaSgpIC0+IENvbW1hbmQgewpAQCAtNDksOCArMTI5LDcgQEAKICAgICAgICAgLnN1YmNvbW1hbmQoCiAgICAgICAgICAgICBDb21tYW5kOjpuZXcoImNyZWF0ZS1jYWNoZSIpCiAgICAgICAgICAgICAgICAgLmFyZyhBcmc6Om5ldygicGFja2FnZSIpLmxvbmcoInBhY2thZ2UiKS5yZXF1aXJlZCh0cnVlKSkKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGIvMzEyNzY5NzEwKTogTWFrZSB0aGlzIGFyZ3VtZW50IHJlcXVpcmVkLgotICAgICAgICAgICAgICAgIC5hcmcoQXJnOjpuZXcoImNvbnRhaW5lciIpLmxvbmcoImNvbnRhaW5lciIpKQorICAgICAgICAgICAgICAgIC5hcmcoQXJnOjpuZXcoImNvbnRhaW5lciIpLmxvbmcoImNvbnRhaW5lciIpLnJlcXVpcmVkKHRydWUpKQogICAgICAgICAgICAgICAgIC5hcmcoQXJnOjpuZXcoImRlY2xhcmF0aW9ucyIpLmxvbmcoImRlY2xhcmF0aW9ucyIpLmFjdGlvbihBcmdBY3Rpb246OkFwcGVuZCkpCiAgICAgICAgICAgICAgICAgLmFyZyhBcmc6Om5ldygidmFsdWVzIikubG9uZygidmFsdWVzIikuYWN0aW9uKEFyZ0FjdGlvbjo6QXBwZW5kKSkKICAgICAgICAgICAgICAgICAuYXJnKApAQCAtNjEsNiArMTQwLDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbW1hbmRzOjpERUZBVUxUX0ZMQUdfUEVSTUlTU0lPTiwKICAgICAgICAgICAgICAgICAgICAgICAgICkpLAogICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAuYXJnKAorICAgICAgICAgICAgICAgICAgICBBcmc6Om5ldygiYWxsb3ctcmVhZC13cml0ZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAubG9uZygiYWxsb3ctcmVhZC13cml0ZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVfcGFyc2VyKGNsYXA6OnZhbHVlX3BhcnNlciEoYm9vbCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdF92YWx1ZSgidHJ1ZSIpLAorICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAuYXJnKEFyZzo6bmV3KCJjYWNoZSIpLmxvbmcoImNhY2hlIikucmVxdWlyZWQodHJ1ZSkpLAogICAgICAgICApCiAgICAgICAgIC5zdWJjb21tYW5kKApAQCAtNzQsMTAgKzE1OSwzNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHRfdmFsdWUoInByb2R1Y3Rpb24iKSwKICAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgLmFyZygKKyAgICAgICAgICAgICAgICAgICAgQXJnOjpuZXcoInNpbmdsZS1leHBvcnRlZC1maWxlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5sb25nKCJzaW5nbGUtZXhwb3J0ZWQtZmlsZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVfcGFyc2VyKGNsYXA6OnZhbHVlX3BhcnNlciEoYm9vbCkpCisgICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdF92YWx1ZSgiZmFsc2UiKSwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgLy8gVE9ETzogYi8zOTU4OTk5MzggLSBjbGVhbiB1cCBmbGFncyBmb3Igc3dpdGNoaW5nIHRvIG5ldyBzdG9yYWdlCisgICAgICAgICAgICAgICAgLmFyZygKICAgICAgICAgICAgICAgICAgICAgQXJnOjpuZXcoImFsbG93LWluc3RydW1lbnRhdGlvbiIpCiAgICAgICAgICAgICAgICAgICAgICAgICAubG9uZygiYWxsb3ctaW5zdHJ1bWVudGF0aW9uIikKICAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZV9wYXJzZXIoY2xhcDo6dmFsdWVfcGFyc2VyIShib29sKSkKICAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0X3ZhbHVlKCJmYWxzZSIpLAorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBiLzM5NTg5OTkzOCAtIGNsZWFuIHVwIGZsYWdzIGZvciBzd2l0Y2hpbmcgdG8gbmV3IHN0b3JhZ2UKKyAgICAgICAgICAgICAgICAuYXJnKAorICAgICAgICAgICAgICAgICAgICBBcmc6Om5ldygibmV3LWV4cG9ydGVkIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5sb25nKCJuZXctZXhwb3J0ZWQiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlX3BhcnNlcihjbGFwOjp2YWx1ZV9wYXJzZXIhKGJvb2wpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHRfdmFsdWUoImZhbHNlIiksCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIC8vIEFsbG93cyBidWlsZCBmbGFnIHRvZ2dsaW5nIG9mIGNoZWNraW5nIEFQSSBsZXZlbCBpbiBleHBvcnRlZAorICAgICAgICAgICAgICAgIC8vIGZsYWcgbGliIGZvciBmaW5hbGl6ZWQgQVBJIGZsYWdzLgorICAgICAgICAgICAgICAgIC8vIFRPRE86IGIvMzc4OTM2MDYxIC0gUmVtb3ZlIG9uY2UgYnVpbGQgZmxhZyBmb3IgQVBJIGxldmVsCisgICAgICAgICAgICAgICAgLy8gY2hlY2sgaXMgZnVsbHkgZW5hYmxlZC4KKyAgICAgICAgICAgICAgICAuYXJnKAorICAgICAgICAgICAgICAgICAgICBBcmc6Om5ldygiY2hlY2stYXBpLWxldmVsIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5sb25nKCJjaGVjay1hcGktbGV2ZWwiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlX3BhcnNlcihjbGFwOjp2YWx1ZV9wYXJzZXIhKGJvb2wpKQorICAgICAgICAgICAgICAgICAgICAgICAgLmRlZmF1bHRfdmFsdWUoImZhbHNlIiksCiAgICAgICAgICAgICAgICAgKSwKICAgICAgICAgKQogICAgICAgICAuc3ViY29tbWFuZCgKQEAgLTEyNywyMiArMjM2LDM0IEBACiAgICAgICAgIC5zdWJjb21tYW5kKAogICAgICAgICAgICAgQ29tbWFuZDo6bmV3KCJkdW1wLWNhY2hlIikKICAgICAgICAgICAgICAgICAuYWxpYXMoImR1bXAiKQotICAgICAgICAgICAgICAgIC5hcmcoQXJnOjpuZXcoImNhY2hlIikubG9uZygiY2FjaGUiKS5hY3Rpb24oQXJnQWN0aW9uOjpBcHBlbmQpKQorICAgICAgICAgICAgICAgIC5hcmcoCisgICAgICAgICAgICAgICAgICAgIEFyZzo6bmV3KCJjYWNoZSIpCisgICAgICAgICAgICAgICAgICAgICAgICAubG9uZygiY2FjaGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFjdGlvbihBcmdBY3Rpb246OkFwcGVuZCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5sb25nX2hlbHAoSEVMUF9EVU1QX0NBQ0hFLnRyaW0oKSksCisgICAgICAgICAgICAgICAgKQogICAgICAgICAgICAgICAgIC5hcmcoCiAgICAgICAgICAgICAgICAgICAgIEFyZzo6bmV3KCJmb3JtYXQiKQogICAgICAgICAgICAgICAgICAgICAgICAgLmxvbmcoImZvcm1hdCIpCiAgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVfcGFyc2VyKHxzOiAmc3RyfCBEdW1wRm9ybWF0Ojp0cnlfZnJvbShzKSkKICAgICAgICAgICAgICAgICAgICAgICAgIC5kZWZhdWx0X3ZhbHVlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ7ZnVsbHlfcXVhbGlmaWVkX25hbWV9IFt7Y29udGFpbmVyfV06IHtwZXJtaXNzaW9ufSArIHtzdGF0ZX0iLAotICAgICAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5sb25nX2hlbHAoSEVMUF9EVU1QX0ZPUk1BVC50cmltKCkpLAogICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAuYXJnKAogICAgICAgICAgICAgICAgICAgICBBcmc6Om5ldygiZmlsdGVyIikKICAgICAgICAgICAgICAgICAgICAgICAgIC5sb25nKCJmaWx0ZXIiKQogICAgICAgICAgICAgICAgICAgICAgICAgLmFjdGlvbihBcmdBY3Rpb246OkFwcGVuZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5oZWxwKEhFTFBfRFVNUF9GSUxURVIudHJpbSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC5sb25nX2hlbHAoSEVMUF9EVU1QX0ZJTFRFUi50cmltKCkpLAogICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICAgICAuYXJnKEFyZzo6bmV3KCJkZWR1cCIpLmxvbmcoImRlZHVwIikubnVtX2FyZ3MoMCkuYWN0aW9uKEFyZ0FjdGlvbjo6U2V0VHJ1ZSkpCisgICAgICAgICAgICAgICAgLmFyZygKKyAgICAgICAgICAgICAgICAgICAgQXJnOjpuZXcoImRlZHVwIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5sb25nKCJkZWR1cCIpCisgICAgICAgICAgICAgICAgICAgICAgICAubnVtX2FyZ3MoMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC5hY3Rpb24oQXJnQWN0aW9uOjpTZXRUcnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgLmxvbmdfaGVscChIRUxQX0RVTVBfREVEVVAudHJpbSgpKSwKKyAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICAgICAgLmFyZyhBcmc6Om5ldygib3V0IikubG9uZygib3V0IikuZGVmYXVsdF92YWx1ZSgiLSIpKSwKICAgICAgICAgKQogICAgICAgICAuc3ViY29tbWFuZCgKQEAgLTE1OSw3ICsyODAsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZV9wYXJzZXIofHM6ICZzdHJ8IFN0b3JhZ2VGaWxlVHlwZTo6dHJ5X2Zyb20ocykpLAogICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAuYXJnKEFyZzo6bmV3KCJjYWNoZSIpLmxvbmcoImNhY2hlIikuYWN0aW9uKEFyZ0FjdGlvbjo6QXBwZW5kKS5yZXF1aXJlZCh0cnVlKSkKLSAgICAgICAgICAgICAgICAuYXJnKEFyZzo6bmV3KCJvdXQiKS5sb25nKCJvdXQiKS5yZXF1aXJlZCh0cnVlKSksCisgICAgICAgICAgICAgICAgLmFyZyhBcmc6Om5ldygib3V0IikubG9uZygib3V0IikucmVxdWlyZWQodHJ1ZSkpCisgICAgICAgICAgICAgICAgLmFyZygKKyAgICAgICAgICAgICAgICAgICAgQXJnOjpuZXcoInZlcnNpb24iKQorICAgICAgICAgICAgICAgICAgICAgICAgLmxvbmcoInZlcnNpb24iKQorICAgICAgICAgICAgICAgICAgICAgICAgLnJlcXVpcmVkKGZhbHNlKQorICAgICAgICAgICAgICAgICAgICAgICAgLnZhbHVlX3BhcnNlcih8czogJnN0cnwgcy5wYXJzZTo6PHUzMj4oKSksCisgICAgICAgICAgICAgICAgKSwKICAgICAgICAgKQogfQogCkBAIC0yMjIsNiArMzQ5LDEyIEBACiAgICAgT2soKCkpCiB9CiAKK2ZuIGxvYWRfZmluYWxpemVkX2ZsYWdzKCkgLT4gUmVzdWx0PEZpbmFsaXplZEZsYWdNYXA+IHsKKyAgICBsZXQganNvbl9zdHIgPSBpbmNsdWRlX3N0ciEoY29uY2F0IShlbnYhKCJPVVRfRElSIiksICIvZmluYWxpemVkX2ZsYWdzX3JlY29yZC5qc29uIikpOworICAgIGxldCBtYXAgPSBzZXJkZV9qc29uOjpmcm9tX3N0cihqc29uX3N0cik/OworICAgIE9rKG1hcCkKK30KKwogZm4gbWFpbigpIC0+IFJlc3VsdDwoKT4gewogICAgIGxldCBtYXRjaGVzID0gY2xpKCkuZ2V0X21hdGNoZXMoKTsKICAgICBtYXRjaCBtYXRjaGVzLnN1YmNvbW1hbmQoKSB7CkBAIC0yMzUsMTIgKzM2OCwxNSBAQAogICAgICAgICAgICAgICAgIHN1Yl9tYXRjaGVzLAogICAgICAgICAgICAgICAgICJkZWZhdWx0LXBlcm1pc3Npb24iLAogICAgICAgICAgICAgKT87CisgICAgICAgICAgICBsZXQgYWxsb3dfcmVhZF93cml0ZSA9IGdldF9vcHRpb25hbF9hcmc6Ojxib29sPihzdWJfbWF0Y2hlcywgImFsbG93LXJlYWQtd3JpdGUiKQorICAgICAgICAgICAgICAgIC5leHBlY3QoImZhaWxlZCB0byBwYXJzZSBhbGxvdy1yZWFkLXdyaXRlIik7CiAgICAgICAgICAgICBsZXQgb3V0cHV0ID0gY29tbWFuZHM6OnBhcnNlX2ZsYWdzKAogICAgICAgICAgICAgICAgIHBhY2thZ2UsCiAgICAgICAgICAgICAgICAgY29udGFpbmVyLAogICAgICAgICAgICAgICAgIGRlY2xhcmF0aW9ucywKICAgICAgICAgICAgICAgICB2YWx1ZXMsCiAgICAgICAgICAgICAgICAgKmRlZmF1bHRfcGVybWlzc2lvbiwKKyAgICAgICAgICAgICAgICAqYWxsb3dfcmVhZF93cml0ZSwKICAgICAgICAgICAgICkKICAgICAgICAgICAgIC5jb250ZXh0KCJmYWlsZWQgdG8gY3JlYXRlIGNhY2hlIik/OwogICAgICAgICAgICAgbGV0IHBhdGggPSBnZXRfcmVxdWlyZWRfYXJnOjo8U3RyaW5nPihzdWJfbWF0Y2hlcywgImNhY2hlIik/OwpAQCAtMjUxLDggKzM4NywyMyBAQAogICAgICAgICAgICAgbGV0IG1vZGUgPSBnZXRfcmVxdWlyZWRfYXJnOjo8Q29kZWdlbk1vZGU+KHN1Yl9tYXRjaGVzLCAibW9kZSIpPzsKICAgICAgICAgICAgIGxldCBhbGxvd19pbnN0cnVtZW50YXRpb24gPQogICAgICAgICAgICAgICAgIGdldF9yZXF1aXJlZF9hcmc6Ojxib29sPihzdWJfbWF0Y2hlcywgImFsbG93LWluc3RydW1lbnRhdGlvbiIpPzsKLSAgICAgICAgICAgIGxldCBnZW5lcmF0ZWRfZmlsZXMgPSBjb21tYW5kczo6Y3JlYXRlX2phdmFfbGliKGNhY2hlLCAqbW9kZSwgKmFsbG93X2luc3RydW1lbnRhdGlvbikKLSAgICAgICAgICAgICAgICAuY29udGV4dCgiZmFpbGVkIHRvIGNyZWF0ZSBqYXZhIGxpYiIpPzsKKyAgICAgICAgICAgIGxldCBuZXdfZXhwb3J0ZWQgPSBnZXRfcmVxdWlyZWRfYXJnOjo8Ym9vbD4oc3ViX21hdGNoZXMsICJuZXctZXhwb3J0ZWQiKT87CisgICAgICAgICAgICBsZXQgc2luZ2xlX2V4cG9ydGVkX2ZpbGUgPQorICAgICAgICAgICAgICAgIGdldF9yZXF1aXJlZF9hcmc6Ojxib29sPihzdWJfbWF0Y2hlcywgInNpbmdsZS1leHBvcnRlZC1maWxlIik/OworCisgICAgICAgICAgICBsZXQgY2hlY2tfYXBpX2xldmVsID0gZ2V0X3JlcXVpcmVkX2FyZzo6PGJvb2w+KHN1Yl9tYXRjaGVzLCAiY2hlY2stYXBpLWxldmVsIik/OworICAgICAgICAgICAgbGV0IGZpbmFsaXplZF9mbGFnczogRmluYWxpemVkRmxhZ01hcCA9CisgICAgICAgICAgICAgICAgaWYgKmNoZWNrX2FwaV9sZXZlbCB7IGxvYWRfZmluYWxpemVkX2ZsYWdzKCk/IH0gZWxzZSB7IEZpbmFsaXplZEZsYWdNYXA6Om5ldygpIH07CisKKyAgICAgICAgICAgIGxldCBnZW5lcmF0ZWRfZmlsZXMgPSBjb21tYW5kczo6Y3JlYXRlX2phdmFfbGliKAorICAgICAgICAgICAgICAgIGNhY2hlLAorICAgICAgICAgICAgICAgICptb2RlLAorICAgICAgICAgICAgICAgICphbGxvd19pbnN0cnVtZW50YXRpb24sCisgICAgICAgICAgICAgICAgKm5ld19leHBvcnRlZCwKKyAgICAgICAgICAgICAgICAqc2luZ2xlX2V4cG9ydGVkX2ZpbGUsCisgICAgICAgICAgICAgICAgZmluYWxpemVkX2ZsYWdzLAorICAgICAgICAgICAgKQorICAgICAgICAgICAgLmNvbnRleHQoImZhaWxlZCB0byBjcmVhdGUgamF2YSBsaWIiKT87CiAgICAgICAgICAgICBsZXQgZGlyID0gUGF0aEJ1Zjo6ZnJvbShnZXRfcmVxdWlyZWRfYXJnOjo8U3RyaW5nPihzdWJfbWF0Y2hlcywgIm91dCIpPyk7CiAgICAgICAgICAgICBnZW5lcmF0ZWRfZmlsZXMKICAgICAgICAgICAgICAgICAuaXRlcigpCkBAIC0yNjEsMTAgKzQxMiw4IEBACiAgICAgICAgIFNvbWUoKCJjcmVhdGUtY3BwLWxpYiIsIHN1Yl9tYXRjaGVzKSkgPT4gewogICAgICAgICAgICAgbGV0IGNhY2hlID0gb3Blbl9zaW5nbGVfZmlsZShzdWJfbWF0Y2hlcywgImNhY2hlIik/OwogICAgICAgICAgICAgbGV0IG1vZGUgPSBnZXRfcmVxdWlyZWRfYXJnOjo8Q29kZWdlbk1vZGU+KHN1Yl9tYXRjaGVzLCAibW9kZSIpPzsKLSAgICAgICAgICAgIGxldCBhbGxvd19pbnN0cnVtZW50YXRpb24gPQotICAgICAgICAgICAgICAgIGdldF9yZXF1aXJlZF9hcmc6Ojxib29sPihzdWJfbWF0Y2hlcywgImFsbG93LWluc3RydW1lbnRhdGlvbiIpPzsKLSAgICAgICAgICAgIGxldCBnZW5lcmF0ZWRfZmlsZXMgPSBjb21tYW5kczo6Y3JlYXRlX2NwcF9saWIoY2FjaGUsICptb2RlLCAqYWxsb3dfaW5zdHJ1bWVudGF0aW9uKQotICAgICAgICAgICAgICAgIC5jb250ZXh0KCJmYWlsZWQgdG8gY3JlYXRlIGNwcCBsaWIiKT87CisgICAgICAgICAgICBsZXQgZ2VuZXJhdGVkX2ZpbGVzID0KKyAgICAgICAgICAgICAgICBjb21tYW5kczo6Y3JlYXRlX2NwcF9saWIoY2FjaGUsICptb2RlKS5jb250ZXh0KCJmYWlsZWQgdG8gY3JlYXRlIGNwcCBsaWIiKT87CiAgICAgICAgICAgICBsZXQgZGlyID0gUGF0aEJ1Zjo6ZnJvbShnZXRfcmVxdWlyZWRfYXJnOjo8U3RyaW5nPihzdWJfbWF0Y2hlcywgIm91dCIpPyk7CiAgICAgICAgICAgICBnZW5lcmF0ZWRfZmlsZXMKICAgICAgICAgICAgICAgICAuaXRlcigpCkBAIC0yNzMsMTAgKzQyMiw4IEBACiAgICAgICAgIFNvbWUoKCJjcmVhdGUtcnVzdC1saWIiLCBzdWJfbWF0Y2hlcykpID0+IHsKICAgICAgICAgICAgIGxldCBjYWNoZSA9IG9wZW5fc2luZ2xlX2ZpbGUoc3ViX21hdGNoZXMsICJjYWNoZSIpPzsKICAgICAgICAgICAgIGxldCBtb2RlID0gZ2V0X3JlcXVpcmVkX2FyZzo6PENvZGVnZW5Nb2RlPihzdWJfbWF0Y2hlcywgIm1vZGUiKT87Ci0gICAgICAgICAgICBsZXQgYWxsb3dfaW5zdHJ1bWVudGF0aW9uID0KLSAgICAgICAgICAgICAgICBnZXRfcmVxdWlyZWRfYXJnOjo8Ym9vbD4oc3ViX21hdGNoZXMsICJhbGxvdy1pbnN0cnVtZW50YXRpb24iKT87Ci0gICAgICAgICAgICBsZXQgZ2VuZXJhdGVkX2ZpbGUgPSBjb21tYW5kczo6Y3JlYXRlX3J1c3RfbGliKGNhY2hlLCAqbW9kZSwgKmFsbG93X2luc3RydW1lbnRhdGlvbikKLSAgICAgICAgICAgICAgICAuY29udGV4dCgiZmFpbGVkIHRvIGNyZWF0ZSBydXN0IGxpYiIpPzsKKyAgICAgICAgICAgIGxldCBnZW5lcmF0ZWRfZmlsZSA9CisgICAgICAgICAgICAgICAgY29tbWFuZHM6OmNyZWF0ZV9ydXN0X2xpYihjYWNoZSwgKm1vZGUpLmNvbnRleHQoImZhaWxlZCB0byBjcmVhdGUgcnVzdCBsaWIiKT87CiAgICAgICAgICAgICBsZXQgZGlyID0gUGF0aEJ1Zjo6ZnJvbShnZXRfcmVxdWlyZWRfYXJnOjo8U3RyaW5nPihzdWJfbWF0Y2hlcywgIm91dCIpPyk7CiAgICAgICAgICAgICB3cml0ZV9vdXRwdXRfZmlsZV9yZWFsdGl2ZV90b19kaXIoJmRpciwgJmdlbmVyYXRlZF9maWxlKT87CiAgICAgICAgIH0KQEAgLTMwOSwxMiArNDU2LDE4IEBACiAgICAgICAgICAgICB3cml0ZV9vdXRwdXRfdG9fZmlsZV9vcl9zdGRvdXQocGF0aCwgJm91dHB1dCk/OwogICAgICAgICB9CiAgICAgICAgIFNvbWUoKCJjcmVhdGUtc3RvcmFnZSIsIHN1Yl9tYXRjaGVzKSkgPT4geworICAgICAgICAgICAgbGV0IHZlcnNpb24gPQorICAgICAgICAgICAgICAgIGdldF9vcHRpb25hbF9hcmc6Ojx1MzI+KHN1Yl9tYXRjaGVzLCAidmVyc2lvbiIpLnVud3JhcF9vcigmREVGQVVMVF9GSUxFX1ZFUlNJT04pOworICAgICAgICAgICAgaWYgKnZlcnNpb24gPiBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiB7CisgICAgICAgICAgICAgICAgYmFpbCEoIkludmFsaWQgdmVyc2lvbiBzZWxlY3RlZCAoe30pIiwgdmVyc2lvbik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBsZXQgZmlsZSA9IGdldF9yZXF1aXJlZF9hcmc6OjxTdG9yYWdlRmlsZVR5cGU+KHN1Yl9tYXRjaGVzLCAiZmlsZSIpCiAgICAgICAgICAgICAgICAgLmNvbnRleHQoIkludmFsaWQgc3RvcmFnZSBmaWxlIHNlbGVjdGlvbiIpPzsKICAgICAgICAgICAgIGxldCBjYWNoZSA9IG9wZW5femVyb19vcl9tb3JlX2ZpbGVzKHN1Yl9tYXRjaGVzLCAiY2FjaGUiKT87CiAgICAgICAgICAgICBsZXQgY29udGFpbmVyID0gZ2V0X3JlcXVpcmVkX2FyZzo6PFN0cmluZz4oc3ViX21hdGNoZXMsICJjb250YWluZXIiKT87CiAgICAgICAgICAgICBsZXQgcGF0aCA9IGdldF9yZXF1aXJlZF9hcmc6OjxTdHJpbmc+KHN1Yl9tYXRjaGVzLCAib3V0Iik/OwotICAgICAgICAgICAgbGV0IG91dHB1dCA9IGNvbW1hbmRzOjpjcmVhdGVfc3RvcmFnZShjYWNoZSwgY29udGFpbmVyLCBmaWxlKQorCisgICAgICAgICAgICBsZXQgb3V0cHV0ID0gY29tbWFuZHM6OmNyZWF0ZV9zdG9yYWdlKGNhY2hlLCBjb250YWluZXIsIGZpbGUsICp2ZXJzaW9uKQogICAgICAgICAgICAgICAgIC5jb250ZXh0KCJmYWlsZWQgdG8gY3JlYXRlIHN0b3JhZ2UgZmlsZXMiKT87CiAgICAgICAgICAgICB3cml0ZV9vdXRwdXRfdG9fZmlsZV9vcl9zdGRvdXQocGF0aCwgJm91dHB1dCk/OwogICAgICAgICB9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL3N0b3JhZ2UvZmxhZ19pbmZvLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9zdG9yYWdlL2ZsYWdfaW5mby5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTQzZGFhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9zdG9yYWdlL2ZsYWdfaW5mby5ycwpAQCAtMCwwICsxLDk5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNlIGNyYXRlOjpjb21tYW5kczo6YXNzaWduX2ZsYWdfaWRzOwordXNlIGNyYXRlOjpzdG9yYWdlOjpGbGFnUGFja2FnZTsKK3VzZSBhY29uZmlnX3Byb3Rvczo6e1Byb3RvRmxhZ1Blcm1pc3Npb24sIFByb3RvRmxhZ1N0YXRlfTsKK3VzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6e0ZsYWdJbmZvSGVhZGVyLCBGbGFnSW5mb0xpc3QsIEZsYWdJbmZvTm9kZSwgU3RvcmFnZUZpbGVUeXBlfTsKK3VzZSBhbnlob3c6Onthbnlob3csIFJlc3VsdH07CisKK2ZuIG5ld19oZWFkZXIoY29udGFpbmVyOiAmc3RyLCBudW1fZmxhZ3M6IHUzMiwgdmVyc2lvbjogdTMyKSAtPiBGbGFnSW5mb0hlYWRlciB7CisgICAgRmxhZ0luZm9IZWFkZXIgeworICAgICAgICB2ZXJzaW9uLAorICAgICAgICBjb250YWluZXI6IFN0cmluZzo6ZnJvbShjb250YWluZXIpLAorICAgICAgICBmaWxlX3R5cGU6IFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ0luZm8gYXMgdTgsCisgICAgICAgIGZpbGVfc2l6ZTogMCwKKyAgICAgICAgbnVtX2ZsYWdzLAorICAgICAgICBib29sZWFuX2ZsYWdfb2Zmc2V0OiAwLAorICAgIH0KK30KKworcHViIGZuIGNyZWF0ZV9mbGFnX2luZm8oCisgICAgY29udGFpbmVyOiAmc3RyLAorICAgIHBhY2thZ2VzOiAmW0ZsYWdQYWNrYWdlXSwKKyAgICB2ZXJzaW9uOiB1MzIsCispIC0+IFJlc3VsdDxGbGFnSW5mb0xpc3Q+IHsKKyAgICAvLyBFeGNsdWRlIHN5c3RlbS92ZW5kb3IvcHJvZHVjdCBmbGFncyB0aGF0IGFyZSBSTytkaXNhYmxlZC4KKyAgICBsZXQgbXV0IGZpbHRlcmVkX3BhY2thZ2VzID0gcGFja2FnZXMudG9fdmVjKCk7CisgICAgaWYgY29udGFpbmVyID09ICJzeXN0ZW0iIHx8IGNvbnRhaW5lciA9PSAidmVuZG9yIiB8fCBjb250YWluZXIgPT0gInByb2R1Y3QiIHsKKyAgICAgICAgZm9yIHBhY2thZ2UgaW4gZmlsdGVyZWRfcGFja2FnZXMuaXRlcl9tdXQoKSB7CisgICAgICAgICAgICBwYWNrYWdlLmJvb2xlYW5fZmxhZ3MucmV0YWluKHxifCB7CisgICAgICAgICAgICAgICAgIShiLnN0YXRlID09IFNvbWUoUHJvdG9GbGFnU3RhdGU6OkRJU0FCTEVELmludG8oKSkKKyAgICAgICAgICAgICAgICAgICAgJiYgYi5wZXJtaXNzaW9uID09IFNvbWUoUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9PTkxZLmludG8oKSkpCisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGxldCBudW1fZmxhZ3MgPSBmaWx0ZXJlZF9wYWNrYWdlcy5pdGVyKCkubWFwKHxwa2d8IHBrZy5ib29sZWFuX2ZsYWdzLmxlbigpIGFzIHUzMikuc3VtKCk7CisKKyAgICBsZXQgbXV0IGlzX2ZsYWdfcncgPSB2ZWMhW2ZhbHNlOyBudW1fZmxhZ3MgYXMgdXNpemVdOworICAgIGZvciBwa2cgaW4gZmlsdGVyZWRfcGFja2FnZXMgeworICAgICAgICBsZXQgc3RhcnRfaW5kZXggPSBwa2cuYm9vbGVhbl9zdGFydF9pbmRleCBhcyB1c2l6ZTsKKyAgICAgICAgbGV0IGZsYWdfaWRzID0gYXNzaWduX2ZsYWdfaWRzKHBrZy5wYWNrYWdlX25hbWUsIHBrZy5ib29sZWFuX2ZsYWdzLml0ZXIoKS5jb3BpZWQoKSk/OworICAgICAgICBmb3IgcGYgaW4gcGtnLmJvb2xlYW5fZmxhZ3MgeworICAgICAgICAgICAgbGV0IGZpZCA9IGZsYWdfaWRzCisgICAgICAgICAgICAgICAgLmdldChwZi5uYW1lKCkpCisgICAgICAgICAgICAgICAgLm9rX29yKGFueWhvdyEoZm9ybWF0ISgibWlzc2luZyBmbGFnIGlkIGZvciB7fSIsIHBmLm5hbWUoKSkpKT87CisgICAgICAgICAgICBpc19mbGFnX3J3W3N0YXJ0X2luZGV4ICsgKCpmaWQgYXMgdXNpemUpXSA9CisgICAgICAgICAgICAgICAgcGYucGVybWlzc2lvbigpID09IFByb3RvRmxhZ1Blcm1pc3Npb246OlJFQURfV1JJVEU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBsZXQgbXV0IGxpc3QgPSBGbGFnSW5mb0xpc3QgeworICAgICAgICBoZWFkZXI6IG5ld19oZWFkZXIoY29udGFpbmVyLCBudW1fZmxhZ3MsIHZlcnNpb24pLAorICAgICAgICBub2RlczogaXNfZmxhZ19ydy5pdGVyKCkubWFwKHwmcnd8IEZsYWdJbmZvTm9kZTo6Y3JlYXRlKHJ3KSkuY29sbGVjdCgpLAorICAgIH07CisKKyAgICAvLyBpbml0aWFsaXplIGFsbCBoZWFkZXIgZmllbGRzCisgICAgbGlzdC5oZWFkZXIuYm9vbGVhbl9mbGFnX29mZnNldCA9IGxpc3QuaGVhZGVyLmludG9fYnl0ZXMoKS5sZW4oKSBhcyB1MzI7CisgICAgbGV0IGJ5dGVzX3Blcl9ub2RlID0gRmxhZ0luZm9Ob2RlOjpjcmVhdGUoZmFsc2UpLmludG9fYnl0ZXMoKS5sZW4oKSBhcyB1MzI7CisgICAgbGlzdC5oZWFkZXIuZmlsZV9zaXplID0gbGlzdC5oZWFkZXIuYm9vbGVhbl9mbGFnX29mZnNldCArIG51bV9mbGFncyAqIGJ5dGVzX3Blcl9ub2RlOworCisgICAgT2sobGlzdCkKK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdXBlcjo6KjsKKyAgICB1c2UgY3JhdGU6OnN0b3JhZ2U6Ontncm91cF9mbGFnc19ieV9wYWNrYWdlLCB0ZXN0czo6cGFyc2VfYWxsX3Rlc3RfZmxhZ3N9OworICAgIHVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6REVGQVVMVF9GSUxFX1ZFUlNJT047CisKKyAgICBwdWIgZm4gY3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3RfZnJvbV9zb3VyY2UoKSAtPiBSZXN1bHQ8RmxhZ0luZm9MaXN0PiB7CisgICAgICAgIGxldCBjYWNoZXMgPSBwYXJzZV9hbGxfdGVzdF9mbGFncygpOworICAgICAgICBsZXQgcGFja2FnZXMgPSBncm91cF9mbGFnc19ieV9wYWNrYWdlKGNhY2hlcy5pdGVyKCksIERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKyAgICAgICAgY3JlYXRlX2ZsYWdfaW5mbygibW9ja3VwIiwgJnBhY2thZ2VzLCBERUZBVUxUX0ZJTEVfVkVSU0lPTikKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGhlIGZsYWcgaW5mbyBjcmVhdGlvbiBhbmQgZWFjaCBmaWVsZAorICAgIGZuIHRlc3RfbGlzdF9jb250ZW50cygpIHsKKyAgICAgICAgbGV0IGZsYWdfaW5mb19saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3RfZnJvbV9zb3VyY2UoKTsKKyAgICAgICAgYXNzZXJ0IShmbGFnX2luZm9fbGlzdC5pc19vaygpKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX2ZsYWdfaW5mb19saXN0ID0KKyAgICAgICAgICAgIGFjb25maWdfc3RvcmFnZV9maWxlOjp0ZXN0X3V0aWxzOjpjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdChERUZBVUxUX0ZJTEVfVkVSU0lPTik7CisgICAgICAgIGFzc2VydF9lcSEoZmxhZ19pbmZvX2xpc3QudW53cmFwKCksIGV4cGVjdGVkX2ZsYWdfaW5mb19saXN0KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL3N0b3JhZ2UvZmxhZ190YWJsZS5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvc3RvcmFnZS9mbGFnX3RhYmxlLnJzCmluZGV4IGE5NzEyMTEuLmEzYjRlOGYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvc3RvcmFnZS9mbGFnX3RhYmxlLnJzCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvc3RvcmFnZS9mbGFnX3RhYmxlLnJzCkBAIC0xNCwxOCArMTQsMTcgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXVzZSBjcmF0ZTo6Y29tbWFuZHM6OmFzc2lnbl9mbGFnX2lkczsKK3VzZSBjcmF0ZTo6Y29tbWFuZHM6Onthc3NpZ25fZmxhZ19pZHMsIHNob3VsZF9pbmNsdWRlX2ZsYWd9OwogdXNlIGNyYXRlOjpzdG9yYWdlOjpGbGFnUGFja2FnZTsKIHVzZSBhY29uZmlnX3Byb3Rvczo6UHJvdG9GbGFnUGVybWlzc2lvbjsKIHVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6ewogICAgIGdldF90YWJsZV9zaXplLCBGbGFnVGFibGUsIEZsYWdUYWJsZUhlYWRlciwgRmxhZ1RhYmxlTm9kZSwgU3RvcmFnZUZpbGVUeXBlLCBTdG9yZWRGbGFnVHlwZSwKLSAgICBGSUxFX1ZFUlNJT04sCiB9OwogdXNlIGFueWhvdzo6e2FueWhvdywgUmVzdWx0fTsKIAotZm4gbmV3X2hlYWRlcihjb250YWluZXI6ICZzdHIsIG51bV9mbGFnczogdTMyKSAtPiBGbGFnVGFibGVIZWFkZXIgeworZm4gbmV3X2hlYWRlcihjb250YWluZXI6ICZzdHIsIG51bV9mbGFnczogdTMyLCB2ZXJzaW9uOiB1MzIpIC0+IEZsYWdUYWJsZUhlYWRlciB7CiAgICAgRmxhZ1RhYmxlSGVhZGVyIHsKLSAgICAgICAgdmVyc2lvbjogRklMRV9WRVJTSU9OLAorICAgICAgICB2ZXJzaW9uLAogICAgICAgICBjb250YWluZXI6IFN0cmluZzo6ZnJvbShjb250YWluZXIpLAogICAgICAgICBmaWxlX3R5cGU6IFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ01hcCBhcyB1OCwKICAgICAgICAgZmlsZV9zaXplOiAwLApAQCAtNjMsOSArNjIsMTMgQEAKICAgICB9CiAKICAgICBmbiBjcmVhdGVfbm9kZXMocGFja2FnZTogJkZsYWdQYWNrYWdlLCBudW1fYnVja2V0czogdTMyKSAtPiBSZXN1bHQ8VmVjPFNlbGY+PiB7CisgICAgICAgIC8vIEV4Y2x1ZGUgc3lzdGVtL3ZlbmRvci9wcm9kdWN0IGZsYWdzIHRoYXQgYXJlIFJPK2Rpc2FibGVkLgorICAgICAgICBsZXQgbXV0IGZpbHRlcmVkX3BhY2thZ2UgPSBwYWNrYWdlLmNsb25lKCk7CisgICAgICAgIGZpbHRlcmVkX3BhY2thZ2UuYm9vbGVhbl9mbGFncy5yZXRhaW4ofHBmfCBzaG91bGRfaW5jbHVkZV9mbGFnKHBmKSk7CisKICAgICAgICAgbGV0IGZsYWdfaWRzID0KLSAgICAgICAgICAgIGFzc2lnbl9mbGFnX2lkcyhwYWNrYWdlLnBhY2thZ2VfbmFtZSwgcGFja2FnZS5ib29sZWFuX2ZsYWdzLml0ZXIoKS5jb3BpZWQoKSk/OwotICAgICAgICBwYWNrYWdlCisgICAgICAgICAgICBhc3NpZ25fZmxhZ19pZHMocGFja2FnZS5wYWNrYWdlX25hbWUsIGZpbHRlcmVkX3BhY2thZ2UuYm9vbGVhbl9mbGFncy5pdGVyKCkuY29waWVkKCkpPzsKKyAgICAgICAgZmlsdGVyZWRfcGFja2FnZQogICAgICAgICAgICAgLmJvb2xlYW5fZmxhZ3MKICAgICAgICAgICAgIC5pdGVyKCkKICAgICAgICAgICAgIC5tYXAofCZwZnwgewpAQCAtODYsMTIgKzg5LDE2IEBACiAgICAgfQogfQogCi1wdWIgZm4gY3JlYXRlX2ZsYWdfdGFibGUoY29udGFpbmVyOiAmc3RyLCBwYWNrYWdlczogJltGbGFnUGFja2FnZV0pIC0+IFJlc3VsdDxGbGFnVGFibGU+IHsKK3B1YiBmbiBjcmVhdGVfZmxhZ190YWJsZSgKKyAgICBjb250YWluZXI6ICZzdHIsCisgICAgcGFja2FnZXM6ICZbRmxhZ1BhY2thZ2VdLAorICAgIHZlcnNpb246IHUzMiwKKykgLT4gUmVzdWx0PEZsYWdUYWJsZT4gewogICAgIC8vIGNyZWF0ZSB0YWJsZQogICAgIGxldCBudW1fZmxhZ3MgPSBwYWNrYWdlcy5pdGVyKCkubWFwKHxwa2d8IHBrZy5ib29sZWFuX2ZsYWdzLmxlbigpIGFzIHUzMikuc3VtKCk7CiAgICAgbGV0IG51bV9idWNrZXRzID0gZ2V0X3RhYmxlX3NpemUobnVtX2ZsYWdzKT87CiAKLSAgICBsZXQgbXV0IGhlYWRlciA9IG5ld19oZWFkZXIoY29udGFpbmVyLCBudW1fZmxhZ3MpOworICAgIGxldCBtdXQgaGVhZGVyID0gbmV3X2hlYWRlcihjb250YWluZXIsIG51bV9mbGFncywgdmVyc2lvbik7CiAgICAgbGV0IG11dCBidWNrZXRzID0gdmVjIVtOb25lOyBudW1fYnVja2V0cyBhcyB1c2l6ZV07CiAgICAgbGV0IG11dCBub2RlX3dyYXBwZXJzID0gcGFja2FnZXMKICAgICAgICAgLml0ZXIoKQpAQCAtMTM4LDEzICsxNDUsMTUgQEAKIAogI1tjZmcodGVzdCldCiBtb2QgdGVzdHMgeworICAgIHVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6REVGQVVMVF9GSUxFX1ZFUlNJT047CisKICAgICB1c2Ugc3VwZXI6Oio7CiAgICAgdXNlIGNyYXRlOjpzdG9yYWdlOjp7Z3JvdXBfZmxhZ3NfYnlfcGFja2FnZSwgdGVzdHM6OnBhcnNlX2FsbF90ZXN0X2ZsYWdzfTsKIAogICAgIGZuIGNyZWF0ZV90ZXN0X2ZsYWdfdGFibGVfZnJvbV9zb3VyY2UoKSAtPiBSZXN1bHQ8RmxhZ1RhYmxlPiB7CiAgICAgICAgIGxldCBjYWNoZXMgPSBwYXJzZV9hbGxfdGVzdF9mbGFncygpOwotICAgICAgICBsZXQgcGFja2FnZXMgPSBncm91cF9mbGFnc19ieV9wYWNrYWdlKGNhY2hlcy5pdGVyKCkpOwotICAgICAgICBjcmVhdGVfZmxhZ190YWJsZSgibW9ja3VwIiwgJnBhY2thZ2VzKQorICAgICAgICBsZXQgcGFja2FnZXMgPSBncm91cF9mbGFnc19ieV9wYWNrYWdlKGNhY2hlcy5pdGVyKCksIERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKyAgICAgICAgY3JlYXRlX2ZsYWdfdGFibGUoIm1vY2t1cCIsICZwYWNrYWdlcywgREVGQVVMVF9GSUxFX1ZFUlNJT04pCiAgICAgfQogCiAgICAgI1t0ZXN0XQpAQCAtMTUyLDcgKzE2MSw4IEBACiAgICAgZm4gdGVzdF90YWJsZV9jb250ZW50cygpIHsKICAgICAgICAgbGV0IGZsYWdfdGFibGUgPSBjcmVhdGVfdGVzdF9mbGFnX3RhYmxlX2Zyb21fc291cmNlKCk7CiAgICAgICAgIGFzc2VydCEoZmxhZ190YWJsZS5pc19vaygpKTsKLSAgICAgICAgbGV0IGV4cGVjdGVkX2ZsYWdfdGFibGUgPSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6dGVzdF91dGlsczo6Y3JlYXRlX3Rlc3RfZmxhZ190YWJsZSgpOworICAgICAgICBsZXQgZXhwZWN0ZWRfZmxhZ190YWJsZSA9CisgICAgICAgICAgICBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6dGVzdF91dGlsczo6Y3JlYXRlX3Rlc3RfZmxhZ190YWJsZShERUZBVUxUX0ZJTEVfVkVSU0lPTik7CiAgICAgICAgIGFzc2VydF9lcSEoZmxhZ190YWJsZS51bndyYXAoKSwgZXhwZWN0ZWRfZmxhZ190YWJsZSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9zdG9yYWdlL2ZsYWdfdmFsdWUucnMgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL3N0b3JhZ2UvZmxhZ192YWx1ZS5ycwppbmRleCBjMTViYTU0Li4zY2ZhNDQ3IDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL3N0b3JhZ2UvZmxhZ192YWx1ZS5ycworKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL3N0b3JhZ2UvZmxhZ192YWx1ZS5ycwpAQCAtMTYsMTMgKzE2LDEzIEBACiAKIHVzZSBjcmF0ZTo6Y29tbWFuZHM6OmFzc2lnbl9mbGFnX2lkczsKIHVzZSBjcmF0ZTo6c3RvcmFnZTo6RmxhZ1BhY2thZ2U7Ci11c2UgYWNvbmZpZ19wcm90b3M6OlByb3RvRmxhZ1N0YXRlOwotdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp7RmxhZ1ZhbHVlSGVhZGVyLCBGbGFnVmFsdWVMaXN0LCBTdG9yYWdlRmlsZVR5cGUsIEZJTEVfVkVSU0lPTn07Cit1c2UgYWNvbmZpZ19wcm90b3M6OntQcm90b0ZsYWdQZXJtaXNzaW9uLCBQcm90b0ZsYWdTdGF0ZX07Cit1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OntGbGFnVmFsdWVIZWFkZXIsIEZsYWdWYWx1ZUxpc3QsIFN0b3JhZ2VGaWxlVHlwZX07CiB1c2UgYW55aG93Ojp7YW55aG93LCBSZXN1bHR9OwogCi1mbiBuZXdfaGVhZGVyKGNvbnRhaW5lcjogJnN0ciwgbnVtX2ZsYWdzOiB1MzIpIC0+IEZsYWdWYWx1ZUhlYWRlciB7CitmbiBuZXdfaGVhZGVyKGNvbnRhaW5lcjogJnN0ciwgbnVtX2ZsYWdzOiB1MzIsIHZlcnNpb246IHUzMikgLT4gRmxhZ1ZhbHVlSGVhZGVyIHsKICAgICBGbGFnVmFsdWVIZWFkZXIgewotICAgICAgICB2ZXJzaW9uOiBGSUxFX1ZFUlNJT04sCisgICAgICAgIHZlcnNpb24sCiAgICAgICAgIGNvbnRhaW5lcjogU3RyaW5nOjpmcm9tKGNvbnRhaW5lciksCiAgICAgICAgIGZpbGVfdHlwZTogU3RvcmFnZUZpbGVUeXBlOjpGbGFnVmFsIGFzIHU4LAogICAgICAgICBmaWxlX3NpemU6IDAsCkBAIC0zMSwxNiArMzEsMjcgQEAKICAgICB9CiB9CiAKLXB1YiBmbiBjcmVhdGVfZmxhZ192YWx1ZShjb250YWluZXI6ICZzdHIsIHBhY2thZ2VzOiAmW0ZsYWdQYWNrYWdlXSkgLT4gUmVzdWx0PEZsYWdWYWx1ZUxpc3Q+IHsKLSAgICAvLyBjcmVhdGUgbGlzdAotICAgIGxldCBudW1fZmxhZ3MgPSBwYWNrYWdlcy5pdGVyKCkubWFwKHxwa2d8IHBrZy5ib29sZWFuX2ZsYWdzLmxlbigpIGFzIHUzMikuc3VtKCk7Ci0KK3B1YiBmbiBjcmVhdGVfZmxhZ192YWx1ZSgKKyAgICBjb250YWluZXI6ICZzdHIsCisgICAgcGFja2FnZXM6ICZbRmxhZ1BhY2thZ2VdLAorICAgIHZlcnNpb246IHUzMiwKKykgLT4gUmVzdWx0PEZsYWdWYWx1ZUxpc3Q+IHsKKyAgICAvLyBFeGNsdWRlIHN5c3RlbS92ZW5kb3IvcHJvZHVjdCBmbGFncyB0aGF0IGFyZSBSTytkaXNhYmxlZC4KKyAgICBsZXQgbXV0IGZpbHRlcmVkX3BhY2thZ2VzID0gcGFja2FnZXMudG9fdmVjKCk7CisgICAgaWYgY29udGFpbmVyID09ICJzeXN0ZW0iIHx8IGNvbnRhaW5lciA9PSAidmVuZG9yIiB8fCBjb250YWluZXIgPT0gInByb2R1Y3QiIHsKKyAgICAgICAgZm9yIHBhY2thZ2UgaW4gZmlsdGVyZWRfcGFja2FnZXMuaXRlcl9tdXQoKSB7CisgICAgICAgICAgICBwYWNrYWdlLmJvb2xlYW5fZmxhZ3MucmV0YWluKHxifCB7CisgICAgICAgICAgICAgICAgIShiLnN0YXRlID09IFNvbWUoUHJvdG9GbGFnU3RhdGU6OkRJU0FCTEVELmludG8oKSkKKyAgICAgICAgICAgICAgICAgICAgJiYgYi5wZXJtaXNzaW9uID09IFNvbWUoUHJvdG9GbGFnUGVybWlzc2lvbjo6UkVBRF9PTkxZLmludG8oKSkpCisgICAgICAgICAgICB9KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBsZXQgbnVtX2ZsYWdzID0gZmlsdGVyZWRfcGFja2FnZXMuaXRlcigpLm1hcCh8cGtnfCBwa2cuYm9vbGVhbl9mbGFncy5sZW4oKSBhcyB1MzIpLnN1bSgpOwogICAgIGxldCBtdXQgbGlzdCA9IEZsYWdWYWx1ZUxpc3QgewotICAgICAgICBoZWFkZXI6IG5ld19oZWFkZXIoY29udGFpbmVyLCBudW1fZmxhZ3MpLAorICAgICAgICBoZWFkZXI6IG5ld19oZWFkZXIoY29udGFpbmVyLCBudW1fZmxhZ3MsIHZlcnNpb24pLAogICAgICAgICBib29sZWFuczogdmVjIVtmYWxzZTsgbnVtX2ZsYWdzIGFzIHVzaXplXSwKICAgICB9OwotCi0gICAgZm9yIHBrZyBpbiBwYWNrYWdlcy5pdGVyKCkgeworICAgIGZvciBwa2cgaW4gZmlsdGVyZWRfcGFja2FnZXMgewogICAgICAgICBsZXQgc3RhcnRfaW5kZXggPSBwa2cuYm9vbGVhbl9zdGFydF9pbmRleCBhcyB1c2l6ZTsKICAgICAgICAgbGV0IGZsYWdfaWRzID0gYXNzaWduX2ZsYWdfaWRzKHBrZy5wYWNrYWdlX25hbWUsIHBrZy5ib29sZWFuX2ZsYWdzLml0ZXIoKS5jb3BpZWQoKSk/OwogICAgICAgICBmb3IgcGYgaW4gcGtnLmJvb2xlYW5fZmxhZ3MuaXRlcigpIHsKQEAgLTYxLDEzICs3MiwxNSBAQAogCiAjW2NmZyh0ZXN0KV0KIG1vZCB0ZXN0cyB7CisgICAgdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjpERUZBVUxUX0ZJTEVfVkVSU0lPTjsKKwogICAgIHVzZSBzdXBlcjo6KjsKICAgICB1c2UgY3JhdGU6OnN0b3JhZ2U6Ontncm91cF9mbGFnc19ieV9wYWNrYWdlLCB0ZXN0czo6cGFyc2VfYWxsX3Rlc3RfZmxhZ3N9OwogCiAgICAgcHViIGZuIGNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdF9mcm9tX3NvdXJjZSgpIC0+IFJlc3VsdDxGbGFnVmFsdWVMaXN0PiB7CiAgICAgICAgIGxldCBjYWNoZXMgPSBwYXJzZV9hbGxfdGVzdF9mbGFncygpOwotICAgICAgICBsZXQgcGFja2FnZXMgPSBncm91cF9mbGFnc19ieV9wYWNrYWdlKGNhY2hlcy5pdGVyKCkpOwotICAgICAgICBjcmVhdGVfZmxhZ192YWx1ZSgibW9ja3VwIiwgJnBhY2thZ2VzKQorICAgICAgICBsZXQgcGFja2FnZXMgPSBncm91cF9mbGFnc19ieV9wYWNrYWdlKGNhY2hlcy5pdGVyKCksIERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKyAgICAgICAgY3JlYXRlX2ZsYWdfdmFsdWUoIm1vY2t1cCIsICZwYWNrYWdlcywgREVGQVVMVF9GSUxFX1ZFUlNJT04pCiAgICAgfQogCiAgICAgI1t0ZXN0XQpAQCAtNzYsNyArODksNyBAQAogICAgICAgICBsZXQgZmxhZ192YWx1ZV9saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ192YWx1ZV9saXN0X2Zyb21fc291cmNlKCk7CiAgICAgICAgIGFzc2VydCEoZmxhZ192YWx1ZV9saXN0LmlzX29rKCkpOwogICAgICAgICBsZXQgZXhwZWN0ZWRfZmxhZ192YWx1ZV9saXN0ID0KLSAgICAgICAgICAgIGFjb25maWdfc3RvcmFnZV9maWxlOjp0ZXN0X3V0aWxzOjpjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QoKTsKKyAgICAgICAgICAgIGFjb25maWdfc3RvcmFnZV9maWxlOjp0ZXN0X3V0aWxzOjpjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QoREVGQVVMVF9GSUxFX1ZFUlNJT04pOwogICAgICAgICBhc3NlcnRfZXEhKGZsYWdfdmFsdWVfbGlzdC51bndyYXAoKSwgZXhwZWN0ZWRfZmxhZ192YWx1ZV9saXN0KTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL3N0b3JhZ2UvbW9kLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9zdG9yYWdlL21vZC5ycwppbmRleCA3MzMzOWYyLi42MWU2NWQxIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL3N0b3JhZ2UvbW9kLnJzCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvc3RvcmFnZS9tb2QucnMKQEAgLTE0LDIzICsxNCwyNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAorcHViIG1vZCBmbGFnX2luZm87CiBwdWIgbW9kIGZsYWdfdGFibGU7CiBwdWIgbW9kIGZsYWdfdmFsdWU7CiBwdWIgbW9kIHBhY2thZ2VfdGFibGU7CiAKLXVzZSBhbnlob3c6Onthbnlob3csIFJlc3VsdH07Cit1c2UgYW55aG93OjpSZXN1bHQ7CiB1c2Ugc3RkOjpjb2xsZWN0aW9uczo6e0hhc2hNYXAsIEhhc2hTZXR9OwogCit1c2UgY3JhdGU6OmNvbW1hbmRzOjpjb21wdXRlX2ZsYWdzX2ZpbmdlcnByaW50OwogdXNlIGNyYXRlOjpzdG9yYWdlOjp7Ci0gICAgZmxhZ190YWJsZTo6Y3JlYXRlX2ZsYWdfdGFibGUsIGZsYWdfdmFsdWU6OmNyZWF0ZV9mbGFnX3ZhbHVlLAorICAgIGZsYWdfaW5mbzo6Y3JlYXRlX2ZsYWdfaW5mbywgZmxhZ190YWJsZTo6Y3JlYXRlX2ZsYWdfdGFibGUsIGZsYWdfdmFsdWU6OmNyZWF0ZV9mbGFnX3ZhbHVlLAogICAgIHBhY2thZ2VfdGFibGU6OmNyZWF0ZV9wYWNrYWdlX3RhYmxlLAogfTsKLXVzZSBhY29uZmlnX3Byb3Rvczo6e1Byb3RvUGFyc2VkRmxhZywgUHJvdG9QYXJzZWRGbGFnc307Cit1c2UgYWNvbmZpZ19wcm90b3M6OntQcm90b0ZsYWdQZXJtaXNzaW9uLCBQcm90b0ZsYWdTdGF0ZSwgUHJvdG9QYXJzZWRGbGFnLCBQcm90b1BhcnNlZEZsYWdzfTsKIHVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6U3RvcmFnZUZpbGVUeXBlOwogCisjW2Rlcml2ZShDbG9uZSldCiBwdWIgc3RydWN0IEZsYWdQYWNrYWdlPCdhPiB7CiAgICAgcHViIHBhY2thZ2VfbmFtZTogJidhIHN0ciwKICAgICBwdWIgcGFja2FnZV9pZDogdTMyLAorICAgIHB1YiBmaW5nZXJwcmludDogdTY0LAogICAgIHB1YiBmbGFnX25hbWVzOiBIYXNoU2V0PCYnYSBzdHI+LAogICAgIHB1YiBib29sZWFuX2ZsYWdzOiBWZWM8JidhIFByb3RvUGFyc2VkRmxhZz4sCiAgICAgLy8gVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBib29sZWFuIGZsYWcgaW4gdGhpcyBhY29uZmlnIHBhY2thZ2UgYW1vbmcgYWxsIGJvb2xlYW4KQEAgLTQzLDYgKzQ3LDcgQEAKICAgICAgICAgRmxhZ1BhY2thZ2UgewogICAgICAgICAgICAgcGFja2FnZV9uYW1lLAogICAgICAgICAgICAgcGFja2FnZV9pZCwKKyAgICAgICAgICAgIGZpbmdlcnByaW50OiAwLAogICAgICAgICAgICAgZmxhZ19uYW1lczogSGFzaFNldDo6bmV3KCksCiAgICAgICAgICAgICBib29sZWFuX2ZsYWdzOiB2ZWMhW10sCiAgICAgICAgICAgICBib29sZWFuX3N0YXJ0X2luZGV4OiAwLApAQCAtNTYsNyArNjEsNyBAQAogICAgIH0KIH0KIAotcHViIGZuIGdyb3VwX2ZsYWdzX2J5X3BhY2thZ2U8J2EsIEk+KHBhcnNlZF9mbGFnc192ZWNfaXRlcjogSSkgLT4gVmVjPEZsYWdQYWNrYWdlPCdhPj4KK3B1YiBmbiBncm91cF9mbGFnc19ieV9wYWNrYWdlPCdhLCBJPihwYXJzZWRfZmxhZ3NfdmVjX2l0ZXI6IEksIHZlcnNpb246IHUzMikgLT4gVmVjPEZsYWdQYWNrYWdlPCdhPj4KIHdoZXJlCiAgICAgSTogSXRlcmF0b3I8SXRlbSA9ICYnYSBQcm90b1BhcnNlZEZsYWdzPiwKIHsKQEAgLTY5LDE1ICs3NCwzMyBAQAogICAgICAgICAgICAgaWYgaW5kZXggPT0gcGFja2FnZXMubGVuKCkgewogICAgICAgICAgICAgICAgIHBhY2thZ2VzLnB1c2goRmxhZ1BhY2thZ2U6Om5ldyhwYXJzZWRfZmxhZy5wYWNrYWdlKCksIGluZGV4IGFzIHUzMikpOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBFeGNsdWRlIHN5c3RlbS92ZW5kb3IvcHJvZHVjdCBmbGFncyB0aGF0IGFyZSBSTytkaXNhYmxlZC4KKyAgICAgICAgICAgIGlmIChwYXJzZWRfZmxhZy5jb250YWluZXIgPT0gU29tZSgic3lzdGVtIi50b19zdHJpbmcoKSkKKyAgICAgICAgICAgICAgICB8fCBwYXJzZWRfZmxhZy5jb250YWluZXIgPT0gU29tZSgidmVuZG9yIi50b19zdHJpbmcoKSkKKyAgICAgICAgICAgICAgICB8fCBwYXJzZWRfZmxhZy5jb250YWluZXIgPT0gU29tZSgicHJvZHVjdCIudG9fc3RyaW5nKCkpKQorICAgICAgICAgICAgICAgICYmIHBhcnNlZF9mbGFnLnBlcm1pc3Npb24gPT0gU29tZShQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX09OTFkuaW50bygpKQorICAgICAgICAgICAgICAgICYmIHBhcnNlZF9mbGFnLnN0YXRlID09IFNvbWUoUHJvdG9GbGFnU3RhdGU6OkRJU0FCTEVELmludG8oKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgcGFja2FnZXNbaW5kZXhdLmluc2VydChwYXJzZWRfZmxhZyk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBjYWNsdWF0ZSBib29sZWFuIGZsYWcgc3RhcnQgaW5kZXggZm9yIGVhY2ggcGFja2FnZQorICAgIC8vIENhbGN1bGF0ZSBib29sZWFuIGZsYWcgc3RhcnQgaW5kZXggZm9yIGVhY2ggcGFja2FnZQogICAgIGxldCBtdXQgYm9vbGVhbl9zdGFydF9pbmRleCA9IDA7CiAgICAgZm9yIHAgaW4gcGFja2FnZXMuaXRlcl9tdXQoKSB7CiAgICAgICAgIHAuYm9vbGVhbl9zdGFydF9pbmRleCA9IGJvb2xlYW5fc3RhcnRfaW5kZXg7CiAgICAgICAgIGJvb2xlYW5fc3RhcnRfaW5kZXggKz0gcC5ib29sZWFuX2ZsYWdzLmxlbigpIGFzIHUzMjsKKworICAgICAgICBpZiB2ZXJzaW9uID49IDIgeworICAgICAgICAgICAgbGV0IG11dCBmbGFnX25hbWVzX3ZlYyA9CisgICAgICAgICAgICAgICAgcC5mbGFnX25hbWVzLmNsb25lKCkuaW50b19pdGVyKCkubWFwKFN0cmluZzo6ZnJvbSkuY29sbGVjdDo6PFZlYzxfPj4oKTsKKyAgICAgICAgICAgIGxldCBmaW5nZXJwcmludCA9IGNvbXB1dGVfZmxhZ3NfZmluZ2VycHJpbnQoJm11dCBmbGFnX25hbWVzX3ZlYyk7CisgICAgICAgICAgICBwLmZpbmdlcnByaW50ID0gZmluZ2VycHJpbnQ7CisgICAgICAgIH0KICAgICB9CiAKICAgICBwYWNrYWdlcwpAQCAtODcsMzEgKzExMCwzNyBAQAogICAgIGNvbnRhaW5lcjogJnN0ciwKICAgICBwYXJzZWRfZmxhZ3NfdmVjX2l0ZXI6IEksCiAgICAgZmlsZTogJlN0b3JhZ2VGaWxlVHlwZSwKKyAgICB2ZXJzaW9uOiB1MzIsCiApIC0+IFJlc3VsdDxWZWM8dTg+Pgogd2hlcmUKICAgICBJOiBJdGVyYXRvcjxJdGVtID0gJidhIFByb3RvUGFyc2VkRmxhZ3M+LAogewotICAgIGxldCBwYWNrYWdlcyA9IGdyb3VwX2ZsYWdzX2J5X3BhY2thZ2UocGFyc2VkX2ZsYWdzX3ZlY19pdGVyKTsKKyAgICBsZXQgcGFja2FnZXMgPSBncm91cF9mbGFnc19ieV9wYWNrYWdlKHBhcnNlZF9mbGFnc192ZWNfaXRlciwgdmVyc2lvbik7CiAKICAgICBtYXRjaCBmaWxlIHsKICAgICAgICAgU3RvcmFnZUZpbGVUeXBlOjpQYWNrYWdlTWFwID0+IHsKLSAgICAgICAgICAgIGxldCBwYWNrYWdlX3RhYmxlID0gY3JlYXRlX3BhY2thZ2VfdGFibGUoY29udGFpbmVyLCAmcGFja2FnZXMpPzsKKyAgICAgICAgICAgIGxldCBwYWNrYWdlX3RhYmxlID0gY3JlYXRlX3BhY2thZ2VfdGFibGUoY29udGFpbmVyLCAmcGFja2FnZXMsIHZlcnNpb24pPzsKICAgICAgICAgICAgIE9rKHBhY2thZ2VfdGFibGUuaW50b19ieXRlcygpKQogICAgICAgICB9CiAgICAgICAgIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ01hcCA9PiB7Ci0gICAgICAgICAgICBsZXQgZmxhZ190YWJsZSA9IGNyZWF0ZV9mbGFnX3RhYmxlKGNvbnRhaW5lciwgJnBhY2thZ2VzKT87CisgICAgICAgICAgICBsZXQgZmxhZ190YWJsZSA9IGNyZWF0ZV9mbGFnX3RhYmxlKGNvbnRhaW5lciwgJnBhY2thZ2VzLCB2ZXJzaW9uKT87CiAgICAgICAgICAgICBPayhmbGFnX3RhYmxlLmludG9fYnl0ZXMoKSkKICAgICAgICAgfQogICAgICAgICBTdG9yYWdlRmlsZVR5cGU6OkZsYWdWYWwgPT4gewotICAgICAgICAgICAgbGV0IGZsYWdfdmFsdWUgPSBjcmVhdGVfZmxhZ192YWx1ZShjb250YWluZXIsICZwYWNrYWdlcyk/OworICAgICAgICAgICAgbGV0IGZsYWdfdmFsdWUgPSBjcmVhdGVfZmxhZ192YWx1ZShjb250YWluZXIsICZwYWNrYWdlcywgdmVyc2lvbik/OwogICAgICAgICAgICAgT2soZmxhZ192YWx1ZS5pbnRvX2J5dGVzKCkpCiAgICAgICAgIH0KLSAgICAgICAgXyA9PiBFcnIoYW55aG93ISgiYWNvbmZpZyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBjcmVhdGlvbiBvZiB0aGlzIHN0b3JhZ2UgZmlsZSB0eXBlIikpLAorICAgICAgICBTdG9yYWdlRmlsZVR5cGU6OkZsYWdJbmZvID0+IHsKKyAgICAgICAgICAgIGxldCBmbGFnX2luZm8gPSBjcmVhdGVfZmxhZ19pbmZvKGNvbnRhaW5lciwgJnBhY2thZ2VzLCB2ZXJzaW9uKT87CisgICAgICAgICAgICBPayhmbGFnX2luZm8uaW50b19ieXRlcygpKQorICAgICAgICB9CiAgICAgfQogfQogCiAjW2NmZyh0ZXN0KV0KIG1vZCB0ZXN0cyB7CisgICAgdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjpERUZBVUxUX0ZJTEVfVkVSU0lPTjsKKwogICAgIHVzZSBzdXBlcjo6KjsKICAgICB1c2UgY3JhdGU6OklucHV0OwogCkBAIC0xNTQsNiArMTgzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlcjogQm94OjpuZXcodmFsdWVfY29udGVudCksCiAgICAgICAgICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgICAgICAgICBjcmF0ZTo6Y29tbWFuZHM6OkRFRkFVTFRfRkxBR19QRVJNSVNTSU9OLAorICAgICAgICAgICAgICAgICAgICB0cnVlLAogICAgICAgICAgICAgICAgICkKICAgICAgICAgICAgICAgICAudW53cmFwKCk7CiAgICAgICAgICAgICAgICAgYWNvbmZpZ19wcm90b3M6OnBhcnNlZF9mbGFnczo6dHJ5X2Zyb21fYmluYXJ5X3Byb3RvKCZieXRlcykudW53cmFwKCkKQEAgLTE2NCw3ICsxOTQsNyBAQAogICAgICNbdGVzdF0KICAgICBmbiB0ZXN0X2ZsYWdfcGFja2FnZSgpIHsKICAgICAgICAgbGV0IGNhY2hlcyA9IHBhcnNlX2FsbF90ZXN0X2ZsYWdzKCk7Ci0gICAgICAgIGxldCBwYWNrYWdlcyA9IGdyb3VwX2ZsYWdzX2J5X3BhY2thZ2UoY2FjaGVzLml0ZXIoKSk7CisgICAgICAgIGxldCBwYWNrYWdlcyA9IGdyb3VwX2ZsYWdzX2J5X3BhY2thZ2UoY2FjaGVzLml0ZXIoKSwgREVGQVVMVF9GSUxFX1ZFUlNJT04pOwogCiAgICAgICAgIGZvciBwa2cgaW4gcGFja2FnZXMuaXRlcigpIHsKICAgICAgICAgICAgIGxldCBwa2dfbmFtZSA9IHBrZy5wYWNrYWdlX25hbWU7CkBAIC0xODQsNiArMjE0LDcgQEAKICAgICAgICAgYXNzZXJ0IShwYWNrYWdlc1swXS5mbGFnX25hbWVzLmNvbnRhaW5zKCJkaXNhYmxlZF9ydyIpKTsKICAgICAgICAgYXNzZXJ0IShwYWNrYWdlc1swXS5mbGFnX25hbWVzLmNvbnRhaW5zKCJlbmFibGVkX3JvIikpOwogICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzBdLmJvb2xlYW5fc3RhcnRfaW5kZXgsIDApOworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzBdLmZpbmdlcnByaW50LCAwKTsKIAogICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzFdLnBhY2thZ2VfbmFtZSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiKTsKICAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1sxXS5wYWNrYWdlX2lkLCAxKTsKQEAgLTE5Miw2ICsyMjMsNyBAQAogICAgICAgICBhc3NlcnQhKHBhY2thZ2VzWzFdLmZsYWdfbmFtZXMuY29udGFpbnMoImRpc2FibGVkX3J3IikpOwogICAgICAgICBhc3NlcnQhKHBhY2thZ2VzWzFdLmZsYWdfbmFtZXMuY29udGFpbnMoImVuYWJsZWRfZml4ZWRfcm8iKSk7CiAgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXNbMV0uYm9vbGVhbl9zdGFydF9pbmRleCwgMyk7CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXNbMF0uZmluZ2VycHJpbnQsIDApOwogCiAgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXNbMl0ucGFja2FnZV9uYW1lLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIpOwogICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzJdLnBhY2thZ2VfaWQsIDIpOwpAQCAtMTk5LDUgKzIzMSw0OSBAQAogICAgICAgICBhc3NlcnQhKHBhY2thZ2VzWzJdLmZsYWdfbmFtZXMuY29udGFpbnMoImVuYWJsZWRfcnciKSk7CiAgICAgICAgIGFzc2VydCEocGFja2FnZXNbMl0uZmxhZ19uYW1lcy5jb250YWlucygiZW5hYmxlZF9maXhlZF9ybyIpKTsKICAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1syXS5ib29sZWFuX3N0YXJ0X2luZGV4LCA2KTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1syXS5maW5nZXJwcmludCwgMCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfZmxhZ19wYWNrYWdlX3dpdGhfZmluZ2VycHJpbnQoKSB7CisgICAgICAgIGxldCBjYWNoZXMgPSBwYXJzZV9hbGxfdGVzdF9mbGFncygpOworICAgICAgICBsZXQgcGFja2FnZXMgPSBncm91cF9mbGFnc19ieV9wYWNrYWdlKGNhY2hlcy5pdGVyKCksIDIpOworCisgICAgICAgIGZvciBwa2cgaW4gcGFja2FnZXMuaXRlcigpIHsKKyAgICAgICAgICAgIGxldCBwa2dfbmFtZSA9IHBrZy5wYWNrYWdlX25hbWU7CisgICAgICAgICAgICBhc3NlcnRfZXEhKHBrZy5mbGFnX25hbWVzLmxlbigpLCBwa2cuYm9vbGVhbl9mbGFncy5sZW4oKSk7CisgICAgICAgICAgICBmb3IgcGYgaW4gcGtnLmJvb2xlYW5fZmxhZ3MuaXRlcigpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnQhKHBrZy5mbGFnX25hbWVzLmNvbnRhaW5zKHBmLm5hbWUoKSkpOworICAgICAgICAgICAgICAgIGFzc2VydF9lcSEocGYucGFja2FnZSgpLCBwa2dfbmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzLmxlbigpLCAzKTsKKworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzBdLnBhY2thZ2VfbmFtZSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1swXS5wYWNrYWdlX2lkLCAwKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1swXS5mbGFnX25hbWVzLmxlbigpLCAzKTsKKyAgICAgICAgYXNzZXJ0IShwYWNrYWdlc1swXS5mbGFnX25hbWVzLmNvbnRhaW5zKCJlbmFibGVkX3J3IikpOworICAgICAgICBhc3NlcnQhKHBhY2thZ2VzWzBdLmZsYWdfbmFtZXMuY29udGFpbnMoImRpc2FibGVkX3J3IikpOworICAgICAgICBhc3NlcnQhKHBhY2thZ2VzWzBdLmZsYWdfbmFtZXMuY29udGFpbnMoImVuYWJsZWRfcm8iKSk7CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXNbMF0uYm9vbGVhbl9zdGFydF9pbmRleCwgMCk7CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXNbMF0uZmluZ2VycHJpbnQsIDE1MjQ4OTQ4NTEwNTkwMTU4MDg2dTY0KTsKKworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzFdLnBhY2thZ2VfbmFtZSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1sxXS5wYWNrYWdlX2lkLCAxKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1sxXS5mbGFnX25hbWVzLmxlbigpLCAzKTsKKyAgICAgICAgYXNzZXJ0IShwYWNrYWdlc1sxXS5mbGFnX25hbWVzLmNvbnRhaW5zKCJlbmFibGVkX3JvIikpOworICAgICAgICBhc3NlcnQhKHBhY2thZ2VzWzFdLmZsYWdfbmFtZXMuY29udGFpbnMoImRpc2FibGVkX3J3IikpOworICAgICAgICBhc3NlcnQhKHBhY2thZ2VzWzFdLmZsYWdfbmFtZXMuY29udGFpbnMoImVuYWJsZWRfZml4ZWRfcm8iKSk7CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXNbMV0uYm9vbGVhbl9zdGFydF9pbmRleCwgMyk7CisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXNbMV0uZmluZ2VycHJpbnQsIDQ0MzE5NDA1MDIyNzQ4NTc5NjR1NjQpOworCisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZXNbMl0ucGFja2FnZV9uYW1lLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIpOworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzJdLnBhY2thZ2VfaWQsIDIpOworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VzWzJdLmZsYWdfbmFtZXMubGVuKCksIDIpOworICAgICAgICBhc3NlcnQhKHBhY2thZ2VzWzJdLmZsYWdfbmFtZXMuY29udGFpbnMoImVuYWJsZWRfcnciKSk7CisgICAgICAgIGFzc2VydCEocGFja2FnZXNbMl0uZmxhZ19uYW1lcy5jb250YWlucygiZW5hYmxlZF9maXhlZF9ybyIpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1syXS5ib29sZWFuX3N0YXJ0X2luZGV4LCA2KTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlc1syXS5maW5nZXJwcmludCwgMTYyMzMyMjk5MTc3MTE2MjIzNzV1NjQpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvc3RvcmFnZS9wYWNrYWdlX3RhYmxlLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9zdG9yYWdlL3BhY2thZ2VfdGFibGUucnMKaW5kZXggYzUzNjAyZi4uNTNkYWE3ZiAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9zdG9yYWdlL3BhY2thZ2VfdGFibGUucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy9zdG9yYWdlL3BhY2thZ2VfdGFibGUucnMKQEAgLTE4LDE0ICsxOCwxMyBAQAogCiB1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OnsKICAgICBnZXRfdGFibGVfc2l6ZSwgUGFja2FnZVRhYmxlLCBQYWNrYWdlVGFibGVIZWFkZXIsIFBhY2thZ2VUYWJsZU5vZGUsIFN0b3JhZ2VGaWxlVHlwZSwKLSAgICBGSUxFX1ZFUlNJT04sCiB9OwogCiB1c2UgY3JhdGU6OnN0b3JhZ2U6OkZsYWdQYWNrYWdlOwogCi1mbiBuZXdfaGVhZGVyKGNvbnRhaW5lcjogJnN0ciwgbnVtX3BhY2thZ2VzOiB1MzIpIC0+IFBhY2thZ2VUYWJsZUhlYWRlciB7CitmbiBuZXdfaGVhZGVyKGNvbnRhaW5lcjogJnN0ciwgbnVtX3BhY2thZ2VzOiB1MzIsIHZlcnNpb246IHUzMikgLT4gUGFja2FnZVRhYmxlSGVhZGVyIHsKICAgICBQYWNrYWdlVGFibGVIZWFkZXIgewotICAgICAgICB2ZXJzaW9uOiBGSUxFX1ZFUlNJT04sCisgICAgICAgIHZlcnNpb24sCiAgICAgICAgIGNvbnRhaW5lcjogU3RyaW5nOjpmcm9tKGNvbnRhaW5lciksCiAgICAgICAgIGZpbGVfdHlwZTogU3RvcmFnZUZpbGVUeXBlOjpQYWNrYWdlTWFwIGFzIHU4LAogICAgICAgICBmaWxlX3NpemU6IDAsCkBAIC00OCw2ICs0Nyw3IEBACiAgICAgICAgIGxldCBub2RlID0gUGFja2FnZVRhYmxlTm9kZSB7CiAgICAgICAgICAgICBwYWNrYWdlX25hbWU6IFN0cmluZzo6ZnJvbShwYWNrYWdlLnBhY2thZ2VfbmFtZSksCiAgICAgICAgICAgICBwYWNrYWdlX2lkOiBwYWNrYWdlLnBhY2thZ2VfaWQsCisgICAgICAgICAgICBmaW5nZXJwcmludDogcGFja2FnZS5maW5nZXJwcmludCwKICAgICAgICAgICAgIGJvb2xlYW5fc3RhcnRfaW5kZXg6IHBhY2thZ2UuYm9vbGVhbl9zdGFydF9pbmRleCwKICAgICAgICAgICAgIG5leHRfb2Zmc2V0OiBOb25lLAogICAgICAgICB9OwpAQCAtNTYsMjAgKzU2LDI2IEBACiAgICAgfQogfQogCi1wdWIgZm4gY3JlYXRlX3BhY2thZ2VfdGFibGUoY29udGFpbmVyOiAmc3RyLCBwYWNrYWdlczogJltGbGFnUGFja2FnZV0pIC0+IFJlc3VsdDxQYWNrYWdlVGFibGU+IHsKK3B1YiBmbiBjcmVhdGVfcGFja2FnZV90YWJsZSgKKyAgICBjb250YWluZXI6ICZzdHIsCisgICAgcGFja2FnZXM6ICZbRmxhZ1BhY2thZ2VdLAorICAgIHZlcnNpb246IHUzMiwKKykgLT4gUmVzdWx0PFBhY2thZ2VUYWJsZT4gewogICAgIC8vIGNyZWF0ZSB0YWJsZQogICAgIGxldCBudW1fcGFja2FnZXMgPSBwYWNrYWdlcy5sZW4oKSBhcyB1MzI7CiAgICAgbGV0IG51bV9idWNrZXRzID0gZ2V0X3RhYmxlX3NpemUobnVtX3BhY2thZ2VzKT87Ci0gICAgbGV0IG11dCBoZWFkZXIgPSBuZXdfaGVhZGVyKGNvbnRhaW5lciwgbnVtX3BhY2thZ2VzKTsKKyAgICBsZXQgbXV0IGhlYWRlciA9IG5ld19oZWFkZXIoY29udGFpbmVyLCBudW1fcGFja2FnZXMsIHZlcnNpb24pOwogICAgIGxldCBtdXQgYnVja2V0cyA9IHZlYyFbTm9uZTsgbnVtX2J1Y2tldHMgYXMgdXNpemVdOwotICAgIGxldCBtdXQgbm9kZV93cmFwcGVyczogVmVjPF8+ID0KLSAgICAgICAgcGFja2FnZXMuaXRlcigpLm1hcCh8cGtnfCBQYWNrYWdlVGFibGVOb2RlV3JhcHBlcjo6bmV3KHBrZywgbnVtX2J1Y2tldHMpKS5jb2xsZWN0KCk7CisgICAgbGV0IG11dCBub2RlX3dyYXBwZXJzOiBWZWM8Xz4gPSBwYWNrYWdlcworICAgICAgICAuaXRlcigpCisgICAgICAgIC5tYXAofHBrZzogJkZsYWdQYWNrYWdlPCdfPnwgUGFja2FnZVRhYmxlTm9kZVdyYXBwZXI6Om5ldyhwa2csIG51bV9idWNrZXRzKSkKKyAgICAgICAgLmNvbGxlY3QoKTsKIAogICAgIC8vIGluaXRpYWxpemUgYWxsIGhlYWRlciBmaWVsZHMKICAgICBoZWFkZXIuYnVja2V0X29mZnNldCA9IGhlYWRlci5pbnRvX2J5dGVzKCkubGVuKCkgYXMgdTMyOwogICAgIGhlYWRlci5ub2RlX29mZnNldCA9IGhlYWRlci5idWNrZXRfb2Zmc2V0ICsgbnVtX2J1Y2tldHMgKiA0OwogICAgIGhlYWRlci5maWxlX3NpemUgPSBoZWFkZXIubm9kZV9vZmZzZXQKLSAgICAgICAgKyBub2RlX3dyYXBwZXJzLml0ZXIoKS5tYXAofHh8IHgubm9kZS5pbnRvX2J5dGVzKCkubGVuKCkpLnN1bTo6PHVzaXplPigpIGFzIHUzMjsKKyAgICAgICAgKyBub2RlX3dyYXBwZXJzLml0ZXIoKS5tYXAofHh8IHgubm9kZS5pbnRvX2J5dGVzKHZlcnNpb24pLmxlbigpKS5zdW06Ojx1c2l6ZT4oKSBhcyB1MzI7CiAKICAgICAvLyBzb3J0IG5vZGVfd3JhcHBlcnMgYnkgYnVja2V0IGluZGV4IGZvciBlZmZpY2llbmN5CiAgICAgbm9kZV93cmFwcGVycy5zb3J0X2J5KHxhLCBifCBhLmJ1Y2tldF9pbmRleC5jbXAoJmIuYnVja2V0X2luZGV4KSk7CkBAIC04Nyw3ICs5Myw3IEBACiAgICAgICAgIGlmIGJ1Y2tldHNbbm9kZV9idWNrZXRfaWR4IGFzIHVzaXplXS5pc19ub25lKCkgewogICAgICAgICAgICAgYnVja2V0c1tub2RlX2J1Y2tldF9pZHggYXMgdXNpemVdID0gU29tZShvZmZzZXQpOwogICAgICAgICB9Ci0gICAgICAgIG9mZnNldCArPSBub2RlX3dyYXBwZXJzW2ldLm5vZGUuaW50b19ieXRlcygpLmxlbigpIGFzIHUzMjsKKyAgICAgICAgb2Zmc2V0ICs9IG5vZGVfd3JhcHBlcnNbaV0ubm9kZS5pbnRvX2J5dGVzKHZlcnNpb24pLmxlbigpIGFzIHUzMjsKIAogICAgICAgICBpZiBsZXQgU29tZShpbmRleCkgPSBuZXh0X25vZGVfYnVja2V0X2lkeCB7CiAgICAgICAgICAgICBpZiBpbmRleCA9PSBub2RlX2J1Y2tldF9pZHggewpAQCAtMTA2LDIxICsxMTIsNTkgQEAKIAogI1tjZmcodGVzdCldCiBtb2QgdGVzdHMgeworICAgIHVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6e0RFRkFVTFRfRklMRV9WRVJTSU9OLCBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTn07CisKICAgICB1c2Ugc3VwZXI6Oio7CiAgICAgdXNlIGNyYXRlOjpzdG9yYWdlOjp7Z3JvdXBfZmxhZ3NfYnlfcGFja2FnZSwgdGVzdHM6OnBhcnNlX2FsbF90ZXN0X2ZsYWdzfTsKIAotICAgIHB1YiBmbiBjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlX2Zyb21fc291cmNlKCkgLT4gUmVzdWx0PFBhY2thZ2VUYWJsZT4geworICAgIHB1YiBmbiBjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlX2Zyb21fc291cmNlKHZlcnNpb246IHUzMikgLT4gUmVzdWx0PFBhY2thZ2VUYWJsZT4gewogICAgICAgICBsZXQgY2FjaGVzID0gcGFyc2VfYWxsX3Rlc3RfZmxhZ3MoKTsKLSAgICAgICAgbGV0IHBhY2thZ2VzID0gZ3JvdXBfZmxhZ3NfYnlfcGFja2FnZShjYWNoZXMuaXRlcigpKTsKLSAgICAgICAgY3JlYXRlX3BhY2thZ2VfdGFibGUoIm1vY2t1cCIsICZwYWNrYWdlcykKKyAgICAgICAgbGV0IHBhY2thZ2VzID0gZ3JvdXBfZmxhZ3NfYnlfcGFja2FnZShjYWNoZXMuaXRlcigpLCB2ZXJzaW9uKTsKKyAgICAgICAgY3JlYXRlX3BhY2thZ2VfdGFibGUoIm1vY2t1cCIsICZwYWNrYWdlcywgdmVyc2lvbikKICAgICB9CiAKICAgICAjW3Rlc3RdCiAgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGhlIHRhYmxlIGNyZWF0aW9uIGFuZCBlYWNoIGZpZWxkCi0gICAgZm4gdGVzdF90YWJsZV9jb250ZW50cygpIHsKLSAgICAgICAgbGV0IHBhY2thZ2VfdGFibGUgPSBjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlX2Zyb21fc291cmNlKCk7Ci0gICAgICAgIGFzc2VydCEocGFja2FnZV90YWJsZS5pc19vaygpKTsKLSAgICAgICAgbGV0IGV4cGVjdGVkX3BhY2thZ2VfdGFibGUgPSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6dGVzdF91dGlsczo6Y3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZSgpOwotICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VfdGFibGUudW53cmFwKCksIGV4cGVjdGVkX3BhY2thZ2VfdGFibGUpOworICAgIGZuIHRlc3RfdGFibGVfY29udGVudHNfZGVmYXVsdF92ZXJzaW9uKCkgeworICAgICAgICBsZXQgcGFja2FnZV90YWJsZV9yZXN1bHQgPSBjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlX2Zyb21fc291cmNlKERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKyAgICAgICAgYXNzZXJ0IShwYWNrYWdlX3RhYmxlX3Jlc3VsdC5pc19vaygpKTsKKyAgICAgICAgbGV0IHBhY2thZ2VfdGFibGUgPSBwYWNrYWdlX3RhYmxlX3Jlc3VsdC51bndyYXAoKTsKKworICAgICAgICBsZXQgZXhwZWN0ZWRfcGFja2FnZV90YWJsZSA9CisgICAgICAgICAgICBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6dGVzdF91dGlsczo6Y3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZShERUZBVUxUX0ZJTEVfVkVSU0lPTik7CisKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX3RhYmxlLmhlYWRlciwgZXhwZWN0ZWRfcGFja2FnZV90YWJsZS5oZWFkZXIpOworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VfdGFibGUuYnVja2V0cywgZXhwZWN0ZWRfcGFja2FnZV90YWJsZS5idWNrZXRzKTsKKyAgICAgICAgZm9yIChub2RlLCBleHBlY3RlZF9ub2RlKSBpbgorICAgICAgICAgICAgcGFja2FnZV90YWJsZS5ub2Rlcy5pdGVyKCkuemlwKGV4cGVjdGVkX3BhY2thZ2VfdGFibGUubm9kZXMuaXRlcigpKQorICAgICAgICB7CisgICAgICAgICAgICBhc3NlcnRfZXEhKG5vZGUucGFja2FnZV9uYW1lLCBleHBlY3RlZF9ub2RlLnBhY2thZ2VfbmFtZSk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKG5vZGUucGFja2FnZV9pZCwgZXhwZWN0ZWRfbm9kZS5wYWNrYWdlX2lkKTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEobm9kZS5ib29sZWFuX3N0YXJ0X2luZGV4LCBleHBlY3RlZF9ub2RlLmJvb2xlYW5fc3RhcnRfaW5kZXgpOworICAgICAgICAgICAgYXNzZXJ0X2VxIShub2RlLm5leHRfb2Zmc2V0LCBleHBlY3RlZF9ub2RlLm5leHRfb2Zmc2V0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgICNbdGVzdF0KKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biB0aGUgdGFibGUgY3JlYXRpb24gYW5kIGVhY2ggZmllbGQKKyAgICBmbiB0ZXN0X3RhYmxlX2NvbnRlbnRzX21heF92ZXJzaW9uKCkgeworICAgICAgICBsZXQgcGFja2FnZV90YWJsZV9yZXN1bHQgPQorICAgICAgICAgICAgY3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZV9mcm9tX3NvdXJjZShNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTik7CisgICAgICAgIGFzc2VydCEocGFja2FnZV90YWJsZV9yZXN1bHQuaXNfb2soKSk7CisgICAgICAgIGxldCBwYWNrYWdlX3RhYmxlID0gcGFja2FnZV90YWJsZV9yZXN1bHQudW53cmFwKCk7CisKKyAgICAgICAgbGV0IGV4cGVjdGVkX3BhY2thZ2VfdGFibGUgPQorICAgICAgICAgICAgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6OnRlc3RfdXRpbHM6OmNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUoTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04pOworCisgICAgICAgIGFzc2VydF9lcSEocGFja2FnZV90YWJsZS5oZWFkZXIsIGV4cGVjdGVkX3BhY2thZ2VfdGFibGUuaGVhZGVyKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX3RhYmxlLmJ1Y2tldHMsIGV4cGVjdGVkX3BhY2thZ2VfdGFibGUuYnVja2V0cyk7CisgICAgICAgIGZvciAobm9kZSwgZXhwZWN0ZWRfbm9kZSkgaW4KKyAgICAgICAgICAgIHBhY2thZ2VfdGFibGUubm9kZXMuaXRlcigpLnppcChleHBlY3RlZF9wYWNrYWdlX3RhYmxlLm5vZGVzLml0ZXIoKSkKKyAgICAgICAgeworICAgICAgICAgICAgYXNzZXJ0X2VxIShub2RlLnBhY2thZ2VfbmFtZSwgZXhwZWN0ZWRfbm9kZS5wYWNrYWdlX25hbWUpOworICAgICAgICAgICAgYXNzZXJ0X2VxIShub2RlLnBhY2thZ2VfaWQsIGV4cGVjdGVkX25vZGUucGFja2FnZV9pZCk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKG5vZGUuYm9vbGVhbl9zdGFydF9pbmRleCwgZXhwZWN0ZWRfbm9kZS5ib29sZWFuX3N0YXJ0X2luZGV4KTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEobm9kZS5uZXh0X29mZnNldCwgZXhwZWN0ZWRfbm9kZS5uZXh0X29mZnNldCk7CisgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL3Rlc3QucnMgYi90b29scy9hY29uZmlnL2Fjb25maWcvc3JjL3Rlc3QucnMKaW5kZXggNzQwOWNkYS4uMTBkYTI1MiAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3NyYy90ZXN0LnJzCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy9zcmMvdGVzdC5ycwpAQCAtMjY2LDYgKzI2Niw3IEBACiAgICAgICAgICAgICAgICAgcmVhZGVyOiBCb3g6Om5ldyhpbmNsdWRlX2J5dGVzISgiLi4vdGVzdHMvcmVhZF9vbmx5X3Rlc3QudmFsdWVzIikuYXNfc2xpY2UoKSksCiAgICAgICAgICAgICB9XSwKICAgICAgICAgICAgIGNyYXRlOjpjb21tYW5kczo6REVGQVVMVF9GTEFHX1BFUk1JU1NJT04sCisgICAgICAgICAgICB0cnVlLAogICAgICAgICApCiAgICAgICAgIC51bndyYXAoKTsKICAgICAgICAgYWNvbmZpZ19wcm90b3M6OnBhcnNlZF9mbGFnczo6dHJ5X2Zyb21fYmluYXJ5X3Byb3RvKCZieXRlcykudW53cmFwKCkKQEAgLTI5MCw2ICsyOTEsMjYgQEAKICAgICAgICAgICAgICAgICB9LAogICAgICAgICAgICAgXSwKICAgICAgICAgICAgIGNyYXRlOjpjb21tYW5kczo6REVGQVVMVF9GTEFHX1BFUk1JU1NJT04sCisgICAgICAgICAgICB0cnVlLAorICAgICAgICApCisgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgYWNvbmZpZ19wcm90b3M6OnBhcnNlZF9mbGFnczo6dHJ5X2Zyb21fYmluYXJ5X3Byb3RvKCZieXRlcykudW53cmFwKCkKKyAgICB9CisKKyAgICBwdWIgZm4gcGFyc2Vfc2Vjb25kX3BhY2thZ2VfZmxhZ3MoKSAtPiBQcm90b1BhcnNlZEZsYWdzIHsKKyAgICAgICAgbGV0IGJ5dGVzID0gY3JhdGU6OmNvbW1hbmRzOjpwYXJzZV9mbGFncygKKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnNlY29uZF90ZXN0IiwKKyAgICAgICAgICAgIFNvbWUoInN5c3RlbSIpLAorICAgICAgICAgICAgdmVjIVtJbnB1dCB7CisgICAgICAgICAgICAgICAgc291cmNlOiAidGVzdHMvdGVzdF9zZWNvbmRfcGFja2FnZS5hY29uZmlnIi50b19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICByZWFkZXI6IEJveDo6bmV3KGluY2x1ZGVfYnl0ZXMhKCIuLi90ZXN0cy90ZXN0X3NlY29uZF9wYWNrYWdlLmFjb25maWciKS5hc19zbGljZSgpKSwKKyAgICAgICAgICAgIH1dLAorICAgICAgICAgICAgdmVjIVtJbnB1dCB7CisgICAgICAgICAgICAgICAgc291cmNlOiAidGVzdHMvdGhpcmQudmFsdWVzIi50b19zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICByZWFkZXI6IEJveDo6bmV3KGluY2x1ZGVfYnl0ZXMhKCIuLi90ZXN0cy90aGlyZC52YWx1ZXMiKS5hc19zbGljZSgpKSwKKyAgICAgICAgICAgIH1dLAorICAgICAgICAgICAgY3JhdGU6OmNvbW1hbmRzOjpERUZBVUxUX0ZMQUdfUEVSTUlTU0lPTiwKKyAgICAgICAgICAgIHRydWUsCiAgICAgICAgICkKICAgICAgICAgLnVud3JhcCgpOwogICAgICAgICBhY29uZmlnX3Byb3Rvczo6cGFyc2VkX2ZsYWdzOjp0cnlfZnJvbV9iaW5hcnlfcHJvdG8oJmJ5dGVzKS51bndyYXAoKQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9DdXN0b21GZWF0dXJlRmxhZ3MuamF2YS50ZW1wbGF0ZSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvQ3VzdG9tRmVhdHVyZUZsYWdzLmphdmEudGVtcGxhdGUKaW5kZXggYjgyYjljYi4uZWYxODM2NyAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9DdXN0b21GZWF0dXJlRmxhZ3MuamF2YS50ZW1wbGF0ZQorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0N1c3RvbUZlYXR1cmVGbGFncy5qYXZhLnRlbXBsYXRlCkBAIC0xMSw3ICsxMSwxMyBAQAogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5CaVByZWRpY2F0ZTsKIGltcG9ydCBqYXZhLnV0aWwuZnVuY3Rpb24uUHJlZGljYXRlOwogCit7eyAtaWYgc2luZ2xlX2V4cG9ydGVkX2ZpbGUgfX0KK3t7IC1pZiBsaWJyYXJ5X2V4cG9ydGVkIH19CitARGVwcmVjYXRlZCB7Iy0gUFJFRkVSIEV4cG9ydGVkRmxhZ3MgI30KK3t7IC1lbmRpZiB9fQore3sgLWVsc2UgfX0KIC8qKiBAaGlkZSAqLwore3sgLWVuZGlmIH19CiBwdWJsaWMgY2xhc3MgQ3VzdG9tRmVhdHVyZUZsYWdzIGltcGxlbWVudHMgRmVhdHVyZUZsYWdzIFx7CiAKICAgICBwcml2YXRlIEJpUHJlZGljYXRlPFN0cmluZywgUHJlZGljYXRlPEZlYXR1cmVGbGFncz4+IG1HZXRWYWx1ZUltcGw7CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0V4cG9ydGVkRmxhZ3MuamF2YS50ZW1wbGF0ZSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvRXhwb3J0ZWRGbGFncy5qYXZhLnRlbXBsYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlMzY5NDIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0V4cG9ydGVkRmxhZ3MuamF2YS50ZW1wbGF0ZQpAQCAtMCwwICsxLDQ5IEBACitwYWNrYWdlIHtwYWNrYWdlX25hbWV9OyB7Iy0gQ09ERUdFTiBGT1IgRVhQT1JURUQgTU9ERSBGT1IgTkVXIFNUT1JBR0UgU0lOR0xFIEVYUE9SVEVEIEZJTEUjfQorCitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKK2ltcG9ydCBhbmRyb2lkLm9zLmZsYWdnaW5nLkFjb25maWdQYWNrYWdlOworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CitwdWJsaWMgZmluYWwgY2xhc3MgRXhwb3J0ZWRGbGFncyBcewore3sgLWZvciBpdGVtIGluIGZsYWdfZWxlbWVudHN9fQorICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZMQUdfe2l0ZW0uZmxhZ19uYW1lX2NvbnN0YW50X3N1ZmZpeH0gPSAie2l0ZW0uZGV2aWNlX2NvbmZpZ19mbGFnfSI7Cit7ey0gZW5kZm9yIH19CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJFeHBvcnRlZEZsYWdzIjsKKyAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIGlzQ2FjaGVkID0gZmFsc2U7Cit7eyBmb3IgZmxhZyBpbiBmbGFnX2VsZW1lbnRzIH19CisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB7ZmxhZy5tZXRob2RfbmFtZX0gPSBmYWxzZTsKK3t7IC1lbmRmb3IgfX0geyMtIGVuZCBmbGFnX2VsZW1lbnRzICN9CisgICAgcHJpdmF0ZSBFeHBvcnRlZEZsYWdzKCkgXHt9CisKKyAgICBwcml2YXRlIHZvaWQgaW5pdCgpIFx7CisgICAgICAgIHRyeSBceworICAgICAgICAgICAgQWNvbmZpZ1BhY2thZ2UgcmVhZGVyID0gQWNvbmZpZ1BhY2thZ2UubG9hZCgie3BhY2thZ2VfbmFtZX0iKTsKKyAgICAgICAgICAgIHt7IC1mb3IgbmFtZXNwYWNlX3dpdGhfZmxhZ3MgaW4gbmFtZXNwYWNlX2ZsYWdzIH19CisgICAgICAgICAgICB7eyAtZm9yIGZsYWcgaW4gbmFtZXNwYWNlX3dpdGhfZmxhZ3MuZmxhZ3MgfX0KKyAgICAgICAgICAgIHt7IC1pZiBmbGFnLmZpbmFsaXplZF9zZGtfcHJlc2VudCB9fQorICAgICAgICAgICAge2ZsYWcubWV0aG9kX25hbWV9ID0gQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IHtmbGFnLmZpbmFsaXplZF9zZGtfdmFsdWV9ID8gdHJ1ZSA6IHJlYWRlci5nZXRCb29sZWFuRmxhZ1ZhbHVlKCJ7ZmxhZy5mbGFnX25hbWV9Iiwge2ZsYWcuZGVmYXVsdF92YWx1ZX0pOworICAgICAgICAgICAge3sgLSBlbHNlIH19IHsjLSBlbHNlIGZpbmFsaXplZF9zZGtfcHJlc2VudCAjfQorICAgICAgICAgICAge2ZsYWcubWV0aG9kX25hbWV9ID0gcmVhZGVyLmdldEJvb2xlYW5GbGFnVmFsdWUoIntmbGFnLmZsYWdfbmFtZX0iLCB7ZmxhZy5kZWZhdWx0X3ZhbHVlfSk7CisgICAgICAgICAgICB7eyAtZW5kaWZ9fSAgeyMtIGVuZCBmaW5hbGl6ZWRfc2RrX3ByZXNlbnQjfQorICAgICAgICAgICAge3sgLWVuZGZvciB9fSB7Iy0gZW5kIG5hbWVzcGFjZV93aXRoX2ZsYWdzLmZsYWdzICN9CisgICAgICAgICAgICB7eyAtZW5kZm9yIH19IHsjLSBlbmQgbmFtZXNwYWNlX2ZsYWdzICN9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSBceworICAgICAgICAgICAgLy8gcGFzcworICAgICAgICAgICAgTG9nLmUoVEFHLCBlLnRvU3RyaW5nKCkpOworICAgICAgICB9IGNhdGNoIChMaW5rYWdlRXJyb3IgZSkgXHsKKyAgICAgICAgICAgIC8vIGZvciBtYWlubGluZSBtb2R1bGUgcnVubmluZyBvbiBvbGRlciBkZXZpY2VzLgorICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgcmVwbGFjZXMgdG8gdmVyc2lvbiBjaGVjaywgYWZ0ZXIgdGhlIHZlcnNpb24gYnVtcC4KKyAgICAgICAgICAgIExvZy53KFRBRywgZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBpc0NhY2hlZCA9IHRydWU7CisgICAgfQorCit7eyAtZm9yIGZsYWcgaW4gZmxhZ19lbGVtZW50cyB9fQorICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiB7ZmxhZy5tZXRob2RfbmFtZX0oKSBceworICAgICAgICBpZiAoIWZlYXR1cmVGbGFncy5pc0NhY2hlZCkgXHsKKyAgICAgICAgICAgIGZlYXR1cmVGbGFncy5pbml0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZlYXR1cmVGbGFncy57ZmxhZy5tZXRob2RfbmFtZX07CisgICAgfQore3sgLWVuZGZvciB9fQorICAgIHByaXZhdGUgc3RhdGljIEV4cG9ydGVkRmxhZ3MgZmVhdHVyZUZsYWdzID0gbmV3IEV4cG9ydGVkRmxhZ3MoKTsKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvRmFrZUZlYXR1cmVGbGFnc0ltcGwuamF2YS50ZW1wbGF0ZSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvRmFrZUZlYXR1cmVGbGFnc0ltcGwuamF2YS50ZW1wbGF0ZQppbmRleCAyOTBkMmM0Li5lZDI3N2FlIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0Zha2VGZWF0dXJlRmxhZ3NJbXBsLmphdmEudGVtcGxhdGUKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9GYWtlRmVhdHVyZUZsYWdzSW1wbC5qYXZhLnRlbXBsYXRlCkBAIC00LDcgKzQsMTMgQEAKIGltcG9ydCBqYXZhLnV0aWwuTWFwOwogaW1wb3J0IGphdmEudXRpbC5mdW5jdGlvbi5QcmVkaWNhdGU7CiAKK3t7IC1pZiBzaW5nbGVfZXhwb3J0ZWRfZmlsZSB9fQore3sgLWlmIGxpYnJhcnlfZXhwb3J0ZWQgfX0KK0BEZXByZWNhdGVkIHsjLSBQUkVGRVIgRXhwb3J0ZWRGbGFncyAjfQore3sgLWVuZGlmIH19Cit7eyAtZWxzZSB9fQogLyoqIEBoaWRlICovCit7eyAtZW5kaWYgfX0KIHB1YmxpYyBjbGFzcyBGYWtlRmVhdHVyZUZsYWdzSW1wbCBleHRlbmRzIEN1c3RvbUZlYXR1cmVGbGFncyBcewogICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgQm9vbGVhbj4gbUZsYWdNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CiAgICAgcHJpdmF0ZSBmaW5hbCBGZWF0dXJlRmxhZ3MgbURlZmF1bHRzOwpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9GZWF0dXJlRmxhZ3MuamF2YS50ZW1wbGF0ZSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvRmVhdHVyZUZsYWdzLmphdmEudGVtcGxhdGUKaW5kZXggMzhjOGYxMy4uYzhiOWI3ZiAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9GZWF0dXJlRmxhZ3MuamF2YS50ZW1wbGF0ZQorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0ZlYXR1cmVGbGFncy5qYXZhLnRlbXBsYXRlCkBAIC0zLDcgKzMsMTYgQEAKIC8vIFRPRE8oYi8zMDM3NzMwNTUpOiBSZW1vdmUgdGhlIGFubm90YXRpb24gYWZ0ZXIgYWNjZXNzIGlzc3VlIGlzIHJlc29sdmVkLgogaW1wb3J0IGFuZHJvaWQuY29tcGF0LmFubm90YXRpb24uVW5zdXBwb3J0ZWRBcHBVc2FnZTsKIHt7IC1lbmRpZiB9fQore3sgLWlmIHNpbmdsZV9leHBvcnRlZF9maWxlIH19Cit7eyAtaWYgbGlicmFyeV9leHBvcnRlZCB9fQorLyoqCisgKiBAZGVwcmVjYXRlZCBVc2UgXHtAbGluayBFeHBvcnRlZEZsYWdzfSBpbnN0ZWFkLgorICovCitARGVwcmVjYXRlZCB7Iy0gUFJFRkVSIEV4cG9ydGVkRmxhZ3MgI30KK3t7IC1lbmRpZiB9fQore3sgLWVsc2UgfX0KIC8qKiBAaGlkZSAqLwore3sgLWVuZGlmIH19CiBwdWJsaWMgaW50ZXJmYWNlIEZlYXR1cmVGbGFncyBcewoge3sgZm9yIGl0ZW0gaW4gZmxhZ19lbGVtZW50cyB9fQoge3sgLWlmIG5vdCBpdGVtLmlzX3JlYWRfd3JpdGUgfX0KQEAgLTE5LDQgKzI4LDQgQEAKIHt7IC1lbmRpZiB9fQogICAgIGJvb2xlYW4ge2l0ZW0ubWV0aG9kX25hbWV9KCk7CiB7eyAtZW5kZm9yIH19Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9GZWF0dXJlRmxhZ3NJbXBsLmRldmljZUNvbmZpZy5qYXZhLnRlbXBsYXRlIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9GZWF0dXJlRmxhZ3NJbXBsLmRldmljZUNvbmZpZy5qYXZhLnRlbXBsYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZDVjYzAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0ZlYXR1cmVGbGFnc0ltcGwuZGV2aWNlQ29uZmlnLmphdmEudGVtcGxhdGUKQEAgLTAsMCArMSw2OCBAQAorcGFja2FnZSB7cGFja2FnZV9uYW1lfTsKK3t7IGlmIG5vdCBsaWJyYXJ5X2V4cG9ydGVkLSB9fQorLy8gVE9ETyhiLzMwMzc3MzA1NSk6IFJlbW92ZSB0aGUgYW5ub3RhdGlvbiBhZnRlciBhY2Nlc3MgaXNzdWUgaXMgcmVzb2x2ZWQuCitpbXBvcnQgYW5kcm9pZC5jb21wYXQuYW5ub3RhdGlvbi5VbnN1cHBvcnRlZEFwcFVzYWdlOwore3sgLWVuZGlmIH19IHsjLSBlbmQgb2Ygbm90IGxpYnJhcnlfZXhwb3J0ZWQjfQore3sgLWlmIHJ1bnRpbWVfbG9va3VwX3JlcXVpcmVkIH19CitpbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5EZXZpY2VDb25maWc7CitpbXBvcnQgYW5kcm9pZC5wcm92aWRlci5EZXZpY2VDb25maWcuUHJvcGVydGllczsKK3t7IC1lbmRpZiB9fSAgeyMtIGVuZCBvZiBydW50aW1lX2xvb2t1cF9yZXF1aXJlZCN9CisvKiogQGhpZGUgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBGZWF0dXJlRmxhZ3NJbXBsIGltcGxlbWVudHMgRmVhdHVyZUZsYWdzIFx7Cit7eyAtaWYgcnVudGltZV9sb29rdXBfcmVxdWlyZWQgfX0KK3t7IC1mb3IgbmFtZXNwYWNlX3dpdGhfZmxhZ3MgaW4gbmFtZXNwYWNlX2ZsYWdzIH19CisgICAgcHJpdmF0ZSBzdGF0aWMgdm9sYXRpbGUgYm9vbGVhbiB7bmFtZXNwYWNlX3dpdGhfZmxhZ3MubmFtZXNwYWNlfV9pc19jYWNoZWQgPSBmYWxzZTsKK3t7IC1lbmRmb3ItIH19Cit7eyBmb3IgZmxhZyBpbiBmbGFnX2VsZW1lbnRzIH19Cit7ey0gaWYgZmxhZy5pc19yZWFkX3dyaXRlIH19CisgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB7ZmxhZy5tZXRob2RfbmFtZX0gPSB7ZmxhZy5kZWZhdWx0X3ZhbHVlfTsKK3t7IC1lbmRpZiB9fSB7Iy0gZW5kIG9mIGlzX3JlYWRfd3JpdGUjfQore3sgLWVuZGZvciB9fQore3sgZm9yIG5hbWVzcGFjZV93aXRoX2ZsYWdzIGluIG5hbWVzcGFjZV9mbGFncyB9fQorICAgIHByaXZhdGUgdm9pZCBsb2FkX292ZXJyaWRlc197bmFtZXNwYWNlX3dpdGhfZmxhZ3MubmFtZXNwYWNlfSgpIFx7CisgICAgICAgIGZpbmFsIGxvbmcgaWRlbnQgPSBCaW5kZXIuY2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICAgICAgdHJ5IFx7CisgICAgICAgICAgICBQcm9wZXJ0aWVzIHByb3BlcnRpZXMgPSBEZXZpY2VDb25maWcuZ2V0UHJvcGVydGllcygie25hbWVzcGFjZV93aXRoX2ZsYWdzLm5hbWVzcGFjZX0iKTsKK3t7IC1mb3IgZmxhZyBpbiBuYW1lc3BhY2Vfd2l0aF9mbGFncy5mbGFncyB9fQore3sgLWlmIGZsYWcuaXNfcmVhZF93cml0ZSB9fQorICAgICAgICAgICAge2ZsYWcubWV0aG9kX25hbWV9ID0KKyAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzLmdldEJvb2xlYW4oRmxhZ3MuRkxBR197ZmxhZy5mbGFnX25hbWVfY29uc3RhbnRfc3VmZml4fSwge2ZsYWcuZGVmYXVsdF92YWx1ZX0pOwore3sgLWVuZGlmIH19IHsjLSBlbmQgb2YgaXNfcmVhZF93cml0ZSN9Cit7eyAtZW5kZm9yIH19CisgICAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIFx7CisgICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAiQ2Fubm90IHJlYWQgdmFsdWUgZnJvbSBuYW1lc3BhY2Uge25hbWVzcGFjZV93aXRoX2ZsYWdzLm5hbWVzcGFjZX0gIgorICAgICAgICAgICAgICAgICsgImZyb20gRGV2aWNlQ29uZmlnLiBJdCBjb3VsZCBiZSB0aGF0IHRoZSBjb2RlIHVzaW5nIGZsYWcgIgorICAgICAgICAgICAgICAgICsgImV4ZWN1dGVkIGJlZm9yZSBTZXR0aW5nc1Byb3ZpZGVyIGluaXRpYWxpemF0aW9uLiBQbGVhc2UgdXNlICIKKyAgICAgICAgICAgICAgICArICJmaXhlZCByZWFkLW9ubHkgZmxhZyBieSBhZGRpbmcgaXNfZml4ZWRfcmVhZF9vbmx5OiB0cnVlIGluICIKKyAgICAgICAgICAgICAgICArICJmbGFnIGRlY2xhcmF0aW9uLiIsCisgICAgICAgICAgICAgICAgZQorICAgICAgICAgICAgKTsKKyAgICAgICAgfSBjYXRjaCAoU2VjdXJpdHlFeGNlcHRpb24gZSkgXHsKKyAgICAgICAgICAgIC8vIGZvciBpc29sYXRlZCBwcm9jZXNzIGNhc2UsIHNraXAgbG9hZGluZyBmbGFnIHZhbHVlIGZyb20gdGhlIHN0b3JhZ2UsIHVzZSB0aGUgZGVmYXVsdAorICAgICAgICB9IGZpbmFsbHkgXHsKKyAgICAgICAgICAgIEJpbmRlci5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KGlkZW50KTsKKyAgICAgICAgfQorICAgICAgICB7bmFtZXNwYWNlX3dpdGhfZmxhZ3MubmFtZXNwYWNlfV9pc19jYWNoZWQgPSB0cnVlOworfQore3sgZW5kZm9yLSB9fQore3sgLWVuZGlmIH19eyMtIGVuZCBvZiBydW50aW1lX2xvb2t1cF9yZXF1aXJlZCAjfQore3sgLWZvciBmbGFnIGluIGZsYWdfZWxlbWVudHMgfX0KKyAgICBAT3ZlcnJpZGUKK3t7IC1pZiBub3QgbGlicmFyeV9leHBvcnRlZCB9fQorICAgIEBjb20uYW5kcm9pZC5hY29uZmlnLmFubm90YXRpb25zLkFjb25maWdGbGFnQWNjZXNzb3IKKyAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQore3sgLWVuZGlmIH19eyMtIGVuZCBvZiBub3QgbGlicmFyeV9leHBvcnRlZCAjfQorICAgIHB1YmxpYyBib29sZWFuIHtmbGFnLm1ldGhvZF9uYW1lfSgpIFx7Cit7eyAtaWYgZmxhZy5pc19yZWFkX3dyaXRlIH19CisgICAgICAgIGlmICghe2ZsYWcuZGV2aWNlX2NvbmZpZ19uYW1lc3BhY2V9X2lzX2NhY2hlZCkgXHsKKyAgICAgICAgICAgIGxvYWRfb3ZlcnJpZGVzX3tmbGFnLmRldmljZV9jb25maWdfbmFtZXNwYWNlfSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB7ZmxhZy5tZXRob2RfbmFtZX07Cit7eyAtZWxzZSB9fSB7Iy0gZWxzZSBpc19yZWFkX3dyaXRlICN9CisgICAgICAgIHJldHVybiB7ZmxhZy5kZWZhdWx0X3ZhbHVlfTsKK3t7IC1lbmRpZiB9fXsjLSBlbmQgb2YgaXNfcmVhZF93cml0ZSAjfQorICAgIH0KK3t7IGVuZGZvciB9fQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9GZWF0dXJlRmxhZ3NJbXBsLmV4cG9ydGVkLmphdmEudGVtcGxhdGUgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0ZlYXR1cmVGbGFnc0ltcGwuZXhwb3J0ZWQuamF2YS50ZW1wbGF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iODQzZWMyCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9GZWF0dXJlRmxhZ3NJbXBsLmV4cG9ydGVkLmphdmEudGVtcGxhdGUKQEAgLTAsMCArMSw1MyBAQAorcGFja2FnZSB7cGFja2FnZV9uYW1lfTsgeyMtIENPREVHRU4gRk9SIEVYUE9SVEVEIE1PREUgRk9SIE5FVyBTVE9SQUdFICN9CisKK2ltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOworaW1wb3J0IGFuZHJvaWQub3MuZmxhZ2dpbmcuQWNvbmZpZ1BhY2thZ2U7CitpbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKK3t7IC1pZiBzaW5nbGVfZXhwb3J0ZWRfZmlsZSB9fQore3sgLWlmIGxpYnJhcnlfZXhwb3J0ZWQgfX0KKy8qKgorICogQGRlcHJlY2F0ZWQgVXNlIFx7QGxpbmsgRXhwb3J0ZWRGbGFnc30gaW5zdGVhZC4KKyAqLworQERlcHJlY2F0ZWQgeyMtIFBSRUZFUiBFeHBvcnRlZEZsYWdzICN9Cit7eyAtZW5kaWYgfX0KK3t7IC1lbHNlIH19CisvKiogQGhpZGUgKi8KK3t7IC1lbmRpZiB9fQorcHVibGljIGZpbmFsIGNsYXNzIEZlYXR1cmVGbGFnc0ltcGwgaW1wbGVtZW50cyBGZWF0dXJlRmxhZ3MgXHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkZlYXR1cmVGbGFnc0ltcGxFeHBvcnQiOworICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gaXNDYWNoZWQgPSBmYWxzZTsKK3t7IGZvciBmbGFnIGluIGZsYWdfZWxlbWVudHMgfX0KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHtmbGFnLm1ldGhvZF9uYW1lfSA9IGZhbHNlOwore3sgLWVuZGZvciB9fSB7Iy0gZW5kIGZsYWdfZWxlbWVudHMgI30KKyAgICBwcml2YXRlIHZvaWQgaW5pdCgpIFx7CisgICAgICAgIHRyeSBceworICAgICAgICAgICAgQWNvbmZpZ1BhY2thZ2UgcmVhZGVyID0gQWNvbmZpZ1BhY2thZ2UubG9hZCgie3BhY2thZ2VfbmFtZX0iKTsKKyAgICAgICAgICAgIHt7IC1mb3IgbmFtZXNwYWNlX3dpdGhfZmxhZ3MgaW4gbmFtZXNwYWNlX2ZsYWdzIH19CisgICAgICAgICAgICB7eyAtZm9yIGZsYWcgaW4gbmFtZXNwYWNlX3dpdGhfZmxhZ3MuZmxhZ3MgfX0KKyAgICAgICAgICAgIHt7IC1pZiBmbGFnLmZpbmFsaXplZF9zZGtfcHJlc2VudCB9fQorICAgICAgICAgICAge2ZsYWcubWV0aG9kX25hbWV9ID0gQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IHtmbGFnLmZpbmFsaXplZF9zZGtfdmFsdWV9ID8gdHJ1ZSA6IHJlYWRlci5nZXRCb29sZWFuRmxhZ1ZhbHVlKCJ7ZmxhZy5mbGFnX25hbWV9Iiwge2ZsYWcuZGVmYXVsdF92YWx1ZX0pOworICAgICAgICAgICAge3sgLSBlbHNlIH19IHsjLSBlbHNlIGZpbmFsaXplZF9zZGtfcHJlc2VudCAjfQorICAgICAgICAgICAge2ZsYWcubWV0aG9kX25hbWV9ID0gcmVhZGVyLmdldEJvb2xlYW5GbGFnVmFsdWUoIntmbGFnLmZsYWdfbmFtZX0iLCB7ZmxhZy5kZWZhdWx0X3ZhbHVlfSk7CisgICAgICAgICAgICB7eyAtZW5kaWZ9fSAgeyMtIGVuZCBmaW5hbGl6ZWRfc2RrX3ByZXNlbnQjfQorICAgICAgICAgICAge3sgLWVuZGZvciB9fSB7Iy0gZW5kIG5hbWVzcGFjZV93aXRoX2ZsYWdzLmZsYWdzICN9CisgICAgICAgICAgICB7eyAtZW5kZm9yIH19IHsjLSBlbmQgbmFtZXNwYWNlX2ZsYWdzICN9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSBceworICAgICAgICAgICAgLy8gcGFzcworICAgICAgICAgICAgTG9nLmUoVEFHLCBlLnRvU3RyaW5nKCkpOworICAgICAgICB9IGNhdGNoIChMaW5rYWdlRXJyb3IgZSkgXHsKKyAgICAgICAgICAgIC8vIGZvciBtYWlubGluZSBtb2R1bGUgcnVubmluZyBvbiBvbGRlciBkZXZpY2VzLgorICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgcmVwbGFjZXMgdG8gdmVyc2lvbiBjaGVjaywgYWZ0ZXIgdGhlIHZlcnNpb24gYnVtcC4KKyAgICAgICAgICAgIExvZy53KFRBRywgZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBpc0NhY2hlZCA9IHRydWU7CisgICAgfQore3sgLWZvciBmbGFnIGluIGZsYWdfZWxlbWVudHMgfX0KKyAgICBAT3ZlcnJpZGUKKyAgICBwdWJsaWMgYm9vbGVhbiB7ZmxhZy5tZXRob2RfbmFtZX0oKSBceworICAgICAgICBpZiAoIWlzQ2FjaGVkKSBceworICAgICAgICAgICAgaW5pdCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB7ZmxhZy5tZXRob2RfbmFtZX07CisgICAgfQore3sgZW5kZm9yIH19IHsjLSBlbmQgZmxhZ19lbGVtZW50cyAjfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9GZWF0dXJlRmxhZ3NJbXBsLmphdmEudGVtcGxhdGUgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0ZlYXR1cmVGbGFnc0ltcGwuamF2YS50ZW1wbGF0ZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk3MGIxZi4uMDAwMDAwMAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0ZlYXR1cmVGbGFnc0ltcGwuamF2YS50ZW1wbGF0ZQorKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi1wYWNrYWdlIHtwYWNrYWdlX25hbWV9Owote3sgLWlmIG5vdCBpc190ZXN0X21vZGUgfX0KLXt7IGlmIG5vdCBsaWJyYXJ5X2V4cG9ydGVkLSB9fQotLy8gVE9ETyhiLzMwMzc3MzA1NSk6IFJlbW92ZSB0aGUgYW5ub3RhdGlvbiBhZnRlciBhY2Nlc3MgaXNzdWUgaXMgcmVzb2x2ZWQuCi1pbXBvcnQgYW5kcm9pZC5jb21wYXQuYW5ub3RhdGlvbi5VbnN1cHBvcnRlZEFwcFVzYWdlOwote3sgLWVuZGlmIH19Ci0KLXt7IC1pZiBydW50aW1lX2xvb2t1cF9yZXF1aXJlZCB9fQotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuRGV2aWNlQ29uZmlnOwotaW1wb3J0IGFuZHJvaWQucHJvdmlkZXIuRGV2aWNlQ29uZmlnLlByb3BlcnRpZXM7Ci0KLQote3sgLWlmIG5vdCBsaWJyYXJ5X2V4cG9ydGVkIH19Ci17eyAtaWYgYWxsb3dfaW5zdHJ1bWVudGF0aW9uIH19Ci1pbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuU3RvcmFnZUludGVybmFsUmVhZGVyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci17eyAtZW5kaWYgfX0KLXt7IC1lbmRpZiB9fQotCi17eyAtZW5kaWYgfX0KLS8qKiBAaGlkZSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEZlYXR1cmVGbGFnc0ltcGwgaW1wbGVtZW50cyBGZWF0dXJlRmxhZ3MgXHsKLXt7IC1pZiBydW50aW1lX2xvb2t1cF9yZXF1aXJlZCB9fQote3sgLWZvciBuYW1lc3BhY2Vfd2l0aF9mbGFncyBpbiBuYW1lc3BhY2VfZmxhZ3MgfX0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIHtuYW1lc3BhY2Vfd2l0aF9mbGFncy5uYW1lc3BhY2V9X2lzX2NhY2hlZCA9IGZhbHNlOwote3sgLWVuZGZvci0gfX0KLQote3sgZm9yIGZsYWcgaW4gZmxhZ19lbGVtZW50cyB9fQote3stIGlmIGZsYWcuaXNfcmVhZF93cml0ZSB9fQotICAgIHByaXZhdGUgc3RhdGljIGJvb2xlYW4ge2ZsYWcubWV0aG9kX25hbWV9ID0ge2ZsYWcuZGVmYXVsdF92YWx1ZX07Ci17eyAtZW5kaWYgfX0KLXt7IC1lbmRmb3IgfX0KLXt7IC1pZiBub3QgbGlicmFyeV9leHBvcnRlZCB9fQote3sgLWlmIGFsbG93X2luc3RydW1lbnRhdGlvbiB9fQotICAgIFN0b3JhZ2VJbnRlcm5hbFJlYWRlciByZWFkZXI7Ci0gICAgYm9vbGVhbiByZWFkRnJvbU5ld1N0b3JhZ2U7Ci0KLSAgICBib29sZWFuIHVzZU5ld1N0b3JhZ2VWYWx1ZUFuZERpc2NhcmRPbGQgPSBmYWxzZTsKLQotICAgIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBUQUcgPSAiQWNvbmZpZ0phdmFDb2RlZ2VuIjsKLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgU1VDQ0VTU19MT0cgPSAic3VjY2VzczogJXMgdmFsdWUgbWF0Y2hlcyI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIE1JU01BVENIX0xPRyA9ICJlcnJvcjogJXMgdmFsdWUgbWlzbWF0Y2gsIG5ldyBzdG9yYWdlIHZhbHVlIGlzICVzLCBvbGQgc3RvcmFnZSB2YWx1ZSBpcyAlcyI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIEVSUk9SX0xPRyA9ICJlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyB2YWx1ZSI7Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5pdCgpIFx7Ci0gICAgICAgIGlmIChyZWFkZXIgIT0gbnVsbCkgcmV0dXJuOwotICAgICAgICBpZiAoRGV2aWNlQ29uZmlnLmdldEJvb2xlYW4oImNvcmVfZXhwZXJpbWVudHNfdGVhbV9pbnRlcm5hbCIsICJjb20uYW5kcm9pZC5wcm92aWRlcnMuc2V0dGluZ3Muc3RvcmFnZV90ZXN0X21pc3Npb25fMSIsIGZhbHNlKSkgXHsKLSAgICAgICAgICAgIHJlYWRGcm9tTmV3U3RvcmFnZSA9IHRydWU7Ci0gICAgICAgICAgICB0cnkgXHsKLSAgICAgICAgICAgICAgICByZWFkZXIgPSBuZXcgU3RvcmFnZUludGVybmFsUmVhZGVyKCJ7Y29udGFpbmVyfSIsICJ7cGFja2FnZV9uYW1lfSIpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIFx7Ci0gICAgICAgICAgICAgICAgcmVhZGVyID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHVzZU5ld1N0b3JhZ2VWYWx1ZUFuZERpc2NhcmRPbGQgPQotICAgICAgICAgICAgRGV2aWNlQ29uZmlnLmdldEJvb2xlYW4oImNvcmVfZXhwZXJpbWVudHNfdGVhbV9pbnRlcm5hbCIsICJjb20uYW5kcm9pZC5wcm92aWRlcnMuc2V0dGluZ3MudXNlX25ld19zdG9yYWdlX3ZhbHVlIiwgZmFsc2UpOwotICAgIH0KLQote3sgLWVuZGlmIH19Ci17eyAtZW5kaWYgfX0KLXt7IGZvciBuYW1lc3BhY2Vfd2l0aF9mbGFncyBpbiBuYW1lc3BhY2VfZmxhZ3MgfX0KLSAgICBwcml2YXRlIHZvaWQgbG9hZF9vdmVycmlkZXNfe25hbWVzcGFjZV93aXRoX2ZsYWdzLm5hbWVzcGFjZX0oKSBcewotICAgICAgICB0cnkgXHsKLSAgICAgICAgICAgIFByb3BlcnRpZXMgcHJvcGVydGllcyA9IERldmljZUNvbmZpZy5nZXRQcm9wZXJ0aWVzKCJ7bmFtZXNwYWNlX3dpdGhfZmxhZ3MubmFtZXNwYWNlfSIpOwote3sgLWZvciBmbGFnIGluIG5hbWVzcGFjZV93aXRoX2ZsYWdzLmZsYWdzIH19Ci17eyAtaWYgZmxhZy5pc19yZWFkX3dyaXRlIH19Ci0gICAgICAgICAgICB7ZmxhZy5tZXRob2RfbmFtZX0gPQotICAgICAgICAgICAgICAgIHByb3BlcnRpZXMuZ2V0Qm9vbGVhbihGbGFncy5GTEFHX3tmbGFnLmZsYWdfbmFtZV9jb25zdGFudF9zdWZmaXh9LCB7ZmxhZy5kZWZhdWx0X3ZhbHVlfSk7Ci17eyAtZW5kaWYgfX0KLXt7IC1lbmRmb3IgfX0KLSAgICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgXHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJDYW5ub3QgcmVhZCB2YWx1ZSBmcm9tIG5hbWVzcGFjZSB7bmFtZXNwYWNlX3dpdGhfZmxhZ3MubmFtZXNwYWNlfSAiCi0gICAgICAgICAgICAgICAgKyAiZnJvbSBEZXZpY2VDb25maWcuIEl0IGNvdWxkIGJlIHRoYXQgdGhlIGNvZGUgdXNpbmcgZmxhZyAiCi0gICAgICAgICAgICAgICAgKyAiZXhlY3V0ZWQgYmVmb3JlIFNldHRpbmdzUHJvdmlkZXIgaW5pdGlhbGl6YXRpb24uIFBsZWFzZSB1c2UgIgotICAgICAgICAgICAgICAgICsgImZpeGVkIHJlYWQtb25seSBmbGFnIGJ5IGFkZGluZyBpc19maXhlZF9yZWFkX29ubHk6IHRydWUgaW4gIgotICAgICAgICAgICAgICAgICsgImZsYWcgZGVjbGFyYXRpb24uIiwKLSAgICAgICAgICAgICAgICBlCi0gICAgICAgICAgICApOwotICAgICAgICB9Ci0gICAgICAgIHtuYW1lc3BhY2Vfd2l0aF9mbGFncy5uYW1lc3BhY2V9X2lzX2NhY2hlZCA9IHRydWU7Ci17eyAtaWYgbm90IGxpYnJhcnlfZXhwb3J0ZWQgfX0KLXt7IC1pZiBhbGxvd19pbnN0cnVtZW50YXRpb24gfX0KLSAgICAgICAgaW5pdCgpOwotICAgICAgICBpZiAocmVhZEZyb21OZXdTdG9yYWdlICYmIHJlYWRlciAhPSBudWxsKSBcewotICAgICAgICAgICAgYm9vbGVhbiB2YWw7Ci0gICAgICAgICAgICB0cnkgXHsKLXt7IC1mb3IgZmxhZyBpbiBuYW1lc3BhY2Vfd2l0aF9mbGFncy5mbGFncyB9fQote3sgLWlmIGZsYWcuaXNfcmVhZF93cml0ZSB9fQotCi0gICAgICAgICAgICAgICAgdmFsID0gcmVhZGVyLmdldEJvb2xlYW5GbGFnVmFsdWUoe2ZsYWcuZmxhZ19vZmZzZXR9KTsKLSAgICAgICAgICAgICAgICBpZiAodmFsID09IHtmbGFnLm1ldGhvZF9uYW1lfSkgXHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCBTdHJpbmcuZm9ybWF0KFNVQ0NFU1NfTE9HLCAie2ZsYWcubWV0aG9kX25hbWV9IikpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBcewotICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsIFN0cmluZy5mb3JtYXQoTUlTTUFUQ0hfTE9HLCAie2ZsYWcubWV0aG9kX25hbWV9IiwgdmFsLCB7ZmxhZy5tZXRob2RfbmFtZX0pKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAodXNlTmV3U3RvcmFnZVZhbHVlQW5kRGlzY2FyZE9sZCkgXHsKLSAgICAgICAgICAgICAgICAgICAge2ZsYWcubWV0aG9kX25hbWV9ID0gdmFsOwotICAgICAgICAgICAgICAgIH0KLQote3sgLWVuZGlmIH19Ci17eyAtZW5kZm9yIH19Ci0gICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgXHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCBFUlJPUl9MT0csIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci17eyAtZW5kaWYgfX0KLXt7IC1lbmRpZiB9fQotICAgIH0KLXt7IGVuZGZvci0gfX0KLXt7IC1lbmRpZiB9fXsjLSBlbmQgb2YgcnVudGltZV9sb29rdXBfcmVxdWlyZWQgI30KLXt7IC1mb3IgZmxhZyBpbiBmbGFnX2VsZW1lbnRzIH19Ci0gICAgQE92ZXJyaWRlCi17eyAtaWYgbm90IGxpYnJhcnlfZXhwb3J0ZWQgfX0KLSAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCi0gICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKLXt7IC1lbmRpZiB9fQotICAgIHB1YmxpYyBib29sZWFuIHtmbGFnLm1ldGhvZF9uYW1lfSgpIFx7Ci17eyAtaWYgZmxhZy5pc19yZWFkX3dyaXRlIH19Ci0gICAgICAgIGlmICghe2ZsYWcuZGV2aWNlX2NvbmZpZ19uYW1lc3BhY2V9X2lzX2NhY2hlZCkgXHsKLSAgICAgICAgICAgIGxvYWRfb3ZlcnJpZGVzX3tmbGFnLmRldmljZV9jb25maWdfbmFtZXNwYWNlfSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB7ZmxhZy5tZXRob2RfbmFtZX07Ci17eyAtZWxzZSB9fQotICAgICAgICByZXR1cm4ge2ZsYWcuZGVmYXVsdF92YWx1ZX07Ci17eyAtZW5kaWYgfX0KLSAgICB9Ci17eyBlbmRmb3IgfX0KLX0KLXt7IGVsc2UgfX0KLXsjLSBHZW5lcmF0ZSBvbmx5IHN0dWIgaWYgaW4gdGVzdCBtb2RlICN9Ci0vKiogQGhpZGUgKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBGZWF0dXJlRmxhZ3NJbXBsIGltcGxlbWVudHMgRmVhdHVyZUZsYWdzIFx7Ci17eyBmb3IgZmxhZyBpbiBmbGFnX2VsZW1lbnRzIH19Ci0gICAgQE92ZXJyaWRlCi17eyAtaWYgbm90IGxpYnJhcnlfZXhwb3J0ZWQgfX0KLSAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCi17eyAtZW5kaWYgfX0KLSAgICBwdWJsaWMgYm9vbGVhbiB7ZmxhZy5tZXRob2RfbmFtZX0oKSBcewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAiTWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKLSAgICB9Ci17eyBlbmRmb3ItIH19Ci19Ci17eyBlbmRpZiB9fQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9GZWF0dXJlRmxhZ3NJbXBsLm5ld19zdG9yYWdlLmphdmEudGVtcGxhdGUgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0ZlYXR1cmVGbGFnc0ltcGwubmV3X3N0b3JhZ2UuamF2YS50ZW1wbGF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDkyYTgzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9GZWF0dXJlRmxhZ3NJbXBsLm5ld19zdG9yYWdlLmphdmEudGVtcGxhdGUKQEAgLTAsMCArMSw2MyBAQAorcGFja2FnZSB7cGFja2FnZV9uYW1lfTsgeyMtIENPREVHRU4gRk9SIElOVEVSTkFMIE1PREUgRk9SIE5FVyBTVE9SQUdFICN9CisvLyBUT0RPKGIvMzAzNzczMDU1KTogUmVtb3ZlIHRoZSBhbm5vdGF0aW9uIGFmdGVyIGFjY2VzcyBpc3N1ZSBpcyByZXNvbHZlZC4KK2ltcG9ydCBhbmRyb2lkLmNvbXBhdC5hbm5vdGF0aW9uLlVuc3VwcG9ydGVkQXBwVXNhZ2U7Cit7eyAtaWYgcnVudGltZV9sb29rdXBfcmVxdWlyZWQgfX0KK2ltcG9ydCBhbmRyb2lkLm9zLkJ1aWxkOwore3sgaWYgaXNfcGxhdGZvcm1fY29udGFpbmVyIH19CitpbXBvcnQgYW5kcm9pZC5vcy5mbGFnZ2luZy5QbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWw7Cit7eyAtZWxzZSB9fSB7Iy0gZWxzZSBpc19wbGF0Zm9ybV9jb250YWluZXIgI30KK2ltcG9ydCBhbmRyb2lkLm9zLmZsYWdnaW5nLkFjb25maWdQYWNrYWdlSW50ZXJuYWw7Cit7eyAtZW5kaWYgfX0geyMtIGVuZCBvZiBpc19wbGF0Zm9ybV9jb250YWluZXIjfQoraW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Cit7eyAtZW5kaWYgfX0geyMtIGVuZCBvZiBydW50aW1lX2xvb2t1cF9yZXF1aXJlZCN9CisvKiogQGhpZGUgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBGZWF0dXJlRmxhZ3NJbXBsIGltcGxlbWVudHMgRmVhdHVyZUZsYWdzIFx7Cit7eyAtaWYgcnVudGltZV9sb29rdXBfcmVxdWlyZWQgfX0KKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkZlYXR1cmVGbGFnc0ltcGwiOworICAgIHByaXZhdGUgc3RhdGljIHZvbGF0aWxlIGJvb2xlYW4gaXNDYWNoZWQgPSBmYWxzZTsKK3t7IGZvciBmbGFnIGluIGZsYWdfZWxlbWVudHMgfX0KK3t7IC1pZiBmbGFnLmlzX3JlYWRfd3JpdGUgfX0KKyAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHtmbGFnLm1ldGhvZF9uYW1lfSA9IHtmbGFnLmRlZmF1bHRfdmFsdWV9Owore3sgLWVuZGlmIH19IHsjLSBlbmQgb2YgaXNfcmVhZF93cml0ZSN9Cit7eyAtZW5kZm9yIH19IHsjLSBlbHNlIGZsYWdfZWxlbWVudHMgI30KKworICAgIHByaXZhdGUgdm9pZCBpbml0KCkgXHsKKyAgICAgICAgdHJ5IFx7Cit7eyBpZiBpc19wbGF0Zm9ybV9jb250YWluZXIgfX0KKyAgICAgICAgICAgIFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbCByZWFkZXIgPSBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwubG9hZCgie3BhY2thZ2VfbmFtZX0iLCB7cGFja2FnZV9maW5nZXJwcmludH0pOwore3sgLWVsc2UgfX0geyMtIGVsc2UgaXNfcGxhdGZvcm1fY29udGFpbmVyICN9CisgICAgICAgICAgICBBY29uZmlnUGFja2FnZUludGVybmFsIHJlYWRlciA9IEFjb25maWdQYWNrYWdlSW50ZXJuYWwubG9hZCgie3BhY2thZ2VfbmFtZX0iLCB7cGFja2FnZV9maW5nZXJwcmludH0pOwore3sgLWVuZGlmIH19IHsjLSBlbmQgb2YgaXNfcGxhdGZvcm1fY29udGFpbmVyI30KKyAgICAgICAge3sgLWZvciBuYW1lc3BhY2Vfd2l0aF9mbGFncyBpbiBuYW1lc3BhY2VfZmxhZ3MgfX0KKyAgICAgICAge3sgLWZvciBmbGFnIGluIG5hbWVzcGFjZV93aXRoX2ZsYWdzLmZsYWdzIH19CisgICAgICAgIHt7IC1pZiBmbGFnLmlzX3JlYWRfd3JpdGUgfX0KKyAgICAgICAgICAgIHtmbGFnLm1ldGhvZF9uYW1lfSA9IHJlYWRlci5nZXRCb29sZWFuRmxhZ1ZhbHVlKHtmbGFnLmZsYWdfb2Zmc2V0fSk7CisgICAgICAgIHt7IC1lbmRpZiB9fSB7Iy0gaXNfcmVhZF93cml0ZSN9CisgICAgICAgIHt7IC1lbmRmb3IgfX0geyMtIGVsc2UgbmFtZXNwYWNlX3dpdGhfZmxhZ3MuZmxhZ3MgI30KKyAgICAgICAge3sgLWVuZGZvciB9fSAgeyMtIGVsc2UgbmFtZXNwYWNlX2ZsYWdzICN9CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSBceworICAgICAgICAgICAgTG9nLmUoVEFHLCBlLnRvU3RyaW5nKCkpOworICAgICAgICB9IGNhdGNoIChMaW5rYWdlRXJyb3IgZSkgXHsKKyAgICAgICAgICAgIC8vIGZvciBtYWlubGluZSBtb2R1bGUgcnVubmluZyBvbiBvbGRlciBkZXZpY2VzLgorICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgcmVwbGFjZXMgdG8gdmVyc2lvbiBjaGVjaywgYWZ0ZXIgdGhlIHZlcnNpb24gYnVtcC4KKyAgICAgICAgICAgIExvZy5lKFRBRywgZS50b1N0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBpc0NhY2hlZCA9IHRydWU7CisgICAgfQore3sgLWVuZGlmIH19eyMtIGVuZCBvZiBydW50aW1lX2xvb2t1cF9yZXF1aXJlZCAjfQore3sgLWZvciBmbGFnIGluIGZsYWdfZWxlbWVudHMgfX0KKyAgICBAT3ZlcnJpZGUKKyAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCisgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICBwdWJsaWMgYm9vbGVhbiB7ZmxhZy5tZXRob2RfbmFtZX0oKSBcewore3sgLWlmIGZsYWcuaXNfcmVhZF93cml0ZSB9fQorICAgICAgICBpZiAoIWlzQ2FjaGVkKSBceworICAgICAgICAgICAgaW5pdCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB7ZmxhZy5tZXRob2RfbmFtZX07Cit7eyAtZWxzZSB9fXsjLSBlbHNlIGlzX3JlYWRfd3JpdGUgI30KKyAgICAgICAgcmV0dXJuIHtmbGFnLmRlZmF1bHRfdmFsdWV9Owore3sgLWVuZGlmIH19ICB7Iy0gZW5kIG9mIGlzX3JlYWRfd3JpdGUjfQorICAgIH0KK3t7IGVuZGZvciB9fSB7Iy0gZWxzZSBmbGFnX2VsZW1lbnRzICN9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0ZlYXR1cmVGbGFnc0ltcGwudGVzdF9tb2RlLmphdmEudGVtcGxhdGUgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0ZlYXR1cmVGbGFnc0ltcGwudGVzdF9tb2RlLmphdmEudGVtcGxhdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVkYTI2MwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvRmVhdHVyZUZsYWdzSW1wbC50ZXN0X21vZGUuamF2YS50ZW1wbGF0ZQpAQCAtMCwwICsxLDE0IEBACitwYWNrYWdlIHtwYWNrYWdlX25hbWV9OyB7Iy0gQ09ERUdFTiBGT1IgVEVTVCBNT0RFICN9CisvKiogQGhpZGUgKi8KK3B1YmxpYyBmaW5hbCBjbGFzcyBGZWF0dXJlRmxhZ3NJbXBsIGltcGxlbWVudHMgRmVhdHVyZUZsYWdzIFx7Cit7eyBmb3IgZmxhZyBpbiBmbGFnX2VsZW1lbnRzIH19CisgICAgQE92ZXJyaWRlCit7eyAtaWYgbm90IGxpYnJhcnlfZXhwb3J0ZWQgfX0KKyAgICBAY29tLmFuZHJvaWQuYWNvbmZpZy5hbm5vdGF0aW9ucy5BY29uZmlnRmxhZ0FjY2Vzc29yCit7eyAtZW5kaWYgfX0KKyAgICBwdWJsaWMgYm9vbGVhbiB7ZmxhZy5tZXRob2RfbmFtZX0oKSBceworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCisgICAgICAgICAgICAiTWV0aG9kIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKKyAgICB9Cit7eyBlbmRmb3ItIH19Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0ZsYWdzLmphdmEudGVtcGxhdGUgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL0ZsYWdzLmphdmEudGVtcGxhdGUKaW5kZXggZTJmNzBiOS4uOGE5MmQzMyAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9GbGFncy5qYXZhLnRlbXBsYXRlCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvRmxhZ3MuamF2YS50ZW1wbGF0ZQpAQCAtMyw3ICszLDE2IEBACiAvLyBUT0RPKGIvMzAzNzczMDU1KTogUmVtb3ZlIHRoZSBhbm5vdGF0aW9uIGFmdGVyIGFjY2VzcyBpc3N1ZSBpcyByZXNvbHZlZC4KIGltcG9ydCBhbmRyb2lkLmNvbXBhdC5hbm5vdGF0aW9uLlVuc3VwcG9ydGVkQXBwVXNhZ2U7CiB7eyAtZW5kaWYgfX0KK3t7IC1pZiBzaW5nbGVfZXhwb3J0ZWRfZmlsZSB9fQore3sgLWlmIGxpYnJhcnlfZXhwb3J0ZWQgfX0KKy8qKgorICogQGRlcHJlY2F0ZWQgVXNlIFx7QGxpbmsgRXhwb3J0ZWRGbGFnc30gaW5zdGVhZC4KKyAqLworQERlcHJlY2F0ZWQgeyMtIFBSRUZFUiBFeHBvcnRlZEZsYWdzICN9Cit7eyAtZW5kaWYgfX0KK3t7IC1lbHNlIH19CiAvKiogQGhpZGUgKi8KK3t7IC1lbmRpZiB9fQogcHVibGljIGZpbmFsIGNsYXNzIEZsYWdzIFx7CiB7eyAtZm9yIGl0ZW0gaW4gZmxhZ19lbGVtZW50c319CiAgICAgLyoqIEBoaWRlICovCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL2NwcF9leHBvcnRlZF9oZWFkZXIudGVtcGxhdGUgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL2NwcF9leHBvcnRlZF9oZWFkZXIudGVtcGxhdGUKaW5kZXggMGY3ODUzZS4uZjZmNTc2YSAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9jcHBfZXhwb3J0ZWRfaGVhZGVyLnRlbXBsYXRlCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvY3BwX2V4cG9ydGVkX2hlYWRlci50ZW1wbGF0ZQpAQCAtMjcsMTIgKzI3LDEzIEBACiAgICAge3sgLWZvciBpdGVtIGluIGNsYXNzX2VsZW1lbnRzfX0KICAgICB2aXJ0dWFsIGJvb2wge2l0ZW0uZmxhZ19uYW1lfSgpID0gMDsKIAotICAgIHt7IC1pZiBpc190ZXN0X21vZGUgfX0KLSAgICB2aXJ0dWFsIHZvaWQge2l0ZW0uZmxhZ19uYW1lfShib29sIHZhbCkgPSAwOwotICAgIHt7IC1lbmRpZiB9fQogICAgIHt7IC1lbmRmb3IgfX0KIAogICAgIHt7IC1pZiBpc190ZXN0X21vZGUgfX0KKyAgICB7eyAtZm9yIGl0ZW0gaW4gY2xhc3NfZWxlbWVudHN9fQorICAgIHZpcnR1YWwgdm9pZCB7aXRlbS5mbGFnX25hbWV9KGJvb2wgdmFsKSA9IDA7CisgICAge3sgLWVuZGZvciB9fQorCiAgICAgdmlydHVhbCB2b2lkIHJlc2V0X2ZsYWdzKCkgXHt9CiAgICAge3sgLWVuZGlmIH19CiB9OwpAQCAtNDAsNiArNDEsNyBAQAogZXh0ZXJuIHN0ZDo6dW5pcXVlX3B0cjxmbGFnX3Byb3ZpZGVyX2ludGVyZmFjZT4gcHJvdmlkZXJfOwogCiB7eyBmb3IgaXRlbSBpbiBjbGFzc19lbGVtZW50c319Cit7eyBpZiBub3QgaXNfdGVzdF9tb2RlIH19e3sgaWYgaXRlbS5pc19maXhlZF9yZWFkX29ubHkgfX1jb25zdGV4cHIge3sgZW5kaWYgfX17eyBlbmRpZiAtfX0KIGlubGluZSBib29sIHtpdGVtLmZsYWdfbmFtZX0oKSBcewogICAgIHt7IC1pZiBpc190ZXN0X21vZGUgfX0KICAgICByZXR1cm4gcHJvdmlkZXJfLT57aXRlbS5mbGFnX25hbWV9KCk7CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL2NwcF9zb3VyY2VfZmlsZS50ZW1wbGF0ZSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvY3BwX3NvdXJjZV9maWxlLnRlbXBsYXRlCmluZGV4IGI2MDEyZTcuLjM2YWI3NzQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvY3BwX3NvdXJjZV9maWxlLnRlbXBsYXRlCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvY3BwX3NvdXJjZV9maWxlLnRlbXBsYXRlCkBAIC0xLDE4ICsxLDEzIEBACiAjaW5jbHVkZSAie2hlYWRlcn0uaCIKIAote3sgaWYgYWxsb3dfaW5zdHJ1bWVudGF0aW9uIH19CiB7eyBpZiByZWFkd3JpdGUtIH19Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KICNpbmNsdWRlICJhY29uZmlnX3N0b3JhZ2UvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpLmhwcCIKICNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPgogI2RlZmluZSBMT0dfVEFHICJhY29uZmlnX2NwcF9jb2RlZ2VuIgotI2RlZmluZSBBTE9HSSguLi4pIF9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfSU5GTywgTE9HX1RBRywgX19WQV9BUkdTX18pCisjZGVmaW5lIEFMT0dFKC4uLikgX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19FUlJPUiwgTE9HX1RBRywgX19WQV9BUkdTX18pCiB7eyAtZW5kaWYgfX0KLXt7IGVuZGlmIH19CiAKLXt7IGlmIHJlYWR3cml0ZS0gfX0KLSNpbmNsdWRlIDxzZXJ2ZXJfY29uZmlndXJhYmxlX2ZsYWdzL2dldF9mbGFncy5oPgote3sgZW5kaWYgfX0KIHt7IGlmIGlzX3Rlc3RfbW9kZSB9fQogI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiAjaW5jbHVkZSA8c3RyaW5nPgpAQCAtMjksNzUgKzI0LDQzIEBACiAgICAgcHJpdmF0ZToKICAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBib29sPiBvdmVycmlkZXNfOwogCisgICAge3sgaWYgcmVhZHdyaXRlLSB9fQorICAgICAgICB1aW50MzJfdCBib29sZWFuX3N0YXJ0X2luZGV4XzsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8YWNvbmZpZ19zdG9yYWdlOjpNYXBwZWRTdG9yYWdlRmlsZT4gZmxhZ192YWx1ZV9maWxlXzsKKworICAgICAgICBib29sIHBhY2thZ2VfZXhpc3RzX2luX3N0b3JhZ2VfOworICAgIHt7IC1lbmRpZiB9fQorCiAgICAgcHVibGljOgorICAgIHt7IGlmIHJlYWR3cml0ZS0gfX0KICAgICAgICAgZmxhZ19wcm92aWRlcigpCiAgICAgICAgICAgICA6IG92ZXJyaWRlc18oKQotICAgICAgICBce30KLQote3sgZm9yIGl0ZW0gaW4gY2xhc3NfZWxlbWVudHMgfX0KLSAgICAgICAgdmlydHVhbCBib29sIHtpdGVtLmZsYWdfbmFtZX0oKSBvdmVycmlkZSBcewotICAgICAgICAgICAgYXV0byBpdCA9IG92ZXJyaWRlc18uZmluZCgie2l0ZW0uZmxhZ19uYW1lfSIpOwotICAgICAgICAgICAgICBpZiAoaXQgIT0gb3ZlcnJpZGVzXy5lbmQoKSkgXHsKLSAgICAgICAgICAgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOwotICAgICAgICAgICAgfSBlbHNlIFx7Ci0gICAgICAgICAgICAgIHt7IGlmIGl0ZW0ucmVhZHdyaXRlLSB9fQotICAgICAgICAgICAgICByZXR1cm4gc2VydmVyX2NvbmZpZ3VyYWJsZV9mbGFnczo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKLSAgICAgICAgICAgICAgICAgICJhY29uZmlnX2ZsYWdzLntpdGVtLmRldmljZV9jb25maWdfbmFtZXNwYWNlfSIsCi0gICAgICAgICAgICAgICAgICAie2l0ZW0uZGV2aWNlX2NvbmZpZ19mbGFnfSIsCi0gICAgICAgICAgICAgICAgICAie2l0ZW0uZGVmYXVsdF92YWx1ZX0iKSA9PSAidHJ1ZSI7Ci0gICAgICAgICAgICAgIHt7IC1lbHNlIH19Ci0gICAgICAgICAgICAgICAgICByZXR1cm4ge2l0ZW0uZGVmYXVsdF92YWx1ZX07Ci0gICAgICAgICAgICAgIHt7IC1lbmRpZiB9fQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkIHtpdGVtLmZsYWdfbmFtZX0oYm9vbCB2YWwpIG92ZXJyaWRlIFx7Ci0gICAgICAgICAgICBvdmVycmlkZXNfWyJ7aXRlbS5mbGFnX25hbWV9Il0gPSB2YWw7Ci0gICAgICAgIH0KLXt7IGVuZGZvciB9fQotCi0gICAgICAgIHZpcnR1YWwgdm9pZCByZXNldF9mbGFncygpIG92ZXJyaWRlIFx7Ci0gICAgICAgICAgICBvdmVycmlkZXNfLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi17eyAtZWxzZS0gfX0KLQotICAgIGNsYXNzIGZsYWdfcHJvdmlkZXIgOiBwdWJsaWMgZmxhZ19wcm92aWRlcl9pbnRlcmZhY2UgXHsKLSAgICBwdWJsaWM6Ci0KLSAgICAgICAge3sgaWYgYWxsb3dfaW5zdHJ1bWVudGF0aW9uLSB9fQotICAgICAgICB7eyBpZiByZWFkd3JpdGUtIH19Ci0gICAgICAgIGZsYWdfcHJvdmlkZXIoKQotICAgICAgICAgICAge3sgaWYgcmVhZHdyaXRlLSB9fQotICAgICAgICAgICAgOiBjYWNoZV8oe3JlYWR3cml0ZV9jb3VudH0sIC0xKQogICAgICAgICAgICAgLCBib29sZWFuX3N0YXJ0X2luZGV4XygpCi0gICAgICAgICAgICB7eyAtZWxzZS0gfX0KLSAgICAgICAgICAgIDogYm9vbGVhbl9zdGFydF9pbmRleF8oKQotICAgICAgICAgICAge3sgLWVuZGlmIH19CiAgICAgICAgICAgICAsIGZsYWdfdmFsdWVfZmlsZV8obnVsbHB0cikKLSAgICAgICAgICAgICwgcmVhZF9mcm9tX25ld19zdG9yYWdlXyhmYWxzZSkKLSAgICAgICAgICAgICwgdXNlX25ld19zdG9yYWdlX3ZhbHVlKGZhbHNlKSBcewotCi0gICAgICAgICAgICBzdHJ1Y3Qgc3RhdCBidWZmZXI7Ci0gICAgICAgICAgICBpZiAoc3RhdCgiL21ldGFkYXRhL2Fjb25maWdfdGVzdF9taXNzaW9ucy9taXNzaW9uXzEiLCAmYnVmZmVyKSA9PSAwKSBcewotICAgICAgICAgICAgICAgcmVhZF9mcm9tX25ld19zdG9yYWdlXyA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgXHsKLSAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICwgcGFja2FnZV9leGlzdHNfaW5fc3RvcmFnZV8odHJ1ZSkgXHsKIAogICAgICAgICAgICAgYXV0byBwYWNrYWdlX21hcF9maWxlID0gYWNvbmZpZ19zdG9yYWdlOjpnZXRfbWFwcGVkX2ZpbGUoCiAgICAgICAgICAgICAgICAgICJ7Y29udGFpbmVyfSIsCiAgICAgICAgICAgICAgICAgIGFjb25maWdfc3RvcmFnZTo6U3RvcmFnZUZpbGVUeXBlOjpwYWNrYWdlX21hcCk7CisKICAgICAgICAgICAgIGlmICghcGFja2FnZV9tYXBfZmlsZS5vaygpKSBcewotICAgICAgICAgICAgICAgIEFMT0dJKCJlcnJvcjogZmFpbGVkIHRvIGdldCBwYWNrYWdlIG1hcCBmaWxlOiAlcyIsIHBhY2thZ2VfbWFwX2ZpbGUuZXJyb3IoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZXJyb3I6IGZhaWxlZCB0byBnZXQgcGFja2FnZSBtYXAgZmlsZTogJXMiLCBwYWNrYWdlX21hcF9maWxlLmVycm9yKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcGFja2FnZV9leGlzdHNfaW5fc3RvcmFnZV8gPSBmYWxzZTsKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGF1dG8gY29udGV4dCA9IGFjb25maWdfc3RvcmFnZTo6Z2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KAogICAgICAgICAgICAgICAgICoqcGFja2FnZV9tYXBfZmlsZSwgIntwYWNrYWdlfSIpOworCiAgICAgICAgICAgICBpZiAoIWNvbnRleHQub2soKSkgXHsKLSAgICAgICAgICAgICAgICBBTE9HSSgiZXJyb3I6IGZhaWxlZCB0byBnZXQgcGFja2FnZSByZWFkIGNvbnRleHQ6ICVzIiwgY29udGV4dC5lcnJvcigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIEFMT0dFKCJlcnJvcjogZmFpbGVkIHRvIGdldCBwYWNrYWdlIHJlYWQgY29udGV4dDogJXMiLCBjb250ZXh0LmVycm9yKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcGFja2FnZV9leGlzdHNfaW5fc3RvcmFnZV8gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghKGNvbnRleHQtPnBhY2thZ2VfZXhpc3RzKSkgXHsKKyAgICAgICAgICAgICAgICBwYWNrYWdlX2V4aXN0c19pbl9zdG9yYWdlXyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIApAQCAtMTExLDcgKzc0LDggQEAKICAgICAgICAgICAgICAgICAie2NvbnRhaW5lcn0iLAogICAgICAgICAgICAgICAgIGFjb25maWdfc3RvcmFnZTo6U3RvcmFnZUZpbGVUeXBlOjpmbGFnX3ZhbCk7CiAgICAgICAgICAgICBpZiAoIWZsYWdfdmFsdWVfZmlsZS5vaygpKSBcewotICAgICAgICAgICAgICAgIEFMT0dJKCJlcnJvcjogZmFpbGVkIHRvIGdldCBmbGFnIHZhbHVlIGZpbGU6ICVzIiwgZmxhZ192YWx1ZV9maWxlLmVycm9yKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgQUxPR0UoImVycm9yOiBmYWlsZWQgdG8gZ2V0IGZsYWcgdmFsdWUgZmlsZTogJXMiLCBmbGFnX3ZhbHVlX2ZpbGUuZXJyb3IoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBwYWNrYWdlX2V4aXN0c19pbl9zdG9yYWdlXyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KIApAQCAtMTE5LDMwICs4MywyMiBAQAogICAgICAgICAgICAgZmxhZ192YWx1ZV9maWxlXyA9IHN0ZDo6dW5pcXVlX3B0cjxhY29uZmlnX3N0b3JhZ2U6Ok1hcHBlZFN0b3JhZ2VGaWxlPigKICAgICAgICAgICAgICAgICAqZmxhZ192YWx1ZV9maWxlKTsKIAotICAgICAgICAgICAgdXNlX25ld19zdG9yYWdlX3ZhbHVlID0gc2VydmVyX2NvbmZpZ3VyYWJsZV9mbGFnczo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKLSAgICAgICAgICAgICAgICAiYWNvbmZpZ19mbGFncy5jb3JlX2V4cGVyaW1lbnRzX3RlYW1faW50ZXJuYWwiLAotICAgICAgICAgICAgICAgICJjb20uYW5kcm9pZC5wcm92aWRlcnMuc2V0dGluZ3MudXNlX25ld19zdG9yYWdlX3ZhbHVlIiwKLSAgICAgICAgICAgICAgICAiZmFsc2UiKSA9PSAidHJ1ZSI7CiAgICAgICAgIH0KLSAgICAgICAge3sgLWVuZGlmIH19Ci0gICAgICAgIHt7IC1lbmRpZiB9fQorICAgIHt7IC1lbHNlIH19CisgICAgICAgIGZsYWdfcHJvdmlkZXIoKQorICAgICAgICAgICAgOiBvdmVycmlkZXNfKCkKKyAgICAgICAgXHt9CisgICAge3sgLWVuZGlmIH19CiAKLSAgICAgICAge3sgLWZvciBpdGVtIGluIGNsYXNzX2VsZW1lbnRzIH19CisgICAge3sgZm9yIGl0ZW0gaW4gY2xhc3NfZWxlbWVudHMgfX0KICAgICAgICAgdmlydHVhbCBib29sIHtpdGVtLmZsYWdfbmFtZX0oKSBvdmVycmlkZSBcewotICAgICAgICAgICAge3sgLWlmIGl0ZW0ucmVhZHdyaXRlIH19Ci0gICAgICAgICAgICBpZiAoY2FjaGVfW3tpdGVtLnJlYWR3cml0ZV9pZHh9XSA9PSAtMSkgXHsKLSAgICAgICAgICAgICAgICBjYWNoZV9be2l0ZW0ucmVhZHdyaXRlX2lkeH1dID0gc2VydmVyX2NvbmZpZ3VyYWJsZV9mbGFnczo6R2V0U2VydmVyQ29uZmlndXJhYmxlRmxhZygKLSAgICAgICAgICAgICAgICAgICAgImFjb25maWdfZmxhZ3Mue2l0ZW0uZGV2aWNlX2NvbmZpZ19uYW1lc3BhY2V9IiwKLSAgICAgICAgICAgICAgICAgICAgIntpdGVtLmRldmljZV9jb25maWdfZmxhZ30iLAotICAgICAgICAgICAgICAgICAgICAie2l0ZW0uZGVmYXVsdF92YWx1ZX0iKSA9PSAidHJ1ZSI7Ci0gICAgICAgICAgICB9Ci0KLQotICAgICAgICAgICAge3sgaWYgYWxsb3dfaW5zdHJ1bWVudGF0aW9uLSB9fQotICAgICAgICAgICAgaWYgKHJlYWRfZnJvbV9uZXdfc3RvcmFnZV8pIFx7Ci0gICAgICAgICAgICAgICAgaWYgKCFmbGFnX3ZhbHVlX2ZpbGVfKSBcewotICAgICAgICAgICAgICAgICAgICBBTE9HSSgiZXJyb3I6IGZhaWxlZCB0byBnZXQgZmxhZyB7aXRlbS5mbGFnX25hbWV9OiBmbGFnIHZhbHVlIGZpbGUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGVfW3tpdGVtLnJlYWR3cml0ZV9pZHh9XTsKKyAgICAgICAgICAgIGF1dG8gaXQgPSBvdmVycmlkZXNfLmZpbmQoIntpdGVtLmZsYWdfbmFtZX0iKTsKKyAgICAgICAgICAgIGlmIChpdCAhPSBvdmVycmlkZXNfLmVuZCgpKSBceworICAgICAgICAgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgICAgICAgICAgfSBlbHNlIFx7CisgICAgICAgICAgICAgICAge3sgaWYgaXRlbS5yZWFkd3JpdGUtIH19CisgICAgICAgICAgICAgICAgaWYgKCFwYWNrYWdlX2V4aXN0c19pbl9zdG9yYWdlXykgXHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtpdGVtLmRlZmF1bHRfdmFsdWV9OwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGF1dG8gdmFsdWUgPSBhY29uZmlnX3N0b3JhZ2U6OmdldF9ib29sZWFuX2ZsYWdfdmFsdWUoCkBAIC0xNTAsMjUgKzEwNiwxMDIgQEAKICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleF8gKyB7aXRlbS5mbGFnX29mZnNldH0pOwogCiAgICAgICAgICAgICAgICAgaWYgKCF2YWx1ZS5vaygpKSBcewotICAgICAgICAgICAgICAgICAgICBBTE9HSSgiZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgdmFsdWU6ICVzIiwgdmFsdWUuZXJyb3IoKS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlX1t7aXRlbS5yZWFkd3JpdGVfaWR4fV07Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYm9vbCBleHBlY3RlZF92YWx1ZSA9IGNhY2hlX1t7aXRlbS5yZWFkd3JpdGVfaWR4fV07Ci0gICAgICAgICAgICAgICAgaWYgKCp2YWx1ZSAhPSBleHBlY3RlZF92YWx1ZSkgXHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0koImVycm9yOiB7aXRlbS5mbGFnX25hbWV9IHZhbHVlIG1pc21hdGNoLCBuZXcgc3RvcmFnZSB2YWx1ZSBpcyAlcywgb2xkIHN0b3JhZ2UgdmFsdWUgaXMgJXMiLAotICAgICAgICAgICAgICAgICAgICAqdmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiLCBleHBlY3RlZF92YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICh1c2VfbmV3X3N0b3JhZ2VfdmFsdWUpIFx7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAqdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyB2YWx1ZTogJXMiLCB2YWx1ZS5lcnJvcigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4ge2l0ZW0uZGVmYXVsdF92YWx1ZX07CiAgICAgICAgICAgICAgICAgfSBlbHNlIFx7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBleHBlY3RlZF92YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICp2YWx1ZTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAge3sgLWVsc2UgfX0KKyAgICAgICAgICAgICAgICByZXR1cm4ge2l0ZW0uZGVmYXVsdF92YWx1ZX07CisgICAgICAgICAgICAgICAge3sgLWVuZGlmIH19CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB7eyAtZW5kaWYgfX0KKyAgICAgICAgfQogCisgICAgICAgIHZpcnR1YWwgdm9pZCB7aXRlbS5mbGFnX25hbWV9KGJvb2wgdmFsKSBvdmVycmlkZSBceworICAgICAgICAgICAgb3ZlcnJpZGVzX1sie2l0ZW0uZmxhZ19uYW1lfSJdID0gdmFsOworICAgICAgICB9CisgICAge3sgZW5kZm9yIH19CiAKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlc2V0X2ZsYWdzKCkgb3ZlcnJpZGUgXHsKKyAgICAgICAgICAgIG92ZXJyaWRlc18uY2xlYXIoKTsKKyAgICAgICAgfQorICAgIH07CisKK3t7IC1lbHNlLSB9fQorCisgICAgY2xhc3MgZmxhZ19wcm92aWRlciA6IHB1YmxpYyBmbGFnX3Byb3ZpZGVyX2ludGVyZmFjZSBceworICAgIHB1YmxpYzoKKworICAgICAgICB7eyBpZiByZWFkd3JpdGUtIH19CisgICAgICAgIGZsYWdfcHJvdmlkZXIoKQorICAgICAgICAgICAgOiBjYWNoZV8oe3JlYWR3cml0ZV9jb3VudH0sIC0xKQorICAgICAgICAgICAgLCBib29sZWFuX3N0YXJ0X2luZGV4XygpCisgICAgICAgICAgICAsIGZsYWdfdmFsdWVfZmlsZV8obnVsbHB0cikKKyAgICAgICAgICAgICwgcGFja2FnZV9leGlzdHNfaW5fc3RvcmFnZV8odHJ1ZSkgXHsKKworICAgICAgICAgICAgYXV0byBwYWNrYWdlX21hcF9maWxlID0gYWNvbmZpZ19zdG9yYWdlOjpnZXRfbWFwcGVkX2ZpbGUoCisgICAgICAgICAgICAgICAgICJ7Y29udGFpbmVyfSIsCisgICAgICAgICAgICAgICAgIGFjb25maWdfc3RvcmFnZTo6U3RvcmFnZUZpbGVUeXBlOjpwYWNrYWdlX21hcCk7CisgICAgICAgICAgICBpZiAoIXBhY2thZ2VfbWFwX2ZpbGUub2soKSkgXHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZXJyb3I6IGZhaWxlZCB0byBnZXQgcGFja2FnZSBtYXAgZmlsZTogJXMiLCBwYWNrYWdlX21hcF9maWxlLmVycm9yKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcGFja2FnZV9leGlzdHNfaW5fc3RvcmFnZV8gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGF1dG8gY29udGV4dCA9IGFjb25maWdfc3RvcmFnZTo6Z2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KAorICAgICAgICAgICAgICAgICoqcGFja2FnZV9tYXBfZmlsZSwgIntwYWNrYWdlfSIpOworICAgICAgICAgICAgaWYgKCFjb250ZXh0Lm9rKCkpIFx7CisgICAgICAgICAgICAgICAgQUxPR0UoImVycm9yOiBmYWlsZWQgdG8gZ2V0IHBhY2thZ2UgcmVhZCBjb250ZXh0OiAlcyIsIGNvbnRleHQuZXJyb3IoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBwYWNrYWdlX2V4aXN0c19pbl9zdG9yYWdlXyA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCEoY29udGV4dC0+cGFja2FnZV9leGlzdHMpKSBceworICAgICAgICAgICAgICAgIHBhY2thZ2VfZXhpc3RzX2luX3N0b3JhZ2VfID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjYWNoZSBwYWNrYWdlIGJvb2xlYW4gZmxhZyBzdGFydCBpbmRleAorICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleF8gPSBjb250ZXh0LT5ib29sZWFuX3N0YXJ0X2luZGV4OworCisgICAgICAgICAgICAvLyB1bm1hcCBwYWNrYWdlIG1hcCBmaWxlIGFuZCBmcmVlIG1lbW9yeQorICAgICAgICAgICAgZGVsZXRlICpwYWNrYWdlX21hcF9maWxlOworCisgICAgICAgICAgICBhdXRvIGZsYWdfdmFsdWVfZmlsZSA9IGFjb25maWdfc3RvcmFnZTo6Z2V0X21hcHBlZF9maWxlKAorICAgICAgICAgICAgICAgICJ7Y29udGFpbmVyfSIsCisgICAgICAgICAgICAgICAgYWNvbmZpZ19zdG9yYWdlOjpTdG9yYWdlRmlsZVR5cGU6OmZsYWdfdmFsKTsKKyAgICAgICAgICAgIGlmICghZmxhZ192YWx1ZV9maWxlLm9rKCkpIFx7CisgICAgICAgICAgICAgICAgQUxPR0UoImVycm9yOiBmYWlsZWQgdG8gZ2V0IGZsYWcgdmFsdWUgZmlsZTogJXMiLCBmbGFnX3ZhbHVlX2ZpbGUuZXJyb3IoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBwYWNrYWdlX2V4aXN0c19pbl9zdG9yYWdlXyA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY2FjaGUgZmxhZyB2YWx1ZSBmaWxlCisgICAgICAgICAgICBmbGFnX3ZhbHVlX2ZpbGVfID0gc3RkOjp1bmlxdWVfcHRyPGFjb25maWdfc3RvcmFnZTo6TWFwcGVkU3RvcmFnZUZpbGU+KAorICAgICAgICAgICAgICAgICpmbGFnX3ZhbHVlX2ZpbGUpOworCisgICAgICAgIH0KKyAgICAgICAge3sgLWVuZGlmIH19CisKKyAgICAgICAge3sgLWZvciBpdGVtIGluIGNsYXNzX2VsZW1lbnRzIH19CisgICAgICAgIHZpcnR1YWwgYm9vbCB7aXRlbS5mbGFnX25hbWV9KCkgb3ZlcnJpZGUgXHsKKyAgICAgICAgICAgIHt7IC1pZiBpdGVtLnJlYWR3cml0ZSB9fQorICAgICAgICAgICAgaWYgKGNhY2hlX1t7aXRlbS5yZWFkd3JpdGVfaWR4fV0gPT0gLTEpIFx7CisgICAgICAgICAgICAgICAgaWYgKCFwYWNrYWdlX2V4aXN0c19pbl9zdG9yYWdlXykgXHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHtpdGVtLmRlZmF1bHRfdmFsdWV9OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGF1dG8gdmFsdWUgPSBhY29uZmlnX3N0b3JhZ2U6OmdldF9ib29sZWFuX2ZsYWdfdmFsdWUoCisgICAgICAgICAgICAgICAgICAgICpmbGFnX3ZhbHVlX2ZpbGVfLAorICAgICAgICAgICAgICAgICAgICBib29sZWFuX3N0YXJ0X2luZGV4XyArIHtpdGVtLmZsYWdfb2Zmc2V0fSk7CisKKyAgICAgICAgICAgICAgICBpZiAoIXZhbHVlLm9rKCkpIFx7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyB2YWx1ZTogJXMiLCB2YWx1ZS5lcnJvcigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4ge2l0ZW0uZGVmYXVsdF92YWx1ZX07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FjaGVfW3tpdGVtLnJlYWR3cml0ZV9pZHh9XSA9ICp2YWx1ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBjYWNoZV9be2l0ZW0ucmVhZHdyaXRlX2lkeH1dOwogICAgICAgICAgICAge3sgLWVsc2UgfX0KICAgICAgICAgICAgIHt7IC1pZiBpdGVtLmlzX2ZpeGVkX3JlYWRfb25seSB9fQpAQCAtMTgzLDE0ICsyMTYsMTIgQEAKICAgICB7eyBpZiByZWFkd3JpdGUtIH19CiAgICAgcHJpdmF0ZToKICAgICAgICAgc3RkOjp2ZWN0b3I8aW50OF90PiBjYWNoZV8gPSBzdGQ6OnZlY3RvcjxpbnQ4X3Q+KHtyZWFkd3JpdGVfY291bnR9LCAtMSk7Ci0gICAge3sgaWYgYWxsb3dfaW5zdHJ1bWVudGF0aW9uLSB9fQorCiAgICAgICAgIHVpbnQzMl90IGJvb2xlYW5fc3RhcnRfaW5kZXhfOwogCiAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxhY29uZmlnX3N0b3JhZ2U6Ok1hcHBlZFN0b3JhZ2VGaWxlPiBmbGFnX3ZhbHVlX2ZpbGVfOwogCi0gICAgICAgIGJvb2wgcmVhZF9mcm9tX25ld19zdG9yYWdlXzsKLSAgICAgICAgYm9vbCB1c2VfbmV3X3N0b3JhZ2VfdmFsdWU7Ci0gICAge3sgLWVuZGlmIH19CisgICAgICAgIGJvb2wgcGFja2FnZV9leGlzdHNfaW5fc3RvcmFnZV87CiAgICAge3sgLWVuZGlmIH19CiAKICAgICB9OwpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9ydXN0LnRlbXBsYXRlIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9ydXN0LnRlbXBsYXRlCmluZGV4IGVhMWM2MDAuLjU2MzIzZTIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZW1wbGF0ZXMvcnVzdC50ZW1wbGF0ZQorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL3J1c3QudGVtcGxhdGUKQEAgLTUsMTUgKzUsMTAgQEAKIHVzZSBzdGQ6OnN5bmM6OkxhenlMb2NrOwogdXNlIGxvZzo6XHtsb2csIExldmVsRmlsdGVyLCBMZXZlbH07CiAKLXN0YXRpYyBTVE9SQUdFX01JR1JBVElPTl9NQVJLRVJfRklMRTogJnN0ciA9Ci0gICAgIi9tZXRhZGF0YS9hY29uZmlnX3Rlc3RfbWlzc2lvbnMvbWlzc2lvbl8xIjsKLXN0YXRpYyBNSUdSQVRJT05fTE9HX1RBRzogJnN0ciA9ICJBY29uZmlnVGVzdE1pc3Npb24xIjsKLQogLy8vIGZsYWcgcHJvdmlkZXIKIHB1YiBzdHJ1Y3QgRmxhZ1Byb3ZpZGVyOwogCiB7eyBpZiBoYXNfcmVhZHdyaXRlLSB9fQote3sgaWYgYWxsb3dfaW5zdHJ1bWVudGF0aW9uIH19CiBzdGF0aWMgUEFDS0FHRV9PRkZTRVQ6IExhenlMb2NrPFJlc3VsdDxPcHRpb248dTMyPiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4+ID0gTGF6eUxvY2s6Om5ldyh8fCB1bnNhZmUgXHsKICAgICBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSgie2NvbnRhaW5lcn0iLCBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXApCiAgICAgLmFuZF90aGVuKHxwYWNrYWdlX21hcHwgZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX21hcCwgIntwYWNrYWdlfSIpKQpAQCAtMjMsODEgKzE4LDUwIEBACiBzdGF0aWMgRkxBR19WQUxfTUFQOiBMYXp5TG9jazxSZXN1bHQ8TW1hcCwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4+ID0gTGF6eUxvY2s6Om5ldyh8fCB1bnNhZmUgXHsKICAgICBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSgie2NvbnRhaW5lcn0iLCBTdG9yYWdlRmlsZVR5cGU6OkZsYWdWYWwpCiB9KTsKLXt7IC1lbmRpZiB9fQoge3sgLWZvciBmbGFnIGluIHRlbXBsYXRlX2ZsYWdzIH19CiAKIHt7IC1pZiBmbGFnLnJlYWR3cml0ZSB9fQogLy8vIGZsYWcgdmFsdWUgY2FjaGUgZm9yIHtmbGFnLm5hbWV9Ci17eyBpZiBhbGxvd19pbnN0cnVtZW50YXRpb24gfX0KIHN0YXRpYyBDQUNIRURfe2ZsYWcubmFtZX06IExhenlMb2NrPGJvb2w+ID0gTGF6eUxvY2s6Om5ldyh8fCBcewotICAgIGxldCByZXN1bHQgPSBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAotICAgICAgICAiYWNvbmZpZ19mbGFncy57ZmxhZy5kZXZpY2VfY29uZmlnX25hbWVzcGFjZX0iLAotICAgICAgICAie2ZsYWcuZGV2aWNlX2NvbmZpZ19mbGFnfSIsCi0gICAgICAgICJ7ZmxhZy5kZWZhdWx0X3ZhbHVlfSIpID09ICJ0cnVlIjsKIAotICAgIGxldCB1c2VfbmV3X3N0b3JhZ2VfdmFsdWUgPSBmbGFnc19ydXN0OjpHZXRTZXJ2ZXJDb25maWd1cmFibGVGbGFnKAotICAgICAgICAiYWNvbmZpZ19mbGFncy5jb3JlX2V4cGVyaW1lbnRzX3RlYW1faW50ZXJuYWwiLAotICAgICAgICAiY29tLmFuZHJvaWQucHJvdmlkZXJzLnNldHRpbmdzLnVzZV9uZXdfc3RvcmFnZV92YWx1ZSIsCi0gICAgICAgICJmYWxzZSIpID09ICJ0cnVlIjsKKyAgICAvLyBUaGlzIHdpbGwgYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiBTdWJzZXF1ZW50IGNhbGxzIGFmdGVyIHRoZSBmaXJzdCBhcmUgbm9vcHMuCisgICAgbG9nZ2VyOjppbml0KAorICAgICAgICBsb2dnZXI6OkNvbmZpZzo6ZGVmYXVsdCgpCisgICAgICAgICAgICAud2l0aF90YWdfb25fZGV2aWNlKCJhY29uZmlnX3J1c3RfY29kZWdlbiIpCisgICAgICAgICAgICAud2l0aF9tYXhfbGV2ZWwoTGV2ZWxGaWx0ZXI6OkluZm8pKTsKIAotICAgIGlmIFBhdGg6Om5ldyhTVE9SQUdFX01JR1JBVElPTl9NQVJLRVJfRklMRSkuZXhpc3RzKCkgXHsKLSAgICAgICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gU3Vic2VxdWVudCBjYWxscyBhZnRlciB0aGUgZmlyc3QgYXJlIG5vb3BzLgotICAgICAgICBsb2dnZXI6OmluaXQoCi0gICAgICAgICAgICBsb2dnZXI6OkNvbmZpZzo6ZGVmYXVsdCgpCi0gICAgICAgICAgICAgICAgLndpdGhfdGFnX29uX2RldmljZShNSUdSQVRJT05fTE9HX1RBRykKLSAgICAgICAgICAgICAgICAud2l0aF9tYXhfbGV2ZWwoTGV2ZWxGaWx0ZXI6OkluZm8pKTsKLQotICAgICAgICBsZXQgYWNvbmZpZ19zdG9yYWdlX3Jlc3VsdCA9IEZMQUdfVkFMX01BUAotICAgICAgICAgICAgLmFzX3JlZigpCi0gICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IGZsYWcgdmFsIG1hcDogXHtlcnJ9IikpCi0gICAgICAgICAgICAuYW5kX3RoZW4ofGZsYWdfdmFsX21hcHwgXHsKLSAgICAgICAgICAgICAgICBQQUNLQUdFX09GRlNFVAotICAgICAgICAgICAgICAgICAgICAuYXNfcmVmKCkKLSAgICAgICAgICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBwYWNrYWdlIHJlYWQgb2Zmc2V0OiBce2Vycn0iKSkKLSAgICAgICAgICAgICAgICAgICAgLmFuZF90aGVuKHxwYWNrYWdlX29mZnNldHwgXHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoIHBhY2thZ2Vfb2Zmc2V0IFx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU29tZShvZmZzZXQpID0+IFx7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsX21hcCwgb2Zmc2V0ICsge2ZsYWcuZmxhZ19vZmZzZXR9KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBmbGFnOiBce2Vycn0iKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUgPT4gRXJyKCJubyBjb250ZXh0IGZvdW5kIGZvciBwYWNrYWdlICd7cGFja2FnZX0nIi50b19zdHJpbmcoKSkKKyAgICBsZXQgZmxhZ192YWx1ZV9yZXN1bHQgPSBGTEFHX1ZBTF9NQVAKKyAgICAgICAgLmFzX3JlZigpCisgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgZmxhZyB2YWwgbWFwOiBce2Vycn0iKSkKKyAgICAgICAgLmFuZF90aGVuKHxmbGFnX3ZhbF9tYXB8IFx7CisgICAgICAgICAgICBQQUNLQUdFX09GRlNFVAorICAgICAgICAgICAgICAgIC5hc19yZWYoKQorICAgICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGZvcm1hdCEoImZhaWxlZCB0byBnZXQgcGFja2FnZSByZWFkIG9mZnNldDogXHtlcnJ9IikpCisgICAgICAgICAgICAgICAgLmFuZF90aGVuKHxwYWNrYWdlX29mZnNldHwgXHsKKyAgICAgICAgICAgICAgICAgICAgbWF0Y2ggcGFja2FnZV9vZmZzZXQgXHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvbWUob2Zmc2V0KSA9PiBceworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsX21hcCwgb2Zmc2V0ICsge2ZsYWcuZmxhZ19vZmZzZXR9KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IGZsYWc6IFx7ZXJyfSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUgPT4gXHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2chKExldmVsOjpFcnJvciwgIm5vIGNvbnRleHQgZm91bmQgZm9yIHBhY2thZ2Uge3BhY2thZ2V9Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyKGZvcm1hdCEoImZhaWxlZCB0byBmbGFnIHBhY2thZ2Uge3BhY2thZ2V9IikpCiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0pCi0gICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgfSk7CiAKLSAgICAgICAgbWF0Y2ggYWNvbmZpZ19zdG9yYWdlX3Jlc3VsdCBcewotICAgICAgICAgICAgT2soc3RvcmFnZV9yZXN1bHQpIGlmIHN0b3JhZ2VfcmVzdWx0ID09IHJlc3VsdCA9PiBcewotICAgICAgICAgICAgICAgIGlmIHVzZV9uZXdfc3RvcmFnZV92YWx1ZSBcewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmFnZV9yZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIFx7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIE9rKHN0b3JhZ2VfcmVzdWx0KSA9PiBcewotICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IG1pc21hdGNoIGZvciBmbGFnICd7ZmxhZy5uYW1lfScuIExlZ2FjeSBzdG9yYWdlIHdhcyBce3Jlc3VsdH0sIG5ldyBzdG9yYWdlIHdhcyBce3N0b3JhZ2VfcmVzdWx0fSIpOwotICAgICAgICAgICAgICAgIGlmIHVzZV9uZXdfc3RvcmFnZV92YWx1ZSBcewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RvcmFnZV9yZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIFx7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSwKLSAgICAgICAgICAgIEVycihlcnIpID0+IFx7Ci0gICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogXHtlcnJ9Iik7Ci0gICAgICAgICAgICAgICAgaWYgdXNlX25ld19zdG9yYWdlX3ZhbHVlIFx7Ci0gICAgICAgICAgICAgICAgICAgIHBhbmljISgiZmFpbGVkIHRvIHJlYWQgZmxhZyB2YWx1ZTogXHtlcnJ9Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorICAgIG1hdGNoIGZsYWdfdmFsdWVfcmVzdWx0IFx7CisgICAgICAgIE9rKGZsYWdfdmFsdWUpID0+IFx7CisgICAgICAgICAgICByZXR1cm4gZmxhZ192YWx1ZTsKKyAgICAgICAgfSwKKyAgICAgICAgRXJyKGVycikgPT4gXHsKKyAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiYWNvbmZpZ19ydXN0X2NvZGVnZW46IGVycm9yOiBce2Vycn0iKTsKKyAgICAgICAgICAgIHJldHVybiB7ZmxhZy5kZWZhdWx0X3ZhbHVlfTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJlc3VsdAotICAgIH0pOwote3sgZWxzZSB9fQotc3RhdGljIENBQ0hFRF97ZmxhZy5uYW1lfTogTGF6eUxvY2s8Ym9vbD4gPSBMYXp5TG9jazo6bmV3KHx8IGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCi0gICAgImFjb25maWdfZmxhZ3Mue2ZsYWcuZGV2aWNlX2NvbmZpZ19uYW1lc3BhY2V9IiwKLSAgICAie2ZsYWcuZGV2aWNlX2NvbmZpZ19mbGFnfSIsCi0gICAgIntmbGFnLmRlZmF1bHRfdmFsdWV9IikgPT0gInRydWUiKTsKLXt7IGVuZGlmIH19Cit9KTsKIHt7IC1lbmRpZiB9fQoge3sgLWVuZGZvciB9fQoge3sgLWVuZGlmIH19CkBAIC0xMjMsNzIgKzg3LDExIEBACiB7eyBmb3IgZmxhZyBpbiB0ZW1wbGF0ZV9mbGFncyB9fQogLy8vIHF1ZXJ5IGZsYWcge2ZsYWcubmFtZX0KICNbaW5saW5lKGFsd2F5cyldCi17eyAtaWYgZmxhZy5yZWFkd3JpdGUgfX0KIHB1YiBmbiB7ZmxhZy5uYW1lfSgpIC0+IGJvb2wgXHsKK3t7IC1pZiBmbGFnLnJlYWR3cml0ZSB9fQogICAgIFBST1ZJREVSLntmbGFnLm5hbWV9KCkKIHt7IC1lbHNlIH19Ci1wdWIgZm4ge2ZsYWcubmFtZX0oKSAtPiBib29sIFx7Ci0gICAge3sgaWYgbm90IGFsbG93X2luc3RydW1lbnRhdGlvbiB9fQogICAgIHtmbGFnLmRlZmF1bHRfdmFsdWV9Ci0gICAge3sgZWxzZSB9fQotCi0gICAgbGV0IHJlc3VsdCA9IHtmbGFnLmRlZmF1bHRfdmFsdWV9OwotICAgIGlmICFQYXRoOjpuZXcoU1RPUkFHRV9NSUdSQVRJT05fTUFSS0VSX0ZJTEUpLmV4aXN0cygpIFx7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLy8gVGhpcyB3aWxsIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gU3Vic2VxdWVudCBjYWxscyBhZnRlciB0aGUgZmlyc3QKLSAgICAvLyBhcmUgbm9vcHMuCi0gICAgbG9nZ2VyOjppbml0KAotICAgICAgICBsb2dnZXI6OkNvbmZpZzo6ZGVmYXVsdCgpCi0gICAgICAgICAgICAud2l0aF90YWdfb25fZGV2aWNlKE1JR1JBVElPTl9MT0dfVEFHKQotICAgICAgICAgICAgLndpdGhfbWF4X2xldmVsKExldmVsRmlsdGVyOjpJbmZvKSwKLSAgICApOwotCi0gICAgdW5zYWZlIFx7Ci0gICAgICAgIGxldCBwYWNrYWdlX21hcCA9IG1hdGNoIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlKCJ7ZmxhZy5jb250YWluZXJ9IiwgU3RvcmFnZUZpbGVUeXBlOjpQYWNrYWdlTWFwKSBcewotICAgICAgICAgICAgT2soZmlsZSkgPT4gZmlsZSwKLSAgICAgICAgICAgIEVycihlcnIpID0+IFx7Ci0gICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAne2ZsYWcubmFtZX0nOiBce2Vycn0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIGxldCBwYWNrYWdlX3JlYWRfY29udGV4dCA9IG1hdGNoIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV9tYXAsICJ7cGFja2FnZX0iKSBcewotICAgICAgICAgICAgT2soU29tZShjb250ZXh0KSkgPT4gY29udGV4dCwKLSAgICAgICAgICAgIE9rKE5vbmUpID0+IFx7Ci0gICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAne2ZsYWcubmFtZX0nOiBkaWQgbm90IGdldCBjb250ZXh0Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgICBFcnIoZXJyKSA9PiBcewotICAgICAgICAgICAgICAgIGxvZyEoTGV2ZWw6OkVycm9yLCAiQWNvbmZpZ1Rlc3RNaXNzaW9uMTogZXJyb3I6IGZhaWxlZCB0byByZWFkIGZsYWcgJ3tmbGFnLm5hbWV9JzogXHtlcnJ9Iik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgbGV0IGZsYWdfdmFsX21hcCA9IG1hdGNoIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlKCJ7ZmxhZy5jb250YWluZXJ9IiwgU3RvcmFnZUZpbGVUeXBlOjpGbGFnVmFsKSBcewotICAgICAgICAgICAgT2sodmFsX21hcCkgPT4gdmFsX21hcCwKLSAgICAgICAgICAgIEVycihlcnIpID0+IFx7Ci0gICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAne2ZsYWcubmFtZX0nOiBce2Vycn0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9OwotICAgICAgICBsZXQgdmFsdWUgPSBtYXRjaCBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZmbGFnX3ZhbF9tYXAsIHtmbGFnLmZsYWdfb2Zmc2V0fSArIHBhY2thZ2VfcmVhZF9jb250ZXh0LmJvb2xlYW5fc3RhcnRfaW5kZXgpIFx7Ci0gICAgICAgICAgICBPayh2YWwpID0+IHZhbCwKLSAgICAgICAgICAgIEVycihlcnIpID0+IFx7Ci0gICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmFpbGVkIHRvIHJlYWQgZmxhZyAne2ZsYWcubmFtZX0nOiBce2Vycn0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIGlmIHJlc3VsdCAhPSB2YWx1ZSBcewotICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJBY29uZmlnVGVzdE1pc3Npb24xOiBlcnJvcjogZmxhZyBtaXNtYXRjaCBmb3IgJ3tmbGFnLm5hbWV9Jy4gTGVnYWN5IHN0b3JhZ2Ugd2FzIFx7cmVzdWx0fSwgbmV3IHN0b3JhZ2Ugd2FzIFx7dmFsdWV9Iik7Ci0gICAgICAgIH0gZWxzZSBcewotICAgICAgICAgICAgbGV0IGRlZmF1bHRfdmFsdWUgPSB7ZmxhZy5kZWZhdWx0X3ZhbHVlfTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJlc3VsdAotICAgIHt7IGVuZGlmIH19CiB7eyAtZW5kaWYgfX0KIH0KIHt7IGVuZGZvciB9fQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3RlbXBsYXRlcy9ydXN0X3Rlc3QudGVtcGxhdGUgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL3J1c3RfdGVzdC50ZW1wbGF0ZQppbmRleCBkMDFmNDBhLi4xMzlhNWVjIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL3J1c3RfdGVzdC50ZW1wbGF0ZQorKysgYi90b29scy9hY29uZmlnL2Fjb25maWcvdGVtcGxhdGVzL3J1c3RfdGVzdC50ZW1wbGF0ZQpAQCAtMSwyMyArMSw4MSBAQAogLy8hIGNvZGVnZW5lcmF0ZWQgcnVzdCBmbGFnIGxpYgotCit1c2UgYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpOjpce01tYXAsIEFjb25maWdTdG9yYWdlRXJyb3IsIFN0b3JhZ2VGaWxlVHlwZSwgUGFja2FnZVJlYWRDb250ZXh0LCBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSwgZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZSwgZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0fTsKIHVzZSBzdGQ6OmNvbGxlY3Rpb25zOjpCVHJlZU1hcDsKLXVzZSBzdGQ6OnN5bmM6Ok11dGV4OwordXNlIHN0ZDo6cGF0aDo6UGF0aDsKK3VzZSBzdGQ6OmlvOjpXcml0ZTsKK3VzZSBzdGQ6OnN5bmM6Olx7TGF6eUxvY2ssIE11dGV4fTsKK3VzZSBsb2c6Olx7bG9nLCBMZXZlbEZpbHRlciwgTGV2ZWx9OwogCiAvLy8gZmxhZyBwcm92aWRlcgogcHViIHN0cnVjdCBGbGFnUHJvdmlkZXIgXHsKICAgICBvdmVycmlkZXM6IEJUcmVlTWFwPCYnc3RhdGljIHN0ciwgYm9vbD4sCiB9CiAKK3t7IGlmIGhhc19yZWFkd3JpdGUtIH19CitzdGF0aWMgUEFDS0FHRV9PRkZTRVQ6IExhenlMb2NrPFJlc3VsdDxPcHRpb248dTMyPiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4+ID0gTGF6eUxvY2s6Om5ldyh8fCB1bnNhZmUgXHsKKyAgICBnZXRfbWFwcGVkX3N0b3JhZ2VfZmlsZSgie2NvbnRhaW5lcn0iLCBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXApCisgICAgLmFuZF90aGVuKHxwYWNrYWdlX21hcHwgZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX21hcCwgIntwYWNrYWdlfSIpKQorICAgIC5tYXAofGNvbnRleHR8IGNvbnRleHQubWFwKHxjfCBjLmJvb2xlYW5fc3RhcnRfaW5kZXgpKQorfSk7CisKK3N0YXRpYyBGTEFHX1ZBTF9NQVA6IExhenlMb2NrPFJlc3VsdDxNbWFwLCBBY29uZmlnU3RvcmFnZUVycm9yPj4gPSBMYXp5TG9jazo6bmV3KHx8IHVuc2FmZSBceworICAgIGdldF9tYXBwZWRfc3RvcmFnZV9maWxlKCJ7Y29udGFpbmVyfSIsIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ1ZhbCkKK30pOworCit7eyAtZm9yIGZsYWcgaW4gdGVtcGxhdGVfZmxhZ3MgfX0KK3t7IC1pZiBmbGFnLnJlYWR3cml0ZSB9fQorLy8vIGZsYWcgdmFsdWUgY2FjaGUgZm9yIHtmbGFnLm5hbWV9CitzdGF0aWMgQ0FDSEVEX3tmbGFnLm5hbWV9OiBMYXp5TG9jazxib29sPiA9IExhenlMb2NrOjpuZXcofHwgXHsKKworICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuIFN1YnNlcXVlbnQgY2FsbHMgYWZ0ZXIgdGhlIGZpcnN0IGFyZSBub29wcy4KKyAgICBsb2dnZXI6OmluaXQoCisgICAgICAgIGxvZ2dlcjo6Q29uZmlnOjpkZWZhdWx0KCkKKyAgICAgICAgICAgIC53aXRoX3RhZ19vbl9kZXZpY2UoImFjb25maWdfcnVzdF9jb2RlZ2VuIikKKyAgICAgICAgICAgIC53aXRoX21heF9sZXZlbChMZXZlbEZpbHRlcjo6SW5mbykpOworCisgICAgbGV0IGZsYWdfdmFsdWVfcmVzdWx0ID0gRkxBR19WQUxfTUFQCisgICAgICAgIC5hc19yZWYoKQorICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IGZsYWcgdmFsIG1hcDogXHtlcnJ9IikpCisgICAgICAgIC5hbmRfdGhlbih8ZmxhZ192YWxfbWFwfCBceworICAgICAgICAgICAgUEFDS0FHRV9PRkZTRVQKKyAgICAgICAgICAgICAgICAuYXNfcmVmKCkKKyAgICAgICAgICAgICAgICAubWFwX2Vycih8ZXJyfCBmb3JtYXQhKCJmYWlsZWQgdG8gZ2V0IHBhY2thZ2UgcmVhZCBvZmZzZXQ6IFx7ZXJyfSIpKQorICAgICAgICAgICAgICAgIC5hbmRfdGhlbih8cGFja2FnZV9vZmZzZXR8IFx7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoIHBhY2thZ2Vfb2Zmc2V0IFx7CisgICAgICAgICAgICAgICAgICAgICAgICBTb21lKG9mZnNldCkgPT4gXHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZmbGFnX3ZhbF9tYXAsIG9mZnNldCArIHtmbGFnLmZsYWdfb2Zmc2V0fSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgZm9ybWF0ISgiZmFpbGVkIHRvIGdldCBmbGFnOiBce2Vycn0iKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgICAgICAgICBOb25lID0+IFx7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJubyBjb250ZXh0IGZvdW5kIGZvciBwYWNrYWdlIHtwYWNrYWdlfSIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycihmb3JtYXQhKCJmYWlsZWQgdG8gZmxhZyBwYWNrYWdlIHtwYWNrYWdlfSIpKQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIH0pOworCisgICAgbWF0Y2ggZmxhZ192YWx1ZV9yZXN1bHQgXHsKKyAgICAgICAgT2soZmxhZ192YWx1ZSkgPT4gXHsKKyAgICAgICAgICAgIHJldHVybiBmbGFnX3ZhbHVlOworICAgICAgICB9LAorICAgICAgICBFcnIoZXJyKSA9PiBceworICAgICAgICAgICAgbG9nIShMZXZlbDo6RXJyb3IsICJhY29uZmlnX3J1c3RfY29kZWdlbjogZXJyb3I6IFx7ZXJyfSIpOworICAgICAgICAgICAgcmV0dXJuIHtmbGFnLmRlZmF1bHRfdmFsdWV9OworICAgICAgICB9CisgICAgfQorCit9KTsKK3t7IC1lbmRpZiB9fQore3sgLWVuZGZvciB9fQore3sgLWVuZGlmIH19CisKIGltcGwgRmxhZ1Byb3ZpZGVyIFx7CiB7eyBmb3IgZmxhZyBpbiB0ZW1wbGF0ZV9mbGFncyB9fQogICAgIC8vLyBxdWVyeSBmbGFnIHtmbGFnLm5hbWV9CiAgICAgcHViIGZuIHtmbGFnLm5hbWV9KCZzZWxmKSAtPiBib29sIFx7CiAgICAgICAgIHNlbGYub3ZlcnJpZGVzLmdldCgie2ZsYWcubmFtZX0iKS5jb3BpZWQoKS51bndyYXBfb3IoCiAgICAgICAgIHt7IGlmIGZsYWcucmVhZHdyaXRlIC19fQotICAgICAgICAgIGZsYWdzX3J1c3Q6OkdldFNlcnZlckNvbmZpZ3VyYWJsZUZsYWcoCi0gICAgICAgICAgICAiYWNvbmZpZ19mbGFncy57ZmxhZy5kZXZpY2VfY29uZmlnX25hbWVzcGFjZX0iLAotICAgICAgICAgICAgIntmbGFnLmRldmljZV9jb25maWdfZmxhZ30iLAotICAgICAgICAgICAgIntmbGFnLmRlZmF1bHRfdmFsdWV9IikgPT0gInRydWUiCisgICAgICAgICAgICpDQUNIRURfe2ZsYWcubmFtZX0KICAgICAgICAge3sgLWVsc2UtIH19CiAgICAgICAgICAgIHtmbGFnLmRlZmF1bHRfdmFsdWV9CiAgICAgICAgIHt7IC1lbmRpZiB9fQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3Rlc3Rfc2Vjb25kX3BhY2thZ2UuYWNvbmZpZyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy90ZXN0X3NlY29uZF9wYWNrYWdlLmFjb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTg4YmM5NgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZy90ZXN0cy90ZXN0X3NlY29uZF9wYWNrYWdlLmFjb25maWcKQEAgLTAsMCArMSwxMCBAQAorcGFja2FnZTogImNvbS5hbmRyb2lkLmFjb25maWcuc2Vjb25kX3Rlc3QiCitjb250YWluZXI6ICJzeXN0ZW0iCisKK2ZsYWcgeworICAgIG5hbWU6ICJ0ZXN0aW5nX2ZsYWciCisgICAgbmFtZXNwYWNlOiAiYW5vdGhlcl9uYW1lc3BhY2UiCisgICAgZGVzY3JpcHRpb246ICJUaGlzIGlzIGEgZmxhZyBmb3IgdGVzdGluZy4iCisgICAgYnVnOiAiMTIzIgorfQorCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWcvdGVzdHMvdGhpcmQudmFsdWVzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3RoaXJkLnZhbHVlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzU4MzJhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnL3Rlc3RzL3RoaXJkLnZhbHVlcwpAQCAtMCwwICsxLDYgQEAKK2ZsYWdfdmFsdWUgeworICAgIHBhY2thZ2U6ICJjb20uYW5kcm9pZC5hY29uZmlnLnNlY29uZF90ZXN0IgorICAgIG5hbWU6ICJ0ZXN0aW5nX2ZsYWciCisgICAgc3RhdGU6IERJU0FCTEVECisgICAgcGVybWlzc2lvbjogUkVBRF9XUklURQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9BbmRyb2lkLmJwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9BbmRyb2lkLmJwCmluZGV4IDk1Y2VjZjQuLjM1MzE0NTAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvQW5kcm9pZC5icAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL0FuZHJvaWQuYnAKQEAgLTI2LDcgKzI2LDYgQEAKICAgICAgICAgImxpYmFjb25maWdfcHJvdG9zIiwKICAgICAgICAgImxpYmFueWhvdyIsCiAgICAgICAgICJsaWJwcm90b2J1ZiIsCi0gICAgICAgICJsaWJyZWdleCIsCiAgICAgXSwKIH0KIApAQCAtMzUsNiArMzQsMTEgQEAKICAgICBjcmF0ZV9uYW1lOiAiYWNvbmZpZ19kZXZpY2VfcGF0aHMiLAogICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogICAgIGRlZmF1bHRzOiBbImxpYmFjb25maWdfZGV2aWNlX3BhdGhzLmRlZmF1bHRzIl0sCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQuY29uZmlnaW5mcmFzdHJ1Y3R1cmUiLAorICAgIF0sCisgICAgbWluX3Nka192ZXJzaW9uOiAiMzQiLAogfQogCiBnZW5ydWxlIHsKQEAgLTUxLDQgKzU1LDQ3IEBACiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYmFjb25maWdfamF2YV9wcm90b19uYW5vIiwKICAgICBdLAorICAgIHNka192ZXJzaW9uOiAiY29yZV9wbGF0Zm9ybSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQuY29uZmlnaW5mcmFzdHJ1Y3R1cmUiLAorICAgIF0sCisgICAgbWluX3Nka192ZXJzaW9uOiAiMzQiLAorfQorCitnZW5ydWxlIHsKKyAgICBuYW1lOiAibGliYWNvbmZpZ19qYXZhX2hvc3RfZGV2aWNlX3BhdGhzX3NyYyIsCisgICAgc3JjczogWyJzcmMvSG9zdERldmljZVByb3Rvc1RlbXBsYXRlLmphdmEiXSwKKyAgICBvdXQ6IFsiSG9zdERldmljZVByb3Rvcy5qYXZhIl0sCisgICAgdG9vbF9maWxlczogWworICAgICAgICAicGFydGl0aW9uX2Fjb25maWdfZmxhZ3NfcGF0aHMudHh0IiwKKyAgICAgICAgIm1haW5saW5lX2Fjb25maWdfZmxhZ3NfcGF0aHMudHh0IiwKKyAgICBdLAorICAgIGNtZDogInNlZCAtZSAnL1RFTVBMQVRFL3tyJChsb2NhdGlvbiBwYXJ0aXRpb25fYWNvbmZpZ19mbGFnc19wYXRocy50eHQpJyAtZSAnZH0nICQoaW4pID4gJChvdXQpLnRtcCAmJiAiICsKKyAgICAic2VkIC1lICcvTUFJTkxJTkVfVC97ciQobG9jYXRpb24gbWFpbmxpbmVfYWNvbmZpZ19mbGFnc19wYXRocy50eHQpJyAtZSAnZH0nICQob3V0KS50bXAgPiAkKG91dCkiLAorfQorCitqYXZhX2xpYnJhcnlfaG9zdCB7CisgICAgbmFtZTogImFjb25maWdfaG9zdF9kZXZpY2VfcGF0aHNfamF2YSIsCisgICAgc3JjczogWyI6bGliYWNvbmZpZ19qYXZhX2hvc3RfZGV2aWNlX3BhdGhzX3NyYyJdLAorfQorCitnZW5ydWxlIHsKKyAgICBuYW1lOiAiamF2YV9kZXZpY2VfcGF0aHNfdGVzdF91dGlsX3NyYyIsCisgICAgc3JjczogWyJzcmMvRGV2aWNlUHJvdG9zVGVzdFV0aWxUZW1wbGF0ZS5qYXZhIl0sCisgICAgb3V0OiBbIkRldmljZVByb3Rvc1Rlc3RVdGlsLmphdmEiXSwKKyAgICB0b29sX2ZpbGVzOiBbInBhcnRpdGlvbl9hY29uZmlnX2ZsYWdzX3BhdGhzLnR4dCJdLAorICAgIGNtZDogInNlZCAtZSAnL1RFTVBMQVRFL3tyJChsb2NhdGlvbiBwYXJ0aXRpb25fYWNvbmZpZ19mbGFnc19wYXRocy50eHQpJyAtZSAnZH0nICQoaW4pID4gJChvdXQpIiwKK30KKworamF2YV9saWJyYXJ5IHsKKyAgICBuYW1lOiAiYWNvbmZpZ19kZXZpY2VfcGF0aHNfamF2YV91dGlsIiwKKyAgICBzcmNzOiBbIjpqYXZhX2RldmljZV9wYXRoc190ZXN0X3V0aWxfc3JjIl0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmFjb25maWdfamF2YV9wcm90b19uYW5vIiwKKyAgICBdLAorICAgIHNka192ZXJzaW9uOiAiY29yZV9wbGF0Zm9ybSIsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgIF0sCiB9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL21haW5saW5lX2Fjb25maWdfZmxhZ3NfcGF0aHMudHh0IGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9tYWlubGluZV9hY29uZmlnX2ZsYWdzX3BhdGhzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYWQyYjIzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9tYWlubGluZV9hY29uZmlnX2ZsYWdzX3BhdGhzLnR4dApAQCAtMCwwICsxLDIwIEBACisiL2FwZXgvY29tLmFuZHJvaWQuYWRzZXJ2aWNlcy9ldGMvYWNvbmZpZ19mbGFncy5wYiIsCisiL2FwZXgvY29tLmFuZHJvaWQuYXBwc2VhcmNoL2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiwKKyIvYXBleC9jb20uYW5kcm9pZC5hcnQvZXRjL2Fjb25maWdfZmxhZ3MucGIiLAorIi9hcGV4L2NvbS5hbmRyb2lkLmJ0L2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiwKKyIvYXBleC9jb20uYW5kcm9pZC5jZWxsYnJvYWRjYXN0L2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiwKKyIvYXBleC9jb20uYW5kcm9pZC5jb25maWdpbmZyYXN0cnVjdHVyZS9ldGMvYWNvbmZpZ19mbGFncy5wYiIsCisiL2FwZXgvY29tLmFuZHJvaWQuY29uc2NyeXB0L2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiwKKyIvYXBleC9jb20uYW5kcm9pZC5kZXZpY2Vsb2NrL2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiwKKyIvYXBleC9jb20uYW5kcm9pZC5oZWFsdGhmaXRuZXNzL2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiwKKyIvYXBleC9jb20uYW5kcm9pZC5pcHNlYy9ldGMvYWNvbmZpZ19mbGFncy5wYiIsCisiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEvZXRjL2Fjb25maWdfZmxhZ3MucGIiLAorIi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhcHJvdmlkZXIvZXRjL2Fjb25maWdfZmxhZ3MucGIiLAorIi9hcGV4L2NvbS5hbmRyb2lkLm9uZGV2aWNlcGVyc29uYWxpemF0aW9uL2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiwKKyIvYXBleC9jb20uYW5kcm9pZC5vcy5zdGF0c2QvZXRjL2Fjb25maWdfZmxhZ3MucGIiLAorIi9hcGV4L2NvbS5hbmRyb2lkLnBlcm1pc3Npb24vZXRjL2Fjb25maWdfZmxhZ3MucGIiLAorIi9hcGV4L2NvbS5hbmRyb2lkLnByb2ZpbGluZy9ldGMvYWNvbmZpZ19mbGFncy5wYiIsCisiL2FwZXgvY29tLmFuZHJvaWQudGV0aGVyaW5nL2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiwKKyIvYXBleC9jb20uYW5kcm9pZC51d2IvZXRjL2Fjb25maWdfZmxhZ3MucGIiLAorIi9hcGV4L2NvbS5hbmRyb2lkLnZpcnQvZXRjL2Fjb25maWdfZmxhZ3MucGIiLAorIi9hcGV4L2NvbS5hbmRyb2lkLndpZmkvZXRjL2Fjb25maWdfZmxhZ3MucGIiLApkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9wYXJ0aXRpb25fYWNvbmZpZ19mbGFnc19wYXRocy50eHQgYi90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL3BhcnRpdGlvbl9hY29uZmlnX2ZsYWdzX3BhdGhzLnR4dAppbmRleCAxNDBjZDIxLi5lOTk3ZTNkIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL3BhcnRpdGlvbl9hY29uZmlnX2ZsYWdzX3BhdGhzLnR4dAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL3BhcnRpdGlvbl9hY29uZmlnX2ZsYWdzX3BhdGhzLnR4dApAQCAtMSw0ICsxLDMgQEAKICIvc3lzdGVtL2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiwKLSIvc3lzdGVtX2V4dC9ldGMvYWNvbmZpZ19mbGFncy5wYiIsCiAiL3Byb2R1Y3QvZXRjL2Fjb25maWdfZmxhZ3MucGIiLAogIi92ZW5kb3IvZXRjL2Fjb25maWdfZmxhZ3MucGIiLApkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9zcmMvRGV2aWNlUHJvdG9zVGVtcGxhdGUuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvc3JjL0RldmljZVByb3Rvc1RlbXBsYXRlLmphdmEKaW5kZXggNThjNThkZS4uNGQ0MTE5OSAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9zcmMvRGV2aWNlUHJvdG9zVGVtcGxhdGUuamF2YQorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL3NyYy9EZXZpY2VQcm90b3NUZW1wbGF0ZS5qYXZhCkBAIC0yOSw3ICsyOSw3IEBACiAgKiBAaGlkZQogICovCiBwdWJsaWMgY2xhc3MgRGV2aWNlUHJvdG9zIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nW10gUEFUSFMgPSB7CisJcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQQVRIUyA9IHsKICAgICAgICAgVEVNUExBVEUKICAgICB9OwogCkBAIC01MCwxMCArNTAsMTEgQEAKICAgICAgICAgQXJyYXlMaXN0PHBhcnNlZF9mbGFnPiByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7CiAKICAgICAgICAgZm9yIChTdHJpbmcgcGF0aCA6IHBhcnNlZEZsYWdzUHJvdG9QYXRocygpKSB7Ci0gICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSBuZXcgRmlsZUlucHV0U3RyZWFtKHBhdGgpOwotICAgICAgICAgICAgcGFyc2VkX2ZsYWdzIHBhcnNlZEZsYWdzID0gcGFyc2VkX2ZsYWdzLnBhcnNlRnJvbShpbnB1dFN0cmVhbS5yZWFkQWxsQnl0ZXMoKSk7Ci0gICAgICAgICAgICBmb3IgKHBhcnNlZF9mbGFnIGZsYWcgOiBwYXJzZWRGbGFncy5wYXJzZWRGbGFnKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFkZChmbGFnKTsKKyAgICAgICAgICAgIHRyeSAoRmlsZUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoKSkgeworICAgICAgICAgICAgICAgIHBhcnNlZF9mbGFncyBwYXJzZWRGbGFncyA9IHBhcnNlZF9mbGFncy5wYXJzZUZyb20oaW5wdXRTdHJlYW0ucmVhZEFsbEJ5dGVzKCkpOworICAgICAgICAgICAgICAgIGZvciAocGFyc2VkX2ZsYWcgZmxhZyA6IHBhcnNlZEZsYWdzLnBhcnNlZEZsYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChmbGFnKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNjQsNyArNjUsNyBAQAogICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgYWxsIG9uLWRldmljZSBhY29uZmlnIHByb3RvcyBwYXRocy4KICAgICAgKiBAaGlkZQogICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIExpc3Q8U3RyaW5nPiBwYXJzZWRGbGFnc1Byb3RvUGF0aHMoKSB7CisgICAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gcGFyc2VkRmxhZ3NQcm90b1BhdGhzKCkgewogICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBwYXRocyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChQQVRIUykpOwogCiAgICAgICAgIEZpbGUgYXBleERpcmVjdG9yeSA9IG5ldyBGaWxlKEFQRVhfRElSKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvc3JjL0RldmljZVByb3Rvc1Rlc3RVdGlsVGVtcGxhdGUuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvc3JjL0RldmljZVByb3Rvc1Rlc3RVdGlsVGVtcGxhdGUuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWQ2NzY2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9zcmMvRGV2aWNlUHJvdG9zVGVzdFV0aWxUZW1wbGF0ZS5qYXZhCkBAIC0wLDAgKzEsOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworcGFja2FnZSBhbmRyb2lkLmFjb25maWc7CisKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcubmFuby5BY29uZmlnLnBhcnNlZF9mbGFnOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5uYW5vLkFjb25maWcucGFyc2VkX2ZsYWdzOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworCisvKiogQGhpZGUgKi8KK3B1YmxpYyBjbGFzcyBEZXZpY2VQcm90b3NUZXN0VXRpbCB7CisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQQVRIUyA9IHsKKyAgICAgICAgVEVNUExBVEUKKyAgICB9OworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQRVhfRElSID0gIi9hcGV4LyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEFQRVhfQUNPTkZJR19QQVRIX1NVRkZJWCA9ICIvZXRjL2Fjb25maWdfZmxhZ3MucGIiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBTWVNURU1fQVBFWF9ESVIgPSAiL3N5c3RlbS9hcGV4IjsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBsaXN0IG9mIGFsbCBvbi1kZXZpY2UgYWNvbmZpZyBwcm90b3MuCisgICAgICoKKyAgICAgKiA8cD5NYXkgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBwcm90b3MgY2FuJ3QgYmUgcmVhZCBhdCB0aGUgY2FsbCBzaXRlLiBGb3IgZXhhbXBsZSwgc29tZSBvZgorICAgICAqIHRoZSBwcm90b3MgYXJlIGluIHRoZSBhcGV4LyBwYXJ0aXRpb24sIHdoaWNoIGlzIG1vdW50ZWQgc29tZXdoYXQgbGF0ZSBpbiB0aGUgYm9vdCBwcm9jZXNzLgorICAgICAqCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB3ZSBjYW4ndCByZWFkIG9uZSBvZiB0aGUgcHJvdG9zIHlldAorICAgICAqIEByZXR1cm4gYSBsaXN0IG9mIGFsbCBvbi1kZXZpY2UgYWNvbmZpZyBwcm90b3MKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIExpc3Q8cGFyc2VkX2ZsYWc+IGxvYWRBbmRQYXJzZUZsYWdQcm90b3MoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBBcnJheUxpc3Q8cGFyc2VkX2ZsYWc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKKworICAgICAgICBmb3IgKFN0cmluZyBwYXRoIDogcGFyc2VkRmxhZ3NQcm90b1BhdGhzKCkpIHsKKyAgICAgICAgICAgIHRyeSAoRmlsZUlucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShwYXRoKSkgeworICAgICAgICAgICAgICAgIHBhcnNlZF9mbGFncyBwYXJzZWRGbGFncyA9IHBhcnNlZF9mbGFncy5wYXJzZUZyb20oaW5wdXRTdHJlYW0ucmVhZEFsbEJ5dGVzKCkpOworICAgICAgICAgICAgICAgIGZvciAocGFyc2VkX2ZsYWcgZmxhZyA6IHBhcnNlZEZsYWdzLnBhcnNlZEZsYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChmbGFnKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgYWxsIG9uLWRldmljZSBhY29uZmlnIHByb3RvcyBwYXRocy4KKyAgICAgKgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gcGFyc2VkRmxhZ3NQcm90b1BhdGhzKCkgeworICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBwYXRocyA9IG5ldyBBcnJheUxpc3QoQXJyYXlzLmFzTGlzdChQQVRIUykpOworCisgICAgICAgIEZpbGUgYXBleERpcmVjdG9yeSA9IG5ldyBGaWxlKFNZU1RFTV9BUEVYX0RJUik7CisgICAgICAgIGlmICghYXBleERpcmVjdG9yeS5pc0RpcmVjdG9yeSgpKSB7CisgICAgICAgICAgICByZXR1cm4gcGF0aHM7CisgICAgICAgIH0KKworICAgICAgICBGaWxlW10gc3ViZGlycyA9IGFwZXhEaXJlY3RvcnkubGlzdEZpbGVzKCk7CisgICAgICAgIGlmIChzdWJkaXJzID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXRoczsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoRmlsZSBwcmVmaXggOiBzdWJkaXJzKSB7CisgICAgICAgICAgICBTdHJpbmcgYXBleE5hbWUgPSBwcmVmaXguZ2V0TmFtZSgpLnJlcGxhY2UoImNvbS5nb29nbGUiLCAiY29tIik7CisgICAgICAgICAgICBhcGV4TmFtZSA9IGFwZXhOYW1lLnN1YnN0cmluZygwLCBhcGV4TmFtZS5sYXN0SW5kZXhPZignLicpKTsKKworICAgICAgICAgICAgRmlsZSBwcm90b1BhdGggPSBuZXcgRmlsZShBUEVYX0RJUiArIGFwZXhOYW1lICsgQVBFWF9BQ09ORklHX1BBVEhfU1VGRklYKTsKKyAgICAgICAgICAgIGlmICghcHJvdG9QYXRoLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBhdGhzLmFkZChwcm90b1BhdGguZ2V0QWJzb2x1dGVQYXRoKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwYXRoczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL3NyYy9Ib3N0RGV2aWNlUHJvdG9zVGVtcGxhdGUuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvc3JjL0hvc3REZXZpY2VQcm90b3NUZW1wbGF0ZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3ZDBhNzYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL3NyYy9Ib3N0RGV2aWNlUHJvdG9zVGVtcGxhdGUuamF2YQpAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworaW1wb3J0IGphdmEudXRpbC5zdHJlYW0uQ29sbGVjdG9yczsKKworLyoqCisgKiBBIGhvc3QgbGliIHRoYXQgY2FuIHJlYWQgYWxsIGFjb25maWcgcHJvdG8gZmlsZSBwYXRocyBvbiBhIGdpdmVuIGRldmljZS4KKyAqIFRoaXMgbGliIGlzIG9ubHkgYXZhaWxhYmxlIG9uIGRldmljZSB3aXRoIHJvb3QgYWNjZXNzICh1c2VyZGVidWcvZW5nKS4KKyAqLworcHVibGljIGNsYXNzIEhvc3REZXZpY2VQcm90b3MgeworICAgIC8qKgorICAgICAqIEFuIGludGVyZmFjZSB0aGF0IGV4ZWN1dGVzIEFEQiBjb21tYW5kIGFuZCByZXR1cm4gdGhlIHJlc3VsdC4KKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBBZGJDb21tYW5kRXhlY3V0b3IgeworICAgICAgICAvKiogRXhlY3V0ZXMgdGhlIEFEQiBjb21tYW5kLiAqLworICAgICAgICBTdHJpbmcgZXhlY3V0ZUFkYkNvbW1hbmQoU3RyaW5nIGNvbW1hbmQpOworICAgIH0KKworICAgIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBQQVRIUyA9IHsKKyAgICAgICAgVEVNUExBVEUKKyAgICB9OworCisgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIE1BSU5MSU5FX1BBVEhTID0geworICAgICAgICBNQUlOTElORV9UCisgICAgfTsKKworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUEVYX0RJUiA9ICIvYXBleCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFJFQ1VSU0lWRUxZX0xJU1RfQVBFWF9ESVJfQ09NTUFORCA9CisgICAgICAgICJzaGVsbCBzdSAwIGZpbmQgL2FwZXggfCBncmVwIGFjb25maWdfZmxhZ3MiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBBUEVYX0FDT05GSUdfUEFUSF9TVUZGSVggPSAiL2V0Yy9hY29uZmlnX2ZsYWdzLnBiIjsKKworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBhbGwgb24tZGV2aWNlIGFjb25maWcgcHJvdG8gcGF0aHMgZnJvbSBob3N0IHNpZGUuCisgICAgICovCisgICAgcHVibGljIHN0YXRpYyBMaXN0PFN0cmluZz4gcGFyc2VkRmxhZ3NQcm90b1BhdGhzKEFkYkNvbW1hbmRFeGVjdXRvciBhZGJDb21tYW5kRXhlY3V0b3IpIHsKKyAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gcGF0aHMgPSBuZXcgQXJyYXlMaXN0KEFycmF5cy5hc0xpc3QoUEFUSFMpKTsKKworICAgICAgICBTdHJpbmcgYWRiQ29tbWFuZE91dHB1dCA9IGFkYkNvbW1hbmRFeGVjdXRvci5leGVjdXRlQWRiQ29tbWFuZCgKKyAgICAgICAgICAgIFJFQ1VSU0lWRUxZX0xJU1RfQVBFWF9ESVJfQ09NTUFORCk7CisKKyAgICAgICAgaWYgKGFkYkNvbW1hbmRPdXRwdXQgPT0gbnVsbCB8fCBhZGJDb21tYW5kT3V0cHV0LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgcGF0aHMuYWRkQWxsKEFycmF5cy5hc0xpc3QoTUFJTkxJTkVfUEFUSFMpKTsKKyAgICAgICAgICAgIHJldHVybiBwYXRoczsKKyAgICAgICAgfQorCisgICAgICAgIFNldDxTdHJpbmc+IGFsbEZpbGVzID0gbmV3IEhhc2hTZXQ8PihBcnJheXMuYXNMaXN0KGFkYkNvbW1hbmRPdXRwdXQuc3BsaXQoIlxuIikpKTsKKworICAgICAgICBTZXQ8U3RyaW5nPiBzdWJkaXJzID0gYWxsRmlsZXMuc3RyZWFtKCkubWFwKGZpbGUgLT4geworICAgICAgICAgICAgU3RyaW5nW10gZmlsZVBhdGhzID0gZmlsZS5zcGxpdCgiLyIpOworICAgICAgICAgICAgLy8gVGhlIGZpcnN0IGVsZW1lbnQgaXMgIiIsIHRoZSBzZWNvbmQgZWxlbWVudCBpcyAiYXBleCIuCisgICAgICAgICAgICByZXR1cm4gZmlsZVBhdGhzLmxlbmd0aCA+IDIgPyBmaWxlUGF0aHNbMl0gOiAiIjsKKyAgICAgICAgfSkuY29sbGVjdChDb2xsZWN0b3JzLnRvU2V0KCkpOworCisgICAgICAgIGZvciAoU3RyaW5nIHByZWZpeCA6IHN1YmRpcnMpIHsKKyAgICAgICAgICAgIC8vIEZvciBlYWNoIG1haW5saW5lIG1vZHVsZXMsIHRoZXJlIGFyZSB0d28gZGlyZWN0b3JpZXMsIG9uZSA8bW9kdWxlcGFja2FnZT4vLAorICAgICAgICAgICAgLy8gYW5kIG9uZSA8bW9kdWxlcGFja2FnZT5APHZlcnNpb25jb2RlPi8uIEp1c3QgcmVhZCB0aGUgZm9ybWVyLgorICAgICAgICAgICAgaWYgKHByZWZpeC5jb250YWlucygiQCIpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIFN0cmluZyBwcm90b1BhdGggPSBBUEVYX0RJUiArICIvIiArIHByZWZpeCArIEFQRVhfQUNPTkZJR19QQVRIX1NVRkZJWDsKKyAgICAgICAgICAgIGlmIChhbGxGaWxlcy5jb250YWlucyhwcm90b1BhdGgpKSB7CisgICAgICAgICAgICAgICAgcGF0aHMuYWRkKHByb3RvUGF0aCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhdGhzOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvc3JjL2xpYi5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvc3JjL2xpYi5ycwppbmRleCA5YWI5Y2VhLi44ODcxYjRmIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL3NyYy9saWIucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy9zcmMvbGliLnJzCkBAIC02MiwxMyArNjIsMTIgQEAKIAogICAgICNbdGVzdF0KICAgICBmbiB0ZXN0X3JlYWRfcGFydGl0aW9uX3BhdGhzKCkgewotICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcGFydGl0aW9uX3BhdGhzKCkubGVuKCksIDQpOworICAgICAgICBhc3NlcnRfZXEhKHJlYWRfcGFydGl0aW9uX3BhdGhzKCkubGVuKCksIDMpOwogCiAgICAgICAgIGFzc2VydF9lcSEoCiAgICAgICAgICAgICByZWFkX3BhcnRpdGlvbl9wYXRocygpLAogICAgICAgICAgICAgdmVjIVsKICAgICAgICAgICAgICAgICBQYXRoQnVmOjpmcm9tKCIvc3lzdGVtL2V0Yy9hY29uZmlnX2ZsYWdzLnBiIiksCi0gICAgICAgICAgICAgICAgUGF0aEJ1Zjo6ZnJvbSgiL3N5c3RlbV9leHQvZXRjL2Fjb25maWdfZmxhZ3MucGIiKSwKICAgICAgICAgICAgICAgICBQYXRoQnVmOjpmcm9tKCIvcHJvZHVjdC9ldGMvYWNvbmZpZ19mbGFncy5wYiIpLAogICAgICAgICAgICAgICAgIFBhdGhCdWY6OmZyb20oIi92ZW5kb3IvZXRjL2Fjb25maWdfZmxhZ3MucGIiKQogICAgICAgICAgICAgXQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy90ZXN0L0FuZHJvaWQuYnAgYi90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL3Rlc3QvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zN2Y1NjFmCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy90ZXN0L0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfdGVhbTogInRyZW5keV90ZWFtX2FuZHJvaWRfY29yZV9leHBlcmltZW50cyIsCisgICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbIkFuZHJvaWQtQXBhY2hlLTIuMCJdLAorfQorCithbmRyb2lkX3Rlc3QgeworICAgIG5hbWU6ICJhY29uZmlnX2RldmljZV9wYXRoc19qYXZhX3Rlc3QiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInNyYy8qKi8qLmphdmEiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWR4LnRlc3QucnVubmVyIiwKKyAgICAgICAgImp1bml0IiwKKyAgICAgICAgImFjb25maWdfZGV2aWNlX3BhdGhzX2phdmFfdXRpbCIsCisgICAgXSwKKyAgICB0ZXN0X3N1aXRlczogWworICAgICAgICAiZ2VuZXJhbC10ZXN0cyIsCisgICAgXSwKKyAgICBwbGF0Zm9ybV9hcGlzOiB0cnVlLAorICAgIGNlcnRpZmljYXRlOiAicGxhdGZvcm0iLAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvamF2YS9BbmRyb2lkTWFuaWZlc3QueG1sIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2RldmljZV9wYXRocy90ZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKc2ltaWxhcml0eSBpbmRleCA4OCUKY29weSBmcm9tIHRvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2phdmEvQW5kcm9pZE1hbmlmZXN0LnhtbApjb3B5IHRvIHRvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvdGVzdC9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDc4YmZiMzcuLjVlMDE4NzkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2phdmEvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL3Rlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMTUsMTIgKzE1LDEzIEBACiAgIH4gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgIC0tPgogCi08bWFuaWZlc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIiBwYWNrYWdlPSJhbmRyb2lkLmFjb25maWdfc3RvcmFnZS50ZXN0Ij4KKzxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCisgICAgcGFja2FnZT0iYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdCI+CiAgICAgPGFwcGxpY2F0aW9uPgogICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KICAgICA8L2FwcGxpY2F0aW9uPgogCiAgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKLSAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5hY29uZmlnX3N0b3JhZ2UudGVzdCIgLz4KKyAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdCIgLz4KIAogPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19kZXZpY2VfcGF0aHMvdGVzdC9zcmMvRGV2aWNlUHJvdG9zVGVzdFV0aWxUZXN0LmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL3Rlc3Qvc3JjL0RldmljZVByb3Rvc1Rlc3RVdGlsVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZDBmZDAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfZGV2aWNlX3BhdGhzL3Rlc3Qvc3JjL0RldmljZVByb3Rvc1Rlc3RVdGlsVGVzdC5qYXZhCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZy50ZXN0OworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5EZXZpY2VQcm90b3NUZXN0VXRpbDsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcubmFuby5BY29uZmlnLnBhcnNlZF9mbGFnOworCitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKKworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBEZXZpY2VQcm90b3NUZXN0VXRpbFRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gUExBVEZPUk1fQ09OVEFJTkVSUyA9IFNldC5vZigic3lzdGVtIiwgInZlbmRvciIsICJwcm9kdWN0Iik7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3REZXZpY2VQcm90b3NfbG9hZEFuZFBhcnNlRmxhZ1Byb3RvcygpIHRocm93cyBFeGNlcHRpb24geworICAgICAgICBMaXN0PHBhcnNlZF9mbGFnPiBmbGFncyA9IERldmljZVByb3Rvc1Rlc3RVdGlsLmxvYWRBbmRQYXJzZUZsYWdQcm90b3MoKTsKKyAgICAgICAgaW50IHBsYXRmb3JtRmxhZ3MgPSAwOworICAgICAgICBpbnQgbWFpbmxpbmVGbGFncyA9IDA7CisgICAgICAgIGZvciAocGFyc2VkX2ZsYWcgcGYgOiBmbGFncykgeworICAgICAgICAgICAgaWYgKFBMQVRGT1JNX0NPTlRBSU5FUlMuY29udGFpbnMocGYuY29udGFpbmVyKSkgeworICAgICAgICAgICAgICAgIHBsYXRmb3JtRmxhZ3MrKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWFpbmxpbmVGbGFncysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShwbGF0Zm9ybUZsYWdzID4gMyk7CisgICAgICAgIGFzc2VydFRydWUobWFpbmxpbmVGbGFncyA+IDMpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19mbGFncy9BbmRyb2lkLmJwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2ZsYWdzL0FuZHJvaWQuYnAKaW5kZXggZTMyN2NlZC4uMWI0ZTE0OCAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2ZsYWdzL0FuZHJvaWQuYnAKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2ZsYWdzL0FuZHJvaWQuYnAKQEAgLTI0LDYgKzI0LDExIEBACiAgICAgICAgICJsaWJhY29uZmlnX2ZsYWdzX3J1c3QiLAogICAgIF0sCiAgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQuY29uZmlnaW5mcmFzdHJ1Y3R1cmUiLAorICAgIF0sCisgICAgbWluX3Nka192ZXJzaW9uOiAiMzQiLAogfQogCiBhY29uZmlnX2RlY2xhcmF0aW9ucyB7CkBAIC0zOCw5ICs0MywxOSBAQAogICAgIGNyYXRlX25hbWU6ICJhY29uZmlnX2ZsYWdzX3J1c3QiLAogICAgIGFjb25maWdfZGVjbGFyYXRpb25zOiAiYWNvbmZpZ19mbGFncyIsCiAgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQuY29uZmlnaW5mcmFzdHJ1Y3R1cmUiLAorICAgIF0sCisgICAgbWluX3Nka192ZXJzaW9uOiAiMzQiLAogfQogCiBjY19hY29uZmlnX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJhY29uZmlnX2ZsYWdzX2NjIiwKICAgICBhY29uZmlnX2RlY2xhcmF0aW9uczogImFjb25maWdfZmxhZ3MiLAogfQorCitqYXZhX2Fjb25maWdfbGlicmFyeSB7CisgICAgbmFtZTogImFjb25maWdfZmxhZ3NfamF2YSIsCisgICAgYWNvbmZpZ19kZWNsYXJhdGlvbnM6ICJhY29uZmlnX2ZsYWdzIiwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19mbGFncy9mbGFncy5hY29uZmlnIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2ZsYWdzL2ZsYWdzLmFjb25maWcKaW5kZXggZGI4YjFiNy4uMjQ4OGI1YyAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2ZsYWdzL2ZsYWdzLmFjb25maWcKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2ZsYWdzL2ZsYWdzLmFjb25maWcKQEAgLTcsMyArNywzNyBAQAogICBidWc6ICIzMTIyMzU1OTYiCiAgIGRlc2NyaXB0aW9uOiAiV2hlbiBlbmFibGVkLCBhY29uZmlnIGZsYWdzIGFyZSByZWFkIGZyb20gdGhlIG5ldyBhY29uZmlnIHN0b3JhZ2Ugb25seS4iCiB9CisKK2ZsYWcgeworICBuYW1lOiAiZW5hYmxlX2Fjb25maWdkX2Zyb21fbWFpbmxpbmUiCisgIG5hbWVzcGFjZTogImNvcmVfZXhwZXJpbWVudHNfdGVhbV9pbnRlcm5hbCIKKyAgYnVnOiAiMzY5ODA4ODA1IgorICBkZXNjcmlwdGlvbjogIldoZW4gZW5hYmxlZCwgbGF1bmNoIGFjb25maWdkIGZyb20gY29uZmlnIGluZnJhIG1vZHVsZS4iCit9CisKK2ZsYWcgeworICBuYW1lOiAidG9vbHNfcmVhZF9mcm9tX25ld19zdG9yYWdlIgorICBuYW1lc3BhY2U6ICJjb3JlX2V4cGVyaW1lbnRzX3RlYW1faW50ZXJuYWwiCisgIGJ1ZzogIjM3MDQ5OTY0MCIKKyAgZGVzY3JpcHRpb246ICJXaGVuIGVuYWJsZWQsIHRvb2xzIHJlYWQgZGlyZWN0bHkgZnJvbSB0aGUgbmV3IGFjb25maWcgc3RvcmFnZS4iCit9CisKK2ZsYWcgeworICBuYW1lOiAidG9vbHNfcmVhZF9mcm9tX25ld19zdG9yYWdlX2J1Z2ZpeCIKKyAgbmFtZXNwYWNlOiAiY29yZV9leHBlcmltZW50c190ZWFtX2ludGVybmFsIgorICBidWc6ICIzNzA0OTk2NDAiCisgIGRlc2NyaXB0aW9uOiAiV2hlbiBlbmFibGVkLCB0b29scyByZWFkIGRpcmVjdGx5IGZyb20gdGhlIG5ldyBhY29uZmlnIHN0b3JhZ2UuIgorICBtZXRhZGF0YSB7CisgICAgcHVycG9zZTogUFVSUE9TRV9CVUdGSVgKKyAgfQorfQorCitmbGFnIHsKKyAgbmFtZTogImludm9rZV91cGRhdGFibGVfYWZsYWdzIgorICBuYW1lc3BhY2U6ICJjb3JlX2V4cGVyaW1lbnRzX3RlYW1faW50ZXJuYWwiCisgIGJ1ZzogIjM4NTM4Mzg5OSIKKyAgZGVzY3JpcHRpb246ICJXaGVuIGVuYWJsZWQsIHRoZSBzeXN0ZW0gYWZsYWdzIGJpbmFyeSBpbnZva2VzIHRoZSB1cGRhdGFibGUgYWZsYWdzLiIKKyAgbWV0YWRhdGEgeworICAgIHB1cnBvc2U6IFBVUlBPU0VfQlVHRklYCisgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19mbGFncy9zcmMvbGliLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2ZsYWdzL3NyYy9saWIucnMKaW5kZXggYTYwN2VmYi4uZGM1MDdhZSAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2ZsYWdzL3NyYy9saWIucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX2ZsYWdzL3NyYy9saWIucnMKQEAgLTM0LDYgKzM0LDE2IEBACiAgICAgcHViIGZuIGVuYWJsZV9vbmx5X25ld19zdG9yYWdlKCkgLT4gYm9vbCB7CiAgICAgICAgIGFjb25maWdfZmxhZ3NfcnVzdDo6ZW5hYmxlX29ubHlfbmV3X3N0b3JhZ2UoKQogICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGVuYWJsZV9hY29uZmlnZF9mcm9tX21haW5saW5lIGZsYWcuCisgICAgcHViIGZuIGVuYWJsZV9hY29uZmlnZF9mcm9tX21haW5saW5lKCkgLT4gYm9vbCB7CisgICAgICAgIGFjb25maWdfZmxhZ3NfcnVzdDo6ZW5hYmxlX29ubHlfbmV3X3N0b3JhZ2UoKQorICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGludm9rZV91cGRhdGFibGVfYWZsYWdzIGZsYWcuCisgICAgcHViIGZuIGludm9rZV91cGRhdGFibGVfYWZsYWdzKCkgLT4gYm9vbCB7CisgICAgICAgIGFjb25maWdfZmxhZ3NfcnVzdDo6aW52b2tlX3VwZGF0YWJsZV9hZmxhZ3MoKQorICAgIH0KIH0KIAogLy8vIE1vZHVsZSB1c2VkIHdoZW4gYnVpbGRpbmcgd2l0aCBjYXJnbwpAQCAtNDQsNCArNTQsMTYgQEAKICAgICAgICAgLy8gVXNlZCBvbmx5IHRvIGVuYWJsZSB0eXBlY2hlY2tpbmcgYW5kIHRlc3Rpbmcgd2l0aCBjYXJnbwogICAgICAgICB0cnVlCiAgICAgfQorCisgICAgLy8vIFJldHVybnMgYSBwbGFjZWhvbGRlciB2YWx1ZSBmb3IgdGhlIGVuYWJsZV9hY29uZmlnZF9mcm9tX21haW5saW5lIGZsYWcuCisgICAgcHViIGZuIGVuYWJsZV9hY29uZmlnZF9mcm9tX21haW5saW5lKCkgLT4gYm9vbCB7CisgICAgICAgIC8vIFVzZWQgb25seSB0byBlbmFibGUgdHlwZWNoZWNraW5nIGFuZCB0ZXN0aW5nIHdpdGggY2FyZ28KKyAgICAgICAgdHJ1ZQorICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSB2YWx1ZSBmb3IgdGhlIGludm9rZV91cGRhdGFibGVfYWZsYWdzIGZsYWcuCisgICAgcHViIGZuIGludm9rZV91cGRhdGFibGVfYWZsYWdzKCkgLT4gYm9vbCB7CisgICAgICAgIC8vIFVzZWQgb25seSB0byBlbmFibGUgdHlwZWNoZWNraW5nIGFuZCB0ZXN0aW5nIHdpdGggY2FyZ28KKyAgICAgICAgdHJ1ZQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19wcm90b3MvQW5kcm9pZC5icCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19wcm90b3MvQW5kcm9pZC5icAppbmRleCBkMjQxOTk0Li4wODA2ODhlIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfcHJvdG9zL0FuZHJvaWQuYnAKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3Byb3Rvcy9BbmRyb2lkLmJwCkBAIC01OCw2ICs1OCwxMSBAQAogICAgIGNyYXRlX25hbWU6ICJhY29uZmlnX3J1c3RfcHJvdG8iLAogICAgIHNvdXJjZV9zdGVtOiAiYWNvbmZpZ19ydXN0X3Byb3RvIiwKICAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgICAgICJjb20uYW5kcm9pZC5jb25maWdpbmZyYXN0cnVjdHVyZSIsCisgICAgXSwKKyAgICBtaW5fc2RrX3ZlcnNpb246ICIzNCIsCiB9CiAKIHJ1c3RfZGVmYXVsdHMgewpAQCAtODEsNiArODYsMTEgQEAKICAgICBjcmF0ZV9uYW1lOiAiYWNvbmZpZ19wcm90b3MiLAogICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogICAgIGRlZmF1bHRzOiBbImFjb25maWdfcHJvdG9zLmRlZmF1bHRzIl0sCisgICAgYXBleF9hdmFpbGFibGU6IFsKKyAgICAgICAgIi8vYXBleF9hdmFpbGFibGU6cGxhdGZvcm0iLAorICAgICAgICAiY29tLmFuZHJvaWQuY29uZmlnaW5mcmFzdHJ1Y3R1cmUiLAorICAgIF0sCisgICAgbWluX3Nka192ZXJzaW9uOiAiMzQiLAogfQogCiBydXN0X3Rlc3RfaG9zdCB7CkBAIC04OCwzICs5OCwxMyBAQAogICAgIHRlc3Rfc3VpdGVzOiBbImdlbmVyYWwtdGVzdHMiXSwKICAgICBkZWZhdWx0czogWyJhY29uZmlnX3Byb3Rvcy5kZWZhdWx0cyJdLAogfQorCisvLyBJbnRlcm5hbCBwcm90b3MKKworcHl0aG9uX2xpYnJhcnlfaG9zdCB7CisgICAgbmFtZTogImFjb25maWdfaW50ZXJuYWxfcHJvdG9fcHl0aG9uIiwKKyAgICBzcmNzOiBbInByb3Rvcy9hY29uZmlnX2ludGVybmFsLnByb3RvIl0sCisgICAgcHJvdG86IHsKKyAgICAgICAgY2Fub25pY2FsX3BhdGhfZnJvbV9yb290OiBmYWxzZSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3Byb3Rvcy9wcm90b3MvYWNvbmZpZ19pbnRlcm5hbC5wcm90byBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19wcm90b3MvcHJvdG9zL2Fjb25maWdfaW50ZXJuYWwucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkzMGY1NgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19wcm90b3MvcHJvdG9zL2Fjb25maWdfaW50ZXJuYWwucHJvdG8KQEAgLTAsMCArMSw0MiBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UKKworLy8gVGhpcyBpcyB0aGUgc2NoZW1hIGRlZmluaXRpb24gZm9yIHByb3RvcyBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgYWNvbmZpZworLy8gdXNlIE9OTFkuIFRoZXJlIGFyZSBubyBndWFyYW50ZWVzIHJlZ2FyZGluZyBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KKy8vIERvIG5vdCBwdXQgcHJvdG9zIGhlcmUgaW50ZW5kZWQgZm9yIHN0b3JhZ2Ugb3IgY29tbXVuaWNhdGlvbi4KKworc3ludGF4ID0gInByb3RvMiI7CisKK3BhY2thZ2UgYW5kcm9pZC5hY29uZmlnX2ludGVybmFsOworCisKKy8vIFRoaXMgcHJvdG9idWYgZGVmaW5lcyBtZXNzYWdlcyB1c2VkIHRvIHN0b3JlIGRhdGEgYWJvdXQgZmxhZ3MgdXNlZCB0byBndWFyZAorLy8gQVBJcyB3aGljaCBhcmUgZmluYWxpemVkIGZvciBhIGdpdmVuIFNESy4KK21lc3NhZ2UgZmluYWxpemVkX2ZsYWcgeworICAvLyBOYW1lIG9mIHRoZSBmbGFnIChyZXF1aXJlZCkuIERvZXMgbm90IGluY2x1ZGUgcGFja2FnZSBuYW1lLgorICAvLyBNdXN0IG1hdGNoIGZsYWcgbmFtZSBpbiB0aGUgYWNvbmZpZyBkZWNsYXJhdGlvbiBoZWFkZXIuCisgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKworICAvLyBQYWNrYWdlIHRoZSBmbGFnIGJlbG9uZ3MgdG8gKHJlcXVpcmVkKS4gIE11c3QgbWF0Y2ggcGFja2FnZSBpbiB0aGUgYWNvbmZpZyBkZWNsYXJhdGlvbiBoZWFkZXIuCisgIG9wdGlvbmFsIHN0cmluZyBwYWNrYWdlID0gMjsKKworICAvLyBTREsgbGV2ZWwgaW4gd2hpY2ggdGhlIGZsYWcgd2FzIGZpbmFsaXplZC4KKyAgb3B0aW9uYWwgaW50MzIgbWluX3NkayA9IDM7CisKKyAgLy8gVE9ETyAtIGIvMzc4OTM2MDYxOiBBZGQgc3VwcG9ydCBmb3IgbWlub3IgU0RLIHZlcnNpb24gJiBTREsgZXh0ZW5zaW9uLgorfTsKKworbWVzc2FnZSBmaW5hbGl6ZWRfZmxhZ3MgeworICByZXBlYXRlZCBmaW5hbGl6ZWRfZmxhZyBmaW5hbGl6ZWRfZmxhZyA9IDE7Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfcHJvdG9zL3NyYy9saWIucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfcHJvdG9zL3NyYy9saWIucnMKaW5kZXggODFiYmQ3ZS4uNjRiODJkNiAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3Byb3Rvcy9zcmMvbGliLnJzCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19wcm90b3Mvc3JjL2xpYi5ycwpAQCAtMTA3Myw0ICsxMDczLDYzIEBACiAgICAgICAgIC8vIHR3byBpZGVudGljYWwgZmxhZ3Mgd2l0aCBkZWR1cCBlbmFibGVkCiAgICAgICAgIGFzc2VydF9lcSEoZmlyc3QsIHBhcnNlZF9mbGFnczo6bWVyZ2UodmVjIVtmaXJzdC5jbG9uZSgpLCBmaXJzdC5jbG9uZSgpXSwgdHJ1ZSkudW53cmFwKCkpOwogICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2lzX3ZhbGlkX25hbWVfaWRlbnQoKSB7CisgICAgICAgIGFzc2VydCEoaXNfdmFsaWRfbmFtZV9pZGVudCgiZm9vIikpOworICAgICAgICBhc3NlcnQhKGlzX3ZhbGlkX25hbWVfaWRlbnQoImZvb19iYXJfMTIzIikpOworICAgICAgICBhc3NlcnQhKGlzX3ZhbGlkX25hbWVfaWRlbnQoImZvb18iKSk7CisKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfbmFtZV9pZGVudCgiIikpOworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9uYW1lX2lkZW50KCIxMjNfZm9vIikpOworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9uYW1lX2lkZW50KCJmb28tYmFyIikpOworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9uYW1lX2lkZW50KCJmb28tYlx1ezAwZTV9ciIpKTsKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfbmFtZV9pZGVudCgiZm9vX19iYXIiKSk7CisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX25hbWVfaWRlbnQoIl9mb28iKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfaXNfdmFsaWRfcGFja2FnZV9pZGVudCgpIHsKKyAgICAgICAgYXNzZXJ0IShpc192YWxpZF9wYWNrYWdlX2lkZW50KCJmb28uYmFyIikpOworICAgICAgICBhc3NlcnQhKGlzX3ZhbGlkX3BhY2thZ2VfaWRlbnQoImZvby5iYXJfYmF6IikpOworICAgICAgICBhc3NlcnQhKGlzX3ZhbGlkX3BhY2thZ2VfaWRlbnQoImZvby5iYXIuYTEyMyIpKTsKKworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9wYWNrYWdlX2lkZW50KCJmb29fYmFyXzEyMyIpKTsKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfcGFja2FnZV9pZGVudCgiZm9vIikpOworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9wYWNrYWdlX2lkZW50KCJmb28uX2JhciIpKTsKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfcGFja2FnZV9pZGVudCgiIikpOworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9wYWNrYWdlX2lkZW50KCIxMjNfZm9vIikpOworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9wYWNrYWdlX2lkZW50KCJmb28tYmFyIikpOworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9wYWNrYWdlX2lkZW50KCJmb28tYlx1ezAwZTV9ciIpKTsKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfcGFja2FnZV9pZGVudCgiZm9vLmJhci4xMjMiKSk7CisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX3BhY2thZ2VfaWRlbnQoIi5mb28uYmFyIikpOworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9wYWNrYWdlX2lkZW50KCJmb28uYmFyLiIpKTsKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfcGFja2FnZV9pZGVudCgiLiIpKTsKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfcGFja2FnZV9pZGVudCgiLi4iKSk7CisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX3BhY2thZ2VfaWRlbnQoImZvby4uYmFyIikpOworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9wYWNrYWdlX2lkZW50KCJmb28uX19iYXIiKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfaXNfdmFsaWRfY29udGFpbmVyX2lkZW50KCkgeworICAgICAgICBhc3NlcnQhKGlzX3ZhbGlkX2NvbnRhaW5lcl9pZGVudCgiZm9vLmJhciIpKTsKKyAgICAgICAgYXNzZXJ0IShpc192YWxpZF9jb250YWluZXJfaWRlbnQoImZvby5iYXJfYmF6IikpOworICAgICAgICBhc3NlcnQhKGlzX3ZhbGlkX2NvbnRhaW5lcl9pZGVudCgiZm9vLmJhci5hMTIzIikpOworICAgICAgICBhc3NlcnQhKGlzX3ZhbGlkX2NvbnRhaW5lcl9pZGVudCgiZm9vIikpOworICAgICAgICBhc3NlcnQhKGlzX3ZhbGlkX2NvbnRhaW5lcl9pZGVudCgiZm9vX2Jhcl8xMjMiKSk7CisKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfY29udGFpbmVyX2lkZW50KCIiKSk7CisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX2NvbnRhaW5lcl9pZGVudCgiZm9vLl9iYXIiKSk7CisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX2NvbnRhaW5lcl9pZGVudCgiX2ZvbyIpKTsKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfY29udGFpbmVyX2lkZW50KCIxMjNfZm9vIikpOworICAgICAgICBhc3NlcnQhKCFpc192YWxpZF9jb250YWluZXJfaWRlbnQoImZvby1iYXIiKSk7CisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX2NvbnRhaW5lcl9pZGVudCgiZm9vLWJcdXswMGU1fXIiKSk7CisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX2NvbnRhaW5lcl9pZGVudCgiZm9vLmJhci4xMjMiKSk7CisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX2NvbnRhaW5lcl9pZGVudCgiLmZvby5iYXIiKSk7CisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX2NvbnRhaW5lcl9pZGVudCgiZm9vLmJhci4iKSk7CisgICAgICAgIGFzc2VydCEoIWlzX3ZhbGlkX2NvbnRhaW5lcl9pZGVudCgiLiIpKTsKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfY29udGFpbmVyX2lkZW50KCIuLiIpKTsKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfY29udGFpbmVyX2lkZW50KCJmb28uLmJhciIpKTsKKyAgICAgICAgYXNzZXJ0ISghaXNfdmFsaWRfY29udGFpbmVyX2lkZW50KCJmb28uX19iYXIiKSk7CisgICAgfQogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9BbmRyb2lkLmJwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9BbmRyb2lkLmJwCmluZGV4IDQwYjQ0NjQuLmU4NzVjN2IgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvQW5kcm9pZC5icAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL0FuZHJvaWQuYnAKQEAgLTE0LDYgKzE0LDcgQEAKICAgICAgICAgImxpYmNsYXAiLAogICAgICAgICAibGliY3h4IiwKICAgICAgICAgImxpYmFjb25maWdfc3RvcmFnZV9wcm90b3MiLAorICAgICAgICAibGlic2VyZGUiLAogICAgIF0sCiB9CiAKQEAgLTM2LDcgKzM3LDEwIEBACiAgICAgbmFtZTogImFjb25maWctc3RvcmFnZSIsCiAgICAgZGVmYXVsdHM6IFsiYWNvbmZpZ19zdG9yYWdlX2ZpbGUuZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbInNyYy9tYWluLnJzIl0sCi0gICAgcnVzdGxpYnM6IFsibGliYWNvbmZpZ19zdG9yYWdlX2ZpbGUiXSwKKyAgICBydXN0bGliczogWworICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX2ZpbGUiLAorICAgICAgICAibGlic2VyZGVfanNvbiIsCisgICAgXSwKIH0KIAogcnVzdF90ZXN0X2hvc3QgewpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9DYXJnby50b21sIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9DYXJnby50b21sCmluZGV4IDE5MmRmYWQuLmE0MDU1NzggMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvQ2FyZ28udG9tbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL0NhcmdvLnRvbWwKQEAgLTE0LDYgKzE0LDggQEAKIHRoaXNlcnJvciA9ICIxLjAuNTYiCiBjbGFwID0geyB2ZXJzaW9uID0gIjQuMS44IiwgZmVhdHVyZXMgPSBbImRlcml2ZSJdIH0KIGN4eCA9ICIxLjAiCitzZXJkZSA9IHsgdmVyc2lvbiA9ICIxLjAuMTUyIiwgZmVhdHVyZXMgPSBbImRlcml2ZSJdIH0KK3NlcmRlX2pzb24gPSAiMS4wLjkzIgogCiBbW2Jpbl1dCiBuYW1lID0gImFjb25maWctc3RvcmFnZSIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL2ZsYWdfaW5mby5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL2ZsYWdfaW5mby5ycwppbmRleCBiZWFjMzhkLi5jZjE2ODM0IDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9mbGFnX2luZm8ucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvZmxhZ19pbmZvLnJzCkBAIC0yMCwxMCArMjAsMTEgQEAKIHVzZSBjcmF0ZTo6e3JlYWRfc3RyX2Zyb21fYnl0ZXMsIHJlYWRfdTMyX2Zyb21fYnl0ZXMsIHJlYWRfdThfZnJvbV9ieXRlc307CiB1c2UgY3JhdGU6OntBY29uZmlnU3RvcmFnZUVycm9yLCBTdG9yYWdlRmlsZVR5cGV9OwogdXNlIGFueWhvdzo6YW55aG93OwordXNlIHNlcmRlOjp7RGVzZXJpYWxpemUsIFNlcmlhbGl6ZX07CiB1c2Ugc3RkOjpmbXQ7CiAKIC8vLyBGbGFnIGluZm8gaGVhZGVyIHN0cnVjdAotI1tkZXJpdmUoUGFydGlhbEVxKV0KKyNbZGVyaXZlKFBhcnRpYWxFcSwgU2VyaWFsaXplLCBEZXNlcmlhbGl6ZSldCiBwdWIgc3RydWN0IEZsYWdJbmZvSGVhZGVyIHsKICAgICBwdWIgdmVyc2lvbjogdTMyLAogICAgIHB1YiBjb250YWluZXI6IFN0cmluZywKQEAgLTg5LDcgKzkwLDcgQEAKIH0KIAogLy8vIGJpdCBmaWVsZCBmb3IgZmxhZyBpbmZvCi0jW2Rlcml2ZShDbG9uZSwgRGVidWcsIFBhcnRpYWxFcSwgRXEpXQorI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBQYXJ0aWFsRXEsIEVxLCBTZXJpYWxpemUsIERlc2VyaWFsaXplKV0KIHB1YiBlbnVtIEZsYWdJbmZvQml0IHsKICAgICBIYXNTZXJ2ZXJPdmVycmlkZSA9IDEgPDwgMCwKICAgICBJc1JlYWRXcml0ZSA9IDEgPDwgMSwKQEAgLTk3LDcgKzk4LDcgQEAKIH0KIAogLy8vIEZsYWcgaW5mbyBub2RlIHN0cnVjdAotI1tkZXJpdmUoUGFydGlhbEVxLCBDbG9uZSldCisjW2Rlcml2ZShQYXJ0aWFsRXEsIENsb25lLCBTZXJpYWxpemUsIERlc2VyaWFsaXplKV0KIHB1YiBzdHJ1Y3QgRmxhZ0luZm9Ob2RlIHsKICAgICBwdWIgYXR0cmlidXRlczogdTgsCiB9CkBAIC0xMzgsNyArMTM5LDcgQEAKIH0KIAogLy8vIEZsYWcgaW5mbyBsaXN0IHN0cnVjdAotI1tkZXJpdmUoUGFydGlhbEVxKV0KKyNbZGVyaXZlKFBhcnRpYWxFcSwgU2VyaWFsaXplLCBEZXNlcmlhbGl6ZSldCiBwdWIgc3RydWN0IEZsYWdJbmZvTGlzdCB7CiAgICAgcHViIGhlYWRlcjogRmxhZ0luZm9IZWFkZXIsCiAgICAgcHViIG5vZGVzOiBWZWM8RmxhZ0luZm9Ob2RlPiwKQEAgLTE5MywxMiArMTk0LDE1IEBACiAjW2NmZyh0ZXN0KV0KIG1vZCB0ZXN0cyB7CiAgICAgdXNlIHN1cGVyOjoqOwotICAgIHVzZSBjcmF0ZTo6dGVzdF91dGlsczo6Y3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3Q7CisgICAgdXNlIGNyYXRlOjp7CisgICAgICAgIHRlc3RfdXRpbHM6OmNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0LCBERUZBVUxUX0ZJTEVfVkVSU0lPTiwgTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04sCisgICAgfTsKIAotICAgICNbdGVzdF0KICAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biB0aGUgdmFsdWUgbGlzdCBzZXJpYWxpemF0aW9uCi0gICAgZm4gdGVzdF9zZXJpYWxpemF0aW9uKCkgewotICAgICAgICBsZXQgZmxhZ19pbmZvX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdCgpOworICAgIC8vIFRPRE86IGIvMzc2MTA4MjY4IC0gVXNlIHBhcmFtZXRlcml6ZWQgdGVzdHMuCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3Rfc2VyaWFsaXphdGlvbl9kZWZhdWx0KCkgeworICAgICAgICBsZXQgZmxhZ19pbmZvX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdChERUZBVUxUX0ZJTEVfVkVSU0lPTik7CiAKICAgICAgICAgbGV0IGhlYWRlcjogJkZsYWdJbmZvSGVhZGVyID0gJmZsYWdfaW5mb19saXN0LmhlYWRlcjsKICAgICAgICAgbGV0IHJlaW50ZXJwcmV0ZWRfaGVhZGVyID0gRmxhZ0luZm9IZWFkZXI6OmZyb21fYnl0ZXMoJmhlYWRlci5pbnRvX2J5dGVzKCkpOwpAQCAtMjE5LDIwICsyMjMsNDIgQEAKICAgICB9CiAKICAgICAjW3Rlc3RdCi0gICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGhhdCB2ZXJzaW9uIG51bWJlciBzaG91bGQgYmUgYXQgdGhlIHRvcCBvZiBzZXJpYWxpemVkCi0gICAgLy8gYnl0ZXMKLSAgICBmbiB0ZXN0X3ZlcnNpb25fbnVtYmVyKCkgewotICAgICAgICBsZXQgZmxhZ19pbmZvX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdCgpOwotICAgICAgICBsZXQgYnl0ZXMgPSAmZmxhZ19pbmZvX2xpc3QuaW50b19ieXRlcygpOwotICAgICAgICBsZXQgbXV0IGhlYWQgPSAwOwotICAgICAgICBsZXQgdmVyc2lvbiA9IHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCkudW53cmFwKCk7Ci0gICAgICAgIGFzc2VydF9lcSEodmVyc2lvbiwgMSk7CisgICAgZm4gdGVzdF9zZXJpYWxpemF0aW9uX21heCgpIHsKKyAgICAgICAgbGV0IGZsYWdfaW5mb19saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QoTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04pOworCisgICAgICAgIGxldCBoZWFkZXI6ICZGbGFnSW5mb0hlYWRlciA9ICZmbGFnX2luZm9fbGlzdC5oZWFkZXI7CisgICAgICAgIGxldCByZWludGVycHJldGVkX2hlYWRlciA9IEZsYWdJbmZvSGVhZGVyOjpmcm9tX2J5dGVzKCZoZWFkZXIuaW50b19ieXRlcygpKTsKKyAgICAgICAgYXNzZXJ0IShyZWludGVycHJldGVkX2hlYWRlci5pc19vaygpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShoZWFkZXIsICZyZWludGVycHJldGVkX2hlYWRlci51bndyYXAoKSk7CisKKyAgICAgICAgbGV0IG5vZGVzOiAmVmVjPEZsYWdJbmZvTm9kZT4gPSAmZmxhZ19pbmZvX2xpc3Qubm9kZXM7CisgICAgICAgIGZvciBub2RlIGluIG5vZGVzLml0ZXIoKSB7CisgICAgICAgICAgICBsZXQgcmVpbnRlcnByZXRlZF9ub2RlID0gRmxhZ0luZm9Ob2RlOjpmcm9tX2J5dGVzKCZub2RlLmludG9fYnl0ZXMoKSkudW53cmFwKCk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKG5vZGUsICZyZWludGVycHJldGVkX25vZGUpOworICAgICAgICB9CisKKyAgICAgICAgbGV0IGZsYWdfaW5mb19ieXRlcyA9IGZsYWdfaW5mb19saXN0LmludG9fYnl0ZXMoKTsKKyAgICAgICAgbGV0IHJlaW50ZXJwcmV0ZWRfaW5mb19saXN0ID0gRmxhZ0luZm9MaXN0Ojpmcm9tX2J5dGVzKCZmbGFnX2luZm9fYnl0ZXMpOworICAgICAgICBhc3NlcnQhKHJlaW50ZXJwcmV0ZWRfaW5mb19saXN0LmlzX29rKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZmbGFnX2luZm9fbGlzdCwgJnJlaW50ZXJwcmV0ZWRfaW5mb19saXN0LnVud3JhcCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShmbGFnX2luZm9fYnl0ZXMubGVuKCkgYXMgdTMyLCBoZWFkZXIuZmlsZV9zaXplKTsKICAgICB9CiAKKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biB0aGF0IHZlcnNpb24gbnVtYmVyIHNob3VsZCBiZSBhdCB0aGUgdG9wIG9mIHNlcmlhbGl6ZWQKKyAgICAvLyBieXRlcwogICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3ZlcnNpb25fbnVtYmVyKCkgeworICAgICAgICBsZXQgZmxhZ19pbmZvX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdChERUZBVUxUX0ZJTEVfVkVSU0lPTik7CisgICAgICAgIGxldCBieXRlcyA9ICZmbGFnX2luZm9fbGlzdC5pbnRvX2J5dGVzKCk7CisgICAgICAgIGxldCBtdXQgaGVhZCA9IDA7CisgICAgICAgIGxldCB2ZXJzaW9uX2Zyb21fZmlsZSA9IHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCkudW53cmFwKCk7CisgICAgICAgIGFzc2VydF9lcSEodmVyc2lvbl9mcm9tX2ZpbGUsIERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKyAgICB9CisKICAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBmaWxlIHR5cGUgY2hlY2sKKyAgICAjW3Rlc3RdCiAgICAgZm4gdGVzdF9maWxlX3R5cGVfY2hlY2soKSB7Ci0gICAgICAgIGxldCBtdXQgZmxhZ19pbmZvX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdCgpOworICAgICAgICBsZXQgbXV0IGZsYWdfaW5mb19saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QoREVGQVVMVF9GSUxFX1ZFUlNJT04pOwogICAgICAgICBmbGFnX2luZm9fbGlzdC5oZWFkZXIuZmlsZV90eXBlID0gMTIzdTg7CiAgICAgICAgIGxldCBlcnJvciA9IEZsYWdJbmZvTGlzdDo6ZnJvbV9ieXRlcygmZmxhZ19pbmZvX2xpc3QuaW50b19ieXRlcygpKS51bndyYXBfZXJyKCk7CiAgICAgICAgIGFzc2VydF9lcSEoCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9mbGFnX3RhYmxlLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvZmxhZ190YWJsZS5ycwppbmRleCA2NjBlZGFjLi42ZmJlZTAyIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9mbGFnX3RhYmxlLnJzCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL2ZsYWdfdGFibGUucnMKQEAgLTIzLDEwICsyMywxMSBAQAogfTsKIHVzZSBjcmF0ZTo6e0Fjb25maWdTdG9yYWdlRXJyb3IsIFN0b3JhZ2VGaWxlVHlwZSwgU3RvcmVkRmxhZ1R5cGV9OwogdXNlIGFueWhvdzo6YW55aG93OwordXNlIHNlcmRlOjp7RGVzZXJpYWxpemUsIFNlcmlhbGl6ZX07CiB1c2Ugc3RkOjpmbXQ7CiAKIC8vLyBGbGFnIHRhYmxlIGhlYWRlciBzdHJ1Y3QKLSNbZGVyaXZlKFBhcnRpYWxFcSldCisjW2Rlcml2ZShQYXJ0aWFsRXEsIFNlcmlhbGl6ZSwgRGVzZXJpYWxpemUpXQogcHViIHN0cnVjdCBGbGFnVGFibGVIZWFkZXIgewogICAgIHB1YiB2ZXJzaW9uOiB1MzIsCiAgICAgcHViIGNvbnRhaW5lcjogU3RyaW5nLApAQCAtOTUsNyArOTYsNyBAQAogfQogCiAvLy8gRmxhZyB0YWJsZSBub2RlIHN0cnVjdAotI1tkZXJpdmUoUGFydGlhbEVxLCBDbG9uZSldCisjW2Rlcml2ZShQYXJ0aWFsRXEsIENsb25lLCBTZXJpYWxpemUsIERlc2VyaWFsaXplKV0KIHB1YiBzdHJ1Y3QgRmxhZ1RhYmxlTm9kZSB7CiAgICAgcHViIHBhY2thZ2VfaWQ6IHUzMiwKICAgICBwdWIgZmxhZ19uYW1lOiBTdHJpbmcsCkBAIC0xNTQsNyArMTU1LDcgQEAKICAgICB9CiB9CiAKLSNbZGVyaXZlKFBhcnRpYWxFcSldCisjW2Rlcml2ZShQYXJ0aWFsRXEsIFNlcmlhbGl6ZSwgRGVzZXJpYWxpemUpXQogcHViIHN0cnVjdCBGbGFnVGFibGUgewogICAgIHB1YiBoZWFkZXI6IEZsYWdUYWJsZUhlYWRlciwKICAgICBwdWIgYnVja2V0czogVmVjPE9wdGlvbjx1MzI+PiwKQEAgLTIxOSwxMiArMjIwLDE1IEBACiAjW2NmZyh0ZXN0KV0KIG1vZCB0ZXN0cyB7CiAgICAgdXNlIHN1cGVyOjoqOwotICAgIHVzZSBjcmF0ZTo6dGVzdF91dGlsczo6Y3JlYXRlX3Rlc3RfZmxhZ190YWJsZTsKKyAgICB1c2UgY3JhdGU6OnsKKyAgICAgICAgdGVzdF91dGlsczo6Y3JlYXRlX3Rlc3RfZmxhZ190YWJsZSwgREVGQVVMVF9GSUxFX1ZFUlNJT04sIE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OLAorICAgIH07CiAKLSAgICAjW3Rlc3RdCiAgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGhlIHRhYmxlIHNlcmlhbGl6YXRpb24KLSAgICBmbiB0ZXN0X3NlcmlhbGl6YXRpb24oKSB7Ci0gICAgICAgIGxldCBmbGFnX3RhYmxlID0gY3JlYXRlX3Rlc3RfZmxhZ190YWJsZSgpOworICAgIC8vIFRPRE86IGIvMzc2MTA4MjY4IC0gVXNlIHBhcmFtZXRlcml6ZWQgdGVzdHMuCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3Rfc2VyaWFsaXphdGlvbl9kZWZhdWx0KCkgeworICAgICAgICBsZXQgZmxhZ190YWJsZSA9IGNyZWF0ZV90ZXN0X2ZsYWdfdGFibGUoREVGQVVMVF9GSUxFX1ZFUlNJT04pOwogCiAgICAgICAgIGxldCBoZWFkZXI6ICZGbGFnVGFibGVIZWFkZXIgPSAmZmxhZ190YWJsZS5oZWFkZXI7CiAgICAgICAgIGxldCByZWludGVycHJldGVkX2hlYWRlciA9IEZsYWdUYWJsZUhlYWRlcjo6ZnJvbV9ieXRlcygmaGVhZGVyLmludG9fYnl0ZXMoKSk7CkBAIC0yNDUsMjAgKzI0OSw0MiBAQAogICAgIH0KIAogICAgICNbdGVzdF0KLSAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biB0aGF0IHZlcnNpb24gbnVtYmVyIHNob3VsZCBiZSBhdCB0aGUgdG9wIG9mIHNlcmlhbGl6ZWQKLSAgICAvLyBieXRlcwotICAgIGZuIHRlc3RfdmVyc2lvbl9udW1iZXIoKSB7Ci0gICAgICAgIGxldCBmbGFnX3RhYmxlID0gY3JlYXRlX3Rlc3RfZmxhZ190YWJsZSgpOwotICAgICAgICBsZXQgYnl0ZXMgPSAmZmxhZ190YWJsZS5pbnRvX2J5dGVzKCk7Ci0gICAgICAgIGxldCBtdXQgaGVhZCA9IDA7Ci0gICAgICAgIGxldCB2ZXJzaW9uID0gcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKS51bndyYXAoKTsKLSAgICAgICAgYXNzZXJ0X2VxISh2ZXJzaW9uLCAxKTsKKyAgICBmbiB0ZXN0X3NlcmlhbGl6YXRpb25fbWF4KCkgeworICAgICAgICBsZXQgZmxhZ190YWJsZSA9IGNyZWF0ZV90ZXN0X2ZsYWdfdGFibGUoTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04pOworCisgICAgICAgIGxldCBoZWFkZXI6ICZGbGFnVGFibGVIZWFkZXIgPSAmZmxhZ190YWJsZS5oZWFkZXI7CisgICAgICAgIGxldCByZWludGVycHJldGVkX2hlYWRlciA9IEZsYWdUYWJsZUhlYWRlcjo6ZnJvbV9ieXRlcygmaGVhZGVyLmludG9fYnl0ZXMoKSk7CisgICAgICAgIGFzc2VydCEocmVpbnRlcnByZXRlZF9oZWFkZXIuaXNfb2soKSk7CisgICAgICAgIGFzc2VydF9lcSEoaGVhZGVyLCAmcmVpbnRlcnByZXRlZF9oZWFkZXIudW53cmFwKCkpOworCisgICAgICAgIGxldCBub2RlczogJlZlYzxGbGFnVGFibGVOb2RlPiA9ICZmbGFnX3RhYmxlLm5vZGVzOworICAgICAgICBmb3Igbm9kZSBpbiBub2Rlcy5pdGVyKCkgeworICAgICAgICAgICAgbGV0IHJlaW50ZXJwcmV0ZWRfbm9kZSA9IEZsYWdUYWJsZU5vZGU6OmZyb21fYnl0ZXMoJm5vZGUuaW50b19ieXRlcygpKS51bndyYXAoKTsKKyAgICAgICAgICAgIGFzc2VydF9lcSEobm9kZSwgJnJlaW50ZXJwcmV0ZWRfbm9kZSk7CisgICAgICAgIH0KKworICAgICAgICBsZXQgZmxhZ190YWJsZV9ieXRlcyA9IGZsYWdfdGFibGUuaW50b19ieXRlcygpOworICAgICAgICBsZXQgcmVpbnRlcnByZXRlZF90YWJsZSA9IEZsYWdUYWJsZTo6ZnJvbV9ieXRlcygmZmxhZ190YWJsZV9ieXRlcyk7CisgICAgICAgIGFzc2VydCEocmVpbnRlcnByZXRlZF90YWJsZS5pc19vaygpKTsKKyAgICAgICAgYXNzZXJ0X2VxISgmZmxhZ190YWJsZSwgJnJlaW50ZXJwcmV0ZWRfdGFibGUudW53cmFwKCkpOworICAgICAgICBhc3NlcnRfZXEhKGZsYWdfdGFibGVfYnl0ZXMubGVuKCkgYXMgdTMyLCBoZWFkZXIuZmlsZV9zaXplKTsKICAgICB9CiAKKyAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biB0aGF0IHZlcnNpb24gbnVtYmVyIHNob3VsZCBiZSBhdCB0aGUgdG9wIG9mIHNlcmlhbGl6ZWQKKyAgICAvLyBieXRlcwogICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3ZlcnNpb25fbnVtYmVyKCkgeworICAgICAgICBsZXQgZmxhZ190YWJsZSA9IGNyZWF0ZV90ZXN0X2ZsYWdfdGFibGUoREVGQVVMVF9GSUxFX1ZFUlNJT04pOworICAgICAgICBsZXQgYnl0ZXMgPSAmZmxhZ190YWJsZS5pbnRvX2J5dGVzKCk7CisgICAgICAgIGxldCBtdXQgaGVhZCA9IDA7CisgICAgICAgIGxldCB2ZXJzaW9uX2Zyb21fZmlsZSA9IHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCkudW53cmFwKCk7CisgICAgICAgIGFzc2VydF9lcSEodmVyc2lvbl9mcm9tX2ZpbGUsIERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKyAgICB9CisKICAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBmaWxlIHR5cGUgY2hlY2sKKyAgICAjW3Rlc3RdCiAgICAgZm4gdGVzdF9maWxlX3R5cGVfY2hlY2soKSB7Ci0gICAgICAgIGxldCBtdXQgZmxhZ190YWJsZSA9IGNyZWF0ZV90ZXN0X2ZsYWdfdGFibGUoKTsKKyAgICAgICAgbGV0IG11dCBmbGFnX3RhYmxlID0gY3JlYXRlX3Rlc3RfZmxhZ190YWJsZShERUZBVUxUX0ZJTEVfVkVSU0lPTik7CiAgICAgICAgIGZsYWdfdGFibGUuaGVhZGVyLmZpbGVfdHlwZSA9IDEyM3U4OwogICAgICAgICBsZXQgZXJyb3IgPSBGbGFnVGFibGU6OmZyb21fYnl0ZXMoJmZsYWdfdGFibGUuaW50b19ieXRlcygpKS51bndyYXBfZXJyKCk7CiAgICAgICAgIGFzc2VydF9lcSEoCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9mbGFnX3ZhbHVlLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvZmxhZ192YWx1ZS5ycwppbmRleCA1MDY5MjRiLi45YTE0YmVjIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9mbGFnX3ZhbHVlLnJzCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL2ZsYWdfdmFsdWUucnMKQEAgLTIwLDEwICsyMCwxMSBAQAogdXNlIGNyYXRlOjp7cmVhZF9zdHJfZnJvbV9ieXRlcywgcmVhZF91MzJfZnJvbV9ieXRlcywgcmVhZF91OF9mcm9tX2J5dGVzfTsKIHVzZSBjcmF0ZTo6e0Fjb25maWdTdG9yYWdlRXJyb3IsIFN0b3JhZ2VGaWxlVHlwZX07CiB1c2UgYW55aG93Ojphbnlob3c7Cit1c2Ugc2VyZGU6OntEZXNlcmlhbGl6ZSwgU2VyaWFsaXplfTsKIHVzZSBzdGQ6OmZtdDsKIAogLy8vIEZsYWcgdmFsdWUgaGVhZGVyIHN0cnVjdAotI1tkZXJpdmUoUGFydGlhbEVxKV0KKyNbZGVyaXZlKFBhcnRpYWxFcSwgU2VyaWFsaXplLCBEZXNlcmlhbGl6ZSldCiBwdWIgc3RydWN0IEZsYWdWYWx1ZUhlYWRlciB7CiAgICAgcHViIHZlcnNpb246IHUzMiwKICAgICBwdWIgY29udGFpbmVyOiBTdHJpbmcsCkBAIC04OSw3ICs5MCw3IEBACiB9CiAKIC8vLyBGbGFnIHZhbHVlIGxpc3Qgc3RydWN0Ci0jW2Rlcml2ZShQYXJ0aWFsRXEpXQorI1tkZXJpdmUoUGFydGlhbEVxLCBTZXJpYWxpemUsIERlc2VyaWFsaXplKV0KIHB1YiBzdHJ1Y3QgRmxhZ1ZhbHVlTGlzdCB7CiAgICAgcHViIGhlYWRlcjogRmxhZ1ZhbHVlSGVhZGVyLAogICAgIHB1YiBib29sZWFuczogVmVjPGJvb2w+LApAQCAtMTMxLDEyICsxMzIsMzIgQEAKICNbY2ZnKHRlc3QpXQogbW9kIHRlc3RzIHsKICAgICB1c2Ugc3VwZXI6Oio7Ci0gICAgdXNlIGNyYXRlOjp0ZXN0X3V0aWxzOjpjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3Q7CisgICAgdXNlIGNyYXRlOjp7CisgICAgICAgIHRlc3RfdXRpbHM6OmNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdCwgREVGQVVMVF9GSUxFX1ZFUlNJT04sIE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OLAorICAgIH07CiAKICAgICAjW3Rlc3RdCiAgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGhlIHZhbHVlIGxpc3Qgc2VyaWFsaXphdGlvbgotICAgIGZuIHRlc3Rfc2VyaWFsaXphdGlvbigpIHsKLSAgICAgICAgbGV0IGZsYWdfdmFsdWVfbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdCgpOworICAgIC8vIFRPRE86IGIvMzc2MTA4MjY4IC0gVXNlIHBhcmFtZXRlcml6ZWQgdGVzdHMuCisgICAgZm4gdGVzdF9zZXJpYWxpemF0aW9uX2RlZmF1bHQoKSB7CisgICAgICAgIGxldCBmbGFnX3ZhbHVlX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QoREVGQVVMVF9GSUxFX1ZFUlNJT04pOworCisgICAgICAgIGxldCBoZWFkZXI6ICZGbGFnVmFsdWVIZWFkZXIgPSAmZmxhZ192YWx1ZV9saXN0LmhlYWRlcjsKKyAgICAgICAgbGV0IHJlaW50ZXJwcmV0ZWRfaGVhZGVyID0gRmxhZ1ZhbHVlSGVhZGVyOjpmcm9tX2J5dGVzKCZoZWFkZXIuaW50b19ieXRlcygpKTsKKyAgICAgICAgYXNzZXJ0IShyZWludGVycHJldGVkX2hlYWRlci5pc19vaygpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShoZWFkZXIsICZyZWludGVycHJldGVkX2hlYWRlci51bndyYXAoKSk7CisKKyAgICAgICAgbGV0IGZsYWdfdmFsdWVfYnl0ZXMgPSBmbGFnX3ZhbHVlX2xpc3QuaW50b19ieXRlcygpOworICAgICAgICBsZXQgcmVpbnRlcnByZXRlZF92YWx1ZV9saXN0ID0gRmxhZ1ZhbHVlTGlzdDo6ZnJvbV9ieXRlcygmZmxhZ192YWx1ZV9ieXRlcyk7CisgICAgICAgIGFzc2VydCEocmVpbnRlcnByZXRlZF92YWx1ZV9saXN0LmlzX29rKCkpOworICAgICAgICBhc3NlcnRfZXEhKCZmbGFnX3ZhbHVlX2xpc3QsICZyZWludGVycHJldGVkX3ZhbHVlX2xpc3QudW53cmFwKCkpOworICAgICAgICBhc3NlcnRfZXEhKGZsYWdfdmFsdWVfYnl0ZXMubGVuKCkgYXMgdTMyLCBoZWFkZXIuZmlsZV9zaXplKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGhlIHZhbHVlIGxpc3Qgc2VyaWFsaXphdGlvbgorICAgIGZuIHRlc3Rfc2VyaWFsaXphdGlvbl9tYXgoKSB7CisgICAgICAgIGxldCBmbGFnX3ZhbHVlX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QoTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04pOwogCiAgICAgICAgIGxldCBoZWFkZXI6ICZGbGFnVmFsdWVIZWFkZXIgPSAmZmxhZ192YWx1ZV9saXN0LmhlYWRlcjsKICAgICAgICAgbGV0IHJlaW50ZXJwcmV0ZWRfaGVhZGVyID0gRmxhZ1ZhbHVlSGVhZGVyOjpmcm9tX2J5dGVzKCZoZWFkZXIuaW50b19ieXRlcygpKTsKQEAgLTE1NCwxNyArMTc1LDE3IEBACiAgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGhhdCB2ZXJzaW9uIG51bWJlciBzaG91bGQgYmUgYXQgdGhlIHRvcCBvZiBzZXJpYWxpemVkCiAgICAgLy8gYnl0ZXMKICAgICBmbiB0ZXN0X3ZlcnNpb25fbnVtYmVyKCkgewotICAgICAgICBsZXQgZmxhZ192YWx1ZV9saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ192YWx1ZV9saXN0KCk7CisgICAgICAgIGxldCBmbGFnX3ZhbHVlX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QoREVGQVVMVF9GSUxFX1ZFUlNJT04pOwogICAgICAgICBsZXQgYnl0ZXMgPSAmZmxhZ192YWx1ZV9saXN0LmludG9fYnl0ZXMoKTsKICAgICAgICAgbGV0IG11dCBoZWFkID0gMDsKLSAgICAgICAgbGV0IHZlcnNpb24gPSByZWFkX3UzMl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpLnVud3JhcCgpOwotICAgICAgICBhc3NlcnRfZXEhKHZlcnNpb24sIDEpOworICAgICAgICBsZXQgdmVyc2lvbl9mcm9tX2ZpbGUgPSByZWFkX3UzMl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKHZlcnNpb25fZnJvbV9maWxlLCBERUZBVUxUX0ZJTEVfVkVSU0lPTik7CiAgICAgfQogCiAgICAgI1t0ZXN0XQogICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIGZpbGUgdHlwZSBjaGVjawogICAgIGZuIHRlc3RfZmlsZV90eXBlX2NoZWNrKCkgewotICAgICAgICBsZXQgbXV0IGZsYWdfdmFsdWVfbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdCgpOworICAgICAgICBsZXQgbXV0IGZsYWdfdmFsdWVfbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdChERUZBVUxUX0ZJTEVfVkVSU0lPTik7CiAgICAgICAgIGZsYWdfdmFsdWVfbGlzdC5oZWFkZXIuZmlsZV90eXBlID0gMTIzdTg7CiAgICAgICAgIGxldCBlcnJvciA9IEZsYWdWYWx1ZUxpc3Q6OmZyb21fYnl0ZXMoJmZsYWdfdmFsdWVfbGlzdC5pbnRvX2J5dGVzKCkpLnVud3JhcF9lcnIoKTsKICAgICAgICAgYXNzZXJ0X2VxISgKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL2xpYi5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL2xpYi5ycwppbmRleCBiNjM2N2ZmLi5lOTkxMzIwIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9saWIucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvbGliLnJzCkBAIC00MSw2ICs0MSw3IEBACiBwdWIgbW9kIHRlc3RfdXRpbHM7CiAKIHVzZSBhbnlob3c6OmFueWhvdzsKK3VzZSBzZXJkZTo6e0Rlc2VyaWFsaXplLCBTZXJpYWxpemV9OwogdXNlIHN0ZDo6Y21wOjpPcmRlcmluZzsKIHVzZSBzdGQ6OmZzOjpGaWxlOwogdXNlIHN0ZDo6aGFzaDo6SGFzaGVyOwpAQCAtNTYsOCArNTcsMTMgQEAKICAgICBCeXRlc1BhcnNlRmFpbCwgSGFzaFRhYmxlU2l6ZUxpbWl0LCBJbnZhbGlkRmxhZ1ZhbHVlVHlwZSwgSW52YWxpZFN0b3JlZEZsYWdUeXBlLAogfTsKIAotLy8vIFN0b3JhZ2UgZmlsZSB2ZXJzaW9uCi1wdWIgY29uc3QgRklMRV9WRVJTSU9OOiB1MzIgPSAxOworLy8vIFRoZSBtYXggc3RvcmFnZSBmaWxlIHZlcnNpb24gZnJvbSB3aGljaCB3ZSBjYW4gc2FmZWx5IHJlYWQvd3JpdGUuIE1heSBiZQorLy8vIGV4cGVyaW1lbnRhbC4KK3B1YiBjb25zdCBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTjogdTMyID0gMjsKKworLy8vIFRoZSBuZXdlc3QgZnVsbHktcmVsZWFzZWQgdmVyc2lvbi4gVW5sZXNzIG90aGVyd2lzZSBzcGVjaWZpZWQsIHRoaXMgaXMgdGhlCisvLy8gdmVyc2lvbiB3ZSB3aWxsIHdyaXRlLgorcHViIGNvbnN0IERFRkFVTFRfRklMRV9WRVJTSU9OOiB1MzIgPSAxOwogCiAvLy8gR29vZCBoYXNoIHRhYmxlIHByaW1lIG51bWJlcgogcHViKGNyYXRlKSBjb25zdCBIQVNIX1BSSU1FUzogW3UzMjsgMjldID0gWwpAQCAtMTA3LDcgKzExMyw3IEBACiAKIC8vLyBGbGFnIHR5cGUgZW51bSBhcyBzdG9yZWQgYnkgc3RvcmFnZSBmaWxlCiAvLy8gT05MWSBBUFBFTkQsIE5FVkVSIFJFTU9WRSBGT1IgQkFDS1dBUkQgQ09NUEFUSUJJTElUWS4gVEhFIE1BWCBJUyBVMTYuCi0jW2Rlcml2ZShDbG9uZSwgQ29weSwgRGVidWcsIFBhcnRpYWxFcSwgRXEpXQorI1tkZXJpdmUoQ2xvbmUsIENvcHksIERlYnVnLCBQYXJ0aWFsRXEsIEVxLCBTZXJpYWxpemUsIERlc2VyaWFsaXplKV0KIHB1YiBlbnVtIFN0b3JlZEZsYWdUeXBlIHsKICAgICBSZWFkV3JpdGVCb29sZWFuID0gMCwKICAgICBSZWFkT25seUJvb2xlYW4gPSAxLApAQCAtMjQzLDYgKzI0OSwxMSBAQAogICAgIE9rKHZhbCkKIH0KIAorLy8vIFJlYWQgYW5kIHBhcnNlIHRoZSBmaXJzdCA0IGJ5dGVzIG9mIGJ1ZiBhcyB1MzIuCitwdWIgZm4gcmVhZF91MzJfZnJvbV9zdGFydF9vZl9ieXRlcyhidWY6ICZbdThdKSAtPiBSZXN1bHQ8dTMyLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgcmVhZF91MzJfZnJvbV9ieXRlcyhidWYsICZtdXQgMCkKK30KKwogLy8vIFJlYWQgYW5kIHBhcnNlIGJ5dGVzIGFzIHUzMgogcHViIGZuIHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnVmOiAmW3U4XSwgaGVhZDogJm11dCB1c2l6ZSkgLT4gUmVzdWx0PHUzMiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4gewogICAgIGxldCB2YWwgPQpAQCAtMjUzLDYgKzI2NCwxNiBAQAogICAgIE9rKHZhbCkKIH0KIAorLy8gUmVhZCBhbmQgcGFyc2UgYnl0ZXMgYXMgdTY0CitwdWIgZm4gcmVhZF91NjRfZnJvbV9ieXRlcyhidWY6ICZbdThdLCBoZWFkOiAmbXV0IHVzaXplKSAtPiBSZXN1bHQ8dTY0LCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgbGV0IHZhbCA9CisgICAgICAgIHU2NDo6ZnJvbV9sZV9ieXRlcyhidWZbKmhlYWQuLipoZWFkICsgOF0udHJ5X2ludG8oKS5tYXBfZXJyKHxlcnJtc2d8IHsKKyAgICAgICAgICAgIEJ5dGVzUGFyc2VGYWlsKGFueWhvdyEoImZhaWwgdG8gcGFyc2UgdTY0IGZyb20gYnl0ZXM6IHt9IiwgZXJybXNnKSkKKyAgICAgICAgfSk/KTsKKyAgICAqaGVhZCArPSA4OworICAgIE9rKHZhbCkKK30KKwogLy8vIFJlYWQgYW5kIHBhcnNlIGJ5dGVzIGFzIHN0cmluZwogcHViKGNyYXRlKSBmbiByZWFkX3N0cl9mcm9tX2J5dGVzKAogICAgIGJ1ZjogJlt1OF0sCkBAIC01MTUsMTAgKzUzNiwxNSBAQAogICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHRoZSBmbGFnIGxpc3QgYXBpCiAgICAgZm4gdGVzdF9saXN0X2ZsYWcoKSB7CiAgICAgICAgIGxldCBwYWNrYWdlX3RhYmxlID0KLSAgICAgICAgICAgIHdyaXRlX2J5dGVzX3RvX3RlbXBfZmlsZSgmY3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZSgpLmludG9fYnl0ZXMoKSkudW53cmFwKCk7Ci0gICAgICAgIGxldCBmbGFnX3RhYmxlID0gd3JpdGVfYnl0ZXNfdG9fdGVtcF9maWxlKCZjcmVhdGVfdGVzdF9mbGFnX3RhYmxlKCkuaW50b19ieXRlcygpKS51bndyYXAoKTsKLSAgICAgICAgbGV0IGZsYWdfdmFsdWVfbGlzdCA9Ci0gICAgICAgICAgICB3cml0ZV9ieXRlc190b190ZW1wX2ZpbGUoJmNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdCgpLmludG9fYnl0ZXMoKSkudW53cmFwKCk7CisgICAgICAgICAgICB3cml0ZV9ieXRlc190b190ZW1wX2ZpbGUoJmNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUoREVGQVVMVF9GSUxFX1ZFUlNJT04pLmludG9fYnl0ZXMoKSkKKyAgICAgICAgICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBmbGFnX3RhYmxlID0KKyAgICAgICAgICAgIHdyaXRlX2J5dGVzX3RvX3RlbXBfZmlsZSgmY3JlYXRlX3Rlc3RfZmxhZ190YWJsZShERUZBVUxUX0ZJTEVfVkVSU0lPTikuaW50b19ieXRlcygpKQorICAgICAgICAgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgbGV0IGZsYWdfdmFsdWVfbGlzdCA9IHdyaXRlX2J5dGVzX3RvX3RlbXBfZmlsZSgKKyAgICAgICAgICAgICZjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QoREVGQVVMVF9GSUxFX1ZFUlNJT04pLmludG9fYnl0ZXMoKSwKKyAgICAgICAgKQorICAgICAgICAudW53cmFwKCk7CiAKICAgICAgICAgbGV0IHBhY2thZ2VfdGFibGVfcGF0aCA9IHBhY2thZ2VfdGFibGUucGF0aCgpLmRpc3BsYXkoKS50b19zdHJpbmcoKTsKICAgICAgICAgbGV0IGZsYWdfdGFibGVfcGF0aCA9IGZsYWdfdGFibGUucGF0aCgpLmRpc3BsYXkoKS50b19zdHJpbmcoKTsKQEAgLTU4MywxMiArNjA5LDE5IEBACiAgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGhlIGZsYWcgbGlzdCB3aXRoIGluZm8gYXBpCiAgICAgZm4gdGVzdF9saXN0X2ZsYWdfd2l0aF9pbmZvKCkgewogICAgICAgICBsZXQgcGFja2FnZV90YWJsZSA9Ci0gICAgICAgICAgICB3cml0ZV9ieXRlc190b190ZW1wX2ZpbGUoJmNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUoKS5pbnRvX2J5dGVzKCkpLnVud3JhcCgpOwotICAgICAgICBsZXQgZmxhZ190YWJsZSA9IHdyaXRlX2J5dGVzX3RvX3RlbXBfZmlsZSgmY3JlYXRlX3Rlc3RfZmxhZ190YWJsZSgpLmludG9fYnl0ZXMoKSkudW53cmFwKCk7Ci0gICAgICAgIGxldCBmbGFnX3ZhbHVlX2xpc3QgPQotICAgICAgICAgICAgd3JpdGVfYnl0ZXNfdG9fdGVtcF9maWxlKCZjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QoKS5pbnRvX2J5dGVzKCkpLnVud3JhcCgpOwotICAgICAgICBsZXQgZmxhZ19pbmZvX2xpc3QgPQotICAgICAgICAgICAgd3JpdGVfYnl0ZXNfdG9fdGVtcF9maWxlKCZjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdCgpLmludG9fYnl0ZXMoKSkudW53cmFwKCk7CisgICAgICAgICAgICB3cml0ZV9ieXRlc190b190ZW1wX2ZpbGUoJmNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUoREVGQVVMVF9GSUxFX1ZFUlNJT04pLmludG9fYnl0ZXMoKSkKKyAgICAgICAgICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBmbGFnX3RhYmxlID0KKyAgICAgICAgICAgIHdyaXRlX2J5dGVzX3RvX3RlbXBfZmlsZSgmY3JlYXRlX3Rlc3RfZmxhZ190YWJsZShERUZBVUxUX0ZJTEVfVkVSU0lPTikuaW50b19ieXRlcygpKQorICAgICAgICAgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgbGV0IGZsYWdfdmFsdWVfbGlzdCA9IHdyaXRlX2J5dGVzX3RvX3RlbXBfZmlsZSgKKyAgICAgICAgICAgICZjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QoREVGQVVMVF9GSUxFX1ZFUlNJT04pLmludG9fYnl0ZXMoKSwKKyAgICAgICAgKQorICAgICAgICAudW53cmFwKCk7CisgICAgICAgIGxldCBmbGFnX2luZm9fbGlzdCA9IHdyaXRlX2J5dGVzX3RvX3RlbXBfZmlsZSgKKyAgICAgICAgICAgICZjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdChERUZBVUxUX0ZJTEVfVkVSU0lPTikuaW50b19ieXRlcygpLAorICAgICAgICApCisgICAgICAgIC51bndyYXAoKTsKIAogICAgICAgICBsZXQgcGFja2FnZV90YWJsZV9wYXRoID0gcGFja2FnZV90YWJsZS5wYXRoKCkuZGlzcGxheSgpLnRvX3N0cmluZygpOwogICAgICAgICBsZXQgZmxhZ190YWJsZV9wYXRoID0gZmxhZ190YWJsZS5wYXRoKCkuZGlzcGxheSgpLnRvX3N0cmluZygpOwpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvbWFpbi5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL21haW4ucnMKaW5kZXggOGI5ZTM4ZC4uYTljZmQxOSAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvbWFpbi5ycworKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9tYWluLnJzCkBAIC0yMCw5ICsyMCwyOSBAQAogICAgIGxpc3RfZmxhZ3MsIGxpc3RfZmxhZ3Nfd2l0aF9pbmZvLCByZWFkX2ZpbGVfdG9fYnl0ZXMsIEFjb25maWdTdG9yYWdlRXJyb3IsIEZsYWdJbmZvTGlzdCwKICAgICBGbGFnVGFibGUsIEZsYWdWYWx1ZUxpc3QsIFBhY2thZ2VUYWJsZSwgU3RvcmFnZUZpbGVUeXBlLAogfTsKLQogdXNlIGNsYXA6OntidWlsZGVyOjpBcmdBY3Rpb24sIEFyZywgQ29tbWFuZH07Cit1c2Ugc2VyZGU6OlNlcmlhbGl6ZTsKK3VzZSBzZXJkZV9qc29uOwordXNlIHN0ZDo6Zm10OwordXNlIHN0ZDo6ZnM7Cit1c2Ugc3RkOjpmczo6RmlsZTsKK3VzZSBzdGQ6OmlvOjpXcml0ZTsKIAorLyoqCisgKiBVc2FnZSBFeGFtcGxlcworICoKKyAqIFByaW50IGZpbGU6CisgKiAkIGFjb25maWctc3RvcmFnZSBwcmludCAtLWZpbGU9cGF0aC90by9mbGFnLm1hcCAtLXR5cGU9ZmxhZ19tYXAKKyAqCisgKiBMaXN0IGZsYWdzOgorICogJCBhY29uZmlnLXN0b3JhZ2UgbGlzdCAtLWZsYWctbWFwPXBhdGgvdG8vZmxhZy5tYXAgXAorICogLS1mbGFnLXZhbD1wYXRoL3RvL2ZsYWcudmFsIC0tcGFja2FnZS1tYXA9cGF0aC90by9wYWNrYWdlLm1hcAorICoKKyAqIFdyaXRlIGJpbmFyeSBmaWxlIGZvciB0ZXN0aW5nOgorICogJCBhY29uZmlnLXN0b3JhZ2UgcHJpbnQgLS1maWxlPXBhdGgvdG8vZmxhZy5tYXAgLS10eXBlPWZsYWdfbWFwIC0tZm9ybWF0PWpzb24gPiBmbGFnX21hcC5qc29uCisgKiAkIHZpbSBmbGFnX21hcC5qc29uIC8vIE1hbnVhbGx5IG1ha2UgdXBkYXRlcworICogJCBhY29uZmlnLXN0b3JhZ2Ugd3JpdGUtYnl0ZXMgLS1pbnB1dC1maWxlPWZsYWdfbWFwLmpzb24gLS1vdXRwdXQtZmlsZT1wYXRoL3RvL2ZsYWcubWFwIC0tdHlwZT1mbGFnX21hcAorICovCiBmbiBjbGkoKSAtPiBDb21tYW5kIHsKICAgICBDb21tYW5kOjpuZXcoImFjb25maWctc3RvcmFnZSIpCiAgICAgICAgIC5zdWJjb21tYW5kX3JlcXVpcmVkKHRydWUpCkBAIC0zNCw3ICs1NCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAubG9uZygidHlwZSIpCiAgICAgICAgICAgICAgICAgICAgICAgICAucmVxdWlyZWQodHJ1ZSkKICAgICAgICAgICAgICAgICAgICAgICAgIC52YWx1ZV9wYXJzZXIofHM6ICZzdHJ8IFN0b3JhZ2VGaWxlVHlwZTo6dHJ5X2Zyb20ocykpLAotICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIC5hcmcoQXJnOjpuZXcoImZvcm1hdCIpLmxvbmcoImZvcm1hdCIpLnJlcXVpcmVkKGZhbHNlKS5hY3Rpb24oQXJnQWN0aW9uOjpTZXQpKSwKICAgICAgICAgKQogICAgICAgICAuc3ViY29tbWFuZCgKICAgICAgICAgICAgIENvbW1hbmQ6Om5ldygibGlzdCIpCkBAIC01MCw0MSArNzEsNzUgQEAKICAgICAgICAgICAgICAgICAgICAgQXJnOjpuZXcoImZsYWctaW5mbyIpLmxvbmcoImZsYWctaW5mbyIpLnJlcXVpcmVkKGZhbHNlKS5hY3Rpb24oQXJnQWN0aW9uOjpTZXQpLAogICAgICAgICAgICAgICAgICksCiAgICAgICAgICkKKyAgICAgICAgLnN1YmNvbW1hbmQoCisgICAgICAgICAgICBDb21tYW5kOjpuZXcoIndyaXRlLWJ5dGVzIikKKyAgICAgICAgICAgICAgICAvLyBXaGVyZSB0byB3cml0ZSB0aGUgb3V0cHV0IGJ5dGVzLiBTdWdnZXN0IHRvIHVzZSB0aGUgU3RvcmFnZUZpbGVUeXBlIG5hbWVzIChlLmcuIGZsYWcubWFwKS4KKyAgICAgICAgICAgICAgICAuYXJnKAorICAgICAgICAgICAgICAgICAgICBBcmc6Om5ldygib3V0cHV0LWZpbGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmxvbmcoIm91dHB1dC1maWxlIikKKyAgICAgICAgICAgICAgICAgICAgICAgIC5yZXF1aXJlZCh0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgLmFjdGlvbihBcmdBY3Rpb246OlNldCksCisgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgIC8vIElucHV0IGZpbGUgc2hvdWxkIGJlIGpzb24uCisgICAgICAgICAgICAgICAgLmFyZygKKyAgICAgICAgICAgICAgICAgICAgQXJnOjpuZXcoImlucHV0LWZpbGUiKS5sb25nKCJpbnB1dC1maWxlIikucmVxdWlyZWQodHJ1ZSkuYWN0aW9uKEFyZ0FjdGlvbjo6U2V0KSwKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgLmFyZygKKyAgICAgICAgICAgICAgICAgICAgQXJnOjpuZXcoInR5cGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLmxvbmcoInR5cGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgLnJlcXVpcmVkKHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAudmFsdWVfcGFyc2VyKHxzOiAmc3RyfCBTdG9yYWdlRmlsZVR5cGU6OnRyeV9mcm9tKHMpKSwKKyAgICAgICAgICAgICAgICApLAorICAgICAgICApCiB9CiAKIGZuIHByaW50X3N0b3JhZ2VfZmlsZSgKICAgICBmaWxlX3BhdGg6ICZzdHIsCiAgICAgZmlsZV90eXBlOiAmU3RvcmFnZUZpbGVUeXBlLAorICAgIGFzX2pzb246IGJvb2wsCiApIC0+IFJlc3VsdDwoKSwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4gewogICAgIGxldCBieXRlcyA9IHJlYWRfZmlsZV90b19ieXRlcyhmaWxlX3BhdGgpPzsKICAgICBtYXRjaCBmaWxlX3R5cGUgewogICAgICAgICBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXAgPT4gewogICAgICAgICAgICAgbGV0IHBhY2thZ2VfdGFibGUgPSBQYWNrYWdlVGFibGU6OmZyb21fYnl0ZXMoJmJ5dGVzKT87Ci0gICAgICAgICAgICBwcmludGxuISgiezo/fSIsIHBhY2thZ2VfdGFibGUpOworICAgICAgICAgICAgcHJpbnRsbiEoInt9IiwgdG9fcHJpbnRfZm9ybWF0KHBhY2thZ2VfdGFibGUsIGFzX2pzb24pKTsKICAgICAgICAgfQogICAgICAgICBTdG9yYWdlRmlsZVR5cGU6OkZsYWdNYXAgPT4gewogICAgICAgICAgICAgbGV0IGZsYWdfdGFibGUgPSBGbGFnVGFibGU6OmZyb21fYnl0ZXMoJmJ5dGVzKT87Ci0gICAgICAgICAgICBwcmludGxuISgiezo/fSIsIGZsYWdfdGFibGUpOworICAgICAgICAgICAgcHJpbnRsbiEoInt9IiwgdG9fcHJpbnRfZm9ybWF0KGZsYWdfdGFibGUsIGFzX2pzb24pKTsKICAgICAgICAgfQogICAgICAgICBTdG9yYWdlRmlsZVR5cGU6OkZsYWdWYWwgPT4gewogICAgICAgICAgICAgbGV0IGZsYWdfdmFsdWUgPSBGbGFnVmFsdWVMaXN0Ojpmcm9tX2J5dGVzKCZieXRlcyk/OwotICAgICAgICAgICAgcHJpbnRsbiEoIns6P30iLCBmbGFnX3ZhbHVlKTsKKyAgICAgICAgICAgIHByaW50bG4hKCJ7fSIsIHRvX3ByaW50X2Zvcm1hdChmbGFnX3ZhbHVlLCBhc19qc29uKSk7CiAgICAgICAgIH0KICAgICAgICAgU3RvcmFnZUZpbGVUeXBlOjpGbGFnSW5mbyA9PiB7CiAgICAgICAgICAgICBsZXQgZmxhZ19pbmZvID0gRmxhZ0luZm9MaXN0Ojpmcm9tX2J5dGVzKCZieXRlcyk/OwotICAgICAgICAgICAgcHJpbnRsbiEoIns6P30iLCBmbGFnX2luZm8pOworICAgICAgICAgICAgcHJpbnRsbiEoInt9IiwgdG9fcHJpbnRfZm9ybWF0KGZsYWdfaW5mbywgYXNfanNvbikpOwogICAgICAgICB9CiAgICAgfQogICAgIE9rKCgpKQogfQogCitmbiB0b19wcmludF9mb3JtYXQ8VD4oZmlsZV9jb250ZW50czogVCwgYXNfanNvbjogYm9vbCkgLT4gU3RyaW5nCit3aGVyZQorICAgIFQ6IFNlcmlhbGl6ZSArIGZtdDo6RGVidWcsCit7CisgICAgaWYgYXNfanNvbiB7CisgICAgICAgIHNlcmRlX2pzb246OnRvX3N0cmluZygmZmlsZV9jb250ZW50cykudW53cmFwKCkKKyAgICB9IGVsc2UgeworICAgICAgICBmb3JtYXQhKCJ7Oj99IiwgZmlsZV9jb250ZW50cykKKyAgICB9Cit9CisKIGZuIG1haW4oKSAtPiBSZXN1bHQ8KCksIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKICAgICBsZXQgbWF0Y2hlcyA9IGNsaSgpLmdldF9tYXRjaGVzKCk7CiAgICAgbWF0Y2ggbWF0Y2hlcy5zdWJjb21tYW5kKCkgewogICAgICAgICBTb21lKCgicHJpbnQiLCBzdWJfbWF0Y2hlcykpID0+IHsKICAgICAgICAgICAgIGxldCBmaWxlX3BhdGggPSBzdWJfbWF0Y2hlcy5nZXRfb25lOjo8U3RyaW5nPigiZmlsZSIpLnVud3JhcCgpOwogICAgICAgICAgICAgbGV0IGZpbGVfdHlwZSA9IHN1Yl9tYXRjaGVzLmdldF9vbmU6OjxTdG9yYWdlRmlsZVR5cGU+KCJ0eXBlIikudW53cmFwKCk7Ci0gICAgICAgICAgICBwcmludF9zdG9yYWdlX2ZpbGUoZmlsZV9wYXRoLCBmaWxlX3R5cGUpPworICAgICAgICAgICAgbGV0IGZvcm1hdCA9IHN1Yl9tYXRjaGVzLmdldF9vbmU6OjxTdHJpbmc+KCJmb3JtYXQiKTsKKyAgICAgICAgICAgIGxldCBhc19qc29uOiBib29sID0gZm9ybWF0ID09IFNvbWUoJiJqc29uIi50b19zdHJpbmcoKSk7CisgICAgICAgICAgICBwcmludF9zdG9yYWdlX2ZpbGUoZmlsZV9wYXRoLCBmaWxlX3R5cGUsIGFzX2pzb24pPwogICAgICAgICB9CiAgICAgICAgIFNvbWUoKCJsaXN0Iiwgc3ViX21hdGNoZXMpKSA9PiB7CiAgICAgICAgICAgICBsZXQgcGFja2FnZV9tYXAgPSBzdWJfbWF0Y2hlcy5nZXRfb25lOjo8U3RyaW5nPigicGFja2FnZS1tYXAiKS51bndyYXAoKTsKQEAgLTk2LDEwICsxNTEsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgbGV0IGZsYWdzID0gbGlzdF9mbGFnc193aXRoX2luZm8ocGFja2FnZV9tYXAsIGZsYWdfbWFwLCBmbGFnX3ZhbCwgaW5mb19maWxlKT87CiAgICAgICAgICAgICAgICAgICAgIGZvciBmbGFnIGluIGZsYWdzLml0ZXIoKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGxuISgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAie30ge30ge30gezo/fSBJc1JlYWRXcml0ZToge30sIEhhc1NlcnZlck92ZXJyaWRlOiB7fSwgSGFzTG9jYWxPdmVycmlkZToge30iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWcucGFja2FnZV9uYW1lLCBmbGFnLmZsYWdfbmFtZSwgZmxhZy5mbGFnX3ZhbHVlLCBmbGFnLnZhbHVlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZy5pc19yZWFkd3JpdGUsIGZsYWcuaGFzX3NlcnZlcl9vdmVycmlkZSwgZmxhZy5oYXNfbG9jYWxfb3ZlcnJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICAgICAgICAie30ge30ge30gezo/fSBJc1JlYWRXcml0ZToge30sIEhhc1NlcnZlck92ZXJyaWRlOiB7fSwgSGFzTG9jYWxPdmVycmlkZToge30iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnLnBhY2thZ2VfbmFtZSwgZmxhZy5mbGFnX25hbWUsIGZsYWcuZmxhZ192YWx1ZSwgZmxhZy52YWx1ZV90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnLmlzX3JlYWR3cml0ZSwgZmxhZy5oYXNfc2VydmVyX292ZXJyaWRlLCBmbGFnLmhhc19sb2NhbF9vdmVycmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICApOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIE5vbmUgPT4gewpAQCAtMTEzLDYgKzE2OCw0MCBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICAvLyBDb252ZXJ0cyBKU09OIG9mIHRoZSBmaWxlIGludG8gcmF3IGJ5dGVzIChhcyBpcyB1c2VkIG9uLWRldmljZSkuCisgICAgICAgIC8vIEludGVuZGVkIHRvIGdlbmVyYXRlL2Vhc2lseSB1cGRhdGUgdGhlc2UgZmlsZXMgZm9yIHRlc3RpbmcuCisgICAgICAgIFNvbWUoKCJ3cml0ZS1ieXRlcyIsIHN1Yl9tYXRjaGVzKSkgPT4geworICAgICAgICAgICAgbGV0IGlucHV0X2ZpbGVfcGF0aCA9IHN1Yl9tYXRjaGVzLmdldF9vbmU6OjxTdHJpbmc+KCJpbnB1dC1maWxlIikudW53cmFwKCk7CisgICAgICAgICAgICBsZXQgaW5wdXRfanNvbiA9IGZzOjpyZWFkX3RvX3N0cmluZyhpbnB1dF9maWxlX3BhdGgpLnVud3JhcCgpOworCisgICAgICAgICAgICBsZXQgZmlsZV90eXBlID0gc3ViX21hdGNoZXMuZ2V0X29uZTo6PFN0b3JhZ2VGaWxlVHlwZT4oInR5cGUiKS51bndyYXAoKTsKKyAgICAgICAgICAgIGxldCBvdXRwdXRfYnl0ZXM6IFZlYzx1OD47CisgICAgICAgICAgICBtYXRjaCBmaWxlX3R5cGUgeworICAgICAgICAgICAgICAgIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ1ZhbCA9PiB7CisgICAgICAgICAgICAgICAgICAgIGxldCBsaXN0OiBGbGFnVmFsdWVMaXN0ID0gc2VyZGVfanNvbjo6ZnJvbV9zdHIoJmlucHV0X2pzb24pLnVud3JhcCgpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXRfYnl0ZXMgPSBsaXN0LmludG9fYnl0ZXMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RvcmFnZUZpbGVUeXBlOjpGbGFnSW5mbyA9PiB7CisgICAgICAgICAgICAgICAgICAgIGxldCBsaXN0OiBGbGFnSW5mb0xpc3QgPSBzZXJkZV9qc29uOjpmcm9tX3N0cigmaW5wdXRfanNvbikudW53cmFwKCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dF9ieXRlcyA9IGxpc3QuaW50b19ieXRlcygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdG9yYWdlRmlsZVR5cGU6OkZsYWdNYXAgPT4geworICAgICAgICAgICAgICAgICAgICBsZXQgdGFibGU6IEZsYWdUYWJsZSA9IHNlcmRlX2pzb246OmZyb21fc3RyKCZpbnB1dF9qc29uKS51bndyYXAoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2J5dGVzID0gdGFibGUuaW50b19ieXRlcygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTdG9yYWdlRmlsZVR5cGU6OlBhY2thZ2VNYXAgPT4geworICAgICAgICAgICAgICAgICAgICBsZXQgdGFibGU6IFBhY2thZ2VUYWJsZSA9IHNlcmRlX2pzb246OmZyb21fc3RyKCZpbnB1dF9qc29uKS51bndyYXAoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2J5dGVzID0gdGFibGUuaW50b19ieXRlcygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbGV0IG91dHB1dF9maWxlX3BhdGggPSBzdWJfbWF0Y2hlcy5nZXRfb25lOjo8U3RyaW5nPigib3V0cHV0LWZpbGUiKS51bndyYXAoKTsKKyAgICAgICAgICAgIGxldCBmaWxlID0gRmlsZTo6Y3JlYXRlKG91dHB1dF9maWxlX3BhdGgpOworICAgICAgICAgICAgaWYgZmlsZS5pc19lcnIoKSB7CisgICAgICAgICAgICAgICAgcGFuaWMhKCJjYW4ndCBtYWtlIGZpbGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxldCBfID0gZmlsZS51bndyYXAoKS53cml0ZV9hbGwoJm91dHB1dF9ieXRlcyk7CisgICAgICAgIH0KICAgICAgICAgXyA9PiB1bnJlYWNoYWJsZSEoKSwKICAgICB9CiAgICAgT2soKCkpCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9wYWNrYWdlX3RhYmxlLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvcGFja2FnZV90YWJsZS5ycwppbmRleCAwMDdmODZlLi4yMTM1N2M3IDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy9wYWNrYWdlX3RhYmxlLnJzCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL3BhY2thZ2VfdGFibGUucnMKQEAgLTE3LDEzICsxNywxNyBAQAogLy8hIHBhY2thZ2UgdGFibGUgbW9kdWxlIGRlZmluZXMgdGhlIHBhY2thZ2UgdGFibGUgZmlsZSBmb3JtYXQgYW5kIG1ldGhvZHMgZm9yIHNlcmlhbGl6YXRpb24KIC8vISBhbmQgZGVzZXJpYWxpemF0aW9uCiAKLXVzZSBjcmF0ZTo6e2dldF9idWNrZXRfaW5kZXgsIHJlYWRfc3RyX2Zyb21fYnl0ZXMsIHJlYWRfdTMyX2Zyb21fYnl0ZXMsIHJlYWRfdThfZnJvbV9ieXRlc307Cit1c2UgY3JhdGU6OnsKKyAgICBnZXRfYnVja2V0X2luZGV4LCByZWFkX3N0cl9mcm9tX2J5dGVzLCByZWFkX3UzMl9mcm9tX2J5dGVzLCByZWFkX3U2NF9mcm9tX2J5dGVzLAorICAgIHJlYWRfdThfZnJvbV9ieXRlcywKK307CiB1c2UgY3JhdGU6OntBY29uZmlnU3RvcmFnZUVycm9yLCBTdG9yYWdlRmlsZVR5cGV9OwogdXNlIGFueWhvdzo6YW55aG93OwordXNlIHNlcmRlOjp7RGVzZXJpYWxpemUsIFNlcmlhbGl6ZX07CiB1c2Ugc3RkOjpmbXQ7CiAKIC8vLyBQYWNrYWdlIHRhYmxlIGhlYWRlciBzdHJ1Y3QKLSNbZGVyaXZlKFBhcnRpYWxFcSldCisjW2Rlcml2ZShQYXJ0aWFsRXEsIFNlcmlhbGl6ZSwgRGVzZXJpYWxpemUpXQogcHViIHN0cnVjdCBQYWNrYWdlVGFibGVIZWFkZXIgewogICAgIHB1YiB2ZXJzaW9uOiB1MzIsCiAgICAgcHViIGNvbnRhaW5lcjogU3RyaW5nLApAQCAtOTIsMTAgKzk2LDExIEBACiB9CiAKIC8vLyBQYWNrYWdlIHRhYmxlIG5vZGUgc3RydWN0Ci0jW2Rlcml2ZShQYXJ0aWFsRXEpXQorI1tkZXJpdmUoUGFydGlhbEVxLCBTZXJpYWxpemUsIERlc2VyaWFsaXplKV0KIHB1YiBzdHJ1Y3QgUGFja2FnZVRhYmxlTm9kZSB7CiAgICAgcHViIHBhY2thZ2VfbmFtZTogU3RyaW5nLAogICAgIHB1YiBwYWNrYWdlX2lkOiB1MzIsCisgICAgcHViIGZpbmdlcnByaW50OiB1NjQsCiAgICAgLy8gVGhlIGluZGV4IG9mIHRoZSBmaXJzdCBib29sZWFuIGZsYWcgaW4gdGhpcyBhY29uZmlnIHBhY2thZ2UgYW1vbmcgYWxsIGJvb2xlYW4KICAgICAvLyBmbGFncyBpbiB0aGlzIGNvbnRhaW5lci4KICAgICBwdWIgYm9vbGVhbl9zdGFydF9pbmRleDogdTMyLApAQCAtMTA3LDggKzExMiwxMiBAQAogICAgIGZuIGZtdCgmc2VsZiwgZjogJm11dCBmbXQ6OkZvcm1hdHRlcikgLT4gZm10OjpSZXN1bHQgewogICAgICAgICB3cml0ZWxuISgKICAgICAgICAgICAgIGYsCi0gICAgICAgICAgICAiUGFja2FnZToge30sIElkOiB7fSwgQm9vbGVhbiBmbGFnIHN0YXJ0IGluZGV4OiB7fSwgTmV4dDogezo/fSIsCi0gICAgICAgICAgICBzZWxmLnBhY2thZ2VfbmFtZSwgc2VsZi5wYWNrYWdlX2lkLCBzZWxmLmJvb2xlYW5fc3RhcnRfaW5kZXgsIHNlbGYubmV4dF9vZmZzZXQKKyAgICAgICAgICAgICJQYWNrYWdlOiB7fSwgSWQ6IHt9LCBGaW5nZXJwcmludDoge30sIEJvb2xlYW4gZmxhZyBzdGFydCBpbmRleDoge30sIE5leHQ6IHs6P30iLAorICAgICAgICAgICAgc2VsZi5wYWNrYWdlX25hbWUsCisgICAgICAgICAgICBzZWxmLnBhY2thZ2VfaWQsCisgICAgICAgICAgICBzZWxmLmZpbmdlcnByaW50LAorICAgICAgICAgICAgc2VsZi5ib29sZWFuX3N0YXJ0X2luZGV4LAorICAgICAgICAgICAgc2VsZi5uZXh0X29mZnNldAogICAgICAgICApPzsKICAgICAgICAgT2soKCkpCiAgICAgfQpAQCAtMTE2LDcgKzEyNSwxNiBAQAogCiBpbXBsIFBhY2thZ2VUYWJsZU5vZGUgewogICAgIC8vLyBTZXJpYWxpemUgdG8gYnl0ZXMKLSAgICBwdWIgZm4gaW50b19ieXRlcygmc2VsZikgLT4gVmVjPHU4PiB7CisgICAgcHViIGZuIGludG9fYnl0ZXMoJnNlbGYsIHZlcnNpb246IHUzMikgLT4gVmVjPHU4PiB7CisgICAgICAgIG1hdGNoIHZlcnNpb24geworICAgICAgICAgICAgMSA9PiBTZWxmOjppbnRvX2J5dGVzX3YxKHNlbGYpLAorICAgICAgICAgICAgMiA9PiBTZWxmOjppbnRvX2J5dGVzX3YyKHNlbGYpLAorICAgICAgICAgICAgLy8gVE9ETyhiLzMxNjM1NzY4Nik6IGludG9fYnl0ZXMgc2hvdWxkIHJldHVybiBhIFJlc3VsdC4KKyAgICAgICAgICAgIF8gPT4gU2VsZjo6aW50b19ieXRlc192Migmc2VsZiksCisgICAgICAgIH0KKyAgICB9CisKKyAgICBmbiBpbnRvX2J5dGVzX3YxKCZzZWxmKSAtPiBWZWM8dTg+IHsKICAgICAgICAgbGV0IG11dCByZXN1bHQgPSBWZWM6Om5ldygpOwogICAgICAgICBsZXQgbmFtZV9ieXRlcyA9IHNlbGYucGFja2FnZV9uYW1lLmFzX2J5dGVzKCk7CiAgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZSgmKG5hbWVfYnl0ZXMubGVuKCkgYXMgdTMyKS50b19sZV9ieXRlcygpKTsKQEAgLTEyNywxOCArMTQ1LDYwIEBACiAgICAgICAgIHJlc3VsdAogICAgIH0KIAotICAgIC8vLyBEZXNlcmlhbGl6ZSBmcm9tIGJ5dGVzCi0gICAgcHViIGZuIGZyb21fYnl0ZXMoYnl0ZXM6ICZbdThdKSAtPiBSZXN1bHQ8U2VsZiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4geworICAgIGZuIGludG9fYnl0ZXNfdjIoJnNlbGYpIC0+IFZlYzx1OD4geworICAgICAgICBsZXQgbXV0IHJlc3VsdCA9IFZlYzo6bmV3KCk7CisgICAgICAgIGxldCBuYW1lX2J5dGVzID0gc2VsZi5wYWNrYWdlX25hbWUuYXNfYnl0ZXMoKTsKKyAgICAgICAgcmVzdWx0LmV4dGVuZF9mcm9tX3NsaWNlKCYobmFtZV9ieXRlcy5sZW4oKSBhcyB1MzIpLnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UobmFtZV9ieXRlcyk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZSgmc2VsZi5wYWNrYWdlX2lkLnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoJnNlbGYuZmluZ2VycHJpbnQudG9fbGVfYnl0ZXMoKSk7CisgICAgICAgIHJlc3VsdC5leHRlbmRfZnJvbV9zbGljZSgmc2VsZi5ib29sZWFuX3N0YXJ0X2luZGV4LnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQuZXh0ZW5kX2Zyb21fc2xpY2UoJnNlbGYubmV4dF9vZmZzZXQudW53cmFwX29yKDApLnRvX2xlX2J5dGVzKCkpOworICAgICAgICByZXN1bHQKKyAgICB9CisKKyAgICAvLy8gRGVzZXJpYWxpemUgZnJvbSBieXRlcyBiYXNlZCBvbiBmaWxlIHZlcnNpb24uCisgICAgcHViIGZuIGZyb21fYnl0ZXMoYnl0ZXM6ICZbdThdLCB2ZXJzaW9uOiB1MzIpIC0+IFJlc3VsdDxTZWxmLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CisgICAgICAgIG1hdGNoIHZlcnNpb24geworICAgICAgICAgICAgMSA9PiBTZWxmOjpmcm9tX2J5dGVzX3YxKGJ5dGVzKSwKKyAgICAgICAgICAgIDIgPT4gU2VsZjo6ZnJvbV9ieXRlc192MihieXRlcyksCisgICAgICAgICAgICBfID0+IHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRXJyKEFjb25maWdTdG9yYWdlRXJyb3I6OkJ5dGVzUGFyc2VGYWlsKGFueWhvdyEoCisgICAgICAgICAgICAgICAgICAgICJCaW5hcnkgZmlsZSBpcyBhbiB1bnN1cHBvcnRlZCB2ZXJzaW9uOiB7fSIsCisgICAgICAgICAgICAgICAgICAgIHZlcnNpb24KKyAgICAgICAgICAgICAgICApKSkKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZuIGZyb21fYnl0ZXNfdjEoYnl0ZXM6ICZbdThdKSAtPiBSZXN1bHQ8U2VsZiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4gewogICAgICAgICBsZXQgbXV0IGhlYWQgPSAwOwotICAgICAgICBsZXQgbm9kZSA9IFNlbGYgewotICAgICAgICAgICAgcGFja2FnZV9uYW1lOiByZWFkX3N0cl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPywKLSAgICAgICAgICAgIHBhY2thZ2VfaWQ6IHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/LAotICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleDogcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT8sCi0gICAgICAgICAgICBuZXh0X29mZnNldDogbWF0Y2ggcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT8gewotICAgICAgICAgICAgICAgIDAgPT4gTm9uZSwKLSAgICAgICAgICAgICAgICB2YWwgPT4gU29tZSh2YWwpLAotICAgICAgICAgICAgfSwKKyAgICAgICAgbGV0IHBhY2thZ2VfbmFtZSA9IHJlYWRfc3RyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/OworICAgICAgICBsZXQgcGFja2FnZV9pZCA9IHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/OworICAgICAgICAvLyB2MSBkb2VzIG5vdCBoYXZlIGZpbmdlcnByaW50LCBzbyBqdXN0IHNldCB0byAwLgorICAgICAgICBsZXQgZmluZ2VycHJpbnQ6IHU2NCA9IDA7CisgICAgICAgIGxldCBib29sZWFuX3N0YXJ0X2luZGV4ID0gcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT87CisgICAgICAgIGxldCBuZXh0X29mZnNldCA9IG1hdGNoIHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/IHsKKyAgICAgICAgICAgIDAgPT4gTm9uZSwKKyAgICAgICAgICAgIHZhbCA9PiBTb21lKHZhbCksCiAgICAgICAgIH07CisKKyAgICAgICAgbGV0IG5vZGUgPSBTZWxmIHsgcGFja2FnZV9uYW1lLCBwYWNrYWdlX2lkLCBmaW5nZXJwcmludCwgYm9vbGVhbl9zdGFydF9pbmRleCwgbmV4dF9vZmZzZXQgfTsKKyAgICAgICAgT2sobm9kZSkKKyAgICB9CisKKyAgICBmbiBmcm9tX2J5dGVzX3YyKGJ5dGVzOiAmW3U4XSkgLT4gUmVzdWx0PFNlbGYsIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKKyAgICAgICAgbGV0IG11dCBoZWFkID0gMDsKKyAgICAgICAgbGV0IHBhY2thZ2VfbmFtZSA9IHJlYWRfc3RyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/OworICAgICAgICBsZXQgcGFja2FnZV9pZCA9IHJlYWRfdTMyX2Zyb21fYnl0ZXMoYnl0ZXMsICZtdXQgaGVhZCk/OworICAgICAgICBsZXQgZmluZ2VycHJpbnQgPSByZWFkX3U2NF9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPzsKKyAgICAgICAgbGV0IGJvb2xlYW5fc3RhcnRfaW5kZXggPSByZWFkX3UzMl9mcm9tX2J5dGVzKGJ5dGVzLCAmbXV0IGhlYWQpPzsKKyAgICAgICAgbGV0IG5leHRfb2Zmc2V0ID0gbWF0Y2ggcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKT8geworICAgICAgICAgICAgMCA9PiBOb25lLAorICAgICAgICAgICAgdmFsID0+IFNvbWUodmFsKSwKKyAgICAgICAgfTsKKworICAgICAgICBsZXQgbm9kZSA9IFNlbGYgeyBwYWNrYWdlX25hbWUsIHBhY2thZ2VfaWQsIGZpbmdlcnByaW50LCBib29sZWFuX3N0YXJ0X2luZGV4LCBuZXh0X29mZnNldCB9OwogICAgICAgICBPayhub2RlKQogICAgIH0KIApAQCAtMTUxLDcgKzIxMSw3IEBACiB9CiAKIC8vLyBQYWNrYWdlIHRhYmxlIHN0cnVjdAotI1tkZXJpdmUoUGFydGlhbEVxKV0KKyNbZGVyaXZlKFBhcnRpYWxFcSwgU2VyaWFsaXplLCBEZXNlcmlhbGl6ZSldCiBwdWIgc3RydWN0IFBhY2thZ2VUYWJsZSB7CiAgICAgcHViIGhlYWRlcjogUGFja2FnZVRhYmxlSGVhZGVyLAogICAgIHB1YiBidWNrZXRzOiBWZWM8T3B0aW9uPHUzMj4+LApAQCAtMTc5LDcgKzIzOSwxMSBAQAogICAgICAgICBbCiAgICAgICAgICAgICBzZWxmLmhlYWRlci5pbnRvX2J5dGVzKCksCiAgICAgICAgICAgICBzZWxmLmJ1Y2tldHMuaXRlcigpLm1hcCh8dnwgdi51bndyYXBfb3IoMCkudG9fbGVfYnl0ZXMoKSkuY29sbGVjdDo6PFZlYzxfPj4oKS5jb25jYXQoKSwKLSAgICAgICAgICAgIHNlbGYubm9kZXMuaXRlcigpLm1hcCh8dnwgdi5pbnRvX2J5dGVzKCkpLmNvbGxlY3Q6OjxWZWM8Xz4+KCkuY29uY2F0KCksCisgICAgICAgICAgICBzZWxmLm5vZGVzCisgICAgICAgICAgICAgICAgLml0ZXIoKQorICAgICAgICAgICAgICAgIC5tYXAofHZ8IHYuaW50b19ieXRlcyhzZWxmLmhlYWRlci52ZXJzaW9uKSkKKyAgICAgICAgICAgICAgICAuY29sbGVjdDo6PFZlYzxfPj4oKQorICAgICAgICAgICAgICAgIC5jb25jYXQoKSwKICAgICAgICAgXQogICAgICAgICAuY29uY2F0KCkKICAgICB9CkBAIC0xOTgsOCArMjYyLDggQEAKICAgICAgICAgICAgIC5jb2xsZWN0KCk7CiAgICAgICAgIGxldCBub2RlcyA9ICgwLi5udW1fcGFja2FnZXMpCiAgICAgICAgICAgICAubWFwKHxffCB7Ci0gICAgICAgICAgICAgICAgbGV0IG5vZGUgPSBQYWNrYWdlVGFibGVOb2RlOjpmcm9tX2J5dGVzKCZieXRlc1toZWFkLi5dKT87Ci0gICAgICAgICAgICAgICAgaGVhZCArPSBub2RlLmludG9fYnl0ZXMoKS5sZW4oKTsKKyAgICAgICAgICAgICAgICBsZXQgbm9kZSA9IFBhY2thZ2VUYWJsZU5vZGU6OmZyb21fYnl0ZXMoJmJ5dGVzW2hlYWQuLl0sIGhlYWRlci52ZXJzaW9uKT87CisgICAgICAgICAgICAgICAgaGVhZCArPSBub2RlLmludG9fYnl0ZXMoaGVhZGVyLnZlcnNpb24pLmxlbigpOwogICAgICAgICAgICAgICAgIE9rKG5vZGUpCiAgICAgICAgICAgICB9KQogICAgICAgICAgICAgLmNvbGxlY3Q6OjxSZXN1bHQ8VmVjPF8+LCBBY29uZmlnU3RvcmFnZUVycm9yPj4oKQpAQCAtMjE5LDExICsyODMsMTMgQEAKIG1vZCB0ZXN0cyB7CiAgICAgdXNlIHN1cGVyOjoqOwogICAgIHVzZSBjcmF0ZTo6dGVzdF91dGlsczo6Y3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZTsKKyAgICB1c2UgY3JhdGU6OntyZWFkX3UzMl9mcm9tX3N0YXJ0X29mX2J5dGVzLCBERUZBVUxUX0ZJTEVfVkVSU0lPTiwgTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT059OwogCiAgICAgI1t0ZXN0XQogICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHRoZSB0YWJsZSBzZXJpYWxpemF0aW9uCi0gICAgZm4gdGVzdF9zZXJpYWxpemF0aW9uKCkgewotICAgICAgICBsZXQgcGFja2FnZV90YWJsZSA9IGNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUoKTsKKyAgICAvLyBUT0RPOiBiLzM3NjEwODI2OCAtIFVzZSBwYXJhbWV0ZXJpemVkIHRlc3RzLgorICAgIGZuIHRlc3Rfc2VyaWFsaXphdGlvbl9kZWZhdWx0KCkgeworICAgICAgICBsZXQgcGFja2FnZV90YWJsZSA9IGNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUoREVGQVVMVF9GSUxFX1ZFUlNJT04pOwogICAgICAgICBsZXQgaGVhZGVyOiAmUGFja2FnZVRhYmxlSGVhZGVyID0gJnBhY2thZ2VfdGFibGUuaGVhZGVyOwogICAgICAgICBsZXQgcmVpbnRlcnByZXRlZF9oZWFkZXIgPSBQYWNrYWdlVGFibGVIZWFkZXI6OmZyb21fYnl0ZXMoJmhlYWRlci5pbnRvX2J5dGVzKCkpOwogICAgICAgICBhc3NlcnQhKHJlaW50ZXJwcmV0ZWRfaGVhZGVyLmlzX29rKCkpOwpAQCAtMjMxLDcgKzI5NywzMiBAQAogCiAgICAgICAgIGxldCBub2RlczogJlZlYzxQYWNrYWdlVGFibGVOb2RlPiA9ICZwYWNrYWdlX3RhYmxlLm5vZGVzOwogICAgICAgICBmb3Igbm9kZSBpbiBub2Rlcy5pdGVyKCkgewotICAgICAgICAgICAgbGV0IHJlaW50ZXJwcmV0ZWRfbm9kZSA9IFBhY2thZ2VUYWJsZU5vZGU6OmZyb21fYnl0ZXMoJm5vZGUuaW50b19ieXRlcygpKS51bndyYXAoKTsKKyAgICAgICAgICAgIGxldCByZWludGVycHJldGVkX25vZGUgPQorICAgICAgICAgICAgICAgIFBhY2thZ2VUYWJsZU5vZGU6OmZyb21fYnl0ZXMoJm5vZGUuaW50b19ieXRlcyhoZWFkZXIudmVyc2lvbiksIGhlYWRlci52ZXJzaW9uKQorICAgICAgICAgICAgICAgICAgICAudW53cmFwKCk7CisgICAgICAgICAgICBhc3NlcnRfZXEhKG5vZGUsICZyZWludGVycHJldGVkX25vZGUpOworICAgICAgICB9CisKKyAgICAgICAgbGV0IHBhY2thZ2VfdGFibGVfYnl0ZXMgPSBwYWNrYWdlX3RhYmxlLmludG9fYnl0ZXMoKTsKKyAgICAgICAgbGV0IHJlaW50ZXJwcmV0ZWRfdGFibGUgPSBQYWNrYWdlVGFibGU6OmZyb21fYnl0ZXMoJnBhY2thZ2VfdGFibGVfYnl0ZXMpOworICAgICAgICBhc3NlcnQhKHJlaW50ZXJwcmV0ZWRfdGFibGUuaXNfb2soKSk7CisgICAgICAgIGFzc2VydF9lcSEoJnBhY2thZ2VfdGFibGUsICZyZWludGVycHJldGVkX3RhYmxlLnVud3JhcCgpKTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX3RhYmxlX2J5dGVzLmxlbigpIGFzIHUzMiwgaGVhZGVyLmZpbGVfc2l6ZSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3Rfc2VyaWFsaXphdGlvbl9tYXgoKSB7CisgICAgICAgIGxldCBwYWNrYWdlX3RhYmxlID0gY3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZShNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTik7CisgICAgICAgIGxldCBoZWFkZXI6ICZQYWNrYWdlVGFibGVIZWFkZXIgPSAmcGFja2FnZV90YWJsZS5oZWFkZXI7CisgICAgICAgIGxldCByZWludGVycHJldGVkX2hlYWRlciA9IFBhY2thZ2VUYWJsZUhlYWRlcjo6ZnJvbV9ieXRlcygmaGVhZGVyLmludG9fYnl0ZXMoKSk7CisgICAgICAgIGFzc2VydCEocmVpbnRlcnByZXRlZF9oZWFkZXIuaXNfb2soKSk7CisgICAgICAgIGFzc2VydF9lcSEoaGVhZGVyLCAmcmVpbnRlcnByZXRlZF9oZWFkZXIudW53cmFwKCkpOworCisgICAgICAgIGxldCBub2RlczogJlZlYzxQYWNrYWdlVGFibGVOb2RlPiA9ICZwYWNrYWdlX3RhYmxlLm5vZGVzOworICAgICAgICBmb3Igbm9kZSBpbiBub2Rlcy5pdGVyKCkgeworICAgICAgICAgICAgbGV0IHJlaW50ZXJwcmV0ZWRfbm9kZSA9CisgICAgICAgICAgICAgICAgUGFja2FnZVRhYmxlTm9kZTo6ZnJvbV9ieXRlcygmbm9kZS5pbnRvX2J5dGVzKGhlYWRlci52ZXJzaW9uKSwgaGVhZGVyLnZlcnNpb24pCisgICAgICAgICAgICAgICAgICAgIC51bndyYXAoKTsKICAgICAgICAgICAgIGFzc2VydF9lcSEobm9kZSwgJnJlaW50ZXJwcmV0ZWRfbm9kZSk7CiAgICAgICAgIH0KIApAQCAtMjQ2LDE3ICszMzcsMzYgQEAKICAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biB0aGF0IHZlcnNpb24gbnVtYmVyIHNob3VsZCBiZSBhdCB0aGUgdG9wIG9mIHNlcmlhbGl6ZWQKICAgICAvLyBieXRlcwogICAgIGZuIHRlc3RfdmVyc2lvbl9udW1iZXIoKSB7Ci0gICAgICAgIGxldCBwYWNrYWdlX3RhYmxlID0gY3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZSgpOworICAgICAgICBsZXQgcGFja2FnZV90YWJsZSA9IGNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUoREVGQVVMVF9GSUxFX1ZFUlNJT04pOwogICAgICAgICBsZXQgYnl0ZXMgPSAmcGFja2FnZV90YWJsZS5pbnRvX2J5dGVzKCk7Ci0gICAgICAgIGxldCBtdXQgaGVhZCA9IDA7Ci0gICAgICAgIGxldCB2ZXJzaW9uID0gcmVhZF91MzJfZnJvbV9ieXRlcyhieXRlcywgJm11dCBoZWFkKS51bndyYXAoKTsKLSAgICAgICAgYXNzZXJ0X2VxISh2ZXJzaW9uLCAxKTsKKyAgICAgICAgbGV0IHVucGFja2VkX3ZlcnNpb24gPSByZWFkX3UzMl9mcm9tX3N0YXJ0X29mX2J5dGVzKGJ5dGVzKS51bndyYXAoKTsKKyAgICAgICAgYXNzZXJ0X2VxISh1bnBhY2tlZF92ZXJzaW9uLCBERUZBVUxUX0ZJTEVfVkVSU0lPTik7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3Rfcm91bmRfdHJpcF9kZWZhdWx0KCkgeworICAgICAgICBsZXQgdGFibGU6IFBhY2thZ2VUYWJsZSA9IGNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUoREVGQVVMVF9GSUxFX1ZFUlNJT04pOworICAgICAgICBsZXQgdGFibGVfYnl0ZXMgPSB0YWJsZS5pbnRvX2J5dGVzKCk7CisKKyAgICAgICAgbGV0IHJlaW50ZXJwcmV0ZWRfdGFibGUgPSBQYWNrYWdlVGFibGU6OmZyb21fYnl0ZXMoJnRhYmxlX2J5dGVzKS51bndyYXAoKTsKKworICAgICAgICBhc3NlcnRfZXEhKHRhYmxlLCByZWludGVycHJldGVkX3RhYmxlKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9yb3VuZF90cmlwX21heCgpIHsKKyAgICAgICAgbGV0IHRhYmxlOiBQYWNrYWdlVGFibGUgPSBjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlKE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OKTsKKyAgICAgICAgbGV0IHRhYmxlX2J5dGVzID0gdGFibGUuaW50b19ieXRlcygpOworCisgICAgICAgIGxldCByZWludGVycHJldGVkX3RhYmxlID0gUGFja2FnZVRhYmxlOjpmcm9tX2J5dGVzKCZ0YWJsZV9ieXRlcykudW53cmFwKCk7CisKKyAgICAgICAgYXNzZXJ0X2VxISh0YWJsZSwgcmVpbnRlcnByZXRlZF90YWJsZSk7CiAgICAgfQogCiAgICAgI1t0ZXN0XQogICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIGZpbGUgdHlwZSBjaGVjawogICAgIGZuIHRlc3RfZmlsZV90eXBlX2NoZWNrKCkgewotICAgICAgICBsZXQgbXV0IHBhY2thZ2VfdGFibGUgPSBjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlKCk7CisgICAgICAgIGxldCBtdXQgcGFja2FnZV90YWJsZSA9IGNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUoREVGQVVMVF9GSUxFX1ZFUlNJT04pOwogICAgICAgICBwYWNrYWdlX3RhYmxlLmhlYWRlci5maWxlX3R5cGUgPSAxMjN1ODsKICAgICAgICAgbGV0IGVycm9yID0gUGFja2FnZVRhYmxlOjpmcm9tX2J5dGVzKCZwYWNrYWdlX3RhYmxlLmludG9fYnl0ZXMoKSkudW53cmFwX2VycigpOwogICAgICAgICBhc3NlcnRfZXEhKApkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvdGVzdF91dGlscy5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3JjL3Rlc3RfdXRpbHMucnMKaW5kZXggMTA2NjY2Yy4uN2M2MDNkZiAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmMvdGVzdF91dGlscy5ycworKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyYy90ZXN0X3V0aWxzLnJzCkBAIC0yNCwzMiArMjQsNTkgQEAKIHVzZSBzdGQ6OmlvOjpXcml0ZTsKIHVzZSB0ZW1wZmlsZTo6TmFtZWRUZW1wRmlsZTsKIAotcHViIGZuIGNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUoKSAtPiBQYWNrYWdlVGFibGUgeworcHViIGZuIGNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUodmVyc2lvbjogdTMyKSAtPiBQYWNrYWdlVGFibGUgewogICAgIGxldCBoZWFkZXIgPSBQYWNrYWdlVGFibGVIZWFkZXIgewotICAgICAgICB2ZXJzaW9uOiAxLAorICAgICAgICB2ZXJzaW9uOiB2ZXJzaW9uLAogICAgICAgICBjb250YWluZXI6IFN0cmluZzo6ZnJvbSgibW9ja3VwIiksCiAgICAgICAgIGZpbGVfdHlwZTogU3RvcmFnZUZpbGVUeXBlOjpQYWNrYWdlTWFwIGFzIHU4LAotICAgICAgICBmaWxlX3NpemU6IDIwOSwKKyAgICAgICAgZmlsZV9zaXplOiBtYXRjaCB2ZXJzaW9uIHsKKyAgICAgICAgICAgIDEgPT4gMjA5LAorICAgICAgICAgICAgMiA9PiAyMzMsCisgICAgICAgICAgICBfID0+IHBhbmljISgiVW5zdXBwb3J0ZWQgdmVyc2lvbi4iKSwKKyAgICAgICAgfSwKICAgICAgICAgbnVtX3BhY2thZ2VzOiAzLAogICAgICAgICBidWNrZXRfb2Zmc2V0OiAzMSwKICAgICAgICAgbm9kZV9vZmZzZXQ6IDU5LAogICAgIH07Ci0gICAgbGV0IGJ1Y2tldHM6IFZlYzxPcHRpb248dTMyPj4gPSB2ZWMhW1NvbWUoNTkpLCBOb25lLCBOb25lLCBTb21lKDEwOSksIE5vbmUsIE5vbmUsIE5vbmVdOworICAgIGxldCBidWNrZXRzOiBWZWM8T3B0aW9uPHUzMj4+ID0gbWF0Y2ggdmVyc2lvbiB7CisgICAgICAgIDEgPT4gdmVjIVtTb21lKDU5KSwgTm9uZSwgTm9uZSwgU29tZSgxMDkpLCBOb25lLCBOb25lLCBOb25lXSwKKyAgICAgICAgMiA9PiB2ZWMhW1NvbWUoNTkpLCBOb25lLCBOb25lLCBTb21lKDExNyksIE5vbmUsIE5vbmUsIE5vbmVdLAorICAgICAgICBfID0+IHBhbmljISgiVW5zdXBwb3J0ZWQgdmVyc2lvbi4iKSwKKyAgICB9OwogICAgIGxldCBmaXJzdF9ub2RlID0gUGFja2FnZVRhYmxlTm9kZSB7CiAgICAgICAgIHBhY2thZ2VfbmFtZTogU3RyaW5nOjpmcm9tKCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIiksCiAgICAgICAgIHBhY2thZ2VfaWQ6IDEsCisgICAgICAgIGZpbmdlcnByaW50OiBtYXRjaCB2ZXJzaW9uIHsKKyAgICAgICAgICAgIDEgPT4gMCwKKyAgICAgICAgICAgIDIgPT4gNDQzMTk0MDUwMjI3NDg1Nzk2NHU2NCwKKyAgICAgICAgICAgIF8gPT4gcGFuaWMhKCJVbnN1cHBvcnRlZCB2ZXJzaW9uLiIpLAorICAgICAgICB9LAogICAgICAgICBib29sZWFuX3N0YXJ0X2luZGV4OiAzLAogICAgICAgICBuZXh0X29mZnNldDogTm9uZSwKICAgICB9OwogICAgIGxldCBzZWNvbmRfbm9kZSA9IFBhY2thZ2VUYWJsZU5vZGUgewogICAgICAgICBwYWNrYWdlX25hbWU6IFN0cmluZzo6ZnJvbSgiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIpLAogICAgICAgICBwYWNrYWdlX2lkOiAwLAorICAgICAgICBmaW5nZXJwcmludDogbWF0Y2ggdmVyc2lvbiB7CisgICAgICAgICAgICAxID0+IDAsCisgICAgICAgICAgICAyID0+IDE1MjQ4OTQ4NTEwNTkwMTU4MDg2dTY0LAorICAgICAgICAgICAgXyA9PiBwYW5pYyEoIlVuc3VwcG9ydGVkIHZlcnNpb24uIiksCisgICAgICAgIH0sCiAgICAgICAgIGJvb2xlYW5fc3RhcnRfaW5kZXg6IDAsCi0gICAgICAgIG5leHRfb2Zmc2V0OiBTb21lKDE1OSksCisgICAgICAgIG5leHRfb2Zmc2V0OiBtYXRjaCB2ZXJzaW9uIHsKKyAgICAgICAgICAgIDEgPT4gU29tZSgxNTkpLAorICAgICAgICAgICAgMiA9PiBTb21lKDE3NSksCisgICAgICAgICAgICBfID0+IHBhbmljISgiVW5zdXBwb3J0ZWQgdmVyc2lvbi4iKSwKKyAgICAgICAgfSwKICAgICB9OwogICAgIGxldCB0aGlyZF9ub2RlID0gUGFja2FnZVRhYmxlTm9kZSB7CiAgICAgICAgIHBhY2thZ2VfbmFtZTogU3RyaW5nOjpmcm9tKCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80IiksCiAgICAgICAgIHBhY2thZ2VfaWQ6IDIsCisgICAgICAgIGZpbmdlcnByaW50OiBtYXRjaCB2ZXJzaW9uIHsKKyAgICAgICAgICAgIDEgPT4gMCwKKyAgICAgICAgICAgIDIgPT4gMTYyMzMyMjk5MTc3MTE2MjIzNzV1NjQsCisgICAgICAgICAgICBfID0+IHBhbmljISgiVW5zdXBwb3J0ZWQgdmVyc2lvbi4iKSwKKyAgICAgICAgfSwKICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleDogNiwKICAgICAgICAgbmV4dF9vZmZzZXQ6IE5vbmUsCiAgICAgfTsKQEAgLTc2LDkgKzEwMyw5IEBACiAgICAgfQogfQogCi1wdWIgZm4gY3JlYXRlX3Rlc3RfZmxhZ190YWJsZSgpIC0+IEZsYWdUYWJsZSB7CitwdWIgZm4gY3JlYXRlX3Rlc3RfZmxhZ190YWJsZSh2ZXJzaW9uOiB1MzIpIC0+IEZsYWdUYWJsZSB7CiAgICAgbGV0IGhlYWRlciA9IEZsYWdUYWJsZUhlYWRlciB7Ci0gICAgICAgIHZlcnNpb246IDEsCisgICAgICAgIHZlcnNpb246IHZlcnNpb24sCiAgICAgICAgIGNvbnRhaW5lcjogU3RyaW5nOjpmcm9tKCJtb2NrdXAiKSwKICAgICAgICAgZmlsZV90eXBlOiBTdG9yYWdlRmlsZVR5cGU6OkZsYWdNYXAgYXMgdTgsCiAgICAgICAgIGZpbGVfc2l6ZTogMzIxLApAQCAtMTE4LDkgKzE0NSw5IEBACiAgICAgRmxhZ1RhYmxlIHsgaGVhZGVyLCBidWNrZXRzLCBub2RlcyB9CiB9CiAKLXB1YiBmbiBjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QoKSAtPiBGbGFnVmFsdWVMaXN0IHsKK3B1YiBmbiBjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QodmVyc2lvbjogdTMyKSAtPiBGbGFnVmFsdWVMaXN0IHsKICAgICBsZXQgaGVhZGVyID0gRmxhZ1ZhbHVlSGVhZGVyIHsKLSAgICAgICAgdmVyc2lvbjogMSwKKyAgICAgICAgdmVyc2lvbjogdmVyc2lvbiwKICAgICAgICAgY29udGFpbmVyOiBTdHJpbmc6OmZyb20oIm1vY2t1cCIpLAogICAgICAgICBmaWxlX3R5cGU6IFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ1ZhbCBhcyB1OCwKICAgICAgICAgZmlsZV9zaXplOiAzNSwKQEAgLTEzMSw5ICsxNTgsOSBAQAogICAgIEZsYWdWYWx1ZUxpc3QgeyBoZWFkZXIsIGJvb2xlYW5zIH0KIH0KIAotcHViIGZuIGNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0KCkgLT4gRmxhZ0luZm9MaXN0IHsKK3B1YiBmbiBjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdCh2ZXJzaW9uOiB1MzIpIC0+IEZsYWdJbmZvTGlzdCB7CiAgICAgbGV0IGhlYWRlciA9IEZsYWdJbmZvSGVhZGVyIHsKLSAgICAgICAgdmVyc2lvbjogMSwKKyAgICAgICAgdmVyc2lvbjogdmVyc2lvbiwKICAgICAgICAgY29udGFpbmVyOiBTdHJpbmc6OmZyb20oIm1vY2t1cCIpLAogICAgICAgICBmaWxlX3R5cGU6IFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ0luZm8gYXMgdTgsCiAgICAgICAgIGZpbGVfc2l6ZTogMzUsCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24uamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9BY29uZmlnU3RvcmFnZUV4Y2VwdGlvbi5qYXZhCmluZGV4IDg2YTc1ZjIuLjMyNGM1NWQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9BY29uZmlnU3RvcmFnZUV4Y2VwdGlvbi5qYXZhCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9BY29uZmlnU3RvcmFnZUV4Y2VwdGlvbi5qYXZhCkBAIC0xNiwxMiArMTYsMTIyIEBACiAKIHBhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2U7CiAKKy8qKgorICogRXhjZXB0aW9uIHRocm93biB3aGVuIGFuIGVycm9yIG9jY3VycyB3aGlsZSBhY2Nlc3NpbmcgQWNvbmZpZyBTdG9yYWdlLgorICoKKyAqIDxwPlRoaXMgZXhjZXB0aW9uIGluZGljYXRlcyBhIGdlbmVyYWwgcHJvYmxlbSB3aXRoIEFjb25maWcgU3RvcmFnZSwgc3VjaCBhcyBhbiBpbmFiaWxpdHkgdG8gcmVhZAorICogb3Igd3JpdGUgZGF0YS4KKyAqLwogcHVibGljIGNsYXNzIEFjb25maWdTdG9yYWdlRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7CisKKyAgICAvKiogR2VuZXJpYyBlcnJvciBjb2RlIGluZGljYXRpbmcgYW4gdW5zcGVjaWZpZWQgQWNvbmZpZyBTdG9yYWdlIGVycm9yLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0dFTkVSSUMgPSAwOworCisgICAgLyoqIEVycm9yIGNvZGUgaW5kaWNhdGluZyB0aGF0IHRoZSBBY29uZmlnIFN0b3JhZ2Ugc3lzdGVtIGlzIG5vdCBmb3VuZCBvbiB0aGUgZGV2aWNlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX1NUT1JBR0VfU1lTVEVNX05PVF9GT1VORCA9IDE7CisKKyAgICAvKiogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlIHJlcXVlc3RlZCBjb25maWd1cmF0aW9uIHBhY2thZ2UgaXMgbm90IGZvdW5kLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX1BBQ0tBR0VfTk9UX0ZPVU5EID0gMjsKKworICAgIC8qKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCB0aGUgc3BlY2lmaWVkIGNvbnRhaW5lciBpcyBub3QgZm91bmQuICovCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfQ09OVEFJTkVSX05PVF9GT1VORCA9IDM7CisKKyAgICAvKiogRXJyb3IgY29kZSBpbmRpY2F0aW5nIHRoYXQgdGhlcmUgd2FzIGFuIGVycm9yIHJlYWRpbmcgdGhlIEFjb25maWcgU3RvcmFnZSBmaWxlLiAqLworICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0NBTk5PVF9SRUFEX1NUT1JBR0VfRklMRSA9IDQ7CisKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9GSUxFX0ZJTkdFUlBSSU5UX01JU01BVENIID0gNTsKKworICAgIHByaXZhdGUgZmluYWwgaW50IG1FcnJvckNvZGU7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbn0gd2l0aCBhIGdlbmVyaWMgZXJyb3IgY29kZSBhbmQgdGhlIHNwZWNpZmllZAorICAgICAqIGRldGFpbCBtZXNzYWdlLgorICAgICAqCisgICAgICogQHBhcmFtIG1zZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqLwogICAgIHB1YmxpYyBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbihTdHJpbmcgbXNnKSB7CiAgICAgICAgIHN1cGVyKG1zZyk7CisgICAgICAgIG1FcnJvckNvZGUgPSBFUlJPUl9HRU5FUklDOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEFjb25maWdTdG9yYWdlRXhjZXB0aW9ufSB3aXRoIGEgZ2VuZXJpYyBlcnJvciBjb2RlLCB0aGUgc3BlY2lmaWVkCisgICAgICogZGV0YWlsIG1lc3NhZ2UsIGFuZCBjYXVzZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2cgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKiBAcGFyYW0gY2F1c2UgVGhlIGNhdXNlIG9mIHRoaXMgZXhjZXB0aW9uLgorICAgICAqLwogICAgIHB1YmxpYyBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbihTdHJpbmcgbXNnLCBUaHJvd2FibGUgY2F1c2UpIHsKICAgICAgICAgc3VwZXIobXNnLCBjYXVzZSk7CisgICAgICAgIG1FcnJvckNvZGUgPSBFUlJPUl9HRU5FUklDOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEFjb25maWdTdG9yYWdlRXhjZXB0aW9ufSB3aXRoIHRoZSBzcGVjaWZpZWQgZXJyb3IgY29kZSBhbmQgZGV0YWlsCisgICAgICogbWVzc2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBlcnJvckNvZGUgVGhlIGVycm9yIGNvZGUgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBwYXJhbSBtc2cgVGhlIGRldGFpbCBtZXNzYWdlIGZvciB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKi8KKyAgICBwdWJsaWMgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24oaW50IGVycm9yQ29kZSwgU3RyaW5nIG1zZykgeworICAgICAgICBzdXBlcihtc2cpOworICAgICAgICBtRXJyb3JDb2RlID0gZXJyb3JDb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIEFjb25maWdTdG9yYWdlRXhjZXB0aW9ufSB3aXRoIHRoZSBzcGVjaWZpZWQgZXJyb3IgY29kZSwgZGV0YWlsCisgICAgICogbWVzc2FnZSwgYW5kIGNhdXNlLgorICAgICAqCisgICAgICogQHBhcmFtIGVycm9yQ29kZSBUaGUgZXJyb3IgY29kZSBmb3IgdGhpcyBleGNlcHRpb24uCisgICAgICogQHBhcmFtIG1zZyBUaGUgZGV0YWlsIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLgorICAgICAqIEBwYXJhbSBjYXVzZSBUaGUgY2F1c2Ugb2YgdGhpcyBleGNlcHRpb24uCisgICAgICovCisgICAgcHVibGljIEFjb25maWdTdG9yYWdlRXhjZXB0aW9uKGludCBlcnJvckNvZGUsIFN0cmluZyBtc2csIFRocm93YWJsZSBjYXVzZSkgeworICAgICAgICBzdXBlcihtc2csIGNhdXNlKTsKKyAgICAgICAgbUVycm9yQ29kZSA9IGVycm9yQ29kZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBlcnJvciBjb2RlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGV4Y2VwdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gVGhlIGVycm9yIGNvZGUuCisgICAgICovCisgICAgcHVibGljIGludCBnZXRFcnJvckNvZGUoKSB7CisgICAgICAgIHJldHVybiBtRXJyb3JDb2RlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGVycm9yIG1lc3NhZ2UgZm9yIHRoaXMgZXhjZXB0aW9uLCBpbmNsdWRpbmcgdGhlIGVycm9yIGNvZGUgYW5kIHRoZSBvcmlnaW5hbAorICAgICAqIG1lc3NhZ2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBlcnJvciBtZXNzYWdlLgorICAgICAqLworICAgIEBPdmVycmlkZQorICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKKyAgICAgICAgcmV0dXJuIGVycm9yU3RyaW5nKCkgKyAiOiAiICsgc3VwZXIuZ2V0TWVzc2FnZSgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGVycm9yIGNvZGUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFRoZSBlcnJvciBjb2RlIHN0cmluZy4KKyAgICAgKi8KKyAgICBwcml2YXRlIFN0cmluZyBlcnJvclN0cmluZygpIHsKKyAgICAgICAgc3dpdGNoIChtRXJyb3JDb2RlKSB7CisgICAgICAgICAgICBjYXNlIEVSUk9SX0dFTkVSSUM6CisgICAgICAgICAgICAgICAgcmV0dXJuICJFUlJPUl9HRU5FUklDIjsKKyAgICAgICAgICAgIGNhc2UgRVJST1JfU1RPUkFHRV9TWVNURU1fTk9UX0ZPVU5EOgorICAgICAgICAgICAgICAgIHJldHVybiAiRVJST1JfU1RPUkFHRV9TWVNURU1fTk9UX0ZPVU5EIjsKKyAgICAgICAgICAgIGNhc2UgRVJST1JfUEFDS0FHRV9OT1RfRk9VTkQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJFUlJPUl9QQUNLQUdFX05PVF9GT1VORCI7CisgICAgICAgICAgICBjYXNlIEVSUk9SX0NPTlRBSU5FUl9OT1RfRk9VTkQ6CisgICAgICAgICAgICAgICAgcmV0dXJuICJFUlJPUl9DT05UQUlORVJfTk9UX0ZPVU5EIjsKKyAgICAgICAgICAgIGNhc2UgRVJST1JfQ0FOTk9UX1JFQURfU1RPUkFHRV9GSUxFOgorICAgICAgICAgICAgICAgIHJldHVybiAiRVJST1JfQ0FOTk9UX1JFQURfU1RPUkFHRV9GSUxFIjsKKyAgICAgICAgICAgIGNhc2UgRVJST1JfRklMRV9GSU5HRVJQUklOVF9NSVNNQVRDSDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIkVSUk9SX0ZJTEVfRklOR0VSUFJJTlRfTUlTTUFUQ0giOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gIjxVbmtub3duIGVycm9yIGNvZGUgIiArIG1FcnJvckNvZGUgKyAiPiI7CisgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvQnl0ZUJ1ZmZlclJlYWRlci5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0J5dGVCdWZmZXJSZWFkZXIuamF2YQppbmRleCA0YmVhMDgzLi4xNGZjNDY4IDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvQnl0ZUJ1ZmZlclJlYWRlci5qYXZhCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9CeXRlQnVmZmVyUmVhZGVyLmphdmEKQEAgLTE5LDEwICsxOSwxMiBAQAogaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CiBpbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOwogaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuU3RhbmRhcmRDaGFyc2V0czsKK2ltcG9ydCBqYXZhLnV0aWwuT2JqZWN0czsKIAogcHVibGljIGNsYXNzIEJ5dGVCdWZmZXJSZWFkZXIgewogCiAgICAgcHJpdmF0ZSBCeXRlQnVmZmVyIG1CeXRlQnVmZmVyOworICAgIHByaXZhdGUgaW50IG1Qb3NpdGlvbjsKIAogICAgIHB1YmxpYyBCeXRlQnVmZmVyUmVhZGVyKEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlcikgewogICAgICAgICB0aGlzLm1CeXRlQnVmZmVyID0gYnl0ZUJ1ZmZlcjsKQEAgLTMwLDIxICszMiwyOSBAQAogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgcmVhZEJ5dGUoKSB7Ci0gICAgICAgIHJldHVybiBCeXRlLnRvVW5zaWduZWRJbnQobUJ5dGVCdWZmZXIuZ2V0KCkpOworICAgICAgICByZXR1cm4gQnl0ZS50b1Vuc2lnbmVkSW50KG1CeXRlQnVmZmVyLmdldChuZXh0R2V0SW5kZXgoMSkpKTsKICAgICB9CiAKICAgICBwdWJsaWMgaW50IHJlYWRTaG9ydCgpIHsKLSAgICAgICAgcmV0dXJuIFNob3J0LnRvVW5zaWduZWRJbnQobUJ5dGVCdWZmZXIuZ2V0U2hvcnQoKSk7CisgICAgICAgIHJldHVybiBTaG9ydC50b1Vuc2lnbmVkSW50KG1CeXRlQnVmZmVyLmdldFNob3J0KG5leHRHZXRJbmRleCgyKSkpOwogICAgIH0KIAogICAgIHB1YmxpYyBpbnQgcmVhZEludCgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubUJ5dGVCdWZmZXIuZ2V0SW50KCk7CisgICAgICAgIHJldHVybiB0aGlzLm1CeXRlQnVmZmVyLmdldEludChuZXh0R2V0SW5kZXgoNCkpOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIHJlYWRMb25nKCkgeworICAgICAgICByZXR1cm4gdGhpcy5tQnl0ZUJ1ZmZlci5nZXRMb25nKG5leHRHZXRJbmRleCg4KSk7CiAgICAgfQogCiAgICAgcHVibGljIFN0cmluZyByZWFkU3RyaW5nKCkgewogICAgICAgICBpbnQgbGVuZ3RoID0gcmVhZEludCgpOworICAgICAgICBpZiAobGVuZ3RoID4gMTAyNCkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFjb25maWdTdG9yYWdlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAiU3RyaW5nIGxlbmd0aCBleGNlZWRzIG1heGltdW0gYWxsb3dlZCBzaXplICgxMDI0IGJ5dGVzKTogIiArIGxlbmd0aCk7CisgICAgICAgIH0KICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbbGVuZ3RoXTsKLSAgICAgICAgbUJ5dGVCdWZmZXIuZ2V0KGJ5dGVzLCAwLCBsZW5ndGgpOworICAgICAgICBnZXRBcnJheShuZXh0R2V0SW5kZXgobGVuZ3RoKSwgYnl0ZXMsIDAsIGxlbmd0aCk7CiAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ5dGVzLCBTdGFuZGFyZENoYXJzZXRzLlVURl84KTsKICAgICB9CiAKQEAgLTUzLDYgKzYzLDI2IEBACiAgICAgfQogCiAgICAgcHVibGljIHZvaWQgcG9zaXRpb24oaW50IG5ld1Bvc2l0aW9uKSB7Ci0gICAgICAgIG1CeXRlQnVmZmVyLnBvc2l0aW9uKG5ld1Bvc2l0aW9uKTsKKyAgICAgICAgbVBvc2l0aW9uID0gbmV3UG9zaXRpb247CisgICAgfQorCisgICAgcHVibGljIGludCBwb3NpdGlvbigpIHsKKyAgICAgICAgcmV0dXJuIG1Qb3NpdGlvbjsKKyAgICB9CisKKyAgICBwcml2YXRlIGludCBuZXh0R2V0SW5kZXgoaW50IG5iKSB7CisgICAgICAgIGludCBwID0gbVBvc2l0aW9uOworICAgICAgICBtUG9zaXRpb24gKz0gbmI7CisgICAgICAgIHJldHVybiBwOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBnZXRBcnJheShpbnQgaW5kZXgsIGJ5dGVbXSBkc3QsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKKyAgICAgICAgT2JqZWN0cy5jaGVja0Zyb21JbmRleFNpemUoaW5kZXgsIGxlbmd0aCwgbUJ5dGVCdWZmZXIubGltaXQoKSk7CisgICAgICAgIE9iamVjdHMuY2hlY2tGcm9tSW5kZXhTaXplKG9mZnNldCwgbGVuZ3RoLCBkc3QubGVuZ3RoKTsKKworICAgICAgICBpbnQgZW5kID0gb2Zmc2V0ICsgbGVuZ3RoOworICAgICAgICBmb3IgKGludCBpID0gb2Zmc2V0LCBqID0gaW5kZXg7IGkgPCBlbmQ7IGkrKywgaisrKSB7CisgICAgICAgICAgICBkc3RbaV0gPSBtQnl0ZUJ1ZmZlci5nZXQoaik7CisgICAgICAgIH0KICAgICB9CiB9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvRmlsZVR5cGUuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9GaWxlVHlwZS5qYXZhCmluZGV4IGIwYjFiOWIuLmMzNTQ4NzMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9GaWxlVHlwZS5qYXZhCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9GaWxlVHlwZS5qYXZhCkBAIC00Miw0ICs0MiwyMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgICB9CiAgICAgfQorCisgICAgQE92ZXJyaWRlCisgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgcmV0dXJuICJQQUNLQUdFX01BUCI7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgcmV0dXJuICJGTEFHX01BUCI7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgcmV0dXJuICJGTEFHX1ZBTCI7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgcmV0dXJuICJGTEFHX0lORk8iOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gInVucmVjb2duaXplZCB0eXBlIjsKKyAgICAgICAgfQorICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9GbGFnVGFibGUuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9GbGFnVGFibGUuamF2YQppbmRleCA5ODM4YTdjLi5lZTYwYjE4IDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvRmxhZ1RhYmxlLmphdmEKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL0ZsYWdUYWJsZS5qYXZhCkBAIC0yNCwxMiArMjQsMTIgQEAKIHB1YmxpYyBjbGFzcyBGbGFnVGFibGUgewogCiAgICAgcHJpdmF0ZSBIZWFkZXIgbUhlYWRlcjsKLSAgICBwcml2YXRlIEJ5dGVCdWZmZXJSZWFkZXIgbVJlYWRlcjsKKyAgICBwcml2YXRlIEJ5dGVCdWZmZXIgbUJ1ZmZlcjsKIAogICAgIHB1YmxpYyBzdGF0aWMgRmxhZ1RhYmxlIGZyb21CeXRlcyhCeXRlQnVmZmVyIGJ5dGVzKSB7CiAgICAgICAgIEZsYWdUYWJsZSBmbGFnVGFibGUgPSBuZXcgRmxhZ1RhYmxlKCk7Ci0gICAgICAgIGZsYWdUYWJsZS5tUmVhZGVyID0gbmV3IEJ5dGVCdWZmZXJSZWFkZXIoYnl0ZXMpOwotICAgICAgICBmbGFnVGFibGUubUhlYWRlciA9IEhlYWRlci5mcm9tQnl0ZXMoZmxhZ1RhYmxlLm1SZWFkZXIpOworICAgICAgICBmbGFnVGFibGUubUJ1ZmZlciA9IGJ5dGVzOworICAgICAgICBmbGFnVGFibGUubUhlYWRlciA9IEhlYWRlci5mcm9tQnl0ZXMobmV3IEJ5dGVCdWZmZXJSZWFkZXIoYnl0ZXMpKTsKIAogICAgICAgICByZXR1cm4gZmxhZ1RhYmxlOwogICAgIH0KQEAgLTM3LDIwICszNywyNyBAQAogICAgIHB1YmxpYyBOb2RlIGdldChpbnQgcGFja2FnZUlkLCBTdHJpbmcgZmxhZ05hbWUpIHsKICAgICAgICAgaW50IG51bUJ1Y2tldHMgPSAobUhlYWRlci5tTm9kZU9mZnNldCAtIG1IZWFkZXIubUJ1Y2tldE9mZnNldCkgLyA0OwogICAgICAgICBpbnQgYnVja2V0SW5kZXggPSBUYWJsZVV0aWxzLmdldEJ1Y2tldEluZGV4KG1ha2VLZXkocGFja2FnZUlkLCBmbGFnTmFtZSksIG51bUJ1Y2tldHMpOwotCi0gICAgICAgIG1SZWFkZXIucG9zaXRpb24obUhlYWRlci5tQnVja2V0T2Zmc2V0ICsgYnVja2V0SW5kZXggKiA0KTsKLSAgICAgICAgaW50IG5vZGVJbmRleCA9IG1SZWFkZXIucmVhZEludCgpOworICAgICAgICBpbnQgbmV3UG9zaXRpb24gPSBtSGVhZGVyLm1CdWNrZXRPZmZzZXQgKyBidWNrZXRJbmRleCAqIDQ7CisgICAgICAgIGlmIChuZXdQb3NpdGlvbiA+PSBtSGVhZGVyLm1Ob2RlT2Zmc2V0KSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBCeXRlQnVmZmVyUmVhZGVyIHJlYWRlciA9IG5ldyBCeXRlQnVmZmVyUmVhZGVyKG1CdWZmZXIpIDsKKyAgICAgICAgcmVhZGVyLnBvc2l0aW9uKG5ld1Bvc2l0aW9uKTsKKyAgICAgICAgaW50IG5vZGVJbmRleCA9IHJlYWRlci5yZWFkSW50KCk7CisgICAgICAgIGlmIChub2RlSW5kZXggPCBtSGVhZGVyLm1Ob2RlT2Zmc2V0IHx8IG5vZGVJbmRleCA+PSBtSGVhZGVyLm1GaWxlU2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KIAogICAgICAgICB3aGlsZSAobm9kZUluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICBtUmVhZGVyLnBvc2l0aW9uKG5vZGVJbmRleCk7Ci0gICAgICAgICAgICBOb2RlIG5vZGUgPSBOb2RlLmZyb21CeXRlcyhtUmVhZGVyKTsKKyAgICAgICAgICAgIHJlYWRlci5wb3NpdGlvbihub2RlSW5kZXgpOworICAgICAgICAgICAgTm9kZSBub2RlID0gTm9kZS5mcm9tQnl0ZXMocmVhZGVyKTsKICAgICAgICAgICAgIGlmIChPYmplY3RzLmVxdWFscyhmbGFnTmFtZSwgbm9kZS5tRmxhZ05hbWUpICYmIHBhY2thZ2VJZCA9PSBub2RlLm1QYWNrYWdlSWQpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG5vZGVJbmRleCA9IG5vZGUubU5leHRPZmZzZXQ7CiAgICAgICAgIH0KIAotICAgICAgICB0aHJvdyBuZXcgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24oImdldCBjYW5ub3QgZmluZCBmbGFnOiAiICsgZmxhZ05hbWUpOworICAgICAgICByZXR1cm4gbnVsbDsKICAgICB9CiAKICAgICBwdWJsaWMgSGVhZGVyIGdldEhlYWRlcigpIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9QYWNrYWdlVGFibGUuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9QYWNrYWdlVGFibGUuamF2YQppbmRleCA3NzNiODgyLi4yMTU2MTZlIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvUGFja2FnZVRhYmxlLmphdmEKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1BhY2thZ2VUYWJsZS5qYXZhCkBAIC0xOSwzOSArMTksNjUgQEAKIGltcG9ydCBzdGF0aWMgamF2YS5uaW8uY2hhcnNldC5TdGFuZGFyZENoYXJzZXRzLlVURl84OwogCiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5MaXN0OwogaW1wb3J0IGphdmEudXRpbC5PYmplY3RzOwogCiBwdWJsaWMgY2xhc3MgUGFja2FnZVRhYmxlIHsKIAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSU5HRVJQUklOVF9CWVRFUyA9IDg7CisgICAgLy8gaW50OiBtUGFja2FnZUlkICsgaW50OiBtQm9vbGVhblN0YXJ0SW5kZXggKyBpbnQ6IG1OZXh0T2Zmc2V0CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE5PREVfU0tJUF9CWVRFUyA9IDEyOworCiAgICAgcHJpdmF0ZSBIZWFkZXIgbUhlYWRlcjsKLSAgICBwcml2YXRlIEJ5dGVCdWZmZXJSZWFkZXIgbVJlYWRlcjsKKyAgICBwcml2YXRlIEJ5dGVCdWZmZXIgbUJ1ZmZlcjsKIAogICAgIHB1YmxpYyBzdGF0aWMgUGFja2FnZVRhYmxlIGZyb21CeXRlcyhCeXRlQnVmZmVyIGJ5dGVzKSB7CiAgICAgICAgIFBhY2thZ2VUYWJsZSBwYWNrYWdlVGFibGUgPSBuZXcgUGFja2FnZVRhYmxlKCk7Ci0gICAgICAgIHBhY2thZ2VUYWJsZS5tUmVhZGVyID0gbmV3IEJ5dGVCdWZmZXJSZWFkZXIoYnl0ZXMpOwotICAgICAgICBwYWNrYWdlVGFibGUubUhlYWRlciA9IEhlYWRlci5mcm9tQnl0ZXMocGFja2FnZVRhYmxlLm1SZWFkZXIpOworICAgICAgICBwYWNrYWdlVGFibGUubUJ1ZmZlciA9IGJ5dGVzOworICAgICAgICBwYWNrYWdlVGFibGUubUhlYWRlciA9IEhlYWRlci5mcm9tQnl0ZXMobmV3IEJ5dGVCdWZmZXJSZWFkZXIoYnl0ZXMpKTsKIAogICAgICAgICByZXR1cm4gcGFja2FnZVRhYmxlOwogICAgIH0KIAogICAgIHB1YmxpYyBOb2RlIGdldChTdHJpbmcgcGFja2FnZU5hbWUpIHsKLQogICAgICAgICBpbnQgbnVtQnVja2V0cyA9IChtSGVhZGVyLm1Ob2RlT2Zmc2V0IC0gbUhlYWRlci5tQnVja2V0T2Zmc2V0KSAvIDQ7CiAgICAgICAgIGludCBidWNrZXRJbmRleCA9IFRhYmxlVXRpbHMuZ2V0QnVja2V0SW5kZXgocGFja2FnZU5hbWUuZ2V0Qnl0ZXMoVVRGXzgpLCBudW1CdWNrZXRzKTsKKyAgICAgICAgaW50IG5ld1Bvc2l0aW9uID0gbUhlYWRlci5tQnVja2V0T2Zmc2V0ICsgYnVja2V0SW5kZXggKiA0OworICAgICAgICBpZiAobmV3UG9zaXRpb24gPj0gbUhlYWRlci5tTm9kZU9mZnNldCkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KKyAgICAgICAgQnl0ZUJ1ZmZlclJlYWRlciByZWFkZXIgPSBuZXcgQnl0ZUJ1ZmZlclJlYWRlcihtQnVmZmVyKTsKKyAgICAgICAgcmVhZGVyLnBvc2l0aW9uKG5ld1Bvc2l0aW9uKTsKKyAgICAgICAgaW50IG5vZGVJbmRleCA9IHJlYWRlci5yZWFkSW50KCk7CiAKLSAgICAgICAgbVJlYWRlci5wb3NpdGlvbihtSGVhZGVyLm1CdWNrZXRPZmZzZXQgKyBidWNrZXRJbmRleCAqIDQpOwotICAgICAgICBpbnQgbm9kZUluZGV4ID0gbVJlYWRlci5yZWFkSW50KCk7CisgICAgICAgIGlmIChub2RlSW5kZXggPCBtSGVhZGVyLm1Ob2RlT2Zmc2V0IHx8IG5vZGVJbmRleCA+PSBtSGVhZGVyLm1GaWxlU2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGw7CisgICAgICAgIH0KIAogICAgICAgICB3aGlsZSAobm9kZUluZGV4ICE9IC0xKSB7Ci0gICAgICAgICAgICBtUmVhZGVyLnBvc2l0aW9uKG5vZGVJbmRleCk7Ci0gICAgICAgICAgICBOb2RlIG5vZGUgPSBOb2RlLmZyb21CeXRlcyhtUmVhZGVyKTsKKyAgICAgICAgICAgIHJlYWRlci5wb3NpdGlvbihub2RlSW5kZXgpOworICAgICAgICAgICAgTm9kZSBub2RlID0gTm9kZS5mcm9tQnl0ZXMocmVhZGVyLCBtSGVhZGVyLm1WZXJzaW9uKTsKICAgICAgICAgICAgIGlmIChPYmplY3RzLmVxdWFscyhwYWNrYWdlTmFtZSwgbm9kZS5tUGFja2FnZU5hbWUpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIG5vZGU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBub2RlSW5kZXggPSBub2RlLm1OZXh0T2Zmc2V0OwogICAgICAgICB9CiAKLSAgICAgICAgdGhyb3cgbmV3IEFjb25maWdTdG9yYWdlRXhjZXB0aW9uKCJnZXQgY2Fubm90IGZpbmQgcGFja2FnZTogIiArIHBhY2thZ2VOYW1lKTsKKyAgICAgICAgcmV0dXJuIG51bGw7CisgICAgfQorCisgICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRQYWNrYWdlTGlzdCgpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PD4obUhlYWRlci5tTnVtUGFja2FnZXMpOworICAgICAgICBCeXRlQnVmZmVyUmVhZGVyIHJlYWRlciA9IG5ldyBCeXRlQnVmZmVyUmVhZGVyKG1CdWZmZXIpOworICAgICAgICByZWFkZXIucG9zaXRpb24obUhlYWRlci5tTm9kZU9mZnNldCk7CisgICAgICAgIGludCBmaW5nZXJwcmludEJ5dGVzID0gbUhlYWRlci5tVmVyc2lvbiA9PSAxID8gMCA6IEZJTkdFUlBSSU5UX0JZVEVTOworICAgICAgICBpbnQgc2tpcEJ5dGVzID0gZmluZ2VycHJpbnRCeXRlcyArIE5PREVfU0tJUF9CWVRFUzsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtSGVhZGVyLm1OdW1QYWNrYWdlczsgaSsrKSB7CisgICAgICAgICAgICBsaXN0LmFkZChyZWFkZXIucmVhZFN0cmluZygpKTsKKyAgICAgICAgICAgIHJlYWRlci5wb3NpdGlvbihyZWFkZXIucG9zaXRpb24oKSArIHNraXBCeXRlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGxpc3Q7CiAgICAgfQogCiAgICAgcHVibGljIEhlYWRlciBnZXRIZWFkZXIoKSB7CkBAIC02OCw3ICs5NCw3IEBACiAgICAgICAgIHByaXZhdGUgaW50IG1CdWNrZXRPZmZzZXQ7CiAgICAgICAgIHByaXZhdGUgaW50IG1Ob2RlT2Zmc2V0OwogCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgSGVhZGVyIGZyb21CeXRlcyhCeXRlQnVmZmVyUmVhZGVyIHJlYWRlcikgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBIZWFkZXIgZnJvbUJ5dGVzKEJ5dGVCdWZmZXJSZWFkZXIgcmVhZGVyKSB7CiAgICAgICAgICAgICBIZWFkZXIgaGVhZGVyID0gbmV3IEhlYWRlcigpOwogICAgICAgICAgICAgaGVhZGVyLm1WZXJzaW9uID0gcmVhZGVyLnJlYWRJbnQoKTsKICAgICAgICAgICAgIGhlYWRlci5tQ29udGFpbmVyID0gcmVhZGVyLnJlYWRTdHJpbmcoKTsKQEAgLTExOCwxMCArMTQ0LDI0IEBACiAKICAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbVBhY2thZ2VOYW1lOwogICAgICAgICBwcml2YXRlIGludCBtUGFja2FnZUlkOworICAgICAgICBwcml2YXRlIGxvbmcgbVBhY2thZ2VGaW5nZXJwcmludDsKICAgICAgICAgcHJpdmF0ZSBpbnQgbUJvb2xlYW5TdGFydEluZGV4OwogICAgICAgICBwcml2YXRlIGludCBtTmV4dE9mZnNldDsKKyAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1IYXNQYWNrYWdlRmluZ2VycHJpbnQ7CiAKLSAgICAgICAgcHVibGljIHN0YXRpYyBOb2RlIGZyb21CeXRlcyhCeXRlQnVmZmVyUmVhZGVyIHJlYWRlcikgeworICAgICAgICBwcml2YXRlIHN0YXRpYyBOb2RlIGZyb21CeXRlcyhCeXRlQnVmZmVyUmVhZGVyIHJlYWRlciwgaW50IHZlcnNpb24pIHsKKyAgICAgICAgICAgIHN3aXRjaCAodmVyc2lvbikgeworICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZyb21CeXRlc1YxKHJlYWRlcik7CisgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnJvbUJ5dGVzVjIocmVhZGVyKTsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAvLyBEbyB3ZSB3YW50IHRvIHRocm93IGhlcmU/CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTm9kZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHJpdmF0ZSBzdGF0aWMgTm9kZSBmcm9tQnl0ZXNWMShCeXRlQnVmZmVyUmVhZGVyIHJlYWRlcikgewogICAgICAgICAgICAgTm9kZSBub2RlID0gbmV3IE5vZGUoKTsKICAgICAgICAgICAgIG5vZGUubVBhY2thZ2VOYW1lID0gcmVhZGVyLnJlYWRTdHJpbmcoKTsKICAgICAgICAgICAgIG5vZGUubVBhY2thZ2VJZCA9IHJlYWRlci5yZWFkSW50KCk7CkBAIC0xMzEsNiArMTcxLDE4IEBACiAgICAgICAgICAgICByZXR1cm4gbm9kZTsKICAgICAgICAgfQogCisgICAgICAgIHByaXZhdGUgc3RhdGljIE5vZGUgZnJvbUJ5dGVzVjIoQnl0ZUJ1ZmZlclJlYWRlciByZWFkZXIpIHsKKyAgICAgICAgICAgIE5vZGUgbm9kZSA9IG5ldyBOb2RlKCk7CisgICAgICAgICAgICBub2RlLm1QYWNrYWdlTmFtZSA9IHJlYWRlci5yZWFkU3RyaW5nKCk7CisgICAgICAgICAgICBub2RlLm1QYWNrYWdlSWQgPSByZWFkZXIucmVhZEludCgpOworICAgICAgICAgICAgbm9kZS5tUGFja2FnZUZpbmdlcnByaW50ID0gcmVhZGVyLnJlYWRMb25nKCk7CisgICAgICAgICAgICBub2RlLm1Cb29sZWFuU3RhcnRJbmRleCA9IHJlYWRlci5yZWFkSW50KCk7CisgICAgICAgICAgICBub2RlLm1OZXh0T2Zmc2V0ID0gcmVhZGVyLnJlYWRJbnQoKTsKKyAgICAgICAgICAgIG5vZGUubU5leHRPZmZzZXQgPSBub2RlLm1OZXh0T2Zmc2V0ID09IDAgPyAtMSA6IG5vZGUubU5leHRPZmZzZXQ7CisgICAgICAgICAgICBub2RlLm1IYXNQYWNrYWdlRmluZ2VycHJpbnQgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuIG5vZGU7CisgICAgICAgIH0KKwogICAgICAgICBAT3ZlcnJpZGUKICAgICAgICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKICAgICAgICAgICAgIHJldHVybiBPYmplY3RzLmhhc2gobVBhY2thZ2VOYW1lLCBtUGFja2FnZUlkLCBtQm9vbGVhblN0YXJ0SW5kZXgsIG1OZXh0T2Zmc2V0KTsKQEAgLTE2MSw2ICsyMTMsMTAgQEAKICAgICAgICAgICAgIHJldHVybiBtUGFja2FnZUlkOwogICAgICAgICB9CiAKKyAgICAgICAgcHVibGljIGxvbmcgZ2V0UGFja2FnZUZpbmdlcnByaW50KCkgeworICAgICAgICAgICAgcmV0dXJuIG1QYWNrYWdlRmluZ2VycHJpbnQ7CisgICAgICAgIH0KKwogICAgICAgICBwdWJsaWMgaW50IGdldEJvb2xlYW5TdGFydEluZGV4KCkgewogICAgICAgICAgICAgcmV0dXJuIG1Cb29sZWFuU3RhcnRJbmRleDsKICAgICAgICAgfQpAQCAtMTY4LDUgKzIyNCw5IEBACiAgICAgICAgIHB1YmxpYyBpbnQgZ2V0TmV4dE9mZnNldCgpIHsKICAgICAgICAgICAgIHJldHVybiBtTmV4dE9mZnNldDsKICAgICAgICAgfQorCisgICAgICAgIHB1YmxpYyBib29sZWFuIGhhc1BhY2thZ2VGaW5nZXJwcmludCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtSGFzUGFja2FnZUZpbmdlcnByaW50OworICAgICAgICB9CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1N0b3JhZ2VGaWxlUHJvdmlkZXIuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9TdG9yYWdlRmlsZVByb3ZpZGVyLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc1YWMzNgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9TdG9yYWdlRmlsZVByb3ZpZGVyLmphdmEKQEAgLTAsMCArMSwxMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlOworCitpbXBvcnQgamF2YS5pby5DbG9zZWFibGU7CitpbXBvcnQgamF2YS5uaW8uTWFwcGVkQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkRpcmVjdG9yeVN0cmVhbTsKK2ltcG9ydCBqYXZhLm5pby5maWxlLkZpbGVzOworaW1wb3J0IGphdmEubmlvLmZpbGUuTm9TdWNoRmlsZUV4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGg7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlN0YW5kYXJkT3Blbk9wdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLkxpc3Q7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqIEBoaWRlICovCitwdWJsaWMgY2xhc3MgU3RvcmFnZUZpbGVQcm92aWRlciB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9NQVBfUEFUSCA9ICIvbWV0YWRhdGEvYWNvbmZpZy9tYXBzLyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfQk9PVF9QQVRIID0gIi9tZXRhZGF0YS9hY29uZmlnL2Jvb3QvIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgUE1BUF9GSUxFX0VYVCA9ICIucGFja2FnZS5tYXAiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGTUFQX0ZJTEVfRVhUID0gIi5mbGFnLm1hcCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTF9GSUxFX0VYVCA9ICIudmFsIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdG9yYWdlRmlsZVByb3ZpZGVyIERFRkFVTFRfSU5TVEFOQ0UgPQorICAgICAgICAgICAgbmV3IFN0b3JhZ2VGaWxlUHJvdmlkZXIoREVGQVVMVF9NQVBfUEFUSCwgREVGQVVMVF9CT09UX1BBVEgpOworCisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbU1hcFBhdGg7CisgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUJvb3RQYXRoOworCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIHN0YXRpYyBTdG9yYWdlRmlsZVByb3ZpZGVyIGdldERlZmF1bHRQcm92aWRlcigpIHsKKyAgICAgICAgcmV0dXJuIERFRkFVTFRfSU5TVEFOQ0U7CisgICAgfQorCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIFN0b3JhZ2VGaWxlUHJvdmlkZXIoU3RyaW5nIG1hcFBhdGgsIFN0cmluZyBib290UGF0aCkgeworICAgICAgICBtTWFwUGF0aCA9IG1hcFBhdGg7CisgICAgICAgIG1Cb290UGF0aCA9IGJvb3RQYXRoOworICAgIH0KKworICAgIC8qKiBAaGlkZSAqLworICAgIHB1YmxpYyBMaXN0PFN0cmluZz4gbGlzdENvbnRhaW5lcnMoU3RyaW5nW10gZXhjbHVkZXMpIHsKKyAgICAgICAgTGlzdDxTdHJpbmc+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBTZXQ8U3RyaW5nPiBzZXQgPSBuZXcgSGFzaFNldDw+KEFycmF5cy5hc0xpc3QoZXhjbHVkZXMpKTsKKworICAgICAgICB0cnkgeworICAgICAgICAgICAgRGlyZWN0b3J5U3RyZWFtPFBhdGg+IHN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgIEZpbGVzLm5ld0RpcmVjdG9yeVN0cmVhbShQYXRocy5nZXQobU1hcFBhdGgpLCAiKiIgKyBQTUFQX0ZJTEVfRVhUKTsKKyAgICAgICAgICAgIGZvciAoUGF0aCBlbnRyeSA6IHN0cmVhbSkgeworICAgICAgICAgICAgICAgIFN0cmluZyBmaWxlTmFtZSA9IGVudHJ5LmdldEZpbGVOYW1lKCkudG9TdHJpbmcoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY29udGFpbmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVOYW1lLnN1YnN0cmluZygwLCBmaWxlTmFtZS5sZW5ndGgoKSAtIFBNQVBfRklMRV9FWFQubGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIGlmICghc2V0LmNvbnRhaW5zKGNvbnRhaW5lcikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFkZChjb250YWluZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoTm9TdWNoRmlsZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFjb25maWdTdG9yYWdlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJGYWlsIHRvIGxpc3QgbWFwIGZpbGVzIGluIHBhdGggJXMiLCBtTWFwUGF0aCksIGUpOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvKiogQGhpZGUgKi8KKyAgICBwdWJsaWMgUGFja2FnZVRhYmxlIGdldFBhY2thZ2VUYWJsZShTdHJpbmcgY29udGFpbmVyKSB7CisgICAgICAgIHJldHVybiBQYWNrYWdlVGFibGUuZnJvbUJ5dGVzKAorICAgICAgICAgICAgICAgIG1hcFN0b3JhZ2VGaWxlKAorICAgICAgICAgICAgICAgICAgICAgICAgUGF0aHMuZ2V0KG1NYXBQYXRoLCBjb250YWluZXIgKyBQTUFQX0ZJTEVfRVhUKSwgRmlsZVR5cGUuUEFDS0FHRV9NQVApKTsKKyAgICB9CisKKyAgICAvKiogQGhpZGUgKi8KKyAgICBwdWJsaWMgRmxhZ1RhYmxlIGdldEZsYWdUYWJsZShTdHJpbmcgY29udGFpbmVyKSB7CisgICAgICAgIHJldHVybiBGbGFnVGFibGUuZnJvbUJ5dGVzKAorICAgICAgICAgICAgICAgIG1hcFN0b3JhZ2VGaWxlKFBhdGhzLmdldChtTWFwUGF0aCwgY29udGFpbmVyICsgRk1BUF9GSUxFX0VYVCksIEZpbGVUeXBlLkZMQUdfTUFQKSk7CisgICAgfQorCisgICAgLyoqIEBoaWRlICovCisgICAgcHVibGljIEZsYWdWYWx1ZUxpc3QgZ2V0RmxhZ1ZhbHVlTGlzdChTdHJpbmcgY29udGFpbmVyKSB7CisgICAgICAgIHJldHVybiBGbGFnVmFsdWVMaXN0LmZyb21CeXRlcygKKyAgICAgICAgICAgICAgICBtYXBTdG9yYWdlRmlsZShQYXRocy5nZXQobUJvb3RQYXRoLCBjb250YWluZXIgKyBWQUxfRklMRV9FWFQpLCBGaWxlVHlwZS5GTEFHX1ZBTCkpOworICAgIH0KKworICAgIC8vIE1hcCBhIHN0b3JhZ2UgZmlsZSBnaXZlbiBmaWxlIHBhdGgKKyAgICBwcml2YXRlIHN0YXRpYyBNYXBwZWRCeXRlQnVmZmVyIG1hcFN0b3JhZ2VGaWxlKFBhdGggZmlsZSwgRmlsZVR5cGUgdHlwZSkgeworICAgICAgICBGaWxlQ2hhbm5lbCBjaGFubmVsID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNoYW5uZWwgPSBGaWxlQ2hhbm5lbC5vcGVuKGZpbGUsIFN0YW5kYXJkT3Blbk9wdGlvbi5SRUFEKTsKKyAgICAgICAgICAgIHJldHVybiBjaGFubmVsLm1hcChGaWxlQ2hhbm5lbC5NYXBNb2RlLlJFQURfT05MWSwgMCwgY2hhbm5lbC5zaXplKCkpOworICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgdGhyb3cgbmV3IEFjb25maWdTdG9yYWdlRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbi5FUlJPUl9DQU5OT1RfUkVBRF9TVE9SQUdFX0ZJTEUsCisgICAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIkZhaWwgdG8gbW1hcCBzdG9yYWdlICVzIGZpbGUgJXMiLCB0eXBlLnRvU3RyaW5nKCksIGZpbGUpLAorICAgICAgICAgICAgICAgICAgICBlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHF1aWV0bHlEaXNwb3NlKGNoYW5uZWwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBxdWlldGx5RGlzcG9zZShDbG9zZWFibGUgY2xvc2FibGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChjbG9zYWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2xvc2FibGUuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gY2FyZSwgYXQgbGVhc3QgYXMgb2Ygbm93CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvVGFibGVVdGlscy5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1RhYmxlVXRpbHMuamF2YQppbmRleCA4MTE2OGY1Li5kNDI2OWRhIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3NyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvVGFibGVVdGlscy5qYXZhCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9UYWJsZVV0aWxzLmphdmEKQEAgLTYzLDQgKzYzLDE2IEBACiAgICAgICAgIGxvbmcgaGFzaFZhbCA9IFNpcEhhc2hlcjEzLmhhc2godmFsKTsKICAgICAgICAgcmV0dXJuIChpbnQpIExvbmcucmVtYWluZGVyVW5zaWduZWQoaGFzaFZhbCwgbnVtQnVja2V0cyk7CiAgICAgfQorCisgICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgU3RvcmFnZUZpbGVzQnVuZGxlIHsKKyAgICAgICAgcHVibGljIGZpbmFsIFBhY2thZ2VUYWJsZSBwYWNrYWdlVGFibGU7CisgICAgICAgIHB1YmxpYyBmaW5hbCBGbGFnVGFibGUgZmxhZ1RhYmxlOworICAgICAgICBwdWJsaWMgZmluYWwgRmxhZ1ZhbHVlTGlzdCBmbGFnVmFsdWVMaXN0OworCisgICAgICAgIHB1YmxpYyBTdG9yYWdlRmlsZXNCdW5kbGUgKFBhY2thZ2VUYWJsZSBwVGFibGUsIEZsYWdUYWJsZSBmVGFibGUsIEZsYWdWYWx1ZUxpc3QgZlZhbHVlTGlzdCkgeworICAgICAgICAgICAgdGhpcy5wYWNrYWdlVGFibGUgPSBwVGFibGU7CisgICAgICAgICAgICB0aGlzLmZsYWdUYWJsZSA9IGZUYWJsZTsKKyAgICAgICAgICAgIHRoaXMuZmxhZ1ZhbHVlTGlzdCA9IGZWYWx1ZUxpc3Q7CisgICAgICAgIH0KKyAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9BbmRyb2lkLmJwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IDEyZTRhY2EuLmJkNDZkNWYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvQW5kcm9pZC5icAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTEwLDEwICsxMCwxNCBAQAogICAgICAgICAibGliYmFzZSIsCiAgICAgXSwKICAgICBkYXRhOiBbCi0gICAgICAgICJwYWNrYWdlLm1hcCIsCi0gICAgICAgICJmbGFnLm1hcCIsCi0gICAgICAgICJmbGFnLnZhbCIsCi0gICAgICAgICJmbGFnLmluZm8iLAorICAgICAgICAiZGF0YS92MS9wYWNrYWdlX3YxLm1hcCIsCisgICAgICAgICJkYXRhL3YxL2ZsYWdfdjEubWFwIiwKKyAgICAgICAgImRhdGEvdjEvZmxhZ192MS52YWwiLAorICAgICAgICAiZGF0YS92MS9mbGFnX3YxLmluZm8iLAorICAgICAgICAiZGF0YS92Mi9wYWNrYWdlX3YyLm1hcCIsCisgICAgICAgICJkYXRhL3YyL2ZsYWdfdjIubWFwIiwKKyAgICAgICAgImRhdGEvdjIvZmxhZ192Mi52YWwiLAorICAgICAgICAiZGF0YS92Mi9mbGFnX3YyLmluZm8iLAogICAgIF0sCiAgICAgdGVzdF9zdWl0ZXM6IFsKICAgICAgICAgImRldmljZS10ZXN0cyIsCkBAIC0zNSwxMCArMzksMTQgQEAKICAgICB0ZXN0X2NvbmZpZzogIkFuZHJvaWRTdG9yYWdlSmF2ZVRlc3QueG1sIiwKICAgICBzZGtfdmVyc2lvbjogInRlc3RfY3VycmVudCIsCiAgICAgZGF0YTogWwotICAgICAgICAicGFja2FnZS5tYXAiLAotICAgICAgICAiZmxhZy5tYXAiLAotICAgICAgICAiZmxhZy52YWwiLAotICAgICAgICAiZmxhZy5pbmZvIiwKKyAgICAgICAgImRhdGEvdjEvcGFja2FnZV92MS5tYXAiLAorICAgICAgICAiZGF0YS92MS9mbGFnX3YxLm1hcCIsCisgICAgICAgICJkYXRhL3YxL2ZsYWdfdjEudmFsIiwKKyAgICAgICAgImRhdGEvdjEvZmxhZ192MS5pbmZvIiwKKyAgICAgICAgImRhdGEvdjIvcGFja2FnZV92Mi5tYXAiLAorICAgICAgICAiZGF0YS92Mi9mbGFnX3YyLm1hcCIsCisgICAgICAgICJkYXRhL3YyL2ZsYWdfdjIudmFsIiwKKyAgICAgICAgImRhdGEvdjIvZmxhZ192Mi5pbmZvIiwKICAgICBdLAogICAgIHRlc3Rfc3VpdGVzOiBbCiAgICAgICAgICJnZW5lcmFsLXRlc3RzIiwKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvQW5kcm9pZFN0b3JhZ2VKYXZlVGVzdC54bWwgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL0FuZHJvaWRTdG9yYWdlSmF2ZVRlc3QueG1sCmluZGV4IDJkNTJkNDQuLmJmYzIzOGUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvQW5kcm9pZFN0b3JhZ2VKYXZlVGVzdC54bWwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9BbmRyb2lkU3RvcmFnZUphdmVUZXN0LnhtbApAQCAtMjEsMTMgKzIxLDE4IEBACiAgICAgPC90YXJnZXRfcHJlcGFyZXI+CiAgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQuY29tcGF0aWJpbGl0eS5jb21tb24udHJhZGVmZWQudGFyZ2V0cHJlcC5GaWxlUHVzaGVyIj4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0icGFja2FnZS5tYXAtPi9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX3N0b3JhZ2VfZmlsZV90ZXN0X2phdmEvdGVzdGRhdGEvcGFja2FnZS5tYXAiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9ImZsYWcubWFwLT4vZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19zdG9yYWdlX2ZpbGVfdGVzdF9qYXZhL3Rlc3RkYXRhL2ZsYWcubWFwIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJmbGFnLnZhbC0+L2RhdGEvbG9jYWwvdG1wL2Fjb25maWdfc3RvcmFnZV9maWxlX3Rlc3RfamF2YS90ZXN0ZGF0YS9mbGFnLnZhbCIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iZmxhZy5pbmZvLT4vZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19zdG9yYWdlX2ZpbGVfdGVzdF9qYXZhL3Rlc3RkYXRhL2ZsYWcuaW5mbyIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0icGFja2FnZV92MS5tYXAtPi9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX3N0b3JhZ2VfZmlsZV90ZXN0X2phdmEvdGVzdGRhdGEvbW9jay52MS5wYWNrYWdlLm1hcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iZmxhZ192MS5tYXAtPi9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX3N0b3JhZ2VfZmlsZV90ZXN0X2phdmEvdGVzdGRhdGEvbW9jay52MS5mbGFnLm1hcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iZmxhZ192MS52YWwtPi9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX3N0b3JhZ2VfZmlsZV90ZXN0X2phdmEvdGVzdGRhdGEvbW9jay52MS52YWwiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9ImZsYWdfdjEuaW5mby0+L2RhdGEvbG9jYWwvdG1wL2Fjb25maWdfc3RvcmFnZV9maWxlX3Rlc3RfamF2YS90ZXN0ZGF0YS9tb2NrLnYxLmluZm8iIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9InBhY2thZ2VfdjIubWFwLT4vZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19zdG9yYWdlX2ZpbGVfdGVzdF9qYXZhL3Rlc3RkYXRhL21vY2sudjIucGFja2FnZS5tYXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9ImZsYWdfdjIubWFwLT4vZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19zdG9yYWdlX2ZpbGVfdGVzdF9qYXZhL3Rlc3RkYXRhL21vY2sudjIuZmxhZy5tYXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9ImZsYWdfdjIudmFsLT4vZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19zdG9yYWdlX2ZpbGVfdGVzdF9qYXZhL3Rlc3RkYXRhL21vY2sudjIudmFsIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJmbGFnX3YyLmluZm8tPi9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX3N0b3JhZ2VfZmlsZV90ZXN0X2phdmEvdGVzdGRhdGEvbW9jay52Mi5pbmZvIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InBvc3QtcHVzaCIgdmFsdWU9ImNobW9kICtyIC9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX3N0b3JhZ2VfZmlsZV90ZXN0X2phdmEvdGVzdGRhdGEvIiAvPgogICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgogICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5BbmRyb2lkSlVuaXRUZXN0IiA+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icGFja2FnZSIgdmFsdWU9ImFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0icnVudGltZS1oaW50IiB2YWx1ZT0iMW0iIC8+CiAgICAgPC90ZXN0PgotPC9jb25maWd1cmF0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKzwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZmxhZy5pbmZvIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9kYXRhL3YxL2ZsYWdfdjEuaW5mbwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9mbGFnLmluZm8KcmVuYW1lIHRvIHRvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZGF0YS92MS9mbGFnX3YxLmluZm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9mbGFnLm1hcCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZGF0YS92MS9mbGFnX3YxLm1hcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9mbGFnLm1hcApyZW5hbWUgdG8gdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9kYXRhL3YxL2ZsYWdfdjEubWFwCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZmxhZy52YWwgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL2RhdGEvdjEvZmxhZ192MS52YWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZmxhZy52YWwKcmVuYW1lIHRvIHRvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZGF0YS92MS9mbGFnX3YxLnZhbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3BhY2thZ2UubWFwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9kYXRhL3YxL3BhY2thZ2VfdjEubWFwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3BhY2thZ2UubWFwCnJlbmFtZSB0byB0b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL2RhdGEvdjEvcGFja2FnZV92MS5tYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9kYXRhL3YyL2ZsYWdfdjIuaW5mbyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZGF0YS92Mi9mbGFnX3YyLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRiN2ZkZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvZGF0YS92Mi9mbGFnX3YyLmluZm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9kYXRhL3YyL2ZsYWdfdjIubWFwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9kYXRhL3YyL2ZsYWdfdjIubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNDY4NWMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL2RhdGEvdjIvZmxhZ192Mi5tYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9kYXRhL3YyL2ZsYWdfdjIudmFsIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9kYXRhL3YyL2ZsYWdfdjIudmFsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3ZDQ3NTAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL2RhdGEvdjIvZmxhZ192Mi52YWwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9kYXRhL3YyL3BhY2thZ2VfdjIubWFwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9kYXRhL3YyL3BhY2thZ2VfdjIubWFwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhOWY5NWUKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL2RhdGEvdjIvcGFja2FnZV92Mi5tYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9qYXJqYXIudHh0IGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9qYXJqYXIudHh0CmluZGV4IGE2YzE3ZmEuLjI0OTUyZWMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvamFyamFyLnR4dAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL2phcmphci50eHQKQEAgLTcsNiArNyw4IEBACiBydWxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZpbGVUeXBlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuRmlsZVR5cGUKIHJ1bGUgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmxhZ1ZhbHVlTGlzdCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0LkZsYWdWYWx1ZUxpc3QKIHJ1bGUgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuVGFibGVVdGlscyBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0LlRhYmxlVXRpbHMKK3J1bGUgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuQWNvbmZpZ1BhY2thZ2VJbXBsIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3QuQWNvbmZpZ1BhY2thZ2VJbXBsCitydWxlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlN0b3JhZ2VGaWxlUHJvdmlkZXIgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdC5TdG9yYWdlRmlsZVByb3ZpZGVyCiAKIAogcnVsZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GbGFnVGFibGUkKiBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0LkZsYWdUYWJsZSRAMQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL0ZsYWdUYWJsZVRlc3QuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9GbGFnVGFibGVUZXN0LmphdmEKaW5kZXggZmQ0MGQ0Yy4uZGM0NjViNiAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL0ZsYWdUYWJsZVRlc3QuamF2YQorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvRmxhZ1RhYmxlVGVzdC5qYXZhCkBAIC0zMSw3ICszMSw3IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RGbGFnVGFibGVfcmlnaHRIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgRmxhZ1RhYmxlIGZsYWdUYWJsZSA9IEZsYWdUYWJsZS5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0RmxhZ01hcEJ5dGVCdWZmZXIoKSk7CisgICAgICAgIEZsYWdUYWJsZSBmbGFnVGFibGUgPSBGbGFnVGFibGUuZnJvbUJ5dGVzKFRlc3REYXRhVXRpbHMuZ2V0VGVzdEZsYWdNYXBCeXRlQnVmZmVyKDEpKTsKICAgICAgICAgRmxhZ1RhYmxlLkhlYWRlciBoZWFkZXIgPSBmbGFnVGFibGUuZ2V0SGVhZGVyKCk7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCBoZWFkZXIuZ2V0VmVyc2lvbigpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJtb2NrdXAiLCBoZWFkZXIuZ2V0Q29udGFpbmVyKCkpOwpAQCAtNDQsNyArNDQsNyBAQAogCiAgICAgQFRlc3QKICAgICBwdWJsaWMgdm9pZCB0ZXN0RmxhZ1RhYmxlX3JpZ2h0Tm9kZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBGbGFnVGFibGUgZmxhZ1RhYmxlID0gRmxhZ1RhYmxlLmZyb21CeXRlcyhUZXN0RGF0YVV0aWxzLmdldFRlc3RGbGFnTWFwQnl0ZUJ1ZmZlcigpKTsKKyAgICAgICAgRmxhZ1RhYmxlIGZsYWdUYWJsZSA9IEZsYWdUYWJsZS5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0RmxhZ01hcEJ5dGVCdWZmZXIoMSkpOwogCiAgICAgICAgIEZsYWdUYWJsZS5Ob2RlIG5vZGUxID0gZmxhZ1RhYmxlLmdldCgwLCAiZW5hYmxlZF9ybyIpOwogICAgICAgICBGbGFnVGFibGUuTm9kZSBub2RlMiA9IGZsYWdUYWJsZS5nZXQoMCwgImVuYWJsZWRfcnciKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9GbGFnVmFsdWVMaXN0VGVzdC5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL0ZsYWdWYWx1ZUxpc3RUZXN0LmphdmEKaW5kZXggMWIwZGU2My4uMzA2ZGY3ZCAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL0ZsYWdWYWx1ZUxpc3RUZXN0LmphdmEKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL0ZsYWdWYWx1ZUxpc3RUZXN0LmphdmEKQEAgLTM0LDcgKzM0LDcgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RGbGFnVmFsdWVMaXN0X3JpZ2h0SGVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIEZsYWdWYWx1ZUxpc3QgZmxhZ1ZhbHVlTGlzdCA9Ci0gICAgICAgICAgICAgICAgRmxhZ1ZhbHVlTGlzdC5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0RmxhZ1ZhbEJ5dGVCdWZmZXIoKSk7CisgICAgICAgICAgICAgICAgRmxhZ1ZhbHVlTGlzdC5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0RmxhZ1ZhbEJ5dGVCdWZmZXIoMSkpOwogICAgICAgICBGbGFnVmFsdWVMaXN0LkhlYWRlciBoZWFkZXIgPSBmbGFnVmFsdWVMaXN0LmdldEhlYWRlcigpOwogICAgICAgICBhc3NlcnRFcXVhbHMoMSwgaGVhZGVyLmdldFZlcnNpb24oKSk7CiAgICAgICAgIGFzc2VydEVxdWFscygibW9ja3VwIiwgaGVhZGVyLmdldENvbnRhaW5lcigpKTsKQEAgLTQ3LDcgKzQ3LDcgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RGbGFnVmFsdWVMaXN0X3JpZ2h0Tm9kZSgpIHRocm93cyBFeGNlcHRpb24gewogICAgICAgICBGbGFnVmFsdWVMaXN0IGZsYWdWYWx1ZUxpc3QgPQotICAgICAgICAgICAgICAgIEZsYWdWYWx1ZUxpc3QuZnJvbUJ5dGVzKFRlc3REYXRhVXRpbHMuZ2V0VGVzdEZsYWdWYWxCeXRlQnVmZmVyKCkpOworICAgICAgICAgICAgICAgIEZsYWdWYWx1ZUxpc3QuZnJvbUJ5dGVzKFRlc3REYXRhVXRpbHMuZ2V0VGVzdEZsYWdWYWxCeXRlQnVmZmVyKDEpKTsKIAogICAgICAgICBib29sZWFuW10gZXhwZWN0ZWQgPSBuZXcgYm9vbGVhbltdIHtmYWxzZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIHRydWUsIHRydWUsIHRydWV9OwogICAgICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQubGVuZ3RoLCBmbGFnVmFsdWVMaXN0LnNpemUoKSk7CkBAIC02MCwxMSArNjAsMTEgQEAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RGbGFnVmFsdWVMaXN0X2dldFZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CiAgICAgICAgIFBhY2thZ2VUYWJsZSBwYWNrYWdlVGFibGUgPQotICAgICAgICAgICAgICAgIFBhY2thZ2VUYWJsZS5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0UGFja2FnZU1hcEJ5dGVCdWZmZXIoKSk7Ci0gICAgICAgIEZsYWdUYWJsZSBmbGFnVGFibGUgPSBGbGFnVGFibGUuZnJvbUJ5dGVzKFRlc3REYXRhVXRpbHMuZ2V0VGVzdEZsYWdNYXBCeXRlQnVmZmVyKCkpOworICAgICAgICAgICAgICAgIFBhY2thZ2VUYWJsZS5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0UGFja2FnZU1hcEJ5dGVCdWZmZXIoMSkpOworICAgICAgICBGbGFnVGFibGUgZmxhZ1RhYmxlID0gRmxhZ1RhYmxlLmZyb21CeXRlcyhUZXN0RGF0YVV0aWxzLmdldFRlc3RGbGFnTWFwQnl0ZUJ1ZmZlcigxKSk7CiAKICAgICAgICAgRmxhZ1ZhbHVlTGlzdCBmbGFnVmFsdWVMaXN0ID0KLSAgICAgICAgICAgICAgICBGbGFnVmFsdWVMaXN0LmZyb21CeXRlcyhUZXN0RGF0YVV0aWxzLmdldFRlc3RGbGFnVmFsQnl0ZUJ1ZmZlcigpKTsKKyAgICAgICAgICAgICAgICBGbGFnVmFsdWVMaXN0LmZyb21CeXRlcyhUZXN0RGF0YVV0aWxzLmdldFRlc3RGbGFnVmFsQnl0ZUJ1ZmZlcigxKSk7CiAKICAgICAgICAgUGFja2FnZVRhYmxlLk5vZGUgcE5vZGUgPSBwYWNrYWdlVGFibGUuZ2V0KCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIik7CiAgICAgICAgIEZsYWdUYWJsZS5Ob2RlIGZOb2RlID0gZmxhZ1RhYmxlLmdldChwTm9kZS5nZXRQYWNrYWdlSWQoKSwgImVuYWJsZWRfcnciKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9QYWNrYWdlVGFibGVUZXN0LmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvUGFja2FnZVRhYmxlVGVzdC5qYXZhCmluZGV4IGU3ZTE5ZDguLjRiNjhlNWIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9QYWNrYWdlVGFibGVUZXN0LmphdmEKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL1BhY2thZ2VUYWJsZVRlc3QuamF2YQpAQCAtMTcsNiArMTcsOCBAQAogcGFja2FnZSBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0OwogCiBpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CiAKIGltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GaWxlVHlwZTsKIGltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5QYWNrYWdlVGFibGU7CkBAIC0yNSwxMyArMjcsMTggQEAKIGltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OwogCitpbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7CitpbXBvcnQgamF2YS51dGlsLk9iamVjdHM7CitpbXBvcnQgamF2YS51dGlsLlNldDsKK2ltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5DeWNsaWNCYXJyaWVyOworCiBAUnVuV2l0aChKVW5pdDQuY2xhc3MpCiBwdWJsaWMgY2xhc3MgUGFja2FnZVRhYmxlVGVzdCB7CiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlVGFibGVfcmlnaHRIZWFkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgUGFja2FnZVRhYmxlIHBhY2thZ2VUYWJsZSA9Ci0gICAgICAgICAgICAgICAgUGFja2FnZVRhYmxlLmZyb21CeXRlcyhUZXN0RGF0YVV0aWxzLmdldFRlc3RQYWNrYWdlTWFwQnl0ZUJ1ZmZlcigpKTsKKyAgICAgICAgICAgICAgICBQYWNrYWdlVGFibGUuZnJvbUJ5dGVzKFRlc3REYXRhVXRpbHMuZ2V0VGVzdFBhY2thZ2VNYXBCeXRlQnVmZmVyKDEpKTsKICAgICAgICAgUGFja2FnZVRhYmxlLkhlYWRlciBoZWFkZXIgPSBwYWNrYWdlVGFibGUuZ2V0SGVhZGVyKCk7CiAgICAgICAgIGFzc2VydEVxdWFscygxLCBoZWFkZXIuZ2V0VmVyc2lvbigpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKCJtb2NrdXAiLCBoZWFkZXIuZ2V0Q29udGFpbmVyKCkpOwpAQCAtNDMsOSArNTAsMjMgQEAKICAgICB9CiAKICAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlVGFibGVfcmlnaHRIZWFkZXJfdjIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUGFja2FnZVRhYmxlIHBhY2thZ2VUYWJsZSA9CisgICAgICAgICAgICAgICAgUGFja2FnZVRhYmxlLmZyb21CeXRlcyhUZXN0RGF0YVV0aWxzLmdldFRlc3RQYWNrYWdlTWFwQnl0ZUJ1ZmZlcigyKSk7CisgICAgICAgIFBhY2thZ2VUYWJsZS5IZWFkZXIgaGVhZGVyID0gcGFja2FnZVRhYmxlLmdldEhlYWRlcigpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgaGVhZGVyLmdldFZlcnNpb24oKSk7CisgICAgICAgIGFzc2VydEVxdWFscygibW9ja3VwIiwgaGVhZGVyLmdldENvbnRhaW5lcigpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKEZpbGVUeXBlLlBBQ0tBR0VfTUFQLCBoZWFkZXIuZ2V0RmlsZVR5cGUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygyMzMsIGhlYWRlci5nZXRGaWxlU2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIGhlYWRlci5nZXROdW1QYWNrYWdlcygpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMxLCBoZWFkZXIuZ2V0QnVja2V0T2Zmc2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNTksIGhlYWRlci5nZXROb2RlT2Zmc2V0KCkpOworICAgIH0KKworICAgIEBUZXN0CiAgICAgcHVibGljIHZvaWQgdGVzdFBhY2thZ2VUYWJsZV9yaWdodE5vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKICAgICAgICAgUGFja2FnZVRhYmxlIHBhY2thZ2VUYWJsZSA9Ci0gICAgICAgICAgICAgICAgUGFja2FnZVRhYmxlLmZyb21CeXRlcyhUZXN0RGF0YVV0aWxzLmdldFRlc3RQYWNrYWdlTWFwQnl0ZUJ1ZmZlcigpKTsKKyAgICAgICAgICAgICAgICBQYWNrYWdlVGFibGUuZnJvbUJ5dGVzKFRlc3REYXRhVXRpbHMuZ2V0VGVzdFBhY2thZ2VNYXBCeXRlQnVmZmVyKDEpKTsKIAogICAgICAgICBQYWNrYWdlVGFibGUuTm9kZSBub2RlMSA9IHBhY2thZ2VUYWJsZS5nZXQoImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiKTsKICAgICAgICAgUGFja2FnZVRhYmxlLk5vZGUgbm9kZTIgPSBwYWNrYWdlVGFibGUuZ2V0KCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIik7CkBAIC02Niw1ICs4NywxMDMgQEAKICAgICAgICAgYXNzZXJ0RXF1YWxzKDE1OSwgbm9kZTEuZ2V0TmV4dE9mZnNldCgpKTsKICAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBub2RlMi5nZXROZXh0T2Zmc2V0KCkpOwogICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIG5vZGU0LmdldE5leHRPZmZzZXQoKSk7CisKKyAgICAgICAgYXNzZXJ0RmFsc2Uobm9kZTEuaGFzUGFja2FnZUZpbmdlcnByaW50KCkpOworICAgICAgICBhc3NlcnRGYWxzZShub2RlMi5oYXNQYWNrYWdlRmluZ2VycHJpbnQoKSk7CisgICAgICAgIGFzc2VydEZhbHNlKG5vZGU0Lmhhc1BhY2thZ2VGaW5nZXJwcmludCgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQYWNrYWdlVGFibGVfcmlnaHROb2RlX3YyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFBhY2thZ2VUYWJsZSBwYWNrYWdlVGFibGUgPQorICAgICAgICAgICAgICAgIFBhY2thZ2VUYWJsZS5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0UGFja2FnZU1hcEJ5dGVCdWZmZXIoMikpOworCisgICAgICAgIFBhY2thZ2VUYWJsZS5Ob2RlIG5vZGUxID0gcGFja2FnZVRhYmxlLmdldCgiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIpOworICAgICAgICBQYWNrYWdlVGFibGUuTm9kZSBub2RlMiA9IHBhY2thZ2VUYWJsZS5nZXQoImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiKTsKKyAgICAgICAgUGFja2FnZVRhYmxlLk5vZGUgbm9kZTQgPSBwYWNrYWdlVGFibGUuZ2V0KCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80Iik7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKCJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiwgbm9kZTEuZ2V0UGFja2FnZU5hbWUoKSk7CisgICAgICAgIGFzc2VydEVxdWFscygiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIsIG5vZGUyLmdldFBhY2thZ2VOYW1lKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiLCBub2RlNC5nZXRQYWNrYWdlTmFtZSgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbm9kZTEuZ2V0UGFja2FnZUlkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbm9kZTIuZ2V0UGFja2FnZUlkKCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgbm9kZTQuZ2V0UGFja2FnZUlkKCkpOworCisgICAgICAgIGFzc2VydEVxdWFscygwLCBub2RlMS5nZXRCb29sZWFuU3RhcnRJbmRleCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIG5vZGUyLmdldEJvb2xlYW5TdGFydEluZGV4KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoNiwgbm9kZTQuZ2V0Qm9vbGVhblN0YXJ0SW5kZXgoKSk7CisKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDE3NSwgbm9kZTEuZ2V0TmV4dE9mZnNldCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKC0xLCBub2RlMi5nZXROZXh0T2Zmc2V0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTEsIG5vZGU0LmdldE5leHRPZmZzZXQoKSk7CisKKyAgICAgICAgYXNzZXJ0VHJ1ZShub2RlMS5oYXNQYWNrYWdlRmluZ2VycHJpbnQoKSk7CisgICAgICAgIGFzc2VydFRydWUobm9kZTIuaGFzUGFja2FnZUZpbmdlcnByaW50KCkpOworICAgICAgICBhc3NlcnRUcnVlKG5vZGU0Lmhhc1BhY2thZ2VGaW5nZXJwcmludCgpKTsKKworICAgICAgICBhc3NlcnRFcXVhbHMoLTMxOTc3OTU1NjMxMTkzOTM1MzBMLCBub2RlMS5nZXRQYWNrYWdlRmluZ2VycHJpbnQoKSk7CisgICAgICAgIGFzc2VydEVxdWFscyg0NDMxOTQwNTAyMjc0ODU3OTY0TCwgbm9kZTIuZ2V0UGFja2FnZUZpbmdlcnByaW50KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoLTIyMTM1MTQxNTU5OTc5MjkyNDFMLCBub2RlNC5nZXRQYWNrYWdlRmluZ2VycHJpbnQoKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFja2FnZVRhYmxlX2dldFBhY2thZ2VMaXN0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFBhY2thZ2VUYWJsZSBwYWNrYWdlVGFibGUgPQorICAgICAgICAgICAgICAgIFBhY2thZ2VUYWJsZS5mcm9tQnl0ZXMoVGVzdERhdGFVdGlscy5nZXRUZXN0UGFja2FnZU1hcEJ5dGVCdWZmZXIoMikpOworICAgICAgICBTZXQ8U3RyaW5nPiBwYWNrYWdlcyA9IG5ldyBIYXNoU2V0PD4ocGFja2FnZVRhYmxlLmdldFBhY2thZ2VMaXN0KCkpOworICAgICAgICBhc3NlcnRFcXVhbHMoMywgcGFja2FnZXMuc2l6ZSgpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwYWNrYWdlcy5jb250YWlucygiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwYWNrYWdlcy5jb250YWlucygiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIpKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZShwYWNrYWdlcy5jb250YWlucygiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIpKTsKKworICAgICAgICBwYWNrYWdlVGFibGUgPSBQYWNrYWdlVGFibGUuZnJvbUJ5dGVzKFRlc3REYXRhVXRpbHMuZ2V0VGVzdFBhY2thZ2VNYXBCeXRlQnVmZmVyKDEpKTsKKyAgICAgICAgcGFja2FnZXMgPSBuZXcgSGFzaFNldDw+KHBhY2thZ2VUYWJsZS5nZXRQYWNrYWdlTGlzdCgpKTsKKyAgICAgICAgYXNzZXJ0RXF1YWxzKDMsIHBhY2thZ2VzLnNpemUoKSk7CisgICAgICAgIGFzc2VydFRydWUocGFja2FnZXMuY29udGFpbnMoImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiKSk7CisgICAgICAgIGFzc2VydFRydWUocGFja2FnZXMuY29udGFpbnMoImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiKSk7CisgICAgICAgIGFzc2VydFRydWUocGFja2FnZXMuY29udGFpbnMoImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiKSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0UGFja2FnZVRhYmxlX211bHRpdGhyZWFkc1JlYWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgUGFja2FnZVRhYmxlIHBhY2thZ2VUYWJsZSA9CisgICAgICAgICAgICAgICAgUGFja2FnZVRhYmxlLmZyb21CeXRlcyhUZXN0RGF0YVV0aWxzLmdldFRlc3RQYWNrYWdlTWFwQnl0ZUJ1ZmZlcigyKSk7CisgICAgICAgIGludCBudW1iZXJPZlRocmVhZHMgPSAzOworICAgICAgICBUaHJlYWRbXSB0aHJlYWRzID0gbmV3IFRocmVhZFtudW1iZXJPZlRocmVhZHNdOworICAgICAgICBmaW5hbCBDeWNsaWNCYXJyaWVyIGdhdGUgPSBuZXcgQ3ljbGljQmFycmllcihudW1iZXJPZlRocmVhZHMgKyAxKTsKKyAgICAgICAgU3RyaW5nW10gZXhwZWN0cyA9IHsKKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiwKKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIiwKKyAgICAgICAgICAgICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80IgorICAgICAgICB9OworCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZUaHJlYWRzOyBpKyspIHsKKyAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwYWNrYWdlTmFtZSA9IGV4cGVjdHNbaV07CisgICAgICAgICAgICB0aHJlYWRzW2ldID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IFRocmVhZCgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdhdGUuYXdhaXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEwOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFPYmplY3RzLmVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlVGFibGUuZ2V0KHBhY2thZ2VOYW1lKS5nZXRQYWNrYWdlTmFtZSgpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIHRocmVhZHNbaV0uc3RhcnQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGdhdGUuYXdhaXQoKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bWJlck9mVGhyZWFkczsgaSsrKSB7CisgICAgICAgICAgICB0aHJlYWRzW2ldLmpvaW4oKTsKKyAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9TdG9yYWdlRmlsZVByb3ZpZGVyVGVzdC5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL1N0b3JhZ2VGaWxlUHJvdmlkZXJUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI3MjBmOQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9TdG9yYWdlRmlsZVByb3ZpZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworCitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmxhZ1RhYmxlOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdWYWx1ZUxpc3Q7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuUGFja2FnZVRhYmxlOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlN0b3JhZ2VGaWxlUHJvdmlkZXI7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OworCitpbXBvcnQgamF2YS5uaW8uZmlsZS5QYXRoczsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKKworQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIFN0b3JhZ2VGaWxlUHJvdmlkZXJUZXN0IHsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdGxpc3RDb250YWluZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIFN0b3JhZ2VGaWxlUHJvdmlkZXIgcCA9CisgICAgICAgICAgICAgICAgbmV3IFN0b3JhZ2VGaWxlUHJvdmlkZXIoVGVzdERhdGFVdGlscy5URVNUREFUQV9QQVRILCBUZXN0RGF0YVV0aWxzLlRFU1REQVRBX1BBVEgpOworICAgICAgICBTdHJpbmdbXSBleGNsdWRlcyA9IHt9OworICAgICAgICBMaXN0PFN0cmluZz4gY29udGFpbmVycyA9IHAubGlzdENvbnRhaW5lcnMoZXhjbHVkZXMpOworICAgICAgICBhc3NlcnRFcXVhbHMoMiwgY29udGFpbmVycy5zaXplKCkpOworCisgICAgICAgIGV4Y2x1ZGVzID0gbmV3IFN0cmluZ1tdIHsibW9jay52MSJ9OworICAgICAgICBjb250YWluZXJzID0gcC5saXN0Q29udGFpbmVycyhleGNsdWRlcyk7CisgICAgICAgIGFzc2VydEVxdWFscygxLCBjb250YWluZXJzLnNpemUoKSk7CisKKyAgICAgICAgcCA9IG5ldyBTdG9yYWdlRmlsZVByb3ZpZGVyKCJmYWtlL3BhdGgvIiwgImZha2UvcGF0aC8iKTsKKyAgICAgICAgY29udGFpbmVycyA9IHAubGlzdENvbnRhaW5lcnMoZXhjbHVkZXMpOworICAgICAgICBhc3NlcnRUcnVlKGNvbnRhaW5lcnMuaXNFbXB0eSgpKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RMb2FkRmlsZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgU3RvcmFnZUZpbGVQcm92aWRlciBwID0KKyAgICAgICAgICAgICAgICBuZXcgU3RvcmFnZUZpbGVQcm92aWRlcihUZXN0RGF0YVV0aWxzLlRFU1REQVRBX1BBVEgsIFRlc3REYXRhVXRpbHMuVEVTVERBVEFfUEFUSCk7CisgICAgICAgIFBhY2thZ2VUYWJsZSBwdCA9IHAuZ2V0UGFja2FnZVRhYmxlKCJtb2NrLnYxIik7CisgICAgICAgIGFzc2VydE5vdE51bGwocHQpOworICAgICAgICBGbGFnVGFibGUgZiA9IHAuZ2V0RmxhZ1RhYmxlKCJtb2NrLnYxIik7CisgICAgICAgIGFzc2VydE5vdE51bGwoZik7CisgICAgICAgIEZsYWdWYWx1ZUxpc3QgdiA9IHAuZ2V0RmxhZ1ZhbHVlTGlzdCgibW9jay52MSIpOworICAgICAgICBhc3NlcnROb3ROdWxsKHYpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9UZXN0RGF0YVV0aWxzLmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9maWxlL3Rlc3RzL3NyY3MvVGVzdERhdGFVdGlscy5qYXZhCmluZGV4IGYzNTk1MmQuLjM4ODk3MWUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3Jjcy9UZXN0RGF0YVV0aWxzLmphdmEKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zcmNzL1Rlc3REYXRhVXRpbHMuamF2YQpAQCAtMjEsMjggKzIxLDI3IEBACiBpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKIAogcHVibGljIGZpbmFsIGNsYXNzIFRlc3REYXRhVXRpbHMgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX1BBQ0tBR0VfTUFQX1BBVEggPSAicGFja2FnZS5tYXAiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0ZMQUdfTUFQX1BBVEggPSAiZmxhZy5tYXAiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0ZMQUdfVkFMX1BBVEggPSAiZmxhZy52YWwiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0ZMQUdfSU5GT19QQVRIID0gImZsYWcuaW5mbyI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfUEFDS0FHRV9NQVBfUEFUSCA9ICJtb2NrLnYlZC5wYWNrYWdlLm1hcCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfRkxBR19NQVBfUEFUSCA9ICJtb2NrLnYlZC5mbGFnLm1hcCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1RfRkxBR19WQUxfUEFUSCA9ICJtb2NrLnYlZC52YWwiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUX0ZMQUdfSU5GT19QQVRIID0gIm1vY2sudiVkLmluZm8iOwogCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRFU1REQVRBX1BBVEggPQotICAgICAgICAgICAgIi9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX3N0b3JhZ2VfZmlsZV90ZXN0X2phdmEvdGVzdGRhdGEvIjsKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBURVNUREFUQV9QQVRIID0gIi9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX3N0b3JhZ2VfZmlsZV90ZXN0X2phdmEvdGVzdGRhdGEvIjsKIAotICAgIHB1YmxpYyBzdGF0aWMgQnl0ZUJ1ZmZlciBnZXRUZXN0UGFja2FnZU1hcEJ5dGVCdWZmZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIHJlYWRGaWxlKFRFU1REQVRBX1BBVEggKyBURVNUX1BBQ0tBR0VfTUFQX1BBVEgpOworICAgIHB1YmxpYyBzdGF0aWMgQnl0ZUJ1ZmZlciBnZXRUZXN0UGFja2FnZU1hcEJ5dGVCdWZmZXIoaW50IHZlcnNpb24pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcmVhZEZpbGUoVEVTVERBVEFfUEFUSCArIFN0cmluZy5mb3JtYXQoVEVTVF9QQUNLQUdFX01BUF9QQVRILCB2ZXJzaW9uKSk7CiAgICAgfQogCi0gICAgcHVibGljIHN0YXRpYyBCeXRlQnVmZmVyIGdldFRlc3RGbGFnTWFwQnl0ZUJ1ZmZlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gcmVhZEZpbGUoVEVTVERBVEFfUEFUSCArIFRFU1RfRkxBR19NQVBfUEFUSCk7CisgICAgcHVibGljIHN0YXRpYyBCeXRlQnVmZmVyIGdldFRlc3RGbGFnTWFwQnl0ZUJ1ZmZlcihpbnQgdmVyc2lvbikgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIHJldHVybiByZWFkRmlsZShURVNUREFUQV9QQVRIICsgU3RyaW5nLmZvcm1hdChURVNUX0ZMQUdfTUFQX1BBVEgsIHZlcnNpb24pKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIEJ5dGVCdWZmZXIgZ2V0VGVzdEZsYWdWYWxCeXRlQnVmZmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiByZWFkRmlsZShURVNUREFUQV9QQVRIICsgVEVTVF9GTEFHX1ZBTF9QQVRIKTsKKyAgICBwdWJsaWMgc3RhdGljIEJ5dGVCdWZmZXIgZ2V0VGVzdEZsYWdWYWxCeXRlQnVmZmVyKGludCB2ZXJzaW9uKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgcmV0dXJuIHJlYWRGaWxlKFRFU1REQVRBX1BBVEggKyBTdHJpbmcuZm9ybWF0KFRFU1RfRkxBR19WQUxfUEFUSCwgdmVyc2lvbikpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgQnl0ZUJ1ZmZlciBnZXRUZXN0RmxhZ0luZm9CeXRlQnVmZmVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiByZWFkRmlsZShURVNUREFUQV9QQVRIICsgVEVTVF9GTEFHX0lORk9fUEFUSCk7CisgICAgcHVibGljIHN0YXRpYyBCeXRlQnVmZmVyIGdldFRlc3RGbGFnSW5mb0J5dGVCdWZmZXIoaW50IHZlcnNpb24pIHRocm93cyBFeGNlcHRpb24geworICAgICAgICByZXR1cm4gcmVhZEZpbGUoVEVTVERBVEFfUEFUSCArIFN0cmluZy5mb3JtYXQoVEVTVF9GTEFHX0lORk9fUEFUSCwgdmVyc2lvbikpOwogICAgIH0KIAogICAgIHByaXZhdGUgc3RhdGljIEJ5dGVCdWZmZXIgcmVhZEZpbGUoU3RyaW5nIGZpbGVOYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX2ZpbGUvdGVzdHMvc3RvcmFnZV9maWxlX3Rlc3QuY3BwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zdG9yYWdlX2ZpbGVfdGVzdC5jcHAKaW5kZXggZWJkMWRkOC4uNWMwMDhhZiAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zdG9yYWdlX2ZpbGVfdGVzdC5jcHAKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfZmlsZS90ZXN0cy9zdG9yYWdlX2ZpbGVfdGVzdC5jcHAKQEAgLTI0LDEwICsyNCw4IEBACiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YmFzZTsKIHVzaW5nIG5hbWVzcGFjZSBhY29uZmlnX3N0b3JhZ2U7CiAKLXZvaWQgdmVyaWZ5X3ZhbHVlKGNvbnN0IEZsYWdWYWx1ZVN1bW1hcnkmIGZsYWcsCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGFja2FnZV9uYW1lLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGZsYWdfbmFtZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbGFnX3ZhbCwKK3ZvaWQgdmVyaWZ5X3ZhbHVlKGNvbnN0IEZsYWdWYWx1ZVN1bW1hcnkmIGZsYWcsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYWNrYWdlX25hbWUsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZmxhZ19uYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgZmxhZ192YWwsCiAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWVfdHlwZSkgewogICBBU1NFUlRfRVEoZmxhZy5wYWNrYWdlX25hbWUsIHBhY2thZ2VfbmFtZSk7CiAgIEFTU0VSVF9FUShmbGFnLmZsYWdfbmFtZSwgZmxhZ19uYW1lKTsKQEAgLTM5LDEwICszNyw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYWNrYWdlX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbGFnX25hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBmbGFnX3ZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVhZHdyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19zZXJ2ZXJfb3ZlcnJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX2xvY2FsX292ZXJyaWRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZV90eXBlLCBib29sIGlzX3JlYWR3cml0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBoYXNfc2VydmVyX292ZXJyaWRlLCBib29sIGhhc19sb2NhbF9vdmVycmlkZSkgewogICBBU1NFUlRfRVEoZmxhZy5wYWNrYWdlX25hbWUsIHBhY2thZ2VfbmFtZSk7CiAgIEFTU0VSVF9FUShmbGFnLmZsYWdfbmFtZSwgZmxhZ19uYW1lKTsKICAgQVNTRVJUX0VRKGZsYWcuZmxhZ192YWx1ZSwgZmxhZ192YWwpOwpAQCAtNTIsNjEgKzQ4LDEzNyBAQAogICBBU1NFUlRfRVEoZmxhZy5oYXNfbG9jYWxfb3ZlcnJpZGUsIGhhc19sb2NhbF9vdmVycmlkZSk7CiB9CiAKK1Jlc3VsdDxzdGQ6OnZlY3RvcjxGbGFnVmFsdWVTdW1tYXJ5Pj4gZ2V0X2ZsYWdfbGlzdF9yZXN1bHQoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgdmVyc2lvbikgeworICBhdXRvIGNvbnN0IHRlc3RfYmFzZV9kaXIgPSBHZXRFeGVjdXRhYmxlRGlyZWN0b3J5KCk7CisgIGF1dG8gY29uc3QgdGVzdF9kaXIgPSB0ZXN0X2Jhc2VfZGlyICsgIi9kYXRhL3YiICsgdmVyc2lvbjsKKyAgYXV0byBjb25zdCBwYWNrYWdlX21hcCA9IHRlc3RfZGlyICsgIi9wYWNrYWdlX3YiICsgdmVyc2lvbiArICIubWFwIjsKKyAgYXV0byBjb25zdCBmbGFnX21hcCA9IHRlc3RfZGlyICsgIi9mbGFnX3YiICsgdmVyc2lvbiArICIubWFwIjsKKyAgYXV0byBjb25zdCBmbGFnX3ZhbCA9IHRlc3RfZGlyICsgIi9mbGFnX3YiICsgdmVyc2lvbiArICIudmFsIjsKKyAgcmV0dXJuIGFjb25maWdfc3RvcmFnZTo6bGlzdF9mbGFncyhwYWNrYWdlX21hcCwgZmxhZ19tYXAsIGZsYWdfdmFsKTsKK30KKworUmVzdWx0PHN0ZDo6dmVjdG9yPEZsYWdWYWx1ZUFuZEluZm9TdW1tYXJ5Pj4gZ2V0X2ZsYWdfbGlzdF9yZXN1bHRfd2l0aF9pbmZvKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHZlcnNpb24pIHsKKyAgYXV0byBjb25zdCB0ZXN0X2Jhc2VfZGlyID0gR2V0RXhlY3V0YWJsZURpcmVjdG9yeSgpOworICBhdXRvIGNvbnN0IHRlc3RfZGlyID0gdGVzdF9iYXNlX2RpciArICIvZGF0YS92IiArIHZlcnNpb247CisgIGF1dG8gY29uc3QgcGFja2FnZV9tYXAgPSB0ZXN0X2RpciArICIvcGFja2FnZV92IiArIHZlcnNpb24gKyAiLm1hcCI7CisgIGF1dG8gY29uc3QgZmxhZ19tYXAgPSB0ZXN0X2RpciArICIvZmxhZ192IiArIHZlcnNpb24gKyAiLm1hcCI7CisgIGF1dG8gY29uc3QgZmxhZ192YWwgPSB0ZXN0X2RpciArICIvZmxhZ192IiArIHZlcnNpb24gKyAiLnZhbCI7CisgIGF1dG8gY29uc3QgZmxhZ19pbmZvID0gdGVzdF9kaXIgKyAiL2ZsYWdfdiIgKyB2ZXJzaW9uICsgIi5pbmZvIjsKKyAgcmV0dXJuIGFjb25maWdfc3RvcmFnZTo6bGlzdF9mbGFnc193aXRoX2luZm8ocGFja2FnZV9tYXAsIGZsYWdfbWFwLCBmbGFnX3ZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ19pbmZvKTsKK30KKwogVEVTVChBY29uZmlnU3RvcmFnZUZpbGVUZXN0LCB0ZXN0X2xpc3RfZmxhZykgewotICBhdXRvIGNvbnN0IHRlc3RfZGlyID0gR2V0RXhlY3V0YWJsZURpcmVjdG9yeSgpOwotICBhdXRvIGNvbnN0IHBhY2thZ2VfbWFwID0gdGVzdF9kaXIgKyAiL3BhY2thZ2UubWFwIjsKLSAgYXV0byBjb25zdCBmbGFnX21hcCA9IHRlc3RfZGlyICsgIi9mbGFnLm1hcCI7Ci0gIGF1dG8gY29uc3QgZmxhZ192YWwgPSB0ZXN0X2RpciArICIvZmxhZy52YWwiOwotICBhdXRvIGZsYWdfbGlzdF9yZXN1bHQgPSBhY29uZmlnX3N0b3JhZ2U6Omxpc3RfZmxhZ3MoCi0gICAgICBwYWNrYWdlX21hcCwgZmxhZ19tYXAsIGZsYWdfdmFsKTsKKyAgYXV0byBmbGFnX2xpc3RfcmVzdWx0ID0gZ2V0X2ZsYWdfbGlzdF9yZXN1bHQoIjEiKTsKICAgQVNTRVJUX1RSVUUoZmxhZ19saXN0X3Jlc3VsdC5vaygpKTsKIAogICBhdXRvIGNvbnN0JiBmbGFnX2xpc3QgPSAqZmxhZ19saXN0X3Jlc3VsdDsKICAgQVNTRVJUX0VRKGZsYWdfbGlzdC5zaXplKCksIDgpOwotICB2ZXJpZnlfdmFsdWUoZmxhZ19saXN0WzBdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIsICJkaXNhYmxlZF9ydyIsCi0gICAgICAgICAgICAgICAiZmFsc2UiLCAiUmVhZFdyaXRlQm9vbGVhbiIpOworICB2ZXJpZnlfdmFsdWUoZmxhZ19saXN0WzBdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIsCisgICAgICAgICAgICAgICAiZGlzYWJsZWRfcnciLCAiZmFsc2UiLCAiUmVhZFdyaXRlQm9vbGVhbiIpOwogICB2ZXJpZnlfdmFsdWUoZmxhZ19saXN0WzFdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIsICJlbmFibGVkX3JvIiwKICAgICAgICAgICAgICAgICJ0cnVlIiwgIlJlYWRPbmx5Qm9vbGVhbiIpOwogICB2ZXJpZnlfdmFsdWUoZmxhZ19saXN0WzJdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIsICJlbmFibGVkX3J3IiwKICAgICAgICAgICAgICAgICJ0cnVlIiwgIlJlYWRXcml0ZUJvb2xlYW4iKTsKLSAgdmVyaWZ5X3ZhbHVlKGZsYWdfbGlzdFszXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiLCAiZGlzYWJsZWRfcnciLAotICAgICAgICAgICAgICAgImZhbHNlIiwgIlJlYWRXcml0ZUJvb2xlYW4iKTsKLSAgdmVyaWZ5X3ZhbHVlKGZsYWdfbGlzdFs0XSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiLCAiZW5hYmxlZF9maXhlZF9ybyIsCi0gICAgICAgICAgICAgICAidHJ1ZSIsICJGaXhlZFJlYWRPbmx5Qm9vbGVhbiIpOworICB2ZXJpZnlfdmFsdWUoZmxhZ19saXN0WzNdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIsCisgICAgICAgICAgICAgICAiZGlzYWJsZWRfcnciLCAiZmFsc2UiLCAiUmVhZFdyaXRlQm9vbGVhbiIpOworICB2ZXJpZnlfdmFsdWUoZmxhZ19saXN0WzRdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIsCisgICAgICAgICAgICAgICAiZW5hYmxlZF9maXhlZF9ybyIsICJ0cnVlIiwgIkZpeGVkUmVhZE9ubHlCb29sZWFuIik7CiAgIHZlcmlmeV92YWx1ZShmbGFnX2xpc3RbNV0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIiwgImVuYWJsZWRfcm8iLAogICAgICAgICAgICAgICAgInRydWUiLCAiUmVhZE9ubHlCb29sZWFuIik7Ci0gIHZlcmlmeV92YWx1ZShmbGFnX2xpc3RbNl0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80IiwgImVuYWJsZWRfZml4ZWRfcm8iLAotICAgICAgICAgICAgICAgInRydWUiLCAiRml4ZWRSZWFkT25seUJvb2xlYW4iKTsKKyAgdmVyaWZ5X3ZhbHVlKGZsYWdfbGlzdFs2XSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiLAorICAgICAgICAgICAgICAgImVuYWJsZWRfZml4ZWRfcm8iLCAidHJ1ZSIsICJGaXhlZFJlYWRPbmx5Qm9vbGVhbiIpOworICB2ZXJpZnlfdmFsdWUoZmxhZ19saXN0WzddLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIsICJlbmFibGVkX3J3IiwKKyAgICAgICAgICAgICAgICJ0cnVlIiwgIlJlYWRXcml0ZUJvb2xlYW4iKTsKK30KKworLy8gVE9ETzogYi8zNzYyNTY0NzIgLSBVc2UgcGFyYW1ldGVyaXplZCB0ZXN0cy4KK1RFU1QoQWNvbmZpZ1N0b3JhZ2VGaWxlVGVzdCwgdGVzdF9saXN0X2ZsYWdfdjIpIHsKKyAgYXV0byBmbGFnX2xpc3RfcmVzdWx0ID0gZ2V0X2ZsYWdfbGlzdF9yZXN1bHQoIjIiKTsKKyAgQVNTRVJUX1RSVUUoZmxhZ19saXN0X3Jlc3VsdC5vaygpKTsKKworICBhdXRvIGNvbnN0JiBmbGFnX2xpc3QgPSAqZmxhZ19saXN0X3Jlc3VsdDsKKyAgQVNTRVJUX0VRKGZsYWdfbGlzdC5zaXplKCksIDgpOworICB2ZXJpZnlfdmFsdWUoZmxhZ19saXN0WzBdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIsCisgICAgICAgICAgICAgICAiZGlzYWJsZWRfcnciLCAiZmFsc2UiLCAiUmVhZFdyaXRlQm9vbGVhbiIpOworICB2ZXJpZnlfdmFsdWUoZmxhZ19saXN0WzFdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIsICJlbmFibGVkX3JvIiwKKyAgICAgICAgICAgICAgICJ0cnVlIiwgIlJlYWRPbmx5Qm9vbGVhbiIpOworICB2ZXJpZnlfdmFsdWUoZmxhZ19saXN0WzJdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIsICJlbmFibGVkX3J3IiwKKyAgICAgICAgICAgICAgICJ0cnVlIiwgIlJlYWRXcml0ZUJvb2xlYW4iKTsKKyAgdmVyaWZ5X3ZhbHVlKGZsYWdfbGlzdFszXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiLAorICAgICAgICAgICAgICAgImRpc2FibGVkX3J3IiwgImZhbHNlIiwgIlJlYWRXcml0ZUJvb2xlYW4iKTsKKyAgdmVyaWZ5X3ZhbHVlKGZsYWdfbGlzdFs0XSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiLAorICAgICAgICAgICAgICAgImVuYWJsZWRfZml4ZWRfcm8iLCAidHJ1ZSIsICJGaXhlZFJlYWRPbmx5Qm9vbGVhbiIpOworICB2ZXJpZnlfdmFsdWUoZmxhZ19saXN0WzVdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIsICJlbmFibGVkX3JvIiwKKyAgICAgICAgICAgICAgICJ0cnVlIiwgIlJlYWRPbmx5Qm9vbGVhbiIpOworICB2ZXJpZnlfdmFsdWUoZmxhZ19saXN0WzZdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIsCisgICAgICAgICAgICAgICAiZW5hYmxlZF9maXhlZF9ybyIsICJ0cnVlIiwgIkZpeGVkUmVhZE9ubHlCb29sZWFuIik7CiAgIHZlcmlmeV92YWx1ZShmbGFnX2xpc3RbN10sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80IiwgImVuYWJsZWRfcnciLAogICAgICAgICAgICAgICAgInRydWUiLCAiUmVhZFdyaXRlQm9vbGVhbiIpOwogfQogCiBURVNUKEFjb25maWdTdG9yYWdlRmlsZVRlc3QsIHRlc3RfbGlzdF9mbGFnX3dpdGhfaW5mbykgewotICBhdXRvIGNvbnN0IHRlc3RfZGlyID0gR2V0RXhlY3V0YWJsZURpcmVjdG9yeSgpOwotICBhdXRvIGNvbnN0IHBhY2thZ2VfbWFwID0gdGVzdF9kaXIgKyAiL3BhY2thZ2UubWFwIjsKLSAgYXV0byBjb25zdCBmbGFnX21hcCA9IHRlc3RfZGlyICsgIi9mbGFnLm1hcCI7Ci0gIGF1dG8gY29uc3QgZmxhZ192YWwgPSB0ZXN0X2RpciArICIvZmxhZy52YWwiOwotICBhdXRvIGNvbnN0IGZsYWdfaW5mbyA9IHRlc3RfZGlyICsgIi9mbGFnLmluZm8iOwotICBhdXRvIGZsYWdfbGlzdF9yZXN1bHQgPSBhY29uZmlnX3N0b3JhZ2U6Omxpc3RfZmxhZ3Nfd2l0aF9pbmZvKAotICAgICAgcGFja2FnZV9tYXAsIGZsYWdfbWFwLCBmbGFnX3ZhbCwgZmxhZ19pbmZvKTsKKyAgYXV0byBmbGFnX2xpc3RfcmVzdWx0ID0gZ2V0X2ZsYWdfbGlzdF9yZXN1bHRfd2l0aF9pbmZvKCIxIik7CiAgIEFTU0VSVF9UUlVFKGZsYWdfbGlzdF9yZXN1bHQub2soKSk7CiAKICAgYXV0byBjb25zdCYgZmxhZ19saXN0ID0gKmZsYWdfbGlzdF9yZXN1bHQ7CiAgIEFTU0VSVF9FUShmbGFnX2xpc3Quc2l6ZSgpLCA4KTsKLSAgdmVyaWZ5X3ZhbHVlX2luZm8oZmxhZ19saXN0WzBdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIsICJkaXNhYmxlZF9ydyIsCi0gICAgICAgICAgICAgICAgICAgICJmYWxzZSIsICJSZWFkV3JpdGVCb29sZWFuIiwgdHJ1ZSwgZmFsc2UsIGZhbHNlKTsKLSAgdmVyaWZ5X3ZhbHVlX2luZm8oZmxhZ19saXN0WzFdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIsICJlbmFibGVkX3JvIiwKLSAgICAgICAgICAgICAgICAgICAgInRydWUiLCAiUmVhZE9ubHlCb29sZWFuIiwgZmFsc2UsIGZhbHNlLCBmYWxzZSk7Ci0gIHZlcmlmeV92YWx1ZV9pbmZvKGZsYWdfbGlzdFsyXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiLCAiZW5hYmxlZF9ydyIsCi0gICAgICAgICAgICAgICAgICAgICJ0cnVlIiwgIlJlYWRXcml0ZUJvb2xlYW4iLCB0cnVlLCBmYWxzZSwgZmFsc2UpOwotICB2ZXJpZnlfdmFsdWVfaW5mbyhmbGFnX2xpc3RbM10sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIiwgImRpc2FibGVkX3J3IiwKLSAgICAgICAgICAgICAgICAgICAgImZhbHNlIiwgIlJlYWRXcml0ZUJvb2xlYW4iLCB0cnVlLCBmYWxzZSwgZmFsc2UpOwotICB2ZXJpZnlfdmFsdWVfaW5mbyhmbGFnX2xpc3RbNF0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIiwgImVuYWJsZWRfZml4ZWRfcm8iLAotICAgICAgICAgICAgICAgICAgICAidHJ1ZSIsICJGaXhlZFJlYWRPbmx5Qm9vbGVhbiIsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOwotICB2ZXJpZnlfdmFsdWVfaW5mbyhmbGFnX2xpc3RbNV0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIiwgImVuYWJsZWRfcm8iLAotICAgICAgICAgICAgICAgICAgICAidHJ1ZSIsICJSZWFkT25seUJvb2xlYW4iLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgdmVyaWZ5X3ZhbHVlX2luZm8oZmxhZ19saXN0WzZdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIsICJlbmFibGVkX2ZpeGVkX3JvIiwKLSAgICAgICAgICAgICAgICAgICAgInRydWUiLCAiRml4ZWRSZWFkT25seUJvb2xlYW4iLCBmYWxzZSwgZmFsc2UsIGZhbHNlKTsKLSAgdmVyaWZ5X3ZhbHVlX2luZm8oZmxhZ19saXN0WzddLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfNCIsICJlbmFibGVkX3J3IiwKLSAgICAgICAgICAgICAgICAgICAgInRydWUiLCAiUmVhZFdyaXRlQm9vbGVhbiIsIHRydWUsIGZhbHNlLCBmYWxzZSk7CisgIHZlcmlmeV92YWx1ZV9pbmZvKGZsYWdfbGlzdFswXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiLAorICAgICAgICAgICAgICAgICAgICAiZGlzYWJsZWRfcnciLCAiZmFsc2UiLCAiUmVhZFdyaXRlQm9vbGVhbiIsIHRydWUsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgIHZlcmlmeV92YWx1ZV9pbmZvKGZsYWdfbGlzdFsxXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiLAorICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZF9ybyIsICJ0cnVlIiwgIlJlYWRPbmx5Qm9vbGVhbiIsIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICB2ZXJpZnlfdmFsdWVfaW5mbyhmbGFnX2xpc3RbMl0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiwKKyAgICAgICAgICAgICAgICAgICAgImVuYWJsZWRfcnciLCAidHJ1ZSIsICJSZWFkV3JpdGVCb29sZWFuIiwgdHJ1ZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgdmVyaWZ5X3ZhbHVlX2luZm8oZmxhZ19saXN0WzNdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIsCisgICAgICAgICAgICAgICAgICAgICJkaXNhYmxlZF9ydyIsICJmYWxzZSIsICJSZWFkV3JpdGVCb29sZWFuIiwgdHJ1ZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgdmVyaWZ5X3ZhbHVlX2luZm8oZmxhZ19saXN0WzRdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIsCisgICAgICAgICAgICAgICAgICAgICJlbmFibGVkX2ZpeGVkX3JvIiwgInRydWUiLCAiRml4ZWRSZWFkT25seUJvb2xlYW4iLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UsIGZhbHNlKTsKKyAgdmVyaWZ5X3ZhbHVlX2luZm8oZmxhZ19saXN0WzVdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMiIsCisgICAgICAgICAgICAgICAgICAgICJlbmFibGVkX3JvIiwgInRydWUiLCAiUmVhZE9ubHlCb29sZWFuIiwgZmFsc2UsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgIHZlcmlmeV92YWx1ZV9pbmZvKGZsYWdfbGlzdFs2XSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiLAorICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZF9maXhlZF9ybyIsICJ0cnVlIiwgIkZpeGVkUmVhZE9ubHlCb29sZWFuIiwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSk7CisgIHZlcmlmeV92YWx1ZV9pbmZvKGZsYWdfbGlzdFs3XSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiLAorICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZF9ydyIsICJ0cnVlIiwgIlJlYWRXcml0ZUJvb2xlYW4iLCB0cnVlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworfQorCitURVNUKEFjb25maWdTdG9yYWdlRmlsZVRlc3QsIHRlc3RfbGlzdF9mbGFnX3dpdGhfaW5mb192MikgeworICBhdXRvIGZsYWdfbGlzdF9yZXN1bHQgPSBnZXRfZmxhZ19saXN0X3Jlc3VsdF93aXRoX2luZm8oIjIiKTsKKyAgQVNTRVJUX1RSVUUoZmxhZ19saXN0X3Jlc3VsdC5vaygpKTsKKworICBhdXRvIGNvbnN0JiBmbGFnX2xpc3QgPSAqZmxhZ19saXN0X3Jlc3VsdDsKKyAgQVNTRVJUX0VRKGZsYWdfbGlzdC5zaXplKCksIDgpOworICB2ZXJpZnlfdmFsdWVfaW5mbyhmbGFnX2xpc3RbMF0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiwKKyAgICAgICAgICAgICAgICAgICAgImRpc2FibGVkX3J3IiwgImZhbHNlIiwgIlJlYWRXcml0ZUJvb2xlYW4iLCB0cnVlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICB2ZXJpZnlfdmFsdWVfaW5mbyhmbGFnX2xpc3RbMV0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIiwKKyAgICAgICAgICAgICAgICAgICAgImVuYWJsZWRfcm8iLCAidHJ1ZSIsICJSZWFkT25seUJvb2xlYW4iLCBmYWxzZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgdmVyaWZ5X3ZhbHVlX2luZm8oZmxhZ19saXN0WzJdLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIsCisgICAgICAgICAgICAgICAgICAgICJlbmFibGVkX3J3IiwgInRydWUiLCAiUmVhZFdyaXRlQm9vbGVhbiIsIHRydWUsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgIHZlcmlmeV92YWx1ZV9pbmZvKGZsYWdfbGlzdFszXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiLAorICAgICAgICAgICAgICAgICAgICAiZGlzYWJsZWRfcnciLCAiZmFsc2UiLCAiUmVhZFdyaXRlQm9vbGVhbiIsIHRydWUsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgIHZlcmlmeV92YWx1ZV9pbmZvKGZsYWdfbGlzdFs0XSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiLAorICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZF9maXhlZF9ybyIsICJ0cnVlIiwgIkZpeGVkUmVhZE9ubHlCb29sZWFuIiwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBmYWxzZSk7CisgIHZlcmlmeV92YWx1ZV9pbmZvKGZsYWdfbGlzdFs1XSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiLAorICAgICAgICAgICAgICAgICAgICAiZW5hYmxlZF9ybyIsICJ0cnVlIiwgIlJlYWRPbmx5Qm9vbGVhbiIsIGZhbHNlLCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICB2ZXJpZnlfdmFsdWVfaW5mbyhmbGFnX2xpc3RbNl0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80IiwKKyAgICAgICAgICAgICAgICAgICAgImVuYWJsZWRfZml4ZWRfcm8iLCAidHJ1ZSIsICJGaXhlZFJlYWRPbmx5Qm9vbGVhbiIsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICBmYWxzZSwgZmFsc2UpOworICB2ZXJpZnlfdmFsdWVfaW5mbyhmbGFnX2xpc3RbN10sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80IiwKKyAgICAgICAgICAgICAgICAgICAgImVuYWJsZWRfcnciLCAidHJ1ZSIsICJSZWFkV3JpdGVCb29sZWFuIiwgdHJ1ZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL0FuZHJvaWQuYnAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9BbmRyb2lkLmJwCmluZGV4IGY5NmIyMjMuLjE2MzQxYjkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL0FuZHJvaWQuYnAKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvQW5kcm9pZC5icApAQCAtMzYsMTAgKzM2LDEwIEBACiAgICAgICAgICJsaWJyYW5kIiwKICAgICBdLAogICAgIGRhdGE6IFsKLSAgICAgICAgInRlc3RzL3BhY2thZ2UubWFwIiwKLSAgICAgICAgInRlc3RzL2ZsYWcubWFwIiwKLSAgICAgICAgInRlc3RzL2ZsYWcudmFsIiwKLSAgICAgICAgInRlc3RzL2ZsYWcuaW5mbyIsCisgICAgICAgICJ0ZXN0cy9kYXRhL3YxL3BhY2thZ2VfdjEubWFwIiwKKyAgICAgICAgInRlc3RzL2RhdGEvdjEvZmxhZ192MS5tYXAiLAorICAgICAgICAidGVzdHMvZGF0YS92MS9mbGFnX3YxLnZhbCIsCisgICAgICAgICJ0ZXN0cy9kYXRhL3YxL2ZsYWdfdjEuaW5mbyIsCiAgICAgXSwKIH0KIApAQCAtMTA3LDMxICsxMDcsMTIgQEAKICAgICBhZmRvOiB0cnVlLAogfQogCi1zb29uZ19jb25maWdfbW9kdWxlX3R5cGUgewotICAgIG5hbWU6ICJhY29uZmlnX2xpYl9jY19zaGFyZWRfbGlua19kZWZhdWx0cyIsCi0gICAgbW9kdWxlX3R5cGU6ICJjY19kZWZhdWx0cyIsCi0gICAgY29uZmlnX25hbWVzcGFjZTogIkFjb25maWciLAotICAgIGJvb2xfdmFyaWFibGVzOiBbCi0gICAgICAgICJyZWFkX2Zyb21fbmV3X3N0b3JhZ2UiLAotICAgIF0sCi0gICAgcHJvcGVydGllczogWwotICAgICAgICAic2hhcmVkX2xpYnMiLAotICAgIF0sCi19Ci0KLXNvb25nX2NvbmZpZ19ib29sX3ZhcmlhYmxlIHsKLSAgICBuYW1lOiAicmVhZF9mcm9tX25ld19zdG9yYWdlIiwKLX0KLQotYWNvbmZpZ19saWJfY2Nfc2hhcmVkX2xpbmtfZGVmYXVsdHMgeworY2NfZGVmYXVsdHMgewogICAgIG5hbWU6ICJhY29uZmlnX2xpYl9jY19zaGFyZWRfbGluay5kZWZhdWx0cyIsCi0gICAgc29vbmdfY29uZmlnX3ZhcmlhYmxlczogewotICAgICAgICByZWFkX2Zyb21fbmV3X3N0b3JhZ2U6IHsKLSAgICAgICAgICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICAgICAgICAgImxpYmFjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9jYyIsCi0gICAgICAgICAgICBdLAotICAgICAgICB9LAotICAgIH0sCisgICAgc2hhcmVkX2xpYnM6IHNlbGVjdChyZWxlYXNlX2ZsYWcoIlJFTEVBU0VfUkVBRF9GUk9NX05FV19TVE9SQUdFIiksIHsKKyAgICAgICAgdHJ1ZTogWyJsaWJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGlfY2MiXSwKKyAgICAgICAgZGVmYXVsdDogW10sCisgICAgfSksCiB9CiAKIGNjX2RlZmF1bHRzIHsKQEAgLTE3MywzNyArMTU0LDE3IEBACiBqYXZhX2xpYnJhcnkgewogICAgIG5hbWU6ICJhY29uZmlnX3N0b3JhZ2VfcmVhZGVyX2phdmEiLAogICAgIHNyY3M6IFsKLSAgICAgICAgInNyY3MvYW5kcm9pZC9hY29uZmlnL3N0b3JhZ2UvU3RvcmFnZUludGVybmFsUmVhZGVyLmphdmEiLAorICAgICAgICAic3Jjcy9hbmRyb2lkL29zL2ZsYWdnaW5nLyouamF2YSIsCiAgICAgXSwKICAgICBsaWJzOiBbCiAgICAgICAgICJ1bnN1cHBvcnRlZGFwcHVzYWdlIiwKLSAgICAgICAgInN0cmljdF9tb2RlX3N0dWIiLAogICAgIF0sCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImFjb25maWdfc3RvcmFnZV9maWxlX2phdmEiLAogICAgIF0sCi0gICAgc2RrX3ZlcnNpb246ICJjb3JlX2N1cnJlbnQiLAotICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAotICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKLSAgICBhcGV4X2F2YWlsYWJsZTogWwotICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCi0gICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOmFueWFwZXgiLAorICAgIHNka192ZXJzaW9uOiAiY3VycmVudCIsCisgICAgdmlzaWJpbGl0eTogWworICAgICAgICAiLy9mcmFtZXdvcmtzL2Jhc2UiLAorICAgICAgICAiLy9idWlsZC9tYWtlL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzIiwKICAgICBdLAogfQotCi1qYXZhX2xpYnJhcnkgewotICAgIG5hbWU6ICJhY29uZmlnX3N0b3JhZ2VfcmVhZGVyX2phdmFfbm9uZSIsCi0gICAgc3JjczogWwotICAgICAgICAic3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9TdG9yYWdlSW50ZXJuYWxSZWFkZXIuamF2YSIsCi0gICAgXSwKLSAgICBsaWJzOiBbCi0gICAgICAgICJ1bnN1cHBvcnRlZGFwcHVzYWdlLXNkay1ub25lIiwKLSAgICAgICAgImZha2VfZGV2aWNlX2NvbmZpZyIsCi0gICAgXSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAiYWNvbmZpZ19zdG9yYWdlX2ZpbGVfamF2YV9ub25lIiwKLSAgICBdLAotICAgIHNka192ZXJzaW9uOiAibm9uZSIsCi0gICAgc3lzdGVtX21vZHVsZXM6ICJjb3JlLWFsbC1zeXN0ZW0tbW9kdWxlcyIsCi0gICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCi19CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmMvZmxhZ19pbmZvX3F1ZXJ5LnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3JjL2ZsYWdfaW5mb19xdWVyeS5ycwppbmRleCA2ZDAzMzc3Li42OGI2MTkzIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmMvZmxhZ19pbmZvX3F1ZXJ5LnJzCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9mbGFnX2luZm9fcXVlcnkucnMKQEAgLTE2LDggKzE2LDEwIEBACiAKIC8vISBmbGFnIHZhbHVlIHF1ZXJ5IG1vZHVsZSBkZWZpbmVzIHRoZSBmbGFnIHZhbHVlIGZpbGUgcmVhZCBmcm9tIG1hcHBlZCBieXRlcwogCi11c2UgY3JhdGU6OntBY29uZmlnU3RvcmFnZUVycm9yLCBGSUxFX1ZFUlNJT059OwotdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp7ZmxhZ19pbmZvOjpGbGFnSW5mb0hlYWRlciwgcmVhZF91OF9mcm9tX2J5dGVzLCBGbGFnVmFsdWVUeXBlfTsKK3VzZSBjcmF0ZTo6QWNvbmZpZ1N0b3JhZ2VFcnJvcjsKK3VzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6eworICAgIGZsYWdfaW5mbzo6RmxhZ0luZm9IZWFkZXIsIHJlYWRfdThfZnJvbV9ieXRlcywgRmxhZ1ZhbHVlVHlwZSwgTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04sCit9OwogdXNlIGFueWhvdzo6YW55aG93OwogCiAvLy8gR2V0IGZsYWcgYXR0cmlidXRlIGJpdGZpZWxkCkBAIC0yNywxMSArMjksMTEgQEAKICAgICBmbGFnX2luZGV4OiB1MzIsCiApIC0+IFJlc3VsdDx1OCwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4gewogICAgIGxldCBpbnRlcnByZXRlZF9oZWFkZXIgPSBGbGFnSW5mb0hlYWRlcjo6ZnJvbV9ieXRlcyhidWYpPzsKLSAgICBpZiBpbnRlcnByZXRlZF9oZWFkZXIudmVyc2lvbiA+IGNyYXRlOjpGSUxFX1ZFUlNJT04geworICAgIGlmIGludGVycHJldGVkX2hlYWRlci52ZXJzaW9uID4gTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04gewogICAgICAgICByZXR1cm4gRXJyKEFjb25maWdTdG9yYWdlRXJyb3I6OkhpZ2hlclN0b3JhZ2VGaWxlVmVyc2lvbihhbnlob3chKAogICAgICAgICAgICAgIkNhbm5vdCByZWFkIHN0b3JhZ2UgZmlsZSB3aXRoIGEgaGlnaGVyIHZlcnNpb24gb2Yge30gd2l0aCBsaWIgdmVyc2lvbiB7fSIsCiAgICAgICAgICAgICBpbnRlcnByZXRlZF9oZWFkZXIudmVyc2lvbiwKLSAgICAgICAgICAgIEZJTEVfVkVSU0lPTgorICAgICAgICAgICAgTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04KICAgICAgICAgKSkpOwogICAgIH0KIApAQCAtNTMsMTIgKzU1LDE0IEBACiAjW2NmZyh0ZXN0KV0KIG1vZCB0ZXN0cyB7CiAgICAgdXNlIHN1cGVyOjoqOwotICAgIHVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6e3Rlc3RfdXRpbHM6OmNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0LCBGbGFnSW5mb0JpdH07CisgICAgdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp7CisgICAgICAgIHRlc3RfdXRpbHM6OmNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0LCBGbGFnSW5mb0JpdCwgREVGQVVMVF9GSUxFX1ZFUlNJT04sCisgICAgfTsKIAogICAgICNbdGVzdF0KICAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBxdWVyeSBpZiBmbGFnIGhhcyBzZXJ2ZXIgb3ZlcnJpZGUKICAgICBmbiB0ZXN0X2lzX2ZsYWdfc3RpY2t5KCkgewotICAgICAgICBsZXQgZmxhZ19pbmZvX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdCgpLmludG9fYnl0ZXMoKTsKKyAgICAgICAgbGV0IGZsYWdfaW5mb19saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QoREVGQVVMVF9GSUxFX1ZFUlNJT04pLmludG9fYnl0ZXMoKTsKICAgICAgICAgZm9yIG9mZnNldCBpbiAwLi44IHsKICAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPQogICAgICAgICAgICAgICAgIGZpbmRfZmxhZ19hdHRyaWJ1dGUoJmZsYWdfaW5mb19saXN0Wy4uXSwgRmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgb2Zmc2V0KS51bndyYXAoKTsKQEAgLTY5LDcgKzczLDcgQEAKICAgICAjW3Rlc3RdCiAgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gcXVlcnkgaWYgZmxhZyBpcyByZWFkd3JpdGUKICAgICBmbiB0ZXN0X2lzX2ZsYWdfcmVhZHdyaXRlKCkgewotICAgICAgICBsZXQgZmxhZ19pbmZvX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdCgpLmludG9fYnl0ZXMoKTsKKyAgICAgICAgbGV0IGZsYWdfaW5mb19saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QoREVGQVVMVF9GSUxFX1ZFUlNJT04pLmludG9fYnl0ZXMoKTsKICAgICAgICAgbGV0IGJhc2VsaW5lOiBWZWM8Ym9vbD4gPSB2ZWMhW3RydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlXTsKICAgICAgICAgZm9yIG9mZnNldCBpbiAwLi44IHsKICAgICAgICAgICAgIGxldCBhdHRyaWJ1dGUgPQpAQCAtODQsNyArODgsNyBAQAogICAgICNbdGVzdF0KICAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBxdWVyeSBpZiBmbGFnIGhhcyBsb2NhbCBvdmVycmlkZQogICAgIGZuIHRlc3RfZmxhZ19oYXNfb3ZlcnJpZGUoKSB7Ci0gICAgICAgIGxldCBmbGFnX2luZm9fbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0KCkuaW50b19ieXRlcygpOworICAgICAgICBsZXQgZmxhZ19pbmZvX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdChERUZBVUxUX0ZJTEVfVkVSU0lPTikuaW50b19ieXRlcygpOwogICAgICAgICBmb3Igb2Zmc2V0IGluIDAuLjggewogICAgICAgICAgICAgbGV0IGF0dHJpYnV0ZSA9CiAgICAgICAgICAgICAgICAgZmluZF9mbGFnX2F0dHJpYnV0ZSgmZmxhZ19pbmZvX2xpc3RbLi5dLCBGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBvZmZzZXQpLnVud3JhcCgpOwpAQCAtOTUsNyArOTksNyBAQAogICAgICNbdGVzdF0KICAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBxdWVyeSBiZXlvbmQgdGhlIGVuZCBvZiBib29sZWFuIHNlY3Rpb24KICAgICBmbiB0ZXN0X2Jvb2xlYW5fb3V0X29mX3JhbmdlKCkgewotICAgICAgICBsZXQgZmxhZ19pbmZvX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdCgpLmludG9fYnl0ZXMoKTsKKyAgICAgICAgbGV0IGZsYWdfaW5mb19saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QoREVGQVVMVF9GSUxFX1ZFUlNJT04pLmludG9fYnl0ZXMoKTsKICAgICAgICAgbGV0IGVycm9yID0KICAgICAgICAgICAgIGZpbmRfZmxhZ19hdHRyaWJ1dGUoJmZsYWdfaW5mb19saXN0Wy4uXSwgRmxhZ1ZhbHVlVHlwZTo6Qm9vbGVhbiwgOCkudW53cmFwX2VycigpOwogICAgICAgICBhc3NlcnRfZXEhKApAQCAtMTA3LDE2ICsxMTEsMTYgQEAKICAgICAjW3Rlc3RdCiAgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gcXVlcnkgZXJyb3Igd2hlbiBmaWxlIGhhcyBhIGhpZ2hlciB2ZXJzaW9uCiAgICAgZm4gdGVzdF9oaWdoZXJfdmVyc2lvbl9zdG9yYWdlX2ZpbGUoKSB7Ci0gICAgICAgIGxldCBtdXQgaW5mb19saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QoKTsKLSAgICAgICAgaW5mb19saXN0LmhlYWRlci52ZXJzaW9uID0gY3JhdGU6OkZJTEVfVkVSU0lPTiArIDE7CisgICAgICAgIGxldCBtdXQgaW5mb19saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QoREVGQVVMVF9GSUxFX1ZFUlNJT04pOworICAgICAgICBpbmZvX2xpc3QuaGVhZGVyLnZlcnNpb24gPSBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiArIDE7CiAgICAgICAgIGxldCBmbGFnX2luZm8gPSBpbmZvX2xpc3QuaW50b19ieXRlcygpOwogICAgICAgICBsZXQgZXJyb3IgPSBmaW5kX2ZsYWdfYXR0cmlidXRlKCZmbGFnX2luZm9bLi5dLCBGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCA0KS51bndyYXBfZXJyKCk7CiAgICAgICAgIGFzc2VydF9lcSEoCiAgICAgICAgICAgICBmb3JtYXQhKCJ7Oj99IiwgZXJyb3IpLAogICAgICAgICAgICAgZm9ybWF0ISgKICAgICAgICAgICAgICAgICAiSGlnaGVyU3RvcmFnZUZpbGVWZXJzaW9uKENhbm5vdCByZWFkIHN0b3JhZ2UgZmlsZSB3aXRoIGEgaGlnaGVyIHZlcnNpb24gb2Yge30gd2l0aCBsaWIgdmVyc2lvbiB7fSkiLAotICAgICAgICAgICAgICAgIGNyYXRlOjpGSUxFX1ZFUlNJT04gKyAxLAotICAgICAgICAgICAgICAgIGNyYXRlOjpGSUxFX1ZFUlNJT04KKyAgICAgICAgICAgICAgICBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiArIDEsCisgICAgICAgICAgICAgICAgTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04KICAgICAgICAgICAgICkKICAgICAgICAgKTsKICAgICB9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmMvZmxhZ190YWJsZV9xdWVyeS5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9mbGFnX3RhYmxlX3F1ZXJ5LnJzCmluZGV4IGExYTQ3OTMuLjNlODdhY2MgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9mbGFnX3RhYmxlX3F1ZXJ5LnJzCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9mbGFnX3RhYmxlX3F1ZXJ5LnJzCkBAIC0xNiw5ICsxNiwxMCBAQAogCiAvLyEgZmxhZyB0YWJsZSBxdWVyeSBtb2R1bGUgZGVmaW5lcyB0aGUgZmxhZyB0YWJsZSBmaWxlIHJlYWQgZnJvbSBtYXBwZWQgYnl0ZXMKIAotdXNlIGNyYXRlOjp7QWNvbmZpZ1N0b3JhZ2VFcnJvciwgRklMRV9WRVJTSU9OfTsKK3VzZSBjcmF0ZTo6QWNvbmZpZ1N0b3JhZ2VFcnJvcjsKIHVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6ewogICAgIGZsYWdfdGFibGU6OkZsYWdUYWJsZUhlYWRlciwgZmxhZ190YWJsZTo6RmxhZ1RhYmxlTm9kZSwgcmVhZF91MzJfZnJvbV9ieXRlcywgU3RvcmVkRmxhZ1R5cGUsCisgICAgTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04sCiB9OwogdXNlIGFueWhvdzo6YW55aG93OwogCkBAIC0zNiwxMSArMzcsMTEgQEAKICAgICBmbGFnOiAmc3RyLAogKSAtPiBSZXN1bHQ8T3B0aW9uPEZsYWdSZWFkQ29udGV4dD4sIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKICAgICBsZXQgaW50ZXJwcmV0ZWRfaGVhZGVyID0gRmxhZ1RhYmxlSGVhZGVyOjpmcm9tX2J5dGVzKGJ1Zik/OwotICAgIGlmIGludGVycHJldGVkX2hlYWRlci52ZXJzaW9uID4gY3JhdGU6OkZJTEVfVkVSU0lPTiB7CisgICAgaWYgaW50ZXJwcmV0ZWRfaGVhZGVyLnZlcnNpb24gPiBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiB7CiAgICAgICAgIHJldHVybiBFcnIoQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6SGlnaGVyU3RvcmFnZUZpbGVWZXJzaW9uKGFueWhvdyEoCiAgICAgICAgICAgICAiQ2Fubm90IHJlYWQgc3RvcmFnZSBmaWxlIHdpdGggYSBoaWdoZXIgdmVyc2lvbiBvZiB7fSB3aXRoIGxpYiB2ZXJzaW9uIHt9IiwKICAgICAgICAgICAgIGludGVycHJldGVkX2hlYWRlci52ZXJzaW9uLAotICAgICAgICAgICAgRklMRV9WRVJTSU9OCisgICAgICAgICAgICBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTgogICAgICAgICApKSk7CiAgICAgfQogCkBAIC03MywxMiArNzQsMTIgQEAKICNbY2ZnKHRlc3QpXQogbW9kIHRlc3RzIHsKICAgICB1c2Ugc3VwZXI6Oio7Ci0gICAgdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp0ZXN0X3V0aWxzOjpjcmVhdGVfdGVzdF9mbGFnX3RhYmxlOworICAgIHVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6e3Rlc3RfdXRpbHM6OmNyZWF0ZV90ZXN0X2ZsYWdfdGFibGUsIERFRkFVTFRfRklMRV9WRVJTSU9OfTsKIAogICAgICNbdGVzdF0KICAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biB0YWJsZSBxdWVyeQogICAgIGZuIHRlc3RfZmxhZ19xdWVyeSgpIHsKLSAgICAgICAgbGV0IGZsYWdfdGFibGUgPSBjcmVhdGVfdGVzdF9mbGFnX3RhYmxlKCkuaW50b19ieXRlcygpOworICAgICAgICBsZXQgZmxhZ190YWJsZSA9IGNyZWF0ZV90ZXN0X2ZsYWdfdGFibGUoREVGQVVMVF9GSUxFX1ZFUlNJT04pLmludG9fYnl0ZXMoKTsKICAgICAgICAgbGV0IGJhc2VsaW5lID0gdmVjIVsKICAgICAgICAgICAgICgwLCAiZW5hYmxlZF9ybyIsIFN0b3JlZEZsYWdUeXBlOjpSZWFkT25seUJvb2xlYW4sIDF1MTYpLAogICAgICAgICAgICAgKDAsICJlbmFibGVkX3J3IiwgU3RvcmVkRmxhZ1R5cGU6OlJlYWRXcml0ZUJvb2xlYW4sIDJ1MTYpLApAQCAtMTAwLDcgKzEwMSw3IEBACiAgICAgI1t0ZXN0XQogICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHRhYmxlIHF1ZXJ5IG9mIGEgbm9uIGV4aXN0IGZsYWcKICAgICBmbiB0ZXN0X25vdF9leGlzdGVkX2ZsYWdfcXVlcnkoKSB7Ci0gICAgICAgIGxldCBmbGFnX3RhYmxlID0gY3JlYXRlX3Rlc3RfZmxhZ190YWJsZSgpLmludG9fYnl0ZXMoKTsKKyAgICAgICAgbGV0IGZsYWdfdGFibGUgPSBjcmVhdGVfdGVzdF9mbGFnX3RhYmxlKERFRkFVTFRfRklMRV9WRVJTSU9OKS5pbnRvX2J5dGVzKCk7CiAgICAgICAgIGxldCBmbGFnX2NvbnRleHQgPSBmaW5kX2ZsYWdfcmVhZF9jb250ZXh0KCZmbGFnX3RhYmxlWy4uXSwgMSwgImRpc2FibGVkX2ZpeGVkX3JvIikudW53cmFwKCk7CiAgICAgICAgIGFzc2VydF9lcSEoZmxhZ19jb250ZXh0LCBOb25lKTsKICAgICAgICAgbGV0IGZsYWdfY29udGV4dCA9IGZpbmRfZmxhZ19yZWFkX2NvbnRleHQoJmZsYWdfdGFibGVbLi5dLCAyLCAiZGlzYWJsZWRfcnciKS51bndyYXAoKTsKQEAgLTExMCwxNiArMTExLDE2IEBACiAgICAgI1t0ZXN0XQogICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHF1ZXJ5IGVycm9yIHdoZW4gZmlsZSBoYXMgYSBoaWdoZXIgdmVyc2lvbgogICAgIGZuIHRlc3RfaGlnaGVyX3ZlcnNpb25fc3RvcmFnZV9maWxlKCkgewotICAgICAgICBsZXQgbXV0IHRhYmxlID0gY3JlYXRlX3Rlc3RfZmxhZ190YWJsZSgpOwotICAgICAgICB0YWJsZS5oZWFkZXIudmVyc2lvbiA9IGNyYXRlOjpGSUxFX1ZFUlNJT04gKyAxOworICAgICAgICBsZXQgbXV0IHRhYmxlID0gY3JlYXRlX3Rlc3RfZmxhZ190YWJsZShERUZBVUxUX0ZJTEVfVkVSU0lPTik7CisgICAgICAgIHRhYmxlLmhlYWRlci52ZXJzaW9uID0gTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04gKyAxOwogICAgICAgICBsZXQgZmxhZ190YWJsZSA9IHRhYmxlLmludG9fYnl0ZXMoKTsKICAgICAgICAgbGV0IGVycm9yID0gZmluZF9mbGFnX3JlYWRfY29udGV4dCgmZmxhZ190YWJsZVsuLl0sIDAsICJlbmFibGVkX3JvIikudW53cmFwX2VycigpOwogICAgICAgICBhc3NlcnRfZXEhKAogICAgICAgICAgICAgZm9ybWF0ISgiezo/fSIsIGVycm9yKSwKICAgICAgICAgICAgIGZvcm1hdCEoCiAgICAgICAgICAgICAgICAgIkhpZ2hlclN0b3JhZ2VGaWxlVmVyc2lvbihDYW5ub3QgcmVhZCBzdG9yYWdlIGZpbGUgd2l0aCBhIGhpZ2hlciB2ZXJzaW9uIG9mIHt9IHdpdGggbGliIHZlcnNpb24ge30pIiwKLSAgICAgICAgICAgICAgICBjcmF0ZTo6RklMRV9WRVJTSU9OICsgMSwKLSAgICAgICAgICAgICAgICBjcmF0ZTo6RklMRV9WRVJTSU9OCisgICAgICAgICAgICAgICAgTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04gKyAxLAorICAgICAgICAgICAgICAgIE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OCiAgICAgICAgICAgICApCiAgICAgICAgICk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3JjL2ZsYWdfdmFsdWVfcXVlcnkucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmMvZmxhZ192YWx1ZV9xdWVyeS5ycwppbmRleCA5ZDMyYTE2Li4zNWY1NjkyIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmMvZmxhZ192YWx1ZV9xdWVyeS5ycworKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmMvZmxhZ192YWx1ZV9xdWVyeS5ycwpAQCAtMTYsMTggKzE2LDIwIEBACiAKIC8vISBmbGFnIHZhbHVlIHF1ZXJ5IG1vZHVsZSBkZWZpbmVzIHRoZSBmbGFnIHZhbHVlIGZpbGUgcmVhZCBmcm9tIG1hcHBlZCBieXRlcwogCi11c2UgY3JhdGU6OntBY29uZmlnU3RvcmFnZUVycm9yLCBGSUxFX1ZFUlNJT059OwotdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp7ZmxhZ192YWx1ZTo6RmxhZ1ZhbHVlSGVhZGVyLCByZWFkX3U4X2Zyb21fYnl0ZXN9OwordXNlIGNyYXRlOjpBY29uZmlnU3RvcmFnZUVycm9yOwordXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp7CisgICAgZmxhZ192YWx1ZTo6RmxhZ1ZhbHVlSGVhZGVyLCByZWFkX3U4X2Zyb21fYnl0ZXMsIE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OLAorfTsKIHVzZSBhbnlob3c6OmFueWhvdzsKIAogLy8vIFF1ZXJ5IGZsYWcgdmFsdWUKIHB1YiBmbiBmaW5kX2Jvb2xlYW5fZmxhZ192YWx1ZShidWY6ICZbdThdLCBmbGFnX2luZGV4OiB1MzIpIC0+IFJlc3VsdDxib29sLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CiAgICAgbGV0IGludGVycHJldGVkX2hlYWRlciA9IEZsYWdWYWx1ZUhlYWRlcjo6ZnJvbV9ieXRlcyhidWYpPzsKLSAgICBpZiBpbnRlcnByZXRlZF9oZWFkZXIudmVyc2lvbiA+IGNyYXRlOjpGSUxFX1ZFUlNJT04geworICAgIGlmIGludGVycHJldGVkX2hlYWRlci52ZXJzaW9uID4gTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04gewogICAgICAgICByZXR1cm4gRXJyKEFjb25maWdTdG9yYWdlRXJyb3I6OkhpZ2hlclN0b3JhZ2VGaWxlVmVyc2lvbihhbnlob3chKAogICAgICAgICAgICAgIkNhbm5vdCByZWFkIHN0b3JhZ2UgZmlsZSB3aXRoIGEgaGlnaGVyIHZlcnNpb24gb2Yge30gd2l0aCBsaWIgdmVyc2lvbiB7fSIsCiAgICAgICAgICAgICBpbnRlcnByZXRlZF9oZWFkZXIudmVyc2lvbiwKLSAgICAgICAgICAgIEZJTEVfVkVSU0lPTgorICAgICAgICAgICAgTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04KICAgICAgICAgKSkpOwogICAgIH0KIApAQCAtNDYsMTIgKzQ4LDEyIEBACiAjW2NmZyh0ZXN0KV0KIG1vZCB0ZXN0cyB7CiAgICAgdXNlIHN1cGVyOjoqOwotICAgIHVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6dGVzdF91dGlsczo6Y3JlYXRlX3Rlc3RfZmxhZ192YWx1ZV9saXN0OworICAgIHVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6e3Rlc3RfdXRpbHM6OmNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdCwgREVGQVVMVF9GSUxFX1ZFUlNJT059OwogCiAgICAgI1t0ZXN0XQogICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIGZsYWcgdmFsdWUgcXVlcnkKICAgICBmbiB0ZXN0X2ZsYWdfdmFsdWVfcXVlcnkoKSB7Ci0gICAgICAgIGxldCBmbGFnX3ZhbHVlX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QoKS5pbnRvX2J5dGVzKCk7CisgICAgICAgIGxldCBmbGFnX3ZhbHVlX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QoREVGQVVMVF9GSUxFX1ZFUlNJT04pLmludG9fYnl0ZXMoKTsKICAgICAgICAgbGV0IGJhc2VsaW5lOiBWZWM8Ym9vbD4gPSB2ZWMhW2ZhbHNlLCB0cnVlLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZV07CiAgICAgICAgIGZvciAob2Zmc2V0LCBleHBlY3RlZF92YWx1ZSkgaW4gYmFzZWxpbmUuaW50b19pdGVyKCkuZW51bWVyYXRlKCkgewogICAgICAgICAgICAgbGV0IGZsYWdfdmFsdWUgPSBmaW5kX2Jvb2xlYW5fZmxhZ192YWx1ZSgmZmxhZ192YWx1ZV9saXN0Wy4uXSwgb2Zmc2V0IGFzIHUzMikudW53cmFwKCk7CkBAIC02Miw3ICs2NCw3IEBACiAgICAgI1t0ZXN0XQogICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHF1ZXJ5IGJleW9uZCB0aGUgZW5kIG9mIGJvb2xlYW4gc2VjdGlvbgogICAgIGZuIHRlc3RfYm9vbGVhbl9vdXRfb2ZfcmFuZ2UoKSB7Ci0gICAgICAgIGxldCBmbGFnX3ZhbHVlX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QoKS5pbnRvX2J5dGVzKCk7CisgICAgICAgIGxldCBmbGFnX3ZhbHVlX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QoREVGQVVMVF9GSUxFX1ZFUlNJT04pLmludG9fYnl0ZXMoKTsKICAgICAgICAgbGV0IGVycm9yID0gZmluZF9ib29sZWFuX2ZsYWdfdmFsdWUoJmZsYWdfdmFsdWVfbGlzdFsuLl0sIDgpLnVud3JhcF9lcnIoKTsKICAgICAgICAgYXNzZXJ0X2VxISgKICAgICAgICAgICAgIGZvcm1hdCEoIns6P30iLCBlcnJvciksCkBAIC03MywxNiArNzUsMTYgQEAKICAgICAjW3Rlc3RdCiAgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gcXVlcnkgZXJyb3Igd2hlbiBmaWxlIGhhcyBhIGhpZ2hlciB2ZXJzaW9uCiAgICAgZm4gdGVzdF9oaWdoZXJfdmVyc2lvbl9zdG9yYWdlX2ZpbGUoKSB7Ci0gICAgICAgIGxldCBtdXQgdmFsdWVfbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdCgpOwotICAgICAgICB2YWx1ZV9saXN0LmhlYWRlci52ZXJzaW9uID0gY3JhdGU6OkZJTEVfVkVSU0lPTiArIDE7CisgICAgICAgIGxldCBtdXQgdmFsdWVfbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdChERUZBVUxUX0ZJTEVfVkVSU0lPTik7CisgICAgICAgIHZhbHVlX2xpc3QuaGVhZGVyLnZlcnNpb24gPSBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiArIDE7CiAgICAgICAgIGxldCBmbGFnX3ZhbHVlID0gdmFsdWVfbGlzdC5pbnRvX2J5dGVzKCk7CiAgICAgICAgIGxldCBlcnJvciA9IGZpbmRfYm9vbGVhbl9mbGFnX3ZhbHVlKCZmbGFnX3ZhbHVlWy4uXSwgNCkudW53cmFwX2VycigpOwogICAgICAgICBhc3NlcnRfZXEhKAogICAgICAgICAgICAgZm9ybWF0ISgiezo/fSIsIGVycm9yKSwKICAgICAgICAgICAgIGZvcm1hdCEoCiAgICAgICAgICAgICAgICAgIkhpZ2hlclN0b3JhZ2VGaWxlVmVyc2lvbihDYW5ub3QgcmVhZCBzdG9yYWdlIGZpbGUgd2l0aCBhIGhpZ2hlciB2ZXJzaW9uIG9mIHt9IHdpdGggbGliIHZlcnNpb24ge30pIiwKLSAgICAgICAgICAgICAgICBjcmF0ZTo6RklMRV9WRVJTSU9OICsgMSwKLSAgICAgICAgICAgICAgICBjcmF0ZTo6RklMRV9WRVJTSU9OCisgICAgICAgICAgICAgICAgTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04gKyAxLAorICAgICAgICAgICAgICAgIE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OCiAgICAgICAgICAgICApCiAgICAgICAgICk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3JjL2xpYi5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9saWIucnMKaW5kZXggZDc2Y2YzZi4uZDNjYzlkNCAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3JjL2xpYi5ycworKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmMvbGliLnJzCkBAIC00NCw5ICs0NCwxMCBAQAogCiBwdWIgdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp7QWNvbmZpZ1N0b3JhZ2VFcnJvciwgRmxhZ1ZhbHVlVHlwZSwgU3RvcmFnZUZpbGVUeXBlfTsKIHB1YiB1c2UgZmxhZ190YWJsZV9xdWVyeTo6RmxhZ1JlYWRDb250ZXh0OworcHViIHVzZSBtYXBwZWRfZmlsZTo6bWFwX2ZpbGU7CiBwdWIgdXNlIHBhY2thZ2VfdGFibGVfcXVlcnk6OlBhY2thZ2VSZWFkQ29udGV4dDsKIAotdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp7cmVhZF91MzJfZnJvbV9ieXRlcywgRklMRV9WRVJTSU9OfTsKK3VzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6cmVhZF91MzJfZnJvbV9ieXRlczsKIHVzZSBmbGFnX2luZm9fcXVlcnk6OmZpbmRfZmxhZ19hdHRyaWJ1dGU7CiB1c2UgZmxhZ190YWJsZV9xdWVyeTo6ZmluZF9mbGFnX3JlYWRfY29udGV4dDsKIHVzZSBmbGFnX3ZhbHVlX3F1ZXJ5OjpmaW5kX2Jvb2xlYW5fZmxhZ192YWx1ZTsKQEAgLTExNCwxMyArMTE1LDEzIEBACiAKIC8vLyBHZXQgdGhlIGJvb2xlYW4gZmxhZyB2YWx1ZS4KIC8vLwotLy8vIFxpbnB1dCBmaWxlOiBtYXBwZWQgZmxhZyBmaWxlCisvLy8gXGlucHV0IGZpbGU6IGEgYnl0ZSBzbGljZSwgY2FuIGJlIGVpdGhlciAmTW1hcCBvciAmTWFwTXV0CiAvLy8gXGlucHV0IGluZGV4OiBib29sZWFuIGZsYWcgb2Zmc2V0CiAvLy8KIC8vLyBccmV0dXJuCiAvLy8gSWYgdGhlIHByb3ZpZGUgb2Zmc2V0IGlzIHZhbGlkLCBpdCByZXR1cm5zIHRoZSBib29sZWFuIGZsYWcgdmFsdWUsIG90aGVyd2lzZSBpdAogLy8vIHJldHVybnMgdGhlIGVycm9yIG1lc3NhZ2UuCi1wdWIgZm4gZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZShmaWxlOiAmTW1hcCwgaW5kZXg6IHUzMikgLT4gUmVzdWx0PGJvb2wsIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKK3B1YiBmbiBnZXRfYm9vbGVhbl9mbGFnX3ZhbHVlKGZpbGU6ICZbdThdLCBpbmRleDogdTMyKSAtPiBSZXN1bHQ8Ym9vbCwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4gewogICAgIGZpbmRfYm9vbGVhbl9mbGFnX3ZhbHVlKGZpbGUsIGluZGV4KQogfQogCkBAIC0xNDgsNyArMTQ5LDcgQEAKIAogLy8vIEdldCB0aGUgZmxhZyBhdHRyaWJ1dGUuCiAvLy8KLS8vLyBcaW5wdXQgZmlsZTogbWFwcGVkIGZsYWcgaW5mbyBmaWxlCisvLy8gXGlucHV0IGZpbGU6IGEgYnl0ZSBzbGljZSwgY2FuIGJlIGVpdGhlciAmTW1hcCBvciAmTWFwTXV0CiAvLy8gXGlucHV0IGZsYWdfdHlwZTogZmxhZyB2YWx1ZSB0eXBlCiAvLy8gXGlucHV0IGZsYWdfaW5kZXg6IGZsYWcgaW5kZXgKIC8vLwpAQCAtMTU2LDcgKzE1Nyw3IEBACiAvLy8gSWYgdGhlIHByb3ZpZGUgb2Zmc2V0IGlzIHZhbGlkLCBpdCByZXR1cm5zIHRoZSBmbGFnIGF0dHJpYnV0ZSBiaXRmaWxlZCwgb3RoZXJ3aXNlIGl0CiAvLy8gcmV0dXJucyB0aGUgZXJyb3IgbWVzc2FnZS4KIHB1YiBmbiBnZXRfZmxhZ19hdHRyaWJ1dGUoCi0gICAgZmlsZTogJk1tYXAsCisgICAgZmlsZTogJlt1OF0sCiAgICAgZmxhZ190eXBlOiBGbGFnVmFsdWVUeXBlLAogICAgIGZsYWdfaW5kZXg6IHUzMiwKICkgLT4gUmVzdWx0PHU4LCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CkBAIC00MTIsMTAgKzQxMywxMCBAQAogICAgICAgICBsZXQgZmxhZ19tYXAgPSBzdG9yYWdlX2Rpci5jbG9uZSgpICsgIi9tYXBzL21vY2t1cC5mbGFnLm1hcCI7CiAgICAgICAgIGxldCBmbGFnX3ZhbCA9IHN0b3JhZ2VfZGlyLmNsb25lKCkgKyAiL2Jvb3QvbW9ja3VwLnZhbCI7CiAgICAgICAgIGxldCBmbGFnX2luZm8gPSBzdG9yYWdlX2Rpci5jbG9uZSgpICsgIi9ib290L21vY2t1cC5pbmZvIjsKLSAgICAgICAgZnM6OmNvcHkoIi4vdGVzdHMvcGFja2FnZS5tYXAiLCAmcGFja2FnZV9tYXApLnVud3JhcCgpOwotICAgICAgICBmczo6Y29weSgiLi90ZXN0cy9mbGFnLm1hcCIsICZmbGFnX21hcCkudW53cmFwKCk7Ci0gICAgICAgIGZzOjpjb3B5KCIuL3Rlc3RzL2ZsYWcudmFsIiwgJmZsYWdfdmFsKS51bndyYXAoKTsKLSAgICAgICAgZnM6OmNvcHkoIi4vdGVzdHMvZmxhZy5pbmZvIiwgJmZsYWdfaW5mbykudW53cmFwKCk7CisgICAgICAgIGZzOjpjb3B5KCIuL3Rlc3RzL2RhdGEvdjEvcGFja2FnZV92MS5tYXAiLCAmcGFja2FnZV9tYXApLnVud3JhcCgpOworICAgICAgICBmczo6Y29weSgiLi90ZXN0cy9kYXRhL3YxL2ZsYWdfdjEubWFwIiwgJmZsYWdfbWFwKS51bndyYXAoKTsKKyAgICAgICAgZnM6OmNvcHkoIi4vdGVzdHMvZGF0YS92MS9mbGFnX3YxLnZhbCIsICZmbGFnX3ZhbCkudW53cmFwKCk7CisgICAgICAgIGZzOjpjb3B5KCIuL3Rlc3RzL2RhdGEvdjEvZmxhZ192MS5pbmZvIiwgJmZsYWdfaW5mbykudW53cmFwKCk7CiAKICAgICAgICAgcmV0dXJuIHN0b3JhZ2VfZGlyOwogICAgIH0KQEAgLTQzMiwyMSArNDMzLDI0IEBACiAgICAgICAgICAgICBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfbWFwcGVkX2ZpbGUsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIikKICAgICAgICAgICAgICAgICAudW53cmFwKCkKICAgICAgICAgICAgICAgICAudW53cmFwKCk7Ci0gICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPSBQYWNrYWdlUmVhZENvbnRleHQgeyBwYWNrYWdlX2lkOiAwLCBib29sZWFuX3N0YXJ0X2luZGV4OiAwIH07CisgICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPQorICAgICAgICAgICAgUGFja2FnZVJlYWRDb250ZXh0IHsgcGFja2FnZV9pZDogMCwgYm9vbGVhbl9zdGFydF9pbmRleDogMCwgZmluZ2VycHJpbnQ6IDAgfTsKICAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX2NvbnRleHQsIGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCk7CiAKICAgICAgICAgbGV0IHBhY2thZ2VfY29udGV4dCA9CiAgICAgICAgICAgICBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfbWFwcGVkX2ZpbGUsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIikKICAgICAgICAgICAgICAgICAudW53cmFwKCkKICAgICAgICAgICAgICAgICAudW53cmFwKCk7Ci0gICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPSBQYWNrYWdlUmVhZENvbnRleHQgeyBwYWNrYWdlX2lkOiAxLCBib29sZWFuX3N0YXJ0X2luZGV4OiAzIH07CisgICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPQorICAgICAgICAgICAgUGFja2FnZVJlYWRDb250ZXh0IHsgcGFja2FnZV9pZDogMSwgYm9vbGVhbl9zdGFydF9pbmRleDogMywgZmluZ2VycHJpbnQ6IDAgfTsKICAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX2NvbnRleHQsIGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCk7CiAKICAgICAgICAgbGV0IHBhY2thZ2VfY29udGV4dCA9CiAgICAgICAgICAgICBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfbWFwcGVkX2ZpbGUsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80IikKICAgICAgICAgICAgICAgICAudW53cmFwKCkKICAgICAgICAgICAgICAgICAudW53cmFwKCk7Ci0gICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPSBQYWNrYWdlUmVhZENvbnRleHQgeyBwYWNrYWdlX2lkOiAyLCBib29sZWFuX3N0YXJ0X2luZGV4OiA2IH07CisgICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPQorICAgICAgICAgICAgUGFja2FnZVJlYWRDb250ZXh0IHsgcGFja2FnZV9pZDogMiwgYm9vbGVhbl9zdGFydF9pbmRleDogNiwgZmluZ2VycHJpbnQ6IDAgfTsKICAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX2NvbnRleHQsIGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCk7CiAgICAgfQogCkBAIC01MDcsOSArNTExLDkgQEAKICAgICAjW3Rlc3RdCiAgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gZmxhZyBzdG9yYWdlIGZpbGUgdmVyc2lvbiBudW1iZXIgcXVlcnkgYXBpCiAgICAgZm4gdGVzdF9zdG9yYWdlX3ZlcnNpb25fcXVlcnkoKSB7Ci0gICAgICAgIGFzc2VydF9lcSEoZ2V0X3N0b3JhZ2VfZmlsZV92ZXJzaW9uKCIuL3Rlc3RzL3BhY2thZ2UubWFwIikudW53cmFwKCksIDEpOwotICAgICAgICBhc3NlcnRfZXEhKGdldF9zdG9yYWdlX2ZpbGVfdmVyc2lvbigiLi90ZXN0cy9mbGFnLm1hcCIpLnVud3JhcCgpLCAxKTsKLSAgICAgICAgYXNzZXJ0X2VxIShnZXRfc3RvcmFnZV9maWxlX3ZlcnNpb24oIi4vdGVzdHMvZmxhZy52YWwiKS51bndyYXAoKSwgMSk7Ci0gICAgICAgIGFzc2VydF9lcSEoZ2V0X3N0b3JhZ2VfZmlsZV92ZXJzaW9uKCIuL3Rlc3RzL2ZsYWcuaW5mbyIpLnVud3JhcCgpLCAxKTsKKyAgICAgICAgYXNzZXJ0X2VxIShnZXRfc3RvcmFnZV9maWxlX3ZlcnNpb24oIi4vdGVzdHMvZGF0YS92MS9wYWNrYWdlX3YxLm1hcCIpLnVud3JhcCgpLCAxKTsKKyAgICAgICAgYXNzZXJ0X2VxIShnZXRfc3RvcmFnZV9maWxlX3ZlcnNpb24oIi4vdGVzdHMvZGF0YS92MS9mbGFnX3YxLm1hcCIpLnVud3JhcCgpLCAxKTsKKyAgICAgICAgYXNzZXJ0X2VxIShnZXRfc3RvcmFnZV9maWxlX3ZlcnNpb24oIi4vdGVzdHMvZGF0YS92MS9mbGFnX3YxLnZhbCIpLnVud3JhcCgpLCAxKTsKKyAgICAgICAgYXNzZXJ0X2VxIShnZXRfc3RvcmFnZV9maWxlX3ZlcnNpb24oIi4vdGVzdHMvZGF0YS92MS9mbGFnX3YxLmluZm8iKS51bndyYXAoKSwgMSk7CiAgICAgfQogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3JjL21hcHBlZF9maWxlLnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3JjL21hcHBlZF9maWxlLnJzCmluZGV4IDVhMTY2NDUuLmY0ZTI2OWUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9tYXBwZWRfZmlsZS5ycworKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmMvbWFwcGVkX2ZpbGUucnMKQEAgLTI4LDcgKzI4LDcgQEAKIC8vLyBUaGUgbWVtb3J5IG1hcHBlZCBmaWxlIG1heSBoYXZlIHVuZGVmaW5lZCBiZWhhdmlvciBpZiB0aGVyZSBhcmUgd3JpdGVzIHRvIHRoaXMKIC8vLyBmaWxlIGFmdGVyIGJlaW5nIG1hcHBlZC4gRW5zdXJlIG5vIHdyaXRlcyBjYW4gaGFwcGVuIHRvIHRoaXMgZmlsZSB3aGlsZSB0aGlzCiAvLy8gbWFwcGluZyBzdGF5cyBhbGl2ZS4KLXVuc2FmZSBmbiBtYXBfZmlsZShmaWxlX3BhdGg6ICZzdHIpIC0+IFJlc3VsdDxNbWFwLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CitwdWIgdW5zYWZlIGZuIG1hcF9maWxlKGZpbGVfcGF0aDogJnN0cikgLT4gUmVzdWx0PE1tYXAsIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKICAgICBsZXQgZmlsZSA9IEZpbGU6Om9wZW4oZmlsZV9wYXRoKQogICAgICAgICAubWFwX2Vycih8ZXJybXNnfCBGaWxlUmVhZEZhaWwoYW55aG93ISgiRmFpbGVkIHRvIG9wZW4gZmlsZSB7fToge30iLCBmaWxlX3BhdGgsIGVycm1zZykpKT87CiAgICAgdW5zYWZlIHsKQEAgLTk3LDEwICs5NywxMCBAQAogICAgICAgICBsZXQgZmxhZ19tYXAgPSBzdG9yYWdlX2Rpci5jbG9uZSgpICsgIi9tYXBzL21vY2t1cC5mbGFnLm1hcCI7CiAgICAgICAgIGxldCBmbGFnX3ZhbCA9IHN0b3JhZ2VfZGlyLmNsb25lKCkgKyAiL2Jvb3QvbW9ja3VwLnZhbCI7CiAgICAgICAgIGxldCBmbGFnX2luZm8gPSBzdG9yYWdlX2Rpci5jbG9uZSgpICsgIi9ib290L21vY2t1cC5pbmZvIjsKLSAgICAgICAgZnM6OmNvcHkoIi4vdGVzdHMvcGFja2FnZS5tYXAiLCAmcGFja2FnZV9tYXApLnVud3JhcCgpOwotICAgICAgICBmczo6Y29weSgiLi90ZXN0cy9mbGFnLm1hcCIsICZmbGFnX21hcCkudW53cmFwKCk7Ci0gICAgICAgIGZzOjpjb3B5KCIuL3Rlc3RzL2ZsYWcudmFsIiwgJmZsYWdfdmFsKS51bndyYXAoKTsKLSAgICAgICAgZnM6OmNvcHkoIi4vdGVzdHMvZmxhZy5pbmZvIiwgJmZsYWdfaW5mbykudW53cmFwKCk7CisgICAgICAgIGZzOjpjb3B5KCIuL3Rlc3RzL2RhdGEvdjEvcGFja2FnZV92MS5tYXAiLCAmcGFja2FnZV9tYXApLnVud3JhcCgpOworICAgICAgICBmczo6Y29weSgiLi90ZXN0cy9kYXRhL3YxL2ZsYWdfdjEubWFwIiwgJmZsYWdfbWFwKS51bndyYXAoKTsKKyAgICAgICAgZnM6OmNvcHkoIi4vdGVzdHMvZGF0YS92MS9mbGFnX3YxLnZhbCIsICZmbGFnX3ZhbCkudW53cmFwKCk7CisgICAgICAgIGZzOjpjb3B5KCIuL3Rlc3RzL2RhdGEvdjEvZmxhZ192MS5pbmZvIiwgJmZsYWdfaW5mbykudW53cmFwKCk7CiAKICAgICAgICAgcmV0dXJuIHN0b3JhZ2VfZGlyOwogICAgIH0KQEAgLTEwOCw5ICsxMDgsOSBAQAogICAgICNbdGVzdF0KICAgICBmbiB0ZXN0X21hcHBlZF9maWxlX2NvbnRlbnRzKCkgewogICAgICAgICBsZXQgc3RvcmFnZV9kaXIgPSBjcmVhdGVfdGVzdF9zdG9yYWdlX2ZpbGVzKCk7Ci0gICAgICAgIG1hcF9hbmRfdmVyaWZ5KCZzdG9yYWdlX2RpciwgU3RvcmFnZUZpbGVUeXBlOjpQYWNrYWdlTWFwLCAiLi90ZXN0cy9wYWNrYWdlLm1hcCIpOwotICAgICAgICBtYXBfYW5kX3ZlcmlmeSgmc3RvcmFnZV9kaXIsIFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ01hcCwgIi4vdGVzdHMvZmxhZy5tYXAiKTsKLSAgICAgICAgbWFwX2FuZF92ZXJpZnkoJnN0b3JhZ2VfZGlyLCBTdG9yYWdlRmlsZVR5cGU6OkZsYWdWYWwsICIuL3Rlc3RzL2ZsYWcudmFsIik7Ci0gICAgICAgIG1hcF9hbmRfdmVyaWZ5KCZzdG9yYWdlX2RpciwgU3RvcmFnZUZpbGVUeXBlOjpGbGFnSW5mbywgIi4vdGVzdHMvZmxhZy5pbmZvIik7CisgICAgICAgIG1hcF9hbmRfdmVyaWZ5KCZzdG9yYWdlX2RpciwgU3RvcmFnZUZpbGVUeXBlOjpQYWNrYWdlTWFwLCAiLi90ZXN0cy9kYXRhL3YxL3BhY2thZ2VfdjEubWFwIik7CisgICAgICAgIG1hcF9hbmRfdmVyaWZ5KCZzdG9yYWdlX2RpciwgU3RvcmFnZUZpbGVUeXBlOjpGbGFnTWFwLCAiLi90ZXN0cy9kYXRhL3YxL2ZsYWdfdjEubWFwIik7CisgICAgICAgIG1hcF9hbmRfdmVyaWZ5KCZzdG9yYWdlX2RpciwgU3RvcmFnZUZpbGVUeXBlOjpGbGFnVmFsLCAiLi90ZXN0cy9kYXRhL3YxL2ZsYWdfdjEudmFsIik7CisgICAgICAgIG1hcF9hbmRfdmVyaWZ5KCZzdG9yYWdlX2RpciwgU3RvcmFnZUZpbGVUeXBlOjpGbGFnSW5mbywgIi4vdGVzdHMvZGF0YS92MS9mbGFnX3YxLmluZm8iKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmMvcGFja2FnZV90YWJsZV9xdWVyeS5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9wYWNrYWdlX3RhYmxlX3F1ZXJ5LnJzCmluZGV4IDJjYjg1NGIuLmIyMDY2OGYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9wYWNrYWdlX3RhYmxlX3F1ZXJ5LnJzCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyYy9wYWNrYWdlX3RhYmxlX3F1ZXJ5LnJzCkBAIC0xNiw5ICsxNiwxMCBAQAogCiAvLyEgcGFja2FnZSB0YWJsZSBxdWVyeSBtb2R1bGUgZGVmaW5lcyB0aGUgcGFja2FnZSB0YWJsZSBmaWxlIHJlYWQgZnJvbSBtYXBwZWQgYnl0ZXMKIAotdXNlIGNyYXRlOjp7QWNvbmZpZ1N0b3JhZ2VFcnJvciwgRklMRV9WRVJTSU9OfTsKK3VzZSBjcmF0ZTo6QWNvbmZpZ1N0b3JhZ2VFcnJvcjsKIHVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6ewogICAgIHBhY2thZ2VfdGFibGU6OlBhY2thZ2VUYWJsZUhlYWRlciwgcGFja2FnZV90YWJsZTo6UGFja2FnZVRhYmxlTm9kZSwgcmVhZF91MzJfZnJvbV9ieXRlcywKKyAgICBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiwKIH07CiB1c2UgYW55aG93Ojphbnlob3c7CiAKQEAgLTI3LDYgKzI4LDcgQEAKIHB1YiBzdHJ1Y3QgUGFja2FnZVJlYWRDb250ZXh0IHsKICAgICBwdWIgcGFja2FnZV9pZDogdTMyLAogICAgIHB1YiBib29sZWFuX3N0YXJ0X2luZGV4OiB1MzIsCisgICAgcHViIGZpbmdlcnByaW50OiB1NjQsCiB9CiAKIC8vLyBRdWVyeSBwYWNrYWdlIHJlYWQgY29udGV4dDogcGFja2FnZSBpZCBhbmQgc3RhcnQgaW5kZXgKQEAgLTM1LDExICszNywxMSBAQAogICAgIHBhY2thZ2U6ICZzdHIsCiApIC0+IFJlc3VsdDxPcHRpb248UGFja2FnZVJlYWRDb250ZXh0PiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4gewogICAgIGxldCBpbnRlcnByZXRlZF9oZWFkZXIgPSBQYWNrYWdlVGFibGVIZWFkZXI6OmZyb21fYnl0ZXMoYnVmKT87Ci0gICAgaWYgaW50ZXJwcmV0ZWRfaGVhZGVyLnZlcnNpb24gPiBGSUxFX1ZFUlNJT04geworICAgIGlmIGludGVycHJldGVkX2hlYWRlci52ZXJzaW9uID4gTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04gewogICAgICAgICByZXR1cm4gRXJyKEFjb25maWdTdG9yYWdlRXJyb3I6OkhpZ2hlclN0b3JhZ2VGaWxlVmVyc2lvbihhbnlob3chKAogICAgICAgICAgICAgIkNhbm5vdCByZWFkIHN0b3JhZ2UgZmlsZSB3aXRoIGEgaGlnaGVyIHZlcnNpb24gb2Yge30gd2l0aCBsaWIgdmVyc2lvbiB7fSIsCiAgICAgICAgICAgICBpbnRlcnByZXRlZF9oZWFkZXIudmVyc2lvbiwKLSAgICAgICAgICAgIEZJTEVfVkVSU0lPTgorICAgICAgICAgICAgTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04KICAgICAgICAgKSkpOwogICAgIH0KIApAQCAtNTUsMTEgKzU3LDEzIEBACiAgICAgfQogCiAgICAgbG9vcCB7Ci0gICAgICAgIGxldCBpbnRlcnByZXRlZF9ub2RlID0gUGFja2FnZVRhYmxlTm9kZTo6ZnJvbV9ieXRlcygmYnVmW3BhY2thZ2Vfbm9kZV9vZmZzZXQuLl0pPzsKKyAgICAgICAgbGV0IGludGVycHJldGVkX25vZGUgPQorICAgICAgICAgICAgUGFja2FnZVRhYmxlTm9kZTo6ZnJvbV9ieXRlcygmYnVmW3BhY2thZ2Vfbm9kZV9vZmZzZXQuLl0sIGludGVycHJldGVkX2hlYWRlci52ZXJzaW9uKT87CiAgICAgICAgIGlmIGludGVycHJldGVkX25vZGUucGFja2FnZV9uYW1lID09IHBhY2thZ2UgewogICAgICAgICAgICAgcmV0dXJuIE9rKFNvbWUoUGFja2FnZVJlYWRDb250ZXh0IHsKICAgICAgICAgICAgICAgICBwYWNrYWdlX2lkOiBpbnRlcnByZXRlZF9ub2RlLnBhY2thZ2VfaWQsCiAgICAgICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleDogaW50ZXJwcmV0ZWRfbm9kZS5ib29sZWFuX3N0YXJ0X2luZGV4LAorICAgICAgICAgICAgICAgIGZpbmdlcnByaW50OiBpbnRlcnByZXRlZF9ub2RlLmZpbmdlcnByaW50LAogICAgICAgICAgICAgfSkpOwogICAgICAgICB9CiAgICAgICAgIG1hdGNoIGludGVycHJldGVkX25vZGUubmV4dF9vZmZzZXQgewpAQCAtNzIsMjkgKzc2LDY4IEBACiAjW2NmZyh0ZXN0KV0KIG1vZCB0ZXN0cyB7CiAgICAgdXNlIHN1cGVyOjoqOwotICAgIHVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6dGVzdF91dGlsczo6Y3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZTsKKyAgICB1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6Ont0ZXN0X3V0aWxzOjpjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlLCBERUZBVUxUX0ZJTEVfVkVSU0lPTn07CiAKICAgICAjW3Rlc3RdCiAgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gdGFibGUgcXVlcnkKICAgICBmbiB0ZXN0X3BhY2thZ2VfcXVlcnkoKSB7Ci0gICAgICAgIGxldCBwYWNrYWdlX3RhYmxlID0gY3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZSgpLmludG9fYnl0ZXMoKTsKKyAgICAgICAgbGV0IHBhY2thZ2VfdGFibGUgPSBjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlKERFRkFVTFRfRklMRV9WRVJTSU9OKS5pbnRvX2J5dGVzKCk7CiAgICAgICAgIGxldCBwYWNrYWdlX2NvbnRleHQgPQogICAgICAgICAgICAgZmluZF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV90YWJsZVsuLl0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIikKICAgICAgICAgICAgICAgICAudW53cmFwKCkKICAgICAgICAgICAgICAgICAudW53cmFwKCk7Ci0gICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPSBQYWNrYWdlUmVhZENvbnRleHQgeyBwYWNrYWdlX2lkOiAwLCBib29sZWFuX3N0YXJ0X2luZGV4OiAwIH07CisgICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPQorICAgICAgICAgICAgUGFja2FnZVJlYWRDb250ZXh0IHsgcGFja2FnZV9pZDogMCwgYm9vbGVhbl9zdGFydF9pbmRleDogMCwgZmluZ2VycHJpbnQ6IDAgfTsKICAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX2NvbnRleHQsIGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCk7CiAgICAgICAgIGxldCBwYWNrYWdlX2NvbnRleHQgPQogICAgICAgICAgICAgZmluZF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV90YWJsZVsuLl0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIikKICAgICAgICAgICAgICAgICAudW53cmFwKCkKICAgICAgICAgICAgICAgICAudW53cmFwKCk7Ci0gICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPSBQYWNrYWdlUmVhZENvbnRleHQgeyBwYWNrYWdlX2lkOiAxLCBib29sZWFuX3N0YXJ0X2luZGV4OiAzIH07CisgICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPQorICAgICAgICAgICAgUGFja2FnZVJlYWRDb250ZXh0IHsgcGFja2FnZV9pZDogMSwgYm9vbGVhbl9zdGFydF9pbmRleDogMywgZmluZ2VycHJpbnQ6IDAgfTsKICAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX2NvbnRleHQsIGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCk7CiAgICAgICAgIGxldCBwYWNrYWdlX2NvbnRleHQgPQogICAgICAgICAgICAgZmluZF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV90YWJsZVsuLl0sICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80IikKICAgICAgICAgICAgICAgICAudW53cmFwKCkKICAgICAgICAgICAgICAgICAudW53cmFwKCk7Ci0gICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPSBQYWNrYWdlUmVhZENvbnRleHQgeyBwYWNrYWdlX2lkOiAyLCBib29sZWFuX3N0YXJ0X2luZGV4OiA2IH07CisgICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPQorICAgICAgICAgICAgUGFja2FnZVJlYWRDb250ZXh0IHsgcGFja2FnZV9pZDogMiwgYm9vbGVhbl9zdGFydF9pbmRleDogNiwgZmluZ2VycHJpbnQ6IDAgfTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX2NvbnRleHQsIGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHRhYmxlIHF1ZXJ5CisgICAgZm4gdGVzdF9wYWNrYWdlX3F1ZXJ5X3YyKCkgeworICAgICAgICBsZXQgcGFja2FnZV90YWJsZSA9IGNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUoMikuaW50b19ieXRlcygpOworICAgICAgICBsZXQgcGFja2FnZV9jb250ZXh0ID0KKyAgICAgICAgICAgIGZpbmRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfdGFibGVbLi5dLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIpCisgICAgICAgICAgICAgICAgLnVud3JhcCgpCisgICAgICAgICAgICAgICAgLnVud3JhcCgpOworICAgICAgICBsZXQgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0ID0gUGFja2FnZVJlYWRDb250ZXh0IHsKKyAgICAgICAgICAgIHBhY2thZ2VfaWQ6IDAsCisgICAgICAgICAgICBib29sZWFuX3N0YXJ0X2luZGV4OiAwLAorICAgICAgICAgICAgZmluZ2VycHJpbnQ6IDE1MjQ4OTQ4NTEwNTkwMTU4MDg2dTY0LAorICAgICAgICB9OworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VfY29udGV4dCwgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0KTsKKyAgICAgICAgbGV0IHBhY2thZ2VfY29udGV4dCA9CisgICAgICAgICAgICBmaW5kX3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX3RhYmxlWy4uXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiKQorICAgICAgICAgICAgICAgIC51bndyYXAoKQorICAgICAgICAgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCA9IFBhY2thZ2VSZWFkQ29udGV4dCB7CisgICAgICAgICAgICBwYWNrYWdlX2lkOiAxLAorICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleDogMywKKyAgICAgICAgICAgIGZpbmdlcnByaW50OiA0NDMxOTQwNTAyMjc0ODU3OTY0dTY0LAorICAgICAgICB9OworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VfY29udGV4dCwgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0KTsKKyAgICAgICAgbGV0IHBhY2thZ2VfY29udGV4dCA9CisgICAgICAgICAgICBmaW5kX3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX3RhYmxlWy4uXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiKQorICAgICAgICAgICAgICAgIC51bndyYXAoKQorICAgICAgICAgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCA9IFBhY2thZ2VSZWFkQ29udGV4dCB7CisgICAgICAgICAgICBwYWNrYWdlX2lkOiAyLAorICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleDogNiwKKyAgICAgICAgICAgIGZpbmdlcnByaW50OiAxNjIzMzIyOTkxNzcxMTYyMjM3NXU2NCwKKyAgICAgICAgfTsKICAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX2NvbnRleHQsIGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCk7CiAgICAgfQogCkBAIC0xMDIsNyArMTQ1LDcgQEAKICAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biB0YWJsZSBxdWVyeSBvZiBhIG5vbiBleGlzdCBwYWNrYWdlCiAgICAgZm4gdGVzdF9ub3RfZXhpc3RlZF9wYWNrYWdlX3F1ZXJ5KCkgewogICAgICAgICAvLyB0aGlzIHdpbGwgbGFuZCBhdCBhbiBlbXB0eSBidWNrZXQKLSAgICAgICAgbGV0IHBhY2thZ2VfdGFibGUgPSBjcmVhdGVfdGVzdF9wYWNrYWdlX3RhYmxlKCkuaW50b19ieXRlcygpOworICAgICAgICBsZXQgcGFja2FnZV90YWJsZSA9IGNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUoREVGQVVMVF9GSUxFX1ZFUlNJT04pLmludG9fYnl0ZXMoKTsKICAgICAgICAgbGV0IHBhY2thZ2VfY29udGV4dCA9CiAgICAgICAgICAgICBmaW5kX3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX3RhYmxlWy4uXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzMiKQogICAgICAgICAgICAgICAgIC51bndyYXAoKTsKQEAgLTExNyw4ICsxNjAsOCBAQAogICAgICNbdGVzdF0KICAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBxdWVyeSBlcnJvciB3aGVuIGZpbGUgaGFzIGEgaGlnaGVyIHZlcnNpb24KICAgICBmbiB0ZXN0X2hpZ2hlcl92ZXJzaW9uX3N0b3JhZ2VfZmlsZSgpIHsKLSAgICAgICAgbGV0IG11dCB0YWJsZSA9IGNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUoKTsKLSAgICAgICAgdGFibGUuaGVhZGVyLnZlcnNpb24gPSBjcmF0ZTo6RklMRV9WRVJTSU9OICsgMTsKKyAgICAgICAgbGV0IG11dCB0YWJsZSA9IGNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUoREVGQVVMVF9GSUxFX1ZFUlNJT04pOworICAgICAgICB0YWJsZS5oZWFkZXIudmVyc2lvbiA9IE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OICsgMTsKICAgICAgICAgbGV0IHBhY2thZ2VfdGFibGUgPSB0YWJsZS5pbnRvX2J5dGVzKCk7CiAgICAgICAgIGxldCBlcnJvciA9CiAgICAgICAgICAgICBmaW5kX3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX3RhYmxlWy4uXSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzEiKQpAQCAtMTI3LDggKzE3MCw4IEBACiAgICAgICAgICAgICBmb3JtYXQhKCJ7Oj99IiwgZXJyb3IpLAogICAgICAgICAgICAgZm9ybWF0ISgKICAgICAgICAgICAgICAgICAiSGlnaGVyU3RvcmFnZUZpbGVWZXJzaW9uKENhbm5vdCByZWFkIHN0b3JhZ2UgZmlsZSB3aXRoIGEgaGlnaGVyIHZlcnNpb24gb2Yge30gd2l0aCBsaWIgdmVyc2lvbiB7fSkiLAotICAgICAgICAgICAgICAgIGNyYXRlOjpGSUxFX1ZFUlNJT04gKyAxLAotICAgICAgICAgICAgICAgIGNyYXRlOjpGSUxFX1ZFUlNJT04KKyAgICAgICAgICAgICAgICBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiArIDEsCisgICAgICAgICAgICAgICAgTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04KICAgICAgICAgICAgICkKICAgICAgICAgKTsKICAgICB9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1N0b3JhZ2VJbnRlcm5hbFJlYWRlci5qYXZhIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvc3Jjcy9hbmRyb2lkL2Fjb25maWcvc3RvcmFnZS9TdG9yYWdlSW50ZXJuYWxSZWFkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjllYmVlNS4uMDAwMDAwMAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2FuZHJvaWQvYWNvbmZpZy9zdG9yYWdlL1N0b3JhZ2VJbnRlcm5hbFJlYWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2U7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbXBhdC5hbm5vdGF0aW9uLlVuc3VwcG9ydGVkQXBwVXNhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TdHJpY3RNb2RlOwotCi1pbXBvcnQgamF2YS5pby5DbG9zZWFibGU7Ci1pbXBvcnQgamF2YS5uaW8uTWFwcGVkQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKLWltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOwotaW1wb3J0IGphdmEubmlvLmZpbGUuU3RhbmRhcmRPcGVuT3B0aW9uOwotCi0vKiogQGhpZGUgKi8KLXB1YmxpYyBjbGFzcyBTdG9yYWdlSW50ZXJuYWxSZWFkZXIgewotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUF9QQVRIID0gIi9tZXRhZGF0YS9hY29uZmlnL21hcHMvIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PVF9QQVRIID0gIi9tZXRhZGF0YS9hY29uZmlnL2Jvb3QvIjsKLQotICAgIHByaXZhdGUgUGFja2FnZVRhYmxlIG1QYWNrYWdlVGFibGU7Ci0gICAgcHJpdmF0ZSBGbGFnVmFsdWVMaXN0IG1GbGFnVmFsdWVMaXN0OwotCi0gICAgcHJpdmF0ZSBpbnQgbVBhY2thZ2VCb29sZWFuU3RhcnRPZmZzZXQ7Ci0KLSAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQotICAgIHB1YmxpYyBTdG9yYWdlSW50ZXJuYWxSZWFkZXIoU3RyaW5nIGNvbnRhaW5lciwgU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0gICAgICAgIHRoaXMocGFja2FnZU5hbWUsIE1BUF9QQVRIICsgY29udGFpbmVyICsgIi5wYWNrYWdlLm1hcCIsIEJPT1RfUEFUSCArIGNvbnRhaW5lciArICIudmFsIik7Ci0gICAgfQotCi0gICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKLSAgICBwdWJsaWMgU3RvcmFnZUludGVybmFsUmVhZGVyKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHBhY2thZ2VNYXBGaWxlLCBTdHJpbmcgZmxhZ1ZhbHVlRmlsZSkgewotICAgICAgICBTdHJpY3RNb2RlLlRocmVhZFBvbGljeSBvbGRQb2xpY3kgPSBTdHJpY3RNb2RlLmFsbG93VGhyZWFkRGlza1JlYWRzKCk7Ci0gICAgICAgIG1QYWNrYWdlVGFibGUgPSBQYWNrYWdlVGFibGUuZnJvbUJ5dGVzKG1hcFN0b3JhZ2VGaWxlKHBhY2thZ2VNYXBGaWxlKSk7Ci0gICAgICAgIG1GbGFnVmFsdWVMaXN0ID0gRmxhZ1ZhbHVlTGlzdC5mcm9tQnl0ZXMobWFwU3RvcmFnZUZpbGUoZmxhZ1ZhbHVlRmlsZSkpOwotICAgICAgICBTdHJpY3RNb2RlLnNldFRocmVhZFBvbGljeShvbGRQb2xpY3kpOwotICAgICAgICBtUGFja2FnZUJvb2xlYW5TdGFydE9mZnNldCA9IGdldFBhY2thZ2VCb29sZWFuU3RhcnRPZmZzZXQocGFja2FnZU5hbWUpOwotICAgIH0KLQotICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbkZsYWdWYWx1ZShpbnQgaW5kZXgpIHsKLSAgICAgICAgaW5kZXggKz0gbVBhY2thZ2VCb29sZWFuU3RhcnRPZmZzZXQ7Ci0gICAgICAgIGlmIChpbmRleCA+PSBtRmxhZ1ZhbHVlTGlzdC5zaXplKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbigiRmFpbCB0byBnZXQgYm9vbGVhbiBmbGFnIHZhbHVlIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1GbGFnVmFsdWVMaXN0LmdldEJvb2xlYW4oaW5kZXgpOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldFBhY2thZ2VCb29sZWFuU3RhcnRPZmZzZXQoU3RyaW5nIHBhY2thZ2VOYW1lKSB7Ci0gICAgICAgIFBhY2thZ2VUYWJsZS5Ob2RlIHBOb2RlID0gbVBhY2thZ2VUYWJsZS5nZXQocGFja2FnZU5hbWUpOwotICAgICAgICBpZiAocE5vZGUgPT0gbnVsbCkgewotICAgICAgICAgICAgUGFja2FnZVRhYmxlLkhlYWRlciBoZWFkZXIgPSBtUGFja2FnZVRhYmxlLmdldEhlYWRlcigpOwotICAgICAgICAgICAgdGhyb3cgbmV3IEFjb25maWdTdG9yYWdlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGYWlsIHRvIGdldCBwYWNrYWdlICVzIGZyb20gY29udGFpbmVyICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwgaGVhZGVyLmdldENvbnRhaW5lcigpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHBOb2RlLmdldEJvb2xlYW5TdGFydEluZGV4KCk7Ci0gICAgfQotCi0gICAgLy8gTWFwIGEgc3RvcmFnZSBmaWxlIGdpdmVuIGZpbGUgcGF0aAotICAgIHByaXZhdGUgc3RhdGljIE1hcHBlZEJ5dGVCdWZmZXIgbWFwU3RvcmFnZUZpbGUoU3RyaW5nIGZpbGUpIHsKLSAgICAgICAgRmlsZUNoYW5uZWwgY2hhbm5lbCA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjaGFubmVsID0gRmlsZUNoYW5uZWwub3BlbihQYXRocy5nZXQoZmlsZSksIFN0YW5kYXJkT3Blbk9wdGlvbi5SRUFEKTsKLSAgICAgICAgICAgIHJldHVybiBjaGFubmVsLm1hcChGaWxlQ2hhbm5lbC5NYXBNb2RlLlJFQURfT05MWSwgMCwgY2hhbm5lbC5zaXplKCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFjb25maWdTdG9yYWdlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJGYWlsIHRvIG1tYXAgc3RvcmFnZSBmaWxlICVzIiwgZmlsZSksIGUpOwotICAgICAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgcXVpZXRseURpc3Bvc2UoY2hhbm5lbCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHF1aWV0bHlEaXNwb3NlKENsb3NlYWJsZSBjbG9zYWJsZSkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgaWYgKGNsb3NhYmxlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjbG9zYWJsZS5jbG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gbm8gbmVlZCB0byBjYXJlLCBhdCBsZWFzdCBhcyBvZiBub3cKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyY3MvYW5kcm9pZC9vcy9mbGFnZ2luZy9QbGF0Zm9ybUFjb25maWdQYWNrYWdlLmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2FuZHJvaWQvb3MvZmxhZ2dpbmcvUGxhdGZvcm1BY29uZmlnUGFja2FnZS5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkYWQyNDkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2FuZHJvaWQvb3MvZmxhZ2dpbmcvUGxhdGZvcm1BY29uZmlnUGFja2FnZS5qYXZhCkBAIC0wLDAgKzEsMTc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBhbmRyb2lkLm9zLmZsYWdnaW5nOworCitpbXBvcnQgc3RhdGljIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLlRhYmxlVXRpbHMuU3RvcmFnZUZpbGVzQnVuZGxlOworCitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmxhZ1RhYmxlOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdWYWx1ZUxpc3Q7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuUGFja2FnZVRhYmxlOworaW1wb3J0IGFuZHJvaWQuY29tcGF0LmFubm90YXRpb24uVW5zdXBwb3J0ZWRBcHBVc2FnZTsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5DbG9zZWFibGU7CitpbXBvcnQgamF2YS5uaW8uTWFwcGVkQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLm5pby5jaGFubmVscy5GaWxlQ2hhbm5lbDsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOworaW1wb3J0IGphdmEubmlvLmZpbGUuU3RhbmRhcmRPcGVuT3B0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworLyoqCisgKiBBbiB7QGNvZGUgYWNvbmZpZ30gcGFja2FnZSBjb250YWluaW5nIHRoZSBlbmFibGVkIHN0YXRlIG9mIGl0cyBmbGFncy4KKyAqCisgKiA8cD48c3Ryb25nPk5vdGU6IHRoaXMgaXMgaW50ZW5kZWQgb25seSB0byBiZSB1c2VkIGJ5IGdlbmVyYXRlZCBjb2RlLiBUbyBkZXRlcm1pbmUgaWYgYSBnaXZlbiBmbGFnCisgKiBpcyBlbmFibGVkIGluIGFwcCBjb2RlLCB0aGUgZ2VuZXJhdGVkIGFuZHJvaWQgZmxhZ3Mgc2hvdWxkIGJlIHVzZWQuPC9zdHJvbmc+CisgKgorICogPHA+VGhpcyBjbGFzcyBpcyB1c2VkIHRvIHJlYWQgdGhlIGZsYWcgZnJvbSBwbGF0Zm9ybSBBY29uZmlnIFBhY2thZ2UuRWFjaCBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzCisgKiB3aWxsIGNhY2hlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gb25lIHBhY2thZ2UuIFRvIHJlYWQgZmxhZ3MgZnJvbSBhIGRpZmZlcmVudCBwYWNrYWdlLCBhIG5ldworICogaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBzaG91bGQgYmUge0BsaW5rICNsb2FkIGxvYWRlZH0uCisgKgorICogQGhpZGUKKyAqLworcHVibGljIGNsYXNzIFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2UgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiUGxhdGZvcm1BY29uZmlnUGFja2FnZSI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIE1BUF9QQVRIID0gIi9tZXRhZGF0YS9hY29uZmlnL21hcHMvIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgQk9PVF9QQVRIID0gIi9tZXRhZGF0YS9hY29uZmlnL2Jvb3QvIjsKKworICAgIHByaXZhdGUgRmxhZ1RhYmxlIG1GbGFnVGFibGU7CisgICAgcHJpdmF0ZSBGbGFnVmFsdWVMaXN0IG1GbGFnVmFsdWVMaXN0OworCisgICAgcHJpdmF0ZSBpbnQgbVBhY2thZ2VCb29sZWFuU3RhcnRPZmZzZXQgPSAtMTsKKyAgICBwcml2YXRlIGludCBtUGFja2FnZUlkID0gLTE7CisKKyAgICBwcml2YXRlIFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2UoKSB7fQorCisgICAgLyoqIEBoaWRlICovCisgICAgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIFN0b3JhZ2VGaWxlc0J1bmRsZT4gc1N0b3JhZ2VGaWxlc0NhY2hlID0gbmV3IEhhc2hNYXA8PigpOworCisgICAgLyoqIEBoaWRlICovCisgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFNldDxTdHJpbmc+IFBMQVRGT1JNX1BBQ0tBR0VfTUFQX0ZJTEVTID0KKyAgICAgICAgICAgIFNldC5vZigic3lzdGVtLnBhY2thZ2UubWFwIiwgInZlbmRvci5wYWNrYWdlLm1hcCIsICJwcm9kdWN0LnBhY2thZ2UubWFwIik7CisKKyAgICBzdGF0aWMgeworICAgICAgICBmb3IgKFN0cmluZyBwZiA6IFBMQVRGT1JNX1BBQ0tBR0VfTUFQX0ZJTEVTKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIFBhY2thZ2VUYWJsZSBwVGFibGUgPSBQYWNrYWdlVGFibGUuZnJvbUJ5dGVzKG1hcFN0b3JhZ2VGaWxlKE1BUF9QQVRIICsgcGYpKTsKKyAgICAgICAgICAgICAgICBTdHJpbmcgY29udGFpbmVyID0gcFRhYmxlLmdldEhlYWRlcigpLmdldENvbnRhaW5lcigpOworICAgICAgICAgICAgICAgIEZsYWdUYWJsZSBmVGFibGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgRmxhZ1RhYmxlLmZyb21CeXRlcyhtYXBTdG9yYWdlRmlsZShNQVBfUEFUSCArIGNvbnRhaW5lciArICIuZmxhZy5tYXAiKSk7CisgICAgICAgICAgICAgICAgRmxhZ1ZhbHVlTGlzdCBmVmFsdWVMaXN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdWYWx1ZUxpc3QuZnJvbUJ5dGVzKG1hcFN0b3JhZ2VGaWxlKEJPT1RfUEFUSCArIGNvbnRhaW5lciArICIudmFsIikpOworICAgICAgICAgICAgICAgIFN0b3JhZ2VGaWxlc0J1bmRsZSBmaWxlcyA9IG5ldyBTdG9yYWdlRmlsZXNCdW5kbGUocFRhYmxlLCBmVGFibGUsIGZWYWx1ZUxpc3QpOworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIHBhY2thZ2VOYW1lIDogcFRhYmxlLmdldFBhY2thZ2VMaXN0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgc1N0b3JhZ2VGaWxlc0NhY2hlLnB1dChwYWNrYWdlTmFtZSwgZmlsZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgLy8gcGFzcworICAgICAgICAgICAgICAgIExvZy53KFRBRywgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIExvYWRzIGEgcGxhdGZvcm0gQWNvbmZpZyBQYWNrYWdlIGZyb20gQWNvbmZpZyBTdG9yYWdlLgorICAgICAqCisgICAgICogPHA+VGhpcyBtZXRob2QgYXR0ZW1wdHMgdG8gbG9hZCB0aGUgc3BlY2lmaWVkIHBsYXRmb3JtIEFjb25maWcgcGFja2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYWNrYWdlTmFtZSBUaGUgbmFtZSBvZiB0aGUgQWNvbmZpZyBwYWNrYWdlIHRvIGxvYWQuCisgICAgICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgUGxhdGZvcm1BY29uZmlnUGFja2FnZX0sIHdoaWNoIG1heSBiZSBlbXB0eSBpZiB0aGUgcGFja2FnZSBpcworICAgICAqICAgICBub3QgZm91bmQgaW4gdGhlIGNvbnRhaW5lci4gTnVsbCBpZiB0aGUgcGFja2FnZSBpcyBub3QgZm91bmQgaW4gcGxhdGZvcm0gcGFydGl0aW9ucy4KKyAgICAgKiBAdGhyb3dzIEFjb25maWdTdG9yYWdlUmVhZEV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBlcnJvciByZWFkaW5nIGZyb20gQWNvbmZpZyBTdG9yYWdlLCBzdWNoCisgICAgICogICAgIGFzIGlmIHRoZSBzdG9yYWdlIHN5c3RlbSBpcyBub3QgZm91bmQsIG9yIHRoZXJlIGlzIGFuIGVycm9yIHJlYWRpbmcgdGhlIHN0b3JhZ2UgZmlsZS4gVGhlCisgICAgICogICAgIHNwZWNpZmljIGVycm9yIGNvZGUgY2FuIGJlIGdvdCB1c2luZyB7QGxpbmsgQWNvbmZpZ1N0b3JhZ2VSZWFkRXhjZXB0aW9uI2dldEVycm9yQ29kZSgpfS4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgcHVibGljIHN0YXRpYyBQbGF0Zm9ybUFjb25maWdQYWNrYWdlIGxvYWQoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBQbGF0Zm9ybUFjb25maWdQYWNrYWdlIGFjb25maWdQYWNrYWdlID0gbmV3IFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2UoKTsKKyAgICAgICAgICAgIFN0b3JhZ2VGaWxlc0J1bmRsZSBmaWxlcyA9IHNTdG9yYWdlRmlsZXNDYWNoZS5nZXQocGFja2FnZU5hbWUpOworICAgICAgICAgICAgaWYgKGZpbGVzID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFBhY2thZ2VUYWJsZS5Ob2RlIHBOb2RlID0gZmlsZXMucGFja2FnZVRhYmxlLmdldChwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBhY29uZmlnUGFja2FnZS5tRmxhZ1RhYmxlID0gZmlsZXMuZmxhZ1RhYmxlOworICAgICAgICAgICAgYWNvbmZpZ1BhY2thZ2UubUZsYWdWYWx1ZUxpc3QgPSBmaWxlcy5mbGFnVmFsdWVMaXN0OworICAgICAgICAgICAgYWNvbmZpZ1BhY2thZ2UubVBhY2thZ2VCb29sZWFuU3RhcnRPZmZzZXQgPSBwTm9kZS5nZXRCb29sZWFuU3RhcnRJbmRleCgpOworICAgICAgICAgICAgYWNvbmZpZ1BhY2thZ2UubVBhY2thZ2VJZCA9IHBOb2RlLmdldFBhY2thZ2VJZCgpOworICAgICAgICAgICAgcmV0dXJuIGFjb25maWdQYWNrYWdlOworICAgICAgICB9IGNhdGNoIChBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQWNvbmZpZ1N0b3JhZ2VSZWFkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBlLmdldEVycm9yQ29kZSgpLCAiRmFpbCB0byBjcmVhdGUgQWNvbmZpZ1BhY2thZ2UiLCBlKTsKKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBY29uZmlnU3RvcmFnZVJlYWRFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIEFjb25maWdTdG9yYWdlUmVhZEV4Y2VwdGlvbi5FUlJPUl9HRU5FUklDLAorICAgICAgICAgICAgICAgICAgICAiRmFpbCB0byBjcmVhdGUgUGxhdGZvcm1BY29uZmlnUGFja2FnZSIsCisgICAgICAgICAgICAgICAgICAgIGUpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBhIGJvb2xlYW4gZmxhZy4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIHJldHJpZXZlcyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBmbGFnLiBJZiB0aGUgZmxhZyBleGlzdHMgd2l0aGluIHRoZQorICAgICAqIGxvYWRlZCBBY29uZmlnIFBhY2thZ2UsIGl0cyB2YWx1ZSBpcyByZXR1cm5lZC4gT3RoZXJ3aXNlLCB0aGUgcHJvdmlkZWQgYGRlZmF1bHRWYWx1ZWAgaXMKKyAgICAgKiByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmbGFnTmFtZSBUaGUgbmFtZSBvZiB0aGUgZmxhZyAoZXhjbHVkaW5nIGFueSBwYWNrYWdlIG5hbWUgcHJlZml4KS4KKyAgICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlIFRoZSB2YWx1ZSB0byByZXR1cm4gaWYgdGhlIGZsYWcgaXMgbm90IGZvdW5kLgorICAgICAqIEByZXR1cm4gVGhlIGJvb2xlYW4gdmFsdWUgb2YgdGhlIGZsYWcsIG9yIGBkZWZhdWx0VmFsdWVgIGlmIHRoZSBmbGFnIGlzIG5vdCBmb3VuZC4KKyAgICAgKiBAaGlkZQorICAgICAqLworICAgIEBVbnN1cHBvcnRlZEFwcFVzYWdlCisgICAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbkZsYWdWYWx1ZShTdHJpbmcgZmxhZ05hbWUsIGJvb2xlYW4gZGVmYXVsdFZhbHVlKSB7CisgICAgICAgIEZsYWdUYWJsZS5Ob2RlIGZOb2RlID0gbUZsYWdUYWJsZS5nZXQobVBhY2thZ2VJZCwgZmxhZ05hbWUpOworICAgICAgICBpZiAoZk5vZGUgPT0gbnVsbCkgeworICAgICAgICAgICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUZsYWdWYWx1ZUxpc3QuZ2V0Qm9vbGVhbihmTm9kZS5nZXRGbGFnSW5kZXgoKSArIG1QYWNrYWdlQm9vbGVhblN0YXJ0T2Zmc2V0KTsKKyAgICB9CisKKyAgICAvLyBNYXAgYSBzdG9yYWdlIGZpbGUgZ2l2ZW4gZmlsZSBwYXRoCisgICAgcHJpdmF0ZSBzdGF0aWMgTWFwcGVkQnl0ZUJ1ZmZlciBtYXBTdG9yYWdlRmlsZShTdHJpbmcgZmlsZSkgeworICAgICAgICBGaWxlQ2hhbm5lbCBjaGFubmVsID0gbnVsbDsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGNoYW5uZWwgPSBGaWxlQ2hhbm5lbC5vcGVuKFBhdGhzLmdldChmaWxlKSwgU3RhbmRhcmRPcGVuT3B0aW9uLlJFQUQpOworICAgICAgICAgICAgcmV0dXJuIGNoYW5uZWwubWFwKEZpbGVDaGFubmVsLk1hcE1vZGUuUkVBRF9PTkxZLCAwLCBjaGFubmVsLnNpemUoKSk7CisgICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQWNvbmZpZ1N0b3JhZ2VSZWFkRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICBBY29uZmlnU3RvcmFnZVJlYWRFeGNlcHRpb24uRVJST1JfQ0FOTk9UX1JFQURfU1RPUkFHRV9GSUxFLAorICAgICAgICAgICAgICAgICAgICAiRmFpbCB0byBtbWFwIHN0b3JhZ2UiLAorICAgICAgICAgICAgICAgICAgICBlKTsKKyAgICAgICAgfSBmaW5hbGx5IHsKKyAgICAgICAgICAgIHF1aWV0bHlEaXNwb3NlKGNoYW5uZWwpOworICAgICAgICB9CisgICAgfQorCisgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBxdWlldGx5RGlzcG9zZShDbG9zZWFibGUgY2xvc2FibGUpIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIGlmIChjbG9zYWJsZSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgY2xvc2FibGUuY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgIC8vIG5vIG5lZWQgdG8gY2FyZSwgYXQgbGVhc3QgYXMgb2Ygbm93CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2FuZHJvaWQvb3MvZmxhZ2dpbmcvUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsLmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS9zcmNzL2FuZHJvaWQvb3MvZmxhZ2dpbmcvUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGExOGZiOQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3NyY3MvYW5kcm9pZC9vcy9mbGFnZ2luZy9QbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwuamF2YQpAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5vcy5mbGFnZ2luZzsKKworaW1wb3J0IHN0YXRpYyBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5UYWJsZVV0aWxzLlN0b3JhZ2VGaWxlc0J1bmRsZTsKKworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkFjb25maWdTdG9yYWdlRXhjZXB0aW9uOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdWYWx1ZUxpc3Q7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuUGFja2FnZVRhYmxlOworaW1wb3J0IGFuZHJvaWQuY29tcGF0LmFubm90YXRpb24uVW5zdXBwb3J0ZWRBcHBVc2FnZTsKKworLyoqCisgKiBBbiB7QGNvZGUgYWNvbmZpZ30gcGFja2FnZSBjb250YWluaW5nIHRoZSBlbmFibGVkIHN0YXRlIG9mIGl0cyBmbGFncy4KKyAqCisgKiA8cD48c3Ryb25nPk5vdGU6IHRoaXMgaXMgaW50ZW5kZWQgb25seSB0byBiZSB1c2VkIGJ5IGdlbmVyYXRlZCBjb2RlLiBUbyBkZXRlcm1pbmUgaWYgYSBnaXZlbiBmbGFnCisgKiBpcyBlbmFibGVkIGluIGFwcCBjb2RlLCB0aGUgZ2VuZXJhdGVkIGFuZHJvaWQgZmxhZ3Mgc2hvdWxkIGJlIHVzZWQuPC9zdHJvbmc+CisgKgorICogPHA+VGhpcyBjbGFzcyBpcyBub3QgcGFydCBvZiB0aGUgcHVibGljIEFQSSBhbmQgc2hvdWxkIGJlIHVzZWQgYnkgQWNub2ZpZyBGbGFnIGludGVybmFsbHkgPC9iPiBJdAorICogaXMgaW50ZW5kZWQgZm9yIGludGVybmFsIHVzZSBvbmx5IGFuZCB3aWxsIGJlIGNoYW5nZWQgb3IgcmVtb3ZlZCB3aXRob3V0IG5vdGljZS4KKyAqCisgKiA8cD5UaGlzIGNsYXNzIGlzIHVzZWQgdG8gcmVhZCB0aGUgZmxhZyBmcm9tIEFjb25maWcgUGFja2FnZS5FYWNoIGluc3RhbmNlIG9mIHRoaXMgY2xhc3Mgd2lsbAorICogY2FjaGUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byBvbmUgcGFja2FnZS4gVG8gcmVhZCBmbGFncyBmcm9tIGEgZGlmZmVyZW50IHBhY2thZ2UsIGEgbmV3IGluc3RhbmNlCisgKiBvZiB0aGlzIGNsYXNzIHNob3VsZCBiZSB7QGxpbmsgI2xvYWQgbG9hZGVkfS4KKyAqCisgKiBAaGlkZQorICovCitwdWJsaWMgY2xhc3MgUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsIHsKKworICAgIHByaXZhdGUgZmluYWwgRmxhZ1ZhbHVlTGlzdCBtRmxhZ1ZhbHVlTGlzdDsKKyAgICBwcml2YXRlIGZpbmFsIGludCBtUGFja2FnZUJvb2xlYW5TdGFydE9mZnNldDsKKworICAgIHByaXZhdGUgUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsKAorICAgICAgICAgICAgRmxhZ1ZhbHVlTGlzdCBmbGFnVmFsdWVMaXN0LCBpbnQgcGFja2FnZUJvb2xlYW5TdGFydE9mZnNldCkgeworICAgICAgICB0aGlzLm1GbGFnVmFsdWVMaXN0ID0gZmxhZ1ZhbHVlTGlzdDsKKyAgICAgICAgdGhpcy5tUGFja2FnZUJvb2xlYW5TdGFydE9mZnNldCA9IHBhY2thZ2VCb29sZWFuU3RhcnRPZmZzZXQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogTG9hZHMgYW4gQWNvbmZpZyBwYWNrYWdlIGZyb20gdGhlIHNwZWNpZmllZCBjb250YWluZXIgYW5kIHZlcmlmaWVzIGl0cyBmaW5nZXJwcmludC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIGlzIGludGVuZGVkIGZvciBpbnRlcm5hbCB1c2Ugb25seSBhbmQgbWF5IGJlIGNoYW5nZWQgb3IgcmVtb3ZlZCB3aXRob3V0CisgICAgICogbm90aWNlLgorICAgICAqCisgICAgICogQHBhcmFtIHBhY2thZ2VOYW1lIFRoZSBuYW1lIG9mIHRoZSBBY29uZmlnIHBhY2thZ2UuCisgICAgICogQHBhcmFtIHBhY2thZ2VGaW5nZXJwcmludCBUaGUgZXhwZWN0ZWQgZmluZ2VycHJpbnQgb2YgdGhlIHBhY2thZ2UuCisgICAgICogQHJldHVybiBBbiBpbnN0YW5jZSBvZiB7QGxpbmsgUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsfSByZXByZXNlbnRpbmcgdGhlIGxvYWRlZAorICAgICAqICAgICBwYWNrYWdlLgorICAgICAqIEBoaWRlCisgICAgICovCisgICAgQFVuc3VwcG9ydGVkQXBwVXNhZ2UKKyAgICBwdWJsaWMgc3RhdGljIFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbCBsb2FkKFN0cmluZyBwYWNrYWdlTmFtZSwgbG9uZyBwYWNrYWdlRmluZ2VycHJpbnQpIHsKKyAgICAgICAgU3RvcmFnZUZpbGVzQnVuZGxlIGZpbGVzID0gUGxhdGZvcm1BY29uZmlnUGFja2FnZS5zU3RvcmFnZUZpbGVzQ2FjaGUuZ2V0KHBhY2thZ2VOYW1lKTsKKyAgICAgICAgaWYgKGZpbGVzID09IG51bGwpIHsKKyAgICAgICAgICAgIHRocm93IG5ldyBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbigKKyAgICAgICAgICAgICAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24uRVJST1JfUEFDS0FHRV9OT1RfRk9VTkQsCisgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlICIgKyBwYWNrYWdlTmFtZSArICIgY2Fubm90IGJlIGZvdW5kIG9uIHRoZSBkZXZpY2UiKTsKKyAgICAgICAgfQorICAgICAgICBQYWNrYWdlVGFibGUuTm9kZSBwTm9kZSA9IGZpbGVzLnBhY2thZ2VUYWJsZS5nZXQocGFja2FnZU5hbWUpOworICAgICAgICBGbGFnVmFsdWVMaXN0IHZMaXN0ID0gZmlsZXMuZmxhZ1ZhbHVlTGlzdDsKKworICAgICAgICBpZiAocE5vZGUuaGFzUGFja2FnZUZpbmdlcnByaW50KCkgJiYgcGFja2FnZUZpbmdlcnByaW50ICE9IHBOb2RlLmdldFBhY2thZ2VGaW5nZXJwcmludCgpKSB7CisgICAgICAgICAgICB0aHJvdyBuZXcgQWNvbmZpZ1N0b3JhZ2VFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgIEFjb25maWdTdG9yYWdlRXhjZXB0aW9uLkVSUk9SX0ZJTEVfRklOR0VSUFJJTlRfTUlTTUFUQ0gsCisgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlICIgKyBwYWNrYWdlTmFtZSArICJmaW5nZXJwcmludCBkb2Vzbid0IG1hdGNoIHRoZSBvbmUgb24gZGV2aWNlIik7CisgICAgICAgIH0KKworICAgICAgICByZXR1cm4gbmV3IFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbCh2TGlzdCwgcE5vZGUuZ2V0Qm9vbGVhblN0YXJ0SW5kZXgoKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSB2YWx1ZSBvZiBhIGJvb2xlYW4gZmxhZyB1c2luZyBpdHMgaW5kZXguCisgICAgICoKKyAgICAgKiA8cD5UaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkgYW5kIG1heSBiZSBjaGFuZ2VkIG9yIHJlbW92ZWQgd2l0aG91dAorICAgICAqIG5vdGljZS4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgbWV0aG9kIHJldHJpZXZlcyB0aGUgdmFsdWUgb2YgYSBmbGFnIHdpdGhpbiB0aGUgbG9hZGVkIEFjb25maWcgcGFja2FnZSB1c2luZyBpdHMKKyAgICAgKiBpbmRleC4gVGhlIGluZGV4IGlzIGdlbmVyYXRlZCBhdCBidWlsZCB0aW1lIGFuZCBtYXkgdmFyeSBiZXR3ZWVuIGJ1aWxkcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGZsYWcgd2l0aGluIHRoZSBwYWNrYWdlLgorICAgICAqIEByZXR1cm4gVGhlIGJvb2xlYW4gdmFsdWUgb2YgdGhlIGZsYWcuCisgICAgICogQGhpZGUKKyAgICAgKi8KKyAgICBAVW5zdXBwb3J0ZWRBcHBVc2FnZQorICAgIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW5GbGFnVmFsdWUoaW50IGluZGV4KSB7CisgICAgICAgIHJldHVybiBtRmxhZ1ZhbHVlTGlzdC5nZXRCb29sZWFuKGluZGV4ICsgbVBhY2thZ2VCb29sZWFuU3RhcnRPZmZzZXQpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2phdmEvQW5kcm9pZFRlc3QueG1sIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvQWNvbmZpZ1N0b3JhZ2VSZWFkRnVuY3Rpb25hbFRlc3QueG1sCnNpbWlsYXJpdHkgaW5kZXggODklCnJlbmFtZSBmcm9tIHRvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2phdmEvQW5kcm9pZFRlc3QueG1sCnJlbmFtZSB0byB0b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9BY29uZmlnU3RvcmFnZVJlYWRGdW5jdGlvbmFsVGVzdC54bWwKaW5kZXggOTljOWUyNS4uZWU1MDA2MCAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvamF2YS9BbmRyb2lkVGVzdC54bWwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvQWNvbmZpZ1N0b3JhZ2VSZWFkRnVuY3Rpb25hbFRlc3QueG1sCkBAIC0yNiw3ICsyNiw3IEBACiAgICAgPC90YXJnZXRfcHJlcGFyZXI+CiAKICAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlRlc3RBcHBJbnN0YWxsU2V0dXAiPgotICAgICAgICA8b3B0aW9uIG5hbWU9InRlc3QtZmlsZS1uYW1lIiB2YWx1ZT0iYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpLnRlc3QuamF2YS5hcGsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJhY29uZmlnX3N0b3JhZ2VfcmVhZF9mdW5jdGlvbmFsLmFwayIgLz4KICAgICA8L3RhcmdldF9wcmVwYXJlcj4KIAogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuRGlzYWJsZVNFTGludXhUYXJnZXRQcmVwYXJlciIgLz4KQEAgLTM1LDE3ICszNSwxNyBAQAogICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUHVzaEZpbGVQcmVwYXJlciI+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+CiAgICAgICAgIDxvcHRpb24gbmFtZT0iYWJvcnQtb24tcHVzaC1mYWlsdXJlIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiIGtleT0icGFja2FnZS5tYXAiCisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIiBrZXk9InBhY2thZ2VfdjEubWFwIgogICAgICAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvYWNvbmZpZ19qYXZhX2FwaV90ZXN0L21hcHMvbW9ja3VwLnBhY2thZ2UubWFwIiAvPgotICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIga2V5PSJmbGFnLm1hcCIKKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiIGtleT0iZmxhZ192MS5tYXAiCiAgICAgICAgICAgICAgICAgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcC9hY29uZmlnX2phdmFfYXBpX3Rlc3QvbWFwcy9tb2NrdXAuZmxhZy5tYXAiIC8+Ci0gICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIiBrZXk9ImZsYWcudmFsIgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIga2V5PSJmbGFnX3YxLnZhbCIKICAgICAgICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL2Fjb25maWdfamF2YV9hcGlfdGVzdC9ib290L21vY2t1cC52YWwiIC8+CiAgICAgPC90YXJnZXRfcHJlcGFyZXI+CiAKICAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQW5kcm9pZEpVbml0VGVzdCIgPgogICAgICAgICA8b3B0aW9uIG5hbWU9InJ1bm5lciIgdmFsdWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIgLz4KLSAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5hY29uZmlnX3N0b3JhZ2UudGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwYWNrYWdlIiB2YWx1ZT0iYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdCIgLz4KICAgICAgICAgPG9wdGlvbiBuYW1lPSJydW50aW1lLWhpbnQiIHZhbHVlPSIxbSIgLz4KICAgICA8L3Rlc3Q+Ci08L2NvbmZpZ3VyYXRpb24+Cis8L2NvbmZpZ3VyYXRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvQW5kcm9pZC5icCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggZWQwYzcyOC4uYzA3MWY3YyAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvQW5kcm9pZC5icAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xLDkgKzEsMTQgQEAKIGZpbGVncm91cCB7CiAgICAgbmFtZTogInJlYWRfYXBpX3Rlc3Rfc3RvcmFnZV9maWxlcyIsCi0gICAgc3JjczogWyJwYWNrYWdlLm1hcCIsCi0gICAgICAgICJmbGFnLm1hcCIsCi0gICAgICAgICJmbGFnLnZhbCIsCi0gICAgICAgICJmbGFnLmluZm8iCisgICAgc3JjczogWworICAgICAgICAiZGF0YS92MS9wYWNrYWdlX3YxLm1hcCIsCisgICAgICAgICJkYXRhL3YxL2ZsYWdfdjEubWFwIiwKKyAgICAgICAgImRhdGEvdjEvZmxhZ192MS52YWwiLAorICAgICAgICAiZGF0YS92MS9mbGFnX3YxLmluZm8iLAorICAgICAgICAiZGF0YS92Mi9wYWNrYWdlX3YyLm1hcCIsCisgICAgICAgICJkYXRhL3YyL2ZsYWdfdjIubWFwIiwKKyAgICAgICAgImRhdGEvdjIvZmxhZ192Mi52YWwiLAorICAgICAgICAiZGF0YS92Mi9mbGFnX3YyLmluZm8iLAogICAgIF0sCiB9CiAKQEAgLTQzLDMgKzQ4LDMwIEBACiAgICAgICAgICJnZW5lcmFsLXRlc3RzIiwKICAgICBdLAogfQorCithbmRyb2lkX3Rlc3QgeworICAgIG5hbWU6ICJhY29uZmlnX3N0b3JhZ2VfcmVhZF9mdW5jdGlvbmFsIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJmdW5jdGlvbmFsL3NyY3MvKiovKi5qYXZhIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhY29uZmlnX2RldmljZV9wYXRoc19qYXZhX3V0aWwiLAorICAgICAgICAiYWNvbmZpZ19zdG9yYWdlX2ZpbGVfamF2YSIsCisgICAgICAgICJhbmRyb2lkeC50ZXN0LnJ1bGVzIiwKKyAgICAgICAgImxpYmFjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9qYXZhIiwKKyAgICAgICAgImp1bml0IiwKKyAgICBdLAorICAgIGpuaV9saWJzOiBbCisgICAgICAgICJsaWJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGlfcnVzdF9qbmkiLAorICAgIF0sCisgICAgZGF0YTogWworICAgICAgICAiOnJlYWRfYXBpX3Rlc3Rfc3RvcmFnZV9maWxlcyIsCisgICAgXSwKKyAgICBwbGF0Zm9ybV9hcGlzOiB0cnVlLAorICAgIGNlcnRpZmljYXRlOiAicGxhdGZvcm0iLAorICAgIHRlc3Rfc3VpdGVzOiBbCisgICAgICAgICJnZW5lcmFsLXRlc3RzIiwKKyAgICBdLAorICAgIHRlc3RfY29uZmlnOiAiQWNvbmZpZ1N0b3JhZ2VSZWFkRnVuY3Rpb25hbFRlc3QueG1sIiwKKyAgICB0ZWFtOiAidHJlbmR5X3RlYW1fYW5kcm9pZF9jb3JlX2V4cGVyaW1lbnRzIiwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2phdmEvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL0FuZHJvaWRNYW5pZmVzdC54bWwKc2ltaWxhcml0eSBpbmRleCA4OSUKcmVuYW1lIGZyb20gdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvamF2YS9BbmRyb2lkTWFuaWZlc3QueG1sCnJlbmFtZSB0byB0b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCmluZGV4IDc4YmZiMzcuLjVlMDE4NzkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2phdmEvQW5kcm9pZE1hbmlmZXN0LnhtbAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCkBAIC0xNSwxMiArMTUsMTMgQEAKICAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAgLS0+CiAKLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiIHBhY2thZ2U9ImFuZHJvaWQuYWNvbmZpZ19zdG9yYWdlLnRlc3QiPgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICBwYWNrYWdlPSJhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0Ij4KICAgICA8YXBwbGljYXRpb24+CiAgICAgICAgIDx1c2VzLWxpYnJhcnkgYW5kcm9pZDpuYW1lPSJhbmRyb2lkLnRlc3QucnVubmVyIiAvPgogICAgIDwvYXBwbGljYXRpb24+CiAKICAgICA8aW5zdHJ1bWVudGF0aW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIgotICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmFjb25maWdfc3RvcmFnZS50ZXN0IiAvPgorICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0YXJnZXRQYWNrYWdlPSJhbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0IiAvPgogCiA8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZmxhZy5pbmZvIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZGF0YS92MS9mbGFnX3YxLmluZm8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2ZsYWcuaW5mbwpyZW5hbWUgdG8gdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZGF0YS92MS9mbGFnX3YxLmluZm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZmxhZy5tYXAgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9kYXRhL3YxL2ZsYWdfdjEubWFwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9mbGFnLm1hcApyZW5hbWUgdG8gdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZGF0YS92MS9mbGFnX3YxLm1hcApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9mbGFnLnZhbCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2RhdGEvdjEvZmxhZ192MS52YWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2ZsYWcudmFsCnJlbmFtZSB0byB0b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9kYXRhL3YxL2ZsYWdfdjEudmFsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL3BhY2thZ2UubWFwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZGF0YS92MS9wYWNrYWdlX3YxLm1hcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvcGFja2FnZS5tYXAKcmVuYW1lIHRvIHRvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2RhdGEvdjEvcGFja2FnZV92MS5tYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZGF0YS92Mi9mbGFnX3YyLmluZm8gYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9kYXRhL3YyL2ZsYWdfdjIuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGI3ZmRlCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZGF0YS92Mi9mbGFnX3YyLmluZm8KQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZGF0YS92Mi9mbGFnX3YyLm1hcCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2RhdGEvdjIvZmxhZ192Mi5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y0Njg1YwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2RhdGEvdjIvZmxhZ192Mi5tYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZGF0YS92Mi9mbGFnX3YyLnZhbCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2RhdGEvdjIvZmxhZ192Mi52YWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdkNDc1MAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2RhdGEvdjIvZmxhZ192Mi52YWwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZGF0YS92Mi9wYWNrYWdlX3YyLm1hcCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2RhdGEvdjIvcGFja2FnZV92Mi5tYXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE5Zjk1ZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2RhdGEvdjIvcGFja2FnZV92Mi5tYXAKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvamF2YS9BY29uZmlnU3RvcmFnZVJlYWRBUElUZXN0LmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9mdW5jdGlvbmFsL3NyY3MvQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJVGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggODElCnJlbmFtZSBmcm9tIHRvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2phdmEvQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJVGVzdC5qYXZhCnJlbmFtZSB0byB0b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9mdW5jdGlvbmFsL3NyY3MvQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJVGVzdC5qYXZhCmluZGV4IDE5MTc0MWUuLjA1ODdlOWQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2phdmEvQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJVGVzdC5qYXZhCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2Z1bmN0aW9uYWwvc3Jjcy9BY29uZmlnU3RvcmFnZVJlYWRBUElUZXN0LmphdmEKQEAgLTE5LDE0ICsxOSwxMyBAQAogaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKIGltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwogCi1pbXBvcnQgYW5kcm9pZC5hY29uZmlnLkRldmljZVByb3RvczsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuRGV2aWNlUHJvdG9zVGVzdFV0aWw7CiBpbXBvcnQgYW5kcm9pZC5hY29uZmlnLm5hbm8uQWNvbmZpZy5wYXJzZWRfZmxhZzsKIGltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5BY29uZmlnU3RvcmFnZVJlYWRBUEk7CiBpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmxhZ1JlYWRDb250ZXh0OwogaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLkZsYWdSZWFkQ29udGV4dC5TdG9yZWRGbGFnVHlwZTsKIGltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5QYWNrYWdlUmVhZENvbnRleHQ7CiBpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuU2lwSGFzaGVyMTM7Ci1pbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuU3RvcmFnZUludGVybmFsUmVhZGVyOwogCiBpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CiBpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwpAQCAtMjExLDcgKzIxMCw3IEBACiAKICAgICBAVGVzdAogICAgIHB1YmxpYyB2b2lkIHRlc3RSdXN0SmF2YUVxdWFsSGFzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8cGFyc2VkX2ZsYWc+IGZsYWdzID0gRGV2aWNlUHJvdG9zLmxvYWRBbmRQYXJzZUZsYWdQcm90b3MoKTsKKyAgICAgICAgTGlzdDxwYXJzZWRfZmxhZz4gZmxhZ3MgPSBEZXZpY2VQcm90b3NUZXN0VXRpbC5sb2FkQW5kUGFyc2VGbGFnUHJvdG9zKCk7CiAgICAgICAgIGZvciAocGFyc2VkX2ZsYWcgZmxhZyA6IGZsYWdzKSB7CiAgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBmbGFnLnBhY2thZ2VfOwogICAgICAgICAgICAgU3RyaW5nIGZsYWdOYW1lID0gZmxhZy5uYW1lOwpAQCAtMjI1LDQ2ICsyMjQsNCBAQAogICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJIYXNoLCBqSGFzaCk7CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RSdXN0SmF2YUVxdWFsRmxhZygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIExpc3Q8cGFyc2VkX2ZsYWc+IGZsYWdzID0gRGV2aWNlUHJvdG9zLmxvYWRBbmRQYXJzZUZsYWdQcm90b3MoKTsKLQotICAgICAgICBTdHJpbmcgbWFwUGF0aCA9ICIvbWV0YWRhdGEvYWNvbmZpZy9tYXBzLyI7Ci0gICAgICAgIFN0cmluZyBmbGFnc1BhdGggPSAiL21ldGFkYXRhL2Fjb25maWcvYm9vdC8iOwotCi0gICAgICAgIGZvciAocGFyc2VkX2ZsYWcgZmxhZyA6IGZsYWdzKSB7Ci0KLSAgICAgICAgICAgIFN0cmluZyBjb250YWluZXIgPSBmbGFnLmNvbnRhaW5lcjsKLSAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGZsYWcucGFja2FnZV87Ci0gICAgICAgICAgICBTdHJpbmcgZmxhZ05hbWUgPSBmbGFnLm5hbWU7Ci0gICAgICAgICAgICBTdHJpbmcgZnVsbEZsYWdOYW1lID0gcGFja2FnZU5hbWUgKyAiLyIgKyBmbGFnTmFtZTsKLQotICAgICAgICAgICAgTWFwcGVkQnl0ZUJ1ZmZlciBwYWNrYWdlTWFwID0KLSAgICAgICAgICAgICAgICAgICAgQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLm1hcFN0b3JhZ2VGaWxlKG1hcFBhdGggKyBjb250YWluZXIgKyAiLnBhY2thZ2UubWFwIik7Ci0gICAgICAgICAgICBNYXBwZWRCeXRlQnVmZmVyIGZsYWdNYXAgPQotICAgICAgICAgICAgICAgICAgICBBY29uZmlnU3RvcmFnZVJlYWRBUEkubWFwU3RvcmFnZUZpbGUobWFwUGF0aCArIGNvbnRhaW5lciArICIuZmxhZy5tYXAiKTsKLSAgICAgICAgICAgIE1hcHBlZEJ5dGVCdWZmZXIgZmxhZ1ZhbExpc3QgPQotICAgICAgICAgICAgICAgICAgICBBY29uZmlnU3RvcmFnZVJlYWRBUEkubWFwU3RvcmFnZUZpbGUoZmxhZ3NQYXRoICsgY29udGFpbmVyICsgIi52YWwiKTsKLQotICAgICAgICAgICAgUGFja2FnZVJlYWRDb250ZXh0IHBhY2thZ2VDb250ZXh0ID0KLSAgICAgICAgICAgICAgICAgICAgQWNvbmZpZ1N0b3JhZ2VSZWFkQVBJLmdldFBhY2thZ2VSZWFkQ29udGV4dChwYWNrYWdlTWFwLCBwYWNrYWdlTmFtZSk7Ci0KLSAgICAgICAgICAgIEZsYWdSZWFkQ29udGV4dCBmbGFnQ29udGV4dCA9Ci0gICAgICAgICAgICAgICAgICAgIEFjb25maWdTdG9yYWdlUmVhZEFQSS5nZXRGbGFnUmVhZENvbnRleHQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ01hcCwgcGFja2FnZUNvbnRleHQubVBhY2thZ2VJZCwgZmxhZ05hbWUpOwotCi0gICAgICAgICAgICBib29sZWFuIHJWYWwgPQotICAgICAgICAgICAgICAgICAgICBBY29uZmlnU3RvcmFnZVJlYWRBUEkuZ2V0Qm9vbGVhbkZsYWdWYWx1ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnVmFsTGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrYWdlQ29udGV4dC5tQm9vbGVhblN0YXJ0SW5kZXggKyBmbGFnQ29udGV4dC5tRmxhZ0luZGV4KTsKLQotICAgICAgICAgICAgU3RvcmFnZUludGVybmFsUmVhZGVyIHJlYWRlciA9IG5ldyBTdG9yYWdlSW50ZXJuYWxSZWFkZXIoY29udGFpbmVyLCBwYWNrYWdlTmFtZSk7Ci0gICAgICAgICAgICBib29sZWFuIGpWYWwgPSByZWFkZXIuZ2V0Qm9vbGVhbkZsYWdWYWx1ZShmbGFnQ29udGV4dC5tRmxhZ0luZGV4KTsKLQotICAgICAgICAgICAgbG9uZyBySGFzaCA9IEFjb25maWdTdG9yYWdlUmVhZEFQSS5oYXNoKHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgIGxvbmcgakhhc2ggPSBTaXBIYXNoZXIxMy5oYXNoKHBhY2thZ2VOYW1lLmdldEJ5dGVzKCkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKHJWYWwsIGpWYWwpOwotICAgICAgICB9Ci0gICAgfQogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZnVuY3Rpb25hbC9zcmNzL1BsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbFRlc3QuamF2YSBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2Z1bmN0aW9uYWwvc3Jjcy9QbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWxUZXN0LmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg5NmJhZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2Z1bmN0aW9uYWwvc3Jjcy9QbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWxUZXN0LmphdmEKQEAgLTAsMCArMSwxMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VGhyb3dzOworCitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLkRldmljZVByb3Rvc1Rlc3RVdGlsOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5uYW5vLkFjb25maWc7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLm5hbm8uQWNvbmZpZy5wYXJzZWRfZmxhZzsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GbGFnVGFibGU7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmxhZ1ZhbHVlTGlzdDsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5QYWNrYWdlVGFibGU7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuU3RvcmFnZUZpbGVQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLmludGVybmFsLmFjb25maWcuc3RvcmFnZS5BY29uZmlnU3RvcmFnZUV4Y2VwdGlvbjsKK2ltcG9ydCBhbmRyb2lkLm9zLmZsYWdnaW5nLlBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbDsKKworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5KVW5pdDQ7CisKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOworaW1wb3J0IGphdmEudXRpbC5MaXN0OworaW1wb3J0IGphdmEudXRpbC5NYXA7CitpbXBvcnQgamF2YS51dGlsLlNldDsKKworQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQorcHVibGljIGNsYXNzIFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbFRlc3QgeworCisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU2V0PFN0cmluZz4gUExBVEZPUk1fQ09OVEFJTkVSUyA9IFNldC5vZigic3lzdGVtIiwgInZlbmRvciIsICJwcm9kdWN0Iik7CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3RQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWxfbG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8cGFyc2VkX2ZsYWc+IGZsYWdzID0gRGV2aWNlUHJvdG9zVGVzdFV0aWwubG9hZEFuZFBhcnNlRmxhZ1Byb3RvcygpOworICAgICAgICBNYXA8U3RyaW5nLCBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWw+IHJlYWRlck1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKKyAgICAgICAgU3RvcmFnZUZpbGVQcm92aWRlciBmcCA9IFN0b3JhZ2VGaWxlUHJvdmlkZXIuZ2V0RGVmYXVsdFByb3ZpZGVyKCk7CisKKyAgICAgICAgZm9yIChwYXJzZWRfZmxhZyBmbGFnIDogZmxhZ3MpIHsKKyAgICAgICAgICAgIGlmIChmbGFnLnBlcm1pc3Npb24gPT0gQWNvbmZpZy5SRUFEX09OTFkgJiYgZmxhZy5zdGF0ZSA9PSBBY29uZmlnLkRJU0FCTEVEKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgY29udGFpbmVyID0gZmxhZy5jb250YWluZXI7CisgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBmbGFnLnBhY2thZ2VfOworICAgICAgICAgICAgU3RyaW5nIGZsYWdOYW1lID0gZmxhZy5uYW1lOworICAgICAgICAgICAgaWYgKCFQTEFURk9STV9DT05UQUlORVJTLmNvbnRhaW5zKGNvbnRhaW5lcikpIGNvbnRpbnVlOworCisgICAgICAgICAgICBQYWNrYWdlVGFibGUgcFRhYmxlID0gZnAuZ2V0UGFja2FnZVRhYmxlKGNvbnRhaW5lcik7CisgICAgICAgICAgICBQYWNrYWdlVGFibGUuTm9kZSBwTm9kZSA9IHBUYWJsZS5nZXQocGFja2FnZU5hbWUpOworICAgICAgICAgICAgRmxhZ1RhYmxlIGZUYWJsZSA9IGZwLmdldEZsYWdUYWJsZShjb250YWluZXIpOworICAgICAgICAgICAgRmxhZ1RhYmxlLk5vZGUgZk5vZGUgPSBmVGFibGUuZ2V0KHBOb2RlLmdldFBhY2thZ2VJZCgpLCBmbGFnTmFtZSk7CisgICAgICAgICAgICBGbGFnVmFsdWVMaXN0IGZMaXN0ID0gZnAuZ2V0RmxhZ1ZhbHVlTGlzdChjb250YWluZXIpOworCisgICAgICAgICAgICBpbnQgaW5kZXggPSBwTm9kZS5nZXRCb29sZWFuU3RhcnRJbmRleCgpICsgZk5vZGUuZ2V0RmxhZ0luZGV4KCk7CisgICAgICAgICAgICBib29sZWFuIHJWYWwgPSBmTGlzdC5nZXRCb29sZWFuKGluZGV4KTsKKworICAgICAgICAgICAgbG9uZyBmaW5nZXJwcmludCA9IHBOb2RlLmdldFBhY2thZ2VGaW5nZXJwcmludCgpOworCisgICAgICAgICAgICBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwgcmVhZGVyID0gcmVhZGVyTWFwLmdldChwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBpZiAocmVhZGVyID09IG51bGwpIHsKKyAgICAgICAgICAgICAgICByZWFkZXIgPSBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwubG9hZChwYWNrYWdlTmFtZSwgZmluZ2VycHJpbnQpOworICAgICAgICAgICAgICAgIHJlYWRlck1hcC5wdXQocGFja2FnZU5hbWUsIHJlYWRlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sZWFuIGpWYWwgPSByZWFkZXIuZ2V0Qm9vbGVhbkZsYWdWYWx1ZShmTm9kZS5nZXRGbGFnSW5kZXgoKSk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhyVmFsLCBqVmFsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VfbG9hZF93aXRoRXJyb3IoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBwYWNrYWdlIG5vdCBmb3VuZAorICAgICAgICBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbiBlID0KKyAgICAgICAgICAgICAgICBhc3NlcnRUaHJvd3MoCisgICAgICAgICAgICAgICAgICAgICAgICBBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbi5jbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICgpIC0+IFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbC5sb2FkKCJmYWtlX3BhY2thZ2UiLCAwKSk7CisgICAgICAgIGFzc2VydEVxdWFscyhBY29uZmlnU3RvcmFnZUV4Y2VwdGlvbi5FUlJPUl9QQUNLQUdFX05PVF9GT1VORCwgZS5nZXRFcnJvckNvZGUoKSk7CisKKyAgICAgICAgLy8gZmluZ2VycHJpbnQgZG9lc24ndCBtYXRjaAorICAgICAgICBMaXN0PHBhcnNlZF9mbGFnPiBmbGFncyA9IERldmljZVByb3Rvc1Rlc3RVdGlsLmxvYWRBbmRQYXJzZUZsYWdQcm90b3MoKTsKKyAgICAgICAgU3RvcmFnZUZpbGVQcm92aWRlciBmcCA9IFN0b3JhZ2VGaWxlUHJvdmlkZXIuZ2V0RGVmYXVsdFByb3ZpZGVyKCk7CisKKyAgICAgICAgcGFyc2VkX2ZsYWcgZmxhZyA9IGZsYWdzLmdldCgwKTsKKworICAgICAgICBTdHJpbmcgY29udGFpbmVyID0gZmxhZy5jb250YWluZXI7CisgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGZsYWcucGFja2FnZV87CisgICAgICAgIGJvb2xlYW4gdmFsdWUgPSBmbGFnLnN0YXRlID09IEFjb25maWcuRU5BQkxFRDsKKworICAgICAgICBQYWNrYWdlVGFibGUgcFRhYmxlID0gZnAuZ2V0UGFja2FnZVRhYmxlKGNvbnRhaW5lcik7CisgICAgICAgIFBhY2thZ2VUYWJsZS5Ob2RlIHBOb2RlID0gcFRhYmxlLmdldChwYWNrYWdlTmFtZSk7CisKKyAgICAgICAgaWYgKHBOb2RlLmhhc1BhY2thZ2VGaW5nZXJwcmludCgpKSB7CisgICAgICAgICAgICBsb25nIGZpbmdlcnByaW50ID0gcE5vZGUuZ2V0UGFja2FnZUZpbmdlcnByaW50KCk7CisgICAgICAgICAgICBlID0KKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VGhyb3dzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjb25maWdTdG9yYWdlRXhjZXB0aW9uLmNsYXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICgpIC0+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwubG9hZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUsIGZpbmdlcnByaW50ICsgMSkpOworICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKEFjb25maWdTdG9yYWdlRXhjZXB0aW9uLkVSUk9SX0ZJTEVfRklOR0VSUFJJTlRfTUlTTUFUQ0gsIGUuZ2V0RXJyb3JDb2RlKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZnVuY3Rpb25hbC9zcmNzL1BsYXRmb3JtQWNvbmZpZ1BhY2thZ2VUZXN0LmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9mdW5jdGlvbmFsL3NyY3MvUGxhdGZvcm1BY29uZmlnUGFja2FnZVRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzZjMjM4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvZnVuY3Rpb25hbC9zcmNzL1BsYXRmb3JtQWNvbmZpZ1BhY2thZ2VUZXN0LmphdmEKQEAgLTAsMCArMSwxMDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3Q7CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90TnVsbDsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnROdWxsOworCitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLkRldmljZVByb3Rvc1Rlc3RVdGlsOworaW1wb3J0IGFuZHJvaWQuYWNvbmZpZy5uYW5vLkFjb25maWc7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLm5hbm8uQWNvbmZpZy5wYXJzZWRfZmxhZzsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5GbGFnVGFibGU7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuRmxhZ1ZhbHVlTGlzdDsKK2ltcG9ydCBhbmRyb2lkLmFjb25maWcuc3RvcmFnZS5QYWNrYWdlVGFibGU7CitpbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuU3RvcmFnZUZpbGVQcm92aWRlcjsKK2ltcG9ydCBhbmRyb2lkLm9zLmZsYWdnaW5nLlBsYXRmb3JtQWNvbmZpZ1BhY2thZ2U7CisKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKK2ltcG9ydCBqYXZhLnV0aWwuTGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKK0BSdW5XaXRoKEpVbml0NC5jbGFzcykKK3B1YmxpYyBjbGFzcyBQbGF0Zm9ybUFjb25maWdQYWNrYWdlVGVzdCB7CisKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBQTEFURk9STV9DT05UQUlORVJTID0gU2V0Lm9mKCJzeXN0ZW0iLCAidmVuZG9yIiwgInByb2R1Y3QiKTsKKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VfU3RvcmFnZUZpbGVzQ2FjaGUoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBMaXN0PHBhcnNlZF9mbGFnPiBmbGFncyA9IERldmljZVByb3Rvc1Rlc3RVdGlsLmxvYWRBbmRQYXJzZUZsYWdQcm90b3MoKTsKKyAgICAgICAgZm9yIChwYXJzZWRfZmxhZyBmbGFnIDogZmxhZ3MpIHsKKyAgICAgICAgICAgIGlmIChmbGFnLnBlcm1pc3Npb24gPT0gQWNvbmZpZy5SRUFEX09OTFkgJiYgZmxhZy5zdGF0ZSA9PSBBY29uZmlnLkRJU0FCTEVEKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmcgY29udGFpbmVyID0gZmxhZy5jb250YWluZXI7CisgICAgICAgICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBmbGFnLnBhY2thZ2VfOworICAgICAgICAgICAgaWYgKCFQTEFURk9STV9DT05UQUlORVJTLmNvbnRhaW5zKGNvbnRhaW5lcikpIGNvbnRpbnVlOworICAgICAgICAgICAgYXNzZXJ0Tm90TnVsbChQbGF0Zm9ybUFjb25maWdQYWNrYWdlLmxvYWQocGFja2FnZU5hbWUpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VfbG9hZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIExpc3Q8cGFyc2VkX2ZsYWc+IGZsYWdzID0gRGV2aWNlUHJvdG9zVGVzdFV0aWwubG9hZEFuZFBhcnNlRmxhZ1Byb3RvcygpOworICAgICAgICBNYXA8U3RyaW5nLCBQbGF0Zm9ybUFjb25maWdQYWNrYWdlPiByZWFkZXJNYXAgPSBuZXcgSGFzaE1hcDw+KCk7CisgICAgICAgIFN0b3JhZ2VGaWxlUHJvdmlkZXIgZnAgPSBTdG9yYWdlRmlsZVByb3ZpZGVyLmdldERlZmF1bHRQcm92aWRlcigpOworCisgICAgICAgIGZvciAocGFyc2VkX2ZsYWcgZmxhZyA6IGZsYWdzKSB7CisgICAgICAgICAgICBpZiAoZmxhZy5wZXJtaXNzaW9uID09IEFjb25maWcuUkVBRF9PTkxZICYmIGZsYWcuc3RhdGUgPT0gQWNvbmZpZy5ESVNBQkxFRCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nIGNvbnRhaW5lciA9IGZsYWcuY29udGFpbmVyOworICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gZmxhZy5wYWNrYWdlXzsKKyAgICAgICAgICAgIFN0cmluZyBmbGFnTmFtZSA9IGZsYWcubmFtZTsKKyAgICAgICAgICAgIGlmICghUExBVEZPUk1fQ09OVEFJTkVSUy5jb250YWlucyhjb250YWluZXIpKSBjb250aW51ZTsKKworICAgICAgICAgICAgUGFja2FnZVRhYmxlIHBUYWJsZSA9IGZwLmdldFBhY2thZ2VUYWJsZShjb250YWluZXIpOworICAgICAgICAgICAgUGFja2FnZVRhYmxlLk5vZGUgcE5vZGUgPSBwVGFibGUuZ2V0KHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIEZsYWdUYWJsZSBmVGFibGUgPSBmcC5nZXRGbGFnVGFibGUoY29udGFpbmVyKTsKKyAgICAgICAgICAgIEZsYWdUYWJsZS5Ob2RlIGZOb2RlID0gZlRhYmxlLmdldChwTm9kZS5nZXRQYWNrYWdlSWQoKSwgZmxhZ05hbWUpOworICAgICAgICAgICAgRmxhZ1ZhbHVlTGlzdCBmTGlzdCA9IGZwLmdldEZsYWdWYWx1ZUxpc3QoY29udGFpbmVyKTsKKworICAgICAgICAgICAgaW50IGluZGV4ID0gcE5vZGUuZ2V0Qm9vbGVhblN0YXJ0SW5kZXgoKSArIGZOb2RlLmdldEZsYWdJbmRleCgpOworICAgICAgICAgICAgYm9vbGVhbiByVmFsID0gZkxpc3QuZ2V0Qm9vbGVhbihpbmRleCk7CisKKyAgICAgICAgICAgIGxvbmcgZmluZ2VycHJpbnQgPSBwTm9kZS5nZXRQYWNrYWdlRmluZ2VycHJpbnQoKTsKKworICAgICAgICAgICAgUGxhdGZvcm1BY29uZmlnUGFja2FnZSByZWFkZXIgPSByZWFkZXJNYXAuZ2V0KHBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIGlmIChyZWFkZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgICAgIHJlYWRlciA9IFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2UubG9hZChwYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAgICAgcmVhZGVyTWFwLnB1dChwYWNrYWdlTmFtZSwgcmVhZGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJvb2xlYW4galZhbCA9IHJlYWRlci5nZXRCb29sZWFuRmxhZ1ZhbHVlKGZsYWdOYW1lLCAhclZhbCk7CisKKyAgICAgICAgICAgIGFzc2VydEVxdWFscyhyVmFsLCBqVmFsKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2VfbG9hZF93aXRoRXJyb3IoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICAvLyBwYWNrYWdlIG5vdCBmb3VuZAorICAgICAgICBhc3NlcnROdWxsKFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2UubG9hZCgiZmFrZV9jb250YWluZXIiKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvamF2YS9BbmRyb2lkLmJwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvamF2YS9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDRlOWFkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL2phdmEvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLWFuZHJvaWRfdGVzdCB7Ci0gICAgbmFtZTogImFjb25maWdfc3RvcmFnZV9yZWFkX2FwaS50ZXN0LmphdmEiLAotICAgIHNyY3M6IFsiLi8qKi8qLmphdmEiXSwKLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAiYWNvbmZpZ19kZXZpY2VfcGF0aHNfamF2YSIsCi0gICAgICAgICJhY29uZmlnX3N0b3JhZ2VfZmlsZV9qYXZhIiwKLSAgICAgICAgImFjb25maWdfc3RvcmFnZV9yZWFkZXJfamF2YSIsCi0gICAgICAgICJhbmRyb2lkeC50ZXN0LnJ1bGVzIiwKLSAgICAgICAgImxpYmFjb25maWdfc3RvcmFnZV9yZWFkX2FwaV9qYXZhIiwKLSAgICAgICAgImp1bml0IiwKLSAgICBdLAotICAgIGpuaV9saWJzOiBbCi0gICAgICAgICJsaWJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGlfcnVzdF9qbmkiLAotICAgIF0sCi0gICAgZGF0YTogWwotICAgICAgICAiOnJlYWRfYXBpX3Rlc3Rfc3RvcmFnZV9maWxlcyIsCi0gICAgXSwKLSAgICBwbGF0Zm9ybV9hcGlzOiB0cnVlLAotICAgIGNlcnRpZmljYXRlOiAicGxhdGZvcm0iLAotICAgIHRlc3Rfc3VpdGVzOiBbCi0gICAgICAgICJnZW5lcmFsLXRlc3RzIiwKLSAgICBdLAotICAgIHRlYW06ICJ0cmVuZHlfdGVhbV9hbmRyb2lkX2NvcmVfZXhwZXJpbWVudHMiLAotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvamF2YS9TdG9yYWdlSW50ZXJuYWxSZWFkZXJUZXN0LmphdmEgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9qYXZhL1N0b3JhZ2VJbnRlcm5hbFJlYWRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ExYmJhMC4uMDAwMDAwMAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9qYXZhL1N0b3JhZ2VJbnRlcm5hbFJlYWRlclRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3Q7Ci0KLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOwotCi1pbXBvcnQgYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UuU3RvcmFnZUludGVybmFsUmVhZGVyOwotCi1pbXBvcnQgb3JnLmp1bml0LlRlc3Q7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOwotaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLkpVbml0NDsKLQotQFJ1bldpdGgoSlVuaXQ0LmNsYXNzKQotcHVibGljIGNsYXNzIFN0b3JhZ2VJbnRlcm5hbFJlYWRlclRlc3QgewotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbVN0b3JhZ2VEaXIgPSAiL2RhdGEvbG9jYWwvdG1wL2Fjb25maWdfamF2YV9hcGlfdGVzdCI7Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTdG9yYWdlSW50ZXJuYWxSZWFkZXJfZ2V0RmxhZygpIHsKLQotICAgICAgICBTdHJpbmcgcGFja2FnZU1hcEZpbGUgPSBtU3RvcmFnZURpciArICIvbWFwcy9tb2NrdXAucGFja2FnZS5tYXAiOwotICAgICAgICBTdHJpbmcgZmxhZ1ZhbHVlRmlsZSA9IG1TdG9yYWdlRGlyICsgIi9ib290L21vY2t1cC52YWwiOwotCi0gICAgICAgIFN0b3JhZ2VJbnRlcm5hbFJlYWRlciByZWFkZXIgPQotICAgICAgICAgICAgICAgIG5ldyBTdG9yYWdlSW50ZXJuYWxSZWFkZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIsIHBhY2thZ2VNYXBGaWxlLCBmbGFnVmFsdWVGaWxlKTsKLSAgICAgICAgYXNzZXJ0RmFsc2UocmVhZGVyLmdldEJvb2xlYW5GbGFnVmFsdWUoMCkpOwotICAgICAgICBhc3NlcnRUcnVlKHJlYWRlci5nZXRCb29sZWFuRmxhZ1ZhbHVlKDEpKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9zdG9yYWdlX3JlYWRfYXBpX3Rlc3QuY3BwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvc3RvcmFnZV9yZWFkX2FwaV90ZXN0LmNwcAppbmRleCA2ZDI5MDQ1Li41Mjg5ZmFhIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9zdG9yYWdlX3JlYWRfYXBpX3Rlc3QuY3BwCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL3N0b3JhZ2VfcmVhZF9hcGlfdGVzdC5jcHAKQEAgLTQ1LDcgKzQ1LDggQEAKICAgfQogCiAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7Ci0gICAgYXV0byBjb25zdCB0ZXN0X2RpciA9IGFuZHJvaWQ6OmJhc2U6OkdldEV4ZWN1dGFibGVEaXJlY3RvcnkoKTsKKyAgICBhdXRvIGNvbnN0IHRlc3RfYmFzZV9kaXIgPSBhbmRyb2lkOjpiYXNlOjpHZXRFeGVjdXRhYmxlRGlyZWN0b3J5KCk7CisgICAgYXV0byBjb25zdCB0ZXN0X2RpciA9IHRlc3RfYmFzZV9kaXIgKyAiL2RhdGEvdjEiOwogICAgIHN0b3JhZ2VfZGlyID0gc3RkOjpzdHJpbmcocm9vdF9kaXIucGF0aCk7CiAgICAgYXV0byBtYXBzX2RpciA9IHN0b3JhZ2VfZGlyICsgIi9tYXBzIjsKICAgICBhdXRvIGJvb3RfZGlyID0gc3RvcmFnZV9kaXIgKyAiL2Jvb3QiOwpAQCAtNTUsMTAgKzU2LDEwIEBACiAgICAgZmxhZ19tYXAgPSBzdGQ6OnN0cmluZyhtYXBzX2RpcikgKyAiL21vY2t1cC5mbGFnLm1hcCI7CiAgICAgZmxhZ192YWwgPSBzdGQ6OnN0cmluZyhib290X2RpcikgKyAiL21vY2t1cC52YWwiOwogICAgIGZsYWdfaW5mbyA9IHN0ZDo6c3RyaW5nKGJvb3RfZGlyKSArICIvbW9ja3VwLmluZm8iOwotICAgIGNvcHlfZmlsZSh0ZXN0X2RpciArICIvcGFja2FnZS5tYXAiLCBwYWNrYWdlX21hcCk7Ci0gICAgY29weV9maWxlKHRlc3RfZGlyICsgIi9mbGFnLm1hcCIsIGZsYWdfbWFwKTsKLSAgICBjb3B5X2ZpbGUodGVzdF9kaXIgKyAiL2ZsYWcudmFsIiwgZmxhZ192YWwpOwotICAgIGNvcHlfZmlsZSh0ZXN0X2RpciArICIvZmxhZy5pbmZvIiwgZmxhZ19pbmZvKTsKKyAgICBjb3B5X2ZpbGUodGVzdF9kaXIgKyAiL3BhY2thZ2VfdjEubWFwIiwgcGFja2FnZV9tYXApOworICAgIGNvcHlfZmlsZSh0ZXN0X2RpciArICIvZmxhZ192MS5tYXAiLCBmbGFnX21hcCk7CisgICAgY29weV9maWxlKHRlc3RfZGlyICsgIi9mbGFnX3YxLnZhbCIsIGZsYWdfdmFsKTsKKyAgICBjb3B5X2ZpbGUodGVzdF9kaXIgKyAiL2ZsYWdfdjEuaW5mbyIsIGZsYWdfaW5mbyk7CiAgIH0KIAogICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgewpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvc3RvcmFnZV9yZWFkX2FwaV90ZXN0LnJzIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkvdGVzdHMvc3RvcmFnZV9yZWFkX2FwaV90ZXN0LnJzCmluZGV4IGFmYzQ0ZDQuLjJhOGVkZjMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpL3Rlc3RzL3N0b3JhZ2VfcmVhZF9hcGlfdGVzdC5ycworKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV9yZWFkX2FwaS90ZXN0cy9zdG9yYWdlX3JlYWRfYXBpX3Rlc3QucnMKQEAgLTksNyArOSw3IEBACiAgICAgdXNlIHJhbmQ6OlJuZzsKICAgICB1c2Ugc3RkOjpmczsKIAotICAgIGZuIGNyZWF0ZV90ZXN0X3N0b3JhZ2VfZmlsZXMoKSAtPiBTdHJpbmcgeworICAgIGZuIGNyZWF0ZV90ZXN0X3N0b3JhZ2VfZmlsZXModmVyc2lvbjogdTMyKSAtPiBTdHJpbmcgewogICAgICAgICBsZXQgbXV0IHJuZyA9IHJhbmQ6OnRocmVhZF9ybmcoKTsKICAgICAgICAgbGV0IG51bWJlcjogdTMyID0gcm5nLmdlbigpOwogICAgICAgICBsZXQgc3RvcmFnZV9kaXIgPSBTdHJpbmc6OmZyb20oIi90bXAvIikgKyAmbnVtYmVyLnRvX3N0cmluZygpOwpAQCAtMjYsMTcgKzI2LDE3IEBACiAgICAgICAgIGxldCBmbGFnX21hcCA9IHN0b3JhZ2VfZGlyLmNsb25lKCkgKyAiL21hcHMvbW9ja3VwLmZsYWcubWFwIjsKICAgICAgICAgbGV0IGZsYWdfdmFsID0gc3RvcmFnZV9kaXIuY2xvbmUoKSArICIvYm9vdC9tb2NrdXAudmFsIjsKICAgICAgICAgbGV0IGZsYWdfaW5mbyA9IHN0b3JhZ2VfZGlyLmNsb25lKCkgKyAiL2Jvb3QvbW9ja3VwLmluZm8iOwotICAgICAgICBmczo6Y29weSgiLi9wYWNrYWdlLm1hcCIsIHBhY2thZ2VfbWFwKS51bndyYXAoKTsKLSAgICAgICAgZnM6OmNvcHkoIi4vZmxhZy5tYXAiLCBmbGFnX21hcCkudW53cmFwKCk7Ci0gICAgICAgIGZzOjpjb3B5KCIuL2ZsYWcudmFsIiwgZmxhZ192YWwpLnVud3JhcCgpOwotICAgICAgICBmczo6Y29weSgiLi9mbGFnLmluZm8iLCBmbGFnX2luZm8pLnVud3JhcCgpOworICAgICAgICBmczo6Y29weShmb3JtYXQhKCIuL2RhdGEvdnswfS9wYWNrYWdlX3Z7MH0ubWFwIiwgdmVyc2lvbiksIHBhY2thZ2VfbWFwKS51bndyYXAoKTsKKyAgICAgICAgZnM6OmNvcHkoZm9ybWF0ISgiLi9kYXRhL3Z7MH0vZmxhZ192ezB9Lm1hcCIsIHZlcnNpb24pLCBmbGFnX21hcCkudW53cmFwKCk7CisgICAgICAgIGZzOjpjb3B5KGZvcm1hdCEoIi4vZGF0YS92e30vZmxhZ192ezB9LnZhbCIsIHZlcnNpb24pLCBmbGFnX3ZhbCkudW53cmFwKCk7CisgICAgICAgIGZzOjpjb3B5KGZvcm1hdCEoIi4vZGF0YS92e30vZmxhZ192ezB9LmluZm8iLCB2ZXJzaW9uKSwgZmxhZ19pbmZvKS51bndyYXAoKTsKIAogICAgICAgICBzdG9yYWdlX2RpcgogICAgIH0KIAogICAgICNbdGVzdF0KLSAgICBmbiB0ZXN0X3VuYXZhaWxhYmxlX3N0b2FyZ2UoKSB7Ci0gICAgICAgIGxldCBzdG9yYWdlX2RpciA9IGNyZWF0ZV90ZXN0X3N0b3JhZ2VfZmlsZXMoKTsKKyAgICBmbiB0ZXN0X3VuYXZhaWxhYmxlX3N0b3JhZ2UoKSB7CisgICAgICAgIGxldCBzdG9yYWdlX2RpciA9IGNyZWF0ZV90ZXN0X3N0b3JhZ2VfZmlsZXMoMSk7CiAgICAgICAgIC8vIFNBRkVUWToKICAgICAgICAgLy8gVGhlIHNhZmV0eSBoZXJlIGlzIGVuc3VyZWQgYXMgdGhlIHRlc3QgcHJvY2VzcyB3aWxsIG5vdCB3cml0ZSB0byB0ZW1wIHN0b3JhZ2UgZmlsZQogICAgICAgICBsZXQgZXJyID0gdW5zYWZlIHsKQEAgLTUzLDcgKzUzLDcgQEAKIAogICAgICNbdGVzdF0KICAgICBmbiB0ZXN0X3BhY2thZ2VfY29udGV4dF9xdWVyeSgpIHsKLSAgICAgICAgbGV0IHN0b3JhZ2VfZGlyID0gY3JlYXRlX3Rlc3Rfc3RvcmFnZV9maWxlcygpOworICAgICAgICBsZXQgc3RvcmFnZV9kaXIgPSBjcmVhdGVfdGVzdF9zdG9yYWdlX2ZpbGVzKDEpOwogICAgICAgICAvLyBTQUZFVFk6CiAgICAgICAgIC8vIFRoZSBzYWZldHkgaGVyZSBpcyBlbnN1cmVkIGFzIHRoZSB0ZXN0IHByb2Nlc3Mgd2lsbCBub3Qgd3JpdGUgdG8gdGVtcCBzdG9yYWdlIGZpbGUKICAgICAgICAgbGV0IHBhY2thZ2VfbWFwcGVkX2ZpbGUgPSB1bnNhZmUgewpAQCAtNjQsMjcgKzY0LDczIEBACiAgICAgICAgICAgICBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfbWFwcGVkX2ZpbGUsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8xIikKICAgICAgICAgICAgICAgICAudW53cmFwKCkKICAgICAgICAgICAgICAgICAudW53cmFwKCk7Ci0gICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPSBQYWNrYWdlUmVhZENvbnRleHQgeyBwYWNrYWdlX2lkOiAwLCBib29sZWFuX3N0YXJ0X2luZGV4OiAwIH07CisgICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPQorICAgICAgICAgICAgUGFja2FnZVJlYWRDb250ZXh0IHsgcGFja2FnZV9pZDogMCwgYm9vbGVhbl9zdGFydF9pbmRleDogMCwgZmluZ2VycHJpbnQ6IDAgfTsKICAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX2NvbnRleHQsIGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCk7CiAKICAgICAgICAgbGV0IHBhY2thZ2VfY29udGV4dCA9CiAgICAgICAgICAgICBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfbWFwcGVkX2ZpbGUsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF8yIikKICAgICAgICAgICAgICAgICAudW53cmFwKCkKICAgICAgICAgICAgICAgICAudW53cmFwKCk7Ci0gICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPSBQYWNrYWdlUmVhZENvbnRleHQgeyBwYWNrYWdlX2lkOiAxLCBib29sZWFuX3N0YXJ0X2luZGV4OiAzIH07CisgICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPQorICAgICAgICAgICAgUGFja2FnZVJlYWRDb250ZXh0IHsgcGFja2FnZV9pZDogMSwgYm9vbGVhbl9zdGFydF9pbmRleDogMywgZmluZ2VycHJpbnQ6IDAgfTsKICAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX2NvbnRleHQsIGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCk7CiAKICAgICAgICAgbGV0IHBhY2thZ2VfY29udGV4dCA9CiAgICAgICAgICAgICBnZXRfcGFja2FnZV9yZWFkX2NvbnRleHQoJnBhY2thZ2VfbWFwcGVkX2ZpbGUsICJjb20uYW5kcm9pZC5hY29uZmlnLnN0b3JhZ2UudGVzdF80IikKICAgICAgICAgICAgICAgICAudW53cmFwKCkKICAgICAgICAgICAgICAgICAudW53cmFwKCk7Ci0gICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPSBQYWNrYWdlUmVhZENvbnRleHQgeyBwYWNrYWdlX2lkOiAyLCBib29sZWFuX3N0YXJ0X2luZGV4OiA2IH07CisgICAgICAgIGxldCBleHBlY3RlZF9wYWNrYWdlX2NvbnRleHQgPQorICAgICAgICAgICAgUGFja2FnZVJlYWRDb250ZXh0IHsgcGFja2FnZV9pZDogMiwgYm9vbGVhbl9zdGFydF9pbmRleDogNiwgZmluZ2VycHJpbnQ6IDAgfTsKKyAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX2NvbnRleHQsIGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfcGFja2FnZV9jb250ZXh0X3F1ZXJ5X3dpdGhfZmluZ2VycHJpbnQoKSB7CisgICAgICAgIGxldCBzdG9yYWdlX2RpciA9IGNyZWF0ZV90ZXN0X3N0b3JhZ2VfZmlsZXMoMik7CisgICAgICAgIC8vIFNBRkVUWToKKyAgICAgICAgLy8gVGhlIHNhZmV0eSBoZXJlIGlzIGVuc3VyZWQgYXMgdGhlIHRlc3QgcHJvY2VzcyB3aWxsIG5vdCB3cml0ZSB0byB0ZW1wIHN0b3JhZ2UgZmlsZQorICAgICAgICBsZXQgcGFja2FnZV9tYXBwZWRfZmlsZSA9IHVuc2FmZSB7CisgICAgICAgICAgICBnZXRfbWFwcGVkX2ZpbGUoJnN0b3JhZ2VfZGlyLCAibW9ja3VwIiwgU3RvcmFnZUZpbGVUeXBlOjpQYWNrYWdlTWFwKS51bndyYXAoKQorICAgICAgICB9OworCisgICAgICAgIGxldCBwYWNrYWdlX2NvbnRleHQgPQorICAgICAgICAgICAgZ2V0X3BhY2thZ2VfcmVhZF9jb250ZXh0KCZwYWNrYWdlX21hcHBlZF9maWxlLCAiY29tLmFuZHJvaWQuYWNvbmZpZy5zdG9yYWdlLnRlc3RfMSIpCisgICAgICAgICAgICAgICAgLnVud3JhcCgpCisgICAgICAgICAgICAgICAgLnVud3JhcCgpOworICAgICAgICBsZXQgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0ID0gUGFja2FnZVJlYWRDb250ZXh0IHsKKyAgICAgICAgICAgIHBhY2thZ2VfaWQ6IDAsCisgICAgICAgICAgICBib29sZWFuX3N0YXJ0X2luZGV4OiAwLAorICAgICAgICAgICAgZmluZ2VycHJpbnQ6IDE1MjQ4OTQ4NTEwNTkwMTU4MDg2dTY0LAorICAgICAgICB9OworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VfY29udGV4dCwgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0KTsKKworICAgICAgICBsZXQgcGFja2FnZV9jb250ZXh0ID0KKyAgICAgICAgICAgIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV9tYXBwZWRfZmlsZSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzIiKQorICAgICAgICAgICAgICAgIC51bndyYXAoKQorICAgICAgICAgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCA9IFBhY2thZ2VSZWFkQ29udGV4dCB7CisgICAgICAgICAgICBwYWNrYWdlX2lkOiAxLAorICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleDogMywKKyAgICAgICAgICAgIGZpbmdlcnByaW50OiA0NDMxOTQwNTAyMjc0ODU3OTY0dTY0LAorICAgICAgICB9OworICAgICAgICBhc3NlcnRfZXEhKHBhY2thZ2VfY29udGV4dCwgZXhwZWN0ZWRfcGFja2FnZV9jb250ZXh0KTsKKworICAgICAgICBsZXQgcGFja2FnZV9jb250ZXh0ID0KKyAgICAgICAgICAgIGdldF9wYWNrYWdlX3JlYWRfY29udGV4dCgmcGFja2FnZV9tYXBwZWRfZmlsZSwgImNvbS5hbmRyb2lkLmFjb25maWcuc3RvcmFnZS50ZXN0XzQiKQorICAgICAgICAgICAgICAgIC51bndyYXAoKQorICAgICAgICAgICAgICAgIC51bndyYXAoKTsKKyAgICAgICAgbGV0IGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCA9IFBhY2thZ2VSZWFkQ29udGV4dCB7CisgICAgICAgICAgICBwYWNrYWdlX2lkOiAyLAorICAgICAgICAgICAgYm9vbGVhbl9zdGFydF9pbmRleDogNiwKKyAgICAgICAgICAgIGZpbmdlcnByaW50OiAxNjIzMzIyOTkxNzcxMTYyMjM3NXU2NCwKKyAgICAgICAgfTsKICAgICAgICAgYXNzZXJ0X2VxIShwYWNrYWdlX2NvbnRleHQsIGV4cGVjdGVkX3BhY2thZ2VfY29udGV4dCk7CiAgICAgfQogCiAgICAgI1t0ZXN0XQogICAgIGZuIHRlc3Rfbm9uZV9leGlzdF9wYWNrYWdlX2NvbnRleHRfcXVlcnkoKSB7Ci0gICAgICAgIGxldCBzdG9yYWdlX2RpciA9IGNyZWF0ZV90ZXN0X3N0b3JhZ2VfZmlsZXMoKTsKKyAgICAgICAgbGV0IHN0b3JhZ2VfZGlyID0gY3JlYXRlX3Rlc3Rfc3RvcmFnZV9maWxlcygxKTsKICAgICAgICAgLy8gU0FGRVRZOgogICAgICAgICAvLyBUaGUgc2FmZXR5IGhlcmUgaXMgZW5zdXJlZCBhcyB0aGUgdGVzdCBwcm9jZXNzIHdpbGwgbm90IHdyaXRlIHRvIHRlbXAgc3RvcmFnZSBmaWxlCiAgICAgICAgIGxldCBwYWNrYWdlX21hcHBlZF9maWxlID0gdW5zYWZlIHsKQEAgLTk5LDcgKzE0NSw3IEBACiAKICAgICAjW3Rlc3RdCiAgICAgZm4gdGVzdF9mbGFnX2NvbnRleHRfcXVlcnkoKSB7Ci0gICAgICAgIGxldCBzdG9yYWdlX2RpciA9IGNyZWF0ZV90ZXN0X3N0b3JhZ2VfZmlsZXMoKTsKKyAgICAgICAgbGV0IHN0b3JhZ2VfZGlyID0gY3JlYXRlX3Rlc3Rfc3RvcmFnZV9maWxlcygxKTsKICAgICAgICAgLy8gU0FGRVRZOgogICAgICAgICAvLyBUaGUgc2FmZXR5IGhlcmUgaXMgZW5zdXJlZCBhcyB0aGUgdGVzdCBwcm9jZXNzIHdpbGwgbm90IHdyaXRlIHRvIHRlbXAgc3RvcmFnZSBmaWxlCiAgICAgICAgIGxldCBmbGFnX21hcHBlZF9maWxlID0KQEAgLTEyNSw3ICsxNzEsNyBAQAogCiAgICAgI1t0ZXN0XQogICAgIGZuIHRlc3Rfbm9uZV9leGlzdF9mbGFnX2NvbnRleHRfcXVlcnkoKSB7Ci0gICAgICAgIGxldCBzdG9yYWdlX2RpciA9IGNyZWF0ZV90ZXN0X3N0b3JhZ2VfZmlsZXMoKTsKKyAgICAgICAgbGV0IHN0b3JhZ2VfZGlyID0gY3JlYXRlX3Rlc3Rfc3RvcmFnZV9maWxlcygxKTsKICAgICAgICAgLy8gU0FGRVRZOgogICAgICAgICAvLyBUaGUgc2FmZXR5IGhlcmUgaXMgZW5zdXJlZCBhcyB0aGUgdGVzdCBwcm9jZXNzIHdpbGwgbm90IHdyaXRlIHRvIHRlbXAgc3RvcmFnZSBmaWxlCiAgICAgICAgIGxldCBmbGFnX21hcHBlZF9maWxlID0KQEAgLTE0MSw3ICsxODcsNyBAQAogCiAgICAgI1t0ZXN0XQogICAgIGZuIHRlc3RfYm9vbGVhbl9mbGFnX3ZhbHVlX3F1ZXJ5KCkgewotICAgICAgICBsZXQgc3RvcmFnZV9kaXIgPSBjcmVhdGVfdGVzdF9zdG9yYWdlX2ZpbGVzKCk7CisgICAgICAgIGxldCBzdG9yYWdlX2RpciA9IGNyZWF0ZV90ZXN0X3N0b3JhZ2VfZmlsZXMoMSk7CiAgICAgICAgIC8vIFNBRkVUWToKICAgICAgICAgLy8gVGhlIHNhZmV0eSBoZXJlIGlzIGVuc3VyZWQgYXMgdGhlIHRlc3QgcHJvY2VzcyB3aWxsIG5vdCB3cml0ZSB0byB0ZW1wIHN0b3JhZ2UgZmlsZQogICAgICAgICBsZXQgZmxhZ192YWx1ZV9maWxlID0KQEAgLTE1NSw3ICsyMDEsNyBAQAogCiAgICAgI1t0ZXN0XQogICAgIGZuIHRlc3RfaW52YWxpZF9ib29sZWFuX2ZsYWdfdmFsdWVfcXVlcnkoKSB7Ci0gICAgICAgIGxldCBzdG9yYWdlX2RpciA9IGNyZWF0ZV90ZXN0X3N0b3JhZ2VfZmlsZXMoKTsKKyAgICAgICAgbGV0IHN0b3JhZ2VfZGlyID0gY3JlYXRlX3Rlc3Rfc3RvcmFnZV9maWxlcygxKTsKICAgICAgICAgLy8gU0FGRVRZOgogICAgICAgICAvLyBUaGUgc2FmZXR5IGhlcmUgaXMgZW5zdXJlZCBhcyB0aGUgdGVzdCBwcm9jZXNzIHdpbGwgbm90IHdyaXRlIHRvIHRlbXAgc3RvcmFnZSBmaWxlCiAgICAgICAgIGxldCBmbGFnX3ZhbHVlX2ZpbGUgPQpAQCAtMTY5LDcgKzIxNSw3IEBACiAKICAgICAjW3Rlc3RdCiAgICAgZm4gdGVzdF9mbGFnX2luZm9fcXVlcnkoKSB7Ci0gICAgICAgIGxldCBzdG9yYWdlX2RpciA9IGNyZWF0ZV90ZXN0X3N0b3JhZ2VfZmlsZXMoKTsKKyAgICAgICAgbGV0IHN0b3JhZ2VfZGlyID0gY3JlYXRlX3Rlc3Rfc3RvcmFnZV9maWxlcygxKTsKICAgICAgICAgLy8gU0FGRVRZOgogICAgICAgICAvLyBUaGUgc2FmZXR5IGhlcmUgaXMgZW5zdXJlZCBhcyB0aGUgdGVzdCBwcm9jZXNzIHdpbGwgbm90IHdyaXRlIHRvIHRlbXAgc3RvcmFnZSBmaWxlCiAgICAgICAgIGxldCBmbGFnX2luZm9fZmlsZSA9CkBAIC0xODYsNyArMjMyLDcgQEAKIAogICAgICNbdGVzdF0KICAgICBmbiB0ZXN0X2ludmFsaWRfYm9vbGVhbl9mbGFnX2luZm9fcXVlcnkoKSB7Ci0gICAgICAgIGxldCBzdG9yYWdlX2RpciA9IGNyZWF0ZV90ZXN0X3N0b3JhZ2VfZmlsZXMoKTsKKyAgICAgICAgbGV0IHN0b3JhZ2VfZGlyID0gY3JlYXRlX3Rlc3Rfc3RvcmFnZV9maWxlcygxKTsKICAgICAgICAgLy8gU0FGRVRZOgogICAgICAgICAvLyBUaGUgc2FmZXR5IGhlcmUgaXMgZW5zdXJlZCBhcyB0aGUgdGVzdCBwcm9jZXNzIHdpbGwgbm90IHdyaXRlIHRvIHRlbXAgc3RvcmFnZSBmaWxlCiAgICAgICAgIGxldCBmbGFnX2luZm9fZmlsZSA9CkBAIC0xOTksMTAgKzI0NSwxOCBAQAogICAgIH0KIAogICAgICNbdGVzdF0KLSAgICBmbiB0ZXN0X3N0b3JhZ2VfdmVyc2lvbl9xdWVyeSgpIHsKLSAgICAgICAgYXNzZXJ0X2VxIShnZXRfc3RvcmFnZV9maWxlX3ZlcnNpb24oIi4vcGFja2FnZS5tYXAiKS51bndyYXAoKSwgMSk7Ci0gICAgICAgIGFzc2VydF9lcSEoZ2V0X3N0b3JhZ2VfZmlsZV92ZXJzaW9uKCIuL2ZsYWcubWFwIikudW53cmFwKCksIDEpOwotICAgICAgICBhc3NlcnRfZXEhKGdldF9zdG9yYWdlX2ZpbGVfdmVyc2lvbigiLi9mbGFnLnZhbCIpLnVud3JhcCgpLCAxKTsKLSAgICAgICAgYXNzZXJ0X2VxIShnZXRfc3RvcmFnZV9maWxlX3ZlcnNpb24oIi4vZmxhZy5pbmZvIikudW53cmFwKCksIDEpOworICAgIGZuIHRlc3Rfc3RvcmFnZV92ZXJzaW9uX3F1ZXJ5X3YxKCkgeworICAgICAgICBhc3NlcnRfZXEhKGdldF9zdG9yYWdlX2ZpbGVfdmVyc2lvbigiLi9kYXRhL3YxL3BhY2thZ2VfdjEubWFwIikudW53cmFwKCksIDEpOworICAgICAgICBhc3NlcnRfZXEhKGdldF9zdG9yYWdlX2ZpbGVfdmVyc2lvbigiLi9kYXRhL3YxL2ZsYWdfdjEubWFwIikudW53cmFwKCksIDEpOworICAgICAgICBhc3NlcnRfZXEhKGdldF9zdG9yYWdlX2ZpbGVfdmVyc2lvbigiLi9kYXRhL3YxL2ZsYWdfdjEudmFsIikudW53cmFwKCksIDEpOworICAgICAgICBhc3NlcnRfZXEhKGdldF9zdG9yYWdlX2ZpbGVfdmVyc2lvbigiLi9kYXRhL3YxL2ZsYWdfdjEuaW5mbyIpLnVud3JhcCgpLCAxKTsKKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9zdG9yYWdlX3ZlcnNpb25fcXVlcnlfdjIoKSB7CisgICAgICAgIGFzc2VydF9lcSEoZ2V0X3N0b3JhZ2VfZmlsZV92ZXJzaW9uKCIuL2RhdGEvdjIvcGFja2FnZV92Mi5tYXAiKS51bndyYXAoKSwgMik7CisgICAgICAgIGFzc2VydF9lcSEoZ2V0X3N0b3JhZ2VfZmlsZV92ZXJzaW9uKCIuL2RhdGEvdjIvZmxhZ192Mi5tYXAiKS51bndyYXAoKSwgMik7CisgICAgICAgIGFzc2VydF9lcSEoZ2V0X3N0b3JhZ2VfZmlsZV92ZXJzaW9uKCIuL2RhdGEvdjIvZmxhZ192Mi52YWwiKS51bndyYXAoKSwgMik7CisgICAgICAgIGFzc2VydF9lcSEoZ2V0X3N0b3JhZ2VfZmlsZV92ZXJzaW9uKCIuL2RhdGEvdjIvZmxhZ192Mi5pbmZvIikudW53cmFwKCksIDIpOwogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9BbmRyb2lkLmJwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL0FuZHJvaWQuYnAKaW5kZXggMGYxOTYyYy4uNGM4ODJiNCAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL0FuZHJvaWQuYnAKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL0FuZHJvaWQuYnAKQEAgLTE2LDYgKzE2LDExIEBACiAgICAgICAgICJsaWJhY29uZmlnX3N0b3JhZ2VfZmlsZSIsCiAgICAgICAgICJsaWJhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGkiLAogICAgIF0sCisgICAgbWluX3Nka192ZXJzaW9uOiAiMzQiLAorICAgIGFwZXhfYXZhaWxhYmxlOiBbCisgICAgICAgICIvL2FwZXhfYXZhaWxhYmxlOmFueWFwZXgiLAorICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgXSwKIH0KIAogcnVzdF9saWJyYXJ5IHsKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpLmNwcCBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpLmNwcAppbmRleCA3YjQzNTc0Li4wM2E4ZmEyIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS5jcHAKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkuY3BwCkBAIC0xMDAsMTggKzEwMCw0IEBACiAgIHJldHVybiB7fTsKIH0KIAotYW5kcm9pZDo6YmFzZTo6UmVzdWx0PHZvaWQ+IGNyZWF0ZV9mbGFnX2luZm8oCi0gICAgc3RkOjpzdHJpbmcgY29uc3QmIHBhY2thZ2VfbWFwLAotICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBmbGFnX21hcCwKLSAgICBzdGQ6OnN0cmluZyBjb25zdCYgZmxhZ19pbmZvX291dCkgewotICBhdXRvIGNyZWF0aW9uX2N4eCA9IGNyZWF0ZV9mbGFnX2luZm9fY3h4KAotICAgICAgcnVzdDo6U3RyKHBhY2thZ2VfbWFwLmNfc3RyKCkpLAotICAgICAgcnVzdDo6U3RyKGZsYWdfbWFwLmNfc3RyKCkpLAotICAgICAgcnVzdDo6U3RyKGZsYWdfaW5mb19vdXQuY19zdHIoKSkpOwotICBpZiAoY3JlYXRpb25fY3h4LnN1Y2Nlc3MpIHsKLSAgICByZXR1cm4ge307Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGFuZHJvaWQ6OmJhc2U6OkVycm9yKCkgPDwgY3JlYXRpb25fY3h4LmVycm9yX21lc3NhZ2U7Ci0gIH0KLX0KIH0gLy8gbmFtZXNwYWNlIGFjb25maWdfc3RvcmFnZQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL2luY2x1ZGUvYWNvbmZpZ19zdG9yYWdlL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkuaHBwIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL2luY2x1ZGUvYWNvbmZpZ19zdG9yYWdlL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkuaHBwCmluZGV4IDBiYmE3ZmYuLjUwYTUxODggMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9pbmNsdWRlL2Fjb25maWdfc3RvcmFnZS9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpLmhwcAorKysgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvaW5jbHVkZS9hY29uZmlnX3N0b3JhZ2UvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS5ocHAKQEAgLTM2LDEzICszNiw0IEBACiAgICAgdWludDMyX3Qgb2Zmc2V0LAogICAgIGJvb2wgdmFsdWUpOwogCi0vLy8gQ3JlYXRlIGZsYWcgaW5mbyBmaWxlIGJhc2VkIG9uIHBhY2thZ2UgYW5kIGZsYWcgbWFwCi0vLy8gXGlucHV0IHBhY2thZ2VfbWFwOiBwYWNrYWdlIG1hcCBmaWxlCi0vLy8gXGlucHV0IGZsYWdfbWFwOiBmbGFnIG1hcCBmaWxlCi0vLy8gXGlucHV0IGZsYWdfaW5mb19vdXQ6IGZsYWcgaW5mbyBmaWxlIHRvIGJlIGNyZWF0ZWQKLWFuZHJvaWQ6OmJhc2U6OlJlc3VsdDx2b2lkPiBjcmVhdGVfZmxhZ19pbmZvKAotICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBwYWNrYWdlX21hcCwKLSAgICBzdGQ6OnN0cmluZyBjb25zdCYgZmxhZ19tYXAsCi0gICAgc3RkOjpzdHJpbmcgY29uc3QmIGZsYWdfaW5mb19vdXQpOwotCiB9IC8vIG5hbWVzcGFjZSBhY29uZmlnX3N0b3JhZ2UKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9zcmMvZmxhZ19pbmZvX3VwZGF0ZS5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9zcmMvZmxhZ19pbmZvX3VwZGF0ZS5ycwppbmRleCA3ZTYwNzEzLi41NzIxMTA1IDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvc3JjL2ZsYWdfaW5mb191cGRhdGUucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL3NyYy9mbGFnX2luZm9fdXBkYXRlLnJzCkBAIC0xOCw3ICsxOCw3IEBACiAKIHVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6ewogICAgIHJlYWRfdThfZnJvbV9ieXRlcywgQWNvbmZpZ1N0b3JhZ2VFcnJvciwgRmxhZ0luZm9CaXQsIEZsYWdJbmZvSGVhZGVyLCBGbGFnVmFsdWVUeXBlLAotICAgIEZJTEVfVkVSU0lPTiwKKyAgICBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiwKIH07CiB1c2UgYW55aG93Ojphbnlob3c7CiAKQEAgLTI4LDExICsyOCwxMSBAQAogICAgIGZsYWdfaW5kZXg6IHUzMiwKICkgLT4gUmVzdWx0PHVzaXplLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CiAgICAgbGV0IGludGVycHJldGVkX2hlYWRlciA9IEZsYWdJbmZvSGVhZGVyOjpmcm9tX2J5dGVzKGJ1Zik/OwotICAgIGlmIGludGVycHJldGVkX2hlYWRlci52ZXJzaW9uID4gRklMRV9WRVJTSU9OIHsKKyAgICBpZiBpbnRlcnByZXRlZF9oZWFkZXIudmVyc2lvbiA+IE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OIHsKICAgICAgICAgcmV0dXJuIEVycihBY29uZmlnU3RvcmFnZUVycm9yOjpIaWdoZXJTdG9yYWdlRmlsZVZlcnNpb24oYW55aG93ISgKICAgICAgICAgICAgICJDYW5ub3Qgd3JpdGUgdG8gc3RvcmFnZSBmaWxlIHdpdGggYSBoaWdoZXIgdmVyc2lvbiBvZiB7fSB3aXRoIGxpYiB2ZXJzaW9uIHt9IiwKICAgICAgICAgICAgIGludGVycHJldGVkX2hlYWRlci52ZXJzaW9uLAotICAgICAgICAgICAgRklMRV9WRVJTSU9OCisgICAgICAgICAgICBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTgogICAgICAgICApKSk7CiAgICAgfQogCkBAIC05NCwxMyArOTQsMTMgQEAKICNbY2ZnKHRlc3QpXQogbW9kIHRlc3RzIHsKICAgICB1c2Ugc3VwZXI6Oio7Ci0gICAgdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp0ZXN0X3V0aWxzOjpjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdDsKKyAgICB1c2UgYWNvbmZpZ19zdG9yYWdlX2ZpbGU6Ont0ZXN0X3V0aWxzOjpjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdCwgREVGQVVMVF9GSUxFX1ZFUlNJT059OwogICAgIHVzZSBhY29uZmlnX3N0b3JhZ2VfcmVhZF9hcGk6OmZsYWdfaW5mb19xdWVyeTo6ZmluZF9mbGFnX2F0dHJpYnV0ZTsKIAogICAgICNbdGVzdF0KICAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBoYXMgc2VydmVyIG92ZXJyaWRlIHVwZGF0ZQogICAgIGZuIHRlc3RfdXBkYXRlX2ZsYWdfaGFzX3NlcnZlcl9vdmVycmlkZSgpIHsKLSAgICAgICAgbGV0IGZsYWdfaW5mb19saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QoKTsKKyAgICAgICAgbGV0IGZsYWdfaW5mb19saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ19pbmZvX2xpc3QoREVGQVVMVF9GSUxFX1ZFUlNJT04pOwogICAgICAgICBsZXQgbXV0IGJ1ZiA9IGZsYWdfaW5mb19saXN0LmludG9fYnl0ZXMoKTsKICAgICAgICAgZm9yIGkgaW4gMC4uZmxhZ19pbmZvX2xpc3QuaGVhZGVyLm51bV9mbGFncyB7CiAgICAgICAgICAgICB1cGRhdGVfZmxhZ19oYXNfc2VydmVyX292ZXJyaWRlKCZtdXQgYnVmLCBGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBpLCB0cnVlKS51bndyYXAoKTsKQEAgLTExNSw3ICsxMTUsNyBAQAogICAgICNbdGVzdF0KICAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biBoYXMgbG9jYWwgb3ZlcnJpZGUgdXBkYXRlCiAgICAgZm4gdGVzdF91cGRhdGVfZmxhZ19oYXNfbG9jYWxfb3ZlcnJpZGUoKSB7Ci0gICAgICAgIGxldCBmbGFnX2luZm9fbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0KCk7CisgICAgICAgIGxldCBmbGFnX2luZm9fbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0KERFRkFVTFRfRklMRV9WRVJTSU9OKTsKICAgICAgICAgbGV0IG11dCBidWYgPSBmbGFnX2luZm9fbGlzdC5pbnRvX2J5dGVzKCk7CiAgICAgICAgIGZvciBpIGluIDAuLmZsYWdfaW5mb19saXN0LmhlYWRlci5udW1fZmxhZ3MgewogICAgICAgICAgICAgdXBkYXRlX2ZsYWdfaGFzX2xvY2FsX292ZXJyaWRlKCZtdXQgYnVmLCBGbGFnVmFsdWVUeXBlOjpCb29sZWFuLCBpLCB0cnVlKS51bndyYXAoKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9zcmMvZmxhZ192YWx1ZV91cGRhdGUucnMgYi90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvc3JjL2ZsYWdfdmFsdWVfdXBkYXRlLnJzCmluZGV4IGRkMTVjOTkuLjk3NzJkYjkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9zcmMvZmxhZ192YWx1ZV91cGRhdGUucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hY29uZmlnX3N0b3JhZ2Vfd3JpdGVfYXBpL3NyYy9mbGFnX3ZhbHVlX3VwZGF0ZS5ycwpAQCAtMTYsNyArMTYsNyBAQAogCiAvLyEgZmxhZyB2YWx1ZSB1cGRhdGUgbW9kdWxlIGRlZmluZXMgdGhlIGZsYWcgdmFsdWUgZmlsZSB3cml0ZSB0byBtYXBwZWQgYnl0ZXMKIAotdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp7QWNvbmZpZ1N0b3JhZ2VFcnJvciwgRmxhZ1ZhbHVlSGVhZGVyLCBGSUxFX1ZFUlNJT059OwordXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjp7QWNvbmZpZ1N0b3JhZ2VFcnJvciwgRmxhZ1ZhbHVlSGVhZGVyLCBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTn07CiB1c2UgYW55aG93Ojphbnlob3c7CiAKIC8vLyBTZXQgZmxhZyB2YWx1ZQpAQCAtMjYsMTEgKzI2LDExIEBACiAgICAgZmxhZ192YWx1ZTogYm9vbCwKICkgLT4gUmVzdWx0PHVzaXplLCBBY29uZmlnU3RvcmFnZUVycm9yPiB7CiAgICAgbGV0IGludGVycHJldGVkX2hlYWRlciA9IEZsYWdWYWx1ZUhlYWRlcjo6ZnJvbV9ieXRlcyhidWYpPzsKLSAgICBpZiBpbnRlcnByZXRlZF9oZWFkZXIudmVyc2lvbiA+IEZJTEVfVkVSU0lPTiB7CisgICAgaWYgaW50ZXJwcmV0ZWRfaGVhZGVyLnZlcnNpb24gPiBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiB7CiAgICAgICAgIHJldHVybiBFcnIoQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6SGlnaGVyU3RvcmFnZUZpbGVWZXJzaW9uKGFueWhvdyEoCiAgICAgICAgICAgICAiQ2Fubm90IHdyaXRlIHRvIHN0b3JhZ2UgZmlsZSB3aXRoIGEgaGlnaGVyIHZlcnNpb24gb2Yge30gd2l0aCBsaWIgdmVyc2lvbiB7fSIsCiAgICAgICAgICAgICBpbnRlcnByZXRlZF9oZWFkZXIudmVyc2lvbiwKLSAgICAgICAgICAgIEZJTEVfVkVSU0lPTgorICAgICAgICAgICAgTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04KICAgICAgICAgKSkpOwogICAgIH0KIApAQCAtNDksMTIgKzQ5LDEyIEBACiAjW2NmZyh0ZXN0KV0KIG1vZCB0ZXN0cyB7CiAgICAgdXNlIHN1cGVyOjoqOwotICAgIHVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6dGVzdF91dGlsczo6Y3JlYXRlX3Rlc3RfZmxhZ192YWx1ZV9saXN0OworICAgIHVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6e3Rlc3RfdXRpbHM6OmNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdCwgREVGQVVMVF9GSUxFX1ZFUlNJT059OwogCiAgICAgI1t0ZXN0XQogICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIGZsYWcgdmFsdWUgdXBkYXRlCiAgICAgZm4gdGVzdF9ib29sZWFuX2ZsYWdfdmFsdWVfdXBkYXRlKCkgewotICAgICAgICBsZXQgZmxhZ192YWx1ZV9saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ192YWx1ZV9saXN0KCk7CisgICAgICAgIGxldCBmbGFnX3ZhbHVlX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QoREVGQVVMVF9GSUxFX1ZFUlNJT04pOwogICAgICAgICBsZXQgdmFsdWVfb2Zmc2V0ID0gZmxhZ192YWx1ZV9saXN0LmhlYWRlci5ib29sZWFuX3ZhbHVlX29mZnNldDsKICAgICAgICAgbGV0IG11dCBjb250ZW50ID0gZmxhZ192YWx1ZV9saXN0LmludG9fYnl0ZXMoKTsKICAgICAgICAgbGV0IHRydWVfYnl0ZSA9IHU4Ojpmcm9tKHRydWUpLnRvX2xlX2J5dGVzKClbMF07CkBAIC03Miw3ICs3Miw3IEBACiAgICAgI1t0ZXN0XQogICAgIC8vIHRoaXMgdGVzdCBwb2ludCBsb2NrcyBkb3duIHVwZGF0ZSBiZXlvbmQgdGhlIGVuZCBvZiBib29sZWFuIHNlY3Rpb24KICAgICBmbiB0ZXN0X2Jvb2xlYW5fb3V0X29mX3JhbmdlKCkgewotICAgICAgICBsZXQgbXV0IGZsYWdfdmFsdWVfbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdCgpLmludG9fYnl0ZXMoKTsKKyAgICAgICAgbGV0IG11dCBmbGFnX3ZhbHVlX2xpc3QgPSBjcmVhdGVfdGVzdF9mbGFnX3ZhbHVlX2xpc3QoREVGQVVMVF9GSUxFX1ZFUlNJT04pLmludG9fYnl0ZXMoKTsKICAgICAgICAgbGV0IGVycm9yID0gdXBkYXRlX2Jvb2xlYW5fZmxhZ192YWx1ZSgmbXV0IGZsYWdfdmFsdWVfbGlzdFsuLl0sIDgsIHRydWUpLnVud3JhcF9lcnIoKTsKICAgICAgICAgYXNzZXJ0X2VxISgKICAgICAgICAgICAgIGZvcm1hdCEoIns6P30iLCBlcnJvciksCkBAIC04MywxNiArODMsMTYgQEAKICAgICAjW3Rlc3RdCiAgICAgLy8gdGhpcyB0ZXN0IHBvaW50IGxvY2tzIGRvd24gcXVlcnkgZXJyb3Igd2hlbiBmaWxlIGhhcyBhIGhpZ2hlciB2ZXJzaW9uCiAgICAgZm4gdGVzdF9oaWdoZXJfdmVyc2lvbl9zdG9yYWdlX2ZpbGUoKSB7Ci0gICAgICAgIGxldCBtdXQgdmFsdWVfbGlzdCA9IGNyZWF0ZV90ZXN0X2ZsYWdfdmFsdWVfbGlzdCgpOwotICAgICAgICB2YWx1ZV9saXN0LmhlYWRlci52ZXJzaW9uID0gRklMRV9WRVJTSU9OICsgMTsKKyAgICAgICAgbGV0IG11dCB2YWx1ZV9saXN0ID0gY3JlYXRlX3Rlc3RfZmxhZ192YWx1ZV9saXN0KERFRkFVTFRfRklMRV9WRVJTSU9OKTsKKyAgICAgICAgdmFsdWVfbGlzdC5oZWFkZXIudmVyc2lvbiA9IE1BWF9TVVBQT1JURURfRklMRV9WRVJTSU9OICsgMTsKICAgICAgICAgbGV0IG11dCBmbGFnX3ZhbHVlID0gdmFsdWVfbGlzdC5pbnRvX2J5dGVzKCk7CiAgICAgICAgIGxldCBlcnJvciA9IHVwZGF0ZV9ib29sZWFuX2ZsYWdfdmFsdWUoJm11dCBmbGFnX3ZhbHVlWy4uXSwgNCwgdHJ1ZSkudW53cmFwX2VycigpOwogICAgICAgICBhc3NlcnRfZXEhKAogICAgICAgICAgICAgZm9ybWF0ISgiezo/fSIsIGVycm9yKSwKICAgICAgICAgICAgIGZvcm1hdCEoCiAgICAgICAgICAgICAgICAgIkhpZ2hlclN0b3JhZ2VGaWxlVmVyc2lvbihDYW5ub3Qgd3JpdGUgdG8gc3RvcmFnZSBmaWxlIHdpdGggYSBoaWdoZXIgdmVyc2lvbiBvZiB7fSB3aXRoIGxpYiB2ZXJzaW9uIHt9KSIsCi0gICAgICAgICAgICAgICAgRklMRV9WRVJTSU9OICsgMSwKLSAgICAgICAgICAgICAgICBGSUxFX1ZFUlNJT04KKyAgICAgICAgICAgICAgICBNQVhfU1VQUE9SVEVEX0ZJTEVfVkVSU0lPTiArIDEsCisgICAgICAgICAgICAgICAgTUFYX1NVUFBPUlRFRF9GSUxFX1ZFUlNJT04KICAgICAgICAgICAgICkKICAgICAgICAgKTsKICAgICB9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Fjb25maWdfc3RvcmFnZV93cml0ZV9hcGkvc3JjL2xpYi5ycyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9zcmMvbGliLnJzCmluZGV4IDAzOTZhNjMuLjA5YmI0MWYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9zcmMvbGliLnJzCisrKyBiL3Rvb2xzL2Fjb25maWcvYWNvbmZpZ19zdG9yYWdlX3dyaXRlX2FwaS9zcmMvbGliLnJzCkBAIC0yNCwxNSArMjQsMTAgQEAKICNbY2ZnKHRlc3QpXQogbW9kIHRlc3RfdXRpbHM7CiAKLXVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6ewotICAgIEFjb25maWdTdG9yYWdlRXJyb3IsIEZsYWdJbmZvSGVhZGVyLCBGbGFnSW5mb0xpc3QsIEZsYWdJbmZvTm9kZSwgRmxhZ1RhYmxlLCBGbGFnVmFsdWVUeXBlLAotICAgIFBhY2thZ2VUYWJsZSwgU3RvcmFnZUZpbGVUeXBlLCBTdG9yZWRGbGFnVHlwZSwgRklMRV9WRVJTSU9OLAotfTsKK3VzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6e0Fjb25maWdTdG9yYWdlRXJyb3IsIEZsYWdWYWx1ZVR5cGV9OwogCiB1c2UgYW55aG93Ojphbnlob3c7CiB1c2UgbWVtbWFwMjo6TW1hcE11dDsKLXVzZSBzdGQ6OmZzOjpGaWxlOwotdXNlIHN0ZDo6aW86OntSZWFkLCBXcml0ZX07CiAKIC8vLyBHZXQgcmVhZCB3cml0ZSBtYXBwZWQgc3RvcmFnZSBmaWxlcy4KIC8vLwpAQCAtMTA0LDg2ICs5OSw2IEBACiAgICAgfSkKIH0KIAotLy8vIFJlYWQgaW4gc3RvcmFnZSBmaWxlIGFzIGJ5dGVzCi1mbiByZWFkX2ZpbGVfdG9fYnl0ZXMoZmlsZV9wYXRoOiAmc3RyKSAtPiBSZXN1bHQ8VmVjPHU4PiwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4gewotICAgIGxldCBtdXQgZmlsZSA9IEZpbGU6Om9wZW4oZmlsZV9wYXRoKS5tYXBfZXJyKHxlcnJtc2d8IHsKLSAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6RmlsZVJlYWRGYWlsKGFueWhvdyEoIkZhaWxlZCB0byBvcGVuIGZpbGUge306IHt9IiwgZmlsZV9wYXRoLCBlcnJtc2cpKQotICAgIH0pPzsKLSAgICBsZXQgbXV0IGJ1ZmZlciA9IFZlYzo6bmV3KCk7Ci0gICAgZmlsZS5yZWFkX3RvX2VuZCgmbXV0IGJ1ZmZlcikubWFwX2Vycih8ZXJybXNnfCB7Ci0gICAgICAgIEFjb25maWdTdG9yYWdlRXJyb3I6OkZpbGVSZWFkRmFpbChhbnlob3chKAotICAgICAgICAgICAgIkZhaWxlZCB0byByZWFkIGJ5dGVzIGZyb20gZmlsZSB7fToge30iLAotICAgICAgICAgICAgZmlsZV9wYXRoLAotICAgICAgICAgICAgZXJybXNnCi0gICAgICAgICkpCi0gICAgfSk/OwotICAgIE9rKGJ1ZmZlcikKLX0KLQotLy8vIENyZWF0ZSBmbGFnIGluZm8gZmlsZSBnaXZlbiBwYWNrYWdlIG1hcCBmaWxlIGFuZCBmbGFnIG1hcCBmaWxlCi0vLy8gXGlucHV0IHBhY2thZ2VfbWFwOiBwYWNrYWdlIG1hcCBmaWxlCi0vLy8gXGlucHV0IGZsYWdfbWFwOiBmbGFnIG1hcCBmaWxlCi0vLy8gXG91dHB1dCBmbGFnX2luZm9fb3V0OiBjcmVhdGVkIGZsYWcgaW5mbyBmaWxlCi1wdWIgZm4gY3JlYXRlX2ZsYWdfaW5mbygKLSAgICBwYWNrYWdlX21hcDogJnN0ciwKLSAgICBmbGFnX21hcDogJnN0ciwKLSAgICBmbGFnX2luZm9fb3V0OiAmc3RyLAotKSAtPiBSZXN1bHQ8KCksIEFjb25maWdTdG9yYWdlRXJyb3I+IHsKLSAgICBsZXQgcGFja2FnZV90YWJsZSA9IFBhY2thZ2VUYWJsZTo6ZnJvbV9ieXRlcygmcmVhZF9maWxlX3RvX2J5dGVzKHBhY2thZ2VfbWFwKT8pPzsKLSAgICBsZXQgZmxhZ190YWJsZSA9IEZsYWdUYWJsZTo6ZnJvbV9ieXRlcygmcmVhZF9maWxlX3RvX2J5dGVzKGZsYWdfbWFwKT8pPzsKLQotICAgIGlmIHBhY2thZ2VfdGFibGUuaGVhZGVyLmNvbnRhaW5lciAhPSBmbGFnX3RhYmxlLmhlYWRlci5jb250YWluZXIgewotICAgICAgICByZXR1cm4gRXJyKEFjb25maWdTdG9yYWdlRXJyb3I6OkZpbGVDcmVhdGlvbkZhaWwoYW55aG93ISgKLSAgICAgICAgICAgICJjb250YWluZXIgZm9yIHBhY2thZ2UgbWFwIHt9IGFuZCBmbGFnIG1hcCB7fSBkb2VzIG5vdCBtYXRjaCIsCi0gICAgICAgICAgICBwYWNrYWdlX3RhYmxlLmhlYWRlci5jb250YWluZXIsCi0gICAgICAgICAgICBmbGFnX3RhYmxlLmhlYWRlci5jb250YWluZXIsCi0gICAgICAgICkpKTsKLSAgICB9Ci0KLSAgICBsZXQgbXV0IHBhY2thZ2Vfc3RhcnRfaW5kZXggPSB2ZWMhWzA7IHBhY2thZ2VfdGFibGUuaGVhZGVyLm51bV9wYWNrYWdlcyBhcyB1c2l6ZV07Ci0gICAgZm9yIG5vZGUgaW4gcGFja2FnZV90YWJsZS5ub2Rlcy5pdGVyKCkgewotICAgICAgICBwYWNrYWdlX3N0YXJ0X2luZGV4W25vZGUucGFja2FnZV9pZCBhcyB1c2l6ZV0gPSBub2RlLmJvb2xlYW5fc3RhcnRfaW5kZXg7Ci0gICAgfQotCi0gICAgbGV0IG11dCBpc19mbGFnX3J3ID0gdmVjIVtmYWxzZTsgZmxhZ190YWJsZS5oZWFkZXIubnVtX2ZsYWdzIGFzIHVzaXplXTsKLSAgICBmb3Igbm9kZSBpbiBmbGFnX3RhYmxlLm5vZGVzLml0ZXIoKSB7Ci0gICAgICAgIGxldCBmbGFnX2luZGV4ID0gcGFja2FnZV9zdGFydF9pbmRleFtub2RlLnBhY2thZ2VfaWQgYXMgdXNpemVdICsgbm9kZS5mbGFnX2luZGV4IGFzIHUzMjsKLSAgICAgICAgaXNfZmxhZ19yd1tmbGFnX2luZGV4IGFzIHVzaXplXSA9IG5vZGUuZmxhZ190eXBlID09IFN0b3JlZEZsYWdUeXBlOjpSZWFkV3JpdGVCb29sZWFuOwotICAgIH0KLQotICAgIGxldCBtdXQgbGlzdCA9IEZsYWdJbmZvTGlzdCB7Ci0gICAgICAgIGhlYWRlcjogRmxhZ0luZm9IZWFkZXIgewotICAgICAgICAgICAgdmVyc2lvbjogRklMRV9WRVJTSU9OLAotICAgICAgICAgICAgY29udGFpbmVyOiBmbGFnX3RhYmxlLmhlYWRlci5jb250YWluZXIsCi0gICAgICAgICAgICBmaWxlX3R5cGU6IFN0b3JhZ2VGaWxlVHlwZTo6RmxhZ0luZm8gYXMgdTgsCi0gICAgICAgICAgICBmaWxlX3NpemU6IDAsCi0gICAgICAgICAgICBudW1fZmxhZ3M6IGZsYWdfdGFibGUuaGVhZGVyLm51bV9mbGFncywKLSAgICAgICAgICAgIGJvb2xlYW5fZmxhZ19vZmZzZXQ6IDAsCi0gICAgICAgIH0sCi0gICAgICAgIG5vZGVzOiBpc19mbGFnX3J3Lml0ZXIoKS5tYXAofCZyd3wgRmxhZ0luZm9Ob2RlOjpjcmVhdGUocncpKS5jb2xsZWN0KCksCi0gICAgfTsKLQotICAgIGxpc3QuaGVhZGVyLmJvb2xlYW5fZmxhZ19vZmZzZXQgPSBsaXN0LmhlYWRlci5pbnRvX2J5dGVzKCkubGVuKCkgYXMgdTMyOwotICAgIGxpc3QuaGVhZGVyLmZpbGVfc2l6ZSA9IGxpc3QuaW50b19ieXRlcygpLmxlbigpIGFzIHUzMjsKLQotICAgIGxldCBtdXQgZmlsZSA9IEZpbGU6OmNyZWF0ZShmbGFnX2luZm9fb3V0KS5tYXBfZXJyKHxlcnJtc2d8IHsKLSAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6RmlsZUNyZWF0aW9uRmFpbChhbnlob3chKAotICAgICAgICAgICAgImZhaWwgdG8gY3JlYXRlIGZpbGUge306IHt9IiwKLSAgICAgICAgICAgIGZsYWdfaW5mb19vdXQsCi0gICAgICAgICAgICBlcnJtc2cKLSAgICAgICAgKSkKLSAgICB9KT87Ci0gICAgZmlsZS53cml0ZV9hbGwoJmxpc3QuaW50b19ieXRlcygpKS5tYXBfZXJyKHxlcnJtc2d8IHsKLSAgICAgICAgQWNvbmZpZ1N0b3JhZ2VFcnJvcjo6RmlsZUNyZWF0aW9uRmFpbChhbnlob3chKAotICAgICAgICAgICAgImZhaWwgdG8gd3JpdGUgdG8gZmlsZSB7fToge30iLAotICAgICAgICAgICAgZmxhZ19pbmZvX291dCwKLSAgICAgICAgICAgIGVycm1zZwotICAgICAgICApKQotICAgIH0pPzsKLQotICAgIE9rKCgpKQotfQotCiAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KIC8vIENDIElOVEVSTE9QCiAvLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogLy8KQEAgLTIxMiwxMiArMTI3LDYgQEAKICAgICAgICAgcHViIGVycm9yX21lc3NhZ2U6IFN0cmluZywKICAgICB9CiAKLSAgICAvLyBGbGFnIGluZm8gZmlsZSBjcmVhdGlvbiByZXR1cm4gZm9yIGNjIGludGVybG9wCi0gICAgcHViIHN0cnVjdCBGbGFnSW5mb0NyZWF0aW9uQ1hYIHsKLSAgICAgICAgcHViIHN1Y2Nlc3M6IGJvb2wsCi0gICAgICAgIHB1YiBlcnJvcl9tZXNzYWdlOiBTdHJpbmcsCi0gICAgfQotCiAgICAgLy8gUnVzdCBleHBvcnQgdG8gYysrCiAgICAgZXh0ZXJuICJSdXN0IiB7CiAgICAgICAgIHB1YiBmbiB1cGRhdGVfYm9vbGVhbl9mbGFnX3ZhbHVlX2N4eCgKQEAgLTIzOSwxMiArMTQ4LDYgQEAKICAgICAgICAgICAgIG9mZnNldDogdTMyLAogICAgICAgICAgICAgdmFsdWU6IGJvb2wsCiAgICAgICAgICkgLT4gRmxhZ0hhc0xvY2FsT3ZlcnJpZGVVcGRhdGVDWFg7Ci0KLSAgICAgICAgcHViIGZuIGNyZWF0ZV9mbGFnX2luZm9fY3h4KAotICAgICAgICAgICAgcGFja2FnZV9tYXA6ICZzdHIsCi0gICAgICAgICAgICBmbGFnX21hcDogJnN0ciwKLSAgICAgICAgICAgIGZsYWdfaW5mb19vdXQ6ICZzdHIsCi0gICAgICAgICkgLT4gRmxhZ0luZm9DcmVhdGlvbkNYWDsKICAgICB9CiB9CiAKQEAgLTMyOSwzNCArMjMyLDE1IEBACiAgICAgfQogfQogCi0vLy8gQ3JlYXRlIGZsYWcgaW5mbyBmaWxlIGNjIGludGVybG9wCi1wdWIoY3JhdGUpIGZuIGNyZWF0ZV9mbGFnX2luZm9fY3h4KAotICAgIHBhY2thZ2VfbWFwOiAmc3RyLAotICAgIGZsYWdfbWFwOiAmc3RyLAotICAgIGZsYWdfaW5mb19vdXQ6ICZzdHIsCi0pIC0+IGZmaTo6RmxhZ0luZm9DcmVhdGlvbkNYWCB7Ci0gICAgbWF0Y2ggY3JlYXRlX2ZsYWdfaW5mbyhwYWNrYWdlX21hcCwgZmxhZ19tYXAsIGZsYWdfaW5mb19vdXQpIHsKLSAgICAgICAgT2soKCkpID0+IGZmaTo6RmxhZ0luZm9DcmVhdGlvbkNYWCB7IHN1Y2Nlc3M6IHRydWUsIGVycm9yX21lc3NhZ2U6IFN0cmluZzo6ZnJvbSgiIikgfSwKLSAgICAgICAgRXJyKGVycm1zZykgPT4gewotICAgICAgICAgICAgZmZpOjpGbGFnSW5mb0NyZWF0aW9uQ1hYIHsgc3VjY2VzczogZmFsc2UsIGVycm9yX21lc3NhZ2U6IGZvcm1hdCEoIns6P30iLCBlcnJtc2cpIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQogI1tjZmcodGVzdCldCiBtb2QgdGVzdHMgewogICAgIHVzZSBzdXBlcjo6KjsKICAgICB1c2UgY3JhdGU6OnRlc3RfdXRpbHM6OmNvcHlfdG9fdGVtcF9maWxlOwotICAgIHVzZSBhY29uZmlnX3N0b3JhZ2VfZmlsZTo6dGVzdF91dGlsczo6ewotICAgICAgICBjcmVhdGVfdGVzdF9mbGFnX2luZm9fbGlzdCwgY3JlYXRlX3Rlc3RfZmxhZ190YWJsZSwgY3JlYXRlX3Rlc3RfcGFja2FnZV90YWJsZSwKLSAgICAgICAgd3JpdGVfYnl0ZXNfdG9fdGVtcF9maWxlLAotICAgIH07CiAgICAgdXNlIGFjb25maWdfc3RvcmFnZV9maWxlOjpGbGFnSW5mb0JpdDsKICAgICB1c2UgYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpOjpmbGFnX2luZm9fcXVlcnk6OmZpbmRfZmxhZ19hdHRyaWJ1dGU7CiAgICAgdXNlIGFjb25maWdfc3RvcmFnZV9yZWFkX2FwaTo6ZmxhZ192YWx1ZV9xdWVyeTo6ZmluZF9ib29sZWFuX2ZsYWdfdmFsdWU7CiAgICAgdXNlIHN0ZDo6ZnM6OkZpbGU7CiAgICAgdXNlIHN0ZDo6aW86OlJlYWQ7Ci0gICAgdXNlIHRlbXBmaWxlOjpOYW1lZFRlbXBGaWxlOwogCiAgICAgZm4gZ2V0X2Jvb2xlYW5fZmxhZ192YWx1ZV9hdF9vZmZzZXQoZmlsZTogJnN0ciwgb2Zmc2V0OiB1MzIpIC0+IGJvb2wgewogICAgICAgICBsZXQgbXV0IGYgPSBGaWxlOjpvcGVuKCZmaWxlKS51bndyYXAoKTsKQEAgLTQzOSwzMSArMzIzLDQgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQotICAgIGZuIGNyZWF0ZV9lbXB0eV90ZW1wX2ZpbGUoKSAtPiBSZXN1bHQ8TmFtZWRUZW1wRmlsZSwgQWNvbmZpZ1N0b3JhZ2VFcnJvcj4gewotICAgICAgICBsZXQgZmlsZSA9IE5hbWVkVGVtcEZpbGU6Om5ldygpLm1hcF9lcnIofF98IHsKLSAgICAgICAgICAgIEFjb25maWdTdG9yYWdlRXJyb3I6OkZpbGVDcmVhdGlvbkZhaWwoYW55aG93ISgiRmFpbGVkIHRvIGNyZWF0ZSB0ZW1wIGZpbGUiKSkKLSAgICAgICAgfSk/OwotICAgICAgICBPayhmaWxlKQotICAgIH0KLQotICAgICNbdGVzdF0KLSAgICAvLyB0aGlzIHRlc3QgcG9pbnQgbG9ja3MgZG93biB0aGUgZmxhZyBpbmZvIGNyZWF0aW9uCi0gICAgZm4gdGVzdF9jcmVhdGVfZmxhZ19pbmZvKCkgewotICAgICAgICBsZXQgcGFja2FnZV90YWJsZSA9Ci0gICAgICAgICAgICB3cml0ZV9ieXRlc190b190ZW1wX2ZpbGUoJmNyZWF0ZV90ZXN0X3BhY2thZ2VfdGFibGUoKS5pbnRvX2J5dGVzKCkpLnVud3JhcCgpOwotICAgICAgICBsZXQgZmxhZ190YWJsZSA9IHdyaXRlX2J5dGVzX3RvX3RlbXBfZmlsZSgmY3JlYXRlX3Rlc3RfZmxhZ190YWJsZSgpLmludG9fYnl0ZXMoKSkudW53cmFwKCk7Ci0gICAgICAgIGxldCBmbGFnX2luZm8gPSBjcmVhdGVfZW1wdHlfdGVtcF9maWxlKCkudW53cmFwKCk7Ci0KLSAgICAgICAgbGV0IHBhY2thZ2VfdGFibGVfcGF0aCA9IHBhY2thZ2VfdGFibGUucGF0aCgpLmRpc3BsYXkoKS50b19zdHJpbmcoKTsKLSAgICAgICAgbGV0IGZsYWdfdGFibGVfcGF0aCA9IGZsYWdfdGFibGUucGF0aCgpLmRpc3BsYXkoKS50b19zdHJpbmcoKTsKLSAgICAgICAgbGV0IGZsYWdfaW5mb19wYXRoID0gZmxhZ19pbmZvLnBhdGgoKS5kaXNwbGF5KCkudG9fc3RyaW5nKCk7Ci0KLSAgICAgICAgYXNzZXJ0IShjcmVhdGVfZmxhZ19pbmZvKCZwYWNrYWdlX3RhYmxlX3BhdGgsICZmbGFnX3RhYmxlX3BhdGgsICZmbGFnX2luZm9fcGF0aCkuaXNfb2soKSk7Ci0KLSAgICAgICAgbGV0IGZsYWdfaW5mbyA9Ci0gICAgICAgICAgICBGbGFnSW5mb0xpc3Q6OmZyb21fYnl0ZXMoJnJlYWRfZmlsZV90b19ieXRlcygmZmxhZ19pbmZvX3BhdGgpLnVud3JhcCgpKS51bndyYXAoKTsKLSAgICAgICAgbGV0IGV4cGVjdGVkX2ZsYWdfaW5mbyA9IGNyZWF0ZV90ZXN0X2ZsYWdfaW5mb19saXN0KCk7Ci0gICAgICAgIGFzc2VydF9lcSEoZmxhZ19pbmZvLCBleHBlY3RlZF9mbGFnX2luZm8pOwotICAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWZsYWdzL0FuZHJvaWQuYnAgYi90b29scy9hY29uZmlnL2FmbGFncy9BbmRyb2lkLmJwCmluZGV4IDIwNDBjYzYuLjM0MTk3NWQgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvYWZsYWdzL0FuZHJvaWQuYnAKKysrIGIvdG9vbHMvYWNvbmZpZy9hZmxhZ3MvQW5kcm9pZC5icApAQCAtMTIsNyArMTIsNyBAQAogICAgICAgICAibGliYWNvbmZpZ19kZXZpY2VfcGF0aHMiLAogICAgICAgICAibGliYWNvbmZpZ19mbGFncyIsCiAgICAgICAgICJsaWJhY29uZmlnX3Byb3RvcyIsCi0gICAgICAgICJsaWJhY29uZmlnZF9wcm90b3MiLAorICAgICAgICAibGliYWNvbmZpZ2RfcHJvdG9zX3J1c3QiLAogICAgICAgICAibGliYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpIiwKICAgICAgICAgImxpYmFjb25maWdfc3RvcmFnZV9maWxlIiwKICAgICAgICAgImxpYmFueWhvdyIsCkBAIC0yMCw2ICsyMCwxMCBAQAogICAgICAgICAibGlibml4IiwKICAgICAgICAgImxpYnByb3RvYnVmIiwKICAgICAgICAgImxpYnJlZ2V4IiwKKyAgICAgICAgLy8gVE9ETzogYi8zNzEwMjExNzQgcmVtb3ZlIHRoaXMgZmFrZSBkZXBlbmRlbmN5IG9uY2Ugd2UgZmluZCBhIHByb3BlciBzdHJhdGVneSB0bworICAgICAgICAvLyBkZWFsIHdpdGggdGVzdCBhY29uZmlnIGxpYnMgYXJlIG5vdCBwcmVzZW50IGluIHN0b3JhZ2UgYmVjYXVzZSB0aGV5IGFyZSBuZXZlciB1c2VkCisgICAgICAgIC8vIGJ5IHRoZSBhY3R1YWwgYnVpbGQKKyAgICAgICAgImxpYmFjb25maWdfdGVzdF9ydXN0X2xpYnJhcnkiLAogICAgIF0sCiB9CiAKQEAgLTI3LDYgKzMxLDkgQEAKICAgICBuYW1lOiAiYWZsYWdzIiwKICAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKICAgICBkZWZhdWx0czogWyJhZmxhZ3MuZGVmYXVsdHMiXSwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgXSwKIH0KIAogcnVzdF90ZXN0X2hvc3QgewpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9hZmxhZ3MvQ2FyZ28udG9tbCBiL3Rvb2xzL2Fjb25maWcvYWZsYWdzL0NhcmdvLnRvbWwKaW5kZXggN2VmY2U2ZC4uZDMxZTIzMiAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hZmxhZ3MvQ2FyZ28udG9tbAorKysgYi90b29scy9hY29uZmlnL2FmbGFncy9DYXJnby50b21sCkBAIC05LDEwICs5LDEwIEBACiBwcm90b2J1ZiA9ICIzLjIuMCIKIHJlZ2V4ID0gIjEuMTAuMyIKIGFjb25maWdfcHJvdG9zID0geyBwYXRoID0gIi4uL2Fjb25maWdfcHJvdG9zIiB9Ci1hY29uZmlnZF9wcm90b3MgPSB7IHZlcnNpb24gPSAiMC4xLjAiLCBwYXRoID0gIi4uLy4uLy4uLy4uLy4uL3N5c3RlbS9zZXJ2ZXJfY29uZmlndXJhYmxlX2ZsYWdzL2Fjb25maWdkIn0KK2Fjb25maWdkX3Byb3RvcyA9IHsgdmVyc2lvbiA9ICIwLjEuMCIsIHBhdGggPSAiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvbW9kdWxlcy9Db25maWdJbmZyYXN0cnVjdHVyZS9hY29uZmlnZC9wcm90byJ9CiBuaXggPSB7IHZlcnNpb24gPSAiMC4yOC4wIiwgZmVhdHVyZXMgPSBbInVzZXIiXSB9CiBhY29uZmlnX3N0b3JhZ2VfZmlsZSA9IHsgdmVyc2lvbiA9ICIwLjEuMCIsIHBhdGggPSAiLi4vYWNvbmZpZ19zdG9yYWdlX2ZpbGUiIH0KIGFjb25maWdfc3RvcmFnZV9yZWFkX2FwaSA9IHsgdmVyc2lvbiA9ICIwLjEuMCIsIHBhdGggPSAiLi4vYWNvbmZpZ19zdG9yYWdlX3JlYWRfYXBpIiB9CiBjbGFwID0ge3ZlcnNpb24gPSAiNC41LjIiIH0KIGFjb25maWdfZGV2aWNlX3BhdGhzID0geyB2ZXJzaW9uID0gIjAuMS4wIiwgcGF0aCA9ICIuLi9hY29uZmlnX2RldmljZV9wYXRocyIgfQotYWNvbmZpZ19mbGFncyA9IHsgdmVyc2lvbiA9ICIwLjEuMCIsIHBhdGggPSAiLi4vYWNvbmZpZ19mbGFncyIgfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK2Fjb25maWdfZmxhZ3MgPSB7IHZlcnNpb24gPSAiMC4xLjAiLCBwYXRoID0gIi4uL2Fjb25maWdfZmxhZ3MiIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWZsYWdzL3NyYy9hY29uZmlnX3N0b3JhZ2Vfc291cmNlLnJzIGIvdG9vbHMvYWNvbmZpZy9hZmxhZ3Mvc3JjL2Fjb25maWdfc3RvcmFnZV9zb3VyY2UucnMKaW5kZXggYjJmZDNjOS4uNzY2ODA3YSAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hZmxhZ3Mvc3JjL2Fjb25maWdfc3RvcmFnZV9zb3VyY2UucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hZmxhZ3Mvc3JjL2Fjb25maWdfc3RvcmFnZV9zb3VyY2UucnMKQEAgLTEsMyArMSw0IEBACit1c2UgY3JhdGU6OmxvYWRfcHJvdG9zOwogdXNlIGNyYXRlOjp7RmxhZywgRmxhZ1NvdXJjZX07CiB1c2UgY3JhdGU6OntGbGFnUGVybWlzc2lvbiwgRmxhZ1ZhbHVlLCBWYWx1ZVBpY2tlZEZyb219OwogdXNlIGFjb25maWdkX3Byb3Rvczo6ewpAQCAtOSwxMyArMTAsMzUgQEAKIHVzZSBhbnlob3c6OlJlc3VsdDsKIHVzZSBwcm90b2J1Zjo6TWVzc2FnZTsKIHVzZSBwcm90b2J1Zjo6U3BlY2lhbEZpZWxkczsKK3VzZSBzdGQ6OmNvbGxlY3Rpb25zOjpIYXNoTWFwOwogdXNlIHN0ZDo6aW86OntSZWFkLCBXcml0ZX07CiB1c2Ugc3RkOjpuZXQ6OlNodXRkb3duOwogdXNlIHN0ZDo6b3M6OnVuaXg6Om5ldDo6VW5peFN0cmVhbTsKIAogcHViIHN0cnVjdCBBY29uZmlnU3RvcmFnZVNvdXJjZSB7fQogCi1mbiBjb252ZXJ0KG1zZzogUHJvdG9GbGFnUXVlcnlSZXR1cm5NZXNzYWdlKSAtPiBSZXN1bHQ8RmxhZz4geworc3RhdGljIEFDT05GSUdEX1NZU1RFTV9TT0NLRVRfTkFNRTogJnN0ciA9ICIvZGV2L3NvY2tldC9hY29uZmlnZF9zeXN0ZW0iOworc3RhdGljIEFDT05GSUdEX01BSU5MSU5FX1NPQ0tFVF9OQU1FOiAmc3RyID0gIi9kZXYvc29ja2V0L2Fjb25maWdkX21haW5saW5lIjsKKworZW51bSBBY29uZmlnZFNvY2tldCB7CisgICAgU3lzdGVtLAorICAgIE1haW5saW5lLAorfQorCitpbXBsIEFjb25maWdkU29ja2V0IHsKKyAgICBwdWIgZm4gbmFtZSgmc2VsZikgLT4gJnN0ciB7CisgICAgICAgIG1hdGNoIHNlbGYgeworICAgICAgICAgICAgQWNvbmZpZ2RTb2NrZXQ6OlN5c3RlbSA9PiBBQ09ORklHRF9TWVNURU1fU09DS0VUX05BTUUsCisgICAgICAgICAgICBBY29uZmlnZFNvY2tldDo6TWFpbmxpbmUgPT4gQUNPTkZJR0RfTUFJTkxJTkVfU09DS0VUX05BTUUsCisgICAgICAgIH0KKyAgICB9Cit9CisKK2ZuIGxvYWRfZmxhZ190b19jb250YWluZXIoKSAtPiBSZXN1bHQ8SGFzaE1hcDxTdHJpbmcsIFN0cmluZz4+IHsKKyAgICBPayhsb2FkX3Byb3Rvczo6bG9hZCgpPy5pbnRvX2l0ZXIoKS5tYXAofHB8IChwLnF1YWxpZmllZF9uYW1lKCksIHAuY29udGFpbmVyKSkuY29sbGVjdCgpKQorfQorCitmbiBjb252ZXJ0KG1zZzogUHJvdG9GbGFnUXVlcnlSZXR1cm5NZXNzYWdlLCBjb250YWluZXJzOiAmSGFzaE1hcDxTdHJpbmcsIFN0cmluZz4pIC0+IFJlc3VsdDxGbGFnPiB7CiAgICAgbGV0ICh2YWx1ZSwgdmFsdWVfcGlja2VkX2Zyb20pID0gbWF0Y2ggKAogICAgICAgICAmbXNnLmJvb3RfZmxhZ192YWx1ZSwKICAgICAgICAgbXNnLmRlZmF1bHRfZmxhZ192YWx1ZSwKQEAgLTU1LDIxICs3OCwyNyBAQAogICAgICAgICBOb25lID0+IHJldHVybiBFcnIoYW55aG93ISgibWlzc2luZyBwZXJtaXNzaW9uIikpLAogICAgIH07CiAKKyAgICBsZXQgbmFtZSA9IG1zZy5mbGFnX25hbWUub2tfb3IoYW55aG93ISgibWlzc2luZyBmbGFnIG5hbWUiKSk/OworICAgIGxldCBwYWNrYWdlID0gbXNnLnBhY2thZ2VfbmFtZS5va19vcihhbnlob3chKCJtaXNzaW5nIHBhY2thZ2UgbmFtZSIpKT87CisgICAgbGV0IHF1YWxpZmllZF9uYW1lID0gZm9ybWF0ISgie3BhY2thZ2V9LntuYW1lfSIpOwogICAgIE9rKEZsYWcgewotICAgICAgICBuYW1lOiBtc2cuZmxhZ19uYW1lLm9rX29yKGFueWhvdyEoIm1pc3NpbmcgZmxhZyBuYW1lIikpPywKLSAgICAgICAgcGFja2FnZTogbXNnLnBhY2thZ2VfbmFtZS5va19vcihhbnlob3chKCJtaXNzaW5nIHBhY2thZ2UgbmFtZSIpKT8sCisgICAgICAgIG5hbWUsCisgICAgICAgIHBhY2thZ2UsCiAgICAgICAgIHZhbHVlLAogICAgICAgICBwZXJtaXNzaW9uLAogICAgICAgICB2YWx1ZV9waWNrZWRfZnJvbSwKICAgICAgICAgc3RhZ2VkX3ZhbHVlLAotICAgICAgICBjb250YWluZXI6ICItIi50b19zdHJpbmcoKSwKLQorICAgICAgICBjb250YWluZXI6IGNvbnRhaW5lcnMKKyAgICAgICAgICAgIC5nZXQoJnF1YWxpZmllZF9uYW1lKQorICAgICAgICAgICAgLmNsb25lZCgpCisgICAgICAgICAgICAudW53cmFwX29yX2Vsc2UofHwgIjxubyBjb250YWluZXI+Ii50b19zdHJpbmcoKSkKKyAgICAgICAgICAgIC50b19zdHJpbmcoKSwKICAgICAgICAgLy8gVE9ETzogcmVtb3ZlIG9uY2UgRGV2aWNlQ29uZmlnIGlzIG5vdCBpbiB0aGUgQ0xJLgogICAgICAgICBuYW1lc3BhY2U6ICItIi50b19zdHJpbmcoKSwKICAgICB9KQogfQogCi1mbiByZWFkX2Zyb21fc29ja2V0KCkgLT4gUmVzdWx0PFZlYzxQcm90b0ZsYWdRdWVyeVJldHVybk1lc3NhZ2U+PiB7CitmbiByZWFkX2Zyb21fc29ja2V0KHNvY2tldDogQWNvbmZpZ2RTb2NrZXQpIC0+IFJlc3VsdDxWZWM8UHJvdG9GbGFnUXVlcnlSZXR1cm5NZXNzYWdlPj4gewogICAgIGxldCBtZXNzYWdlcyA9IFByb3RvU3RvcmFnZVJlcXVlc3RNZXNzYWdlcyB7CiAgICAgICAgIG1zZ3M6IHZlYyFbUHJvdG9TdG9yYWdlUmVxdWVzdE1lc3NhZ2UgewogICAgICAgICAgICAgbXNnOiBTb21lKFByb3RvU3RvcmFnZVJlcXVlc3RNZXNzYWdlTXNnOjpMaXN0U3RvcmFnZU1lc3NhZ2UoUHJvdG9MaXN0U3RvcmFnZU1lc3NhZ2UgewpAQCAtODEsNyArMTEwLDcgQEAKICAgICAgICAgc3BlY2lhbF9maWVsZHM6IFNwZWNpYWxGaWVsZHM6Om5ldygpLAogICAgIH07CiAKLSAgICBsZXQgbXV0IHNvY2tldCA9IFVuaXhTdHJlYW06OmNvbm5lY3QoIi9kZXYvc29ja2V0L2Fjb25maWdkIik/OworICAgIGxldCBtdXQgc29ja2V0ID0gVW5peFN0cmVhbTo6Y29ubmVjdChzb2NrZXQubmFtZSgpKT87CiAKICAgICBsZXQgbWVzc2FnZV9idWZmZXIgPSBtZXNzYWdlcy53cml0ZV90b19ieXRlcygpPzsKICAgICBsZXQgbXV0IG1lc3NhZ2VfbGVuZ3RoX2J1ZmZlcjogW3U4OyA0XSA9IFswOyA0XTsKQEAgLTExNCwxMSArMTQzLDIxIEBACiAKIGltcGwgRmxhZ1NvdXJjZSBmb3IgQWNvbmZpZ1N0b3JhZ2VTb3VyY2UgewogICAgIGZuIGxpc3RfZmxhZ3MoKSAtPiBSZXN1bHQ8VmVjPEZsYWc+PiB7Ci0gICAgICAgIHJlYWRfZnJvbV9zb2NrZXQoKQotICAgICAgICAgICAgLm1hcCh8cXVlcnlfbWVzc2FnZXN8IHsKLSAgICAgICAgICAgICAgICBxdWVyeV9tZXNzYWdlcy5pdGVyKCkubWFwKHxtZXNzYWdlfCBjb252ZXJ0KG1lc3NhZ2UuY2xvbmUoKSkpLmNvbGxlY3Q6OjxWZWM8Xz4+KCkKLSAgICAgICAgICAgIH0pPworICAgICAgICBsZXQgY29udGFpbmVycyA9IGxvYWRfZmxhZ190b19jb250YWluZXIoKT87CisgICAgICAgIGxldCBzeXN0ZW1fbWVzc2FnZXMgPSByZWFkX2Zyb21fc29ja2V0KEFjb25maWdkU29ja2V0OjpTeXN0ZW0pOworICAgICAgICBsZXQgbWFpbmxpbmVfbWVzc2FnZXMgPSByZWFkX2Zyb21fc29ja2V0KEFjb25maWdkU29ja2V0OjpNYWlubGluZSk7CisKKyAgICAgICAgbGV0IG11dCBhbGxfbWVzc2FnZXMgPSB2ZWMhW107CisgICAgICAgIGlmIGxldCBPayhzeXN0ZW1fbWVzc2FnZXMpID0gc3lzdGVtX21lc3NhZ2VzIHsKKyAgICAgICAgICAgIGFsbF9tZXNzYWdlcy5leHRlbmRfZnJvbV9zbGljZSgmc3lzdGVtX21lc3NhZ2VzKTsKKyAgICAgICAgfQorICAgICAgICBpZiBsZXQgT2sobWFpbmxpbmVfbWVzc2FnZXMpID0gbWFpbmxpbmVfbWVzc2FnZXMgeworICAgICAgICAgICAgYWxsX21lc3NhZ2VzLmV4dGVuZF9mcm9tX3NsaWNlKCZtYWlubGluZV9tZXNzYWdlcyk7CisgICAgICAgIH0KKworICAgICAgICBhbGxfbWVzc2FnZXMKICAgICAgICAgICAgIC5pbnRvX2l0ZXIoKQorICAgICAgICAgICAgLm1hcCh8cXVlcnlfbWVzc2FnZXwgY29udmVydChxdWVyeV9tZXNzYWdlLmNsb25lKCksICZjb250YWluZXJzKSkKICAgICAgICAgICAgIC5jb2xsZWN0KCkKICAgICB9CiAKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWZsYWdzL3NyYy9sb2FkX3Byb3Rvcy5ycyBiL3Rvb2xzL2Fjb25maWcvYWZsYWdzL3NyYy9sb2FkX3Byb3Rvcy5ycwppbmRleCA5MGQ4NTk5Li5jNWFjOGZmIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2FmbGFncy9zcmMvbG9hZF9wcm90b3MucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hZmxhZ3Mvc3JjL2xvYWRfcHJvdG9zLnJzCkBAIC01MSw3ICs1MSwxMCBAQAogCiAgICAgbGV0IHBhdGhzID0gYWNvbmZpZ19kZXZpY2VfcGF0aHM6OnBhcnNlZF9mbGFnc19wcm90b19wYXRocygpPzsKICAgICBmb3IgcGF0aCBpbiBwYXRocyB7Ci0gICAgICAgIGxldCBieXRlcyA9IGZzOjpyZWFkKHBhdGguY2xvbmUoKSk/OworICAgICAgICBsZXQgT2soYnl0ZXMpID0gZnM6OnJlYWQoJnBhdGgpIGVsc2UgeworICAgICAgICAgICAgZXByaW50bG4hKCJ3YXJuaW5nOiBmYWlsZWQgdG8gcmVhZCB7Oj99IiwgcGF0aCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfTsKICAgICAgICAgbGV0IHBhcnNlZF9mbGFnczogUHJvdG9QYXJzZWRGbGFncyA9IHByb3RvYnVmOjpNZXNzYWdlOjpwYXJzZV9mcm9tX2J5dGVzKCZieXRlcyk/OwogICAgICAgICBmb3IgZmxhZyBpbiBwYXJzZWRfZmxhZ3MucGFyc2VkX2ZsYWcgewogICAgICAgICAgICAgLy8gVE9ETyhiLzMzNDk1NDc0OCk6IGVuZm9yY2Ugb25lLWNvbnRhaW5lci1wZXItZmxhZyBpbnZhcmlhbnQuCkBAIC02MCwzICs2MywxMCBAQAogICAgIH0KICAgICBPayhyZXN1bHQpCiB9CisKK3B1YihjcmF0ZSkgZm4gbGlzdF9jb250YWluZXJzKCkgLT4gUmVzdWx0PFZlYzxTdHJpbmc+PiB7CisgICAgT2soYWNvbmZpZ19kZXZpY2VfcGF0aHM6OnBhcnNlZF9mbGFnc19wcm90b19wYXRocygpPworICAgICAgICAuaW50b19pdGVyKCkKKyAgICAgICAgLm1hcCh8cHwgaW5mZXJfY29udGFpbmVyKCZwKSkKKyAgICAgICAgLmNvbGxlY3QoKSkKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvYWZsYWdzL3NyYy9tYWluLnJzIGIvdG9vbHMvYWNvbmZpZy9hZmxhZ3Mvc3JjL21haW4ucnMKaW5kZXggYTcyNmNjMC4uNTY4YWQ5OSAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9hZmxhZ3Mvc3JjL21haW4ucnMKKysrIGIvdG9vbHMvYWNvbmZpZy9hZmxhZ3Mvc3JjL21haW4ucnMKQEAgLTE2LDYgKzE2LDkgQEAKIAogLy8hIGBhZmxhZ3NgIGlzIGEgZGV2aWNlIGJpbmFyeSB0byByZWFkIGFuZCB3cml0ZSBhY29uZmlnIGZsYWdzLgogCit1c2Ugc3RkOjplbnY7Cit1c2Ugc3RkOjpwcm9jZXNzOjp7Q29tbWFuZCBhcyBPc0NvbW1hbmQsIFN0ZGlvfTsKKwogdXNlIGFueWhvdzo6e2FueWhvdywgZW5zdXJlLCBSZXN1bHR9OwogdXNlIGNsYXA6OlBhcnNlcjsKIApAQCAtMTE2LDkgKzExOSwxMCBAQAogICAgIH0KIAogICAgIGZuIGRpc3BsYXlfc3RhZ2VkX3ZhbHVlKCZzZWxmKSAtPiBTdHJpbmcgewotICAgICAgICBtYXRjaCBzZWxmLnN0YWdlZF92YWx1ZSB7Ci0gICAgICAgICAgICBTb21lKHYpID0+IGZvcm1hdCEoIigtPnt9KSIsIHYpLAotICAgICAgICAgICAgTm9uZSA9PiAiLSIudG9fc3RyaW5nKCksCisgICAgICAgIG1hdGNoICgmc2VsZi5wZXJtaXNzaW9uLCBzZWxmLnN0YWdlZF92YWx1ZSkgeworICAgICAgICAgICAgKEZsYWdQZXJtaXNzaW9uOjpSZWFkT25seSwgXykgPT4gIi0iLnRvX3N0cmluZygpLAorICAgICAgICAgICAgKEZsYWdQZXJtaXNzaW9uOjpSZWFkV3JpdGUsIE5vbmUpID0+ICItIi50b19zdHJpbmcoKSwKKyAgICAgICAgICAgIChGbGFnUGVybWlzc2lvbjo6UmVhZFdyaXRlLCBTb21lKHYpKSA9PiBmb3JtYXQhKCIoLT57fSkiLCB2KSwKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTI1Miw2ICsyNTYsMTQgQEAKICAgICAgICAgRmxhZ1NvdXJjZVR5cGU6OkRldmljZUNvbmZpZyA9PiBEZXZpY2VDb25maWdTb3VyY2U6Omxpc3RfZmxhZ3MoKT8sCiAgICAgICAgIEZsYWdTb3VyY2VUeXBlOjpBY29uZmlnU3RvcmFnZSA9PiBBY29uZmlnU3RvcmFnZVNvdXJjZTo6bGlzdF9mbGFncygpPywKICAgICB9OworCisgICAgaWYgbGV0IFNvbWUocmVmIGMpID0gY29udGFpbmVyIHsKKyAgICAgICAgZW5zdXJlISgKKyAgICAgICAgICAgIGxvYWRfcHJvdG9zOjpsaXN0X2NvbnRhaW5lcnMoKT8uY29udGFpbnMoYyksCisgICAgICAgICAgICBmb3JtYXQhKCJjb250YWluZXIgJ3t9JyBub3QgZm91bmQiLCAmYykKKyAgICAgICAgKTsKKyAgICB9CisKICAgICBsZXQgZmxhZ3MgPSAoRmlsdGVyIHsgY29udGFpbmVyIH0pLmFwcGx5KCZmbGFnc191bmZpbHRlcmVkKTsKICAgICBsZXQgcGFkZGluZ19pbmZvID0gUGFkZGluZ0luZm8gewogICAgICAgICBsb25nZXN0X2ZsYWdfY29sOiBmbGFncy5pdGVyKCkubWFwKHxmfCBmLnF1YWxpZmllZF9uYW1lKCkubGVuKCkpLm1heCgpLnVud3JhcF9vcigwKSwKQEAgLTI4OSw3ICszMDEsMzcgQEAKICAgICB9CiB9CiAKK2ZuIGludm9rZV91cGRhdGFibGVfYWZsYWdzKCkgeworICAgIGxldCB1cGRhdGFibGVfY29tbWFuZCA9ICIvYXBleC9jb20uYW5kcm9pZC5jb25maWdpbmZyYXN0cnVjdHVyZS9iaW4vYWZsYWdzX3VwZGF0YWJsZSI7CisKKyAgICBsZXQgYXJnczogVmVjPFN0cmluZz4gPSBlbnY6OmFyZ3MoKS5jb2xsZWN0KCk7CisgICAgbGV0IGNvbW1hbmRfYXJncyA9IGlmIGFyZ3MubGVuKCkgPj0gMiB7ICZhcmdzWzEuLl0gfSBlbHNlIHsgJlsiLS1oZWxwIi50b19zdHJpbmcoKV0gfTsKKworICAgIGxldCBtdXQgY2hpbGQgPSBPc0NvbW1hbmQ6Om5ldyh1cGRhdGFibGVfY29tbWFuZCk7CisgICAgZm9yIGFyZyBpbiBjb21tYW5kX2FyZ3MgeworICAgICAgICBjaGlsZC5hcmcoYXJnKTsKKyAgICB9CisKKyAgICBsZXQgb3V0cHV0ID0gY2hpbGQKKyAgICAgICAgLnN0ZGluKFN0ZGlvOjpwaXBlZCgpKQorICAgICAgICAuc3Rkb3V0KFN0ZGlvOjpwaXBlZCgpKQorICAgICAgICAuc3Bhd24oKQorICAgICAgICAuZXhwZWN0KCJmYWlsZWQgdG8gZXhlY3V0ZSBjaGlsZCIpCisgICAgICAgIC53YWl0X3dpdGhfb3V0cHV0KCkKKyAgICAgICAgLmV4cGVjdCgiZmFpbGVkIHRvIGV4ZWN1dGUgY29tbWFuZCIpOworCisgICAgbGV0IG91dHB1dF9zdHIgPSBTdHJpbmc6OmZyb21fdXRmOF9sb3NzeSgmb3V0cHV0LnN0ZG91dCkudHJpbSgpLnRvX3N0cmluZygpOworICAgIGlmICFvdXRwdXRfc3RyLmlzX2VtcHR5KCkgeworICAgICAgICBwcmludGxuISgie30iLCBvdXRwdXRfc3RyKTsKKyAgICB9Cit9CisKIGZuIG1haW4oKSAtPiBSZXN1bHQ8KCk+IHsKKyAgICBpZiBhY29uZmlnX2ZsYWdzOjphdXRvX2dlbmVyYXRlZDo6aW52b2tlX3VwZGF0YWJsZV9hZmxhZ3MoKSB7CisgICAgICAgIGludm9rZV91cGRhdGFibGVfYWZsYWdzKCk7CisgICAgICAgIHJldHVybiBPaygoKSk7CisgICAgfQorCiAgICAgZW5zdXJlIShuaXg6OnVuaXN0ZDo6VWlkOjpjdXJyZW50KCkuaXNfcm9vdCgpLCAibXVzdCBiZSByb290Iik7CiAKICAgICBsZXQgY2xpID0gQ2xpOjpwYXJzZSgpOwpAQCAtMjk3LDcgKzMzOSw3IEBACiAgICAgICAgIENvbW1hbmQ6Okxpc3QgeyBjb250YWluZXIgfSA9PiB7CiAgICAgICAgICAgICBpZiBhY29uZmlnX2ZsYWdzOjphdXRvX2dlbmVyYXRlZDo6ZW5hYmxlX29ubHlfbmV3X3N0b3JhZ2UoKSB7CiAgICAgICAgICAgICAgICAgbGlzdChGbGFnU291cmNlVHlwZTo6QWNvbmZpZ1N0b3JhZ2UsIGNvbnRhaW5lcikKLSAgICAgICAgICAgICAgICAgICAgLm1hcF9lcnIofGVycnwgYW55aG93ISgic3RvcmFnZSBtYXkgbm90IGJlIGVuYWJsZWQ6IHtlcnJ9IikpCisgICAgICAgICAgICAgICAgICAgIC5tYXBfZXJyKHxlcnJ8IGFueWhvdyEoImNvdWxkIG5vdCBsaXN0IGZsYWdzOiB7ZXJyfSIpKQogICAgICAgICAgICAgICAgICAgICAubWFwKFNvbWUpCiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGxpc3QoRmxhZ1NvdXJjZVR5cGU6OkRldmljZUNvbmZpZywgY29udGFpbmVyKS5tYXAoU29tZSkKZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvY29udmVydF9maW5hbGl6ZWRfZmxhZ3MvQW5kcm9pZC5icCBiL3Rvb2xzL2Fjb25maWcvY29udmVydF9maW5hbGl6ZWRfZmxhZ3MvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjM5NTYwCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9jb252ZXJ0X2ZpbmFsaXplZF9mbGFncy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTYgQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKK30KKworcnVzdF9kZWZhdWx0cyB7CisgICAgbmFtZTogImNvbnZlcnRfZmluYWxpemVkX2ZsYWdzLmRlZmF1bHRzIiwKKyAgICBlZGl0aW9uOiAiMjAyMSIsCisgICAgY2xpcHB5X2xpbnRzOiAiYW5kcm9pZCIsCisgICAgbGludHM6ICJhbmRyb2lkIiwKKyAgICBydXN0bGliczogWworICAgICAgICAibGliYW55aG93IiwKKyAgICAgICAgImxpYmNsYXAiLAorICAgICAgICAibGliaXRlcnRvb2xzIiwKKyAgICAgICAgImxpYnByb3RvYnVmIiwKKyAgICAgICAgImxpYnNlcmRlIiwKKyAgICAgICAgImxpYnNlcmRlX2pzb24iLAorICAgICAgICAibGlidGVtcGZpbGUiLAorICAgICAgICAibGlidGlueXRlbXBsYXRlIiwKKyAgICBdLAorfQorCitydXN0X2xpYnJhcnlfaG9zdCB7CisgICAgbmFtZTogImxpYmNvbnZlcnRfZmluYWxpemVkX2ZsYWdzIiwKKyAgICBjcmF0ZV9uYW1lOiAiY29udmVydF9maW5hbGl6ZWRfZmxhZ3MiLAorICAgIGRlZmF1bHRzOiBbImNvbnZlcnRfZmluYWxpemVkX2ZsYWdzLmRlZmF1bHRzIl0sCisgICAgc3JjczogWworICAgICAgICAic3JjL2xpYi5ycyIsCisgICAgXSwKK30KKworcnVzdF9iaW5hcnlfaG9zdCB7CisgICAgbmFtZTogImNvbnZlcnRfZmluYWxpemVkX2ZsYWdzIiwKKyAgICBkZWZhdWx0czogWyJjb252ZXJ0X2ZpbmFsaXplZF9mbGFncy5kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsic3JjL21haW4ucnMiXSwKKyAgICBydXN0bGliczogWworICAgICAgICAibGliY29udmVydF9maW5hbGl6ZWRfZmxhZ3MiLAorICAgICAgICAibGlic2VyZGVfanNvbiIsCisgICAgXSwKK30KKworcnVzdF90ZXN0X2hvc3QgeworICAgIG5hbWU6ICJjb252ZXJ0X2ZpbmFsaXplZF9mbGFncy50ZXN0IiwKKyAgICBkZWZhdWx0czogWyJjb252ZXJ0X2ZpbmFsaXplZF9mbGFncy5kZWZhdWx0cyJdLAorICAgIHRlc3Rfc3VpdGVzOiBbImdlbmVyYWwtdGVzdHMiXSwKKyAgICBzcmNzOiBbInNyYy9saWIucnMiXSwKK30KKworZ2VucnVsZSB7CisgICAgbmFtZTogImZpbmFsaXplZF9mbGFnc19yZWNvcmQuanNvbiIsCisgICAgc3JjczogWworICAgICAgICAiLy9wcmVidWlsdHMvc2RrOmZpbmFsaXplZC1hcGktZmxhZ3MiLAorICAgIF0sCisgICAgb3V0OiBbImZpbmFsaXplZF9mbGFnc19yZWNvcmQuanNvbiJdLAorICAgIHRvb2xzOiBbImNvbnZlcnRfZmluYWxpemVkX2ZsYWdzIl0sCisgICAgY21kOiAiYXJncz1cIlwiICYmIGZvciBmIGluICQobG9jYXRpb25zIC8vcHJlYnVpbHRzL3NkazpmaW5hbGl6ZWQtYXBpLWZsYWdzKTsgZG8gYXJncz1cIiQkYXJncyAtLWZsYWdfZmlsZV9wYXRoICQkZlwiOyBkb25lICYmICQobG9jYXRpb24gY29udmVydF9maW5hbGl6ZWRfZmxhZ3MpICQkYXJncyA+ICQob3V0KSIsCit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2NvbnZlcnRfZmluYWxpemVkX2ZsYWdzL0NhcmdvLnRvbWwgYi90b29scy9hY29uZmlnL2NvbnZlcnRfZmluYWxpemVkX2ZsYWdzL0NhcmdvLnRvbWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM0ZTAzMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2Fjb25maWcvY29udmVydF9maW5hbGl6ZWRfZmxhZ3MvQ2FyZ28udG9tbApAQCAtMCwwICsxLDE1IEBACitbcGFja2FnZV0KK25hbWUgPSAiY29udmVydF9maW5hbGl6ZWRfZmxhZ3MiCit2ZXJzaW9uID0gIjAuMS4wIgorZWRpdGlvbiA9ICIyMDIxIgorCitbZmVhdHVyZXNdCitkZWZhdWx0ID0gWyJjYXJnbyJdCitjYXJnbyA9IFtdCisKK1tkZXBlbmRlbmNpZXNdCithbnlob3cgPSAiMS4wLjY5IgorY2xhcCA9IHsgdmVyc2lvbiA9ICI0LjEuOCIsIGZlYXR1cmVzID0gWyJkZXJpdmUiXSB9CitzZXJkZSA9IHsgdmVyc2lvbiA9ICIxLjAuMTUyIiwgZmVhdHVyZXMgPSBbImRlcml2ZSJdIH0KK3NlcmRlX2pzb24gPSAiMS4wLjkzIgordGVtcGZpbGUgPSAiMy4xMy4wIgpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9jb252ZXJ0X2ZpbmFsaXplZF9mbGFncy9zcmMvbGliLnJzIGIvdG9vbHMvYWNvbmZpZy9jb252ZXJ0X2ZpbmFsaXplZF9mbGFncy9zcmMvbGliLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZmFhMzkKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9hY29uZmlnL2NvbnZlcnRfZmluYWxpemVkX2ZsYWdzL3NyYy9saWIucnMKQEAgLTAsMCArMSwzOTUgQEAKKy8qCisqIENvcHlyaWdodCAoQykgMjAyNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqCisqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKgorKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKgorKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKy8vISBGdW5jdGlvbnMgdG8gZXh0cmFjdCBmaW5hbGl6ZWQgZmxhZyBpbmZvcm1hdGlvbiBmcm9tCisvLyEgL3ByZWJ1aWx0cy9zZGsvIy9maW5hbGl6ZWQtZmxhZ3MudHh0LgorLy8hIFRoZXNlIGZ1bmN0aW9ucyBhcmUgdmVyeSBzcGVjaWZpYyB0byB0aGF0IGZpbGUgc2V0dXAgYXMgd2VsbCBhcyB0aGUgZm9ybWF0CisvLyEgb2YgdGhlIGZpbGVzIChqdXN0IGEgbGlzdCBvZiB0aGUgZnVsbHktcXVhbGlmaWVkIGZsYWcgbmFtZXMpLgorLy8hIFRoZXJlIGFyZSBhbHNvIHNvbWUgaGVscGVyIGZ1bmN0aW9ucyBmb3IgbG9jYWwgYnVpbGRpbmcgdXNpbmcgY2FyZ28uIFRoZXNlCisvLyEgZnVuY3Rpb25zIGFyZSBvbmx5IGludm9rZWQgdmlhIGNhcmdvIGZvciBxdWljayBsb2NhbCB0ZXN0aW5nIGFuZCB3aWxsIG5vdAorLy8hIGJlIHVzZWQgZHVyaW5nIGFjdHVhbCBzb29uZyBidWlsZGluZy4gVGhleSBhcmUgbWFya2VkIGFzIHN1Y2guCit1c2UgYW55aG93Ojp7YW55aG93LCBSZXN1bHR9OwordXNlIHNlcmRlOjp7RGVzZXJpYWxpemUsIFNlcmlhbGl6ZX07Cit1c2Ugc3RkOjpjb2xsZWN0aW9uczo6e0hhc2hNYXAsIEhhc2hTZXR9OwordXNlIHN0ZDo6ZnM7Cit1c2Ugc3RkOjppbzo6e3NlbGYsIEJ1ZlJlYWR9OworCisvLy8gSnVzdCB0aGUgZnVsbHkgcXVhbGlmaWVkIGZsYWcgbmFtZSAocGFja2FnZV9uYW1lLmZsYWdfbmFtZSkuCisjW2Rlcml2ZShDbG9uZSwgRGVidWcsIFNlcmlhbGl6ZSwgRGVzZXJpYWxpemUsIFBhcnRpYWxFcSwgRXEsIEhhc2gpXQorcHViIHN0cnVjdCBGaW5hbGl6ZWRGbGFnIHsKKyAgICAvLy8gTmFtZSBvZiB0aGUgZmxhZy4KKyAgICBwdWIgZmxhZ19uYW1lOiBTdHJpbmcsCisgICAgLy8vIE5hbWUgb2YgdGhlIHBhY2thZ2UuCisgICAgcHViIHBhY2thZ2VfbmFtZTogU3RyaW5nLAorfQorCisvLy8gQVBJIGxldmVsIGluIHdoaWNoIHRoZSBmbGFnIHdhcyBmaW5hbGl6ZWQuCisjW2Rlcml2ZShDb3B5LCBDbG9uZSwgRGVidWcsIFNlcmlhbGl6ZSwgRGVzZXJpYWxpemUsIFBhcnRpYWxFcSwgRXEsIEhhc2gpXQorcHViIHN0cnVjdCBBcGlMZXZlbChwdWIgaTMyKTsKKworLy8vIENvbnRhaW5zIGFsbCBmbGFncyBmaW5hbGl6ZWQgZm9yIGEgZ2l2ZW4gQVBJIGxldmVsLgorI1tkZXJpdmUoQ2xvbmUsIERlYnVnLCBTZXJpYWxpemUsIERlc2VyaWFsaXplLCBQYXJ0aWFsRXEsIEVxLCBEZWZhdWx0KV0KK3B1YiBzdHJ1Y3QgRmluYWxpemVkRmxhZ01hcChIYXNoTWFwPEFwaUxldmVsLCBIYXNoU2V0PEZpbmFsaXplZEZsYWc+Pik7CisKK2ltcGwgRmluYWxpemVkRmxhZ01hcCB7CisgICAgLy8vIENyZWF0ZXMgYSBuZXcsIGVtcHR5IGluc3RhbmNlLgorICAgIHB1YiBmbiBuZXcoKSAtPiBTZWxmIHsKKyAgICAgICAgU2VsZihIYXNoTWFwOjpuZXcoKSkKKyAgICB9CisKKyAgICAvLy8gQ29udmVuaWVuY2UgbWV0aG9kIGZvciBpc19lbXB0eSBvbiB0aGUgdW5kZXJseWluZyBtYXAuCisgICAgcHViIGZuIGlzX2VtcHR5KCZzZWxmKSAtPiBib29sIHsKKyAgICAgICAgc2VsZi4wLmlzX2VtcHR5KCkKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgQVBJIGxldmVsIGluIHdoaWNoIHRoZSBmbGFnIHdhcyBmaW5hbGl6ZWQgLgorICAgIHB1YiBmbiBnZXRfZmluYWxpemVkX2xldmVsKCZzZWxmLCBmbGFnOiAmRmluYWxpemVkRmxhZykgLT4gT3B0aW9uPEFwaUxldmVsPiB7CisgICAgICAgIGZvciAoYXBpX2xldmVsLCBmbGFnc19mb3JfbGV2ZWwpIGluICZzZWxmLjAgeworICAgICAgICAgICAgaWYgZmxhZ3NfZm9yX2xldmVsLmNvbnRhaW5zKGZsYWcpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gU29tZSgqYXBpX2xldmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBOb25lCisgICAgfQorCisgICAgLy8vIEluc2VydCB0aGUgZmxhZyBpbnRvIHRoZSBtYXAgZm9yIHRoZSBnaXZlbiBsZXZlbCBpZiB0aGUgZmxhZyBpcyBub3QKKyAgICAvLy8gcHJlc2VudCBpbiB0aGUgbWFwIGFscmVhZHkgLSBmb3IgKmFueSogbGV2ZWwgKG5vdCBqdXN0IHRoZSBvbmUgZ2l2ZW4pLgorICAgIHB1YiBmbiBpbnNlcnRfaWZfbmV3KCZtdXQgc2VsZiwgbGV2ZWw6IEFwaUxldmVsLCBmbGFnOiBGaW5hbGl6ZWRGbGFnKSB7CisgICAgICAgIGlmIHNlbGYuY29udGFpbnMoJmZsYWcpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzZWxmLjAuZW50cnkobGV2ZWwpLm9yX2RlZmF1bHQoKS5pbnNlcnQoZmxhZyk7CisgICAgfQorCisgICAgZm4gY29udGFpbnMoJnNlbGYsIGZsYWc6ICZGaW5hbGl6ZWRGbGFnKSAtPiBib29sIHsKKyAgICAgICAgc2VsZi4wLnZhbHVlcygpLmFueSh8ZmxhZ3Nfc2V0fCBmbGFnc19zZXQuY29udGFpbnMoZmxhZykpCisgICAgfQorfQorCisvLy8gQ29udmVydHMgYSBzdHJpbmcgdG8gYW4gaW50LiBXaWxsIHBhcnNlIHRvIGludCBldmVuIGlmIHRoZSBzdHJpbmcgaXMgIlguMCIuCisvLy8gUmV0dXJucyBlcnJvciBmb3IgIlguMSIuCitmbiBzdHJfdG9fYXBpX2xldmVsKG51bWVyaWNfc3RyaW5nOiAmc3RyKSAtPiBSZXN1bHQ8QXBpTGV2ZWw+IHsKKyAgICBsZXQgZmxvYXRfdmFsdWUgPSBudW1lcmljX3N0cmluZy5wYXJzZTo6PGY2ND4oKT87CisKKyAgICBpZiBmbG9hdF92YWx1ZS5mcmFjdCgpID09IDAuMCB7CisgICAgICAgIE9rKEFwaUxldmVsKGZsb2F0X3ZhbHVlIGFzIGkzMikpCisgICAgfSBlbHNlIHsKKyAgICAgICAgRXJyKGFueWhvdyEoIk51bWVyaWMgc3RyaW5nIGlzIGZsb2F0LCBjYW4ndCBwYXJzZSB0byBpbnQuIikpCisgICAgfQorfQorCisvLy8gRm9yIGVhY2ggZmlsZSwgZXh0cmFjdHMgdGhlIHF1YWxpZmllZCBmbGFnIG5hbWVzIGludG8gYSBGaW5hbGl6ZWRGbGFnLCB0aGVuCisvLy8gZW50ZXJzIHRoZW0gaW4gYSBtYXAgYXQgdGhlIEFQSSBsZXZlbCBjb3JyZXNwb25kaW5nIHRvIHRoZWlyIGRpcmVjdG9yeS4KKy8vLyBFeDogL3ByZWJ1aWx0cy9zZGsvMzUvZmluYWxpemVkLWZsYWdzLnR4dCAtPiB7MzYsIFtmbGFnMSwgZmxhZzJdfS4KK3B1YiBmbiByZWFkX2ZpbGVzX3RvX21hcF91c2luZ19wYXRoKGZsYWdfZmlsZXM6IFZlYzxTdHJpbmc+KSAtPiBSZXN1bHQ8RmluYWxpemVkRmxhZ01hcD4geworICAgIGxldCBtdXQgZGF0YV9tYXAgPSBGaW5hbGl6ZWRGbGFnTWFwOjpuZXcoKTsKKworICAgIGZvciBmbGFnX2ZpbGUgaW4gZmxhZ19maWxlcyB7CisgICAgICAgIC8vIFNwbGl0IC9wYXRoL3Nkay88aW50LmludD4vZmluYWxpemVkLWZsYWdzLnR4dCAtPiBbJy9wYXRoL3NkaycsICdpbnQuaW50JywgJ2ZpbmFsaXplZC1mbGFncy50eHQnXS4KKyAgICAgICAgbGV0IGZsYWdfZmlsZV9zcGxpdDogVmVjPFN0cmluZz4gPQorICAgICAgICAgICAgZmxhZ19maWxlLmNsb25lKCkucnNwbGl0bigzLCAnLycpLm1hcCh8c3wgcy50b19zdHJpbmcoKSkuY29sbGVjdCgpOworCisgICAgICAgIGlmICZmbGFnX2ZpbGVfc3BsaXRbMF0gIT0gImZpbmFsaXplZC1mbGFncy50eHQiIHsKKyAgICAgICAgICAgIHJldHVybiBFcnIoYW55aG93ISgiUHJvdmlkZWQgaW5jb3JyZWN0IGZpbGUsIG11c3QgYmUgZmluYWxpemVkLWZsYWdzLnR4dCIpKTsKKyAgICAgICAgfQorCisgICAgICAgIGxldCBhcGlfbGV2ZWxfc3RyaW5nID0gJmZsYWdfZmlsZV9zcGxpdFsxXTsKKworICAgICAgICAvLyBGb3Igbm93LCBza2lwIGFueSBkaXJlY3Rvcnkgd2l0aCBmdWxsIEFQSSBsZXZlbCwgZS5nLiAiMzYuMSIuIFRoZQorICAgICAgICAvLyBmaW5hbGl6ZWQgZmxhZyBmaWxlcyBlYWNoIGNvbnRhaW4gYWxsIGZsYWdzIGZpbmFsaXplZCAqdXAgdG8qIHRoYXQKKyAgICAgICAgLy8gbGV2ZWwgKGluY2x1ZGluZyBwcmlvciBsZXZlbHMpLCBzbyBza2lwcGluZyBpbnRlcm1lZGlhdGUgbGV2ZWxzIG1lYW5zCisgICAgICAgIC8vIHRoZSBmbGFncyB3aWxsIGJlIGluY2x1ZGVkIGF0IHRoZSBuZXh0IGZ1bGwgbnVtYmVyLgorICAgICAgICAvLyBUT0RPOiBiLzM3ODkzNjA2MSAtIFN1cHBvcnQgZnVsbCBTREsgdmVyc2lvbi4KKyAgICAgICAgLy8gSW4gdGhlIGZ1dHVyZSwgd2Ugc2hvdWxkIGVycm9yIGlmIHByb3ZpZGVkIGEgbm9uLW51bWVyaWMgZGlyZWN0b3J5LgorICAgICAgICBsZXQgT2soYXBpX2xldmVsKSA9IHN0cl90b19hcGlfbGV2ZWwoYXBpX2xldmVsX3N0cmluZykgZWxzZSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfTsKKworICAgICAgICBsZXQgZmlsZSA9IGZzOjpGaWxlOjpvcGVuKGZsYWdfZmlsZSk/OworICAgICAgICBsZXQgcmVhZGVyID0gaW86OkJ1ZlJlYWRlcjo6bmV3KGZpbGUpOworCisgICAgICAgIGZvciBxdWFsaWZpZWRfZmxhZ19uYW1lIGluIHJlYWRlci5saW5lcygpIHsKKyAgICAgICAgICAgIC8vIFNwbGl0IHRoZSBxdWFsaWZpZWQgZmxhZyBuYW1lIGludG8gcGFja2FnZSBhbmQgZmxhZyBuYW1lOgorICAgICAgICAgICAgLy8gY29tLm15LnBhY2thZ2UubmFtZS5teV9mbGFnX25hbWUgLT4gWydjb20ubXkucGFja2FnZS5uYW1lJywgJ215X2ZsYWdfbmFtZSddLgorICAgICAgICAgICAgbGV0IG11dCBmbGFnOiBWZWM8U3RyaW5nPiA9CisgICAgICAgICAgICAgICAgcXVhbGlmaWVkX2ZsYWdfbmFtZT8ucnNwbGl0bigyLCAnLicpLm1hcCh8c3wgcy50b19zdHJpbmcoKSkuY29sbGVjdCgpOworCisgICAgICAgICAgICBpZiBmbGFnLmxlbigpICE9IDIgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBsZXQgcGFja2FnZV9uYW1lID0gZmxhZy5wb3AoKS5va19vcihhbnlob3chKCJNaXNzaW5nIGZsYWcgcGFja2FnZS4iKSk/OworICAgICAgICAgICAgbGV0IGZsYWdfbmFtZSA9IGZsYWcucG9wKCkub2tfb3IoYW55aG93ISgiTWlzc2luZyBmbGFnIG5hbWUuIikpPzsKKworICAgICAgICAgICAgLy8gT25seSBhZGQgdGhlIGZsYWcgaWYgaXQgd2Fzbid0IGFkZGVkIGluIGEgcHJpb3IgZmlsZS4KKyAgICAgICAgICAgIGRhdGFfbWFwLmluc2VydF9pZl9uZXcoYXBpX2xldmVsLCBGaW5hbGl6ZWRGbGFnIHsgZmxhZ19uYW1lLCBwYWNrYWdlX25hbWUgfSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBPayhkYXRhX21hcCkKK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdXBlcjo6KjsKKyAgICB1c2Ugc3RkOjpmczo6RmlsZTsKKyAgICB1c2Ugc3RkOjppbzo6V3JpdGU7CisgICAgdXNlIHRlbXBmaWxlOjp0ZW1wZGlyOworCisgICAgY29uc3QgRkxBR19GSUxFX05BTUU6ICZzdHIgPSAiZmluYWxpemVkLWZsYWdzLnR4dCI7CisKKyAgICAvLyBDcmVhdGVzIHNvbWUgZmxhZ3MgZm9yIHRlc3RpbmcuCisgICAgZm4gY3JlYXRlX3Rlc3RfZmxhZ3MoKSAtPiBWZWM8RmluYWxpemVkRmxhZz4geworICAgICAgICB2ZWMhWworICAgICAgICAgICAgRmluYWxpemVkRmxhZyB7IGZsYWdfbmFtZTogIm5hbWUxIi50b19zdHJpbmcoKSwgcGFja2FnZV9uYW1lOiAicGFja2FnZTEiLnRvX3N0cmluZygpIH0sCisgICAgICAgICAgICBGaW5hbGl6ZWRGbGFnIHsgZmxhZ19uYW1lOiAibmFtZTIiLnRvX3N0cmluZygpLCBwYWNrYWdlX25hbWU6ICJwYWNrYWdlMiIudG9fc3RyaW5nKCkgfSwKKyAgICAgICAgICAgIEZpbmFsaXplZEZsYWcgeyBmbGFnX25hbWU6ICJuYW1lMyIudG9fc3RyaW5nKCksIHBhY2thZ2VfbmFtZTogInBhY2thZ2UzIi50b19zdHJpbmcoKSB9LAorICAgICAgICBdCisgICAgfQorCisgICAgLy8gV3JpdGVzIHRoZSBmdWxseSBxdWFsaWZpZWQgZmxhZyBuYW1lcyBpbiB0aGUgZ2l2ZW4gZmlsZS4KKyAgICBmbiBhZGRfZmxhZ3NfdG9fZmlsZShmbGFnX2ZpbGU6ICZtdXQgRmlsZSwgZmxhZ3M6ICZbRmluYWxpemVkRmxhZ10pIHsKKyAgICAgICAgZm9yIGZsYWcgaW4gZmxhZ3MgeworICAgICAgICAgICAgbGV0IF91bnVzZWQgPSB3cml0ZWxuIShmbGFnX2ZpbGUsICJ7fS57fSIsIGZsYWcucGFja2FnZV9uYW1lLCBmbGFnLmZsYWdfbmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9yZWFkX2ZsYWdzX29uZV9maWxlKCkgeworICAgICAgICBsZXQgZmxhZ3MgPSBjcmVhdGVfdGVzdF9mbGFncygpOworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgZmlsZSA8dGVtcF9kaXI+LzM1L2ZpbmFsaXplZC1mbGFncy50eHQuCisgICAgICAgIGxldCB0ZW1wX2RpciA9IHRlbXBkaXIoKS51bndyYXAoKTsKKyAgICAgICAgbGV0IG11dCBmaWxlX3BhdGggPSB0ZW1wX2Rpci5wYXRoKCkudG9fcGF0aF9idWYoKTsKKyAgICAgICAgZmlsZV9wYXRoLnB1c2goIjM1Iik7CisgICAgICAgIGZzOjpjcmVhdGVfZGlyX2FsbCgmZmlsZV9wYXRoKS51bndyYXAoKTsKKyAgICAgICAgZmlsZV9wYXRoLnB1c2goRkxBR19GSUxFX05BTUUpOworICAgICAgICBsZXQgbXV0IGZpbGUgPSBGaWxlOjpjcmVhdGUoJmZpbGVfcGF0aCkudW53cmFwKCk7CisKKyAgICAgICAgLy8gV3JpdGUgYWxsIGZsYWdzIHRvIHRoZSBmaWxlLgorICAgICAgICBhZGRfZmxhZ3NfdG9fZmlsZSgmbXV0IGZpbGUsICZbZmxhZ3NbMF0uY2xvbmUoKSwgZmxhZ3NbMV0uY2xvbmUoKV0pOworICAgICAgICBsZXQgZmxhZ19maWxlX3BhdGggPSBmaWxlX3BhdGgudG9fc3RyaW5nX2xvc3N5KCkudG9fc3RyaW5nKCk7CisKKyAgICAgICAgLy8gQ29udmVydCB0byBtYXAuCisgICAgICAgIGxldCBtYXAgPSByZWFkX2ZpbGVzX3RvX21hcF91c2luZ19wYXRoKHZlYyFbZmxhZ19maWxlX3BhdGhdKS51bndyYXAoKTsKKworICAgICAgICBhc3NlcnRfZXEhKG1hcC4wLmxlbigpLCAxKTsKKyAgICAgICAgYXNzZXJ0IShtYXAuMC5nZXQoJkFwaUxldmVsKDM1KSkudW53cmFwKCkuY29udGFpbnMoJmZsYWdzWzBdKSk7CisgICAgICAgIGFzc2VydCEobWFwLjAuZ2V0KCZBcGlMZXZlbCgzNSkpLnVud3JhcCgpLmNvbnRhaW5zKCZmbGFnc1sxXSkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3JlYWRfZmxhZ3NfdHdvX2ZpbGVzKCkgeworICAgICAgICBsZXQgZmxhZ3MgPSBjcmVhdGVfdGVzdF9mbGFncygpOworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgZmlsZSA8dGVtcF9kaXI+LzM1L2ZpbmFsaXplZC1mbGFncy50eHQgYW5kIGZvciAzNi4KKyAgICAgICAgbGV0IHRlbXBfZGlyID0gdGVtcGRpcigpLnVud3JhcCgpOworICAgICAgICBsZXQgbXV0IGZpbGVfcGF0aDEgPSB0ZW1wX2Rpci5wYXRoKCkudG9fcGF0aF9idWYoKTsKKyAgICAgICAgZmlsZV9wYXRoMS5wdXNoKCIzNSIpOworICAgICAgICBmczo6Y3JlYXRlX2Rpcl9hbGwoJmZpbGVfcGF0aDEpLnVud3JhcCgpOworICAgICAgICBmaWxlX3BhdGgxLnB1c2goRkxBR19GSUxFX05BTUUpOworICAgICAgICBsZXQgbXV0IGZpbGUxID0gRmlsZTo6Y3JlYXRlKCZmaWxlX3BhdGgxKS51bndyYXAoKTsKKworICAgICAgICBsZXQgbXV0IGZpbGVfcGF0aDIgPSB0ZW1wX2Rpci5wYXRoKCkudG9fcGF0aF9idWYoKTsKKyAgICAgICAgZmlsZV9wYXRoMi5wdXNoKCIzNiIpOworICAgICAgICBmczo6Y3JlYXRlX2Rpcl9hbGwoJmZpbGVfcGF0aDIpLnVud3JhcCgpOworICAgICAgICBmaWxlX3BhdGgyLnB1c2goRkxBR19GSUxFX05BTUUpOworICAgICAgICBsZXQgbXV0IGZpbGUyID0gRmlsZTo6Y3JlYXRlKCZmaWxlX3BhdGgyKS51bndyYXAoKTsKKworICAgICAgICAvLyBXcml0ZSBhbGwgZmxhZ3MgdG8gdGhlIGZpbGVzLgorICAgICAgICBhZGRfZmxhZ3NfdG9fZmlsZSgmbXV0IGZpbGUxLCAmW2ZsYWdzWzBdLmNsb25lKCldKTsKKyAgICAgICAgYWRkX2ZsYWdzX3RvX2ZpbGUoJm11dCBmaWxlMiwgJltmbGFnc1swXS5jbG9uZSgpLCBmbGFnc1sxXS5jbG9uZSgpLCBmbGFnc1syXS5jbG9uZSgpXSk7CisgICAgICAgIGxldCBmbGFnX2ZpbGVfcGF0aDEgPSBmaWxlX3BhdGgxLnRvX3N0cmluZ19sb3NzeSgpLnRvX3N0cmluZygpOworICAgICAgICBsZXQgZmxhZ19maWxlX3BhdGgyID0gZmlsZV9wYXRoMi50b19zdHJpbmdfbG9zc3koKS50b19zdHJpbmcoKTsKKworICAgICAgICAvLyBDb252ZXJ0IHRvIG1hcC4KKyAgICAgICAgbGV0IG1hcCA9IHJlYWRfZmlsZXNfdG9fbWFwX3VzaW5nX3BhdGgodmVjIVtmbGFnX2ZpbGVfcGF0aDEsIGZsYWdfZmlsZV9wYXRoMl0pLnVud3JhcCgpOworCisgICAgICAgIC8vIEFzc2VydCB0aGVyZSBhcmUgdHdvIEFQSSBsZXZlbHMsIDM1IGFuZCAzNi4KKyAgICAgICAgYXNzZXJ0X2VxIShtYXAuMC5sZW4oKSwgMik7CisgICAgICAgIGFzc2VydCEobWFwLjAuZ2V0KCZBcGlMZXZlbCgzNSkpLnVud3JhcCgpLmNvbnRhaW5zKCZmbGFnc1swXSkpOworCisgICAgICAgIC8vIDM2IHNob3VsZCBub3QgaGF2ZSB0aGUgZmlyc3QgZmxhZyBpbiB0aGUgc2V0LCBhcyBpdCB3YXMgZmluYWxpemVkIGluCisgICAgICAgIC8vIGFuIGVhcmxpZXIgQVBJIGxldmVsLgorICAgICAgICBhc3NlcnQhKG1hcC4wLmdldCgmQXBpTGV2ZWwoMzYpKS51bndyYXAoKS5jb250YWlucygmZmxhZ3NbMV0pKTsKKyAgICAgICAgYXNzZXJ0IShtYXAuMC5nZXQoJkFwaUxldmVsKDM2KSkudW53cmFwKCkuY29udGFpbnMoJmZsYWdzWzJdKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfcmVhZF9mbGFnc19mdWxsX251bWJlcnMoKSB7CisgICAgICAgIGxldCBmbGFncyA9IGNyZWF0ZV90ZXN0X2ZsYWdzKCk7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBmaWxlIDx0ZW1wX2Rpcj4vMzUvZmluYWxpemVkLWZsYWdzLnR4dCBhbmQgZm9yIDM2LgorICAgICAgICBsZXQgdGVtcF9kaXIgPSB0ZW1wZGlyKCkudW53cmFwKCk7CisgICAgICAgIGxldCBtdXQgZmlsZV9wYXRoMSA9IHRlbXBfZGlyLnBhdGgoKS50b19wYXRoX2J1ZigpOworICAgICAgICBmaWxlX3BhdGgxLnB1c2goIjM1LjAiKTsKKyAgICAgICAgZnM6OmNyZWF0ZV9kaXJfYWxsKCZmaWxlX3BhdGgxKS51bndyYXAoKTsKKyAgICAgICAgZmlsZV9wYXRoMS5wdXNoKEZMQUdfRklMRV9OQU1FKTsKKyAgICAgICAgbGV0IG11dCBmaWxlMSA9IEZpbGU6OmNyZWF0ZSgmZmlsZV9wYXRoMSkudW53cmFwKCk7CisKKyAgICAgICAgbGV0IG11dCBmaWxlX3BhdGgyID0gdGVtcF9kaXIucGF0aCgpLnRvX3BhdGhfYnVmKCk7CisgICAgICAgIGZpbGVfcGF0aDIucHVzaCgiMzYuMCIpOworICAgICAgICBmczo6Y3JlYXRlX2Rpcl9hbGwoJmZpbGVfcGF0aDIpLnVud3JhcCgpOworICAgICAgICBmaWxlX3BhdGgyLnB1c2goRkxBR19GSUxFX05BTUUpOworICAgICAgICBsZXQgbXV0IGZpbGUyID0gRmlsZTo6Y3JlYXRlKCZmaWxlX3BhdGgyKS51bndyYXAoKTsKKworICAgICAgICAvLyBXcml0ZSBhbGwgZmxhZ3MgdG8gdGhlIGZpbGVzLgorICAgICAgICBhZGRfZmxhZ3NfdG9fZmlsZSgmbXV0IGZpbGUxLCAmW2ZsYWdzWzBdLmNsb25lKCldKTsKKyAgICAgICAgYWRkX2ZsYWdzX3RvX2ZpbGUoJm11dCBmaWxlMiwgJltmbGFnc1swXS5jbG9uZSgpLCBmbGFnc1sxXS5jbG9uZSgpLCBmbGFnc1syXS5jbG9uZSgpXSk7CisgICAgICAgIGxldCBmbGFnX2ZpbGVfcGF0aDEgPSBmaWxlX3BhdGgxLnRvX3N0cmluZ19sb3NzeSgpLnRvX3N0cmluZygpOworICAgICAgICBsZXQgZmxhZ19maWxlX3BhdGgyID0gZmlsZV9wYXRoMi50b19zdHJpbmdfbG9zc3koKS50b19zdHJpbmcoKTsKKworICAgICAgICAvLyBDb252ZXJ0IHRvIG1hcC4KKyAgICAgICAgbGV0IG1hcCA9IHJlYWRfZmlsZXNfdG9fbWFwX3VzaW5nX3BhdGgodmVjIVtmbGFnX2ZpbGVfcGF0aDEsIGZsYWdfZmlsZV9wYXRoMl0pLnVud3JhcCgpOworCisgICAgICAgIGFzc2VydF9lcSEobWFwLjAubGVuKCksIDIpOworICAgICAgICBhc3NlcnQhKG1hcC4wLmdldCgmQXBpTGV2ZWwoMzUpKS51bndyYXAoKS5jb250YWlucygmZmxhZ3NbMF0pKTsKKyAgICAgICAgYXNzZXJ0IShtYXAuMC5nZXQoJkFwaUxldmVsKDM2KSkudW53cmFwKCkuY29udGFpbnMoJmZsYWdzWzFdKSk7CisgICAgICAgIGFzc2VydCEobWFwLjAuZ2V0KCZBcGlMZXZlbCgzNikpLnVud3JhcCgpLmNvbnRhaW5zKCZmbGFnc1syXSkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3JlYWRfZmxhZ3NfZnJhY3Rpb25zX3JvdW5kX3VwKCkgeworICAgICAgICBsZXQgZmxhZ3MgPSBjcmVhdGVfdGVzdF9mbGFncygpOworCisgICAgICAgIC8vIENyZWF0ZSB0aGUgZmlsZSA8dGVtcF9kaXI+LzM1L2ZpbmFsaXplZC1mbGFncy50eHQgYW5kIGZvciAzNi4KKyAgICAgICAgbGV0IHRlbXBfZGlyID0gdGVtcGRpcigpLnVud3JhcCgpOworICAgICAgICBsZXQgbXV0IGZpbGVfcGF0aDEgPSB0ZW1wX2Rpci5wYXRoKCkudG9fcGF0aF9idWYoKTsKKyAgICAgICAgZmlsZV9wYXRoMS5wdXNoKCIzNS4xIik7CisgICAgICAgIGZzOjpjcmVhdGVfZGlyX2FsbCgmZmlsZV9wYXRoMSkudW53cmFwKCk7CisgICAgICAgIGZpbGVfcGF0aDEucHVzaChGTEFHX0ZJTEVfTkFNRSk7CisgICAgICAgIGxldCBtdXQgZmlsZTEgPSBGaWxlOjpjcmVhdGUoJmZpbGVfcGF0aDEpLnVud3JhcCgpOworCisgICAgICAgIGxldCBtdXQgZmlsZV9wYXRoMiA9IHRlbXBfZGlyLnBhdGgoKS50b19wYXRoX2J1ZigpOworICAgICAgICBmaWxlX3BhdGgyLnB1c2goIjM2LjAiKTsKKyAgICAgICAgZnM6OmNyZWF0ZV9kaXJfYWxsKCZmaWxlX3BhdGgyKS51bndyYXAoKTsKKyAgICAgICAgZmlsZV9wYXRoMi5wdXNoKEZMQUdfRklMRV9OQU1FKTsKKyAgICAgICAgbGV0IG11dCBmaWxlMiA9IEZpbGU6OmNyZWF0ZSgmZmlsZV9wYXRoMikudW53cmFwKCk7CisKKyAgICAgICAgLy8gV3JpdGUgYWxsIGZsYWdzIHRvIHRoZSBmaWxlcy4KKyAgICAgICAgYWRkX2ZsYWdzX3RvX2ZpbGUoJm11dCBmaWxlMSwgJltmbGFnc1swXS5jbG9uZSgpXSk7CisgICAgICAgIGFkZF9mbGFnc190b19maWxlKCZtdXQgZmlsZTIsICZbZmxhZ3NbMF0uY2xvbmUoKSwgZmxhZ3NbMV0uY2xvbmUoKSwgZmxhZ3NbMl0uY2xvbmUoKV0pOworICAgICAgICBsZXQgZmxhZ19maWxlX3BhdGgxID0gZmlsZV9wYXRoMS50b19zdHJpbmdfbG9zc3koKS50b19zdHJpbmcoKTsKKyAgICAgICAgbGV0IGZsYWdfZmlsZV9wYXRoMiA9IGZpbGVfcGF0aDIudG9fc3RyaW5nX2xvc3N5KCkudG9fc3RyaW5nKCk7CisKKyAgICAgICAgLy8gQ29udmVydCB0byBtYXAuCisgICAgICAgIGxldCBtYXAgPSByZWFkX2ZpbGVzX3RvX21hcF91c2luZ19wYXRoKHZlYyFbZmxhZ19maWxlX3BhdGgxLCBmbGFnX2ZpbGVfcGF0aDJdKS51bndyYXAoKTsKKworICAgICAgICAvLyBObyBmbGFncyB3ZXJlIGFkZGVkIGluIDM1LiBBbGwgMzUuMSBmbGFncyB3ZXJlIHJvbGxlZCB1cCB0byAzNi4KKyAgICAgICAgYXNzZXJ0X2VxIShtYXAuMC5sZW4oKSwgMSk7CisgICAgICAgIGFzc2VydCEoIW1hcC4wLmNvbnRhaW5zX2tleSgmQXBpTGV2ZWwoMzUpKSk7CisgICAgICAgIGFzc2VydCEobWFwLjAuZ2V0KCZBcGlMZXZlbCgzNikpLnVud3JhcCgpLmNvbnRhaW5zKCZmbGFnc1swXSkpOworICAgICAgICBhc3NlcnQhKG1hcC4wLmdldCgmQXBpTGV2ZWwoMzYpKS51bndyYXAoKS5jb250YWlucygmZmxhZ3NbMV0pKTsKKyAgICAgICAgYXNzZXJ0IShtYXAuMC5nZXQoJkFwaUxldmVsKDM2KSkudW53cmFwKCkuY29udGFpbnMoJmZsYWdzWzJdKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfcmVhZF9mbGFnc19ub25fbnVtZXJpYygpIHsKKyAgICAgICAgbGV0IGZsYWdzID0gY3JlYXRlX3Rlc3RfZmxhZ3MoKTsKKworICAgICAgICAvLyBDcmVhdGUgdGhlIGZpbGUgPHRlbXBfZGlyPi8zNS9maW5hbGl6ZWQtZmxhZ3MudHh0LgorICAgICAgICBsZXQgdGVtcF9kaXIgPSB0ZW1wZGlyKCkudW53cmFwKCk7CisgICAgICAgIGxldCBtdXQgZmlsZV9wYXRoID0gdGVtcF9kaXIucGF0aCgpLnRvX3BhdGhfYnVmKCk7CisgICAgICAgIGZpbGVfcGF0aC5wdXNoKCIzNSIpOworICAgICAgICBmczo6Y3JlYXRlX2Rpcl9hbGwoJmZpbGVfcGF0aCkudW53cmFwKCk7CisgICAgICAgIGZpbGVfcGF0aC5wdXNoKEZMQUdfRklMRV9OQU1FKTsKKyAgICAgICAgbGV0IG11dCBmbGFnX2ZpbGUgPSBGaWxlOjpjcmVhdGUoJmZpbGVfcGF0aCkudW53cmFwKCk7CisKKyAgICAgICAgbGV0IG11dCBpbnZhbGlkX3BhdGggPSB0ZW1wX2Rpci5wYXRoKCkudG9fcGF0aF9idWYoKTsKKyAgICAgICAgaW52YWxpZF9wYXRoLnB1c2goInNkay1hbm5vdGF0aW9ucyIpOworICAgICAgICBmczo6Y3JlYXRlX2Rpcl9hbGwoJmludmFsaWRfcGF0aCkudW53cmFwKCk7CisgICAgICAgIGludmFsaWRfcGF0aC5wdXNoKEZMQUdfRklMRV9OQU1FKTsKKyAgICAgICAgRmlsZTo6Y3JlYXRlKCZpbnZhbGlkX3BhdGgpLnVud3JhcCgpOworCisgICAgICAgIC8vIFdyaXRlIGFsbCBmbGFncyB0byB0aGUgZmlsZS4KKyAgICAgICAgYWRkX2ZsYWdzX3RvX2ZpbGUoJm11dCBmbGFnX2ZpbGUsICZbZmxhZ3NbMF0uY2xvbmUoKSwgZmxhZ3NbMV0uY2xvbmUoKV0pOworICAgICAgICBsZXQgZmxhZ19maWxlX3BhdGggPSBmaWxlX3BhdGgudG9fc3RyaW5nX2xvc3N5KCkudG9fc3RyaW5nKCk7CisKKyAgICAgICAgLy8gQ29udmVydCB0byBtYXAuCisgICAgICAgIGxldCBtYXAgPSByZWFkX2ZpbGVzX3RvX21hcF91c2luZ19wYXRoKHZlYyFbCisgICAgICAgICAgICBmbGFnX2ZpbGVfcGF0aCwKKyAgICAgICAgICAgIGludmFsaWRfcGF0aC50b19zdHJpbmdfbG9zc3koKS50b19zdHJpbmcoKSwKKyAgICAgICAgXSkKKyAgICAgICAgLnVud3JhcCgpOworCisgICAgICAgIC8vIE5vIHNldCBzaG91bGQgYmUgY3JlYXRlZCBmb3Igc2RrLWFubm90YXRpb25zLgorICAgICAgICBhc3NlcnRfZXEhKG1hcC4wLmxlbigpLCAxKTsKKyAgICAgICAgYXNzZXJ0IShtYXAuMC5nZXQoJkFwaUxldmVsKDM1KSkudW53cmFwKCkuY29udGFpbnMoJmZsYWdzWzBdKSk7CisgICAgICAgIGFzc2VydCEobWFwLjAuZ2V0KCZBcGlMZXZlbCgzNSkpLnVud3JhcCgpLmNvbnRhaW5zKCZmbGFnc1sxXSkpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X3JlYWRfZmxhZ3Nfd3JvbmdfZmlsZV9lcnIoKSB7CisgICAgICAgIGxldCBmbGFncyA9IGNyZWF0ZV90ZXN0X2ZsYWdzKCk7CisKKyAgICAgICAgLy8gQ3JlYXRlIHRoZSBmaWxlIDx0ZW1wX2Rpcj4vMzUvZmluYWxpemVkLWZsYWdzLnR4dC4KKyAgICAgICAgbGV0IHRlbXBfZGlyID0gdGVtcGRpcigpLnVud3JhcCgpOworICAgICAgICBsZXQgbXV0IGZpbGVfcGF0aCA9IHRlbXBfZGlyLnBhdGgoKS50b19wYXRoX2J1ZigpOworICAgICAgICBmaWxlX3BhdGgucHVzaCgiMzUiKTsKKyAgICAgICAgZnM6OmNyZWF0ZV9kaXJfYWxsKCZmaWxlX3BhdGgpLnVud3JhcCgpOworICAgICAgICBmaWxlX3BhdGgucHVzaChGTEFHX0ZJTEVfTkFNRSk7CisgICAgICAgIGxldCBtdXQgZmxhZ19maWxlID0gRmlsZTo6Y3JlYXRlKCZmaWxlX3BhdGgpLnVud3JhcCgpOworCisgICAgICAgIGxldCBtdXQgcHJlX2ZsYWdfcGF0aCA9IHRlbXBfZGlyLnBhdGgoKS50b19wYXRoX2J1ZigpOworICAgICAgICBwcmVfZmxhZ19wYXRoLnB1c2goIjE4Iik7CisgICAgICAgIGZzOjpjcmVhdGVfZGlyX2FsbCgmcHJlX2ZsYWdfcGF0aCkudW53cmFwKCk7CisgICAgICAgIHByZV9mbGFnX3BhdGgucHVzaCgic29tZV9yYW5kb21fZmlsZS50eHQiKTsKKyAgICAgICAgRmlsZTo6Y3JlYXRlKCZwcmVfZmxhZ19wYXRoKS51bndyYXAoKTsKKworICAgICAgICAvLyBXcml0ZSBhbGwgZmxhZ3MgdG8gdGhlIGZpbGUuCisgICAgICAgIGFkZF9mbGFnc190b19maWxlKCZtdXQgZmxhZ19maWxlLCAmW2ZsYWdzWzBdLmNsb25lKCksIGZsYWdzWzFdLmNsb25lKCldKTsKKyAgICAgICAgbGV0IGZsYWdfZmlsZV9wYXRoID0gZmlsZV9wYXRoLnRvX3N0cmluZ19sb3NzeSgpLnRvX3N0cmluZygpOworCisgICAgICAgIC8vIENvbnZlcnQgdG8gbWFwLgorICAgICAgICBsZXQgbWFwID0gcmVhZF9maWxlc190b19tYXBfdXNpbmdfcGF0aCh2ZWMhWworICAgICAgICAgICAgZmxhZ19maWxlX3BhdGgsCisgICAgICAgICAgICBwcmVfZmxhZ19wYXRoLnRvX3N0cmluZ19sb3NzeSgpLnRvX3N0cmluZygpLAorICAgICAgICBdKTsKKworICAgICAgICBhc3NlcnQhKG1hcC5pc19lcnIoKSk7CisgICAgfQorCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3RfZmxhZ3NfbWFwX2luc2VydF9pZl9uZXcoKSB7CisgICAgICAgIGxldCBmbGFncyA9IGNyZWF0ZV90ZXN0X2ZsYWdzKCk7CisgICAgICAgIGxldCBtdXQgbWFwID0gRmluYWxpemVkRmxhZ01hcDo6bmV3KCk7CisgICAgICAgIGxldCBsMzUgPSBBcGlMZXZlbCgzNSk7CisgICAgICAgIGxldCBsMzYgPSBBcGlMZXZlbCgzNik7CisKKyAgICAgICAgbWFwLmluc2VydF9pZl9uZXcobDM1LCBmbGFnc1swXS5jbG9uZSgpKTsKKyAgICAgICAgbWFwLmluc2VydF9pZl9uZXcobDM1LCBmbGFnc1sxXS5jbG9uZSgpKTsKKyAgICAgICAgbWFwLmluc2VydF9pZl9uZXcobDM1LCBmbGFnc1syXS5jbG9uZSgpKTsKKyAgICAgICAgbWFwLmluc2VydF9pZl9uZXcobDM2LCBmbGFnc1swXS5jbG9uZSgpKTsKKworICAgICAgICBhc3NlcnQhKG1hcC4wLmdldCgmbDM1KS51bndyYXAoKS5jb250YWlucygmZmxhZ3NbMF0pKTsKKyAgICAgICAgYXNzZXJ0IShtYXAuMC5nZXQoJmwzNSkudW53cmFwKCkuY29udGFpbnMoJmZsYWdzWzFdKSk7CisgICAgICAgIGFzc2VydCEobWFwLjAuZ2V0KCZsMzUpLnVud3JhcCgpLmNvbnRhaW5zKCZmbGFnc1syXSkpOworICAgICAgICBhc3NlcnQhKCFtYXAuMC5jb250YWluc19rZXkoJmwzNikpOworICAgIH0KKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0X2ZsYWdzX21hcF9nZXRfbGV2ZWwoKSB7CisgICAgICAgIGxldCBmbGFncyA9IGNyZWF0ZV90ZXN0X2ZsYWdzKCk7CisgICAgICAgIGxldCBtdXQgbWFwID0gRmluYWxpemVkRmxhZ01hcDo6bmV3KCk7CisgICAgICAgIGxldCBsMzUgPSBBcGlMZXZlbCgzNSk7CisgICAgICAgIGxldCBsMzYgPSBBcGlMZXZlbCgzNik7CisKKyAgICAgICAgbWFwLmluc2VydF9pZl9uZXcobDM1LCBmbGFnc1swXS5jbG9uZSgpKTsKKyAgICAgICAgbWFwLmluc2VydF9pZl9uZXcobDM2LCBmbGFnc1sxXS5jbG9uZSgpKTsKKworICAgICAgICBhc3NlcnRfZXEhKG1hcC5nZXRfZmluYWxpemVkX2xldmVsKCZmbGFnc1swXSkudW53cmFwKCksIGwzNSk7CisgICAgICAgIGFzc2VydF9lcSEobWFwLmdldF9maW5hbGl6ZWRfbGV2ZWwoJmZsYWdzWzFdKS51bndyYXAoKSwgbDM2KTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2NvbnZlcnRfZmluYWxpemVkX2ZsYWdzL3NyYy9tYWluLnJzIGIvdG9vbHMvYWNvbmZpZy9jb252ZXJ0X2ZpbmFsaXplZF9mbGFncy9zcmMvbWFpbi5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODMwMGY2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvYWNvbmZpZy9jb252ZXJ0X2ZpbmFsaXplZF9mbGFncy9zcmMvbWFpbi5ycwpAQCAtMCwwICsxLDU3IEBACisvKgorKiBDb3B5cmlnaHQgKEMpIDIwMjUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKgorKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoKKyogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoKKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisvLyEgY29udmVydF9maW5hbGl6ZWRfZmxhZ3MgaXMgYSBidWlsZCB0aW1lIHRvb2wgdXNlZCB0byBjb252ZXJ0IHRoZSBmaW5hbGl6ZWQKKy8vISBmbGFncyB0ZXh0IGZpbGVzIHVuZGVyIHByZWJ1aWx0cy9zZGsgaW50byBzdHJ1Y3R1cmVkIGRhdGEgKEZpbmFsaXplZEZsYWcKKy8vISBzdHJ1Y3QpLgorLy8hIFRoaXMgYmluYXJ5IGlzIGludGVuZGVkIHRvIHJ1biBhcyBwYXJ0IG9mIGEgZ2VucnVsZSB0byBjcmVhdGUgYSBqc29uIGZpbGUKKy8vISB3aGljaCBpcyBwcm92aWRlZCB0byB0aGUgYWNvbmZpZyBiaW5hcnkgdGhhdCBjcmVhdGVzIHRoZSBjb2RlZ2VuLgorLy8hIFVzYWdlOgorLy8hIGNhcmdvIHJ1biAtLSAtLWZsYWctZmlsZXMtcGF0aCBwYXRoL3RvL3ByZWJ1aWx0cy9zZGsvZmluYWxpemVkLWZsYWdzLnR4dCBmaWxlMi50eHQgZXRjCit1c2UgYW55aG93OjpSZXN1bHQ7Cit1c2UgY2xhcDo6UGFyc2VyOworCit1c2UgY29udmVydF9maW5hbGl6ZWRfZmxhZ3M6OnJlYWRfZmlsZXNfdG9fbWFwX3VzaW5nX3BhdGg7CisKK2NvbnN0IEFCT1VUX1RFWFQ6ICZzdHIgPSAiVG9vbCBmb3IgcHJvY2Vzc2luZyBmaW5hbGl6ZWQtZmxhZ3MudHh0IGZpbGVzLgorCitUaGVzZSBmaWxlcyBjb250YWluIHRoZSBsaXN0IG9mIHF1YWxpZmllZCBmbGFnIG5hbWVzIHRoYXQgaGF2ZSBiZWVuIGZpbmFsaXplZCwKK2VhY2ggb24gYSBuZXdsaW5lLiBUaGUgZGlyZWN0b3J5IG9mIHRoZSBmbGFnIGZpbGUgaXMgdGhlIGZpbmFsaXplZCBBUEkgbGV2ZWwuCisKK1RoZSBvdXRwdXQgaXMgYSBqc29uIG1hcCBvZiBBUEkgbGV2ZWwgdG8gc2V0IG9mIEZpbmFsaXplZEZsYWcgb2JqZWN0cy4gVGhlIG9ubHkKK3N1cHBvcnRlZCB1c2UgY2FzZSBmb3IgdGhpcyB0b29sIGlzIHZpYSBhIGdlbnJ1bGUgYXQgYnVpbGQgdGltZSBmb3IgYWNvbmZpZworY29kZWdlbi4KKworQXJnczoKKyogYGZsYWctZmlsZXMtcGF0aGA6IFNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIGFic29sdXRlIHBhdGhzIGZvciB0aGUgZmluYWxpemVkCitmbGFncyBmaWxlcy4KKyI7CisKKyNbZGVyaXZlKFBhcnNlciwgRGVidWcpXQorI1tjbGFwKGxvbmdfYWJvdXQ9QUJPVVRfVEVYVCwgYmluX25hbWU9ImNvbnZlcnQtZmluYWxpemVkLWZsYWdzIildCitzdHJ1Y3QgQ2xpIHsKKyAgICAvLy8gRmxhZ3MgZmlsZXMuCisgICAgI1thcmcobG9uZyA9ICJmbGFnX2ZpbGVfcGF0aCIpXQorICAgIGZsYWdfZmlsZV9wYXRoOiBWZWM8U3RyaW5nPiwKK30KKworZm4gbWFpbigpIC0+IFJlc3VsdDwoKT4geworICAgIGxldCBjbGkgPSBDbGk6OnBhcnNlKCk7CisgICAgbGV0IGZpbmFsaXplZF9mbGFnc19tYXAgPSByZWFkX2ZpbGVzX3RvX21hcF91c2luZ19wYXRoKGNsaS5mbGFnX2ZpbGVfcGF0aCk/OworCisgICAgbGV0IGpzb25fc3RyID0gc2VyZGVfanNvbjo6dG9fc3RyaW5nKCZmaW5hbGl6ZWRfZmxhZ3NfbWFwKT87CisgICAgcHJpbnRsbiEoInt9IiwganNvbl9zdHIpOworICAgIE9rKCgpKQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvQW5kcm9pZC5icCBiL3Rvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL0FuZHJvaWQuYnAKaW5kZXggNzcwNDc0Mi4uYmY5ODA1OCAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvQW5kcm9pZC5icAorKysgYi90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9BbmRyb2lkLmJwCkBAIC0xNSw5ICsxNSw3IEBACiBqYXZhX2xpYnJhcnkgewogICAgIG5hbWU6ICJmYWtlX2RldmljZV9jb25maWciLAogICAgIHNyY3M6IFsKLSAgICAgICAgInNyYy9hbmRyb2lkL3V0aWwvTG9nLmphdmEiLAotICAgICAgICAic3JjL2FuZHJvaWQvcHJvdmlkZXIvRGV2aWNlQ29uZmlnLmphdmEiLAotICAgICAgICAic3JjL2FuZHJvaWQvb3MvU3RyaWN0TW9kZS5qYXZhIiwKKyAgICAgICAgInNyYy8qKi8qLmphdmEiLAogICAgIF0sCiAgICAgc2RrX3ZlcnNpb246ICJub25lIiwKICAgICBzeXN0ZW1fbW9kdWxlczogImNvcmUtYWxsLXN5c3RlbS1tb2R1bGVzIiwKQEAgLTI2LDExICsyNCwyMiBAQAogfQogCiBqYXZhX2xpYnJhcnkgewotICAgIG5hbWU6ICJzdHJpY3RfbW9kZV9zdHViIiwKKyAgICBuYW1lOiAiYWNvbmZpZ19zdG9yYWdlX3N0dWIiLAogICAgIHNyY3M6IFsKLSAgICAgICAgInNyYy9hbmRyb2lkL29zL1N0cmljdE1vZGUuamF2YSIsCisgICAgICAgICJzcmMvYW5kcm9pZC9vcy9mbGFnZ2luZy8qKi8qLmphdmEiLAogICAgIF0sCiAgICAgc2RrX3ZlcnNpb246ICJjb3JlX2N1cnJlbnQiLAogICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogICAgIGlzX3N0dWJzX21vZHVsZTogdHJ1ZSwKIH0KKworamF2YV9saWJyYXJ5IHsKKyAgICBuYW1lOiAiYWNvbmZpZ19zdG9yYWdlX3N0dWJfbm9uZSIsCisgICAgc3JjczogWworICAgICAgICAic3JjL2FuZHJvaWQvb3MvZmxhZ2dpbmcvKiovKi5qYXZhIiwKKyAgICBdLAorICAgIHNka192ZXJzaW9uOiAibm9uZSIsCisgICAgc3lzdGVtX21vZHVsZXM6ICJjb3JlLWFsbC1zeXN0ZW0tbW9kdWxlcyIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgaXNfc3R1YnNfbW9kdWxlOiB0cnVlLAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvb3MvU3RyaWN0TW9kZS5qYXZhIGIvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvb3MvQnVpbGQuamF2YQpzaW1pbGFyaXR5IGluZGV4IDY2JQpjb3B5IGZyb20gdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvb3MvU3RyaWN0TW9kZS5qYXZhCmNvcHkgdG8gdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvb3MvQnVpbGQuamF2YQppbmRleCA2NDE2MjUyLi44ZWM3MmZiIDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9vcy9TdHJpY3RNb2RlLmphdmEKKysrIGIvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvb3MvQnVpbGQuamF2YQpAQCAtMTYsMTQgKzE2LDggQEAKIAogcGFja2FnZSBhbmRyb2lkLm9zOwogCi1wdWJsaWMgY2xhc3MgU3RyaWN0TW9kZSB7Ci0gICAgcHVibGljIHN0YXRpYyBUaHJlYWRQb2xpY3kgYWxsb3dUaHJlYWREaXNrUmVhZHMoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiU3R1YiEiKTsKK3B1YmxpYyBjbGFzcyBCdWlsZCB7CisgICAgcHVibGljIHN0YXRpYyBjbGFzcyBWRVJTSU9OIHsKKyAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0RLX0lOVCA9IDA7CiAgICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFRocmVhZFBvbGljeShmaW5hbCBUaHJlYWRQb2xpY3kgcG9saWN5KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiU3R1YiEiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFRocmVhZFBvbGljeSB7fQogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvb3MvU3RyaWN0TW9kZS5qYXZhIGIvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvb3MvZmxhZ2dpbmcvQWNvbmZpZ1BhY2thZ2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDcxJQpyZW5hbWUgZnJvbSB0b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9vcy9TdHJpY3RNb2RlLmphdmEKcmVuYW1lIHRvIHRvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL3NyYy9hbmRyb2lkL29zL2ZsYWdnaW5nL0Fjb25maWdQYWNrYWdlLmphdmEKaW5kZXggNjQxNjI1Mi4uM2NhYzUxNiAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvb3MvU3RyaWN0TW9kZS5qYXZhCisrKyBiL3Rvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL3NyYy9hbmRyb2lkL29zL2ZsYWdnaW5nL0Fjb25maWdQYWNrYWdlLmphdmEKQEAgLTE0LDE2ICsxNCwxNyBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotcGFja2FnZSBhbmRyb2lkLm9zOworcGFja2FnZSBhbmRyb2lkLm9zLmZsYWdnaW5nOwogCi1wdWJsaWMgY2xhc3MgU3RyaWN0TW9kZSB7Ci0gICAgcHVibGljIHN0YXRpYyBUaHJlYWRQb2xpY3kgYWxsb3dUaHJlYWREaXNrUmVhZHMoKSB7CisvKgorICogVGhpcyBjbGFzcyBhbGxvd3MgZ2VuZXJhdGVkIGFjb25maWcgY29kZSB0byBjb21waWxlIGluZGVwZW5kZW50bHkgb2YgdGhlIGZyYW1ld29yay4KKyAqLworcHVibGljIGNsYXNzIEFjb25maWdQYWNrYWdlIHsKKyAgICBwdWJsaWMgc3RhdGljIEFjb25maWdQYWNrYWdlIGxvYWQoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiU3R1YiEiKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VGhyZWFkUG9saWN5KGZpbmFsIFRocmVhZFBvbGljeSBwb2xpY3kpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuRmxhZ1ZhbHVlKFN0cmluZyBmbGFnTmFtZSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJTdHViISIpOwogICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVGhyZWFkUG9saWN5IHt9CiB9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9vcy9TdHJpY3RNb2RlLmphdmEgYi90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9vcy9mbGFnZ2luZy9BY29uZmlnUGFja2FnZUludGVybmFsLmphdmEKc2ltaWxhcml0eSBpbmRleCA3MCUKY29weSBmcm9tIHRvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL3NyYy9hbmRyb2lkL29zL1N0cmljdE1vZGUuamF2YQpjb3B5IHRvIHRvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL3NyYy9hbmRyb2lkL29zL2ZsYWdnaW5nL0Fjb25maWdQYWNrYWdlSW50ZXJuYWwuamF2YQppbmRleCA2NDE2MjUyLi40NjA1OGI2IDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9vcy9TdHJpY3RNb2RlLmphdmEKKysrIGIvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvb3MvZmxhZ2dpbmcvQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbC5qYXZhCkBAIC0xNCwxNiArMTQsMTggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgYW5kcm9pZC5vczsKK3BhY2thZ2UgYW5kcm9pZC5vcy5mbGFnZ2luZzsKIAotcHVibGljIGNsYXNzIFN0cmljdE1vZGUgewotICAgIHB1YmxpYyBzdGF0aWMgVGhyZWFkUG9saWN5IGFsbG93VGhyZWFkRGlza1JlYWRzKCkgeworLyoKKyAqIFRoaXMgY2xhc3MgYWxsb3dzIGdlbmVyYXRlZCBhY29uZmlnIGNvZGUgdG8gY29tcGlsZSBpbmRlcGVuZGVudGx5IG9mIHRoZSBmcmFtZXdvcmsuCisgKi8KK3B1YmxpYyBjbGFzcyBBY29uZmlnUGFja2FnZUludGVybmFsIHsKKworICAgIHB1YmxpYyBzdGF0aWMgQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbCBsb2FkKFN0cmluZyBwYWNrYWdlTmFtZSwgbG9uZyBwYWNrYWdlRmluZ2VycHJpbnQpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJTdHViISIpOwogICAgIH0KIAotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRUaHJlYWRQb2xpY3koZmluYWwgVGhyZWFkUG9saWN5IHBvbGljeSkgeworICAgIHB1YmxpYyBib29sZWFuIGdldEJvb2xlYW5GbGFnVmFsdWUoaW50IGluZGV4KSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiU3R1YiEiKTsKICAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFRocmVhZFBvbGljeSB7fQogfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvb3MvU3RyaWN0TW9kZS5qYXZhIGIvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvb3MvZmxhZ2dpbmcvUGxhdGZvcm1BY29uZmlnUGFja2FnZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggNjAlCmNvcHkgZnJvbSB0b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9vcy9TdHJpY3RNb2RlLmphdmEKY29weSB0byB0b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9vcy9mbGFnZ2luZy9QbGF0Zm9ybUFjb25maWdQYWNrYWdlLmphdmEKaW5kZXggNjQxNjI1Mi4uZWM3OWY3ZCAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvb3MvU3RyaWN0TW9kZS5qYXZhCisrKyBiL3Rvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL3NyYy9hbmRyb2lkL29zL2ZsYWdnaW5nL1BsYXRmb3JtQWNvbmZpZ1BhY2thZ2UuamF2YQpAQCAtMTQsMTYgKzE0LDIzIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi1wYWNrYWdlIGFuZHJvaWQub3M7CitwYWNrYWdlIGFuZHJvaWQub3MuZmxhZ2dpbmc7CiAKLXB1YmxpYyBjbGFzcyBTdHJpY3RNb2RlIHsKLSAgICBwdWJsaWMgc3RhdGljIFRocmVhZFBvbGljeSBhbGxvd1RocmVhZERpc2tSZWFkcygpIHsKK2ltcG9ydCBqYXZhLnV0aWwuU2V0OworCisvKgorICogVGhpcyBjbGFzcyBhbGxvd3MgZ2VuZXJhdGVkIGFjb25maWcgY29kZSB0byBjb21waWxlIGluZGVwZW5kZW50bHkgb2YgdGhlIGZyYW1ld29yay4KKyAqLworcHVibGljIGNsYXNzIFBsYXRmb3JtQWNvbmZpZ1BhY2thZ2UgeworCisgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTZXQ8U3RyaW5nPiBQTEFURk9STV9QQUNLQUdFX01BUF9GSUxFUyA9CisgICAgICAgICAgICBTZXQub2YoInN5c3RlbS5wYWNrYWdlLm1hcCIsICJ2ZW5kb3IucGFja2FnZS5tYXAiLCAicHJvZHVjdC5wYWNrYWdlLm1hcCIpOworCisgICAgcHVibGljIHN0YXRpYyBQbGF0Zm9ybUFjb25maWdQYWNrYWdlIGxvYWQoU3RyaW5nIHBhY2thZ2VOYW1lKSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiU3R1YiEiKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VGhyZWFkUG9saWN5KGZpbmFsIFRocmVhZFBvbGljeSBwb2xpY3kpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuRmxhZ1ZhbHVlKFN0cmluZyBmbGFnTmFtZSwgYm9vbGVhbiBkZWZhdWx0VmFsdWUpIHsKICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJTdHViISIpOwogICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgVGhyZWFkUG9saWN5IHt9CiB9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9vcy9TdHJpY3RNb2RlLmphdmEgYi90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9vcy9mbGFnZ2luZy9QbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwuamF2YQpzaW1pbGFyaXR5IGluZGV4IDY5JQpjb3B5IGZyb20gdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvb3MvU3RyaWN0TW9kZS5qYXZhCmNvcHkgdG8gdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvb3MvZmxhZ2dpbmcvUGxhdGZvcm1BY29uZmlnUGFja2FnZUludGVybmFsLmphdmEKaW5kZXggNjQxNjI1Mi4uMzc4Yzk2MyAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvb3MvU3RyaWN0TW9kZS5qYXZhCisrKyBiL3Rvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL3NyYy9hbmRyb2lkL29zL2ZsYWdnaW5nL1BsYXRmb3JtQWNvbmZpZ1BhY2thZ2VJbnRlcm5hbC5qYXZhCkBAIC0xNCwxNiArMTQsMTggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgYW5kcm9pZC5vczsKK3BhY2thZ2UgYW5kcm9pZC5vcy5mbGFnZ2luZzsKIAotcHVibGljIGNsYXNzIFN0cmljdE1vZGUgewotICAgIHB1YmxpYyBzdGF0aWMgVGhyZWFkUG9saWN5IGFsbG93VGhyZWFkRGlza1JlYWRzKCkgeworLyoKKyAqIFRoaXMgY2xhc3MgYWxsb3dzIGdlbmVyYXRlZCBhY29uZmlnIGNvZGUgdG8gY29tcGlsZSBpbmRlcGVuZGVudGx5IG9mIHRoZSBmcmFtZXdvcmsuCisgKi8KK3B1YmxpYyBjbGFzcyBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwgeworCisgICAgcHVibGljIHN0YXRpYyBQbGF0Zm9ybUFjb25maWdQYWNrYWdlSW50ZXJuYWwgbG9hZChTdHJpbmcgcGFja2FnZU5hbWUsIGxvbmcgcGFja2FnZUZpbmdlcnByaW50KSB7CiAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiU3R1YiEiKTsKICAgICB9CiAKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VGhyZWFkUG9saWN5KGZpbmFsIFRocmVhZFBvbGljeSBwb2xpY3kpIHsKKyAgICBwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuRmxhZ1ZhbHVlKGludCBpbmRleCkgewogICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlN0dWIhIik7CiAgICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBUaHJlYWRQb2xpY3kge30KIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL3NyYy9hbmRyb2lkL3Byb3ZpZGVyL0RldmljZUNvbmZpZy5qYXZhIGIvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvcHJvdmlkZXIvRGV2aWNlQ29uZmlnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYjA3YWMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvcHJvdmlkZXIvRGV2aWNlQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDIzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBhbmRyb2lkLnByb3ZpZGVyOwotCi0vKgotICogVGhpcyBjbGFzcyBhbGxvd3MgZ2VuZXJhdGVkIGFjb25maWcgY29kZSB0byBjb21waWxlIGluZGVwZW5kZW50bHkgb2YgdGhlIGZyYW1ld29yay4KLSAqLwotcHVibGljIGNsYXNzIERldmljZUNvbmZpZyB7Ci0JcHJpdmF0ZSBEZXZpY2VDb25maWcoKSB7Ci0JfQotCi0JcHVibGljIHN0YXRpYyBib29sZWFuIGdldEJvb2xlYW4oU3RyaW5nIG5zLCBTdHJpbmcgbmFtZSwgYm9vbGVhbiBkZWYpIHsKLQkJcmV0dXJuIGZhbHNlOwotCX0KLQotCXB1YmxpYyBzdGF0aWMgUHJvcGVydGllcyBnZXRQcm9wZXJ0aWVzKFN0cmluZyBuYW1lc3BhY2UsIFN0cmluZy4uLiBuYW1lcykgewotCQlyZXR1cm4gbmV3IFByb3BlcnRpZXMoKTsKLQl9Ci0KLQlwdWJsaWMgc3RhdGljIGNsYXNzIFByb3BlcnRpZXMgewotCQlwdWJsaWMgYm9vbGVhbiBnZXRCb29sZWFuKFN0cmluZyBuYW1lLCBib29sZWFuIGRlZikgewotCQkJcmV0dXJuIGZhbHNlOwotCQl9Ci0JfQotfQpkaWZmIC0tZ2l0IGEvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvdXRpbC9Mb2cuamF2YSBiL3Rvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL3NyYy9hbmRyb2lkL3V0aWwvTG9nLmphdmEKaW5kZXggM2U3ZmQwZi4uZTQwNzkwYSAxMDA2NDQKLS0tIGEvdG9vbHMvYWNvbmZpZy9mYWtlX2RldmljZV9jb25maWcvc3JjL2FuZHJvaWQvdXRpbC9Mb2cuamF2YQorKysgYi90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC91dGlsL0xvZy5qYXZhCkBAIC0yLDE0ICsyLDE4IEBACiAKIHB1YmxpYyBmaW5hbCBjbGFzcyBMb2cgewogICAgIHB1YmxpYyBzdGF0aWMgaW50IGkoU3RyaW5nIHRhZywgU3RyaW5nIG1zZykgewotICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJTdHViISIpOworICAgIH0KKworICAgIHB1YmxpYyBzdGF0aWMgaW50IHcoU3RyaW5nIHRhZywgU3RyaW5nIG1zZykgeworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlN0dWIhIik7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBpbnQgZShTdHJpbmcgdGFnLCBTdHJpbmcgbXNnKSB7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlN0dWIhIik7CiAgICAgfQogCiAgICAgcHVibGljIHN0YXRpYyBpbnQgZShTdHJpbmcgdGFnLCBTdHJpbmcgbXNnLCBUaHJvd2FibGUgdHIpIHsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiU3R1YiEiKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL3ByaW50ZmxhZ3MvQW5kcm9pZC5icCBiL3Rvb2xzL2Fjb25maWcvcHJpbnRmbGFncy9BbmRyb2lkLmJwCmluZGV4IGQ1MGE3N2QuLjZmN2JjYTMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2Fjb25maWcvcHJpbnRmbGFncy9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL2Fjb25maWcvcHJpbnRmbGFncy9BbmRyb2lkLmJwCkBAIC0xOSw2ICsxOSw5IEBACiBydXN0X2JpbmFyeSB7CiAgICAgbmFtZTogInByaW50ZmxhZ3MiLAogICAgIGRlZmF1bHRzOiBbInByaW50ZmxhZ3MuZGVmYXVsdHMiXSwKKyAgICBhcGV4X2F2YWlsYWJsZTogWworICAgICAgICAiLy9hcGV4X2F2YWlsYWJsZTpwbGF0Zm9ybSIsCisgICAgXSwKIH0KIAogcnVzdF90ZXN0X2hvc3QgewpkaWZmIC0tZ2l0IGEvdG9vbHMvYXV0b19nZW5fdGVzdF9jb25maWcucHkgYi90b29scy9hdXRvX2dlbl90ZXN0X2NvbmZpZy5weQppbmRleCA4ZWU1OTlhLi5kNTRjNDEyIDEwMDc1NQotLS0gYS90b29scy9hdXRvX2dlbl90ZXN0X2NvbmZpZy5weQorKysgYi90b29scy9hdXRvX2dlbl90ZXN0X2NvbmZpZy5weQpAQCAtMzQsNiArMzQsNyBAQAogUExBQ0VIT0xERVJfUEFDS0FHRSA9ICd7UEFDS0FHRX0nCiBQTEFDRUhPTERFUl9SVU5ORVIgPSAne1JVTk5FUn0nCiBQTEFDRUhPTERFUl9URVNUX1RZUEUgPSAne1RFU1RfVFlQRX0nCitQTEFDRUhPTERFUl9FWFRSQV9URVNUX1JVTk5FUl9DT05GSUdTID0gJ3tFWFRSQV9URVNUX1JVTk5FUl9DT05GSUdTfScKIAogCiBkZWYgbWFpbihhcmd2KToKQEAgLTU5LDYgKzYwLDcgQEAKICAgICAgICJpbnN0cnVtZW50YXRpb25fdGVzdF9jb25maWdfdGVtcGxhdGUiLAogICAgICAgaGVscD0iUGF0aCB0byB0aGUgaW5zdHJ1bWVudGF0aW9uIHRlc3QgY29uZmlnIHRlbXBsYXRlLiIpCiAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tZXh0cmEtY29uZmlncyIsIGRlZmF1bHQ9IiIpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tZXh0cmEtdGVzdC1ydW5uZXItY29uZmlncyIsIGRlZmF1bHQ9IiIpCiAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncyhhcmd2KQogCiAgIHRhcmdldF9jb25maWcgPSBhcmdzLnRhcmdldF9jb25maWcKQEAgLTY2LDYgKzY4LDcgQEAKICAgZW1wdHlfY29uZmlnID0gYXJncy5lbXB0eV9jb25maWcKICAgaW5zdHJ1bWVudGF0aW9uX3Rlc3RfY29uZmlnX3RlbXBsYXRlID0gYXJncy5pbnN0cnVtZW50YXRpb25fdGVzdF9jb25maWdfdGVtcGxhdGUKICAgZXh0cmFfY29uZmlncyA9ICdcbicuam9pbihhcmdzLmV4dHJhX2NvbmZpZ3Muc3BsaXQoJ1xcbicpKQorICBleHRyYV90ZXN0X3J1bm5lcl9jb25maWdzID0gJ1xuJy5qb2luKGFyZ3MuZXh0cmFfdGVzdF9ydW5uZXJfY29uZmlncy5zcGxpdCgnXFxuJykpCiAKICAgbW9kdWxlID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKHRhcmdldF9jb25maWcpKVswXQogCkBAIC0xMzEsNiArMTM0LDcgQEAKICAgICBjb25maWcgPSBjb25maWcucmVwbGFjZShQTEFDRUhPTERFUl9QQUNLQUdFLCBwYWNrYWdlKQogICAgIGNvbmZpZyA9IGNvbmZpZy5yZXBsYWNlKFBMQUNFSE9MREVSX1RFU1RfVFlQRSwgdGVzdF90eXBlKQogICAgIGNvbmZpZyA9IGNvbmZpZy5yZXBsYWNlKFBMQUNFSE9MREVSX0VYVFJBX0NPTkZJR1MsIGV4dHJhX2NvbmZpZ3MpCisgICAgY29uZmlnID0gY29uZmlnLnJlcGxhY2UoUExBQ0VIT0xERVJfRVhUUkFfVEVTVF9SVU5ORVJfQ09ORklHUywgZXh0cmFfdGVzdF9ydW5uZXJfY29uZmlncykKICAgICBjb25maWcgPSBjb25maWcucmVwbGFjZShQTEFDRUhPTERFUl9SVU5ORVIsIHJ1bm5lcikKICAgICB3aXRoIG9wZW4odGFyZ2V0X2NvbmZpZywgJ3cnKSBhcyBjb25maWdfZmlsZToKICAgICAgIGNvbmZpZ19maWxlLndyaXRlKGNvbmZpZykKZGlmZiAtLWdpdCBhL3Rvb2xzL2NoZWNrLWZsYWdnZWQtYXBpcy9zcmMvY29tL2FuZHJvaWQvY2hlY2tmbGFnZ2VkYXBpcy9DaGVja0ZsYWdnZWRBcGlzVGVzdC5rdCBiL3Rvb2xzL2NoZWNrLWZsYWdnZWQtYXBpcy9zcmMvY29tL2FuZHJvaWQvY2hlY2tmbGFnZ2VkYXBpcy9DaGVja0ZsYWdnZWRBcGlzVGVzdC5rdAppbmRleCBlMDdhYzFkLi41YWNiNTRhIDEwMDY0NAotLS0gYS90b29scy9jaGVjay1mbGFnZ2VkLWFwaXMvc3JjL2NvbS9hbmRyb2lkL2NoZWNrZmxhZ2dlZGFwaXMvQ2hlY2tGbGFnZ2VkQXBpc1Rlc3Qua3QKKysrIGIvdG9vbHMvY2hlY2stZmxhZ2dlZC1hcGlzL3NyYy9jb20vYW5kcm9pZC9jaGVja2ZsYWdnZWRhcGlzL0NoZWNrRmxhZ2dlZEFwaXNUZXN0Lmt0CkBAIC0zNCw3ICszNCw3IEBACiAgICAgICAgICAgY3RvciBARmxhZ2dlZEFwaSgiYW5kcm9pZC5mbGFnLmZvbyIpIHB1YmxpYyBDbGF6eigpOwogICAgICAgICAgIGZpZWxkIEBGbGFnZ2VkQXBpKCJhbmRyb2lkLmZsYWcuZm9vIikgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRk9PID0gMTsgLy8gMHgxCiAgICAgICAgICAgbWV0aG9kIEBGbGFnZ2VkQXBpKCJhbmRyb2lkLmZsYWcuZm9vIikgcHVibGljIGludCBnZXRFcnJvckNvZGUoKTsKLSAgICAgICAgICBtZXRob2QgQEZsYWdnZWRBcGkoImFuZHJvaWQuZmxhZy5mb28iKSBwdWJsaWMgYm9vbGVhbiBzZXREYXRhKGludCwgaW50W11bXSwgQE5vbk51bGwgYW5kcm9pZC51dGlsLlV0aWxpdHk8VCwgVT4pOworICAgICAgICAgIG1ldGhvZCBARmxhZ2dlZEFwaSgiYW5kcm9pZC5mbGFnLmZvbyIpIHB1YmxpYyA8VCxVPiBib29sZWFuIHNldERhdGEoaW50LCBpbnRbXVtdLCBATm9uTnVsbCBhbmRyb2lkLnV0aWwuVXRpbGl0eTxULCBVPik7CiAgICAgICAgICAgbWV0aG9kIEBGbGFnZ2VkQXBpKCJhbmRyb2lkLmZsYWcuZm9vIikgcHVibGljIGJvb2xlYW4gc2V0VmFyaWFibGVEYXRhKGludCwgYW5kcm9pZC51dGlsLkF0b20uLi4pOwogICAgICAgICAgIG1ldGhvZCBARmxhZ2dlZEFwaSgiYW5kcm9pZC5mbGFnLmZvbyIpIHB1YmxpYyBib29sZWFuIGlubmVyQ2xhc3NBcmcoYW5kcm9pZC5DbGF6ei5CdWlsZGVyKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvdG9vbHMvY2hlY2tfZWxmX2ZpbGUucHkgYi90b29scy9jaGVja19lbGZfZmlsZS5weQppbmRleCAxZmQ3OTUwLi4wNjQwMDQxIDEwMDc1NQotLS0gYS90b29scy9jaGVja19lbGZfZmlsZS5weQorKysgYi90b29scy9jaGVja19lbGZfZmlsZS5weQpAQCAtNDIsOCArNDIsOSBAQAogX0VNX1g4Nl82NCA9IDYyCiBfRU1fQUFSQ0g2NCA9IDE4MwogCi1fS05PV05fTUFDSElORVMgPSB7X0VNXzM4NiwgX0VNX0FSTSwgX0VNX1g4Nl82NCwgX0VNX0FBUkNINjR9Ci0KK18zMl9CSVRfTUFDSElORVMgPSB7X0VNXzM4NiwgX0VNX0FSTX0KK182NF9CSVRfTUFDSElORVMgPSB7X0VNX1g4Nl82NCwgX0VNX0FBUkNINjR9CitfS05PV05fTUFDSElORVMgPSBfMzJfQklUX01BQ0hJTkVTIHwgXzY0X0JJVF9NQUNISU5FUwogCiAjIEVMRiBoZWFkZXIgc3RydWN0CiBfRUxGX0hFQURFUl9TVFJVQ1QgPSAoCkBAIC00ODMsNiArNDg0LDExIEBACiAgICAgICBzeXMuZXhpdCgyKQogCiAgIGRlZiBjaGVja19tYXhfcGFnZV9zaXplKHNlbGYsIG1heF9wYWdlX3NpemUpOgorICAgIGlmIHNlbGYuX2ZpbGVfdW5kZXJfdGVzdC5oZWFkZXIuZV9tYWNoaW5lIGluIF8zMl9CSVRfTUFDSElORVM6CisgICAgICAjIFNraXAgdGVzdCBvbiAzMi1iaXQgbWFjaGluZXMuIDE2IEtCIHBhZ2VzIGlzIGFuIGFybTY0IGZlYXR1cmUKKyAgICAgICMgYW5kIG5vIDMyLWJpdCBzeXN0ZW1zIGluIEFuZHJvaWQgdXNlIGl0LgorICAgICAgcmV0dXJuCisKICAgICBmb3IgYWxpZ25tZW50IGluIHNlbGYuX2ZpbGVfdW5kZXJfdGVzdC5hbGlnbm1lbnRzOgogICAgICAgaWYgYWxpZ25tZW50ICUgbWF4X3BhZ2Vfc2l6ZSAhPSAwOgogICAgICAgICBzZWxmLl9lcnJvcihmJ0xvYWQgc2VnbWVudCBoYXMgYWxpZ25tZW50IHthbGlnbm1lbnR9IGJ1dCAnCmRpZmYgLS1naXQgYS90b29scy9jb21wbGlhbmNlL2dvLndvcmsgYi90b29scy9jb21wbGlhbmNlL2dvLndvcmsKaW5kZXggYTI0ZDJlYS4uNTA2ZTYxOSAxMDA2NDQKLS0tIGEvdG9vbHMvY29tcGxpYW5jZS9nby53b3JrCisrKyBiL3Rvb2xzL2NvbXBsaWFuY2UvZ28ud29yawpAQCAtMSw0ICsxLDQgQEAKLWdvIDEuMjIKK2dvIDEuMjMKIAogdXNlICgKIAkuCmRpZmYgLS1naXQgYS90b29scy9lZGl0X21vbml0b3IvQW5kcm9pZC5icCBiL3Rvb2xzL2VkaXRfbW9uaXRvci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YWM1YmYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9lZGl0X21vbml0b3IvQW5kcm9pZC5icApAQCAtMCwwICsxLDExOCBAQAorLy8gQ29weXJpZ2h0IDIwMjQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gU2V0IG9mIGVycm9yIHByb25lIHJ1bGVzIHRvIGVuc3VyZSBjb2RlIHF1YWxpdHkKKy8vIFBhY2thZ2VMb2NhdGlvbiBjaGVjayByZXF1aXJlcyB0aGUgYW5kcm9pZENvbXBhdGlibGU9ZmFsc2Ugb3RoZXJ3aXNlIGl0IGRvZXMgbm90IGRvIGFueXRoaW5nLgorCitwYWNrYWdlIHsKKyAgICBkZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXM6IFsiQW5kcm9pZC1BcGFjaGUtMi4wIl0sCisgICAgZGVmYXVsdF90ZWFtOiAidHJlbmR5X3RlYW1fYWR0ZSIsCit9CisKK3B5dGhvbl9saWJyYXJ5X2hvc3QgeworICAgIG5hbWU6ICJlZGl0X2V2ZW50X3Byb3RvIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJwcm90by9lZGl0X2V2ZW50LnByb3RvIiwKKyAgICBdLAorICAgIHByb3RvOiB7CisgICAgICAgIGNhbm9uaWNhbF9wYXRoX2Zyb21fcm9vdDogZmFsc2UsCisgICAgfSwKK30KKworcHl0aG9uX2xpYnJhcnlfaG9zdCB7CisgICAgbmFtZTogImVkaXRfbW9uaXRvcl9saWIiLAorICAgIHBrZ19wYXRoOiAiZWRpdF9tb25pdG9yIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJkYWVtb25fbWFuYWdlci5weSIsCisgICAgICAgICJlZGl0X21vbml0b3IucHkiLAorICAgICAgICAidXRpbHMucHkiLAorICAgIF0sCisgICAgbGliczogWworICAgICAgICAiYXN1aXRlX2NjX2NsaWVudCIsCisgICAgICAgICJlZGl0X2V2ZW50X3Byb3RvIiwKKyAgICAgICAgIndhdGNoZG9nIiwKKyAgICBdLAorfQorCitweXRob25fdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAiZGFlbW9uX21hbmFnZXJfdGVzdCIsCisgICAgbWFpbjogImRhZW1vbl9tYW5hZ2VyX3Rlc3QucHkiLAorICAgIHBrZ19wYXRoOiAiZWRpdF9tb25pdG9yIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJkYWVtb25fbWFuYWdlcl90ZXN0LnB5IiwKKyAgICBdLAorICAgIGxpYnM6IFsKKyAgICAgICAgImVkaXRfbW9uaXRvcl9saWIiLAorICAgIF0sCisgICAgdGVzdF9vcHRpb25zOiB7CisgICAgICAgIHVuaXRfdGVzdDogdHJ1ZSwKKyAgICB9LAorfQorCitweXRob25fdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAiZWRpdF9tb25pdG9yX3Rlc3QiLAorICAgIG1haW46ICJlZGl0X21vbml0b3JfdGVzdC5weSIsCisgICAgcGtnX3BhdGg6ICJlZGl0X21vbml0b3IiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImVkaXRfbW9uaXRvcl90ZXN0LnB5IiwKKyAgICBdLAorICAgIGxpYnM6IFsKKyAgICAgICAgImVkaXRfbW9uaXRvcl9saWIiLAorICAgIF0sCisgICAgdGVzdF9vcHRpb25zOiB7CisgICAgICAgIHVuaXRfdGVzdDogdHJ1ZSwKKyAgICB9LAorfQorCitweXRob25fdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAiZWRpdF9tb25pdG9yX3V0aWxzX3Rlc3QiLAorICAgIG1haW46ICJ1dGlsc190ZXN0LnB5IiwKKyAgICBwa2dfcGF0aDogImVkaXRfbW9uaXRvciIsCisgICAgc3JjczogWworICAgICAgICAidXRpbHNfdGVzdC5weSIsCisgICAgXSwKKyAgICBsaWJzOiBbCisgICAgICAgICJlZGl0X21vbml0b3JfbGliIiwKKyAgICBdLAorICAgIHRlc3Rfb3B0aW9uczogeworICAgICAgICB1bml0X3Rlc3Q6IHRydWUsCisgICAgfSwKK30KKworcHl0aG9uX3Rlc3RfaG9zdCB7CisgICAgbmFtZTogImVkaXRfbW9uaXRvcl9pbnRlZ3JhdGlvbl90ZXN0IiwKKyAgICBtYWluOiAiZWRpdF9tb25pdG9yX2ludGVncmF0aW9uX3Rlc3QucHkiLAorICAgIHBrZ19wYXRoOiAidGVzdGRhdGEiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImVkaXRfbW9uaXRvcl9pbnRlZ3JhdGlvbl90ZXN0LnB5IiwKKyAgICBdLAorICAgIHRlc3Rfb3B0aW9uczogeworICAgICAgICB1bml0X3Rlc3Q6IHRydWUsCisgICAgfSwKKyAgICBkYXRhOiBbCisgICAgICAgICI6ZWRpdF9tb25pdG9yIiwKKyAgICBdLAorfQorCitweXRob25fYmluYXJ5X2hvc3QgeworICAgIG5hbWU6ICJlZGl0X21vbml0b3IiLAorICAgIHBrZ19wYXRoOiAiZWRpdF9tb25pdG9yIiwKKyAgICBzcmNzOiBbCisgICAgICAgICJtYWluLnB5IiwKKyAgICBdLAorICAgIGxpYnM6IFsKKyAgICAgICAgImVkaXRfbW9uaXRvcl9saWIiLAorICAgIF0sCisgICAgbWFpbjogIm1haW4ucHkiLAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWRpdF9tb25pdG9yL09XTkVSUyBiL3Rvb2xzL2VkaXRfbW9uaXRvci9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYwZjM2NAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2VkaXRfbW9uaXRvci9PV05FUlMKQEAgLTAsMCArMSBAQAoraW5jbHVkZSBwbGF0Zm9ybS90b29scy9hc3VpdGU6L09XTkVSU19BRFRFX1RFQU0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9lZGl0X21vbml0b3IvZGFlbW9uX21hbmFnZXIucHkgYi90b29scy9lZGl0X21vbml0b3IvZGFlbW9uX21hbmFnZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q2NjZmZQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2VkaXRfbW9uaXRvci9kYWVtb25fbWFuYWdlci5weQpAQCAtMCwwICsxLDQ2MyBAQAorIyBDb3B5cmlnaHQgMjAyNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKK2ltcG9ydCBlcnJubworaW1wb3J0IGZjbnRsCitpbXBvcnQgZ2V0cGFzcworaW1wb3J0IGhhc2hsaWIKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCitpbXBvcnQgb3MKK2ltcG9ydCBwYXRobGliCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCBzaWduYWwKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCB0aW1lCisKK2Zyb20gYXRlc3QubWV0cmljcyBpbXBvcnQgY2xlYXJjdXRfY2xpZW50Citmcm9tIGF0ZXN0LnByb3RvIGltcG9ydCBjbGllbnRhbmFseXRpY3NfcGIyCitmcm9tIGVkaXRfbW9uaXRvciBpbXBvcnQgdXRpbHMKK2Zyb20gcHJvdG8gaW1wb3J0IGVkaXRfZXZlbnRfcGIyCisKK0RFRkFVTFRfUFJPQ0VTU19URVJNSU5BVElPTl9USU1FT1VUX1NFQ09ORFMgPSA1CitERUZBVUxUX01PTklUT1JfSU5URVJWQUxfU0VDT05EUyA9IDUKK0RFRkFVTFRfTUVNT1JZX1VTQUdFX1RIUkVTSE9MRCA9IDAuMDIgICMgMiUgb2YgdG90YWwgbWVtb3J5CitERUZBVUxUX0NQVV9VU0FHRV9USFJFU0hPTEQgPSAyMDAKK0RFRkFVTFRfUkVCT09UX1RJTUVPVVRfU0VDT05EUyA9IDYwICogNjAgKiAyNAorQkxPQ0tfU0lHTl9GSUxFID0gImVkaXRfbW9uaXRvcl9ibG9ja19zaWduIgorIyBFbnVtIG9mIHRoZSBDbGVhcmN1dCBsb2cgc291cmNlIGRlZmluZWQgdW5kZXIKKyMgL2dvb2dsZTMvd2lyZWxlc3MvYW5kcm9pZC9wbGF5L3BsYXlsb2cvcHJvdG8vbG9nX3NvdXJjZV9lbnVtLnByb3RvCitMT0dfU09VUkNFID0gMjUyNAorCisKK2RlZiBkZWZhdWx0X2RhZW1vbl90YXJnZXQoKToKKyAgIiIiUGxhY2UgaG9sZGVyIGZvciB0aGUgZGVmYXVsdCBkYWVtb24gdGFyZ2V0LiIiIgorICBwcmludCgiZGVmYXVsdCBkYWVtb24gdGFyZ2V0IikKKworCitjbGFzcyBEYWVtb25NYW5hZ2VyOgorICAiIiJDbGFzcyB0byBtYW5hZ2UgYW5kIG1vbml0b3IgdGhlIGRhZW1vbiBydW4gYXMgYSBzdWJwcm9jZXNzLiIiIgorCisgIGRlZiBfX2luaXRfXygKKyAgICAgIHNlbGYsCisgICAgICBiaW5hcnlfcGF0aDogc3RyLAorICAgICAgZGFlbW9uX3RhcmdldDogY2FsbGFibGUgPSBkZWZhdWx0X2RhZW1vbl90YXJnZXQsCisgICAgICBkYWVtb25fYXJnczogdHVwbGUgPSAoKSwKKyAgICAgIGNjbGllbnQ6IGNsZWFyY3V0X2NsaWVudC5DbGVhcmN1dCB8IE5vbmUgPSBOb25lLAorICApOgorICAgIHNlbGYuYmluYXJ5X3BhdGggPSBiaW5hcnlfcGF0aAorICAgIHNlbGYuZGFlbW9uX3RhcmdldCA9IGRhZW1vbl90YXJnZXQKKyAgICBzZWxmLmRhZW1vbl9hcmdzID0gZGFlbW9uX2FyZ3MKKyAgICBzZWxmLmNjbGllbnQgPSBjY2xpZW50IG9yIGNsZWFyY3V0X2NsaWVudC5DbGVhcmN1dChMT0dfU09VUkNFKQorCisgICAgc2VsZi51c2VyX25hbWUgPSBnZXRwYXNzLmdldHVzZXIoKQorICAgIHNlbGYuaG9zdF9uYW1lID0gcGxhdGZvcm0ubm9kZSgpCisgICAgc2VsZi5zb3VyY2Vfcm9vdCA9IG9zLmVudmlyb24uZ2V0KCJBTkRST0lEX0JVSUxEX1RPUCIsICIiKQorICAgIHNlbGYucGlkID0gb3MuZ2V0cGlkKCkKKyAgICBzZWxmLmRhZW1vbl9wcm9jZXNzID0gTm9uZQorCisgICAgc2VsZi5tYXhfbWVtb3J5X3VzYWdlID0gMAorICAgIHNlbGYubWF4X2NwdV91c2FnZSA9IDAKKyAgICBzZWxmLnRvdGFsX21lbW9yeV9zaXplID0gb3Muc3lzY29uZigiU0NfUEFHRV9TSVpFIikgKiBvcy5zeXNjb25mKAorICAgICAgICAiU0NfUEhZU19QQUdFUyIKKyAgICApCisKKyAgICBwaWRfZmlsZV9kaXIgPSBwYXRobGliLlBhdGgodGVtcGZpbGUuZ2V0dGVtcGRpcigpKS5qb2lucGF0aCgiZWRpdF9tb25pdG9yIikKKyAgICBwaWRfZmlsZV9kaXIubWtkaXIocGFyZW50cz1UcnVlLCBleGlzdF9vaz1UcnVlKQorICAgIHNlbGYucGlkX2ZpbGVfcGF0aCA9IHNlbGYuX2dldF9waWRfZmlsZV9wYXRoKHBpZF9maWxlX2RpcikKKyAgICBzZWxmLmJsb2NrX3NpZ24gPSBwYXRobGliLlBhdGgodGVtcGZpbGUuZ2V0dGVtcGRpcigpKS5qb2lucGF0aCgKKyAgICAgICAgQkxPQ0tfU0lHTl9GSUxFCisgICAgKQorCisgIGRlZiBzdGFydChzZWxmKToKKyAgICAiIiJXcml0ZXMgdGhlIHBpZGZpbGUgYW5kIHN0YXJ0cyB0aGUgZGFlbW9uIHByb2Nlcy4iIiIKKyAgICBpZiBub3QgdXRpbHMuaXNfZmVhdHVyZV9lbmFibGVkKAorICAgICAgICAiZWRpdF9tb25pdG9yIiwKKyAgICAgICAgc2VsZi51c2VyX25hbWUsCisgICAgICAgICJFTkFCTEVfQU5EUk9JRF9FRElUX01PTklUT1IiLAorICAgICAgICAxMDAsCisgICAgKToKKyAgICAgIGxvZ2dpbmcud2FybmluZygiRWRpdCBtb25pdG9yIGlzIGRpc2FibGVkLCBleGl0aW5nLi4uIikKKyAgICAgIHJldHVybgorCisgICAgaWYgc2VsZi5ibG9ja19zaWduLmV4aXN0cygpOgorICAgICAgbG9nZ2luZy53YXJuaW5nKCJCbG9jayBzaWduIGZvdW5kLCBleGl0aW5nLi4uIikKKyAgICAgIHJldHVybgorCisgICAgaWYgc2VsZi5iaW5hcnlfcGF0aC5zdGFydHN3aXRoKCIvZ29vZ2xlL2NvZy8iKToKKyAgICAgIGxvZ2dpbmcud2FybmluZygiRWRpdCBtb25pdG9yIGZvciBjb2cgaXMgbm90IHN1cHBvcnRlZCwgZXhpdGluZy4uLiIpCisgICAgICByZXR1cm4KKworICAgIHNldHVwX2xvY2tfZmlsZSA9IHBhdGhsaWIuUGF0aCh0ZW1wZmlsZS5nZXR0ZW1wZGlyKCkpLmpvaW5wYXRoKAorICAgICAgICBzZWxmLnBpZF9maWxlX3BhdGgubmFtZSArICIuc2V0dXAiCisgICAgKQorICAgIGxvZ2dpbmcuaW5mbygic2V0dXAgbG9jayBmaWxlOiAlcyIsIHNldHVwX2xvY2tfZmlsZSkKKyAgICB3aXRoIG9wZW4oc2V0dXBfbG9ja19maWxlLCAidyIpIGFzIGY6CisgICAgICB0cnk6CisgICAgICAgICMgQWNxdWlyZSBhbiBleGNsdXNpdmUgbG9jaworICAgICAgICBmY250bC5mbG9jayhmLCBmY250bC5MT0NLX0VYIHwgZmNudGwuTE9DS19OQikKKyAgICAgICAgc2VsZi5fc3RvcF9hbnlfZXhpc3RpbmdfaW5zdGFuY2UoKQorICAgICAgICBzZWxmLl93cml0ZV9waWRfdG9fcGlkZmlsZSgpCisgICAgICAgIHNlbGYuX3N0YXJ0X2RhZW1vbl9wcm9jZXNzKCkKKyAgICAgIGV4Y2VwdCBFeGNlcHRpb24gYXMgZToKKyAgICAgICAgaWYgKAorICAgICAgICAgICAgaXNpbnN0YW5jZShlLCBJT0Vycm9yKSBhbmQgZS5lcnJubyA9PSBlcnJuby5FQUdBSU4KKyAgICAgICAgKTogICMgRmFpbGVkIHRvIGFjcXVpcmUgdGhlIGZpbGUgbG9jay4KKyAgICAgICAgICBsb2dnaW5nLndhcm5pbmcoIkFub3RoZXIgZWRpdCBtb25pdG9yIGlzIHN0YXJ0aW5nLCBleGl0aW5uZy4uLiIpCisgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgbG9nZ2luZy5leGNlcHRpb24oIkZhaWxlZCB0byBzdGFydCBkYWVtb24gbWFuYWdlciB3aXRoIGVycm9yICVzIiwgZSkKKyAgICAgICAgICBzZWxmLl9zZW5kX2Vycm9yX2V2ZW50X3RvX2NsZWFyY3V0KAorICAgICAgICAgICAgICBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuRkFJTEVEX1RPX1NUQVJUX0VESVRfTU9OSVRPUgorICAgICAgICAgICkKKyAgICAgICAgICByYWlzZSBlCisgICAgICBmaW5hbGx5OgorICAgICAgICAjIFJlbGVhc2UgdGhlIGxvY2sKKyAgICAgICAgZmNudGwuZmxvY2soZiwgZmNudGwuTE9DS19VTikKKworICBkZWYgbW9uaXRvcl9kYWVtb24oCisgICAgICBzZWxmLAorICAgICAgaW50ZXJ2YWw6IGludCA9IERFRkFVTFRfTU9OSVRPUl9JTlRFUlZBTF9TRUNPTkRTLAorICAgICAgbWVtb3J5X3RocmVzaG9sZDogZmxvYXQgPSBERUZBVUxUX01FTU9SWV9VU0FHRV9USFJFU0hPTEQsCisgICAgICBjcHVfdGhyZXNob2xkOiBmbG9hdCA9IERFRkFVTFRfQ1BVX1VTQUdFX1RIUkVTSE9MRCwKKyAgICAgIHJlYm9vdF90aW1lb3V0OiBpbnQgPSBERUZBVUxUX1JFQk9PVF9USU1FT1VUX1NFQ09ORFMsCisgICk6CisgICAgIiIiTW9uaXRzIHRoZSBkYWVtb24gcHJvY2VzcyBzdGF0dXMuCisKKyAgICBQZXJpb2RpY2FsbHkgY2hlY2sgdGhlIENQVS9NZW1vcnkgdXNhZ2Ugb2YgdGhlIGRhZW1vbiBwcm9jZXNzIGFzIGxvbmcgYXMgdGhlCisgICAgcHJvY2VzcyBpcyBzdGlsbCBydW5uaW5nIGFuZCBraWxsIHRoZSBwcm9jZXNzIGlmIHRoZSByZXNvdXJjZSB1c2FnZSBpcyBhYm92ZQorICAgIGdpdmVuIHRocmVzaG9sZHMuCisgICAgIiIiCisgICAgaWYgbm90IHNlbGYuZGFlbW9uX3Byb2Nlc3M6CisgICAgICByZXR1cm4KKworICAgIGxvZ2dpbmcuaW5mbygic3RhcnQgbW9uaXRvcmluZyBkYWVtb24gcHJvY2VzcyAlZC4iLCBzZWxmLmRhZW1vbl9wcm9jZXNzLnBpZCkKKyAgICByZWJvb3RfdGltZSA9IHRpbWUudGltZSgpICsgcmVib290X3RpbWVvdXQKKyAgICB3aGlsZSBzZWxmLmRhZW1vbl9wcm9jZXNzLmlzX2FsaXZlKCk6CisgICAgICBpZiB0aW1lLnRpbWUoKSA+IHJlYm9vdF90aW1lOgorICAgICAgICBzZWxmLnJlYm9vdCgpCisgICAgICB0cnk6CisgICAgICAgIG1lbW9yeV91c2FnZSA9IHNlbGYuX2dldF9wcm9jZXNzX21lbW9yeV9wZXJjZW50KHNlbGYuZGFlbW9uX3Byb2Nlc3MucGlkKQorICAgICAgICBzZWxmLm1heF9tZW1vcnlfdXNhZ2UgPSBtYXgoc2VsZi5tYXhfbWVtb3J5X3VzYWdlLCBtZW1vcnlfdXNhZ2UpCisKKyAgICAgICAgY3B1X3VzYWdlID0gc2VsZi5fZ2V0X3Byb2Nlc3NfY3B1X3BlcmNlbnQoc2VsZi5kYWVtb25fcHJvY2Vzcy5waWQpCisgICAgICAgIHNlbGYubWF4X2NwdV91c2FnZSA9IG1heChzZWxmLm1heF9jcHVfdXNhZ2UsIGNwdV91c2FnZSkKKworICAgICAgICB0aW1lLnNsZWVwKGludGVydmFsKQorICAgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgICAjIExvZ2dpbmcgdGhlIGVycm9yIGFuZCBjb250aW51ZS4KKyAgICAgICAgbG9nZ2luZy53YXJuaW5nKCJGYWlsZWQgdG8gbW9uaXRvciBkYWVtb24gcHJvY2VzcyB3aXRoIGVycm9yOiAlcyIsIGUpCisKKyAgICAgIGlmIHNlbGYubWF4X21lbW9yeV91c2FnZSA+PSBtZW1vcnlfdGhyZXNob2xkOgorICAgICAgICBzZWxmLl9zZW5kX2Vycm9yX2V2ZW50X3RvX2NsZWFyY3V0KAorICAgICAgICAgICAgZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50LktJTExFRF9EVUVfVE9fRVhDRUVERURfTUVNT1JZX1VTQUdFCisgICAgICAgICkKKyAgICAgICAgbG9nZ2luZy5lcnJvcigKKyAgICAgICAgICAgICJEYWVtb24gcHJvY2VzcyBpcyBjb25zdW1pbmcgdG9vIG11Y2ggbWVtb3J5LCByZWJvb3RpbmcuLi4iCisgICAgICAgICkKKyAgICAgICAgc2VsZi5yZWJvb3QoKQorCisgICAgICBpZiBzZWxmLm1heF9jcHVfdXNhZ2UgPj0gY3B1X3RocmVzaG9sZDoKKyAgICAgICAgc2VsZi5fc2VuZF9lcnJvcl9ldmVudF90b19jbGVhcmN1dCgKKyAgICAgICAgICAgIGVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5LSUxMRURfRFVFX1RPX0VYQ0VFREVEX0NQVV9VU0FHRQorICAgICAgICApCisgICAgICAgIGxvZ2dpbmcuZXJyb3IoIkRhZW1vbiBwcm9jZXNzIGlzIGNvbnN1bWluZyB0b28gbXVjaCBjcHUsIGtpbGxpbmcuLi4iKQorICAgICAgICBzZWxmLl90ZXJtaW5hdGVfcHJvY2VzcyhzZWxmLmRhZW1vbl9wcm9jZXNzLnBpZCkKKworICAgIGxvZ2dpbmcuaW5mbygKKyAgICAgICAgIkRhZW1vbiBwcm9jZXNzICVkIHRlcm1pbmF0ZWQuIE1heCBtZW1vcnkgdXNhZ2U6ICVmLCBNYXggY3B1IgorICAgICAgICAiIHVzYWdlOiAlZi4iLAorICAgICAgICBzZWxmLmRhZW1vbl9wcm9jZXNzLnBpZCwKKyAgICAgICAgc2VsZi5tYXhfbWVtb3J5X3VzYWdlLAorICAgICAgICBzZWxmLm1heF9jcHVfdXNhZ2UsCisgICAgKQorCisgIGRlZiBzdG9wKHNlbGYpOgorICAgICIiIlN0b3BzIHRoZSBkYWVtb24gcHJvY2VzcyBhbmQgcmVtb3ZlcyB0aGUgcGlkZmlsZS4iIiIKKworICAgIGxvZ2dpbmcuaW5mbygiaW4gZGFlbW9uIG1hbmFnZXIgY2xlYW51cC4iKQorICAgIHRyeToKKyAgICAgIGlmIHNlbGYuZGFlbW9uX3Byb2Nlc3M6CisgICAgICAgICMgVGhlIGRhZW1vbiBwcm9jZXNzIG1pZ2h0IGFscmVhZHkgaW4gdGVybWluYXRpb24gcHJvY2VzcywKKyAgICAgICAgIyB3YWl0IHNvbWUgdGltZSBiZWZvcmUga2lsbCBpdCBleHBsaWNpdGx5LgorICAgICAgICBzZWxmLl93YWl0X2Zvcl9wcm9jZXNzX3Rlcm1pbmF0ZShzZWxmLmRhZW1vbl9wcm9jZXNzLnBpZCwgMSkKKyAgICAgICAgaWYgc2VsZi5kYWVtb25fcHJvY2Vzcy5pc19hbGl2ZSgpOgorICAgICAgICAgIHNlbGYuX3Rlcm1pbmF0ZV9wcm9jZXNzKHNlbGYuZGFlbW9uX3Byb2Nlc3MucGlkKQorICAgICAgc2VsZi5fcmVtb3ZlX3BpZGZpbGUoc2VsZi5waWQpCisgICAgICBsb2dnaW5nLmluZm8oIlN1Y2Nlc3NmdWxseSBzdG9wcGVkIGRhZW1vbiBtYW5hZ2VyLiIpCisgICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgorICAgICAgbG9nZ2luZy5leGNlcHRpb24oIkZhaWxlZCB0byBzdG9wIGRhZW1vbiBtYW5hZ2VyIHdpdGggZXJyb3IgJXMiLCBlKQorICAgICAgc2VsZi5fc2VuZF9lcnJvcl9ldmVudF90b19jbGVhcmN1dCgKKyAgICAgICAgICBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuRkFJTEVEX1RPX1NUT1BfRURJVF9NT05JVE9SCisgICAgICApCisgICAgICBzeXMuZXhpdCgxKQorICAgIGZpbmFsbHk6CisgICAgICBzZWxmLmNjbGllbnQuZmx1c2hfZXZlbnRzKCkKKworICBkZWYgcmVib290KHNlbGYpOgorICAgICIiIlJlYm9vdHMgdGhlIGN1cnJlbnQgcHJvY2Vzcy4KKworICAgIFN0b3BzIHRoZSBjdXJyZW50IGRhZW1vbiBtYW5hZ2VyIGFuZCByZWJvb3RzIHRoZSBlbnRpcmUgcHJvY2VzcyBiYXNlZCBvbgorICAgIHRoZSBiaW5hcnkgZmlsZS4gRXhpdHMgZGlyZWN0bHkgSWYgdGhlIGJpbmFyeSBmaWxlIG5vIGxvbmdlciBleGlzdHMuCisgICAgIiIiCisgICAgbG9nZ2luZy5pbmZvKCJSZWJvb3RpbmcgcHJvY2VzcyBiYXNlZCBvbiBiaW5hcnkgJXMuIiwgc2VsZi5iaW5hcnlfcGF0aCkKKworICAgICMgU3RvcCB0aGUgY3VycmVudCBkYWVtb24gbWFuYWdlciBmaXJzdC4KKyAgICBzZWxmLnN0b3AoKQorCisgICAgIyBJZiB0aGUgYmluYXJ5IG5vIGxvbmdlciBleGlzdHMsIGV4aXQgZGlyZWN0bHkuCisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYuYmluYXJ5X3BhdGgpOgorICAgICAgbG9nZ2luZy5pbmZvKCJiaW5hcnkgJXMgbm8gbG9uZ2VyIGV4aXN0cywgZXhpdGluZy4iLCBzZWxmLmJpbmFyeV9wYXRoKQorICAgICAgc3lzLmV4aXQoMCkKKworICAgIHRyeToKKyAgICAgIG9zLmV4ZWN2KHNlbGYuYmluYXJ5X3BhdGgsIHN5cy5hcmd2KQorICAgIGV4Y2VwdCBPU0Vycm9yIGFzIGU6CisgICAgICBsb2dnaW5nLmV4Y2VwdGlvbigiRmFpbGVkIHRvIHJlYm9vdCBwcm9jZXNzIHdpdGggZXJyb3I6ICVzLiIsIGUpCisgICAgICBzZWxmLl9zZW5kX2Vycm9yX2V2ZW50X3RvX2NsZWFyY3V0KAorICAgICAgICAgIGVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5GQUlMRURfVE9fUkVCT09UX0VESVRfTU9OSVRPUgorICAgICAgKQorICAgICAgc3lzLmV4aXQoMSkgICMgSW5kaWNhdGUgYW4gZXJyb3Igb2NjdXJyZWQKKworICBkZWYgY2xlYW51cChzZWxmKToKKyAgICAiIiJXaXBlcyBvdXQgYWxsIGVkaXQgbW9uaXRvciBpbnN0YW5jZXMgaW4gdGhlIHN5c3RlbS4KKworICAgIFN0b3BzIGFsbCB0aGUgZXhpc3RpbmcgZWRpdCBtb25pdG9yIGluc3RhbmNlcyBhbmQgcGxhY2UgYSBibG9jayBzaWduCisgICAgdG8gcHJldmVudCBhbnkgZWRpdCBtb25pdG9yIHByb2Nlc3MgdG8gc3RhcnQuIFRoaXMgbWV0aG9kIGlzIG9ubHkgdXNlZAorICAgIGluIGVtZXJnZW5jeSBjYXNlIHdoZW4gdGhlcmUncyBzb21ldGhpbmcgZ29lcyB3cm9uZyB3aXRoIHRoZSBlZGl0IG1vbml0b3IKKyAgICB0aGF0IHJlcXVpcmVzIGltbWVkaWF0ZSBjbGVhbnVwIHRvIHByZXZlbnQgZGFtYW5nZXIgdG8gdGhlIHN5c3RlbS4KKyAgICAiIiIKKyAgICBsb2dnaW5nLmRlYnVnKCJTdGFydCBjbGVhbmluZyB1cCBhbGwgZXhpc3RpbmcgaW5zdGFuY2VzLiIpCisgICAgc2VsZi5fc2VuZF9lcnJvcl9ldmVudF90b19jbGVhcmN1dChlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuRk9SQ0VfQ0xFQU5VUCkKKworICAgIHRyeToKKyAgICAgICMgRmlyc3QgcGxhY2VzIGEgYmxvY2sgc2lnbiB0byBwcmV2ZW50IGFueSBlZGl0IG1vbml0b3IgcHJvY2VzcyB0byBzdGFydC4KKyAgICAgIHNlbGYuYmxvY2tfc2lnbi50b3VjaCgpCisgICAgZXhjZXB0IChGaWxlTm90Rm91bmRFcnJvciwgUGVybWlzc2lvbkVycm9yLCBPU0Vycm9yKToKKyAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKCJGYWlsZWQgdG8gcGxhY2UgdGhlIGJsb2NrIHNpZ24iKQorCisgICAgIyBGaW5kcyBhbmQga2lsbHMgYWxsIHRoZSBleGlzdGluZyBpbnN0YW5jZXMgb2YgZWRpdCBtb25pdG9yLgorICAgIGV4aXN0aW5nX2luc3RhbmNlc19waWRzID0gc2VsZi5fZmluZF9hbGxfaW5zdGFuY2VzX3BpZHMoKQorICAgIGZvciBwaWQgaW4gZXhpc3RpbmdfaW5zdGFuY2VzX3BpZHM6CisgICAgICBsb2dnaW5nLmluZm8oCisgICAgICAgICAgIkZvdW5kIGV4aXN0aW5nIGVkaXQgbW9uaXRvciBpbnN0YW5jZSB3aXRoIHBpZCAlZCwga2lsbGluZy4uLiIsIHBpZAorICAgICAgKQorICAgICAgdHJ5OgorICAgICAgICBzZWxmLl90ZXJtaW5hdGVfcHJvY2VzcyhwaWQpCisgICAgICBleGNlcHQgRXhjZXB0aW9uOgorICAgICAgICBsb2dnaW5nLmV4Y2VwdGlvbigiRmFpbGVkIHRvIHRlcm1pbmF0ZSBwcm9jZXNzICVkIiwgcGlkKQorCisgIGRlZiBfc3RvcF9hbnlfZXhpc3RpbmdfaW5zdGFuY2Uoc2VsZik6CisgICAgaWYgbm90IHNlbGYucGlkX2ZpbGVfcGF0aC5leGlzdHMoKToKKyAgICAgIGxvZ2dpbmcuZGVidWcoIk5vIGV4aXN0aW5nIGluc3RhbmNlcy4iKQorICAgICAgcmV0dXJuCisKKyAgICBleF9waWQgPSBzZWxmLl9yZWFkX3BpZF9mcm9tX3BpZGZpbGUoKQorCisgICAgaWYgZXhfcGlkOgorICAgICAgbG9nZ2luZy5pbmZvKCJGb3VuZCBhbm90aGVyIGluc3RhbmNlIHdpdGggcGlkICVkLiIsIGV4X3BpZCkKKyAgICAgIHNlbGYuX3Rlcm1pbmF0ZV9wcm9jZXNzKGV4X3BpZCkKKyAgICAgIHNlbGYuX3JlbW92ZV9waWRmaWxlKGV4X3BpZCkKKworICBkZWYgX3JlYWRfcGlkX2Zyb21fcGlkZmlsZShzZWxmKSAtPiBpbnQgfCBOb25lOgorICAgIHRyeToKKyAgICAgIHdpdGggb3BlbihzZWxmLnBpZF9maWxlX3BhdGgsICJyIikgYXMgZjoKKyAgICAgICAgcmV0dXJuIGludChmLnJlYWQoKS5zdHJpcCgpKQorICAgIGV4Y2VwdCBGaWxlTm90Rm91bmRFcnJvciBhcyBlOgorICAgICAgbG9nZ2luZy53YXJuaW5nKCJwaWRmaWxlICVzIGRvZXMgbm90IGV4aXN0LiIsIHNlbGYucGlkX2ZpbGVfcGF0aCkKKyAgICAgIHJldHVybiBOb25lCisKKyAgZGVmIF93cml0ZV9waWRfdG9fcGlkZmlsZShzZWxmKToKKyAgICAiIiJDcmVhdGVzIGEgcGlkZmlsZSBhbmQgd3JpdGVzIHRoZSBjdXJyZW50IHBpZCB0byB0aGUgZmlsZS4KKworICAgIFJhaXNlIEZpbGVFeGlzdHNFcnJvciBpZiB0aGUgcGlkZmlsZSBhbHJlYWR5IGV4aXN0cy4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICAjIFVzZSB0aGUgJ3gnIG1vZGUgdG8gb3BlbiB0aGUgZmlsZSBmb3IgZXhjbHVzaXZlIGNyZWF0aW9uCisgICAgICB3aXRoIG9wZW4oc2VsZi5waWRfZmlsZV9wYXRoLCAieCIpIGFzIGY6CisgICAgICAgIGYud3JpdGUoZiJ7c2VsZi5waWR9IikKKyAgICBleGNlcHQgRmlsZUV4aXN0c0Vycm9yIGFzIGU6CisgICAgICAjIFRoaXMgY291bGQgYmUgY2F1c2VkIGR1ZSB0byByYWNlIGNvbmRpdGlvbiB0aGF0IGEgdXNlciBpcyB0cnlpbmcKKyAgICAgICMgdG8gc3RhcnQgdHdvIGVkaXQgbW9uaXRvcnMgYXQgdGhlIHNhbWUgdGltZS4gT3IgYmVjYXVzZSB0aGVyZSBpcworICAgICAgIyBhbHJlYWR5IGFuIGV4aXN0aW5nIGVkaXQgbW9uaXRvciBydW5uaW5nIGFuZCB3ZSBjYW4gbm90IGtpbGwgaXQKKyAgICAgICMgZm9yIHNvbWUgcmVhc29uLgorICAgICAgbG9nZ2luZy5leGNlcHRpb24oInBpZGZpbGUgJXMgYWxyZWFkeSBleGlzdHMuIiwgc2VsZi5waWRfZmlsZV9wYXRoKQorICAgICAgcmFpc2UgZQorCisgIGRlZiBfc3RhcnRfZGFlbW9uX3Byb2Nlc3Moc2VsZik6CisgICAgIiIiU3RhcnRzIGEgc3VicHJvY2VzcyB0byBydW4gdGhlIGRhZW1vbi4iIiIKKyAgICBwID0gbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3MoCisgICAgICAgIHRhcmdldD1zZWxmLmRhZW1vbl90YXJnZXQsIGFyZ3M9c2VsZi5kYWVtb25fYXJncworICAgICkKKyAgICBwLmRhZW1vbiA9IFRydWUKKyAgICBwLnN0YXJ0KCkKKworICAgIGxvZ2dpbmcuaW5mbygiU3RhcnQgc3VicHJvY2VzcyB3aXRoIFBJRCAlZCIsIHAucGlkKQorICAgIHNlbGYuZGFlbW9uX3Byb2Nlc3MgPSBwCisKKyAgZGVmIF90ZXJtaW5hdGVfcHJvY2VzcygKKyAgICAgIHNlbGYsIHBpZDogaW50LCB0aW1lb3V0OiBpbnQgPSBERUZBVUxUX1BST0NFU1NfVEVSTUlOQVRJT05fVElNRU9VVF9TRUNPTkRTCisgICk6CisgICAgIiIiVGVybWluYXRlcyBhIHByb2Nlc3Mgd2l0aCBnaXZlbiBwaWQuCisKKyAgICBJdCBmaXJzdCBzZW5kcyBhIFNJR1RFUk0gdG8gdGhlIHByb2Nlc3MgdG8gYWxsb3cgaXQgZm9yIHByb3BlcgorICAgIHRlcm1pbmF0aW9uIHdpdGggYSB0aW1lb3V0LiBJZiB0aGUgcHJvY2VzcyBpcyBub3QgdGVybWluYXRlZCB3aXRoaW4KKyAgICB0aGUgdGltZW91dCwga2lsbHMgaXQgZm9yY2VmdWxseS4KKyAgICAiIiIKKyAgICB0cnk6CisgICAgICBvcy5raWxsKHBpZCwgc2lnbmFsLlNJR1RFUk0pCisgICAgICBpZiBub3Qgc2VsZi5fd2FpdF9mb3JfcHJvY2Vzc190ZXJtaW5hdGUocGlkLCB0aW1lb3V0KToKKyAgICAgICAgbG9nZ2luZy53YXJuaW5nKAorICAgICAgICAgICAgIlByb2Nlc3MgJWQgbm90IHRlcm1pbmF0ZWQgd2l0aGluIHRpbWVvdXQsIHRyeSBmb3JjZSBraWxsIiwgcGlkCisgICAgICAgICkKKyAgICAgICAgb3Mua2lsbChwaWQsIHNpZ25hbC5TSUdLSUxMKQorICAgIGV4Y2VwdCBQcm9jZXNzTG9va3VwRXJyb3I6CisgICAgICBsb2dnaW5nLmluZm8oIlByb2Nlc3Mgd2l0aCBQSUQgJWQgbm90IGZvdW5kIChhbHJlYWR5IHRlcm1pbmF0ZWQpIiwgcGlkKQorCisgIGRlZiBfd2FpdF9mb3JfcHJvY2Vzc190ZXJtaW5hdGUoc2VsZiwgcGlkOiBpbnQsIHRpbWVvdXQ6IGludCkgLT4gYm9vbDoKKyAgICBzdGFydF90aW1lID0gdGltZS50aW1lKCkKKworICAgIHdoaWxlIHRpbWUudGltZSgpIDwgc3RhcnRfdGltZSArIHRpbWVvdXQ6CisgICAgICBpZiBub3Qgc2VsZi5faXNfcHJvY2Vzc19hbGl2ZShwaWQpOgorICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgdGltZS5zbGVlcCgxKQorCisgICAgbG9nZ2luZy5lcnJvcigiUHJvY2VzcyAlZCBub3QgdGVybWluYXRlZCB3aXRoaW4gJWQgc2Vjb25kcy4iLCBwaWQsIHRpbWVvdXQpCisgICAgcmV0dXJuIEZhbHNlCisKKyAgZGVmIF9pc19wcm9jZXNzX2FsaXZlKHNlbGYsIHBpZDogaW50KSAtPiBib29sOgorICAgIHRyeToKKyAgICAgIG91dHB1dCA9IHN1YnByb2Nlc3MuY2hlY2tfb3V0cHV0KAorICAgICAgICAgIFsicHMiLCAiLXAiLCBzdHIocGlkKSwgIi1vIiwgInN0YXRlPSJdLCB0ZXh0PVRydWUKKyAgICAgICkuc3RyaXAoKQorICAgICAgc3RhdGUgPSBvdXRwdXQuc3BsaXQoKVswXQorICAgICAgcmV0dXJuIHN0YXRlICE9ICJaIiAgIyBDaGVjayBpZiB0aGUgc3RhdGUgaXMgbm90ICdaJyAoem9tYmllKQorICAgIGV4Y2VwdCBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvcjoKKyAgICAgICMgUHJvY2VzcyBub3QgZm91bmQgKGFscmVhZHkgZGVhZCkuCisgICAgICByZXR1cm4gRmFsc2UKKyAgICBleGNlcHQgKEZpbGVOb3RGb3VuZEVycm9yLCBPU0Vycm9yLCBWYWx1ZUVycm9yKSBhcyBlOgorICAgICAgbG9nZ2luZy53YXJuaW5nKAorICAgICAgICAgICJVbmFibGUgdG8gY2hlY2sgdGhlIHN0YXR1cyBmb3IgcHJvY2VzcyAlZCB3aXRoIGVycm9yOiAlcy4iLCBwaWQsIGUKKyAgICAgICkKKyAgICAgIHJldHVybiBUcnVlCisKKyAgZGVmIF9yZW1vdmVfcGlkZmlsZShzZWxmLCBleHBlY3RlZF9waWQ6IGludCk6CisgICAgcmVjb3JkZWRfcGlkID0gc2VsZi5fcmVhZF9waWRfZnJvbV9waWRmaWxlKCkKKworICAgIGlmIHJlY29yZGVkX3BpZCBpcyBOb25lOgorICAgICAgbG9nZ2luZy5pbmZvKCJwaWQgZmlsZSAlcyBhbHJlYWR5IHJlbW92ZWQuIiwgc2VsZi5waWRfZmlsZV9wYXRoKQorICAgICAgcmV0dXJuCisKKyAgICBpZiByZWNvcmRlZF9waWQgIT0gZXhwZWN0ZWRfcGlkOgorICAgICAgbG9nZ2luZy53YXJuaW5nKAorICAgICAgICAgICJwaWQgZmlsZSBjb250YWlucyBwaWQgZnJvbSBhIGRpZmZlcmVudCBwcm9jZXNzLCBleHBlY3RlZCBwaWQ6ICVkLCIKKyAgICAgICAgICAiIGFjdHVhbCBwaWQ6ICVkLiIsCisgICAgICAgICAgZXhwZWN0ZWRfcGlkLAorICAgICAgICAgIHJlY29yZGVkX3BpZCwKKyAgICAgICkKKyAgICAgIHJldHVybgorCisgICAgbG9nZ2luZy5kZWJ1ZygicmVtb3ZpbmcgcGlkZmlsZSB3cml0dGVuIGJ5IHByb2Nlc3MgJXMiLCBleHBlY3RlZF9waWQpCisgICAgdHJ5OgorICAgICAgb3MucmVtb3ZlKHNlbGYucGlkX2ZpbGVfcGF0aCkKKyAgICBleGNlcHQgRmlsZU5vdEZvdW5kRXJyb3I6CisgICAgICBsb2dnaW5nLmluZm8oInBpZCBmaWxlICVzIGFscmVhZHkgcmVtb3ZlZC4iLCBzZWxmLnBpZF9maWxlX3BhdGgpCisKKyAgZGVmIF9nZXRfcGlkX2ZpbGVfcGF0aChzZWxmLCBwaWRfZmlsZV9kaXI6IHBhdGhsaWIuUGF0aCkgLT4gcGF0aGxpYi5QYXRoOgorICAgICIiIkdlbmVyYXRlcyB0aGUgcGF0aCB0byBzdG9yZSB0aGUgcGlkZmlsZS4KKworICAgIFRoZSBmaWxlIHBhdGggc2hvdWxkIGhhdmUgdGhlIGZvcm1hdCBvZiAiL3RtcC9lZGl0X21vbml0b3IveHh4eC5sb2NrIgorICAgIHdoZXJlIHh4eHggaXMgYSBoYXNoZWQgdmFsdWUgYmFzZWQgb24gdGhlIGJpbmFyeSBwYXRoIHRoYXQgc3RhcnRzIHRoZQorICAgIHByb2Nlc3MuCisgICAgIiIiCisgICAgaGFzaF9vYmplY3QgPSBoYXNobGliLnNoYTI1NigpCisgICAgaGFzaF9vYmplY3QudXBkYXRlKHNlbGYuYmluYXJ5X3BhdGguZW5jb2RlKCJ1dGYtOCIpKQorICAgIHBpZF9maWxlX3BhdGggPSBwaWRfZmlsZV9kaXIuam9pbnBhdGgoaGFzaF9vYmplY3QuaGV4ZGlnZXN0KCkgKyAiLmxvY2siKQorICAgIGxvZ2dpbmcuaW5mbygicGlkX2ZpbGVfcGF0aDogJXMiLCBwaWRfZmlsZV9wYXRoKQorCisgICAgcmV0dXJuIHBpZF9maWxlX3BhdGgKKworICBkZWYgX2dldF9wcm9jZXNzX21lbW9yeV9wZXJjZW50KHNlbGYsIHBpZDogaW50KSAtPiBmbG9hdDoKKyAgICB3aXRoIG9wZW4oZiIvcHJvYy97cGlkfS9zdGF0IiwgInIiKSBhcyBmOgorICAgICAgc3RhdF9kYXRhID0gZi5yZWFkbGluZSgpLnNwbGl0KCkKKyAgICAgICMgUlNTIGlzIHRoZSAyNHRoIGZpZWxkIGluIC9wcm9jL1twaWRdL3N0YXQKKyAgICAgIHJzc19wYWdlcyA9IGludChzdGF0X2RhdGFbMjNdKQorICAgICAgcHJvY2Vzc19tZW1vcnkgPSByc3NfcGFnZXMgKiA0ICogMTAyNCAgIyBDb252ZXJ0IHRvIGJ5dGVzCisKKyAgICByZXR1cm4gKAorICAgICAgICBwcm9jZXNzX21lbW9yeSAvIHNlbGYudG90YWxfbWVtb3J5X3NpemUKKyAgICAgICAgaWYgc2VsZi50b3RhbF9tZW1vcnlfc2l6ZQorICAgICAgICBlbHNlIDAuMAorICAgICkKKworICBkZWYgX2dldF9wcm9jZXNzX2NwdV9wZXJjZW50KHNlbGYsIHBpZDogaW50LCBpbnRlcnZhbDogaW50ID0gMSkgLT4gZmxvYXQ6CisgICAgdG90YWxfc3RhcnRfdGltZSA9IHNlbGYuX2dldF90b3RhbF9jcHVfdGltZShwaWQpCisgICAgd2l0aCBvcGVuKCIvcHJvYy91cHRpbWUiLCAiciIpIGFzIGY6CisgICAgICB1cHRpbWVfc3RhcnQgPSBmbG9hdChmLnJlYWRsaW5lKCkuc3BsaXQoKVswXSkKKworICAgIHRpbWUuc2xlZXAoaW50ZXJ2YWwpCisKKyAgICB0b3RhbF9lbmRfdGltZSA9IHNlbGYuX2dldF90b3RhbF9jcHVfdGltZShwaWQpCisgICAgd2l0aCBvcGVuKCIvcHJvYy91cHRpbWUiLCAiciIpIGFzIGY6CisgICAgICB1cHRpbWVfZW5kID0gZmxvYXQoZi5yZWFkbGluZSgpLnNwbGl0KClbMF0pCisKKyAgICByZXR1cm4gKAorICAgICAgICAodG90YWxfZW5kX3RpbWUgLSB0b3RhbF9zdGFydF90aW1lKSAvICh1cHRpbWVfZW5kIC0gdXB0aW1lX3N0YXJ0KSAqIDEwMAorICAgICkKKworICBkZWYgX2dldF90b3RhbF9jcHVfdGltZShzZWxmLCBwaWQ6IGludCkgLT4gZmxvYXQ6CisgICAgd2l0aCBvcGVuKGYiL3Byb2Mve3N0cihwaWQpfS9zdGF0IiwgInIiKSBhcyBmOgorICAgICAgc3RhdHMgPSBmLnJlYWRsaW5lKCkuc3BsaXQoKQorICAgICAgIyB1dGltZSBpcyB0aGUgMTR0aCBmaWVsZCBpbiAvcHJvYy9bcGlkXS9zdGF0IG1lYXN1cmVkIGluIGNsb2NrIHRpY2tzLgorICAgICAgdXRpbWUgPSBpbnQoc3RhdHNbMTNdKQorICAgICAgIyBzdGltZSBpcyB0aGUgMTV0aCBmaWVsZCBpbiAvcHJvYy9bcGlkXS9zdGF0IG1lYXN1cmVkIGluIGNsb2NrIHRpY2tzLgorICAgICAgc3RpbWUgPSBpbnQoc3RhdHNbMTRdKQorICAgICAgcmV0dXJuICh1dGltZSArIHN0aW1lKSAvIG9zLnN5c2NvbmYob3Muc3lzY29uZl9uYW1lc1siU0NfQ0xLX1RDSyJdKQorCisgIGRlZiBfZmluZF9hbGxfaW5zdGFuY2VzX3BpZHMoc2VsZikgLT4gbGlzdFtpbnRdOgorICAgIHBpZHMgPSBbXQorCisgICAgdHJ5OgorICAgICAgb3V0cHV0ID0gc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoWyJwcyIsICItZWYiLCAiLS1uby1oZWFkZXJzIl0sIHRleHQ9VHJ1ZSkKKyAgICAgIGZvciBsaW5lIGluIG91dHB1dC5zcGxpdGxpbmVzKCk6CisgICAgICAgIHBhcnRzID0gbGluZS5zcGxpdCgpCisgICAgICAgIHByb2Nlc3NfcGF0aCA9IHBhcnRzWzddCisgICAgICAgIGlmIHBhdGhsaWIuUGF0aChwcm9jZXNzX3BhdGgpLm5hbWUgPT0gImVkaXRfbW9uaXRvciI6CisgICAgICAgICAgcGlkID0gaW50KHBhcnRzWzFdKQorICAgICAgICAgIGlmIHBpZCAhPSBzZWxmLnBpZDogICMgZXhjbHVkZSB0aGUgY3VycmVudCBwcm9jZXNzCisgICAgICAgICAgICBwaWRzLmFwcGVuZChwaWQpCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKAorICAgICAgICAgICJGYWlsZWQgdG8gZ2V0IHBpZHMgb2YgZXhpc3RpbmcgZWRpdCBtb25pdG9ycyBmcm9tIHBzIGNvbW1hbmQuIgorICAgICAgKQorCisgICAgcmV0dXJuIHBpZHMKKworICBkZWYgX3NlbmRfZXJyb3JfZXZlbnRfdG9fY2xlYXJjdXQoc2VsZiwgZXJyb3JfdHlwZSk6CisgICAgZWRpdF9tb25pdG9yX2Vycm9yX2V2ZW50X3Byb3RvID0gZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50KAorICAgICAgICB1c2VyX25hbWU9c2VsZi51c2VyX25hbWUsCisgICAgICAgIGhvc3RfbmFtZT1zZWxmLmhvc3RfbmFtZSwKKyAgICAgICAgc291cmNlX3Jvb3Q9c2VsZi5zb3VyY2Vfcm9vdCwKKyAgICApCisgICAgZWRpdF9tb25pdG9yX2Vycm9yX2V2ZW50X3Byb3RvLmVkaXRfbW9uaXRvcl9lcnJvcl9ldmVudC5Db3B5RnJvbSgKKyAgICAgICAgZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50LkVkaXRNb25pdG9yRXJyb3JFdmVudChlcnJvcl90eXBlPWVycm9yX3R5cGUpCisgICAgKQorICAgIGxvZ19ldmVudCA9IGNsaWVudGFuYWx5dGljc19wYjIuTG9nRXZlbnQoCisgICAgICAgIGV2ZW50X3RpbWVfbXM9aW50KHRpbWUudGltZSgpICogMTAwMCksCisgICAgICAgIHNvdXJjZV9leHRlbnNpb249ZWRpdF9tb25pdG9yX2Vycm9yX2V2ZW50X3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCksCisgICAgKQorICAgIHNlbGYuY2NsaWVudC5sb2cobG9nX2V2ZW50KQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWRpdF9tb25pdG9yL2RhZW1vbl9tYW5hZ2VyX3Rlc3QucHkgYi90b29scy9lZGl0X21vbml0b3IvZGFlbW9uX21hbmFnZXJfdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2MxNzVkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZWRpdF9tb25pdG9yL2RhZW1vbl9tYW5hZ2VyX3Rlc3QucHkKQEAgLTAsMCArMSw1MjQgQEAKKyMgQ29weXJpZ2h0IDIwMjQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworIiIiVW5pdHRlc3RzIGZvciBEYWVtb25NYW5hZ2VyLiIiIgorCitpbXBvcnQgZmNudGwKK2ltcG9ydCBsb2dnaW5nCitpbXBvcnQgbXVsdGlwcm9jZXNzaW5nCitpbXBvcnQgb3MKK2ltcG9ydCBwYXRobGliCitpbXBvcnQgc2lnbmFsCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IHN5cworaW1wb3J0IHRlbXBmaWxlCitpbXBvcnQgdGltZQoraW1wb3J0IHVuaXR0ZXN0Citmcm9tIHVuaXR0ZXN0IGltcG9ydCBtb2NrCitmcm9tIGVkaXRfbW9uaXRvciBpbXBvcnQgZGFlbW9uX21hbmFnZXIKK2Zyb20gcHJvdG8gaW1wb3J0IGVkaXRfZXZlbnRfcGIyCisKKworVEVTVF9CSU5BUllfRklMRSA9ICcvcGF0aC90by90ZXN0X2JpbmFyeScKK1RFU1RfUElEX0ZJTEVfUEFUSCA9ICgKKyAgICAnNTg3MjM5YzJkMTA1MGFmZGY1NDUxMmUyZDc5OWYzYjkyOWY4NmI0MzU3NWViM2M3YjRiYWIxMDVkZDliZDI1ZS5sb2NrJworKQorCisKK2RlZiBzaW1wbGVfZGFlbW9uKG91dHB1dF9maWxlKToKKyAgd2l0aCBvcGVuKG91dHB1dF9maWxlLCAndycpIGFzIGY6CisgICAgZi53cml0ZSgncnVubmluZyBkYWVtb24gdGFyZ2V0JykKKworCitkZWYgbG9uZ19ydW5uaW5nX2RhZW1vbigpOgorICB3aGlsZSBUcnVlOgorICAgIHRpbWUuc2xlZXAoMSkKKworCitkZWYgbWVtb3J5X2NvbnN1bWVfZGFlbW9uX3RhcmdldChzaXplX21iKToKKyAgdHJ5OgorICAgIHNpemVfYnl0ZXMgPSBzaXplX21iICogMTAyNCAqIDEwMjQKKyAgICBkdW1teV9kYXRhID0gYnl0ZWFycmF5KHNpemVfYnl0ZXMpCisgICAgdGltZS5zbGVlcCgxMCkKKyAgZXhjZXB0IE1lbW9yeUVycm9yOgorICAgIHByaW50KGYnUHJvY2VzcyBmYWlsZWQgdG8gYWxsb2NhdGUge3NpemVfbWJ9IE1CIG9mIG1lbW9yeS4nKQorCisKK2RlZiBjcHVfY29uc3VtZV9kYWVtb25fdGFyZ2V0KHRhcmdldF91c2FnZV9wZXJjZW50KToKKyAgd2hpbGUgVHJ1ZToKKyAgICBzdGFydF90aW1lID0gdGltZS50aW1lKCkKKyAgICB3aGlsZSB0aW1lLnRpbWUoKSAtIHN0YXJ0X3RpbWUgPCB0YXJnZXRfdXNhZ2VfcGVyY2VudCAvIDEwMDoKKyAgICAgIHBhc3MgICMgQnVzeSBsb29wIHRvIGNvbnN1bWUgQ1BVCisKKyAgICAjIFNsZWVwIHRvIHJlZHVjZSBDUFUgdXNhZ2UKKyAgICB0aW1lLnNsZWVwKDEgLSB0YXJnZXRfdXNhZ2VfcGVyY2VudCAvIDEwMCkKKworCitjbGFzcyBEYWVtb25NYW5hZ2VyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgQGNsYXNzbWV0aG9kCisgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgc3VwZXIoKS5zZXRVcENsYXNzKCkKKyAgICAjIENvbmZpZ3VyZSB0byBwcmludCBsb2dnaW5nIHRvIHN0ZG91dC4KKyAgICBsb2dnaW5nLmJhc2ljQ29uZmlnKGZpbGVuYW1lPU5vbmUsIGxldmVsPWxvZ2dpbmcuREVCVUcpCisgICAgY29uc29sZSA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcihzeXMuc3Rkb3V0KQorICAgIGxvZ2dpbmcuZ2V0TG9nZ2VyKCcnKS5hZGRIYW5kbGVyKGNvbnNvbGUpCisKKyAgZGVmIHNldFVwKHNlbGYpOgorICAgIHN1cGVyKCkuc2V0VXAoKQorICAgIHNlbGYub3JpZ2luYWxfdGVtcGRpciA9IHRlbXBmaWxlLnRlbXBkaXIKKyAgICBzZWxmLndvcmtpbmdfZGlyID0gdGVtcGZpbGUuVGVtcG9yYXJ5RGlyZWN0b3J5KCkKKyAgICAjIFNldHMgdGhlIHRlbXBkaXIgdW5kZXIgdGhlIHdvcmtpbmcgZGlyIHNvIGFueSB0ZW1wIGZpbGVzIGNyZWF0ZWQgZHVyaW5nCisgICAgIyB0ZXN0cyB3aWxsIGJlIGNsZWFuZWQuCisgICAgdGVtcGZpbGUudGVtcGRpciA9IHNlbGYud29ya2luZ19kaXIubmFtZQorICAgIHNlbGYucGF0Y2ggPSBtb2NrLnBhdGNoLmRpY3QoCisgICAgICAgIG9zLmVudmlyb24sIHsnRU5BQkxFX0FORFJPSURfRURJVF9NT05JVE9SJzogJ3RydWUnfQorICAgICkKKyAgICBzZWxmLnBhdGNoLnN0YXJ0KCkKKworICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgIyBDbGVhbnMgdXAgYW55IGNoaWxkIHByb2Nlc3NlcyBsZWZ0IGJ5IHRoZSB0ZXN0cy4KKyAgICBzZWxmLl9jbGVhbnVwX2NoaWxkX3Byb2Nlc3NlcygpCisgICAgc2VsZi53b3JraW5nX2Rpci5jbGVhbnVwKCkKKyAgICAjIFJlc3RvcmVzIHRlbXBkaXIuCisgICAgdGVtcGZpbGUudGVtcGRpciA9IHNlbGYub3JpZ2luYWxfdGVtcGRpcgorICAgIHNlbGYucGF0Y2guc3RvcCgpCisgICAgc3VwZXIoKS50ZWFyRG93bigpCisKKyAgZGVmIHRlc3Rfc3RhcnRfc3VjY2Vzc193aXRoX25vX2V4aXN0aW5nX2luc3RhbmNlKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0X3J1bl9zaW1wbGVfZGFlbW9uX3N1Y2Nlc3MoKQorCisgIGRlZiB0ZXN0X3N0YXJ0X3N1Y2Nlc3Nfd2l0aF9leGlzdGluZ19pbnN0YW5jZV9ydW5uaW5nKHNlbGYpOgorICAgICMgQ3JlYXRlIGEgcnVubmluZyBkYWVtb24gc3VicHJvY2VzcworICAgIHAgPSBzZWxmLl9jcmVhdGVfZmFrZV9kZWFtb25fcHJvY2VzcygpCisKKyAgICBzZWxmLmFzc2VydF9ydW5fc2ltcGxlX2RhZW1vbl9zdWNjZXNzKCkKKyAgICBzZWxmLmFzc2VydF9ub19zdWJwcm9jZXNzX3J1bm5pbmcoKQorCisgIGRlZiB0ZXN0X3N0YXJ0X3N1Y2Nlc3Nfd2l0aF9leGlzdGluZ19pbnN0YW5jZV9hbHJlYWR5X2RlYWQoc2VsZik6CisgICAgIyBDcmVhdGUgYSBwaWRmaWxlIHdpdGggcGlkIHRoYXQgZG9lcyBub3QgZXhpc3QuCisgICAgcGlkX2ZpbGVfcGF0aF9kaXIgPSBwYXRobGliLlBhdGgoc2VsZi53b3JraW5nX2Rpci5uYW1lKS5qb2lucGF0aCgKKyAgICAgICAgJ2VkaXRfbW9uaXRvcicKKyAgICApCisgICAgcGlkX2ZpbGVfcGF0aF9kaXIubWtkaXIocGFyZW50cz1UcnVlLCBleGlzdF9vaz1UcnVlKQorICAgIHdpdGggb3BlbihwaWRfZmlsZV9wYXRoX2Rpci5qb2lucGF0aChURVNUX1BJRF9GSUxFX1BBVEgpLCAndycpIGFzIGY6CisgICAgICBmLndyaXRlKCcxMjM0NTYnKQorCisgICAgc2VsZi5hc3NlcnRfcnVuX3NpbXBsZV9kYWVtb25fc3VjY2VzcygpCisKKyAgZGVmIHRlc3Rfc3RhcnRfc3VjY2Vzc193aXRoX2V4aXN0aW5nX2luc3RhbmNlX2Zyb21fZGlmZmVyZW50X2JpbmFyeShzZWxmKToKKyAgICAjIEZpcnN0IHN0YXJ0IGFuIGluc3RhbmNlIGJhc2VkIG9uICJzb21lX2JpbmFyeV9wYXRoIgorICAgIGV4aXN0aW5nX2RtID0gZGFlbW9uX21hbmFnZXIuRGFlbW9uTWFuYWdlcigKKyAgICAgICAgJ3NvbWVfYmluYXJ5X3BhdGgnLAorICAgICAgICBkYWVtb25fdGFyZ2V0PWxvbmdfcnVubmluZ19kYWVtb24sCisgICAgKQorICAgIGV4aXN0aW5nX2RtLnN0YXJ0KCkKKworICAgIHNlbGYuYXNzZXJ0X3J1bl9zaW1wbGVfZGFlbW9uX3N1Y2Nlc3MoKQorICAgIGV4aXN0aW5nX2RtLnN0b3AoKQorCisgIGRlZiB0ZXN0X3N0YXJ0X3JldHVybl9kaXJlY3RseV9pZl9ibG9ja19zaWduX2V4aXN0cyhzZWxmKToKKyAgICAjIENyZWF0ZXMgdGhlIGJsb2NrIHNpZ24uCisgICAgcGF0aGxpYi5QYXRoKHNlbGYud29ya2luZ19kaXIubmFtZSkuam9pbnBhdGgoCisgICAgICAgIGRhZW1vbl9tYW5hZ2VyLkJMT0NLX1NJR05fRklMRQorICAgICkudG91Y2goKQorCisgICAgZG0gPSBkYWVtb25fbWFuYWdlci5EYWVtb25NYW5hZ2VyKFRFU1RfQklOQVJZX0ZJTEUpCisgICAgZG0uc3RhcnQoKQorCisgICAgIyBWZXJpZnkgbm8gZGFlbW9uIHByb2Nlc3MgaXMgc3RhcnRlZC4KKyAgICBzZWxmLmFzc2VydElzTm9uZShkbS5kYWVtb25fcHJvY2VzcykKKworICBAbW9jay5wYXRjaC5kaWN0KAorICAgICAgb3MuZW52aXJvbiwgeydFTkFCTEVfQU5EUk9JRF9FRElUX01PTklUT1InOiAnZmFsc2UnfSwgY2xlYXI9VHJ1ZQorICApCisgIGRlZiB0ZXN0X3N0YXJ0X3JldHVybl9kaXJlY3RseV9pZl9kaXNhYmxlZChzZWxmKToKKyAgICBkbSA9IGRhZW1vbl9tYW5hZ2VyLkRhZW1vbk1hbmFnZXIoVEVTVF9CSU5BUllfRklMRSkKKyAgICBkbS5zdGFydCgpCisKKyAgICAjIFZlcmlmeSBubyBkYWVtb24gcHJvY2VzcyBpcyBzdGFydGVkLgorICAgIHNlbGYuYXNzZXJ0SXNOb25lKGRtLmRhZW1vbl9wcm9jZXNzKQorCisgIGRlZiB0ZXN0X3N0YXJ0X3JldHVybl9kaXJlY3RseV9pZl9pbl9jb2dfZW52KHNlbGYpOgorICAgIGRtID0gZGFlbW9uX21hbmFnZXIuRGFlbW9uTWFuYWdlcigKKyAgICAgICAgJy9nb29nbGUvY29nL2Nsb3VkL3VzZXIvd29ya3NwYWNlL2VkaXRfbW9uaXRvcicKKyAgICApCisgICAgZG0uc3RhcnQoKQorCisgICAgIyBWZXJpZnkgbm8gZGFlbW9uIHByb2Nlc3MgaXMgc3RhcnRlZC4KKyAgICBzZWxmLmFzc2VydElzTm9uZShkbS5kYWVtb25fcHJvY2VzcykKKworICBkZWYgdGVzdF9zdGFydF9mYWlsZWRfb3RoZXJfaW5zdGFuY2VfaXNfc3RhcnRpbmcoc2VsZik6CisgICAgZiA9IG9wZW4oCisgICAgICAgIHBhdGhsaWIuUGF0aChzZWxmLndvcmtpbmdfZGlyLm5hbWUpLmpvaW5wYXRoKAorICAgICAgICAgICAgVEVTVF9QSURfRklMRV9QQVRIICsgJy5zZXR1cCcKKyAgICAgICAgKSwKKyAgICAgICAgJ3cnLAorICAgICkKKyAgICAjIEFjcXVpcmUgYW4gZXhjbHVzaXZlIGxvY2sKKyAgICBmY250bC5mbG9jayhmLCBmY250bC5MT0NLX0VYIHwgZmNudGwuTE9DS19OQikKKworICAgIGRtID0gZGFlbW9uX21hbmFnZXIuRGFlbW9uTWFuYWdlcihURVNUX0JJTkFSWV9GSUxFKQorICAgIGRtLnN0YXJ0KCkKKworICAgICMgUmVsZWFzZSB0aGUgbG9jaworICAgIGZjbnRsLmZsb2NrKGYsIGZjbnRsLkxPQ0tfVU4pCisgICAgZi5jbG9zZSgpCisgICAgIyBWZXJpZnkgbm8gZGFlbW9uIHByb2Nlc3MgaXMgc3RhcnRlZC4KKyAgICBzZWxmLmFzc2VydElzTm9uZShkbS5kYWVtb25fcHJvY2VzcykKKworICBAbW9jay5wYXRjaCgnb3Mua2lsbCcpCisgIGRlZiB0ZXN0X3N0YXJ0X2ZhaWxlZF90b19raWxsX2V4aXN0aW5nX2luc3RhbmNlKHNlbGYsIG1vY2tfa2lsbCk6CisgICAgbW9ja19raWxsLnNpZGVfZWZmZWN0ID0gT1NFcnJvcignVW5rbm93biBPU0Vycm9yJykKKyAgICBwaWRfZmlsZV9wYXRoX2RpciA9IHBhdGhsaWIuUGF0aChzZWxmLndvcmtpbmdfZGlyLm5hbWUpLmpvaW5wYXRoKAorICAgICAgICAnZWRpdF9tb25pdG9yJworICAgICkKKyAgICBwaWRfZmlsZV9wYXRoX2Rpci5ta2RpcihwYXJlbnRzPVRydWUsIGV4aXN0X29rPVRydWUpCisgICAgd2l0aCBvcGVuKHBpZF9maWxlX3BhdGhfZGlyLmpvaW5wYXRoKFRFU1RfUElEX0ZJTEVfUEFUSCksICd3JykgYXMgZjoKKyAgICAgIGYud3JpdGUoJzEyMzQ1NicpCisKKyAgICBmYWtlX2NjbGllbnQgPSBGYWtlQ2xlYXJjdXRDbGllbnQoKQorICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoT1NFcnJvcik6CisgICAgICBkbSA9IGRhZW1vbl9tYW5hZ2VyLkRhZW1vbk1hbmFnZXIoVEVTVF9CSU5BUllfRklMRSwgY2NsaWVudD1mYWtlX2NjbGllbnQpCisgICAgICBkbS5zdGFydCgpCisgICAgc2VsZi5fYXNzZXJ0X2Vycm9yX2V2ZW50X2xvZ2dlZCgKKyAgICAgICAgZmFrZV9jY2xpZW50LCBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuRkFJTEVEX1RPX1NUQVJUX0VESVRfTU9OSVRPUgorICAgICkKKworICBkZWYgdGVzdF9zdGFydF9mYWlsZWRfdG9fd3JpdGVfcGlkZmlsZShzZWxmKToKKyAgICBwaWRfZmlsZV9wYXRoX2RpciA9IHBhdGhsaWIuUGF0aChzZWxmLndvcmtpbmdfZGlyLm5hbWUpLmpvaW5wYXRoKAorICAgICAgICAnZWRpdF9tb25pdG9yJworICAgICkKKyAgICBwaWRfZmlsZV9wYXRoX2Rpci5ta2RpcihwYXJlbnRzPVRydWUsIGV4aXN0X29rPVRydWUpCisKKyAgICAjIE1ha2VzIHRoZSBkaXJlY3RvcnkgcmVhZC1vbmx5IHNvIHdyaXRlIHBpZGZpbGUgd2lsbCBmYWlsLgorICAgIG9zLmNobW9kKHBpZF9maWxlX3BhdGhfZGlyLCAwbzU1NSkKKworICAgIGZha2VfY2NsaWVudCA9IEZha2VDbGVhcmN1dENsaWVudCgpCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhQZXJtaXNzaW9uRXJyb3IpOgorICAgICAgZG0gPSBkYWVtb25fbWFuYWdlci5EYWVtb25NYW5hZ2VyKFRFU1RfQklOQVJZX0ZJTEUsIGNjbGllbnQ9ZmFrZV9jY2xpZW50KQorICAgICAgZG0uc3RhcnQoKQorICAgIHNlbGYuX2Fzc2VydF9lcnJvcl9ldmVudF9sb2dnZWQoCisgICAgICAgIGZha2VfY2NsaWVudCwgZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50LkZBSUxFRF9UT19TVEFSVF9FRElUX01PTklUT1IKKyAgICApCisKKyAgZGVmIHRlc3Rfc3RhcnRfZmFpbGVkX3RvX3N0YXJ0X2RhZW1vbl9wcm9jZXNzKHNlbGYpOgorICAgIGZha2VfY2NsaWVudCA9IEZha2VDbGVhcmN1dENsaWVudCgpCisgICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgorICAgICAgZG0gPSBkYWVtb25fbWFuYWdlci5EYWVtb25NYW5hZ2VyKAorICAgICAgICAgIFRFU1RfQklOQVJZX0ZJTEUsCisgICAgICAgICAgZGFlbW9uX3RhcmdldD0nd3JvbmdfdGFyZ2V0JywKKyAgICAgICAgICBkYWVtb25fYXJncz0oMSksCisgICAgICAgICAgY2NsaWVudD1mYWtlX2NjbGllbnQsCisgICAgICApCisgICAgICBkbS5zdGFydCgpCisgICAgc2VsZi5fYXNzZXJ0X2Vycm9yX2V2ZW50X2xvZ2dlZCgKKyAgICAgICAgZmFrZV9jY2xpZW50LCBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuRkFJTEVEX1RPX1NUQVJUX0VESVRfTU9OSVRPUgorICAgICkKKworICBAbW9jay5wYXRjaCgnb3MuZXhlY3YnKQorICBkZWYgdGVzdF9tb25pdG9yX3JlYm9vdF93aXRoX2hpZ2hfbWVtb3J5X3VzYWdlKHNlbGYsIG1vY2tfZXhlY3YpOgorICAgIGZha2VfY2NsaWVudCA9IEZha2VDbGVhcmN1dENsaWVudCgpCisgICAgYmluYXJ5X2ZpbGUgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoCisgICAgICAgIGRpcj1zZWxmLndvcmtpbmdfZGlyLm5hbWUsIGRlbGV0ZT1GYWxzZQorICAgICkKKworICAgIGRtID0gZGFlbW9uX21hbmFnZXIuRGFlbW9uTWFuYWdlcigKKyAgICAgICAgYmluYXJ5X2ZpbGUubmFtZSwKKyAgICAgICAgZGFlbW9uX3RhcmdldD1tZW1vcnlfY29uc3VtZV9kYWVtb25fdGFyZ2V0LAorICAgICAgICBkYWVtb25fYXJncz0oMiwpLAorICAgICAgICBjY2xpZW50PWZha2VfY2NsaWVudCwKKyAgICApCisgICAgIyBzZXQgdGhlIGZha2UgdG90YWxfbWVtb3J5X3NpemUKKyAgICBkbS50b3RhbF9tZW1vcnlfc2l6ZSA9IDEwMCAqIDEwMjQgKiAxMDI0CisgICAgZG0uc3RhcnQoKQorICAgIGRtLm1vbml0b3JfZGFlbW9uKGludGVydmFsPTEpCisKKyAgICBzZWxmLmFzc2VydFRydWUoZG0ubWF4X21lbW9yeV91c2FnZSA+PSAwLjAyKQorICAgIHNlbGYuYXNzZXJ0X25vX3N1YnByb2Nlc3NfcnVubmluZygpCisgICAgc2VsZi5fYXNzZXJ0X2Vycm9yX2V2ZW50X2xvZ2dlZCgKKyAgICAgICAgZmFrZV9jY2xpZW50LAorICAgICAgICBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuS0lMTEVEX0RVRV9UT19FWENFRURFRF9NRU1PUllfVVNBR0UsCisgICAgKQorICAgIG1vY2tfZXhlY3YuYXNzZXJ0X2NhbGxlZF9vbmNlKCkKKworICBkZWYgdGVzdF9tb25pdG9yX2RhZW1vbl9zdWJwcm9jZXNzX2tpbGxlZF9oaWdoX2NwdV91c2FnZShzZWxmKToKKyAgICBmYWtlX2NjbGllbnQgPSBGYWtlQ2xlYXJjdXRDbGllbnQoKQorICAgIGRtID0gZGFlbW9uX21hbmFnZXIuRGFlbW9uTWFuYWdlcigKKyAgICAgICAgVEVTVF9CSU5BUllfRklMRSwKKyAgICAgICAgZGFlbW9uX3RhcmdldD1jcHVfY29uc3VtZV9kYWVtb25fdGFyZ2V0LAorICAgICAgICBkYWVtb25fYXJncz0oMjAsKSwKKyAgICAgICAgY2NsaWVudD1mYWtlX2NjbGllbnQsCisgICAgKQorICAgIGRtLnN0YXJ0KCkKKyAgICBkbS5tb25pdG9yX2RhZW1vbihpbnRlcnZhbD0xLCBjcHVfdGhyZXNob2xkPTIwKQorCisgICAgc2VsZi5hc3NlcnRUcnVlKGRtLm1heF9jcHVfdXNhZ2UgPj0gMjApCisgICAgc2VsZi5hc3NlcnRfbm9fc3VicHJvY2Vzc19ydW5uaW5nKCkKKyAgICBzZWxmLl9hc3NlcnRfZXJyb3JfZXZlbnRfbG9nZ2VkKAorICAgICAgICBmYWtlX2NjbGllbnQsCisgICAgICAgIGVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5LSUxMRURfRFVFX1RPX0VYQ0VFREVEX0NQVV9VU0FHRSwKKyAgICApCisKKyAgQG1vY2sucGF0Y2goJ3N1YnByb2Nlc3MuY2hlY2tfb3V0cHV0JykKKyAgZGVmIHRlc3RfbW9uaXRvcl9kYWVtb25fZmFpbGVkX2RvZXNfbm90X21hdHRlcihzZWxmLCBtb2NrX291dHB1dCk6CisgICAgbW9ja19vdXRwdXQuc2lkZV9lZmZlY3QgPSBPU0Vycm9yKCdVbmtub3duIE9TRXJyb3InKQorICAgIHNlbGYuYXNzZXJ0X3J1bl9zaW1wbGVfZGFlbW9uX3N1Y2Nlc3MoKQorCisgIEBtb2NrLnBhdGNoKCdvcy5leGVjdicpCisgIGRlZiB0ZXN0X21vbml0b3JfZGFlbW9uX3JlYm9vdF90cmlnZ2VyZWQoc2VsZiwgbW9ja19leGVjdik6CisgICAgYmluYXJ5X2ZpbGUgPSB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoCisgICAgICAgIGRpcj1zZWxmLndvcmtpbmdfZGlyLm5hbWUsIGRlbGV0ZT1GYWxzZQorICAgICkKKworICAgIGRtID0gZGFlbW9uX21hbmFnZXIuRGFlbW9uTWFuYWdlcigKKyAgICAgICAgYmluYXJ5X2ZpbGUubmFtZSwKKyAgICAgICAgZGFlbW9uX3RhcmdldD1sb25nX3J1bm5pbmdfZGFlbW9uLAorICAgICkKKyAgICBkbS5zdGFydCgpCisgICAgZG0ubW9uaXRvcl9kYWVtb24ocmVib290X3RpbWVvdXQ9MC41KQorICAgIG1vY2tfZXhlY3YuYXNzZXJ0X2NhbGxlZF9vbmNlKCkKKworICBkZWYgdGVzdF9zdG9wX3N1Y2Nlc3Moc2VsZik6CisgICAgZG0gPSBkYWVtb25fbWFuYWdlci5EYWVtb25NYW5hZ2VyKAorICAgICAgICBURVNUX0JJTkFSWV9GSUxFLCBkYWVtb25fdGFyZ2V0PWxvbmdfcnVubmluZ19kYWVtb24KKyAgICApCisgICAgZG0uc3RhcnQoKQorICAgIGRtLnN0b3AoKQorCisgICAgc2VsZi5hc3NlcnRfbm9fc3VicHJvY2Vzc19ydW5uaW5nKCkKKyAgICBzZWxmLmFzc2VydEZhbHNlKGRtLnBpZF9maWxlX3BhdGguZXhpc3RzKCkpCisKKyAgQG1vY2sucGF0Y2goJ29zLmtpbGwnKQorICBkZWYgdGVzdF9zdG9wX2ZhaWxlZF90b19raWxsX2RhZW1vbl9wcm9jZXNzKHNlbGYsIG1vY2tfa2lsbCk6CisgICAgbW9ja19raWxsLnNpZGVfZWZmZWN0ID0gT1NFcnJvcignVW5rbm93biBPU0Vycm9yJykKKyAgICBmYWtlX2NjbGllbnQgPSBGYWtlQ2xlYXJjdXRDbGllbnQoKQorICAgIGRtID0gZGFlbW9uX21hbmFnZXIuRGFlbW9uTWFuYWdlcigKKyAgICAgICAgVEVTVF9CSU5BUllfRklMRSwKKyAgICAgICAgZGFlbW9uX3RhcmdldD1sb25nX3J1bm5pbmdfZGFlbW9uLAorICAgICAgICBjY2xpZW50PWZha2VfY2NsaWVudCwKKyAgICApCisKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFN5c3RlbUV4aXQpOgorICAgICAgZG0uc3RhcnQoKQorICAgICAgZG0uc3RvcCgpCisgICAgICBzZWxmLmFzc2VydFRydWUoZG0uZGFlbW9uX3Byb2Nlc3MuaXNfYWxpdmUoKSkKKyAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShkbS5waWRfZmlsZV9wYXRoLmV4aXN0cygpKQorICAgIHNlbGYuX2Fzc2VydF9lcnJvcl9ldmVudF9sb2dnZWQoCisgICAgICAgIGZha2VfY2NsaWVudCwgZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50LkZBSUxFRF9UT19TVE9QX0VESVRfTU9OSVRPUgorICAgICkKKworICBAbW9jay5wYXRjaCgnb3MucmVtb3ZlJykKKyAgZGVmIHRlc3Rfc3RvcF9mYWlsZWRfdG9fcmVtb3ZlX3BpZGZpbGUoc2VsZiwgbW9ja19yZW1vdmUpOgorICAgIG1vY2tfcmVtb3ZlLnNpZGVfZWZmZWN0ID0gT1NFcnJvcignVW5rbm93biBPU0Vycm9yJykKKworICAgIGZha2VfY2NsaWVudCA9IEZha2VDbGVhcmN1dENsaWVudCgpCisgICAgZG0gPSBkYWVtb25fbWFuYWdlci5EYWVtb25NYW5hZ2VyKAorICAgICAgICBURVNUX0JJTkFSWV9GSUxFLAorICAgICAgICBkYWVtb25fdGFyZ2V0PWxvbmdfcnVubmluZ19kYWVtb24sCisgICAgICAgIGNjbGllbnQ9ZmFrZV9jY2xpZW50LAorICAgICkKKworICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoU3lzdGVtRXhpdCk6CisgICAgICBkbS5zdGFydCgpCisgICAgICBkbS5zdG9wKCkKKyAgICAgIHNlbGYuYXNzZXJ0X25vX3N1YnByb2Nlc3NfcnVubmluZygpCisgICAgICBzZWxmLmFzc2VydFRydWUoZG0ucGlkX2ZpbGVfcGF0aC5leGlzdHMoKSkKKworICAgIHNlbGYuX2Fzc2VydF9lcnJvcl9ldmVudF9sb2dnZWQoCisgICAgICAgIGZha2VfY2NsaWVudCwgZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50LkZBSUxFRF9UT19TVE9QX0VESVRfTU9OSVRPUgorICAgICkKKworICBAbW9jay5wYXRjaCgnb3MuZXhlY3YnKQorICBkZWYgdGVzdF9yZWJvb3Rfc3VjY2VzcyhzZWxmLCBtb2NrX2V4ZWN2KToKKyAgICBiaW5hcnlfZmlsZSA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgKKyAgICAgICAgZGlyPXNlbGYud29ya2luZ19kaXIubmFtZSwgZGVsZXRlPUZhbHNlCisgICAgKQorCisgICAgZG0gPSBkYWVtb25fbWFuYWdlci5EYWVtb25NYW5hZ2VyKAorICAgICAgICBiaW5hcnlfZmlsZS5uYW1lLCBkYWVtb25fdGFyZ2V0PWxvbmdfcnVubmluZ19kYWVtb24KKyAgICApCisgICAgZG0uc3RhcnQoKQorICAgIGRtLnJlYm9vdCgpCisKKyAgICAjIFZlcmlmaWVzIHRoZSBvbGQgcHJvY2VzcyBpcyBzdG9wcGVkCisgICAgc2VsZi5hc3NlcnRfbm9fc3VicHJvY2Vzc19ydW5uaW5nKCkKKyAgICBzZWxmLmFzc2VydEZhbHNlKGRtLnBpZF9maWxlX3BhdGguZXhpc3RzKCkpCisKKyAgICBtb2NrX2V4ZWN2LmFzc2VydF9jYWxsZWRfb25jZSgpCisKKyAgQG1vY2sucGF0Y2goJ29zLmV4ZWN2JykKKyAgZGVmIHRlc3RfcmVib290X2JpbmFyeV9ub19sb25nZXJfZXhpc3RzKHNlbGYsIG1vY2tfZXhlY3YpOgorICAgIGRtID0gZGFlbW9uX21hbmFnZXIuRGFlbW9uTWFuYWdlcigKKyAgICAgICAgVEVTVF9CSU5BUllfRklMRSwgZGFlbW9uX3RhcmdldD1sb25nX3J1bm5pbmdfZGFlbW9uCisgICAgKQorICAgIGRtLnN0YXJ0KCkKKworICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoU3lzdGVtRXhpdCk6CisgICAgICBkbS5yZWJvb3QoKQorICAgICAgbW9ja19leGVjdi5hc3NlcnRfbm90X2NhbGxlZCgpCisgICAgICBzZWxmLmFzc2VydEVxdWFsKGNtLmV4Y2VwdGlvbi5jb2RlLCAwKQorCisgIEBtb2NrLnBhdGNoKCdvcy5leGVjdicpCisgIGRlZiB0ZXN0X3JlYm9vdF9mYWlsZWQoc2VsZiwgbW9ja19leGVjdik6CisgICAgbW9ja19leGVjdi5zaWRlX2VmZmVjdCA9IE9TRXJyb3IoJ1Vua25vd24gT1NFcnJvcicpCisgICAgZmFrZV9jY2xpZW50ID0gRmFrZUNsZWFyY3V0Q2xpZW50KCkKKyAgICBiaW5hcnlfZmlsZSA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgKKyAgICAgICAgZGlyPXNlbGYud29ya2luZ19kaXIubmFtZSwgZGVsZXRlPUZhbHNlCisgICAgKQorCisgICAgZG0gPSBkYWVtb25fbWFuYWdlci5EYWVtb25NYW5hZ2VyKAorICAgICAgICBiaW5hcnlfZmlsZS5uYW1lLAorICAgICAgICBkYWVtb25fdGFyZ2V0PWxvbmdfcnVubmluZ19kYWVtb24sCisgICAgICAgIGNjbGllbnQ9ZmFrZV9jY2xpZW50LAorICAgICkKKyAgICBkbS5zdGFydCgpCisKKyAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFN5c3RlbUV4aXQpOgorICAgICAgZG0ucmVib290KCkKKyAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoY20uZXhjZXB0aW9uLmNvZGUsIDEpCisgICAgc2VsZi5fYXNzZXJ0X2Vycm9yX2V2ZW50X2xvZ2dlZCgKKyAgICAgICAgZmFrZV9jY2xpZW50LCBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuRkFJTEVEX1RPX1JFQk9PVF9FRElUX01PTklUT1IKKyAgICApCisKKyAgQG1vY2sucGF0Y2goJ3N1YnByb2Nlc3MuY2hlY2tfb3V0cHV0JykKKyAgZGVmIHRlc3RfY2xlYW51cF9zdWNjZXNzKHNlbGYsIG1vY2tfY2hlY2tfb3V0cHV0KToKKyAgICBwID0gc2VsZi5fY3JlYXRlX2Zha2VfZGVhbW9uX3Byb2Nlc3MoKQorICAgIGZha2VfY2NsaWVudCA9IEZha2VDbGVhcmN1dENsaWVudCgpCisgICAgbW9ja19jaGVja19vdXRwdXQucmV0dXJuX3ZhbHVlID0gZid1c2VyIHtwLnBpZH0gMSAxIDEgMSAxIGVkaXRfbW9uaXRvciBhcmcnCisKKyAgICBkbSA9IGRhZW1vbl9tYW5hZ2VyLkRhZW1vbk1hbmFnZXIoCisgICAgICAgIFRFU1RfQklOQVJZX0ZJTEUsCisgICAgICAgIGRhZW1vbl90YXJnZXQ9bG9uZ19ydW5uaW5nX2RhZW1vbiwKKyAgICAgICAgY2NsaWVudD1mYWtlX2NjbGllbnQsCisgICAgKQorICAgIGRtLmNsZWFudXAoKQorCisgICAgc2VsZi5hc3NlcnRGYWxzZShwLmlzX2FsaXZlKCkpCisgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICBwYXRobGliLlBhdGgoc2VsZi53b3JraW5nX2Rpci5uYW1lKQorICAgICAgICAuam9pbnBhdGgoZGFlbW9uX21hbmFnZXIuQkxPQ0tfU0lHTl9GSUxFKQorICAgICAgICAuZXhpc3RzKCkKKyAgICApCisKKyAgZGVmIGFzc2VydF9ydW5fc2ltcGxlX2RhZW1vbl9zdWNjZXNzKHNlbGYpOgorICAgIGRhbW9uZV9vdXRwdXRfZmlsZSA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgKKyAgICAgICAgZGlyPXNlbGYud29ya2luZ19kaXIubmFtZSwgZGVsZXRlPUZhbHNlCisgICAgKQorICAgIGRtID0gZGFlbW9uX21hbmFnZXIuRGFlbW9uTWFuYWdlcigKKyAgICAgICAgVEVTVF9CSU5BUllfRklMRSwKKyAgICAgICAgZGFlbW9uX3RhcmdldD1zaW1wbGVfZGFlbW9uLAorICAgICAgICBkYWVtb25fYXJncz0oZGFtb25lX291dHB1dF9maWxlLm5hbWUsKSwKKyAgICApCisgICAgZG0uc3RhcnQoKQorICAgIGRtLm1vbml0b3JfZGFlbW9uKGludGVydmFsPTEpCisKKyAgICAjIFZlcmlmaWVzIHRoZSBleHBlY3RlZCBwaWQgZmlsZSBpcyBjcmVhdGVkLgorICAgIGV4cGVjdGVkX3BpZF9maWxlX3BhdGggPSBwYXRobGliLlBhdGgoc2VsZi53b3JraW5nX2Rpci5uYW1lKS5qb2lucGF0aCgKKyAgICAgICAgJ2VkaXRfbW9uaXRvcicsIFRFU1RfUElEX0ZJTEVfUEFUSAorICAgICkKKyAgICBzZWxmLmFzc2VydFRydWUoZXhwZWN0ZWRfcGlkX2ZpbGVfcGF0aC5leGlzdHMoKSkKKworICAgICMgVmVyaWZ5IHRoZSBkYWVtb24gcHJvY2VzcyBpcyBleGVjdXRlZCBzdWNjZXNzZnVsbHkuCisgICAgd2l0aCBvcGVuKGRhbW9uZV9vdXRwdXRfZmlsZS5uYW1lLCAncicpIGFzIGY6CisgICAgICBjb250ZW50cyA9IGYucmVhZCgpCisgICAgICBzZWxmLmFzc2VydEVxdWFsKGNvbnRlbnRzLCAncnVubmluZyBkYWVtb24gdGFyZ2V0JykKKworICBkZWYgYXNzZXJ0X25vX3N1YnByb2Nlc3NfcnVubmluZyhzZWxmKToKKyAgICBjaGlsZF9waWRzID0gc2VsZi5fZ2V0X2NoaWxkX3Byb2Nlc3Nlcyhvcy5nZXRwaWQoKSkKKyAgICBmb3IgY2hpbGRfcGlkIGluIGNoaWxkX3BpZHM6CisgICAgICBzZWxmLmFzc2VydEZhbHNlKAorICAgICAgICAgIHNlbGYuX2lzX3Byb2Nlc3NfYWxpdmUoY2hpbGRfcGlkKSwgZidwcm9jZXNzIHtjaGlsZF9waWR9IHN0aWxsIGFsaXZlJworICAgICAgKQorCisgIGRlZiBfZ2V0X2NoaWxkX3Byb2Nlc3NlcyhzZWxmLCBwYXJlbnRfcGlkOiBpbnQpIC0+IGxpc3RbaW50XToKKyAgICB0cnk6CisgICAgICBvdXRwdXQgPSBzdWJwcm9jZXNzLmNoZWNrX291dHB1dCgKKyAgICAgICAgICBbJ3BzJywgJy1vJywgJ3BpZCxwcGlkJywgJy0tbm8taGVhZGVycyddLCB0ZXh0PVRydWUKKyAgICAgICkKKworICAgICAgY2hpbGRfcHJvY2Vzc2VzID0gW10KKyAgICAgIGZvciBsaW5lIGluIG91dHB1dC5zcGxpdGxpbmVzKCk6CisgICAgICAgIHBpZCwgcHBpZCA9IGxpbmUuc3BsaXQoKQorICAgICAgICBpZiBpbnQocHBpZCkgPT0gcGFyZW50X3BpZDoKKyAgICAgICAgICBjaGlsZF9wcm9jZXNzZXMuYXBwZW5kKGludChwaWQpKQorICAgICAgcmV0dXJuIGNoaWxkX3Byb2Nlc3NlcworICAgIGV4Y2VwdCBzdWJwcm9jZXNzLkNhbGxlZFByb2Nlc3NFcnJvciBhcyBlOgorICAgICAgc2VsZi5mYWlsKGYnZmFpbGVkIHRvIGdldCBjaGlsZCBwcm9jZXNzLCBlcnJvcjoge2V9JykKKworICBkZWYgX2lzX3Byb2Nlc3NfYWxpdmUoc2VsZiwgcGlkOiBpbnQpIC0+IGJvb2w6CisgICAgdHJ5OgorICAgICAgb3V0cHV0ID0gc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoCisgICAgICAgICAgWydwcycsICctcCcsIHN0cihwaWQpLCAnLW8nLCAnc3RhdGU9J10sIHRleHQ9VHJ1ZQorICAgICAgKS5zdHJpcCgpCisgICAgICBzdGF0ZSA9IG91dHB1dC5zcGxpdCgpWzBdCisgICAgICByZXR1cm4gc3RhdGUgIT0gJ1onICAjIENoZWNrIGlmIHRoZSBzdGF0ZSBpcyBub3QgJ1onICh6b21iaWUpCisgICAgZXhjZXB0IHN1YnByb2Nlc3MuQ2FsbGVkUHJvY2Vzc0Vycm9yOgorICAgICAgcmV0dXJuIEZhbHNlCisKKyAgZGVmIF9jbGVhbnVwX2NoaWxkX3Byb2Nlc3NlcyhzZWxmKToKKyAgICBjaGlsZF9waWRzID0gc2VsZi5fZ2V0X2NoaWxkX3Byb2Nlc3Nlcyhvcy5nZXRwaWQoKSkKKyAgICBmb3IgY2hpbGRfcGlkIGluIGNoaWxkX3BpZHM6CisgICAgICB0cnk6CisgICAgICAgIG9zLmtpbGwoY2hpbGRfcGlkLCBzaWduYWwuU0lHS0lMTCkKKyAgICAgIGV4Y2VwdCBQcm9jZXNzTG9va3VwRXJyb3I6CisgICAgICAgICMgcHJvY2VzcyBhbHJlYWR5IHRlcm1pbmF0ZWQKKyAgICAgICAgcGFzcworCisgIGRlZiBfY3JlYXRlX2Zha2VfZGVhbW9uX3Byb2Nlc3MoCisgICAgICBzZWxmLCBuYW1lOiBzdHIgPSBURVNUX1BJRF9GSUxFX1BBVEgKKyAgKSAtPiBtdWx0aXByb2Nlc3NpbmcuUHJvY2VzczoKKyAgICAjIENyZWF0ZSBhIGxvbmcgcnVubmluZyBzdWJwcm9jZXNzCisgICAgcCA9IG11bHRpcHJvY2Vzc2luZy5Qcm9jZXNzKHRhcmdldD1sb25nX3J1bm5pbmdfZGFlbW9uKQorICAgIHAuc3RhcnQoKQorCisgICAgIyBDcmVhdGUgdGhlIHBpZGZpbGUgd2l0aCB0aGUgc3VicHJvY2VzcyBwaWQKKyAgICBwaWRfZmlsZV9wYXRoX2RpciA9IHBhdGhsaWIuUGF0aChzZWxmLndvcmtpbmdfZGlyLm5hbWUpLmpvaW5wYXRoKAorICAgICAgICAnZWRpdF9tb25pdG9yJworICAgICkKKyAgICBwaWRfZmlsZV9wYXRoX2Rpci5ta2RpcihwYXJlbnRzPVRydWUsIGV4aXN0X29rPVRydWUpCisgICAgd2l0aCBvcGVuKHBpZF9maWxlX3BhdGhfZGlyLmpvaW5wYXRoKG5hbWUpLCAndycpIGFzIGY6CisgICAgICBmLndyaXRlKHN0cihwLnBpZCkpCisgICAgcmV0dXJuIHAKKworICBkZWYgX2Fzc2VydF9lcnJvcl9ldmVudF9sb2dnZWQoc2VsZiwgZmFrZV9jY2xpZW50LCBlcnJvcl90eXBlKToKKyAgICBlcnJvcl9ldmVudHMgPSBmYWtlX2NjbGllbnQuZ2V0X3NlbnRfZXZlbnRzKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihlcnJvcl9ldmVudHMpLCAxKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIGVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5Gcm9tU3RyaW5nKAorICAgICAgICAgICAgZXJyb3JfZXZlbnRzWzBdLnNvdXJjZV9leHRlbnNpb24KKyAgICAgICAgKS5lZGl0X21vbml0b3JfZXJyb3JfZXZlbnQuZXJyb3JfdHlwZSwKKyAgICAgICAgZXJyb3JfdHlwZSwKKyAgICApCisKKworY2xhc3MgRmFrZUNsZWFyY3V0Q2xpZW50OgorCisgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICBzZWxmLnBlbmRpbmdfbG9nX2V2ZW50cyA9IFtdCisgICAgc2VsZi5zZW50X2xvZ19ldmVudCA9IFtdCisKKyAgZGVmIGxvZyhzZWxmLCBsb2dfZXZlbnQpOgorICAgIHNlbGYucGVuZGluZ19sb2dfZXZlbnRzLmFwcGVuZChsb2dfZXZlbnQpCisKKyAgZGVmIGZsdXNoX2V2ZW50cyhzZWxmKToKKyAgICBzZWxmLnNlbnRfbG9nX2V2ZW50LmV4dGVuZChzZWxmLnBlbmRpbmdfbG9nX2V2ZW50cykKKyAgICBzZWxmLnBlbmRpbmdfbG9nX2V2ZW50cy5jbGVhcigpCisKKyAgZGVmIGdldF9zZW50X2V2ZW50cyhzZWxmKToKKyAgICByZXR1cm4gc2VsZi5zZW50X2xvZ19ldmVudCArIHNlbGYucGVuZGluZ19sb2dfZXZlbnRzCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS90b29scy9lZGl0X21vbml0b3IvZWRpdF9tb25pdG9yLnB5IGIvdG9vbHMvZWRpdF9tb25pdG9yL2VkaXRfbW9uaXRvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjUyOGU4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZWRpdF9tb25pdG9yL2VkaXRfbW9uaXRvci5weQpAQCAtMCwwICsxLDIyMCBAQAorIyBDb3B5cmlnaHQgMjAyNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisKK2ltcG9ydCBnZXRwYXNzCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG11bHRpcHJvY2Vzc2luZy5jb25uZWN0aW9uCitpbXBvcnQgb3MKK2ltcG9ydCBwYXRobGliCitpbXBvcnQgcGxhdGZvcm0KK2ltcG9ydCB0aHJlYWRpbmcKK2ltcG9ydCB0aW1lCisKK2Zyb20gYXRlc3QubWV0cmljcyBpbXBvcnQgY2xlYXJjdXRfY2xpZW50Citmcm9tIGF0ZXN0LnByb3RvIGltcG9ydCBjbGllbnRhbmFseXRpY3NfcGIyCitmcm9tIHByb3RvIGltcG9ydCBlZGl0X2V2ZW50X3BiMgorZnJvbSB3YXRjaGRvZy5ldmVudHMgaW1wb3J0IEZpbGVTeXN0ZW1FdmVudAorZnJvbSB3YXRjaGRvZy5ldmVudHMgaW1wb3J0IFBhdHRlcm5NYXRjaGluZ0V2ZW50SGFuZGxlcgorZnJvbSB3YXRjaGRvZy5vYnNlcnZlcnMgaW1wb3J0IE9ic2VydmVyCisKKyMgRW51bSBvZiB0aGUgQ2xlYXJjdXQgbG9nIHNvdXJjZSBkZWZpbmVkIHVuZGVyCisjIC9nb29nbGUzL3dpcmVsZXNzL2FuZHJvaWQvcGxheS9wbGF5bG9nL3Byb3RvL2xvZ19zb3VyY2VfZW51bS5wcm90bworTE9HX1NPVVJDRSA9IDI1MjQKK0RFRkFVTFRfRkxVU0hfSU5URVJWQUxfU0VDT05EUyA9IDUKK0RFRkFVTFRfU0lOR0xFX0VWRU5UU19TSVpFX1RIUkVTSE9MRCA9IDEwMAorCisKK2NsYXNzIENsZWFyY3V0RXZlbnRIYW5kbGVyKFBhdHRlcm5NYXRjaGluZ0V2ZW50SGFuZGxlcik6CisKKyAgZGVmIF9faW5pdF9fKAorICAgICAgc2VsZiwKKyAgICAgIHBhdGg6IHN0ciwKKyAgICAgIGZsdXNoX2ludGVydmFsX3NlYzogaW50LAorICAgICAgc2luZ2xlX2V2ZW50c19zaXplX3RocmVzaG9sZDogaW50LAorICAgICAgaXNfZHJ5X3J1bjogYm9vbCA9IEZhbHNlLAorICAgICAgY2NsaWVudDogY2xlYXJjdXRfY2xpZW50LkNsZWFyY3V0IHwgTm9uZSA9IE5vbmUsCisgICk6CisKKyAgICBzdXBlcigpLl9faW5pdF9fKHBhdHRlcm5zPVsiKiJdLCBpZ25vcmVfZGlyZWN0b3JpZXM9VHJ1ZSkKKyAgICBzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoID0gcGF0aAorICAgIHNlbGYuZmx1c2hfaW50ZXJ2YWxfc2VjID0gZmx1c2hfaW50ZXJ2YWxfc2VjCisgICAgc2VsZi5zaW5nbGVfZXZlbnRzX3NpemVfdGhyZXNob2xkID0gc2luZ2xlX2V2ZW50c19zaXplX3RocmVzaG9sZAorICAgIHNlbGYuaXNfZHJ5X3J1biA9IGlzX2RyeV9ydW4KKyAgICBzZWxmLmNjbGllbnQgPSBjY2xpZW50IG9yIGNsZWFyY3V0X2NsaWVudC5DbGVhcmN1dChMT0dfU09VUkNFKQorCisgICAgc2VsZi51c2VyX25hbWUgPSBnZXRwYXNzLmdldHVzZXIoKQorICAgIHNlbGYuaG9zdF9uYW1lID0gcGxhdGZvcm0ubm9kZSgpCisgICAgc2VsZi5zb3VyY2Vfcm9vdCA9IG9zLmVudmlyb24uZ2V0KCJBTkRST0lEX0JVSUxEX1RPUCIsICIiKQorCisgICAgc2VsZi5wZW5kaW5nX2V2ZW50cyA9IFtdCisgICAgc2VsZi5fc2NoZWR1bGVkX2xvZ190aHJlYWQgPSBOb25lCisgICAgc2VsZi5fcGVuZGluZ19ldmVudHNfbG9jayA9IHRocmVhZGluZy5Mb2NrKCkKKworICBkZWYgb25fbW92ZWQoc2VsZiwgZXZlbnQ6IEZpbGVTeXN0ZW1FdmVudCk6CisgICAgc2VsZi5fbG9nX2VkaXRfZXZlbnQoZXZlbnQsIGVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5NT1ZFKQorCisgIGRlZiBvbl9jcmVhdGVkKHNlbGYsIGV2ZW50OiBGaWxlU3lzdGVtRXZlbnQpOgorICAgIHNlbGYuX2xvZ19lZGl0X2V2ZW50KGV2ZW50LCBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuQ1JFQVRFKQorCisgIGRlZiBvbl9kZWxldGVkKHNlbGYsIGV2ZW50OiBGaWxlU3lzdGVtRXZlbnQpOgorICAgIHNlbGYuX2xvZ19lZGl0X2V2ZW50KGV2ZW50LCBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuREVMRVRFKQorCisgIGRlZiBvbl9tb2RpZmllZChzZWxmLCBldmVudDogRmlsZVN5c3RlbUV2ZW50KToKKyAgICBzZWxmLl9sb2dfZWRpdF9ldmVudChldmVudCwgZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50Lk1PRElGWSkKKworICBkZWYgZmx1c2hhbGwoc2VsZik6CisgICAgbG9nZ2luZy5pbmZvKCJmbHVzaGluZyBhbGwgcGVuZGluZyBldmVudHMuIikKKyAgICBpZiBzZWxmLl9zY2hlZHVsZWRfbG9nX3RocmVhZDoKKyAgICAgIGxvZ2dpbmcuaW5mbygiY2FuY2VsaW5nIGxvZyB0aHJlYWQiKQorICAgICAgc2VsZi5fc2NoZWR1bGVkX2xvZ190aHJlYWQuY2FuY2VsKCkKKyAgICAgIHNlbGYuX3NjaGVkdWxlZF9sb2dfdGhyZWFkID0gTm9uZQorCisgICAgc2VsZi5fbG9nX2NsZWFyY3V0X2V2ZW50cygpCisgICAgc2VsZi5jY2xpZW50LmZsdXNoX2V2ZW50cygpCisKKyAgZGVmIF9sb2dfZWRpdF9ldmVudCgKKyAgICAgIHNlbGYsIGV2ZW50OiBGaWxlU3lzdGVtRXZlbnQsIGVkaXRfdHlwZTogZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50LkVkaXRUeXBlCisgICk6CisgICAgdHJ5OgorICAgICAgZXZlbnRfdGltZSA9IHRpbWUudGltZSgpCisKKyAgICAgIGlmIHNlbGYuX2lzX2hpZGRlbl9maWxlKHBhdGhsaWIuUGF0aChldmVudC5zcmNfcGF0aCkpOgorICAgICAgICBsb2dnaW5nLmRlYnVnKCJpZ25vcmUgaGlkZGVuIGZpbGU6ICVzLiIsIGV2ZW50LnNyY19wYXRoKQorICAgICAgICByZXR1cm4KKworICAgICAgaWYgbm90IHNlbGYuX2lzX3VuZGVyX2dpdF9wcm9qZWN0KHBhdGhsaWIuUGF0aChldmVudC5zcmNfcGF0aCkpOgorICAgICAgICBsb2dnaW5nLmRlYnVnKAorICAgICAgICAgICAgImlnbm9yZSBmaWxlICVzIHdoaWNoIGRvZXMgbm90IGJlbG9uZyB0byBhIGdpdCBwcm9qZWN0IiwKKyAgICAgICAgICAgIGV2ZW50LnNyY19wYXRoLAorICAgICAgICApCisgICAgICAgIHJldHVybgorCisgICAgICBsb2dnaW5nLmluZm8oIiVzOiAlcyIsIGV2ZW50LmV2ZW50X3R5cGUsIGV2ZW50LnNyY19wYXRoKQorCisgICAgICBldmVudF9wcm90byA9IGVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudCgKKyAgICAgICAgICB1c2VyX25hbWU9c2VsZi51c2VyX25hbWUsCisgICAgICAgICAgaG9zdF9uYW1lPXNlbGYuaG9zdF9uYW1lLAorICAgICAgICAgIHNvdXJjZV9yb290PXNlbGYuc291cmNlX3Jvb3QsCisgICAgICApCisgICAgICBldmVudF9wcm90by5zaW5nbGVfZWRpdF9ldmVudC5Db3B5RnJvbSgKKyAgICAgICAgICBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuU2luZ2xlRWRpdEV2ZW50KAorICAgICAgICAgICAgICBmaWxlX3BhdGg9ZXZlbnQuc3JjX3BhdGgsIGVkaXRfdHlwZT1lZGl0X3R5cGUKKyAgICAgICAgICApCisgICAgICApCisgICAgICB3aXRoIHNlbGYuX3BlbmRpbmdfZXZlbnRzX2xvY2s6CisgICAgICAgIHNlbGYucGVuZGluZ19ldmVudHMuYXBwZW5kKChldmVudF9wcm90bywgZXZlbnRfdGltZSkpCisgICAgICAgIGlmIG5vdCBzZWxmLl9zY2hlZHVsZWRfbG9nX3RocmVhZDoKKyAgICAgICAgICBsb2dnaW5nLmRlYnVnKAorICAgICAgICAgICAgICAiU2NoZWR1bGluZyB0aHJlYWQgdG8gcnVuIGluICVkIHNlY29uZHMiLCBzZWxmLmZsdXNoX2ludGVydmFsX3NlYworICAgICAgICAgICkKKyAgICAgICAgICBzZWxmLl9zY2hlZHVsZWRfbG9nX3RocmVhZCA9IHRocmVhZGluZy5UaW1lcigKKyAgICAgICAgICAgICAgc2VsZi5mbHVzaF9pbnRlcnZhbF9zZWMsIHNlbGYuX2xvZ19jbGVhcmN1dF9ldmVudHMKKyAgICAgICAgICApCisgICAgICAgICAgc2VsZi5fc2NoZWR1bGVkX2xvZ190aHJlYWQuc3RhcnQoKQorCisgICAgZXhjZXB0IEV4Y2VwdGlvbjoKKyAgICAgIGxvZ2dpbmcuZXhjZXB0aW9uKCJGYWlsZWQgdG8gbG9nIGVkaXQgZXZlbnQuIikKKworICBkZWYgX2lzX2hpZGRlbl9maWxlKHNlbGYsIGZpbGVfcGF0aDogcGF0aGxpYi5QYXRoKSAtPiBib29sOgorICAgIHJldHVybiBhbnkoCisgICAgICAgIHBhcnQuc3RhcnRzd2l0aCgiLiIpCisgICAgICAgIGZvciBwYXJ0IGluIGZpbGVfcGF0aC5yZWxhdGl2ZV90byhzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoKS5wYXJ0cworICAgICkKKworICBkZWYgX2lzX3VuZGVyX2dpdF9wcm9qZWN0KHNlbGYsIGZpbGVfcGF0aDogcGF0aGxpYi5QYXRoKSAtPiBib29sOgorICAgIHJvb3RfcGF0aCA9IHBhdGhsaWIuUGF0aChzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoKS5yZXNvbHZlKCkKKyAgICByZXR1cm4gYW55KAorICAgICAgICByb290X3BhdGguam9pbnBhdGgoZGlyKS5qb2lucGF0aCgnLmdpdCcpLmV4aXN0cygpCisgICAgICAgIGZvciBkaXIgaW4gZmlsZV9wYXRoLnJlbGF0aXZlX3RvKHJvb3RfcGF0aCkucGFyZW50cworICAgICkKKworICBkZWYgX2xvZ19jbGVhcmN1dF9ldmVudHMoc2VsZik6CisgICAgd2l0aCBzZWxmLl9wZW5kaW5nX2V2ZW50c19sb2NrOgorICAgICAgc2VsZi5fc2NoZWR1bGVkX2xvZ190aHJlYWQgPSBOb25lCisgICAgICBlZGl0X2V2ZW50cyA9IHNlbGYucGVuZGluZ19ldmVudHMKKyAgICAgIHNlbGYucGVuZGluZ19ldmVudHMgPSBbXQorCisgICAgcGVuZGluZ19ldmVudHNfc2l6ZSA9IGxlbihlZGl0X2V2ZW50cykKKyAgICBpZiBwZW5kaW5nX2V2ZW50c19zaXplID4gc2VsZi5zaW5nbGVfZXZlbnRzX3NpemVfdGhyZXNob2xkOgorICAgICAgbG9nZ2luZy5pbmZvKAorICAgICAgICAgICJnb3QgJWQgZXZlbnRzIGluICVkIHNlY29uZHMsIHNlbmRpbmcgYWdncmVnYXRlZCBldmVudHMgaW5zdGVhZCIsCisgICAgICAgICAgcGVuZGluZ19ldmVudHNfc2l6ZSwKKyAgICAgICAgICBzZWxmLmZsdXNoX2ludGVydmFsX3NlYywKKyAgICAgICkKKyAgICAgIGFnZ3JlZ2F0ZWRfZXZlbnRfdGltZSA9IGVkaXRfZXZlbnRzWzBdWzFdCisgICAgICBhZ2dyZWdhdGVkX2V2ZW50X3Byb3RvID0gZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50KAorICAgICAgICAgIHVzZXJfbmFtZT1zZWxmLnVzZXJfbmFtZSwKKyAgICAgICAgICBob3N0X25hbWU9c2VsZi5ob3N0X25hbWUsCisgICAgICAgICAgc291cmNlX3Jvb3Q9c2VsZi5zb3VyY2Vfcm9vdCwKKyAgICAgICkKKyAgICAgIGFnZ3JlZ2F0ZWRfZXZlbnRfcHJvdG8uYWdncmVnYXRlZF9lZGl0X2V2ZW50LkNvcHlGcm9tKAorICAgICAgICAgIGVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5BZ2dyZWdhdGVkRWRpdEV2ZW50KAorICAgICAgICAgICAgICBudW1fZWRpdHM9cGVuZGluZ19ldmVudHNfc2l6ZQorICAgICAgICAgICkKKyAgICAgICkKKyAgICAgIGVkaXRfZXZlbnRzID0gWyhhZ2dyZWdhdGVkX2V2ZW50X3Byb3RvLCBhZ2dyZWdhdGVkX2V2ZW50X3RpbWUpXQorCisgICAgaWYgc2VsZi5pc19kcnlfcnVuOgorICAgICAgbG9nZ2luZy5pbmZvKCJTZW50ICVkIGVkaXQgZXZlbnRzIGluIGRyeSBydW4uIiwgbGVuKGVkaXRfZXZlbnRzKSkKKyAgICAgIHJldHVybgorCisgICAgZm9yIGV2ZW50X3Byb3RvLCBldmVudF90aW1lIGluIGVkaXRfZXZlbnRzOgorICAgICAgbG9nX2V2ZW50ID0gY2xpZW50YW5hbHl0aWNzX3BiMi5Mb2dFdmVudCgKKyAgICAgICAgICBldmVudF90aW1lX21zPWludChldmVudF90aW1lICogMTAwMCksCisgICAgICAgICAgc291cmNlX2V4dGVuc2lvbj1ldmVudF9wcm90by5TZXJpYWxpemVUb1N0cmluZygpLAorICAgICAgKQorICAgICAgc2VsZi5jY2xpZW50LmxvZyhsb2dfZXZlbnQpCisKKyAgICBsb2dnaW5nLmluZm8oInNlbnQgJWQgZWRpdCBldmVudHMiLCBsZW4oZWRpdF9ldmVudHMpKQorCisKK2RlZiBzdGFydCgKKyAgICBwYXRoOiBzdHIsCisgICAgaXNfZHJ5X3J1bjogYm9vbCA9IEZhbHNlLAorICAgIGZsdXNoX2ludGVydmFsX3NlYzogaW50ID0gREVGQVVMVF9GTFVTSF9JTlRFUlZBTF9TRUNPTkRTLAorICAgIHNpbmdsZV9ldmVudHNfc2l6ZV90aHJlc2hvbGQ6IGludCA9IERFRkFVTFRfU0lOR0xFX0VWRU5UU19TSVpFX1RIUkVTSE9MRCwKKyAgICBjY2xpZW50OiBjbGVhcmN1dF9jbGllbnQuQ2xlYXJjdXQgfCBOb25lID0gTm9uZSwKKyAgICBwaXBlX3NlbmRlcjogbXVsdGlwcm9jZXNzaW5nLmNvbm5lY3Rpb24uQ29ubmVjdGlvbiB8IE5vbmUgPSBOb25lLAorKToKKyAgIiIiTWV0aG9kIHRvIHN0YXJ0IHRoZSBlZGl0IG1vbml0b3IuCisKKyAgVGhpcyBpcyB0aGUgZW50cnkgcG9pbnQgdG8gc3RhcnQgdGhlIGVkaXQgbW9uaXRvciBhcyBhIHN1YnByb2Nlc3Mgb2YKKyAgdGhlIGRhZW1vbiBtYW5hZ2VyLgorCisgIHBhcmFtczoKKyAgICBwYXRoOiBUaGUgcm9vdCBwYXRoIHRvIG1vbml0b3IKKyAgICBjY2xpZW50OiBUaGUgY2xlYXJjdXQgY2xpZW50IHRvIHNlbmQgdGhlIGVkaXQgbG9ncy4KKyAgICBjb25uOiB0aGUgc2VuZGVyIG9mIHRoZSBwaXBlIHRvIGNvbW11bmljYXRlIHdpdGggdGhlIGRlYW1vbiBtYW5hZ2VyLgorICAiIiIKKyAgZXZlbnRfaGFuZGxlciA9IENsZWFyY3V0RXZlbnRIYW5kbGVyKAorICAgICAgcGF0aCwgZmx1c2hfaW50ZXJ2YWxfc2VjLCBzaW5nbGVfZXZlbnRzX3NpemVfdGhyZXNob2xkLCBpc19kcnlfcnVuLCBjY2xpZW50KQorICBvYnNlcnZlciA9IE9ic2VydmVyKCkKKworICBsb2dnaW5nLmluZm8oIlN0YXJ0aW5nIG9ic2VydmVyIG9uIHBhdGggJXMuIiwgcGF0aCkKKyAgb2JzZXJ2ZXIuc2NoZWR1bGUoZXZlbnRfaGFuZGxlciwgcGF0aCwgcmVjdXJzaXZlPVRydWUpCisgIG9ic2VydmVyLnN0YXJ0KCkKKyAgbG9nZ2luZy5pbmZvKCJPYnNlcnZlciBzdGFydGVkLiIpCisgIGlmIHBpcGVfc2VuZGVyOgorICAgIHBpcGVfc2VuZGVyLnNlbmQoIk9ic2VydmVyIHN0YXJ0ZWQuIikKKworICB0cnk6CisgICAgd2hpbGUgVHJ1ZToKKyAgICAgIHRpbWUuc2xlZXAoMSkKKyAgZmluYWxseToKKyAgICBldmVudF9oYW5kbGVyLmZsdXNoYWxsKCkKKyAgICBvYnNlcnZlci5zdG9wKCkKKyAgICBvYnNlcnZlci5qb2luKCkKKyAgICBpZiBwaXBlX3NlbmRlcjoKKyAgICAgIHBpcGVfc2VuZGVyLmNsb3NlKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL2VkaXRfbW9uaXRvci9lZGl0X21vbml0b3JfaW50ZWdyYXRpb25fdGVzdC5weSBiL3Rvb2xzL2VkaXRfbW9uaXRvci9lZGl0X21vbml0b3JfaW50ZWdyYXRpb25fdGVzdC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzliOTM2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZWRpdF9tb25pdG9yL2VkaXRfbW9uaXRvcl9pbnRlZ3JhdGlvbl90ZXN0LnB5CkBAIC0wLDAgKzEsMTY5IEBACisjIENvcHlyaWdodCAyMDI0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyIiIkludGVncmF0aW9uIHRlc3RzIGZvciBFZGl0IE1vbml0b3IuIiIiCisKK2ltcG9ydCBnbG9iCitmcm9tIGltcG9ydGxpYiBpbXBvcnQgcmVzb3VyY2VzCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zCitpbXBvcnQgcGF0aGxpYgoraW1wb3J0IHNodXRpbAoraW1wb3J0IHNpZ25hbAoraW1wb3J0IHN1YnByb2Nlc3MKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHRpbWUKK2ltcG9ydCB1bml0dGVzdAorZnJvbSB1bml0dGVzdCBpbXBvcnQgbW9jaworCisKK2NsYXNzIEVkaXRNb25pdG9ySW50ZWdyYXRpb25UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBAY2xhc3NtZXRob2QKKyAgZGVmIHNldFVwQ2xhc3MoY2xzKToKKyAgICBzdXBlcigpLnNldFVwQ2xhc3MoKQorICAgICMgQ29uZmlndXJlIHRvIHByaW50IGxvZ2dpbmcgdG8gc3Rkb3V0LgorICAgIGxvZ2dpbmcuYmFzaWNDb25maWcoZmlsZW5hbWU9Tm9uZSwgbGV2ZWw9bG9nZ2luZy5ERUJVRykKKyAgICBjb25zb2xlID0gbG9nZ2luZy5TdHJlYW1IYW5kbGVyKHN5cy5zdGRvdXQpCisgICAgbG9nZ2luZy5nZXRMb2dnZXIoIiIpLmFkZEhhbmRsZXIoY29uc29sZSkKKworICBkZWYgc2V0VXAoc2VsZik6CisgICAgc3VwZXIoKS5zZXRVcCgpCisgICAgc2VsZi53b3JraW5nX2RpciA9IHRlbXBmaWxlLlRlbXBvcmFyeURpcmVjdG9yeSgpCisgICAgc2VsZi5yb290X21vbml0b3JpbmdfcGF0aCA9IHBhdGhsaWIuUGF0aChzZWxmLndvcmtpbmdfZGlyLm5hbWUpLmpvaW5wYXRoKAorICAgICAgICAiZmlsZXMiCisgICAgKQorICAgIHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGgubWtkaXIoKQorICAgIHNlbGYuZWRpdF9tb25pdG9yX2JpbmFyeV9wYXRoID0gc2VsZi5faW1wb3J0X2V4ZWN1dGFibGUoImVkaXRfbW9uaXRvciIpCisgICAgc2VsZi5wYXRjaCA9IG1vY2sucGF0Y2guZGljdCgKKyAgICAgICAgb3MuZW52aXJvbiwgeyJFTkFCTEVfQU5EUk9JRF9FRElUX01PTklUT1IiOiAidHJ1ZSJ9CisgICAgKQorICAgIHNlbGYucGF0Y2guc3RhcnQoKQorCisgIGRlZiB0ZWFyRG93bihzZWxmKToKKyAgICBzZWxmLnBhdGNoLnN0b3AoKQorICAgIHNlbGYud29ya2luZ19kaXIuY2xlYW51cCgpCisgICAgc3VwZXIoKS50ZWFyRG93bigpCisKKyAgZGVmIHRlc3RfbG9nX3NpbmdsZV9lZGl0X2V2ZW50X3N1Y2Nlc3Moc2VsZik6CisgICAgcCA9IHNlbGYuX3N0YXJ0X2VkaXRfbW9uaXRvcl9wcm9jZXNzKCkKKworICAgICMgQ3JlYXRlIHRoZSAuZ2l0IGZpbGUgdW5kZXIgdGhlIG1vbml0b3JpbmcgZGlyLgorICAgIHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGguam9pbnBhdGgoIi5naXQiKS50b3VjaCgpCisKKyAgICAjIENyZWF0ZSBhbmQgbW9kaWZ5IGEgZmlsZS4KKyAgICB0ZXN0X2ZpbGUgPSBzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoLmpvaW5wYXRoKCJ0ZXN0LnR4dCIpCisgICAgd2l0aCBvcGVuKHRlc3RfZmlsZSwgInciKSBhcyBmOgorICAgICAgZi53cml0ZSgic29tZXRoaW5nIikKKworICAgICMgTW92ZSB0aGUgZmlsZS4KKyAgICB0ZXN0X2ZpbGVfbW92ZWQgPSBzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoLmpvaW5wYXRoKCJuZXdfdGVzdC50eHQiKQorICAgIHRlc3RfZmlsZS5yZW5hbWUodGVzdF9maWxlX21vdmVkKQorCisgICAgIyBEZWxldGUgdGhlIGZpbGUuCisgICAgdGVzdF9maWxlX21vdmVkLnVubGluaygpCisKKyAgICAjIEdpdmUgc29tZSB0aW1lIGZvciB0aGUgZWRpdCBtb25pdG9yIHRvIHJlY2VpdmUgdGhlIGVkaXQgZXZlbnQuCisgICAgdGltZS5zbGVlcCgxKQorICAgICMgU3RvcCB0aGUgZWRpdCBtb25pdG9yIGFuZCBmbHVzaCBhbGwgZXZlbnRzLgorICAgIG9zLmtpbGwocC5waWQsIHNpZ25hbC5TSUdJTlQpCisgICAgcC5jb21tdW5pY2F0ZSgpCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuX2dldF9sb2dnZWRfZXZlbnRzX251bSgpLCA0KQorCisgIGRlZiB0ZXN0X3N0YXJ0X211bHRpcGxlX2VkaXRfbW9uaXRvcl9vbmx5X29uZV9zdGFydGVkKHNlbGYpOgorICAgIHAxID0gc2VsZi5fc3RhcnRfZWRpdF9tb25pdG9yX3Byb2Nlc3Mod2FpdF9mb3Jfb2JzZXJ2ZXJfc3RhcnQ9RmFsc2UpCisgICAgcDIgPSBzZWxmLl9zdGFydF9lZGl0X21vbml0b3JfcHJvY2Vzcyh3YWl0X2Zvcl9vYnNlcnZlcl9zdGFydD1GYWxzZSkKKyAgICBwMyA9IHNlbGYuX3N0YXJ0X2VkaXRfbW9uaXRvcl9wcm9jZXNzKHdhaXRfZm9yX29ic2VydmVyX3N0YXJ0PUZhbHNlKQorCisgICAgbGl2ZV9wcm9jZXNzZXMgPSBzZWxmLl9nZXRfbGl2ZV9wcm9jZXNzZXMoW3AxLCBwMiwgcDNdKQorCisgICAgIyBDbGVhbnVwIGFsbCBsaXZlIHByb2Nlc3Nlcy4KKyAgICBmb3IgcCBpbiBsaXZlX3Byb2Nlc3NlczoKKyAgICAgIG9zLmtpbGwocC5waWQsIHNpZ25hbC5TSUdJTlQpCisgICAgICBwLmNvbW11bmljYXRlKCkKKworICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxpdmVfcHJvY2Vzc2VzKSwgMSkKKworICBkZWYgX3N0YXJ0X2VkaXRfbW9uaXRvcl9wcm9jZXNzKHNlbGYsIHdhaXRfZm9yX29ic2VydmVyX3N0YXJ0PVRydWUpOgorICAgIGNvbW1hbmQgPSBmIiIiCisgICAgZXhwb3J0IFRNUERJUj0ie3NlbGYud29ya2luZ19kaXIubmFtZX0iCisgICAge3NlbGYuZWRpdF9tb25pdG9yX2JpbmFyeV9wYXRofSAtLXBhdGg9e3NlbGYucm9vdF9tb25pdG9yaW5nX3BhdGh9IC0tZHJ5X3J1biIiIgorICAgIHAgPSBzdWJwcm9jZXNzLlBvcGVuKAorICAgICAgICBjb21tYW5kLAorICAgICAgICBzaGVsbD1UcnVlLAorICAgICAgICB0ZXh0PVRydWUsCisgICAgICAgIHN0YXJ0X25ld19zZXNzaW9uPVRydWUsCisgICAgICAgIGV4ZWN1dGFibGU9Ii9iaW4vYmFzaCIsCisgICAgKQorICAgIGlmIHdhaXRfZm9yX29ic2VydmVyX3N0YXJ0OgorICAgICAgc2VsZi5fd2FpdF9mb3Jfb2JzZXJ2ZXJfc3RhcnQodGltZV9vdXQ9NSkKKworICAgIHJldHVybiBwCisKKyAgZGVmIF93YWl0X2Zvcl9vYnNlcnZlcl9zdGFydChzZWxmLCB0aW1lX291dCk6CisgICAgc3RhcnRfdGltZSA9IHRpbWUudGltZSgpCisKKyAgICB3aGlsZSB0aW1lLnRpbWUoKSA8IHN0YXJ0X3RpbWUgKyB0aW1lX291dDoKKyAgICAgIGxvZ19maWxlcyA9IGdsb2IuZ2xvYihzZWxmLndvcmtpbmdfZGlyLm5hbWUgKyAiL2VkaXRfbW9uaXRvcl8qLyoubG9nIikKKyAgICAgIGlmIGxvZ19maWxlczoKKyAgICAgICAgd2l0aCBvcGVuKGxvZ19maWxlc1swXSwgInIiKSBhcyBmOgorICAgICAgICAgIGZvciBsaW5lIGluIGY6CisgICAgICAgICAgICBsb2dnaW5nLmRlYnVnKCJpbml0aWFsIGxvZzogJXMiLCBsaW5lKQorICAgICAgICAgICAgaWYgbGluZS5yc3RyaXAoIlxuIikuZW5kc3dpdGgoIk9ic2VydmVyIHN0YXJ0ZWQuIik6CisgICAgICAgICAgICAgIHJldHVybgorICAgICAgZWxzZToKKyAgICAgICAgdGltZS5zbGVlcCgxKQorCisgICAgc2VsZi5mYWlsKGYiT2JzZXJ2ZXIgbm90IHN0YXJ0ZWQgaW4ge3RpbWVfb3V0fSBzZWNvbmRzLiIpCisKKyAgZGVmIF9nZXRfbG9nZ2VkX2V2ZW50c19udW0oc2VsZik6CisgICAgbG9nX2ZpbGVzID0gZ2xvYi5nbG9iKHNlbGYud29ya2luZ19kaXIubmFtZSArICIvZWRpdF9tb25pdG9yXyovKi5sb2ciKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxvZ19maWxlcyksIDEpCisKKyAgICB3aXRoIG9wZW4obG9nX2ZpbGVzWzBdLCAiciIpIGFzIGY6CisgICAgICBmb3IgbGluZSBpbiBmOgorICAgICAgICBsb2dnaW5nLmRlYnVnKCJjb21wbGV0ZSBsb2c6ICVzIiwgbGluZSkKKyAgICAgICAgaWYgbGluZS5yc3RyaXAoIlxuIikuZW5kc3dpdGgoImluIGRyeSBydW4uIik6CisgICAgICAgICAgcmV0dXJuIGludChsaW5lLnNwbGl0KCI6IilbLTFdLnNwbGl0KCIgIilbMl0pCisKKyAgICByZXR1cm4gMAorCisgIGRlZiBfZ2V0X2xpdmVfcHJvY2Vzc2VzKHNlbGYsIHByb2Nlc3Nlcyk6CisgICAgbGl2ZV9wcm9jZXNzZXMgPSBbXQorICAgIGZvciBwIGluIHByb2Nlc3NlczoKKyAgICAgIHRyeToKKyAgICAgICAgcC53YWl0KHRpbWVvdXQ9NSkKKyAgICAgIGV4Y2VwdCBzdWJwcm9jZXNzLlRpbWVvdXRFeHBpcmVkIGFzIGU6CisgICAgICAgIGxpdmVfcHJvY2Vzc2VzLmFwcGVuZChwKQorICAgICAgICBsb2dnaW5nLmluZm8oInByb2Nlc3M6ICVkIHN0aWxsIGFsaXZlLiIsIHAucGlkKQorICAgICAgZWxzZToKKyAgICAgICAgbG9nZ2luZy5pbmZvKCJwcm9jZXNzOiAlZCBzdG9wcGVkLiIsIHAucGlkKQorICAgIHJldHVybiBsaXZlX3Byb2Nlc3NlcworCisgIGRlZiBfaW1wb3J0X2V4ZWN1dGFibGUoc2VsZiwgZXhlY3V0YWJsZV9uYW1lOiBzdHIpIC0+IHBhdGhsaWIuUGF0aDoKKyAgICBiaW5hcnlfZGlyID0gcGF0aGxpYi5QYXRoKHNlbGYud29ya2luZ19kaXIubmFtZSkuam9pbnBhdGgoImJpbmFyeSIpCisgICAgYmluYXJ5X2Rpci5ta2RpcigpCisgICAgZXhlY3V0YWJsZV9wYXRoID0gYmluYXJ5X2Rpci5qb2lucGF0aChleGVjdXRhYmxlX25hbWUpCisgICAgd2l0aCByZXNvdXJjZXMuYXNfZmlsZSgKKyAgICAgICAgcmVzb3VyY2VzLmZpbGVzKCJ0ZXN0ZGF0YSIpLmpvaW5wYXRoKGV4ZWN1dGFibGVfbmFtZSkKKyAgICApIGFzIGJpbmFyeToKKyAgICAgIHNodXRpbC5jb3B5KGJpbmFyeSwgZXhlY3V0YWJsZV9wYXRoKQorICAgIGV4ZWN1dGFibGVfcGF0aC5jaG1vZCgwbzc1NSkKKyAgICByZXR1cm4gZXhlY3V0YWJsZV9wYXRoCisKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS90b29scy9lZGl0X21vbml0b3IvZWRpdF9tb25pdG9yX3Rlc3QucHkgYi90b29scy9lZGl0X21vbml0b3IvZWRpdF9tb25pdG9yX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGViNzNlNwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2VkaXRfbW9uaXRvci9lZGl0X21vbml0b3JfdGVzdC5weQpAQCAtMCwwICsxLDMwMSBAQAorIyBDb3B5cmlnaHQgMjAyNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisiIiJVbml0dGVzdHMgZm9yIEVkaXQgTW9uaXRvci4iIiIKKworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBtdWx0aXByb2Nlc3NpbmcKK2ltcG9ydCBvcworaW1wb3J0IHBhdGhsaWIKK2ltcG9ydCBzaWduYWwKK2ltcG9ydCBzeXMKK2ltcG9ydCB0ZW1wZmlsZQoraW1wb3J0IHRpbWUKK2ltcG9ydCB1bml0dGVzdAorCitmcm9tIGF0ZXN0LnByb3RvIGltcG9ydCBjbGllbnRhbmFseXRpY3NfcGIyCitmcm9tIGVkaXRfbW9uaXRvciBpbXBvcnQgZWRpdF9tb25pdG9yCitmcm9tIHByb3RvIGltcG9ydCBlZGl0X2V2ZW50X3BiMgorCisKK2NsYXNzIEVkaXRNb25pdG9yVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6CisKKyAgQGNsYXNzbWV0aG9kCisgIGRlZiBzZXRVcENsYXNzKGNscyk6CisgICAgc3VwZXIoKS5zZXRVcENsYXNzKCkKKyAgICAjIENvbmZpZ3VyZSB0byBwcmludCBsb2dnaW5nIHRvIHN0ZG91dC4KKyAgICBsb2dnaW5nLmJhc2ljQ29uZmlnKGZpbGVuYW1lPU5vbmUsIGxldmVsPWxvZ2dpbmcuREVCVUcpCisgICAgY29uc29sZSA9IGxvZ2dpbmcuU3RyZWFtSGFuZGxlcihzeXMuc3Rkb3V0KQorICAgIGxvZ2dpbmcuZ2V0TG9nZ2VyKCcnKS5hZGRIYW5kbGVyKGNvbnNvbGUpCisKKyAgZGVmIHNldFVwKHNlbGYpOgorICAgIHN1cGVyKCkuc2V0VXAoKQorICAgIHNlbGYud29ya2luZ19kaXIgPSB0ZW1wZmlsZS5UZW1wb3JhcnlEaXJlY3RvcnkoKQorICAgIHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGggPSBwYXRobGliLlBhdGgoc2VsZi53b3JraW5nX2Rpci5uYW1lKS5qb2lucGF0aCgKKyAgICAgICAgJ2ZpbGVzJworICAgICkKKyAgICBzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoLm1rZGlyKCkKKyAgICBzZWxmLmxvZ19ldmVudF9kaXIgPSBwYXRobGliLlBhdGgoc2VsZi53b3JraW5nX2Rpci5uYW1lKS5qb2lucGF0aCgnbG9ncycpCisgICAgc2VsZi5sb2dfZXZlbnRfZGlyLm1rZGlyKCkKKworICBkZWYgdGVhckRvd24oc2VsZik6CisgICAgc2VsZi53b3JraW5nX2Rpci5jbGVhbnVwKCkKKyAgICBzdXBlcigpLnRlYXJEb3duKCkKKworICBkZWYgdGVzdF9sb2dfc2luZ2xlX2VkaXRfZXZlbnRfc3VjY2VzcyhzZWxmKToKKyAgICAjIENyZWF0ZSB0aGUgLmdpdCBmaWxlIHVuZGVyIHRoZSBtb25pdG9yaW5nIGRpci4KKyAgICBzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoLmpvaW5wYXRoKCcuZ2l0JykudG91Y2goKQorICAgIGZha2VfY2NsaWVudCA9IEZha2VDbGVhcmN1dENsaWVudCgKKyAgICAgICAgbG9nX291dHB1dF9maWxlPXNlbGYubG9nX2V2ZW50X2Rpci5qb2lucGF0aCgnbG9ncy5vdXRwdXQnKQorICAgICkKKyAgICBwID0gc2VsZi5fc3RhcnRfdGVzdF9lZGl0X21vbml0b3JfcHJvY2VzcyhmYWtlX2NjbGllbnQpCisKKyAgICAjIENyZWF0ZSBhbmQgbW9kaWZ5IGEgZmlsZS4KKyAgICB0ZXN0X2ZpbGUgPSBzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoLmpvaW5wYXRoKCd0ZXN0LnR4dCcpCisgICAgd2l0aCBvcGVuKHRlc3RfZmlsZSwgJ3cnKSBhcyBmOgorICAgICAgZi53cml0ZSgnc29tZXRoaW5nJykKKyAgICAjIE1vdmUgdGhlIGZpbGUuCisgICAgdGVzdF9maWxlX21vdmVkID0gc2VsZi5yb290X21vbml0b3JpbmdfcGF0aC5qb2lucGF0aCgnbmV3X3Rlc3QudHh0JykKKyAgICB0ZXN0X2ZpbGUucmVuYW1lKHRlc3RfZmlsZV9tb3ZlZCkKKyAgICAjIERlbGV0ZSB0aGUgZmlsZS4KKyAgICB0ZXN0X2ZpbGVfbW92ZWQudW5saW5rKCkKKyAgICAjIEdpdmUgc29tZSB0aW1lIGZvciB0aGUgZWRpdCBtb25pdG9yIHRvIHJlY2VpdmUgdGhlIGVkaXQgZXZlbnQuCisgICAgdGltZS5zbGVlcCgxKQorICAgICMgU3RvcCB0aGUgZWRpdCBtb25pdG9yIGFuZCBmbHVzaCBhbGwgZXZlbnRzLgorICAgIG9zLmtpbGwocC5waWQsIHNpZ25hbC5TSUdJTlQpCisgICAgcC5qb2luKCkKKworICAgIGxvZ2dlZF9ldmVudHMgPSBzZWxmLl9nZXRfbG9nZ2VkX2V2ZW50cygpCisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obG9nZ2VkX2V2ZW50cyksIDQpCisgICAgZXhwZWN0ZWRfY3JlYXRlX2V2ZW50ID0gZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50LlNpbmdsZUVkaXRFdmVudCgKKyAgICAgICAgZmlsZV9wYXRoPXN0cigKKyAgICAgICAgICAgIHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGguam9pbnBhdGgoJ3Rlc3QudHh0JykucmVzb2x2ZSgpCisgICAgICAgICksCisgICAgICAgIGVkaXRfdHlwZT1lZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuQ1JFQVRFLAorICAgICkKKyAgICBleHBlY3RlZF9tb2RpZnlfZXZlbnQgPSBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuU2luZ2xlRWRpdEV2ZW50KAorICAgICAgICBmaWxlX3BhdGg9c3RyKAorICAgICAgICAgICAgc2VsZi5yb290X21vbml0b3JpbmdfcGF0aC5qb2lucGF0aCgndGVzdC50eHQnKS5yZXNvbHZlKCkKKyAgICAgICAgKSwKKyAgICAgICAgZWRpdF90eXBlPWVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5NT0RJRlksCisgICAgKQorICAgIGV4cGVjdGVkX21vdmVfZXZlbnQgPSBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuU2luZ2xlRWRpdEV2ZW50KAorICAgICAgICBmaWxlX3BhdGg9c3RyKAorICAgICAgICAgICAgc2VsZi5yb290X21vbml0b3JpbmdfcGF0aC5qb2lucGF0aCgndGVzdC50eHQnKS5yZXNvbHZlKCkKKyAgICAgICAgKSwKKyAgICAgICAgZWRpdF90eXBlPWVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5NT1ZFLAorICAgICkKKyAgICBleHBlY3RlZF9kZWxldGVfZXZlbnQgPSBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuU2luZ2xlRWRpdEV2ZW50KAorICAgICAgICBmaWxlX3BhdGg9c3RyKAorICAgICAgICAgICAgc2VsZi5yb290X21vbml0b3JpbmdfcGF0aC5qb2lucGF0aCgnbmV3X3Rlc3QudHh0JykucmVzb2x2ZSgpCisgICAgICAgICksCisgICAgICAgIGVkaXRfdHlwZT1lZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuREVMRVRFLAorICAgICkKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBleHBlY3RlZF9jcmVhdGVfZXZlbnQsCisgICAgICAgIGVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5Gcm9tU3RyaW5nKAorICAgICAgICAgICAgbG9nZ2VkX2V2ZW50c1swXS5zb3VyY2VfZXh0ZW5zaW9uCisgICAgICAgICkuc2luZ2xlX2VkaXRfZXZlbnQsCisgICAgKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwoCisgICAgICAgIGV4cGVjdGVkX21vZGlmeV9ldmVudCwKKyAgICAgICAgZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50LkZyb21TdHJpbmcoCisgICAgICAgICAgICBsb2dnZWRfZXZlbnRzWzFdLnNvdXJjZV9leHRlbnNpb24KKyAgICAgICAgKS5zaW5nbGVfZWRpdF9ldmVudCwKKyAgICApCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgZXhwZWN0ZWRfbW92ZV9ldmVudCwKKyAgICAgICAgZWRpdF9ldmVudF9wYjIuRWRpdEV2ZW50LkZyb21TdHJpbmcoCisgICAgICAgICAgICBsb2dnZWRfZXZlbnRzWzJdLnNvdXJjZV9leHRlbnNpb24KKyAgICAgICAgKS5zaW5nbGVfZWRpdF9ldmVudCwKKyAgICApCisgICAgc2VsZi5hc3NlcnRFcXVhbCgKKyAgICAgICAgZXhwZWN0ZWRfZGVsZXRlX2V2ZW50LAorICAgICAgICBlZGl0X2V2ZW50X3BiMi5FZGl0RXZlbnQuRnJvbVN0cmluZygKKyAgICAgICAgICAgIGxvZ2dlZF9ldmVudHNbM10uc291cmNlX2V4dGVuc2lvbgorICAgICAgICApLnNpbmdsZV9lZGl0X2V2ZW50LAorICAgICkKKworCisgIGRlZiB0ZXN0X2xvZ19hZ2dyZWdhdGVkX2VkaXRfZXZlbnRfc3VjY2VzcyhzZWxmKToKKyAgICAjIENyZWF0ZSB0aGUgLmdpdCBmaWxlIHVuZGVyIHRoZSBtb25pdG9yaW5nIGRpci4KKyAgICBzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoLmpvaW5wYXRoKCcuZ2l0JykudG91Y2goKQorICAgIGZha2VfY2NsaWVudCA9IEZha2VDbGVhcmN1dENsaWVudCgKKyAgICAgICAgbG9nX291dHB1dF9maWxlPXNlbGYubG9nX2V2ZW50X2Rpci5qb2lucGF0aCgnbG9ncy5vdXRwdXQnKQorICAgICkKKyAgICBwID0gc2VsZi5fc3RhcnRfdGVzdF9lZGl0X21vbml0b3JfcHJvY2VzcyhmYWtlX2NjbGllbnQpCisKKyAgICAjIENyZWF0ZSA2IHRlc3QgZmlsZXMKKyAgICBmb3IgaSBpbiByYW5nZSg2KToKKyAgICAgIHRlc3RfZmlsZSA9IHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGguam9pbnBhdGgoJ3Rlc3RfJyArIHN0cihpKSkKKyAgICAgIHRlc3RfZmlsZS50b3VjaCgpCisKKyAgICAjIEdpdmUgc29tZSB0aW1lIGZvciB0aGUgZWRpdCBtb25pdG9yIHRvIHJlY2VpdmUgdGhlIGVkaXQgZXZlbnQuCisgICAgdGltZS5zbGVlcCgxKQorICAgICMgU3RvcCB0aGUgZWRpdCBtb25pdG9yIGFuZCBmbHVzaCBhbGwgZXZlbnRzLgorICAgIG9zLmtpbGwocC5waWQsIHNpZ25hbC5TSUdJTlQpCisgICAgcC5qb2luKCkKKworICAgIGxvZ2dlZF9ldmVudHMgPSBzZWxmLl9nZXRfbG9nZ2VkX2V2ZW50cygpCisgICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obG9nZ2VkX2V2ZW50cyksIDEpCisKKyAgICBleHBlY3RlZF9hZ2dyZWdhdGVkX2VkaXRfZXZlbnQgPSAoCisgICAgICAgIGVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5BZ2dyZWdhdGVkRWRpdEV2ZW50KAorICAgICAgICAgICAgbnVtX2VkaXRzPTYsCisgICAgICAgICkKKyAgICApCisKKyAgICBzZWxmLmFzc2VydEVxdWFsKAorICAgICAgICBleHBlY3RlZF9hZ2dyZWdhdGVkX2VkaXRfZXZlbnQsCisgICAgICAgIGVkaXRfZXZlbnRfcGIyLkVkaXRFdmVudC5Gcm9tU3RyaW5nKAorICAgICAgICAgICAgbG9nZ2VkX2V2ZW50c1swXS5zb3VyY2VfZXh0ZW5zaW9uCisgICAgICAgICkuYWdncmVnYXRlZF9lZGl0X2V2ZW50LAorICAgICkKKworICBkZWYgdGVzdF9kb19ub3RfbG9nX2VkaXRfZXZlbnRfZm9yX2RpcmVjdG9yeV9jaGFuZ2Uoc2VsZik6CisgICAgIyBDcmVhdGUgdGhlIC5naXQgZmlsZSB1bmRlciB0aGUgbW9uaXRvcmluZyBkaXIuCisgICAgc2VsZi5yb290X21vbml0b3JpbmdfcGF0aC5qb2lucGF0aCgnLmdpdCcpLnRvdWNoKCkKKyAgICBmYWtlX2NjbGllbnQgPSBGYWtlQ2xlYXJjdXRDbGllbnQoCisgICAgICAgIGxvZ19vdXRwdXRfZmlsZT1zZWxmLmxvZ19ldmVudF9kaXIuam9pbnBhdGgoJ2xvZ3Mub3V0cHV0JykKKyAgICApCisgICAgcCA9IHNlbGYuX3N0YXJ0X3Rlc3RfZWRpdF9tb25pdG9yX3Byb2Nlc3MoZmFrZV9jY2xpZW50KQorCisgICAgIyBDcmVhdGUgYSBzdWIgZGlyZWN0b3J5CisgICAgc2VsZi5yb290X21vbml0b3JpbmdfcGF0aC5qb2lucGF0aCgndGVzdF9kaXInKS5ta2RpcigpCisgICAgIyBHaXZlIHNvbWUgdGltZSBmb3IgdGhlIGVkaXQgbW9uaXRvciB0byByZWNlaXZlIHRoZSBlZGl0IGV2ZW50LgorICAgIHRpbWUuc2xlZXAoMSkKKyAgICAjIFN0b3AgdGhlIGVkaXQgbW9uaXRvciBhbmQgZmx1c2ggYWxsIGV2ZW50cy4KKyAgICBvcy5raWxsKHAucGlkLCBzaWduYWwuU0lHSU5UKQorICAgIHAuam9pbigpCisKKyAgICBsb2dnZWRfZXZlbnRzID0gc2VsZi5fZ2V0X2xvZ2dlZF9ldmVudHMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxvZ2dlZF9ldmVudHMpLCAwKQorCisgIGRlZiB0ZXN0X2RvX25vdF9sb2dfZWRpdF9ldmVudF9mb3JfaGlkZGVuX2ZpbGUoc2VsZik6CisgICAgIyBDcmVhdGUgdGhlIC5naXQgZmlsZSB1bmRlciB0aGUgbW9uaXRvcmluZyBkaXIuCisgICAgc2VsZi5yb290X21vbml0b3JpbmdfcGF0aC5qb2lucGF0aCgnLmdpdCcpLnRvdWNoKCkKKyAgICBmYWtlX2NjbGllbnQgPSBGYWtlQ2xlYXJjdXRDbGllbnQoCisgICAgICAgIGxvZ19vdXRwdXRfZmlsZT1zZWxmLmxvZ19ldmVudF9kaXIuam9pbnBhdGgoJ2xvZ3Mub3V0cHV0JykKKyAgICApCisgICAgcCA9IHNlbGYuX3N0YXJ0X3Rlc3RfZWRpdF9tb25pdG9yX3Byb2Nlc3MoZmFrZV9jY2xpZW50KQorCisgICAgIyBDcmVhdGUgYSBoaWRkZW4gZmlsZS4KKyAgICBzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoLmpvaW5wYXRoKCcudGVzdC50eHQnKS50b3VjaCgpCisgICAgIyBDcmVhdGUgYSBoaWRkZW4gZGlyLgorICAgIGhpZGRlbl9kaXIgPSBzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoLmpvaW5wYXRoKCcudGVzdCcpCisgICAgaGlkZGVuX2Rpci5ta2RpcigpCisgICAgaGlkZGVuX2Rpci5qb2lucGF0aCgndGVzdC50eHQnKS50b3VjaCgpCisgICAgIyBHaXZlIHNvbWUgdGltZSBmb3IgdGhlIGVkaXQgbW9uaXRvciB0byByZWNlaXZlIHRoZSBlZGl0IGV2ZW50LgorICAgIHRpbWUuc2xlZXAoMSkKKyAgICAjIFN0b3AgdGhlIGVkaXQgbW9uaXRvciBhbmQgZmx1c2ggYWxsIGV2ZW50cy4KKyAgICBvcy5raWxsKHAucGlkLCBzaWduYWwuU0lHSU5UKQorICAgIHAuam9pbigpCisKKyAgICBsb2dnZWRfZXZlbnRzID0gc2VsZi5fZ2V0X2xvZ2dlZF9ldmVudHMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxvZ2dlZF9ldmVudHMpLCAwKQorCisgIGRlZiB0ZXN0X2RvX25vdF9sb2dfZWRpdF9ldmVudF9mb3Jfbm9uX2dpdF9wcm9qZWN0X2ZpbGUoc2VsZik6CisgICAgZmFrZV9jY2xpZW50ID0gRmFrZUNsZWFyY3V0Q2xpZW50KAorICAgICAgICBsb2dfb3V0cHV0X2ZpbGU9c2VsZi5sb2dfZXZlbnRfZGlyLmpvaW5wYXRoKCdsb2dzLm91dHB1dCcpCisgICAgKQorICAgIHAgPSBzZWxmLl9zdGFydF90ZXN0X2VkaXRfbW9uaXRvcl9wcm9jZXNzKGZha2VfY2NsaWVudCkKKworICAgICMgQ3JlYXRlIGEgZmlsZS4KKyAgICBzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoLmpvaW5wYXRoKCd0ZXN0LnR4dCcpLnRvdWNoKCkKKyAgICAjIENyZWF0ZSBhIGZpbGUgdW5kZXIgYSBzdWIgZGlyLgorICAgIHN1Yl9kaXIgPSBzZWxmLnJvb3RfbW9uaXRvcmluZ19wYXRoLmpvaW5wYXRoKCcudGVzdCcpCisgICAgc3ViX2Rpci5ta2RpcigpCisgICAgc3ViX2Rpci5qb2lucGF0aCgndGVzdC50eHQnKS50b3VjaCgpCisgICAgIyBHaXZlIHNvbWUgdGltZSBmb3IgdGhlIGVkaXQgbW9uaXRvciB0byByZWNlaXZlIHRoZSBlZGl0IGV2ZW50LgorICAgIHRpbWUuc2xlZXAoMSkKKyAgICAjIFN0b3AgdGhlIGVkaXQgbW9uaXRvciBhbmQgZmx1c2ggYWxsIGV2ZW50cy4KKyAgICBvcy5raWxsKHAucGlkLCBzaWduYWwuU0lHSU5UKQorICAgIHAuam9pbigpCisKKyAgICBsb2dnZWRfZXZlbnRzID0gc2VsZi5fZ2V0X2xvZ2dlZF9ldmVudHMoKQorICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGxvZ2dlZF9ldmVudHMpLCAwKQorCisgIGRlZiB0ZXN0X2xvZ19lZGl0X2V2ZW50X2ZhaWwoc2VsZik6CisgICAgIyBDcmVhdGUgdGhlIC5naXQgZmlsZSB1bmRlciB0aGUgbW9uaXRvcmluZyBkaXIuCisgICAgc2VsZi5yb290X21vbml0b3JpbmdfcGF0aC5qb2lucGF0aCgnLmdpdCcpLnRvdWNoKCkKKyAgICBmYWtlX2NjbGllbnQgPSBGYWtlQ2xlYXJjdXRDbGllbnQoCisgICAgICAgIGxvZ19vdXRwdXRfZmlsZT1zZWxmLmxvZ19ldmVudF9kaXIuam9pbnBhdGgoJ2xvZ3Mub3V0cHV0JyksCisgICAgICAgIHJhaXNlX2xvZ19leGNlcHRpb249VHJ1ZSwKKyAgICApCisgICAgcCA9IHNlbGYuX3N0YXJ0X3Rlc3RfZWRpdF9tb25pdG9yX3Byb2Nlc3MoZmFrZV9jY2xpZW50KQorCisgICAgIyBDcmVhdGUgYSBmaWxlLgorICAgIHNlbGYucm9vdF9tb25pdG9yaW5nX3BhdGguam9pbnBhdGgoJ3Rlc3QudHh0JykudG91Y2goKQorICAgICMgR2l2ZSBzb21lIHRpbWUgZm9yIHRoZSBlZGl0IG1vbml0b3IgdG8gcmVjZWl2ZSB0aGUgZWRpdCBldmVudC4KKyAgICB0aW1lLnNsZWVwKDEpCisgICAgIyBTdG9wIHRoZSBlZGl0IG1vbml0b3IgYW5kIGZsdXNoIGFsbCBldmVudHMuCisgICAgb3Mua2lsbChwLnBpZCwgc2lnbmFsLlNJR0lOVCkKKyAgICBwLmpvaW4oKQorCisgICAgbG9nZ2VkX2V2ZW50cyA9IHNlbGYuX2dldF9sb2dnZWRfZXZlbnRzKCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihsb2dnZWRfZXZlbnRzKSwgMCkKKworICBkZWYgX3N0YXJ0X3Rlc3RfZWRpdF9tb25pdG9yX3Byb2Nlc3MoCisgICAgICBzZWxmLCBjY2xpZW50CisgICkgLT4gbXVsdGlwcm9jZXNzaW5nLlByb2Nlc3M6CisgICAgcmVjZWl2ZXIsIHNlbmRlciA9IG11bHRpcHJvY2Vzc2luZy5QaXBlKCkKKyAgICAjIFN0YXJ0IGVkaXQgbW9uaXRvciBpbiBhIHN1YnByb2Nlc3MuCisgICAgcCA9IG11bHRpcHJvY2Vzc2luZy5Qcm9jZXNzKAorICAgICAgICB0YXJnZXQ9ZWRpdF9tb25pdG9yLnN0YXJ0LAorICAgICAgICBhcmdzPShzdHIoc2VsZi5yb290X21vbml0b3JpbmdfcGF0aC5yZXNvbHZlKCkpLCBGYWxzZSwgMC41LCA1LCBjY2xpZW50LCBzZW5kZXIpLAorICAgICkKKyAgICBwLmRhZW1vbiA9IFRydWUKKyAgICBwLnN0YXJ0KCkKKworICAgICMgV2FpdCB1bnRpbCBvYnNlcnZlciBzdGFydGVkLgorICAgIHJlY2VpdmVkX2RhdGEgPSByZWNlaXZlci5yZWN2KCkKKyAgICBzZWxmLmFzc2VydEVxdWFsKHJlY2VpdmVkX2RhdGEsICdPYnNlcnZlciBzdGFydGVkLicpCisKKyAgICByZWNlaXZlci5jbG9zZSgpCisgICAgcmV0dXJuIHAKKworICBkZWYgX2dldF9sb2dnZWRfZXZlbnRzKHNlbGYpOgorICAgIHdpdGggb3BlbihzZWxmLmxvZ19ldmVudF9kaXIuam9pbnBhdGgoJ2xvZ3Mub3V0cHV0JyksICdyYicpIGFzIGY6CisgICAgICBkYXRhID0gZi5yZWFkKCkKKworICAgIHJldHVybiBbCisgICAgICAgIGNsaWVudGFuYWx5dGljc19wYjIuTG9nRXZlbnQuRnJvbVN0cmluZyhyZWNvcmQpCisgICAgICAgIGZvciByZWNvcmQgaW4gZGF0YS5zcGxpdChiJ1x4MDAnKQorICAgICAgICBpZiByZWNvcmQKKyAgICBdCisKKworY2xhc3MgRmFrZUNsZWFyY3V0Q2xpZW50OgorCisgIGRlZiBfX2luaXRfXyhzZWxmLCBsb2dfb3V0cHV0X2ZpbGUsIHJhaXNlX2xvZ19leGNlcHRpb249RmFsc2UpOgorICAgIHNlbGYucGVuZGluZ19sb2dfZXZlbnRzID0gW10KKyAgICBzZWxmLnJhaXNlX2xvZ19leGNlcHRpb24gPSByYWlzZV9sb2dfZXhjZXB0aW9uCisgICAgc2VsZi5sb2dfb3V0cHV0X2ZpbGUgPSBsb2dfb3V0cHV0X2ZpbGUKKworICBkZWYgbG9nKHNlbGYsIGxvZ19ldmVudCk6CisgICAgaWYgc2VsZi5yYWlzZV9sb2dfZXhjZXB0aW9uOgorICAgICAgcmFpc2UgRXhjZXB0aW9uKCd1bmtub3duIGV4Y2VwdGlvbicpCisgICAgc2VsZi5wZW5kaW5nX2xvZ19ldmVudHMuYXBwZW5kKGxvZ19ldmVudCkKKworICBkZWYgZmx1c2hfZXZlbnRzKHNlbGYpOgorICAgIGRlbGltaXRlciA9IGInXHgwMCcgICMgVXNlIGEgbnVsbCBieXRlIGFzIHRoZSBkZWxpbWl0ZXIKKyAgICB3aXRoIG9wZW4oc2VsZi5sb2dfb3V0cHV0X2ZpbGUsICd3YicpIGFzIGY6CisgICAgICBmb3IgbG9nX2V2ZW50IGluIHNlbGYucGVuZGluZ19sb2dfZXZlbnRzOgorICAgICAgICBmLndyaXRlKGxvZ19ldmVudC5TZXJpYWxpemVUb1N0cmluZygpICsgZGVsaW1pdGVyKQorCisgICAgc2VsZi5wZW5kaW5nX2xvZ19ldmVudHMuY2xlYXIoKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWRpdF9tb25pdG9yL21haW4ucHkgYi90b29scy9lZGl0X21vbml0b3IvbWFpbi5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzJkMTgzCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvZWRpdF9tb25pdG9yL21haW4ucHkKQEAgLTAsMCArMSwxMTkgQEAKKyMgQ29weXJpZ2h0IDIwMjQsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IG9zCitpbXBvcnQgc2lnbmFsCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKKworZnJvbSBlZGl0X21vbml0b3IgaW1wb3J0IGRhZW1vbl9tYW5hZ2VyCitmcm9tIGVkaXRfbW9uaXRvciBpbXBvcnQgZWRpdF9tb25pdG9yCisKKworZGVmIGNyZWF0ZV9hcmdfcGFyc2VyKCk6CisgICIiIkNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIGRlZmF1bHQgYXJnIHBhcnNlci4iIiIKKworICBwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcigKKyAgICAgIGRlc2NyaXB0aW9uPSgKKyAgICAgICAgICAnTW9uaXRvcnMgZWRpdHMgaW4gQW5kcm9pZCBzb3VyY2UgY29kZSBhbmQgdXBsb2FkcyB0aGUgZWRpdCBsb2dzLicKKyAgICAgICksCisgICAgICBhZGRfaGVscD1UcnVlLAorICAgICAgZm9ybWF0dGVyX2NsYXNzPWFyZ3BhcnNlLlJhd0Rlc2NyaXB0aW9uSGVscEZvcm1hdHRlciwKKyAgKQorCisgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAnLS1wYXRoJywKKyAgICAgIHR5cGU9c3RyLAorICAgICAgcmVxdWlyZWQ9VHJ1ZSwKKyAgICAgIGhlbHA9J1Jvb3QgcGF0aCB0byBtb25pdG9yIHRoZSBlZGl0IGV2ZW50cy4nLAorICApCisKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICctLWRyeV9ydW4nLAorICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgIGhlbHA9J0RyeSBydW4gdGhlIGVkaXQgbW9uaXRvci4gVGhpcyBzdGFydHMgdGhlIGVkaXQgbW9uaXRvciBwcm9jZXNzIHdpdGhvdXQgYWN0dWFsbHkgc2VuZCB0aGUgZWRpdCBsb2dzIHRvIGNsZWFyY3V0LicsCisgICkKKworICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgJy0tZm9yY2VfY2xlYW51cCcsCisgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAorICAgICAgaGVscD0oCisgICAgICAgICAgJ0luc3RlYWQgb2Ygc3RhcnQgYSBuZXcgZWRpdCBtb25pdG9yLCBmb3JjZSBzdG9wIGFsbCBleGlzdGluZyBlZGl0JworICAgICAgICAgICcgbW9uaXRvcnMgaW4gdGhlIHN5c3RlbS4gVGhpcyBvcHRpb24gaXMgb25seSB1c2VkIGluIGVtZXJnZW50IGNhc2VzJworICAgICAgICAgICcgd2hlbiB3ZSB3YW50IHRvIHByZXZlbnQgdXNlciBkYW1hZ2UgYnkgdGhlIGVkaXQgbW9uaXRvci4nCisgICAgICApLAorICApCisKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgKKyAgICAgICctLXZlcmJvc2UnLAorICAgICAgYWN0aW9uPSdzdG9yZV90cnVlJywKKyAgICAgIGhlbHA9KAorICAgICAgICAgICdMb2cgdmVyYm9zZSBpbmZvIGluIHRoZSBsb2cgZmlsZSBmb3IgZGVidWdnaW5nIHB1cnBvc2UuJworICAgICAgKSwKKyAgKQorCisgIHJldHVybiBwYXJzZXIKKworCitkZWYgY29uZmlndXJlX2xvZ2dpbmcodmVyYm9zZT1GYWxzZSk6CisgIHJvb3RfbG9nZ2luZ19kaXIgPSB0ZW1wZmlsZS5ta2R0ZW1wKHByZWZpeD0nZWRpdF9tb25pdG9yXycpCisgIF8sIGxvZ19wYXRoID0gdGVtcGZpbGUubWtzdGVtcChkaXI9cm9vdF9sb2dnaW5nX2Rpciwgc3VmZml4PScubG9nJykKKworCisgIGxvZ19mbXQgPSAnJShhc2N0aW1lKXMuJShtc2VjcykwM2QgJShmaWxlbmFtZSlzOiUobGluZW5vKXM6JShsZXZlbG5hbWUpczogJShtZXNzYWdlKXMnCisgIGRhdGVfZm10ID0gJyVZLSVtLSVkICVIOiVNOiVTJworICBsb2dfbGV2ZWwgPSBsb2dnaW5nLkRFQlVHIGlmIHZlcmJvc2UgZWxzZSBsb2dnaW5nLklORk8KKworICBsb2dnaW5nLmJhc2ljQ29uZmlnKAorICAgICAgZmlsZW5hbWU9bG9nX3BhdGgsIGxldmVsPWxvZ19sZXZlbCwgZm9ybWF0PWxvZ19mbXQsIGRhdGVmbXQ9ZGF0ZV9mbXQKKyAgKQorICAjIEZpbHRlciBvdXQgbG9ncyBmcm9tIGlub3RpZnlfYnVmZiB0byBwcmV2ZW50IGxvZyBwb2xsdXRpb24uCisgIGxvZ2dpbmcuZ2V0TG9nZ2VyKCd3YXRjaGRvZy5vYnNlcnZlcnMuaW5vdGlmeV9idWZmZXInKS5hZGRGaWx0ZXIoCisgICAgICBsYW1iZGEgcmVjb3JkOiByZWNvcmQuZmlsZW5hbWUgIT0gJ2lub3RpZnlfYnVmZmVyLnB5JykKKyAgcHJpbnQoZidsb2dnaW5nIHRvIGZpbGUge2xvZ19wYXRofScpCisKKworZGVmIHRlcm1fc2lnbmFsX2hhbmRsZXIoX3NpZ25hbF9udW1iZXIsIF9mcmFtZSk6CisgIGxvZ2dpbmcuaW5mbygnUHJvY2VzcyAlZCByZWNlaXZlZCBTSUdURVJNLCBUZXJtaW5hdGluZy4uLicsIG9zLmdldHBpZCgpKQorICBzeXMuZXhpdCgwKQorCisKK2RlZiBtYWluKGFyZ3Y6IGxpc3Rbc3RyXSk6CisgIGFyZ3MgPSBjcmVhdGVfYXJnX3BhcnNlcigpLnBhcnNlX2FyZ3MoYXJndlsxOl0pCisgIGNvbmZpZ3VyZV9sb2dnaW5nKGFyZ3MudmVyYm9zZSkKKyAgaWYgYXJncy5kcnlfcnVuOgorICAgIGxvZ2dpbmcuaW5mbygnVGhpcyBpcyBhIGRyeSBydW4uJykKKyAgZG0gPSBkYWVtb25fbWFuYWdlci5EYWVtb25NYW5hZ2VyKAorICAgICAgYmluYXJ5X3BhdGg9YXJndlswXSwKKyAgICAgIGRhZW1vbl90YXJnZXQ9ZWRpdF9tb25pdG9yLnN0YXJ0LAorICAgICAgZGFlbW9uX2FyZ3M9KGFyZ3MucGF0aCwgYXJncy5kcnlfcnVuKSwKKyAgKQorCisgIHRyeToKKyAgICBpZiBhcmdzLmZvcmNlX2NsZWFudXA6CisgICAgICBkbS5jbGVhbnVwKCkKKyAgICBlbHNlOgorICAgICAgZG0uc3RhcnQoKQorICAgICAgZG0ubW9uaXRvcl9kYWVtb24oKQorICBleGNlcHQgRXhjZXB0aW9uOgorICAgIGxvZ2dpbmcuZXhjZXB0aW9uKCdVbmV4cGVjdGVkIGV4Y2VwdGlvbiByYWlzZWQgd2hlbiBydW4gZGFlbW9uLicpCisgIGZpbmFsbHk6CisgICAgZG0uc3RvcCgpCisKKworaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKKyAgc2lnbmFsLnNpZ25hbChzaWduYWwuU0lHVEVSTSwgdGVybV9zaWduYWxfaGFuZGxlcikKKyAgbWFpbihzeXMuYXJndikKZGlmZiAtLWdpdCBhL3Rvb2xzL2VkaXRfbW9uaXRvci9wcm90by9lZGl0X2V2ZW50LnByb3RvIGIvdG9vbHMvZWRpdF9tb25pdG9yL3Byb3RvL2VkaXRfZXZlbnQucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFjYzJlNwotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2VkaXRfbW9uaXRvci9wcm90by9lZGl0X2V2ZW50LnByb3RvCkBAIC0wLDAgKzEsNTcgQEAKK3N5bnRheCA9ICJwcm90bzMiOworCitwYWNrYWdlIHRvb2xzLmFzdWl0ZS5lZGl0X21vbml0b3I7CisKK21lc3NhZ2UgRWRpdEV2ZW50IHsKKyAgZW51bSBFZGl0VHlwZSB7CisgICAgVU5TVVBQT1JURURfVFlQRSA9IDA7CisgICAgQ1JFQVRFID0gMTsKKyAgICBNT0RJRlkgPSAyOworICAgIERFTEVURSA9IDM7CisgICAgTU9WRSA9IDQ7CisgIH0KKworICBlbnVtIEVycm9yVHlwZSB7CisgICAgVU5LTk9XTl9FUlJPUiA9IDA7CisgICAgRkFJTEVEX1RPX1NUQVJUX0VESVRfTU9OSVRPUiA9IDE7CisgICAgRkFJTEVEX1RPX1NUT1BfRURJVF9NT05JVE9SID0gMjsKKyAgICBGQUlMRURfVE9fUkVCT09UX0VESVRfTU9OSVRPUiA9IDM7CisgICAgS0lMTEVEX0RVRV9UT19FWENFRURFRF9NRU1PUllfVVNBR0UgPSA0OworICAgIEZPUkNFX0NMRUFOVVAgPSA1OworICAgIEtJTExFRF9EVUVfVE9fRVhDRUVERURfQ1BVX1VTQUdFID0gNjsKKyAgfQorCisgIC8vIEV2ZW50IHRoYXQgbG9ncyBhIHNpbmdsZSBlZGl0CisgIG1lc3NhZ2UgU2luZ2xlRWRpdEV2ZW50IHsKKyAgICAvLyBGdWxsIHBhdGggb2YgdGhlIGZpbGUgdGhhdCBlZGl0ZWQuCisgICAgc3RyaW5nIGZpbGVfcGF0aCA9IDE7CisgICAgLy8gVHlwZSBvZiB0aGUgZWRpdC4KKyAgICBFZGl0VHlwZSBlZGl0X3R5cGUgPSAyOworICB9CisKKyAgLy8gRXZlbnQgdGhhdCBsb2dzIGFnZ3JlZ2F0ZWQgaW5mbyBmb3IgYSBzZXQgb2YgZWRpdHMuCisgIG1lc3NhZ2UgQWdncmVnYXRlZEVkaXRFdmVudCB7CisgICAgaW50MzIgbnVtX2VkaXRzID0gMTsKKyAgfQorCisgIC8vIEV2ZW50IHRoYXQgbG9ncyBlcnJvcnMgaGFwcGVuZWQgaW4gdGhlIGVkaXQgbW9uaXRvci4KKyAgbWVzc2FnZSBFZGl0TW9uaXRvckVycm9yRXZlbnQgeworICAgIEVycm9yVHlwZSBlcnJvcl90eXBlID0gMTsKKyAgfQorCisgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBGSUVMRFMgRk9SIEVkaXRFdmVudAorICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gSW50ZXJuYWwgdXNlciBuYW1lLgorICBzdHJpbmcgdXNlcl9uYW1lID0gMTsKKyAgLy8gVGhlIHJvb3Qgb2YgQW5kcm9pZCBzb3VyY2UuCisgIHN0cmluZyBzb3VyY2Vfcm9vdCA9IDI7CisgIC8vIE5hbWUgb2YgdGhlIGhvc3Qgd29ya3N0YXRpb24uCisgIHN0cmluZyBob3N0X25hbWUgPSAzOworCisgIG9uZW9mIGV2ZW50IHsKKyAgICBTaW5nbGVFZGl0RXZlbnQgc2luZ2xlX2VkaXRfZXZlbnQgPSA0OworICAgIEFnZ3JlZ2F0ZWRFZGl0RXZlbnQgYWdncmVnYXRlZF9lZGl0X2V2ZW50ID0gNTsKKyAgICBFZGl0TW9uaXRvckVycm9yRXZlbnQgZWRpdF9tb25pdG9yX2Vycm9yX2V2ZW50ID0gNjsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZWRpdF9tb25pdG9yL3V0aWxzLnB5IGIvdG9vbHMvZWRpdF9tb25pdG9yL3V0aWxzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4ODk0OWQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9lZGl0X21vbml0b3IvdXRpbHMucHkKQEAgLTAsMCArMSw1MyBAQAorIyBDb3B5cmlnaHQgMjAyNCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgaGFzaGxpYgoraW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBvcworCisKK2RlZiBpc19mZWF0dXJlX2VuYWJsZWQoCisgICAgZmVhdHVyZV9uYW1lOiBzdHIsCisgICAgdXNlcl9uYW1lOiBzdHIsCisgICAgZW5hYmxlX2ZsYWc6IHN0ciA9IE5vbmUsCisgICAgcm9sbG91dF9wZXJjZW50OiBpbnQgPSAxMDAsCispIC0+IGJvb2w6CisgICIiIkRldGVybWluZSB3aGV0aGVyIHRoZSBnaXZlbiBmZWF0dXJlIGlzIGVuYWJsZWQuCisKKyAgV2hldGhlciBhIGdpdmVuIGZlYXR1cmUgaXMgZW5hYmxlZCBvciBub3QgZGVwZW5kcyBvbiB0d28gZmxhZ3M6IDEpIHRoZQorICBlbmFibGVfZmxhZyB0aGF0IGV4cGxpY2l0bHkgZW5hYmxlL2Rpc2FibGUgdGhlIGZlYXR1cmUgYW5kIDIpIHRoZSByb2xsb3V0X2ZsYWcKKyAgdGhhdCBjb250cm9scyB0aGUgcm9sbG91dCBwZXJjZW50YWdlLgorCisgIEFyZ3M6CisgICAgZmVhdHVyZV9uYW1lOiBuYW1lIG9mIHRoZSBmZWF0dXJlLgorICAgIHVzZXJfbmFtZTogc3lzdGVtIHVzZXIgbmFtZS4KKyAgICBlbmFibGVfZmxhZzogbmFtZSBvZiB0aGUgZW52IHZhciB0aGF0IGVuYWJsZXMvZGlzYWJsZXMgdGhlIGZlYXR1cmUKKyAgICAgIGV4cGxpY2l0bHkuCisgICAgcm9sbG91dF9mbGc6IG5hbWUgb2YgdGhlIGVudiB2YXIgdGhhdCBjb250cm9scyB0aGUgcm9sbG91dCBwZXJjZW50YWdlLCB0aGUKKyAgICAgIHZhbHVlIHN0b3JlZCBpbiB0aGUgZW52IHZhciBzaG91bGQgYmUgYW4gaW50IGJldHdlZW4gMCBhbmQgMTAwIHN0cmluZworICAiIiIKKyAgaWYgZW5hYmxlX2ZsYWc6CisgICAgaWYgb3MuZW52aXJvbi5nZXQoZW5hYmxlX2ZsYWcsICIiKSA9PSAiZmFsc2UiOgorICAgICAgbG9nZ2luZy5pbmZvKCJmZWF0dXJlOiAlcyBpcyBkaXNhYmxlZCIsIGZlYXR1cmVfbmFtZSkKKyAgICAgIHJldHVybiBGYWxzZQorCisgICAgaWYgb3MuZW52aXJvbi5nZXQoZW5hYmxlX2ZsYWcsICIiKSA9PSAidHJ1ZSI6CisgICAgICBsb2dnaW5nLmluZm8oImZlYXR1cmU6ICVzIGlzIGVuYWJsZWQiLCBmZWF0dXJlX25hbWUpCisgICAgICByZXR1cm4gVHJ1ZQorCisgIGhhc2hfb2JqZWN0ID0gaGFzaGxpYi5zaGEyNTYoKQorICBoYXNoX29iamVjdC51cGRhdGUoKHVzZXJfbmFtZSArIGZlYXR1cmVfbmFtZSkuZW5jb2RlKCJ1dGYtOCIpKQorICBoYXNoX251bWJlciA9IGludChoYXNoX29iamVjdC5oZXhkaWdlc3QoKSwgMTYpICUgMTAwCisKKyAgcmV0dXJuIGhhc2hfbnVtYmVyIDwgcm9sbG91dF9wZXJjZW50CmRpZmYgLS1naXQgYS90b29scy9lZGl0X21vbml0b3IvdXRpbHNfdGVzdC5weSBiL3Rvb2xzL2VkaXRfbW9uaXRvci91dGlsc190ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjMzBhYTEKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9lZGl0X21vbml0b3IvdXRpbHNfdGVzdC5weQpAQCAtMCwwICsxLDcxIEBACisjIENvcHlyaWdodCAyMDI0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyIiIlVuaXR0ZXN0cyBmb3IgZWRpdCBtb25pdG9yIHV0aWxzLiIiIgoraW1wb3J0IG9zCitpbXBvcnQgdW5pdHRlc3QKK2Zyb20gdW5pdHRlc3QgaW1wb3J0IG1vY2sKKworZnJvbSBlZGl0X21vbml0b3IgaW1wb3J0IHV0aWxzCisKK1RFU1RfVVNFUiA9ICd0ZXN0X3VzZXInCitURVNUX0ZFQVRVUkUgPSAndGVzdF9mZWF0dXJlJworRU5BQkxFX1RFU1RfRkVBVFVSRV9GTEFHID0gJ0VOQUJMRV9URVNUX0ZFQVRVUkUnCitST0xMT1VUX1RFU1RfRkVBVFVSRV9GTEFHID0gJ1JPTExPVVRfVEVTVF9GRUFUVVJFJworCisKK2NsYXNzIEVuYWJsZUZlYXR1cmVUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgdGVzdF9mZWF0dXJlX2VuYWJsZWRfd2l0aG91dF9mbGFnKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1dGlscy5pc19mZWF0dXJlX2VuYWJsZWQoVEVTVF9GRUFUVVJFLCBURVNUX1VTRVIpKQorCisgIEBtb2NrLnBhdGNoLmRpY3Qob3MuZW52aXJvbiwge0VOQUJMRV9URVNUX0ZFQVRVUkVfRkxBRzogJ2ZhbHNlJ30sIGNsZWFyPVRydWUpCisgIGRlZiB0ZXN0X2ZlYXR1cmVfZGlzYWJsZWRfd2l0aF9mbGFnKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RmFsc2UoCisgICAgICAgIHV0aWxzLmlzX2ZlYXR1cmVfZW5hYmxlZCgKKyAgICAgICAgICAgIFRFU1RfRkVBVFVSRSwgVEVTVF9VU0VSLCBFTkFCTEVfVEVTVF9GRUFUVVJFX0ZMQUcKKyAgICAgICAgKQorICAgICkKKworICBAbW9jay5wYXRjaC5kaWN0KG9zLmVudmlyb24sIHtFTkFCTEVfVEVTVF9GRUFUVVJFX0ZMQUc6ICd0cnVlJ30sIGNsZWFyPVRydWUpCisgIGRlZiB0ZXN0X2ZlYXR1cmVfZW5hYmxlZF93aXRoX2ZsYWcoc2VsZik6CisgICAgc2VsZi5hc3NlcnRUcnVlKAorICAgICAgICB1dGlscy5pc19mZWF0dXJlX2VuYWJsZWQoCisgICAgICAgICAgICBURVNUX0ZFQVRVUkUsIFRFU1RfVVNFUiwgRU5BQkxFX1RFU1RfRkVBVFVSRV9GTEFHCisgICAgICAgICkKKyAgICApCisKKyAgZGVmIHRlc3RfZmVhdHVyZV9lbmFibGVkX3dpdGhfcm9sbG91dF9wZXJjZW50YWdlKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKKyAgICAgICAgdXRpbHMuaXNfZmVhdHVyZV9lbmFibGVkKAorICAgICAgICAgICAgVEVTVF9GRUFUVVJFLAorICAgICAgICAgICAgVEVTVF9VU0VSLAorICAgICAgICAgICAgRU5BQkxFX1RFU1RfRkVBVFVSRV9GTEFHLAorICAgICAgICAgICAgOTAsCisgICAgICAgICkKKyAgICApCisKKyAgZGVmIHRlc3RfZmVhdHVyZV9kaXNhYmxlZF93aXRoX3JvbGxvdXRfcGVyY2VudGFnZShzZWxmKToKKyAgICBzZWxmLmFzc2VydEZhbHNlKAorICAgICAgICB1dGlscy5pc19mZWF0dXJlX2VuYWJsZWQoCisgICAgICAgICAgICBURVNUX0ZFQVRVUkUsCisgICAgICAgICAgICBURVNUX1VTRVIsCisgICAgICAgICAgICBFTkFCTEVfVEVTVF9GRUFUVVJFX0ZMQUcsCisgICAgICAgICAgICAxMCwKKyAgICAgICAgKQorICAgICkKKworCitpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgorICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL2V2ZW50X2xvZ190YWdzLnB5IGIvdG9vbHMvZXZlbnRfbG9nX3RhZ3MucHkKaW5kZXggYTZhZTlmMS4uZTg1OWI2YiAxMDA2NDQKLS0tIGEvdG9vbHMvZXZlbnRfbG9nX3RhZ3MucHkKKysrIGIvdG9vbHMvZXZlbnRfbG9nX3RhZ3MucHkKQEAgLTE0LDIxICsxNCwyMSBAQAogCiAiIiJBIG1vZHVsZSBmb3IgcmVhZGluZyBhbmQgcGFyc2luZyBldmVudC1sb2ctdGFncyBmaWxlcy4iIiIKIAoraW1wb3J0IGRhdGFjbGFzc2VzCiBpbXBvcnQgcmUKIGltcG9ydCBzeXMKK2Zyb20gdHlwaW5nIGltcG9ydCBPcHRpb25hbAogCi1jbGFzcyBUYWcob2JqZWN0KToKLSAgX19zbG90c19fID0gWyJ0YWdudW0iLCAidGFnbmFtZSIsICJkZXNjcmlwdGlvbiIsICJmaWxlbmFtZSIsICJsaW5lbnVtIl0KLQotICBkZWYgX19pbml0X18oc2VsZiwgdGFnbnVtLCB0YWduYW1lLCBkZXNjcmlwdGlvbiwgZmlsZW5hbWUsIGxpbmVudW0pOgotICAgIHNlbGYudGFnbnVtID0gdGFnbnVtCi0gICAgc2VsZi50YWduYW1lID0gdGFnbmFtZQotICAgIHNlbGYuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbgotICAgIHNlbGYuZmlsZW5hbWUgPSBmaWxlbmFtZQotICAgIHNlbGYubGluZW51bSA9IGxpbmVudW0KK0BkYXRhY2xhc3Nlcy5kYXRhY2xhc3MKK2NsYXNzIFRhZzoKKyAgdGFnbnVtOiBpbnQKKyAgdGFnbmFtZTogc3RyCisgIGRlc2NyaXB0aW9uOiBPcHRpb25hbFtzdHJdCisgIGZpbGVuYW1lOiBzdHIKKyAgbGluZW51bTogaW50CiAKIAotY2xhc3MgVGFnRmlsZShvYmplY3QpOgorY2xhc3MgVGFnRmlsZToKICAgIiIiUmVhZCBhbiBpbnB1dCBldmVudC1sb2ctdGFncyBmaWxlLiIiIgogICBkZWYgQWRkRXJyb3Ioc2VsZiwgbXNnLCBsaW5lbnVtPU5vbmUpOgogICAgIGlmIGxpbmVudW0gaXMgTm9uZToKQEAgLTc2LDE0ICs3NiwxMSBAQAogICAgICAgICAgIHNlbGYub3B0aW9uc1twYXJ0c1sxXV0gPSBwYXJ0c1syOl0KICAgICAgICAgICBjb250aW51ZQogCi0gICAgICAgIGlmIHBhcnRzWzBdID09ICI/IjoKLSAgICAgICAgICB0YWcgPSBOb25lCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgdHJ5OgotICAgICAgICAgICAgdGFnID0gaW50KHBhcnRzWzBdKQotICAgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgotICAgICAgICAgICAgc2VsZi5BZGRFcnJvcigiXCIlc1wiIGlzbid0IGFuIGludGVnZXIgdGFnIG9yICc/JyIgJSAocGFydHNbMF0sKSkKLSAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHRyeToKKyAgICAgICAgICB0YWcgPSBpbnQocGFydHNbMF0pCisgICAgICAgIGV4Y2VwdCBWYWx1ZUVycm9yOgorICAgICAgICAgIHNlbGYuQWRkRXJyb3IoIlwiJXNcIiBpc24ndCBhbiBpbnRlZ2VyIHRhZyIgJSAocGFydHNbMF0sKSkKKyAgICAgICAgICBjb250aW51ZQogCiAgICAgICAgIHRhZ25hbWUgPSBwYXJ0c1sxXQogICAgICAgICBpZiBsZW4ocGFydHMpID09IDM6CkBAIC0xMjgsOCArMTI1LDggQEAKICAgICAgIG91dCA9IHN5cy5zdGRvdXQKICAgICAgIG91dHB1dF9maWxlID0gIjxzdGRvdXQ+IgogICAgIGVsc2U6Ci0gICAgICBvdXQgPSBvcGVuKG91dHB1dF9maWxlLCAid2IiKQotICAgIG91dC53cml0ZShzdHIuZW5jb2RlKGRhdGEpKQorICAgICAgb3V0ID0gb3BlbihvdXRwdXRfZmlsZSwgInciKQorICAgIG91dC53cml0ZShkYXRhKQogICAgIG91dC5jbG9zZSgpCiAgIGV4Y2VwdCAoSU9FcnJvciwgT1NFcnJvcikgYXMgZToKICAgICBwcmludCgiZmFpbGVkIHRvIHdyaXRlICVzOiAlcyIgJSAob3V0cHV0X2ZpbGUsIGUpLCBmaWxlPXN5cy5zdGRlcnIpCmRpZmYgLS1naXQgYS90b29scy9maWxlbGlzdGRpZmYvQW5kcm9pZC5icCBiL3Rvb2xzL2ZpbGVsaXN0ZGlmZi9BbmRyb2lkLmJwCmluZGV4IGFiNzY2ZDYuLjM4MjZlNTAgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2ZpbGVsaXN0ZGlmZi9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL2ZpbGVsaXN0ZGlmZi9BbmRyb2lkLmJwCkBAIC0yNCw0ICsyNCw5IEBACiBwcmVidWlsdF9ldGNfaG9zdCB7CiAgICAgbmFtZTogInN5c3RlbV9pbWFnZV9kaWZmX2FsbG93bGlzdCIsCiAgICAgc3JjOiAiYWxsb3dsaXN0IiwKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCit9CisKK3ByZWJ1aWx0X2V0Y19ob3N0IHsKKyAgICBuYW1lOiAic3lzdGVtX2ltYWdlX2RpZmZfYWxsb3dsaXN0X25leHQiLAorICAgIHNyYzogImFsbG93bGlzdF9uZXh0IiwKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbGVsaXN0ZGlmZi9PV05FUlMgYi90b29scy9maWxlbGlzdGRpZmYvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5MGZiMTcKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9maWxlbGlzdGRpZmYvT1dORVJTCkBAIC0wLDAgKzEgQEAKK3Blci1maWxlIGFsbG93bGlzdCA9IGp1c3Rpbnl1bkBnb29nbGUuY29tLCBqZW9uZ2lrQGdvb2dsZS5jb20sIGtpeW91bmdraW1AZ29vZ2xlLmNvbSwgaW5zZW9iQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbGVsaXN0ZGlmZi9hbGxvd2xpc3QgYi90b29scy9maWxlbGlzdGRpZmYvYWxsb3dsaXN0CmluZGV4IGM0YTQ2NGQuLmQ4OTc5ZDYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2ZpbGVsaXN0ZGlmZi9hbGxvd2xpc3QKKysrIGIvdG9vbHMvZmlsZWxpc3RkaWZmL2FsbG93bGlzdApAQCAtMSw0OSArMSwzIEBACi0jIEtub3duIGRpZmZzIG9ubHkgaW4gdGhlIEtBVEkgc3lzdGVtIGltYWdlCi1ldGMvTk9USUNFLnhtbC5negotZnJhbWV3b3JrL29hdC94ODZfNjQvYXBleEBjb20uYW5kcm9pZC5jb21wb3NAamF2YWxpYkBzZXJ2aWNlLWNvbXBvcy5qYXJAY2xhc3Nlcy5vZGV4Ci1mcmFtZXdvcmsvb2F0L3g4Nl82NC9hcGV4QGNvbS5hbmRyb2lkLmNvbXBvc0BqYXZhbGliQHNlcnZpY2UtY29tcG9zLmphckBjbGFzc2VzLm9kZXguZnN2X21ldGEKLWZyYW1ld29yay9vYXQveDg2XzY0L2FwZXhAY29tLmFuZHJvaWQuY29tcG9zQGphdmFsaWJAc2VydmljZS1jb21wb3MuamFyQGNsYXNzZXMudmRleAotZnJhbWV3b3JrL29hdC94ODZfNjQvYXBleEBjb20uYW5kcm9pZC5jb21wb3NAamF2YWxpYkBzZXJ2aWNlLWNvbXBvcy5qYXJAY2xhc3Nlcy52ZGV4LmZzdl9tZXRhCi1saWIvYWF1ZGlvLWFpZGwtY3BwLnNvCi1saWIvYW5kcm9pZC5oYXJkd2FyZS5iaW9tZXRyaWNzLmZpbmdlcnByaW50QDIuMS5zbwotbGliL2FuZHJvaWQuaGFyZHdhcmUucmFkaW8uY29uZmlnQDEuMC5zbwotbGliL2FuZHJvaWQuaGFyZHdhcmUucmFkaW8uZGVwcmVjYXRlZEAxLjAuc28KLWxpYi9hbmRyb2lkLmhhcmR3YXJlLnJhZGlvQDEuMC5zbwotbGliL2FuZHJvaWQuaGFyZHdhcmUucmFkaW9AMS4xLnNvCi1saWIvYW5kcm9pZC5oYXJkd2FyZS5yYWRpb0AxLjIuc28KLWxpYi9hbmRyb2lkLmhhcmR3YXJlLnJhZGlvQDEuMy5zbwotbGliL2FuZHJvaWQuaGFyZHdhcmUucmFkaW9AMS40LnNvCi1saWIvYW5kcm9pZC5oYXJkd2FyZS5zZWN1cmVfZWxlbWVudEAxLjAuc28KLWxpYi9jb20uYW5kcm9pZC5tZWRpYS5hYXVkaW8tYWNvbmZpZy1jYy5zbwotbGliL2hlYXBwcm9mZF9jbGllbnQuc28KLWxpYi9oZWFwcHJvZmRfY2xpZW50X2FwaS5zbwotbGliL2xpYmFhdWRpby5zbwotbGliL2xpYmFhdWRpb19pbnRlcm5hbC5zbwotbGliL2xpYmFsYXJtX2puaS5zbwotbGliL2xpYmFtaWRpLnNvCi1saWIvbGliY3Vwcy5zbwotbGliL2xpYmpuaV9kZXZpY2VBc1dlYmNhbS5zbwotbGliL2xpYnByaW50c3Bvb2xlcl9qbmkuc28KLWxpYi9saWJ2ZW5kb3JzdXBwb3J0LnNvCi1saWIvbGlid2Zkcy5zbwotbGliL2xpYnl1di5zbwotCi0jIGIvMzUxMjU4NDYxCi1hZGJfa2V5cworIyBLbm93biBkaWZmcyB0aGF0IGFyZSBpbnN0YWxsZWQgaW4gZWl0aGVyIHN5c3RlbSBpbWFnZSB3aXRoIHRoZSBjb25maWd1cmF0aW9uCisjIGIvMzUzNDI5NDIyCiBpbml0LmVudmlyb24ucmMKLQotIyBLbm93biBkaWZmcyBvbmx5IGluIHRoZSBTb29uZyBzeXN0ZW0gaW1hZ2UKLWxpYi9saWJoaWRjb21tYW5kX2puaS5zbwotbGliL2xpYnVpbnB1dGNvbW1hbmRfam5pLnNvCi0KLSMgS25vd24gZGlmZnMgaW4gaW50ZXJuYWwgc291cmNlCi1iaW4vdXByb2Jlc3RhdHMKLWV0Yy9hY29uZmlnL2ZsYWcubWFwCi1ldGMvYWNvbmZpZy9mbGFnLnZhbAotZXRjL2Fjb25maWcvcGFja2FnZS5tYXAKLWV0Yy9icGYvdXByb2Jlc3RhdHMvQml0bWFwQWxsb2NhdGlvbi5vCi1ldGMvYnBmL3Vwcm9iZXN0YXRzL0dlbmVyaWNJbnN0cnVtZW50YXRpb24ubwotZXRjL2luaXQvVXByb2JlU3RhdHMucmMKLWxpYi9saWJ1cHJvYmVzdGF0c19jbGllbnQuc28KLWxpYjY0L2xpYnVwcm9iZXN0YXRzX2NsaWVudC5zbwotcHJpdi1hcHAvRGV2aWNlRGlhZ25vc3RpY3MvRGV2aWNlRGlhZ25vc3RpY3MuYXBrClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvZmlsZWxpc3RkaWZmL2FsbG93bGlzdF9uZXh0IGIvdG9vbHMvZmlsZWxpc3RkaWZmL2FsbG93bGlzdF9uZXh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYzdmMzQKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9maWxlbGlzdGRpZmYvYWxsb3dsaXN0X25leHQKQEAgLTAsMCArMSwzIEBACisjIEFsbG93bGlzdCBvbmx5IGZvciB0aGUgbmV4dCByZWxlYXNlIGNvbmZpZ3VyYXRpb24uCisjIFRPRE8oYi8zNjk2NzgxMjIpOiBUaGUgbGlzdCB3aWxsIGJlIGNsZWFyZWQgd2hlbiB0aGUgdHJ1bmsgY29uZmlndXJhdGlvbnMgYXJlCisjIGF2YWlsYWJsZSB0byB0aGUgbmV4dC4KZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbGVsaXN0ZGlmZi9maWxlX2xpc3RfZGlmZi5weSBiL3Rvb2xzL2ZpbGVsaXN0ZGlmZi9maWxlX2xpc3RfZGlmZi5weQppbmRleCBjZGM1YjJlLi5hNjQwOGU4IDEwMDY0NAotLS0gYS90b29scy9maWxlbGlzdGRpZmYvZmlsZV9saXN0X2RpZmYucHkKKysrIGIvdG9vbHMvZmlsZWxpc3RkaWZmL2ZpbGVfbGlzdF9kaWZmLnB5CkBAIC0xOSwzOCArMTksNTQgQEAKIENPTE9SX0VSUk9SID0gJ1wwMzNbOTFtJwogQ09MT1JfTk9STUFMID0gJ1wwMzNbMG0nCiAKLWRlZiBmaW5kX3VuaXF1ZV9pdGVtcyhrYXRpX2luc3RhbGxlZF9maWxlcywgc29vbmdfaW5zdGFsbGVkX2ZpbGVzLCBhbGxvd2xpc3QsIHN5c3RlbV9tb2R1bGVfbmFtZSk6CitkZWYgZmluZF91bmlxdWVfaXRlbXMoa2F0aV9pbnN0YWxsZWRfZmlsZXMsIHNvb25nX2luc3RhbGxlZF9maWxlcywgc3lzdGVtX21vZHVsZV9uYW1lLCBhbGxvd2xpc3RzKToKICAgICB3aXRoIG9wZW4oa2F0aV9pbnN0YWxsZWRfZmlsZXMsICdyJykgYXMga2F0aV9saXN0X2ZpbGUsIFwKLSAgICAgICAgICAgIG9wZW4oc29vbmdfaW5zdGFsbGVkX2ZpbGVzLCAncicpIGFzIHNvb25nX2xpc3RfZmlsZSwgXAotICAgICAgICAgICAgb3BlbihhbGxvd2xpc3QsICdyJykgYXMgYWxsb3dsaXN0X2ZpbGU6CisgICAgICAgICAgICBvcGVuKHNvb25nX2luc3RhbGxlZF9maWxlcywgJ3InKSBhcyBzb29uZ19saXN0X2ZpbGU6CiAgICAgICAgIGthdGlfZmlsZXMgPSBzZXQoa2F0aV9saXN0X2ZpbGUucmVhZCgpLnNwbGl0KCkpCiAgICAgICAgIHNvb25nX2ZpbGVzID0gc2V0KHNvb25nX2xpc3RfZmlsZS5yZWFkKCkuc3BsaXQoKSkKLSAgICAgICAgYWxsb3dlZF9maWxlcyA9IHNldChmaWx0ZXIobGFtYmRhIHg6IGxlbih4KSwgbWFwKGxhbWJkYSB4OiB4LmxzdHJpcCgpLnNwbGl0KCcjJywxKVswXS5yc3RyaXAoKSAsIGFsbG93bGlzdF9maWxlLnJlYWQoKS5zcGxpdCgnXG4nKSkpKQorCisgICAgYWxsb3dlZF9maWxlcyA9IHNldCgpCisgICAgZm9yIGFsbG93bGlzdCBpbiBhbGxvd2xpc3RzOgorICAgICAgICB3aXRoIG9wZW4oYWxsb3dsaXN0LCAncicpIGFzIGFsbG93bGlzdF9maWxlOgorICAgICAgICAgICAgYWxsb3dlZF9maWxlcy51cGRhdGUoc2V0KGZpbHRlcihsYW1iZGEgeDogbGVuKHgpLCBtYXAobGFtYmRhIHg6IHgubHN0cmlwKCkuc3BsaXQoJyMnLDEpWzBdLnJzdHJpcCgpICwgYWxsb3dsaXN0X2ZpbGUucmVhZCgpLnNwbGl0KCdcbicpKSkpKQogCiAgICAgZGVmIGlzX3Vua25vd25fZGlmZihmaWxlcGF0aCk6Ci0gICAgICAgIHJldHVybiBub3QgZmlsZXBhdGggaW4gYWxsb3dlZF9maWxlcworICAgICAgICByZXR1cm4gZmlsZXBhdGggbm90IGluIGFsbG93ZWRfZmlsZXMKKworICAgIGRlZiBpc191bm5lY2Vzc2FyeV9hbGxvd2xpc3QoZmlsZXBhdGgpOgorICAgICAgICByZXR1cm4gZmlsZXBhdGggbm90IGluIGthdGlfZmlsZXMuc3ltbWV0cmljX2RpZmZlcmVuY2Uoc29vbmdfZmlsZXMpCiAKICAgICB1bmlxdWVfaW5fa2F0aSA9IHNldChmaWx0ZXIoaXNfdW5rbm93bl9kaWZmLCBrYXRpX2ZpbGVzIC0gc29vbmdfZmlsZXMpKQogICAgIHVuaXF1ZV9pbl9zb29uZyA9IHNldChmaWx0ZXIoaXNfdW5rbm93bl9kaWZmLCBzb29uZ19maWxlcyAtIGthdGlfZmlsZXMpKQorICAgIHVubmVjZXNzYXJ5X2FsbG93bGlzdHMgPSBzZXQoZmlsdGVyKGlzX3VubmVjZXNzYXJ5X2FsbG93bGlzdCwgYWxsb3dlZF9maWxlcykpCiAKICAgICBpZiB1bmlxdWVfaW5fa2F0aToKLSAgICAgICAgcHJpbnQoZid7Q09MT1JfRVJST1J9UGxlYXNlIGFkZCBmb2xsb3dpbmcgbW9kdWxlcyBpbnRvIHN5c3RlbSBpbWFnZSBtb2R1bGUge3N5c3RlbV9tb2R1bGVfbmFtZX0ue0NPTE9SX05PUk1BTH0nKQotICAgICAgICBwcmludChmJ3tDT0xPUl9XQVJOSU5HfUtBVEkgb25seSBtb2R1bGUocyk6e0NPTE9SX05PUk1BTH0nKQorICAgICAgICBwcmludCgnJykKKyAgICAgICAgcHJpbnQoZid7Q09MT1JfRVJST1J9TWlzc2luZyByZXF1aXJlZCBtb2R1bGVzIGluIHtzeXN0ZW1fbW9kdWxlX25hbWV9IG1vZHVsZS57Q09MT1JfTk9STUFMfScpCisgICAgICAgIHByaW50KGYnVG8gcmVzb2x2ZSB0aGlzIGlzc3VlLCBwbGVhc2UgYWRkIHRoZSBtb2R1bGVzIHRvIHRoZSBBbmRyb2lkLmJwIGZpbGUgZm9yIHRoZSB7c3lzdGVtX21vZHVsZV9uYW1lfSB0byBpbnN0YWxsIHRoZSBmb2xsb3dpbmcgS0FUSSBvbmx5IGluc3RhbGxlZCBmaWxlcy4nKQorICAgICAgICBwcmludChmJ1lvdSBjYW4gZmluZCB0aGUgY29ycmVjdCBBbmRyb2lkLmJwIGZpbGUgdXNpbmcgdGhlIGNvbW1hbmQgImdvbW9kIHtzeXN0ZW1fbW9kdWxlX25hbWV9Ii4nKQorICAgICAgICBwcmludChmJ3tDT0xPUl9XQVJOSU5HfUtBVEkgb25seSBpbnN0YWxsZWQgZmlsZShzKTp7Q09MT1JfTk9STUFMfScpCiAgICAgICAgIGZvciBpdGVtIGluIHNvcnRlZCh1bmlxdWVfaW5fa2F0aSk6Ci0gICAgICAgICAgICBwcmludChpdGVtKQorICAgICAgICAgICAgcHJpbnQoJyAgJytpdGVtKQogCiAgICAgaWYgdW5pcXVlX2luX3Nvb25nOgotICAgICAgICBpZiB1bmlxdWVfaW5fa2F0aToKLSAgICAgICAgICAgIHByaW50KCcnKQotCi0gICAgICAgIHByaW50KGYne0NPTE9SX0VSUk9SfVBsZWFzZSBhZGQgZm9sbG93aW5nIG1vZHVsZXMgaW50byBidWlsZC9tYWtlL3RhcmdldC9wcm9kdWN0L2Jhc2Vfc3lzdGVtLm1rLntDT0xPUl9OT1JNQUx9JykKLSAgICAgICAgcHJpbnQoZid7Q09MT1JfV0FSTklOR31Tb29uZyBvbmx5IG1vZHVsZShzKTp7Q09MT1JfTk9STUFMfScpCi0gICAgICAgIGZvciBpdGVtIGluIHNvcnRlZCh1bmlxdWVfaW5fc29vbmcpOgotICAgICAgICAgICAgcHJpbnQoaXRlbSkKLQotICAgIGlmIHVuaXF1ZV9pbl9rYXRpIG9yIHVuaXF1ZV9pbl9zb29uZzoKICAgICAgICAgcHJpbnQoJycpCi0gICAgICAgIHByaW50KGYne0NPTE9SX0VSUk9SfUZBSUxFRDogU3lzdGVtIGltYWdlIGZyb20gS0FUSSBhbmQgU09PTkcgZGlmZmVycyBmcm9tIGluc3RhbGxlZCBmaWxlIGxpc3Que0NPTE9SX05PUk1BTH0nKQorICAgICAgICBwcmludChmJ3tDT0xPUl9FUlJPUn1NaXNzaW5nIHBhY2thZ2VzIGluIGJhc2Vfc3lzdGVtLm1rLntDT0xPUl9OT1JNQUx9JykKKyAgICAgICAgcHJpbnQoJ1BsZWFzZSBhZGQgcGFja2FnZXMgaW50byBidWlsZC9tYWtlL3RhcmdldC9wcm9kdWN0L2Jhc2Vfc3lzdGVtLm1rIG9yIGJ1aWxkL21ha2UvdG9vbHMvZmlsZWxpc3RkaWZmL2FsbG93bGlzdCB0byBpbnN0YWxsIG9yIHNraXAgdGhlIGZvbGxvd2luZyBTb29uZyBvbmx5IGluc3RhbGxlZCBmaWxlcy4nKQorICAgICAgICBwcmludChmJ3tDT0xPUl9XQVJOSU5HfVNvb25nIG9ubHkgaW5zdGFsbGVkIGZpbGUocyk6e0NPTE9SX05PUk1BTH0nKQorICAgICAgICBmb3IgaXRlbSBpbiBzb3J0ZWQodW5pcXVlX2luX3Nvb25nKToKKyAgICAgICAgICAgIHByaW50KCcgICcraXRlbSkKKworICAgIGlmIHVubmVjZXNzYXJ5X2FsbG93bGlzdHM6CisgICAgICAgIHByaW50KCcnKQorICAgICAgICBwcmludChmJ3tDT0xPUl9FUlJPUn1Vbm5lY2Vzc2FyeSBmaWxlcyBpbiBhbGxvd2xpc3Que0NPTE9SX05PUk1BTH0nKQorICAgICAgICBwcmludCgnUGxlYXNlIHJlbW92ZSB0aGVzZSBlbnRyaWVzIGZyb20gYnVpbGQvbWFrZS90b29scy9maWxlbGlzdGRpZmYvYWxsb3dsaXN0JykKKyAgICAgICAgZm9yIGl0ZW0gaW4gc29ydGVkKHVubmVjZXNzYXJ5X2FsbG93bGlzdHMpOgorICAgICAgICAgICAgcHJpbnQoJyAgJytpdGVtKQorCisKKyAgICBpZiB1bmlxdWVfaW5fa2F0aSBvciB1bmlxdWVfaW5fc29vbmcgb3IgdW5uZWNlc3NhcnlfYWxsb3dsaXN0czoKKyAgICAgICAgcHJpbnQoJycpCiAgICAgICAgIHN5cy5leGl0KDEpCiAKIApAQCAtNTksOCArNzUsOCBAQAogCiAgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgna2F0aV9pbnN0YWxsZWRfZmlsZV9saXN0JykKICAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdzb29uZ19pbnN0YWxsZWRfZmlsZV9saXN0JykKLSAgICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdhbGxvd2xpc3QnKQogICAgIHBhcnNlci5hZGRfYXJndW1lbnQoJ3N5c3RlbV9tb2R1bGVfbmFtZScpCisgICAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1hbGxvd2xpc3RzJywgbmFyZ3M9JyonLCBkZWZhdWx0PVtdKQogICAgIGFyZ3MgPSBwYXJzZXIucGFyc2VfYXJncygpCiAKLSAgICBmaW5kX3VuaXF1ZV9pdGVtcyhhcmdzLmthdGlfaW5zdGFsbGVkX2ZpbGVfbGlzdCwgYXJncy5zb29uZ19pbnN0YWxsZWRfZmlsZV9saXN0LCBhcmdzLmFsbG93bGlzdCwgYXJncy5zeXN0ZW1fbW9kdWxlX25hbWUpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorICAgIGZpbmRfdW5pcXVlX2l0ZW1zKGFyZ3Mua2F0aV9pbnN0YWxsZWRfZmlsZV9saXN0LCBhcmdzLnNvb25nX2luc3RhbGxlZF9maWxlX2xpc3QsIGFyZ3Muc3lzdGVtX21vZHVsZV9uYW1lLCBhcmdzLmFsbG93bGlzdHMpClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvZmluYWxpemF0aW9uL2J1aWxkLXN0ZXAtMC1hbmQtbS5zaCBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9idWlsZC1zdGVwLTAtYW5kLW0uc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDg0MzgwMAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9idWlsZC1zdGVwLTAtYW5kLW0uc2gKQEAgLTAsMCArMSwyMCBAQAorCisjIS9iaW4vYmFzaAorIyBDb3B5cmlnaHQgMjAyNCBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorc2V0IC1leAorZnVuY3Rpb24gaGVscCgpIHsKKyAgICBlY2hvICJGaW5hbGl6ZSBWSU5URiBhbmQgYnVpbGQgYSB0YXJnZXQgZm9yIHRlc3QuIgorICAgIGVjaG8gInVzYWdlOiAkKGJhc2VuYW1lICIkMCIpIHRhcmdldCBbZ29hbHMuLi5dIgorfQorZnVuY3Rpb24gZmluYWxpemVfbWFpbl9zdGVwMF9hbmRfbSgpIHsKKyAgICBpZiBbICQjID09IDAgXSA7IHRoZW4KKyAgICAgICAgaGVscAorICAgICAgICBleGl0IDEKKyAgICBmaTsKKyAgICBsb2NhbCB0b3A9IiQoZGlybmFtZSAiJDAiKSIvLi4vLi4vLi4vLi4KKyAgICBzb3VyY2UgJHRvcC9idWlsZC9tYWtlL3Rvb2xzL2ZpbmFsaXphdGlvbi9idWlsZC1zdGVwLTAuc2gKKyAgICBsb2NhbCBtPSIkdG9wL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1tYWtlLW1vZGUgVEFSR0VUX1BST0RVQ1Q9JDEgVEFSR0VUX1JFTEVBU0U9ZmluYV8wIFRBUkdFVF9CVUlMRF9WQVJJQU5UPXVzZXJkZWJ1ZyIKKyAgICAjIFRoaXMgY29tbWFuZCB0ZXN0cyB0aGUgcmVsZWFzZSBzdGF0ZSBmb3IgQUlETC4KKyAgICBBSURMX0ZST1pFTl9SRUw9dHJ1ZSAkbSAke0A6Mn0KK30KK2ZpbmFsaXplX21haW5fc3RlcDBfYW5kX20gJEAKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9idWlsZC1zdGVwLTAuc2ggYi90b29scy9maW5hbGl6YXRpb24vYnVpbGQtc3RlcC0wLnNoCmluZGV4IGY4MWI3MjAuLjg4MjZiMzUgMTAwNzU1Ci0tLSBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9idWlsZC1zdGVwLTAuc2gKKysrIGIvdG9vbHMvZmluYWxpemF0aW9uL2J1aWxkLXN0ZXAtMC5zaApAQCAtNywxMSArNywyNiBAQAogICAgIGxvY2FsIHRvcD0iJChkaXJuYW1lICIkMCIpIi8uLi8uLi8uLi8uLgogICAgIHNvdXJjZSAkdG9wL2J1aWxkL21ha2UvdG9vbHMvZmluYWxpemF0aW9uL2Vudmlyb25tZW50LnNoCiAKKyAgICBsb2NhbCBuZWVkX3ZpbnRmX2ZpbmFsaXplPWZhbHNlCiAgICAgaWYgWyAiJEZJTkFMX1NUQVRFIiA9ICJ1bmZpbmFsaXplZCIgXSA7IHRoZW4KLSAgICAgICAgIyBWSU5URiBmaW5hbGl6YXRpb24KKyAgICAgICAgbmVlZF92aW50Zl9maW5hbGl6ZT10cnVlCisgICAgZWxzZQorICAgICAgICAjIGJ1aWxkLXN0ZXAtMC5zaCB0ZXN0cyB0aGUgdmludGYgZmluYWxpemF0aW9uIHN0ZXAgKHN0ZXAtMCkgd2hlbiB0aGUKKyAgICAgICAgIyBGSU5BTF9CT0FSRF9BUElfTEVWRUwgaXMgdGhlIHNhbWUgYXMgdGhlIFJFTEVBU0VfQk9BUkRfQVBJX0xFVkVMOyBhbmQKKyAgICAgICAgIyBSRUxFQVNFX0JPQVJEX0FQSV9MRVZFTF9GUk9aRU4gaXMgbm90IHRydWUgZnJvbSB0aGUgZmluYV8wIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICMgVGhlIEZJTkFMX0JPQVJEX0FQSV9MRVZFTCBtdXN0IGJlIHRoZSBuZXh0IHZlbmRvciBBUEkgbGV2ZWwgdG8gYmUgZmluYWxpemVkLgorICAgICAgICBsb2NhbCBib2FyZF9hcGlfbGV2ZWxfdmFycz0kKFRBUkdFVF9SRUxFQVNFPWZpbmFfMCAkdG9wL2J1aWxkL3Nvb25nL3Nvb25nX3VpLmJhc2ggLS1kdW1wdmFycy1tb2RlIC12YXJzICJSRUxFQVNFX0JPQVJEX0FQSV9MRVZFTF9GUk9aRU4gUkVMRUFTRV9CT0FSRF9BUElfTEVWRUwiKQorICAgICAgICBsb2NhbCB0YXJnZXRfYm9hcmRfYXBpX2xldmVsX3ZhcnM9IlJFTEVBU0VfQk9BUkRfQVBJX0xFVkVMX0ZST1pFTj0nJworUkVMRUFTRV9CT0FSRF9BUElfTEVWRUw9JyRGSU5BTF9CT0FSRF9BUElfTEVWRUwnIgorICAgICAgICBpZiBbICIkYm9hcmRfYXBpX2xldmVsX3ZhcnMiID0gIiR0YXJnZXRfYm9hcmRfYXBpX2xldmVsX3ZhcnMiIF0gOyB0aGVuCisgICAgICAgICAgICBlY2hvIFRoZSB0YXJnZXQgaXMgYSBmaW5hbGl6YXRpb24gY2FuZGlkYXRlLgorICAgICAgICAgICAgbmVlZF92aW50Zl9maW5hbGl6ZT10cnVlCisgICAgICAgIGZpOworICAgIGZpOworCisgICAgaWYgWyAiJG5lZWRfdmludGZfZmluYWxpemUiID0gdHJ1ZSBdIDsgdGhlbiAgICAgICAgIyBWSU5URiBmaW5hbGl6YXRpb24KICAgICAgICAgc291cmNlICR0b3AvYnVpbGQvbWFrZS90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtdmludGYtcmVzb3VyY2VzLnNoCiAgICAgZmk7CiB9CiAKIGZpbmFsaXplX21haW5fc3RlcDAKLQpkaWZmIC0tZ2l0IGEvdG9vbHMvZmluYWxpemF0aW9uL2NvbW1hbmQtbGluZS1vcHRpb25zLnNoIGIvdG9vbHMvZmluYWxpemF0aW9uL2NvbW1hbmQtbGluZS1vcHRpb25zLnNoCmluZGV4IGQ5Mzk3YzIuLjNhMWUwNDkgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2ZpbmFsaXphdGlvbi9jb21tYW5kLWxpbmUtb3B0aW9ucy5zaAorKysgYi90b29scy9maW5hbGl6YXRpb24vY29tbWFuZC1saW5lLW9wdGlvbnMuc2gKQEAgLTMsNiArMyw3IEBACiB3aGlsZSB0cnVlOyBkbwogICAgIGNhc2UgIiQxIiBpbgogICAgICAgICAtLWRyeS1ydW4pIHJlcG9fdXBsb2FkX2RyeV9ydW5fYXJnPSItLWRyeS1ydW4iOyByZXBvX2JyYW5jaD0iZmluYWxpemF0aW9uLWRyeS1ydW4iOyBzaGlmdCA7OworICAgICAgICAtLSkgc2hpZnQ7IGJyZWFrOzsKICAgICAgICAgKikgYnJlYWsKICAgICBlc2FjCiBkb25lCmRpZmYgLS1naXQgYS90b29scy9maW5hbGl6YXRpb24vZW52aXJvbm1lbnQuc2ggYi90b29scy9maW5hbGl6YXRpb24vZW52aXJvbm1lbnQuc2gKaW5kZXggZjY4YTY4Yi4uMGQzYTllMSAxMDA3NTUKLS0tIGEvdG9vbHMvZmluYWxpemF0aW9uL2Vudmlyb25tZW50LnNoCisrKyBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9lbnZpcm9ubWVudC5zaApAQCAtMjksNCArMjksOCBAQAogIyBGSU5BTCB2ZXJzaW9ucyBmb3IgVklOVEYKICMgVE9ETyhiLzMyMzk4NTI5Nyk6IFRoZSB2ZXJzaW9uIG11c3QgbWF0Y2ggd2l0aCB0aGF0IGZyb20gdGhlIHJlbGVhc2UgY29uZmlndXJhdGlvbi4KICMgSW5zdGVhZCBvZiBoYXJkY29kaW5nIHRoZSB2ZXJzaW9uIGhlcmUsIHJlYWQgaXQgZnJvbSBhIHJlbGVhc2UgY29uZmlndXJhdGlvbi4KLWV4cG9ydCBGSU5BTF9CT0FSRF9BUElfTEVWRUw9JzIwMjQwNCcKK2V4cG9ydCBGSU5BTF9CT0FSRF9BUElfTEVWRUw9JzIwMjUwNCcKK2V4cG9ydCBGSU5BTF9DT1JSRVNQT05ESU5HX1ZFUlNJT05fTEVUVEVSPSdCJworZXhwb3J0IEZJTkFMX0NPUlJFU1BPTkRJTkdfUExBVEZPUk1fVkVSU0lPTj0nMTYnCitleHBvcnQgRklOQUxfTkVYVF9CT0FSRF9BUElfTEVWRUw9JzIwMjYwNCcKK2V4cG9ydCBGSU5BTF9ORVhUX0NPUlJFU1BPTkRJTkdfVkVSU0lPTl9MRVRURVI9J0MnCmRpZmYgLS1naXQgYS90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtdmludGYtcmVzb3VyY2VzLnNoIGIvdG9vbHMvZmluYWxpemF0aW9uL2ZpbmFsaXplLXZpbnRmLXJlc291cmNlcy5zaAppbmRleCBkNTMyYjI1Li42ZjFhNmY2IDEwMDc1NQotLS0gYS90b29scy9maW5hbGl6YXRpb24vZmluYWxpemUtdmludGYtcmVzb3VyY2VzLnNoCisrKyBiL3Rvb2xzL2ZpbmFsaXphdGlvbi9maW5hbGl6ZS12aW50Zi1yZXNvdXJjZXMuc2gKQEAgLTMzLDE4ICszMywxOCBAQAogZnVuY3Rpb24gY3JlYXRlX25ld19jb21wYXRfbWF0cml4X2FuZF9rZXJuZWxfY29uZmlncygpIHsKICAgICAjIFRoZSBjb21wYXRpYmlsaXR5IG1hdHJpeCB2ZXJzaW9ucyBhcmUgYnVtcGVkIGR1cmluZyB2RlJDCiAgICAgIyBUaGVzZSB3aWxsIGNoYW5nZSBldmVyeSB0aW1lIHdlIGhhdmUgYSBuZXcgdkZSQwotICAgIGxvY2FsIENVUlJFTlRfQ09NUEFUSUJJTElUWV9NQVRSSVhfTEVWRUw9JzIwMjQwNCcKLSAgICBsb2NhbCBORVhUX0NPTVBBVElCSUxJVFlfTUFUUklYX0xFVkVMPScyMDI1MDQnCisgICAgbG9jYWwgQ1VSUkVOVF9DT01QQVRJQklMSVRZX01BVFJJWF9MRVZFTD0iJEZJTkFMX0JPQVJEX0FQSV9MRVZFTCIKKyAgICBsb2NhbCBORVhUX0NPTVBBVElCSUxJVFlfTUFUUklYX0xFVkVMPSIkRklOQUxfTkVYVF9CT0FSRF9BUElfTEVWRUwiCiAgICAgIyBUaGUga2VybmVsIGNvbmZpZ3MgbmVlZCB0aGUgbGV0dGVyIG9mIHRoZSBBbmRyb2lkIHJlbGVhc2UKLSAgICBsb2NhbCBDVVJSRU5UX1JFTEVBU0VfTEVUVEVSPSd2JwotICAgIGxvY2FsIE5FWFRfUkVMRUFTRV9MRVRURVI9J3cnCisgICAgbG9jYWwgQ1VSUkVOVF9SRUxFQVNFX0xFVFRFUj0iJEZJTkFMX0NPUlJFU1BPTkRJTkdfVkVSU0lPTl9MRVRURVIiCisgICAgbG9jYWwgTkVYVF9SRUxFQVNFX0xFVFRFUj0iJEZJTkFMX05FWFRfQ09SUkVTUE9ORElOR19WRVJTSU9OX0xFVFRFUiIKIAogCiAgICAgIyBidWlsZCB0aGUgdGFyZ2V0cyByZXF1aXJlZCBiZWZvcmUgdG91Y2hpbmcgdGhlIEFuZHJvaWQuYnAvQW5kcm9pZC5tayBmaWxlcwogICAgIGxvY2FsIGJ1aWxkX2NtZD0iJHRvcC9idWlsZC9zb29uZy9zb29uZ191aS5iYXNoIC0tbWFrZS1tb2RlIgogICAgICRidWlsZF9jbWQgYnBtb2RpZnkKIAotICAgICIkdG9wL3ByZWJ1aWx0cy9idWlsZC10b29scy9wYXRoL2xpbnV4LXg4Ni9weXRob24zIiAiJHRvcC9oYXJkd2FyZS9pbnRlcmZhY2VzL2NvbXBhdGliaWxpdHlfbWF0cmljZXMvYnVtcC5weSIgIiRDVVJSRU5UX0NPTVBBVElCSUxJVFlfTUFUUklYX0xFVkVMIiAiJE5FWFRfQ09NUEFUSUJJTElUWV9NQVRSSVhfTEVWRUwiICIkQ1VSUkVOVF9SRUxFQVNFX0xFVFRFUiIgIiRORVhUX1JFTEVBU0VfTEVUVEVSIgorICAgICIkdG9wL3ByZWJ1aWx0cy9idWlsZC10b29scy9wYXRoL2xpbnV4LXg4Ni9weXRob24zIiAiJHRvcC9oYXJkd2FyZS9pbnRlcmZhY2VzL2NvbXBhdGliaWxpdHlfbWF0cmljZXMvYnVtcC5weSIgIiRDVVJSRU5UX0NPTVBBVElCSUxJVFlfTUFUUklYX0xFVkVMIiAiJE5FWFRfQ09NUEFUSUJJTElUWV9NQVRSSVhfTEVWRUwiICIkQ1VSUkVOVF9SRUxFQVNFX0xFVFRFUiIgIiRORVhUX1JFTEVBU0VfTEVUVEVSIiAiJEZJTkFMX0NPUlJFU1BPTkRJTkdfUExBVEZPUk1fVkVSU0lPTiIKIAogICAgICMgRnJlZXplIHRoZSBjdXJyZW50IGZyYW1ld29yayBtYW5pZmVzdCBmaWxlLiBUaGlzIHJlbGllcyBvbiB0aGUKICAgICAjIGFvc3BfY2ZfeDg2XzY0LXRydW5rX3N0YWdpbmcgYnVpbGQgdGFyZ2V0IHRvIGdldCB0aGUgcmlnaHQgbWFuaWZlc3QKZGlmZiAtLWdpdCBhL3Rvb2xzL2ZzX2NvbmZpZy9BbmRyb2lkLmJwIGIvdG9vbHMvZnNfY29uZmlnL0FuZHJvaWQuYnAKaW5kZXggNmFhNTI4OS4uYTViNmZkMCAxMDA2NDQKLS0tIGEvdG9vbHMvZnNfY29uZmlnL0FuZHJvaWQuYnAKKysrIGIvdG9vbHMvZnNfY29uZmlnL0FuZHJvaWQuYnAKQEAgLTI3Nyw2ICsyNzcsNyBAQAogICAgIG91dDogWyJvdXQiXSwKIH0KIAorLy8gc3lzdGVtCiBnZW5ydWxlIHsKICAgICBuYW1lOiAiZnNfY29uZmlnX2RpcnNfc3lzdGVtX2dlbiIsCiAgICAgZGVmYXVsdHM6IFsiZnNfY29uZmlnX2RlZmF1bHRzIl0sCkBAIC0zMDcsNiArMzA4LDcgQEAKICAgICBzcmM6ICI6ZnNfY29uZmlnX2ZpbGVzX3N5c3RlbV9nZW4iLAogfQogCisvLyBzeXN0ZW1fZXh0CiBnZW5ydWxlIHsKICAgICBuYW1lOiAiZnNfY29uZmlnX2RpcnNfc3lzdGVtX2V4dF9nZW4iLAogICAgIGRlZmF1bHRzOiBbImZzX2NvbmZpZ19kZWZhdWx0cyJdLApAQCAtMzM3LDYgKzMzOSw3IEBACiAgICAgc3lzdGVtX2V4dF9zcGVjaWZpYzogdHJ1ZSwKIH0KIAorLy8gcHJvZHVjdAogZ2VucnVsZSB7CiAgICAgbmFtZTogImZzX2NvbmZpZ19kaXJzX3Byb2R1Y3RfZ2VuIiwKICAgICBkZWZhdWx0czogWyJmc19jb25maWdfZGVmYXVsdHMiXSwKQEAgLTM2Nyw2ICszNzAsNyBAQAogICAgIHByb2R1Y3Rfc3BlY2lmaWM6IHRydWUsCiB9CiAKKy8vIHZlbmRvcgogZ2VucnVsZSB7CiAgICAgbmFtZTogImZzX2NvbmZpZ19kaXJzX3ZlbmRvcl9nZW4iLAogICAgIGRlZmF1bHRzOiBbImZzX2NvbmZpZ19kZWZhdWx0cyJdLApAQCAtMzk3LDYgKzQwMSw3IEBACiAgICAgdmVuZG9yOiB0cnVlLAogfQogCisvLyBvZG0KIGdlbnJ1bGUgewogICAgIG5hbWU6ICJmc19jb25maWdfZGlyc19vZG1fZ2VuIiwKICAgICBkZWZhdWx0czogWyJmc19jb25maWdfZGVmYXVsdHMiXSwKQEAgLTQyNyw0ICs0MzIsMjE0IEBACiAgICAgZGV2aWNlX3NwZWNpZmljOiB0cnVlLAogfQogCi0vLyBUT0RPKGppeW9uZyk6IGFkZCBmc19jb25maWcgZm9yIG9lbSwgc3lzdGVtX2Rsa20sIHZlbmRvcl9kbGttLCBvZG1fZGxrbSBwYXJ0aXRpb25zCisvLyBzeXN0ZW1fZGxrbQorZ2VucnVsZSB7CisgICAgbmFtZTogImZzX2NvbmZpZ19kaXJzX3N5c3RlbV9kbGttX2dlbiIsCisgICAgZGVmYXVsdHM6IFsiZnNfY29uZmlnX2RlZmF1bHRzIl0sCisgICAgY21kOiBmc19jb25maWdfY21kX2RpcnMgKworICAgICAgICAiLS1wYXJ0aXRpb24gc3lzdGVtX2Rsa20gIiArCisgICAgICAgICIkKGxvY2F0aW9ucyA6dGFyZ2V0X2ZzX2NvbmZpZ19nZW4pIiwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2RpcnNfc3lzdGVtX2Rsa20iLAorICAgIGZpbGVuYW1lOiAiZnNfY29uZmlnX2RpcnMiLAorICAgIHNyYzogIjpmc19jb25maWdfZGlyc19zeXN0ZW1fZGxrbV9nZW4iLAorICAgIHN5c3RlbV9kbGttX3NwZWNpZmljOiB0cnVlLAorfQorCitnZW5ydWxlIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2ZpbGVzX3N5c3RlbV9kbGttX2dlbiIsCisgICAgZGVmYXVsdHM6IFsiZnNfY29uZmlnX2RlZmF1bHRzIl0sCisgICAgY21kOiBmc19jb25maWdfY21kX2ZpbGVzICsKKyAgICAgICAgIi0tcGFydGl0aW9uIHN5c3RlbV9kbGttICIgKworICAgICAgICAiJChsb2NhdGlvbnMgOnRhcmdldF9mc19jb25maWdfZ2VuKSIsCit9CisKK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImZzX2NvbmZpZ19maWxlc19zeXN0ZW1fZGxrbSIsCisgICAgZmlsZW5hbWU6ICJmc19jb25maWdfZmlsZXMiLAorICAgIHNyYzogIjpmc19jb25maWdfZmlsZXNfc3lzdGVtX2Rsa21fZ2VuIiwKKyAgICBzeXN0ZW1fZGxrbV9zcGVjaWZpYzogdHJ1ZSwKK30KKworLy8gdmVuZG9yX2Rsa20KK2dlbnJ1bGUgeworICAgIG5hbWU6ICJmc19jb25maWdfZGlyc192ZW5kb3JfZGxrbV9nZW4iLAorICAgIGRlZmF1bHRzOiBbImZzX2NvbmZpZ19kZWZhdWx0cyJdLAorICAgIGNtZDogZnNfY29uZmlnX2NtZF9kaXJzICsKKyAgICAgICAgIi0tcGFydGl0aW9uIHZlbmRvcl9kbGttICIgKworICAgICAgICAiJChsb2NhdGlvbnMgOnRhcmdldF9mc19jb25maWdfZ2VuKSIsCit9CisKK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImZzX2NvbmZpZ19kaXJzX3ZlbmRvcl9kbGttIiwKKyAgICBmaWxlbmFtZTogImZzX2NvbmZpZ19kaXJzIiwKKyAgICBzcmM6ICI6ZnNfY29uZmlnX2RpcnNfdmVuZG9yX2Rsa21fZ2VuIiwKKyAgICB2ZW5kb3JfZGxrbV9zcGVjaWZpYzogdHJ1ZSwKK30KKworZ2VucnVsZSB7CisgICAgbmFtZTogImZzX2NvbmZpZ19maWxlc192ZW5kb3JfZGxrbV9nZW4iLAorICAgIGRlZmF1bHRzOiBbImZzX2NvbmZpZ19kZWZhdWx0cyJdLAorICAgIGNtZDogZnNfY29uZmlnX2NtZF9maWxlcyArCisgICAgICAgICItLXBhcnRpdGlvbiB2ZW5kb3JfZGxrbSAiICsKKyAgICAgICAgIiQobG9jYXRpb25zIDp0YXJnZXRfZnNfY29uZmlnX2dlbikiLAorfQorCitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJmc19jb25maWdfZmlsZXNfdmVuZG9yX2Rsa20iLAorICAgIGZpbGVuYW1lOiAiZnNfY29uZmlnX2ZpbGVzIiwKKyAgICBzcmM6ICI6ZnNfY29uZmlnX2ZpbGVzX3ZlbmRvcl9kbGttX2dlbiIsCisgICAgdmVuZG9yX2Rsa21fc3BlY2lmaWM6IHRydWUsCit9CisKKy8vIG9kbV9kbGttCitnZW5ydWxlIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2RpcnNfb2RtX2Rsa21fZ2VuIiwKKyAgICBkZWZhdWx0czogWyJmc19jb25maWdfZGVmYXVsdHMiXSwKKyAgICBjbWQ6IGZzX2NvbmZpZ19jbWRfZGlycyArCisgICAgICAgICItLXBhcnRpdGlvbiBvZG1fZGxrbSAiICsKKyAgICAgICAgIiQobG9jYXRpb25zIDp0YXJnZXRfZnNfY29uZmlnX2dlbikiLAorfQorCitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJmc19jb25maWdfZGlyc19vZG1fZGxrbSIsCisgICAgZmlsZW5hbWU6ICJmc19jb25maWdfZGlycyIsCisgICAgc3JjOiAiOmZzX2NvbmZpZ19kaXJzX29kbV9kbGttX2dlbiIsCisgICAgb2RtX2Rsa21fc3BlY2lmaWM6IHRydWUsCit9CisKK2dlbnJ1bGUgeworICAgIG5hbWU6ICJmc19jb25maWdfZmlsZXNfb2RtX2Rsa21fZ2VuIiwKKyAgICBkZWZhdWx0czogWyJmc19jb25maWdfZGVmYXVsdHMiXSwKKyAgICBjbWQ6IGZzX2NvbmZpZ19jbWRfZmlsZXMgKworICAgICAgICAiLS1wYXJ0aXRpb24gb2RtX2Rsa20gIiArCisgICAgICAgICIkKGxvY2F0aW9ucyA6dGFyZ2V0X2ZzX2NvbmZpZ19nZW4pIiwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2ZpbGVzX29kbV9kbGttIiwKKyAgICBmaWxlbmFtZTogImZzX2NvbmZpZ19maWxlcyIsCisgICAgc3JjOiAiOmZzX2NvbmZpZ19maWxlc19vZG1fZGxrbV9nZW4iLAorICAgIG9kbV9kbGttX3NwZWNpZmljOiB0cnVlLAorfQorCisvLyBvZW0KK2dlbnJ1bGUgeworICAgIG5hbWU6ICJmc19jb25maWdfZGlyc19vZW1fZ2VuIiwKKyAgICBkZWZhdWx0czogWyJmc19jb25maWdfZGVmYXVsdHMiXSwKKyAgICBjbWQ6IGZzX2NvbmZpZ19jbWRfZGlycyArCisgICAgICAgICItLXBhcnRpdGlvbiBvZW0gIiArCisgICAgICAgICIkKGxvY2F0aW9ucyA6dGFyZ2V0X2ZzX2NvbmZpZ19nZW4pIiwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2RpcnNfb2VtIiwKKyAgICBmaWxlbmFtZTogImZzX2NvbmZpZ19kaXJzIiwKKyAgICBzcmM6ICI6ZnNfY29uZmlnX2RpcnNfb2VtX2dlbiIsCisgICAgb2VtX3NwZWNpZmljOiB0cnVlLAorfQorCitnZW5ydWxlIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2ZpbGVzX29lbV9nZW4iLAorICAgIGRlZmF1bHRzOiBbImZzX2NvbmZpZ19kZWZhdWx0cyJdLAorICAgIGNtZDogZnNfY29uZmlnX2NtZF9maWxlcyArCisgICAgICAgICItLXBhcnRpdGlvbiBvZW0gIiArCisgICAgICAgICIkKGxvY2F0aW9ucyA6dGFyZ2V0X2ZzX2NvbmZpZ19nZW4pIiwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2ZpbGVzX29lbSIsCisgICAgZmlsZW5hbWU6ICJmc19jb25maWdfZmlsZXMiLAorICAgIHNyYzogIjpmc19jb25maWdfZmlsZXNfb2VtX2dlbiIsCisgICAgb2VtX3NwZWNpZmljOiB0cnVlLAorfQorCisvLyBHZW5lcmF0ZSB0aGUgPHA+L2V0Yy9mc19jb25maWdfZGlycyBiaW5hcnkgZmlsZXMgZm9yIGVhY2ggcGFydGl0aW9uLgorLy8gQWRkIGZzX2NvbmZpZ19kaXJzIHRvIFBST0RVQ1RfUEFDS0FHRVMgaW4gdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlLgorcGhvbnkgeworICAgIG5hbWU6ICJmc19jb25maWdfZGlycyIsCisgICAgcmVxdWlyZWQ6IFsKKyAgICAgICAgImZzX2NvbmZpZ19kaXJzX3N5c3RlbSIsCisgICAgICAgICJmc19jb25maWdfZGlyc19zeXN0ZW1fZXh0IiwKKyAgICAgICAgImZzX2NvbmZpZ19kaXJzX3Byb2R1Y3QiLAorICAgICAgICAiZnNfY29uZmlnX2RpcnNfbm9uc3lzdGVtIiwKKyAgICBdLAorfQorCisvLyBHZW5lcmF0ZSB0aGUgPHA+L2V0Yy9mc19jb25maWdfZmlsZXMgYmluYXJ5IGZpbGVzIGZvciBlYWNoIHBhcnRpdGlvbi4KKy8vIEFkZCBmc19jb25maWdfZmlsZXMgdG8gUFJPRFVDVF9QQUNLQUdFUyBpbiB0aGUgZGV2aWNlIG1ha2UgZmlsZSB0byBlbmFibGUuCitwaG9ueSB7CisgICAgbmFtZTogImZzX2NvbmZpZ19maWxlcyIsCisgICAgcmVxdWlyZWQ6IFsKKyAgICAgICAgImZzX2NvbmZpZ19maWxlc19zeXN0ZW0iLAorICAgICAgICAiZnNfY29uZmlnX2ZpbGVzX3N5c3RlbV9leHQiLAorICAgICAgICAiZnNfY29uZmlnX2ZpbGVzX3Byb2R1Y3QiLAorICAgICAgICAiZnNfY29uZmlnX2ZpbGVzX25vbnN5c3RlbSIsCisgICAgXSwKK30KKworLy8gR2VuZXJhdGUgdGhlIDxwPi9ldGMvZnNfY29uZmlnX2RpcnMgYmluYXJ5IGZpbGVzIGZvciBhbGwgZW5hYmxlZCBwYXJ0aXRpb25zCisvLyBleGNsdWRpbmcgL3N5c3RlbSwgL3N5c3RlbV9leHQgYW5kIC9wcm9kdWN0LiBBZGQgZnNfY29uZmlnX2RpcnNfbm9uc3lzdGVtIHRvCisvLyBQUk9EVUNUX1BBQ0tBR0VTIGluIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZS4KK3Bob255IHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2RpcnNfbm9uc3lzdGVtIiwKKyAgICByZXF1aXJlZDogW10gKworICAgICAgICBzZWxlY3Qoc29vbmdfY29uZmlnX3ZhcmlhYmxlKCJmc19jb25maWciLCAidmVuZG9yIiksIHsKKyAgICAgICAgICAgIHRydWU6IFsiZnNfY29uZmlnX2RpcnNfdmVuZG9yIl0sCisgICAgICAgICAgICBkZWZhdWx0OiBbXSwKKyAgICAgICAgfSkgKworICAgICAgICBzZWxlY3Qoc29vbmdfY29uZmlnX3ZhcmlhYmxlKCJmc19jb25maWciLCAib2VtIiksIHsKKyAgICAgICAgICAgIHRydWU6IFsiZnNfY29uZmlnX2RpcnNfb2VtIl0sCisgICAgICAgICAgICBkZWZhdWx0OiBbXSwKKyAgICAgICAgfSkgKworICAgICAgICBzZWxlY3Qoc29vbmdfY29uZmlnX3ZhcmlhYmxlKCJmc19jb25maWciLCAib2RtIiksIHsKKyAgICAgICAgICAgIHRydWU6IFsiZnNfY29uZmlnX2RpcnNfb2RtIl0sCisgICAgICAgICAgICBkZWZhdWx0OiBbXSwKKyAgICAgICAgfSkgKworICAgICAgICBzZWxlY3Qoc29vbmdfY29uZmlnX3ZhcmlhYmxlKCJmc19jb25maWciLCAidmVuZG9yX2Rsa20iKSwgeworICAgICAgICAgICAgdHJ1ZTogWyJmc19jb25maWdfZGlyc192ZW5kb3JfZGxrbSJdLAorICAgICAgICAgICAgZGVmYXVsdDogW10sCisgICAgICAgIH0pICsKKyAgICAgICAgc2VsZWN0KHNvb25nX2NvbmZpZ192YXJpYWJsZSgiZnNfY29uZmlnIiwgIm9kbV9kbGttIiksIHsKKyAgICAgICAgICAgIHRydWU6IFsiZnNfY29uZmlnX2RpcnNfb2RtX2Rsa20iXSwKKyAgICAgICAgICAgIGRlZmF1bHQ6IFtdLAorICAgICAgICB9KSArCisgICAgICAgIHNlbGVjdChzb29uZ19jb25maWdfdmFyaWFibGUoImZzX2NvbmZpZyIsICJzeXN0ZW1fZGxrbSIpLCB7CisgICAgICAgICAgICB0cnVlOiBbImZzX2NvbmZpZ19kaXJzX3N5c3RlbV9kbGttIl0sCisgICAgICAgICAgICBkZWZhdWx0OiBbXSwKKyAgICAgICAgfSksCit9CisKKy8vIEdlbmVyYXRlIHRoZSA8cD4vZXRjL2ZzX2NvbmZpZ19maWxlcyBiaW5hcnkgZmlsZXMgZm9yIGFsbCBlbmFibGVkIHBhcnRpdGlvbnMKKy8vIGV4Y2x1ZGluZyAvc3lzdGVtLCAvc3lzdGVtX2V4dCBhbmQgL3Byb2R1Y3QuIEFkZCBmc19jb25maWdfZmlsZXNfbm9uc3lzdGVtIHRvCisvLyBQUk9EVUNUX1BBQ0tBR0VTIGluIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZS4KK3Bob255IHsKKyAgICBuYW1lOiAiZnNfY29uZmlnX2ZpbGVzX25vbnN5c3RlbSIsCisgICAgcmVxdWlyZWQ6IFtdICsKKyAgICAgICAgc2VsZWN0KHNvb25nX2NvbmZpZ192YXJpYWJsZSgiZnNfY29uZmlnIiwgInZlbmRvciIpLCB7CisgICAgICAgICAgICB0cnVlOiBbImZzX2NvbmZpZ19maWxlc192ZW5kb3IiXSwKKyAgICAgICAgICAgIGRlZmF1bHQ6IFtdLAorICAgICAgICB9KSArCisgICAgICAgIHNlbGVjdChzb29uZ19jb25maWdfdmFyaWFibGUoImZzX2NvbmZpZyIsICJvZW0iKSwgeworICAgICAgICAgICAgdHJ1ZTogWyJmc19jb25maWdfZmlsZXNfb2VtIl0sCisgICAgICAgICAgICBkZWZhdWx0OiBbXSwKKyAgICAgICAgfSkgKworICAgICAgICBzZWxlY3Qoc29vbmdfY29uZmlnX3ZhcmlhYmxlKCJmc19jb25maWciLCAib2RtIiksIHsKKyAgICAgICAgICAgIHRydWU6IFsiZnNfY29uZmlnX2ZpbGVzX29kbSJdLAorICAgICAgICAgICAgZGVmYXVsdDogW10sCisgICAgICAgIH0pICsKKyAgICAgICAgc2VsZWN0KHNvb25nX2NvbmZpZ192YXJpYWJsZSgiZnNfY29uZmlnIiwgInZlbmRvcl9kbGttIiksIHsKKyAgICAgICAgICAgIHRydWU6IFsiZnNfY29uZmlnX2ZpbGVzX3ZlbmRvcl9kbGttIl0sCisgICAgICAgICAgICBkZWZhdWx0OiBbXSwKKyAgICAgICAgfSkgKworICAgICAgICBzZWxlY3Qoc29vbmdfY29uZmlnX3ZhcmlhYmxlKCJmc19jb25maWciLCAib2RtX2Rsa20iKSwgeworICAgICAgICAgICAgdHJ1ZTogWyJmc19jb25maWdfZmlsZXNfb2RtX2Rsa20iXSwKKyAgICAgICAgICAgIGRlZmF1bHQ6IFtdLAorICAgICAgICB9KSArCisgICAgICAgIHNlbGVjdChzb29uZ19jb25maWdfdmFyaWFibGUoImZzX2NvbmZpZyIsICJzeXN0ZW1fZGxrbSIpLCB7CisgICAgICAgICAgICB0cnVlOiBbImZzX2NvbmZpZ19maWxlc19zeXN0ZW1fZGxrbSJdLAorICAgICAgICAgICAgZGVmYXVsdDogW10sCisgICAgICAgIH0pLAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvZnNfY29uZmlnL0FuZHJvaWQubWsgYi90b29scy9mc19jb25maWcvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRjMzYyNi4uMDAwMDAwMAotLS0gYS90b29scy9mc19jb25maWcvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDMyOCArMCwwIEBACi0jIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLSMgT25lIGNhbiBvdmVycmlkZSB0aGUgZGVmYXVsdCBhbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmggZmlsZSBieSB1c2luZyBUQVJHRVRfRlNfQ09ORklHX0dFTi4KLSMgICBTZXQgVEFSR0VUX0ZTX0NPTkZJR19HRU4gdG8gY29udGFpbiBhIGxpc3Qgb2YgaW50ZXJtZWRpYXRlIGZvcm1hdCBmaWxlcwotIyAgIGZvciBnZW5lcmF0aW5nIHRoZSBhbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmggZmlsZS4KLSMKLSMgTW9yZSBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gdGhlIFJFQURNRQotCi1pZm5lcSAoJCh3aWxkY2FyZCAkKFRBUkdFVF9ERVZJQ0VfRElSKS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmgpLCkKLSQoZXJyb3IgVXNpbmcgJChUQVJHRVRfREVWSUNFX0RJUikvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgVEFSR0VUX0ZTX0NPTkZJR19HRU4gaW5zdGVhZCkKLWVuZGlmCi0KLWFuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcgOj0gc3lzdGVtL2NvcmUvbGliY3V0aWxzL2luY2x1ZGUvcHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmgKLWNhcGFiaWxpdHlfaGVhZGVyIDo9IGJpb25pYy9saWJjL2tlcm5lbC91YXBpL2xpbnV4L2NhcGFiaWxpdHkuaAotCi0jIExpc3Qgb2Ygc3VwcG9ydGVkIHZlbmRvciwgb2VtLCBvZG0sIHZlbmRvcl9kbGttLCBvZG1fZGxrbSwgYW5kIHN5c3RlbV9kbGttIFBhcnRpdGlvbnMKLWZzX2NvbmZpZ19nZW5lcmF0ZV9leHRyYV9wYXJ0aXRpb25fbGlzdCA6PSAkKHN0cmlwIFwKLSAgJChpZiAkKEJPQVJEX1VTRVNfVkVORE9SSU1BR0UpJChCT0FSRF9WRU5ET1JJTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSx2ZW5kb3IpIFwKLSAgJChpZiAkKEJPQVJEX1VTRVNfT0VNSU1BR0UpJChCT0FSRF9PRU1JTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSxvZW0pIFwKLSAgJChpZiAkKEJPQVJEX1VTRVNfT0RNSU1BR0UpJChCT0FSRF9PRE1JTUFHRV9GSUxFX1NZU1RFTV9UWVBFKSxvZG0pIFwKLSAgJChpZiAkKEJPQVJEX1VTRVNfVkVORE9SX0RMS01JTUFHRSkkKEJPQVJEX1ZFTkRPUl9ETEtNSU1BR0VfRklMRV9TWVNURU1fVFlQRSksdmVuZG9yX2Rsa20pIFwKLSAgJChpZiAkKEJPQVJEX1VTRVNfT0RNX0RMS01JTUFHRSkkKEJPQVJEX09ETV9ETEtNSU1BR0VfRklMRV9TWVNURU1fVFlQRSksb2RtX2Rsa20pIFwKLSAgJChpZiAkKEJPQVJEX1VTRVNfU1lTVEVNX0RMS01JTUFHRSkkKEJPQVJEX1NZU1RFTV9ETEtNSU1BR0VfRklMRV9TWVNURU1fVFlQRSksc3lzdGVtX2Rsa20pIFwKLSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBHZW5lcmF0ZSB0aGUgPHA+L2V0Yy9mc19jb25maWdfZGlycyBiaW5hcnkgZmlsZXMgZm9yIGVhY2ggcGFydGl0aW9uLgotIyBBZGQgZnNfY29uZmlnX2RpcnMgdG8gUFJPRFVDVF9QQUNLQUdFUyBpbiB0aGUgZGV2aWNlIG1ha2UgZmlsZSB0byBlbmFibGUuCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IGZzX2NvbmZpZ19kaXJzCi1MT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKLUxPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gXAotICBmc19jb25maWdfZGlyc19zeXN0ZW0gXAotICBmc19jb25maWdfZGlyc19zeXN0ZW1fZXh0IFwKLSAgZnNfY29uZmlnX2RpcnNfcHJvZHVjdCBcCi0gIGZzX2NvbmZpZ19kaXJzX25vbnN5c3RlbQotaW5jbHVkZSAkKEJVSUxEX1BIT05ZX1BBQ0tBR0UpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgR2VuZXJhdGUgdGhlIDxwPi9ldGMvZnNfY29uZmlnX2ZpbGVzIGJpbmFyeSBmaWxlcyBmb3IgZWFjaCBwYXJ0aXRpb24uCi0jIEFkZCBmc19jb25maWdfZmlsZXMgdG8gUFJPRFVDVF9QQUNLQUdFUyBpbiB0aGUgZGV2aWNlIG1ha2UgZmlsZSB0byBlbmFibGUuCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IGZzX2NvbmZpZ19maWxlcwotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTIDo9IFwKLSAgZnNfY29uZmlnX2ZpbGVzX3N5c3RlbSBcCi0gIGZzX2NvbmZpZ19maWxlc19zeXN0ZW1fZXh0IFwKLSAgZnNfY29uZmlnX2ZpbGVzX3Byb2R1Y3QgXAotICBmc19jb25maWdfZmlsZXNfbm9uc3lzdGVtCi1pbmNsdWRlICQoQlVJTERfUEhPTllfUEFDS0FHRSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBHZW5lcmF0ZSB0aGUgPHA+L2V0Yy9mc19jb25maWdfZGlycyBiaW5hcnkgZmlsZXMgZm9yIGFsbCBlbmFibGVkIHBhcnRpdGlvbnMKLSMgZXhjbHVkaW5nIC9zeXN0ZW0sIC9zeXN0ZW1fZXh0IGFuZCAvcHJvZHVjdC4gQWRkIGZzX2NvbmZpZ19kaXJzX25vbnN5c3RlbSB0bwotIyBQUk9EVUNUX1BBQ0tBR0VTIGluIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZS4KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gZnNfY29uZmlnX2RpcnNfbm9uc3lzdGVtCi1MT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKLUxPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gJChmb3JlYWNoIHQsJChmc19jb25maWdfZ2VuZXJhdGVfZXh0cmFfcGFydGl0aW9uX2xpc3QpLGZzX2NvbmZpZ19kaXJzXyQodCkpCi1pbmNsdWRlICQoQlVJTERfUEhPTllfUEFDS0FHRSkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBHZW5lcmF0ZSB0aGUgPHA+L2V0Yy9mc19jb25maWdfZmlsZXMgYmluYXJ5IGZpbGVzIGZvciBhbGwgZW5hYmxlZCBwYXJ0aXRpb25zCi0jIGV4Y2x1ZGluZyAvc3lzdGVtLCAvc3lzdGVtX2V4dCBhbmQgL3Byb2R1Y3QuIEFkZCBmc19jb25maWdfZmlsZXNfbm9uc3lzdGVtIHRvCi0jIFBST0RVQ1RfUEFDS0FHRVMgaW4gdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlLgotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBmc19jb25maWdfZmlsZXNfbm9uc3lzdGVtCi1MT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKLUxPQ0FMX1JFUVVJUkVEX01PRFVMRVMgOj0gJChmb3JlYWNoIHQsJChmc19jb25maWdfZ2VuZXJhdGVfZXh0cmFfcGFydGl0aW9uX2xpc3QpLGZzX2NvbmZpZ19maWxlc18kKHQpKQotaW5jbHVkZSAkKEJVSUxEX1BIT05ZX1BBQ0tBR0UpCi0KLWlmbmVxICgkKGZpbHRlciBvZW0sJChmc19jb25maWdfZ2VuZXJhdGVfZXh0cmFfcGFydGl0aW9uX2xpc3QpKSwpCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEdlbmVyYXRlIHRoZSBvZW0vZXRjL2ZzX2NvbmZpZ19kaXJzIGJpbmFyeSBmaWxlIGZvciB0aGUgdGFyZ2V0Ci0jIEFkZCBmc19jb25maWdfZGlycyBvciBmc19jb25maWdfZGlyc19ub25zeXN0ZW0gdG8gUFJPRFVDVF9QQUNLQUdFUwotIyBpbiB0aGUgZGV2aWNlIG1ha2UgZmlsZSB0byBlbmFibGUKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gZnNfY29uZmlnX2RpcnNfb2VtCi1MT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX0lOU1RBTExFRF9NT0RVTEVfU1RFTSA6PSBmc19jb25maWdfZGlycwotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX09FTSkvZXRjCi1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9GU19IRFIgOj0gJChhbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfQ0FQX0hEUiA6PSAkKGNhcGFiaWxpdHlfaGVhZGVyKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOIDo9ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoTE9DQUxfUEFUSCkvZnNfY29uZmlnX2dlbmVyYXRvci5weSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKSAkKGFuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpICQoY2FwYWJpbGl0eV9oZWFkZXIpCi0JQG1rZGlyIC1wICQoZGlyICRAKQotCSQ8IGZzY29uZmlnIFwKLQkgICAtLWFpZC1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfRlNfSERSKSBcCi0JICAgLS1jYXBhYmlsaXR5LWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSKSBcCi0JICAgLS1wYXJ0aXRpb24gb2VtIFwKLQkgICAtLWRpcnMgXAotCSAgIC0tb3V0X2ZpbGUgJEAgXAotCSAgICQob3IgJChQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOKSwvZGV2L251bGwpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgR2VuZXJhdGUgdGhlIG9lbS9ldGMvZnNfY29uZmlnX2ZpbGVzIGJpbmFyeSBmaWxlIGZvciB0aGUgdGFyZ2V0Ci0jIEFkZCBmc19jb25maWdfZmlsZXMgb3IgZnNfY29uZmlnX2ZpbGVzX25vbnN5c3RlbSB0byBQUk9EVUNUX1BBQ0tBR0VTCi0jIGluIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBmc19jb25maWdfZmlsZXNfb2VtCi1MT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX0lOU1RBTExFRF9NT0RVTEVfU1RFTSA6PSBmc19jb25maWdfZmlsZXMKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9PRU0pL2V0YwotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5tawotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfRlNfSERSIDo9ICQoYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0NBUF9IRFIgOj0gJChjYXBhYmlsaXR5X2hlYWRlcikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiA6PSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKExPQ0FMX1BBVEgpL2ZzX2NvbmZpZ19nZW5lcmF0b3IucHkgJChUQVJHRVRfRlNfQ09ORklHX0dFTikgJChhbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKSAkKGNhcGFiaWxpdHlfaGVhZGVyKQotCUBta2RpciAtcCAkKGRpciAkQCkKLQkkPCBmc2NvbmZpZyBcCi0JICAgLS1haWQtaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0ZTX0hEUikgXAotCSAgIC0tY2FwYWJpbGl0eS1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfQ0FQX0hEUikgXAotCSAgIC0tcGFydGl0aW9uIG9lbSBcCi0JICAgLS1maWxlcyBcCi0JICAgLS1vdXRfZmlsZSAkQCBcCi0JICAgJChvciAkKFBSSVZBVEVfVEFSR0VUX0ZTX0NPTkZJR19HRU4pLC9kZXYvbnVsbCkKLQotZW5kaWYKLQotaWZuZXEgKCQoZmlsdGVyIHZlbmRvcl9kbGttLCQoZnNfY29uZmlnX2dlbmVyYXRlX2V4dHJhX3BhcnRpdGlvbl9saXN0KSksKQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBHZW5lcmF0ZSB0aGUgdmVuZG9yX2Rsa20vZXRjL2ZzX2NvbmZpZ19kaXJzIGJpbmFyeSBmaWxlIGZvciB0aGUgdGFyZ2V0Ci0jIEFkZCBmc19jb25maWdfZGlycyBvciBmc19jb25maWdfZGlyc19ub25zeXN0ZW0gdG8gUFJPRFVDVF9QQUNLQUdFUyBpbgotIyB0aGUgZGV2aWNlIG1ha2UgZmlsZSB0byBlbmFibGUKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gZnNfY29uZmlnX2RpcnNfdmVuZG9yX2Rsa20KLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfSU5TVEFMTEVEX01PRFVMRV9TVEVNIDo9IGZzX2NvbmZpZ19kaXJzCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfVkVORE9SX0RMS00pL2V0YwotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5tawotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfRlNfSERSIDo9ICQoYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0NBUF9IRFIgOj0gJChjYXBhYmlsaXR5X2hlYWRlcikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiA6PSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKExPQ0FMX1BBVEgpL2ZzX2NvbmZpZ19nZW5lcmF0b3IucHkgJChUQVJHRVRfRlNfQ09ORklHX0dFTikgJChhbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKSAkKGNhcGFiaWxpdHlfaGVhZGVyKQotCUBta2RpciAtcCAkKGRpciAkQCkKLQkkPCBmc2NvbmZpZyBcCi0JICAgLS1haWQtaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0ZTX0hEUikgXAotCSAgIC0tY2FwYWJpbGl0eS1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfQ0FQX0hEUikgXAotCSAgIC0tcGFydGl0aW9uIHZlbmRvcl9kbGttIFwKLQkgICAtLWRpcnMgXAotCSAgIC0tb3V0X2ZpbGUgJEAgXAotCSAgICQob3IgJChQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOKSwvZGV2L251bGwpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgR2VuZXJhdGUgdGhlIHZlbmRvcl9kbGttL2V0Yy9mc19jb25maWdfZmlsZXMgYmluYXJ5IGZpbGUgZm9yIHRoZSB0YXJnZXQKLSMgQWRkIGZzX2NvbmZpZ19maWxlcyBvciBmc19jb25maWdfZmlsZXNfbm9uc3lzdGVtIHRvIFBST0RVQ1RfUEFDS0FHRVMgaW4KLSMgdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IGZzX2NvbmZpZ19maWxlc192ZW5kb3JfZGxrbQotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9JTlNUQUxMRURfTU9EVUxFX1NURU0gOj0gZnNfY29uZmlnX2ZpbGVzCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfVkVORE9SX0RMS00pL2V0YwotaW5jbHVkZSAkKEJVSUxEX1NZU1RFTSkvYmFzZV9ydWxlcy5tawotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfRlNfSERSIDo9ICQoYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0NBUF9IRFIgOj0gJChjYXBhYmlsaXR5X2hlYWRlcikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiA6PSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiAkKExPQ0FMX1BBVEgpL2ZzX2NvbmZpZ19nZW5lcmF0b3IucHkgJChUQVJHRVRfRlNfQ09ORklHX0dFTikgJChhbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKSAkKGNhcGFiaWxpdHlfaGVhZGVyKQotCUBta2RpciAtcCAkKGRpciAkQCkKLQkkPCBmc2NvbmZpZyBcCi0JICAgLS1haWQtaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0ZTX0hEUikgXAotCSAgIC0tY2FwYWJpbGl0eS1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfQ0FQX0hEUikgXAotCSAgIC0tcGFydGl0aW9uIHZlbmRvcl9kbGttIFwKLQkgICAtLWZpbGVzIFwKLQkgICAtLW91dF9maWxlICRAIFwKLQkgICAkKG9yICQoUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiksL2Rldi9udWxsKQotCi1lbmRpZgotCi1pZm5lcSAoJChmaWx0ZXIgb2RtX2Rsa20sJChmc19jb25maWdfZ2VuZXJhdGVfZXh0cmFfcGFydGl0aW9uX2xpc3QpKSwpCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEdlbmVyYXRlIHRoZSBvZG1fZGxrbS9ldGMvZnNfY29uZmlnX2RpcnMgYmluYXJ5IGZpbGUgZm9yIHRoZSB0YXJnZXQKLSMgQWRkIGZzX2NvbmZpZ19kaXJzIG9yIGZzX2NvbmZpZ19kaXJzX25vbnN5c3RlbSB0byBQUk9EVUNUX1BBQ0tBR0VTCi0jIGluIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBmc19jb25maWdfZGlyc19vZG1fZGxrbQotTE9DQUxfTElDRU5TRV9LSU5EUyA6PSBTUERYLWxpY2Vuc2UtaWRlbnRpZmllci1BcGFjaGUtMi4wCi1MT0NBTF9MSUNFTlNFX0NPTkRJVElPTlMgOj0gbm90aWNlCi1MT0NBTF9OT1RJQ0VfRklMRSA6PSBidWlsZC9zb29uZy9saWNlbnNlcy9MSUNFTlNFCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9JTlNUQUxMRURfTU9EVUxFX1NURU0gOj0gZnNfY29uZmlnX2RpcnMKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9PRE1fRExLTSkvZXRjCi1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9GU19IRFIgOj0gJChhbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfQ0FQX0hEUiA6PSAkKGNhcGFiaWxpdHlfaGVhZGVyKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOIDo9ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoTE9DQUxfUEFUSCkvZnNfY29uZmlnX2dlbmVyYXRvci5weSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKSAkKGFuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpICQoY2FwYWJpbGl0eV9oZWFkZXIpCi0JQG1rZGlyIC1wICQoZGlyICRAKQotCSQ8IGZzY29uZmlnIFwKLQkgICAtLWFpZC1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfRlNfSERSKSBcCi0JICAgLS1jYXBhYmlsaXR5LWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSKSBcCi0JICAgLS1wYXJ0aXRpb24gb2RtX2Rsa20gXAotCSAgIC0tZGlycyBcCi0JICAgLS1vdXRfZmlsZSAkQCBcCi0JICAgJChvciAkKFBSSVZBVEVfVEFSR0VUX0ZTX0NPTkZJR19HRU4pLC9kZXYvbnVsbCkKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBHZW5lcmF0ZSB0aGUgb2RtX2Rsa20vZXRjL2ZzX2NvbmZpZ19maWxlcyBiaW5hcnkgZmlsZSBmb3IgdGhlIHRhcmdldAotIyBBZGQgZnNfY29uZmlnX2ZpbGVzIG9yIGZzX2NvbmZpZ19maWxlc19ub25zeXN0ZW0gdG8gUFJPRFVDVF9QQUNLQUdFUwotIyBpbiB0aGUgZGV2aWNlIG1ha2UgZmlsZSB0byBlbmFibGUKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEUgOj0gZnNfY29uZmlnX2ZpbGVzX29kbV9kbGttCi1MT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX0lOU1RBTExFRF9NT0RVTEVfU1RFTSA6PSBmc19jb25maWdfZmlsZXMKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9PRE1fRExLTSkvZXRjCi1pbmNsdWRlICQoQlVJTERfU1lTVEVNKS9iYXNlX3J1bGVzLm1rCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9GU19IRFIgOj0gJChhbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX0FORFJPSURfQ0FQX0hEUiA6PSAkKGNhcGFiaWxpdHlfaGVhZGVyKQotJChMT0NBTF9CVUlMVF9NT0RVTEUpOiBQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOIDo9ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6ICQoTE9DQUxfUEFUSCkvZnNfY29uZmlnX2dlbmVyYXRvci5weSAkKFRBUkdFVF9GU19DT05GSUdfR0VOKSAkKGFuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpICQoY2FwYWJpbGl0eV9oZWFkZXIpCi0JQG1rZGlyIC1wICQoZGlyICRAKQotCSQ8IGZzY29uZmlnIFwKLQkgICAtLWFpZC1oZWFkZXIgJChQUklWQVRFX0FORFJPSURfRlNfSERSKSBcCi0JICAgLS1jYXBhYmlsaXR5LWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSKSBcCi0JICAgLS1wYXJ0aXRpb24gb2RtX2Rsa20gXAotCSAgIC0tZmlsZXMgXAotCSAgIC0tb3V0X2ZpbGUgJEAgXAotCSAgICQob3IgJChQUklWQVRFX1RBUkdFVF9GU19DT05GSUdfR0VOKSwvZGV2L251bGwpCi0KLWVuZGlmCi0KLWlmbmVxICgkKGZpbHRlciBzeXN0ZW1fZGxrbSwkKGZzX2NvbmZpZ19nZW5lcmF0ZV9leHRyYV9wYXJ0aXRpb25fbGlzdCkpLCkKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgR2VuZXJhdGUgdGhlIHN5c3RlbV9kbGttL2V0Yy9mc19jb25maWdfZGlycyBiaW5hcnkgZmlsZSBmb3IgdGhlIHRhcmdldAotIyBBZGQgZnNfY29uZmlnX2RpcnMgb3IgZnNfY29uZmlnX2RpcnNfbm9uc3lzdGVtIHRvIFBST0RVQ1RfUEFDS0FHRVMKLSMgaW4gdGhlIGRldmljZSBtYWtlIGZpbGUgdG8gZW5hYmxlCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfTU9EVUxFIDo9IGZzX2NvbmZpZ19kaXJzX3N5c3RlbV9kbGttCi1MT0NBTF9MSUNFTlNFX0tJTkRTIDo9IFNQRFgtbGljZW5zZS1pZGVudGlmaWVyLUFwYWNoZS0yLjAKLUxPQ0FMX0xJQ0VOU0VfQ09ORElUSU9OUyA6PSBub3RpY2UKLUxPQ0FMX05PVElDRV9GSUxFIDo9IGJ1aWxkL3Nvb25nL2xpY2Vuc2VzL0xJQ0VOU0UKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX0lOU1RBTExFRF9NT0RVTEVfU1RFTSA6PSBmc19jb25maWdfZGlycwotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1NZU1RFTV9ETEtNKS9ldGMKLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0ZTX0hEUiA6PSAkKGFuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSIDo9ICQoY2FwYWJpbGl0eV9oZWFkZXIpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfVEFSR0VUX0ZTX0NPTkZJR19HRU4gOj0gJChUQVJHRVRfRlNfQ09ORklHX0dFTikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChMT0NBTF9QQVRIKS9mc19jb25maWdfZ2VuZXJhdG9yLnB5ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pICQoYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykgJChjYXBhYmlsaXR5X2hlYWRlcikKLQlAbWtkaXIgLXAgJChkaXIgJEApCi0JJDwgZnNjb25maWcgXAotCSAgIC0tYWlkLWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9GU19IRFIpIFwKLQkgICAtLWNhcGFiaWxpdHktaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0NBUF9IRFIpIFwKLQkgICAtLXBhcnRpdGlvbiBzeXN0ZW1fZGxrbSBcCi0JICAgLS1kaXJzIFwKLQkgICAtLW91dF9maWxlICRAIFwKLQkgICAkKG9yICQoUFJJVkFURV9UQVJHRVRfRlNfQ09ORklHX0dFTiksL2Rldi9udWxsKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEdlbmVyYXRlIHRoZSBzeXN0ZW1fZGxrbS9ldGMvZnNfY29uZmlnX2ZpbGVzIGJpbmFyeSBmaWxlIGZvciB0aGUgdGFyZ2V0Ci0jIEFkZCBmc19jb25maWdfZmlsZXMgb3IgZnNfY29uZmlnX2ZpbGVzX25vbnN5c3RlbSB0byBQUk9EVUNUX1BBQ0tBR0VTCi0jIGluIHRoZSBkZXZpY2UgbWFrZSBmaWxlIHRvIGVuYWJsZQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX01PRFVMRSA6PSBmc19jb25maWdfZmlsZXNfc3lzdGVtX2Rsa20KLUxPQ0FMX0xJQ0VOU0VfS0lORFMgOj0gU1BEWC1saWNlbnNlLWlkZW50aWZpZXItQXBhY2hlLTIuMAotTE9DQUxfTElDRU5TRV9DT05ESVRJT05TIDo9IG5vdGljZQotTE9DQUxfTk9USUNFX0ZJTEUgOj0gYnVpbGQvc29vbmcvbGljZW5zZXMvTElDRU5TRQotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfSU5TVEFMTEVEX01PRFVMRV9TVEVNIDo9IGZzX2NvbmZpZ19maWxlcwotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX1NZU1RFTV9ETEtNKS9ldGMKLWluY2x1ZGUgJChCVUlMRF9TWVNURU0pL2Jhc2VfcnVsZXMubWsKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogUFJJVkFURV9BTkRST0lEX0ZTX0hEUiA6PSAkKGFuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfQU5EUk9JRF9DQVBfSERSIDo9ICQoY2FwYWJpbGl0eV9oZWFkZXIpCi0kKExPQ0FMX0JVSUxUX01PRFVMRSk6IFBSSVZBVEVfVEFSR0VUX0ZTX0NPTkZJR19HRU4gOj0gJChUQVJHRVRfRlNfQ09ORklHX0dFTikKLSQoTE9DQUxfQlVJTFRfTU9EVUxFKTogJChMT0NBTF9QQVRIKS9mc19jb25maWdfZ2VuZXJhdG9yLnB5ICQoVEFSR0VUX0ZTX0NPTkZJR19HRU4pICQoYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZykgJChjYXBhYmlsaXR5X2hlYWRlcikKLQlAbWtkaXIgLXAgJChkaXIgJEApCi0JJDwgZnNjb25maWcgXAotCSAgIC0tYWlkLWhlYWRlciAkKFBSSVZBVEVfQU5EUk9JRF9GU19IRFIpIFwKLQkgICAtLWNhcGFiaWxpdHktaGVhZGVyICQoUFJJVkFURV9BTkRST0lEX0NBUF9IRFIpIFwKLQkgICAtLXBhcnRpdGlvbiBzeXN0ZW1fZGxrbSBcCi0JICAgLS1maWxlcyBcCi0JICAgLS1vdXRfZmlsZSAkQCBcCi0JICAgJChvciAkKFBSSVZBVEVfVEFSR0VUX0ZTX0NPTkZJR19HRU4pLC9kZXYvbnVsbCkKLQotZW5kaWYKLQotYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZyA6PQotY2FwYWJpbGl0eV9oZWFkZXIgOj0KLWZzX2NvbmZpZ19nZW5lcmF0ZV9leHRyYV9wYXJ0aXRpb25fbGlzdCA6PQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL1JFQURNRS5tZCBiL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplci9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I4MjJkMgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplci9SRUFETUUubWQKQEAgLTAsMCArMSwzIEBACitTZWUgaW5zdHJ1Y3Rpb25zIGluCitbQW5kcm9pZCBDbGFuZy9MTFZNLWJhc2VkIFRvb2xzIFJlYWRtZSBEb2NdKGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL3ByZWJ1aWx0cy9jbGFuZy10b29scy8rL21haW4vUkVBRE1FLm1kKQorZm9yIGN1dHRpbmcgYSBuZXcgcmVsZWFzZS4KZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplci9pbmNsdWRlX3NjYW5uZXIuY2MgYi90b29scy9pZGVfcXVlcnkvY2NfYW5hbHl6ZXIvaW5jbHVkZV9zY2FubmVyLmNjCmluZGV4IDg5MTZhM2UuLjFkM2YyNmUgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2lkZV9xdWVyeS9jY19hbmFseXplci9pbmNsdWRlX3NjYW5uZXIuY2MKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L2NjX2FuYWx5emVyL2luY2x1ZGVfc2Nhbm5lci5jYwpAQCAtOTQsNiArOTQsMTEgQEAKICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+ICZhYnNfcGF0aHMpCiAgICAgICA6IGFic19wYXRoc18oYWJzX3BhdGhzKSB7fQogICBib29sIEJlZ2luU291cmNlRmlsZUFjdGlvbihjbGFuZzo6Q29tcGlsZXJJbnN0YW5jZSAmY2kpIG92ZXJyaWRlIHsKKyAgICAvLyBCZSBtb3JlIHJlc2lsaWVudCBhZ2FpbnN0IGFsbCB3YXJuaW5ncy9lcnJvcnMsIGFzIHdlIHdhbnQKKyAgICAvLyBpbmNsdWRlLXNjYW5uaW5nIHRvIHdvcmsgZXZlbiBvbiBpbmNvbXBsZXRlIHNvdXJjZXMuCisgICAgY2kuZ2V0RGlhZ25vc3RpY3MoKS5zZXRFbmFibGVBbGxXYXJuaW5ncyhmYWxzZSk7CisgICAgY2kuZ2V0RGlhZ25vc3RpY3MoKS5zZXRTZXZlcml0eUZvckFsbChjbGFuZzo6ZGlhZzo6Rmxhdm9yOjpXYXJuaW5nT3JFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYW5nOjpkaWFnOjpTZXZlcml0eTo6SWdub3JlZCk7CiAgICAgc3RkOjpzdHJpbmcgY3dkOwogICAgIGF1dG8gY3dkX29yX2VyciA9IGNpLmdldFZpcnR1YWxGaWxlU3lzdGVtKCkuZ2V0Q3VycmVudFdvcmtpbmdEaXJlY3RvcnkoKTsKICAgICBpZiAoIWN3ZF9vcl9lcnIgfHwgY3dkX29yX2Vyci5nZXQoKS5lbXB0eSgpKSByZXR1cm4gZmFsc2U7CkBAIC0xNTQsNiArMTU5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgIG1haW5fZmlsZS5nZXQoKS0+Z2V0QnVmZmVyKCkuc3RyKCkpOwogCiAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhcmd2ID0gY21kLkNvbW1hbmRMaW5lOworICAvLyBEaXNhYmxlIGFsbCB3YXJuaW5ncyB0byBiZSBtb3JlIHJvYnVzdCBpbiBhbmFseXNpcy4KKyAgYXJndi5pbnNlcnQobGx2bTo6ZmluZChhcmd2LCAiLS0iKSwgeyItV25vLWVycm9yIiwgIi13In0pOwogICBmcyA9IE92ZXJsYXlCdWlsdGluSGVhZGVycyhhcmd2LCBzdGQ6Om1vdmUoZnMpKTsKIAogICBsbHZtOjpJbnRydXNpdmVSZWZDbnRQdHI8Y2xhbmc6OkZpbGVNYW5hZ2VyPiBmaWxlcygKZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnkuZ28gYi90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5LmdvCmluZGV4IDIzYzdhYmQuLjZjYWEyOWMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnkuZ28KKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L2lkZV9xdWVyeS5nbwpAQCAtMTE2LDggKzExNiw4IEBACiAKIAl2YXIgdGFyZ2V0cyBbXXN0cmluZwogCWphdmFUYXJnZXRzQnlGaWxlIDo9IGZpbmRKYXZhTW9kdWxlcyhqYXZhRmlsZXMsIGphdmFNb2R1bGVzKQotCWZvciBfLCB0IDo9IHJhbmdlIGphdmFUYXJnZXRzQnlGaWxlIHsKLQkJdGFyZ2V0cyA9IGFwcGVuZCh0YXJnZXRzLCB0KQorCWZvciBfLCB0YXJnZXQgOj0gcmFuZ2UgamF2YVRhcmdldHNCeUZpbGUgeworCQl0YXJnZXRzID0gYXBwZW5kKHRhcmdldHMsIGphdmFNb2R1bGVzW3RhcmdldF0uSmFycy4uLikKIAl9CiAKIAljY1RhcmdldHMsIGVyciA6PSBnZXRDQ1RhcmdldHMoY3R4LCBlbnYsIGNjRmlsZXMpCkBAIC0yOTMsMTEgKzI5MywyMyBAQAogLy8gSWYgYSBmaWxlIGlzIGNvdmVyZWQgYnkgbXVsdGlwbGUgbW9kdWxlcywgdGhlIGZpcnN0IG1vZHVsZSBpcyByZXR1cm5lZC4KIGZ1bmMgZmluZEphdmFNb2R1bGVzKHBhdGhzIFtdc3RyaW5nLCBtb2R1bGVzIG1hcFtzdHJpbmddKmphdmFNb2R1bGUpIG1hcFtzdHJpbmddc3RyaW5nIHsKIAlyZXQgOj0gbWFrZShtYXBbc3RyaW5nXXN0cmluZykKLQlmb3IgbmFtZSwgbW9kdWxlIDo9IHJhbmdlIG1vZHVsZXMgeworCS8vIEEgZmlsZSBtYXkgYmUgcGFydCBvZiBtdWx0aXBsZSBtb2R1bGVzLiBUbyBtYWtlIHRoZSByZXN1bHQgZGV0ZXJtaW5pc3RpYywKKwkvLyBjaGVjayB0aGUgbW9kdWxlcyBpbiBzb3J0ZWQgb3JkZXIuCisJa2V5cyA6PSBtYWtlKFtdc3RyaW5nLCAwLCBsZW4obW9kdWxlcykpCisJZm9yIG5hbWUgOj0gcmFuZ2UgbW9kdWxlcyB7CisJCWtleXMgPSBhcHBlbmQoa2V5cywgbmFtZSkKKwl9CisJc2xpY2VzLlNvcnQoa2V5cykKKwlmb3IgXywgbmFtZSA6PSByYW5nZSBrZXlzIHsKIAkJaWYgc3RyaW5ncy5IYXNTdWZmaXgobmFtZSwgIi5pbXBsIikgewogCQkJY29udGludWUKIAkJfQogCisJCW1vZHVsZSA6PSBtb2R1bGVzW25hbWVdCisJCWlmIGxlbihtb2R1bGUuSmFycykgPT0gMCB7CisJCQljb250aW51ZQorCQl9CisKIAkJZm9yIGksIHAgOj0gcmFuZ2UgcGF0aHMgewogCQkJaWYgc2xpY2VzLkNvbnRhaW5zKG1vZHVsZS5TcmNzLCBwKSB7CiAJCQkJcmV0W3BdID0gbmFtZQpAQCAtMzA5LDYgKzMyMSw3IEBACiAJCQlicmVhawogCQl9CiAJfQorCiAJcmV0dXJuIHJldAogfQogCkBAIC0zNDEsNiArMzU0LDggQEAKIAkJCUlkOiAgICAgICAgICAgICAgbW9kdWxlTmFtZSwKIAkJCUxhbmd1YWdlOiAgICAgICAgcGIuTGFuZ3VhZ2VfTEFOR1VBR0VfSkFWQSwKIAkJCVNvdXJjZUZpbGVQYXRoczogbS5TcmNzLAorCQkJR2VuZXJhdGVkRmlsZXM6ICBnZW5GaWxlcyhlbnYsIG0pLAorCQkJRGVwZW5kZW5jeUlkczogICBtLkRlcHMsCiAJCX0KIAkJdW5pdHNCeUlkW3UuSWRdID0gdQogCkBAIC0zNTUsMTQgKzM3MCwxMSBAQAogCQkJCWNvbnRpbnVlCiAJCQl9CiAKLQkJCXZhciBwYXRocyBbXXN0cmluZwotCQkJcGF0aHMgPSBhcHBlbmQocGF0aHMsIG1vZC5TcmNzLi4uKQotCQkJcGF0aHMgPSBhcHBlbmQocGF0aHMsIG1vZC5TcmNKYXJzLi4uKQotCQkJcGF0aHMgPSBhcHBlbmQocGF0aHMsIG1vZC5KYXJzLi4uKQogCQkJdW5pdHNCeUlkW25hbWVdID0gJnBiLkJ1aWxkYWJsZVVuaXR7CiAJCQkJSWQ6ICAgICAgICAgICAgICBuYW1lLAogCQkJCVNvdXJjZUZpbGVQYXRoczogbW9kLlNyY3MsCi0JCQkJR2VuZXJhdGVkRmlsZXM6ICBnZW5GaWxlcyhlbnYsIHBhdGhzKSwKKwkJCQlHZW5lcmF0ZWRGaWxlczogIGdlbkZpbGVzKGVudiwgbW9kKSwKKwkJCQlEZXBlbmRlbmN5SWRzOiAgIG1vZC5EZXBzLAogCQkJfQogCiAJCQlmb3IgXywgZCA6PSByYW5nZSBtb2QuRGVwcyB7CkBAIC0zNzksOCArMzkxLDEzIEBACiB9CiAKIC8vIGdlbkZpbGVzIHJldHVybnMgdGhlIGdlbmVyYXRlZCBmaWxlcyAocGF0aHMgdGhhdCBzdGFydCB3aXRoIG91dERpci8pIGZvciB0aGUKLS8vIGdpdmVuIHBhdGhzLiBHZW5lcmF0ZWQgZmlsZXMgdGhhdCBkbyBub3QgZXhpc3QgYXJlIGlnbm9yZWQuCi1mdW5jIGdlbkZpbGVzKGVudiBFbnYsIHBhdGhzIFtdc3RyaW5nKSBbXSpwYi5HZW5lcmF0ZWRGaWxlIHsKKy8vIGdpdmVuIG1vZHVsZS4gR2VuZXJhdGVkIGZpbGVzIHRoYXQgZG8gbm90IGV4aXN0IGFyZSBpZ25vcmVkLgorZnVuYyBnZW5GaWxlcyhlbnYgRW52LCBtb2QgKmphdmFNb2R1bGUpIFtdKnBiLkdlbmVyYXRlZEZpbGUgeworCXZhciBwYXRocyBbXXN0cmluZworCXBhdGhzID0gYXBwZW5kKHBhdGhzLCBtb2QuU3Jjcy4uLikKKwlwYXRocyA9IGFwcGVuZChwYXRocywgbW9kLlNyY0phcnMuLi4pCisJcGF0aHMgPSBhcHBlbmQocGF0aHMsIG1vZC5KYXJzLi4uKQorCiAJcHJlZml4IDo9IGVudi5PdXREaXIgKyAiLyIKIAl2YXIgcmV0IFtdKnBiLkdlbmVyYXRlZEZpbGUKIAlmb3IgXywgcCA6PSByYW5nZSBwYXRocyB7CmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5LnNoIGIvdG9vbHMvaWRlX3F1ZXJ5L2lkZV9xdWVyeS5zaAppbmRleCA2ZjliMGM0Li44ZGZmZmMxIDEwMDc1NQotLS0gYS90b29scy9pZGVfcXVlcnkvaWRlX3F1ZXJ5LnNoCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnkuc2gKQEAgLTE5LDcgKzE5LDcgQEAKIHJlcXVpcmVfdG9wCiAKICMgRW5zdXJlIGNvZ3NldHVwIChvdXQvIHdpbGwgYmUgc3ltbGluayBvdXRzaWRlIHRoZSByZXBvKQotLiAke1RPUH0vYnVpbGQvbWFrZS9jb2dzZXR1cC5zaAorc2V0dXBfY29nX2Vudl9pZl9uZWVkZWQKIAogY2FzZSAkKHVuYW1lIC1zKSBpbgogICAgIExpbnV4KQpkaWZmIC0tZ2l0IGEvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9nZW5lcmFsLmNjIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9nZW5lcmFsLmNjCmluZGV4IDBmMDYzOWIuLmFjODgyODIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZ2VuZXJhbC5jYworKysgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2dlbmVyYWwuY2MKQEAgLTU2LDcgKzU2LDcgQEAKIAogdm9pZCBUZXN0TmF2aWdhdGlvbigpIHsKICAgc3RkOjp2ZWN0b3I8aW50PiBpbnRzOwotICAvLyAgICAgICAgICAgICAgIHwgICB8IGludHMKKyAgLy8gICAgICAgICAgICAgICBeICAgXiBpbnRzCiAgIC8vICAgICAgXgogCiAgIC8vIHN0ZXAKZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9pZGVfcXVlcnkub3V0IGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2lkZV9xdWVyeS5vdXQKaW5kZXggY2Q3Y2U2ZC4uYmU0OGRhMSAxMDA2NDQKLS0tIGEvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2lkZV9xdWVyeS5vdXQKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2lkZV9xdWVyeS5vdXQKQEAgLTEsNyArMSw5IEBACiAKLQNvdXQSlmEKLThidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZ2VuZXJhbC5jYxo4cHJlYnVpbHRzL2NsYW5nL2hvc3QvbGludXgteDg2L2NsYW5nLXI1MjI4MTcvYmluL2NsYW5nKysaBy1tdGh1bWIaAy1PcxoULWZvbWl0LWZyYW1lLXBvaW50ZXIaBi1tbGx2bRoZLWVuYWJsZS1zaHJpbmstd3JhcD1mYWxzZRoDLU8yGgUtV2FsbBoHLVdleHRyYRoLLVdpbml0LXNlbGYaDy1XcG9pbnRlci1hcml0aBoYLVd1bmd1YXJkZWQtYXZhaWxhYmlsaXR5GhEtV2Vycm9yPWRhdGUtdGltZRoWLVdlcnJvcj1pbnQtY29udmVyc2lvbhoTLVdlcnJvcj1wcmFnbWEtcGFjaxomLVdlcnJvcj1wcmFnbWEtcGFjay1zdXNwaWNpb3VzLWluY2x1ZGUaGC1XZXJyb3I9c2l6ZW9mLWFycmF5LWRpdhoXLVdlcnJvcj1zdHJpbmctcGx1cy1pbnQaJy1XZXJyb3I9dW5yZWFjaGFibGUtY29kZS1sb29wLWluY3JlbWVudBoiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucxoTLVduby1jOTktZGVzaWduYXRvchoZLVduby1nbnUtZm9sZGluZy1jb25zdGFudBoiLVduby1pbmNvbnNpc3RlbnQtbWlzc2luZy1vdmVycmlkZRocLVduby1lcnJvcj1yZW9yZGVyLWluaXQtbGlzdBoWLVduby1yZW9yZGVyLWluaXQtbGlzdBoRLVduby1zaWduLWNvbXBhcmUaCy1Xbm8tdW51c2VkGgktREFORFJPSUQaCC1ETkRFQlVHGgctVURFQlVHGigtRF9fY29tcGlsZXJfb2Zmc2V0b2Y9X19idWlsdGluX29mZnNldG9mGiotRF9fQU5EUk9JRF9VTkFWQUlMQUJMRV9TWU1CT0xTX0FSRV9XRUFLX18aCS1mYWRkcnNpZxoZLWZkZWJ1Zy1kZWZhdWx0LXZlcnNpb249NRoTLWZjb2xvci1kaWFnbm9zdGljcxoRLWZmcC1jb250cmFjdD1vZmYaDy1mbm8tZXhjZXB0aW9ucxoULWZuby1zdHJpY3QtYWxpYXNpbmcaEi1mbWVzc2FnZS1sZW5ndGg9MBojLWZuby1yZWxheGVkLXRlbXBsYXRlLXRlbXBsYXRlLWFyZ3MaFy1nc2ltcGxlLXRlbXBsYXRlLW5hbWVzGggtZ3o9enN0ZBoWLW5vLWNhbm9uaWNhbC1wcmVmaXhlcxoRLVduby1lcnJvcj1mb3JtYXQaIi1mZGVidWctcHJlZml4LW1hcD0vcHJvYy9zZWxmL2N3ZD0aHC1mdHJpdmlhbC1hdXRvLXZhci1pbml0PXplcm8aAi1nGhMtZmZ1bmN0aW9uLXNlY3Rpb25zGg8tZmRhdGEtc2VjdGlvbnMaEC1mbm8tc2hvcnQtZW51bXMaDy1mdW53aW5kLXRhYmxlcxoYLWZzdGFjay1wcm90ZWN0b3Itc3Ryb25nGhEtV2EsLS1ub2V4ZWNzdGFjaxoTLURfRk9SVElGWV9TT1VSQ0U9MhoTLVdzdHJpY3QtYWxpYXNpbmc9MhoTLVdlcnJvcj1yZXR1cm4tdHlwZRoYLVdlcnJvcj1ub24tdmlydHVhbC1kdG9yGg8tV2Vycm9yPWFkZHJlc3MaFi1XZXJyb3I9c2VxdWVuY2UtcG9pbnQaFy1XZXJyb3I9Zm9ybWF0LXNlY3VyaXR5Ggwtbm9zdGRsaWJpbmMaGi1mZGVidWctaW5mby1mb3ItcHJvZmlsaW5nGgwtbXNvZnQtZmxvYXQaDi1tYXJjaD1hcm12Ny1hGhItbWZsb2F0LWFiaT1zb2Z0ZnAaCi0tbWZwdT1uZW9uGi8tSWJ1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcBqzAS1Jb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2J1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9pZGVfcXVlcnlfcHJvYmVyc2NyaXB0X2NjL2FuZHJvaWRfYXJtX2FybXY3LWEtbmVvbi9nZW4vcHJvdG8vYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwGoUBLUlvdXQvc29vbmcvLmludGVybWVkaWF0ZXMvYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2lkZV9xdWVyeV9wcm9iZXJzY3JpcHRfY2MvYW5kcm9pZF9hcm1fYXJtdjctYS1uZW9uL2dlbi9wcm90bxoULURfX0xJQkNfQVBJX189MTAwMDAaFC1EX19MSUJNX0FQSV9fPTEwMDAwGhUtRF9fTElCRExfQVBJX189MTAwMDAaFy1JZXh0ZXJuYWwvcHJvdG9idWYvc3JjGlktSXByZWJ1aWx0cy9jbGFuZy9ob3N0L2xpbnV4LXg4Ni9jbGFuZy1yNTIyODE3L2FuZHJvaWRfbGliYysrL3BsYXRmb3JtL2FybS9pbmNsdWRlL2MrKy92MRo9LUlwcmVidWlsdHMvY2xhbmcvaG9zdC9saW51eC14ODYvY2xhbmctcjUyMjgxNy9pbmNsdWRlL2MrKy92MRogLUliaW9uaWMvbGliYy9hc3luY19zYWZlL2luY2x1ZGUaHy1Jc3lzdGVtL2xvZ2dpbmcvbGlibG9nL2luY2x1ZGUaJy1JYmlvbmljL2xpYmMvc3lzdGVtX3Byb3BlcnRpZXMvaW5jbHVkZRo8LUlzeXN0ZW0vY29yZS9wcm9wZXJ0eV9zZXJ2aWNlL2xpYnByb3BlcnR5aW5mb3BhcnNlci9pbmNsdWRlGggtaXN5c3RlbRoTYmlvbmljL2xpYmMvaW5jbHVkZRoILWlzeXN0ZW0aH2Jpb25pYy9saWJjL2tlcm5lbC91YXBpL2FzbS1hcm0aCC1pc3lzdGVtGhdiaW9uaWMvbGliYy9rZXJuZWwvdWFwaRoILWlzeXN0ZW0aH2Jpb25pYy9saWJjL2tlcm5lbC9hbmRyb2lkL3Njc2kaCC1pc3lzdGVtGh9iaW9uaWMvbGliYy9rZXJuZWwvYW5kcm9pZC91YXBpGgctdGFyZ2V0Gh1hcm12N2EtbGludXgtYW5kcm9pZGVhYmkxMDAwMBoQLURBTkRST0lEX1NUUklDVBoFLWZQSUUaBy1XZXJyb3IaFS1Xbm8tdW51c2VkLXBhcmFtZXRlchoZLURHT09HTEVfUFJPVE9CVUZfTk9fUlRUSRoWLVdpbXBsaWNpdC1mYWxsdGhyb3VnaBoqLURfTElCQ1BQX0VOQUJMRV9USFJFQURfU0FGRVRZX0FOTk9UQVRJT05TGhUtV25vLWdudS1pbmNsdWRlLW5leHQaGy1mdmlzaWJpbGl0eS1pbmxpbmVzLWhpZGRlbhoGLW1sbHZtGhktZW5hYmxlLXNocmluay13cmFwPWZhbHNlGgwtc3RkPWdudSsrMjAaCS1mbm8tcnR0aRoVLUlzeXN0ZW0vY29yZS9pbmNsdWRlGh8tSXN5c3RlbS9sb2dnaW5nL2xpYmxvZy9pbmNsdWRlGhwtSXN5c3RlbS9tZWRpYS9hdWRpby9pbmNsdWRlGh4tSWhhcmR3YXJlL2xpYmhhcmR3YXJlL2luY2x1ZGUaJS1JaGFyZHdhcmUvbGliaGFyZHdhcmVfbGVnYWN5L2luY2x1ZGUaFi1JaGFyZHdhcmUvcmlsL2luY2x1ZGUaGy1JZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZRoiLUlmcmFtZXdvcmtzL25hdGl2ZS9vcGVuZ2wvaW5jbHVkZRoXLUlmcmFtZXdvcmtzL2F2L2luY2x1ZGUaFi1XZXJyb3I9Ym9vbC1vcGVyYXRpb24aIC1XZXJyb3I9Zm9ybWF0LWluc3VmZmljaWVudC1hcmdzGiUtV2Vycm9yPWltcGxpY2l0LWludC1mbG9hdC1jb252ZXJzaW9uGhstV2Vycm9yPWludC1pbi1ib29sLWNvbnRleHQaGy1XZXJyb3I9aW50LXRvLXBvaW50ZXItY2FzdBobLVdlcnJvcj1wb2ludGVyLXRvLWludC1jYXN0GhctV2Vycm9yPXhvci11c2VkLWFzLXBvdxoeLVduby12b2lkLXBvaW50ZXItdG8tZW51bS1jYXN0Gh0tV25vLXZvaWQtcG9pbnRlci10by1pbnQtY2FzdBoYLVduby1wb2ludGVyLXRvLWludC1jYXN0GhYtV2Vycm9yPWZvcnRpZnktc291cmNlGhQtV25vLXVudXNlZC12YXJpYWJsZRofLVduby1taXNzaW5nLWZpZWxkLWluaXRpYWxpemVycxoTLVduby1wYWNrZWQtbm9uLXBvZBocLVdlcnJvcj1hZGRyZXNzLW9mLXRlbXBvcmFyeRorLVdlcnJvcj1pbmNvbXBhdGlibGUtZnVuY3Rpb24tcG9pbnRlci10eXBlcxoYLVdlcnJvcj1udWxsLWRlcmVmZXJlbmNlGhMtV2Vycm9yPXJldHVybi10eXBlGiItV25vLXRhdXRvbG9naWNhbC1jb25zdGFudC1jb21wYXJlGiQtV25vLXRhdXRvbG9naWNhbC10eXBlLWxpbWl0LWNvbXBhcmUaIi1Xbm8taW1wbGljaXQtaW50LWZsb2F0LWNvbnZlcnNpb24aIS1Xbm8tdGF1dG9sb2dpY2FsLW92ZXJsYXAtY29tcGFyZRoULVduby1kZXByZWNhdGVkLWNvcHkaGS1Xbm8tcmFuZ2UtbG9vcC1jb25zdHJ1Y3QaIi1Xbm8temVyby1hcy1udWxsLXBvaW50ZXItY29uc3RhbnQaKS1Xbm8tZGVwcmVjYXRlZC1hbm9uLWVudW0tZW51bS1jb252ZXJzaW9uGiQtV25vLWRlcHJlY2F0ZWQtZW51bS1lbnVtLWNvbnZlcnNpb24aFS1Xbm8tcGVzc2ltaXppbmctbW92ZRoeLVduby1ub24tYy10eXBlZGVmLWZvci1saW5rYWdlGhMtV25vLWFsaWduLW1pc21hdGNoGiItV25vLWVycm9yPXVudXNlZC1idXQtc2V0LXZhcmlhYmxlGiMtV25vLWVycm9yPXVudXNlZC1idXQtc2V0LXBhcmFtZXRlchoeLVduby1lcnJvcj1kZXByZWNhdGVkLWJ1aWx0aW5zGhUtV25vLWVycm9yPWRlcHJlY2F0ZWQaMi1Xbm8tZXJyb3I9c2luZ2xlLWJpdC1iaXRmaWVsZC1jb25zdGFudC1jb252ZXJzaW9uGiQtV25vLWVycm9yPWVudW0tY29uc3RleHByLWNvbnZlcnNpb24aGy1Xbm8tZXJyb3I9aW52YWxpZC1vZmZzZXRvZhomLVduby1kZXByZWNhdGVkLWR5bmFtaWMtZXhjZXB0aW9uLXNwZWMaOGJ1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9nZW5lcmFsLmNjItU/CisDb3V0MngKKzhidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZ2VuZXJhbC5jYxICCAEaOGJ1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9nZW5lcmFsLmNjOpciCis4YnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2dlbmVyYWwuY2MQAho4YnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2dlbmVyYWwuY2MiOHByZWJ1aWx0cy9jbGFuZy9ob3N0L2xpbnV4LXg4Ni9jbGFuZy1yNTMwNTY3L2Jpbi9jbGFuZysrIgwtbm9zdGRsaWJpbmMiBy1tdGh1bWIiAy1PcyIULWZvbWl0LWZyYW1lLXBvaW50ZXIiBi1tbGx2bSIZLWVuYWJsZS1zaHJpbmstd3JhcD1mYWxzZSIDLU8yIgUtV2FsbCIHLVdleHRyYSILLVdpbml0LXNlbGYiDy1XcG9pbnRlci1hcml0aCIYLVd1bmd1YXJkZWQtYXZhaWxhYmlsaXR5IhEtV2Vycm9yPWRhdGUtdGltZSIWLVdlcnJvcj1pbnQtY29udmVyc2lvbiITLVdlcnJvcj1wcmFnbWEtcGFjayImLVdlcnJvcj1wcmFnbWEtcGFjay1zdXNwaWNpb3VzLWluY2x1ZGUiGC1XZXJyb3I9c2l6ZW9mLWFycmF5LWRpdiIXLVdlcnJvcj1zdHJpbmctcGx1cy1pbnQiJy1XZXJyb3I9dW5yZWFjaGFibGUtY29kZS1sb29wLWluY3JlbWVudCIiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyITLVduby1jMjMtZXh0ZW5zaW9ucyITLVduby1jOTktZGVzaWduYXRvciIZLVduby1nbnUtZm9sZGluZy1jb25zdGFudCIiLVduby1pbmNvbnNpc3RlbnQtbWlzc2luZy1vdmVycmlkZSIcLVduby1lcnJvcj1yZW9yZGVyLWluaXQtbGlzdCIWLVduby1yZW9yZGVyLWluaXQtbGlzdCIRLVduby1zaWduLWNvbXBhcmUiCy1Xbm8tdW51c2VkIgktREFORFJPSUQiCC1ETkRFQlVHIgctVURFQlVHIigtRF9fY29tcGlsZXJfb2Zmc2V0b2Y9X19idWlsdGluX29mZnNldG9mIiotRF9fQU5EUk9JRF9VTkFWQUlMQUJMRV9TWU1CT0xTX0FSRV9XRUFLX18iCS1mYWRkcnNpZyIZLWZkZWJ1Zy1kZWZhdWx0LXZlcnNpb249NSITLWZjb2xvci1kaWFnbm9zdGljcyIRLWZmcC1jb250cmFjdD1vZmYiDy1mbm8tZXhjZXB0aW9ucyIULWZuby1zdHJpY3QtYWxpYXNpbmciEi1mbWVzc2FnZS1sZW5ndGg9MCIXLWdzaW1wbGUtdGVtcGxhdGUtbmFtZXMiCC1nej16c3RkIhYtbm8tY2Fub25pY2FsLXByZWZpeGVzIiItZmRlYnVnLXByZWZpeC1tYXA9L3Byb2Mvc2VsZi9jd2Q9IhwtZnRyaXZpYWwtYXV0by12YXItaW5pdD16ZXJvIgItZyITLWZmdW5jdGlvbi1zZWN0aW9ucyIPLWZkYXRhLXNlY3Rpb25zIhAtZm5vLXNob3J0LWVudW1zIg8tZnVud2luZC10YWJsZXMiGC1mc3RhY2stcHJvdGVjdG9yLXN0cm9uZyIRLVdhLC0tbm9leGVjc3RhY2siEy1EX0ZPUlRJRllfU09VUkNFPTIiEy1Xc3RyaWN0LWFsaWFzaW5nPTIiEy1XZXJyb3I9cmV0dXJuLXR5cGUiGC1XZXJyb3I9bm9uLXZpcnR1YWwtZHRvciIPLVdlcnJvcj1hZGRyZXNzIhYtV2Vycm9yPXNlcXVlbmNlLXBvaW50IhctV2Vycm9yPWZvcm1hdC1zZWN1cml0eSIMLW1zb2Z0LWZsb2F0Ig4tbWFyY2g9YXJtdjctYSISLW1mbG9hdC1hYmk9c29mdGZwIgorLW1mcHU9bmVvbiIvLUlidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAiswEtSW91dC9zb29uZy8uaW50ZXJtZWRpYXRlcy9idWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvaWRlX3F1ZXJ5X3Byb2JlcnNjcmlwdF9jYy9hbmRyb2lkX2FybV9hcm12Ny1hLW5lb24vZ2VuL3Byb3RvL2J1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcCKFAS1Jb3V0L3Nvb25nLy5pbnRlcm1lZGlhdGVzL2J1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9pZGVfcXVlcnlfcHJvYmVyc2NyaXB0X2NjL2FuZHJvaWRfYXJtX2FybXY3LWEtbmVvbi9nZW4vcHJvdG8iFC1EX19MSUJDX0FQSV9fPTEwMDAwIhQtRF9fTElCTV9BUElfXz0xMDAwMCIVLURfX0xJQkRMX0FQSV9fPTEwMDAwIhctSWV4dGVybmFsL3Byb3RvYnVmL3NyYyJZLUlwcmVidWlsdHMvY2xhbmcvaG9zdC9saW51eC14ODYvY2xhbmctcjUzMDU2Ny9hbmRyb2lkX2xpYmMrKy9wbGF0Zm9ybS9hcm0vaW5jbHVkZS9jKysvdjEiPS1JcHJlYnVpbHRzL2NsYW5nL2hvc3QvbGludXgteDg2L2NsYW5nLXI1MzA1NjcvaW5jbHVkZS9jKysvdjEiIC1JYmlvbmljL2xpYmMvYXN5bmNfc2FmZS9pbmNsdWRlIh8tSXN5c3RlbS9sb2dnaW5nL2xpYmxvZy9pbmNsdWRlIictSWJpb25pYy9saWJjL3N5c3RlbV9wcm9wZXJ0aWVzL2luY2x1ZGUiPC1Jc3lzdGVtL2NvcmUvcHJvcGVydHlfc2VydmljZS9saWJwcm9wZXJ0eWluZm9wYXJzZXIvaW5jbHVkZSIILWlzeXN0ZW0iE2Jpb25pYy9saWJjL2luY2x1ZGUiCC1pc3lzdGVtIh9iaW9uaWMvbGliYy9rZXJuZWwvdWFwaS9hc20tYXJtIggtaXN5c3RlbSIXYmlvbmljL2xpYmMva2VybmVsL3VhcGkiCC1pc3lzdGVtIh9iaW9uaWMvbGliYy9rZXJuZWwvYW5kcm9pZC9zY3NpIggtaXN5c3RlbSIfYmlvbmljL2xpYmMva2VybmVsL2FuZHJvaWQvdWFwaSIHLXRhcmdldCIdYXJtdjdhLWxpbnV4LWFuZHJvaWRlYWJpMTAwMDAiEC1EQU5EUk9JRF9TVFJJQ1QiBS1mUElFIgctV2Vycm9yIhUtV25vLXVudXNlZC1wYXJhbWV0ZXIiGS1ER09PR0xFX1BST1RPQlVGX05PX1JUVEkiFi1XaW1wbGljaXQtZmFsbHRocm91Z2giKi1EX0xJQkNQUF9FTkFCTEVfVEhSRUFEX1NBRkVUWV9BTk5PVEFUSU9OUyIVLVduby1nbnUtaW5jbHVkZS1uZXh0IhstZnZpc2liaWxpdHktaW5saW5lcy1oaWRkZW4iBi1tbGx2bSIZLWVuYWJsZS1zaHJpbmstd3JhcD1mYWxzZSIMLXN0ZD1nbnUrKzIwIgktZm5vLXJ0dGkiFS1Jc3lzdGVtL2NvcmUvaW5jbHVkZSIfLUlzeXN0ZW0vbG9nZ2luZy9saWJsb2cvaW5jbHVkZSIcLUlzeXN0ZW0vbWVkaWEvYXVkaW8vaW5jbHVkZSIeLUloYXJkd2FyZS9saWJoYXJkd2FyZS9pbmNsdWRlIiUtSWhhcmR3YXJlL2xpYmhhcmR3YXJlX2xlZ2FjeS9pbmNsdWRlIhYtSWhhcmR3YXJlL3JpbC9pbmNsdWRlIhstSWZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUiIi1JZnJhbWV3b3Jrcy9uYXRpdmUvb3BlbmdsL2luY2x1ZGUiFy1JZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIhYtV2Vycm9yPWJvb2wtb3BlcmF0aW9uIiAtV2Vycm9yPWZvcm1hdC1pbnN1ZmZpY2llbnQtYXJncyIlLVdlcnJvcj1pbXBsaWNpdC1pbnQtZmxvYXQtY29udmVyc2lvbiIbLVdlcnJvcj1pbnQtaW4tYm9vbC1jb250ZXh0IhstV2Vycm9yPWludC10by1wb2ludGVyLWNhc3QiGy1XZXJyb3I9cG9pbnRlci10by1pbnQtY2FzdCIXLVdlcnJvcj14b3ItdXNlZC1hcy1wb3ciHi1Xbm8tdm9pZC1wb2ludGVyLXRvLWVudW0tY2FzdCIdLVduby12b2lkLXBvaW50ZXItdG8taW50LWNhc3QiGC1Xbm8tcG9pbnRlci10by1pbnQtY2FzdCIWLVdlcnJvcj1mb3J0aWZ5LXNvdXJjZSIULVduby11bnVzZWQtdmFyaWFibGUiHy1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMiEy1Xbm8tcGFja2VkLW5vbi1wb2QiHC1XZXJyb3I9YWRkcmVzcy1vZi10ZW1wb3JhcnkiKy1XZXJyb3I9aW5jb21wYXRpYmxlLWZ1bmN0aW9uLXBvaW50ZXItdHlwZXMiGC1XZXJyb3I9bnVsbC1kZXJlZmVyZW5jZSITLVdlcnJvcj1yZXR1cm4tdHlwZSIiLVduby10YXV0b2xvZ2ljYWwtY29uc3RhbnQtY29tcGFyZSIkLVduby10YXV0b2xvZ2ljYWwtdHlwZS1saW1pdC1jb21wYXJlIiItV25vLWltcGxpY2l0LWludC1mbG9hdC1jb252ZXJzaW9uIiEtV25vLXRhdXRvbG9naWNhbC1vdmVybGFwLWNvbXBhcmUiFC1Xbm8tZGVwcmVjYXRlZC1jb3B5IhktV25vLXJhbmdlLWxvb3AtY29uc3RydWN0IiItV25vLXplcm8tYXMtbnVsbC1wb2ludGVyLWNvbnN0YW50IiktV25vLWRlcHJlY2F0ZWQtYW5vbi1lbnVtLWVudW0tY29udmVyc2lvbiIkLVduby1kZXByZWNhdGVkLWVudW0tZW51bS1jb252ZXJzaW9uIhstV25vLWVycm9yPXBlc3NpbWl6aW5nLW1vdmUiHi1Xbm8tbm9uLWMtdHlwZWRlZi1mb3ItbGlua2FnZSITLVduby1hbGlnbi1taXNtYXRjaCIiLVduby1lcnJvcj11bnVzZWQtYnV0LXNldC12YXJpYWJsZSIjLVduby1lcnJvcj11bnVzZWQtYnV0LXNldC1wYXJhbWV0ZXIiHi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1idWlsdGlucyIVLVduby1lcnJvcj1kZXByZWNhdGVkIiYtV25vLWRlcHJlY2F0ZWQtZHluYW1pYy1leGNlcHRpb24tc3BlYyIkLVduby1lcnJvcj1lbnVtLWNvbnN0ZXhwci1jb252ZXJzaW9uIhstV25vLWVycm9yPWludmFsaWQtb2Zmc2V0b2YiKS1Xbm8tZXJyb3I9dGhyZWFkLXNhZmV0eS1yZWZlcmVuY2UtcmV0dXJuIhYtV25vLXZsYS1jeHgtZXh0ZW5zaW9uIjhidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9jcHAvZ2VuZXJhbC5jYzJFZ2VuZmlsZXNfZm9yX2J1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9nZW5lcmFsLmNjOp9ACitFZ2VuZmlsZXNfZm9yX2J1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9nZW5lcmFsLmNjKtU/CiC2AXNvb25nLy5pbnRlcm1lZGlhdGVzL2J1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2NwcC9pZGVfcXVlcnlfcHJvYmVyc2NyaXB0X2NjL2FuZHJvaWRfYXJtX2FybXY3LWEtbmVvbi9nZW4vcHJvdG8vYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2Zvby5wYi5oEpk+Ly8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKIC8vIHNvdXJjZTogYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2Zvby5wcm90bwogCmRpZmYgLS1naXQgYS90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9vcy9TdHJpY3RNb2RlLmphdmEgYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvanZtL0FuZHJvaWQuYnAKc2ltaWxhcml0eSBpbmRleCA2MyUKY29weSBmcm9tIHRvb2xzL2Fjb25maWcvZmFrZV9kZXZpY2VfY29uZmlnL3NyYy9hbmRyb2lkL29zL1N0cmljdE1vZGUuamF2YQpjb3B5IHRvIHRvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9qdm0vQW5kcm9pZC5icAppbmRleCA2NDE2MjUyLi44NGQwMGI1IDEwMDY0NAotLS0gYS90b29scy9hY29uZmlnL2Zha2VfZGV2aWNlX2NvbmZpZy9zcmMvYW5kcm9pZC9vcy9TdHJpY3RNb2RlLmphdmEKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2p2bS9BbmRyb2lkLmJwCkBAIC0xNCwxNiArMTQsMTUgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLXBhY2thZ2UgYW5kcm9pZC5vczsKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKK30KIAotcHVibGljIGNsYXNzIFN0cmljdE1vZGUgewotICAgIHB1YmxpYyBzdGF0aWMgVGhyZWFkUG9saWN5IGFsbG93VGhyZWFkRGlza1JlYWRzKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlN0dWIhIik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFRocmVhZFBvbGljeShmaW5hbCBUaHJlYWRQb2xpY3kgcG9saWN5KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiU3R1YiEiKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFRocmVhZFBvbGljeSB7fQoramF2YV9saWJyYXJ5IHsKKyAgICBuYW1lOiAiaWRlX3F1ZXJ5X3Byb2JlcnNjcmlwdF9qdm0iLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkZvby5qYXZhIiwKKyAgICAgICAgIkJhci5qYXZhIiwKKyAgICAgICAgIm90aGVyL090aGVyLmphdmEiLAorICAgIF0sCiB9CmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvanZtL0Jhci5qYXZhIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2p2bS9CYXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDUxNTc2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2p2bS9CYXIuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGp2bTsKKworLyoqIEJhciBjbGFzcy4gVGhlIGNsYXNzIGZvciB0ZXN0aW5nIGNvZGUgYXNzaXN0IHdpdGhpbiB0aGUgc2FtZSBidWlsZCBtb2R1bGUuICovCitjbGFzcyBCYXI8SyBleHRlbmRzIE51bWJlciwgViBleHRlbmRzIE51bWJlcj4geworICBCYXIoKSB7CisgICAgZm9vKG5ldyBGb28oKSk7CisgIH0KKworICB2b2lkIGZvbyhGb28gZikge30KKworICB2b2lkIGZvbyhPYmplY3Qgbykge30KKworICB2b2lkIGJhcihGb28gZikge30KKworICB2b2lkIGJheihPYmplY3Qgbykge30KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvanZtL0Zvby5qYXZhIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2p2bS9Gb28uamF2YQppbmRleCBhMDQzZjcyLi4yYzhjZWI2IDEwMDY0NAotLS0gYS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvanZtL0Zvby5qYXZhCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9qdm0vRm9vLmphdmEKQEAgLTE2LDIyICsxNiwxMDkgQEAKIAogcGFja2FnZSBqdm07CiAKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OworaW1wb3J0IGp2bS5vdGhlci5PdGhlcjsKIAogLyoqIEZvbyBjbGFzcy4gKi8KIHB1YmxpYyBmaW5hbCBjbGFzcyBGb28geworLy8gICAgICAgICAgICAgICBeICBeIGZvb19kZWYKKworICB2b2lkIHRlc3RQYXJhbWV0ZXJJbmZvKCkgeworICAgIC8vIFRlc3Qgc2lnbmF0dXJlIGhlbHAgZm9yIHR5cGUgcGFyYW1ldGVycy4KKworICAgIEJhcjxJbnRlZ2VyLCBEb3VibGU+IGIgPSBuZXcgQmFyPD4oKTsKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBeIGN0b3IKKyAgICAvLyAgICAgXiBkZWNsXzEKKyAgICAvLyAgICAgICAgICAgICAgXiBkZWNsXzIKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oYik7CisKKyAgICAvLyBzdGVwIGF0IGN0b3IKKyAgICAvLyB3b3Jrc3BhY2Uud2FpdEZvclJlYWR5KCkKKyAgICAvLyBwYXJhbWluZm8udHJpZ2dlcigpCisgICAgLy8gYXNzZXJ0IHBhcmFtaW5mby5pdGVtcy5maWx0ZXIoCisgICAgLy8gIGxhYmVsPSJLIGV4dGVuZHMgTnVtYmVyLCBWIGV4dGVuZHMgTnVtYmVyIiwKKyAgICAvLyAgc2VsZWN0aW9uPSJLIGV4dGVuZHMgTnVtYmVyIiwKKyAgICAvLyApCisKKyAgICAvLyBzdGVwIGF0IGRlY2xfMQorICAgIC8vIHdvcmtzcGFjZS53YWl0Rm9yUmVhZHkoKQorICAgIC8vIHBhcmFtaW5mby50cmlnZ2VyKCkKKyAgICAvLyBhc3NlcnQgcGFyYW1pbmZvLml0ZW1zLmZpbHRlcigKKyAgICAvLyAgbGFiZWw9IksgZXh0ZW5kcyBOdW1iZXIsIFYgZXh0ZW5kcyBOdW1iZXIiLAorICAgIC8vICBzZWxlY3Rpb249IksgZXh0ZW5kcyBOdW1iZXIiLAorICAgIC8vICkKKworICAgIC8vIHN0ZXAgYXQgZGVjbF8yCisgICAgLy8gd29ya3NwYWNlLndhaXRGb3JSZWFkeSgpCisgICAgLy8gcGFyYW1pbmZvLnRyaWdnZXIoKQorICAgIC8vIGFzc2VydCBwYXJhbWluZm8uaXRlbXMuZmlsdGVyKAorICAgIC8vICBsYWJlbD0iSyBleHRlbmRzIE51bWJlciwgViBleHRlbmRzIE51bWJlciIsCisgICAgLy8gIHNlbGVjdGlvbj0iViBleHRlbmRzIE51bWJlciIsCisgICAgLy8gKQorCisgICAgLy8gVGVzdCBzaWduYXR1cmUgaGVscCBmb3IgY29uc3RydWN0b3IgcGFyYW1ldGVycy4KKworICAgIE90aGVyIG90aGVyID0gbmV3IE90aGVyKDEyMywgImZvbyIpOworICAgIC8vICAgICAgICAgICAgICAgICAgICAgICBeIHBhcmFtXzEKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiBwYXJhbV8yCisgICAgU3lzdGVtLm91dC5wcmludGxuKG90aGVyKTsKKworICAgIC8vIHN0ZXAgYXQgcGFyYW1fMQorICAgIC8vIHdvcmtzcGFjZS53YWl0Rm9yUmVhZHkoKQorICAgIC8vIHBhcmFtaW5mby50cmlnZ2VyKCkKKyAgICAvLyBhc3NlcnQgcGFyYW1pbmZvLml0ZW1zLmZpbHRlcigKKyAgICAvLyAgbGFiZWw9IlxcKGludCBmaXJzdCwgU3RyaW5nIHNlY29uZFxcKSIsCisgICAgLy8gIHNlbGVjdGlvbj0iaW50IGZpcnN0IiwKKyAgICAvLyApCisKKyAgICAvLyBzdGVwIGF0IHBhcmFtXzIKKyAgICAvLyB3b3Jrc3BhY2Uud2FpdEZvclJlYWR5KCkKKyAgICAvLyBwYXJhbWluZm8udHJpZ2dlcigpCisgICAgLy8gYXNzZXJ0IHBhcmFtaW5mby5pdGVtcy5lbXB0eSgpCisgIH0KIAogICB2b2lkIHRlc3RDb21wbGV0aW9uKCkgewotICAgIEFycmF5TGlzdDxJbnRlZ2VyPiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgU3lzdGVtLm91dC5wcmludGxuKGxpc3QpOworICAgIEJhcjxJbnRlZ2VyLCBEb3VibGU+IGIgPSBuZXcgQmFyPD4oKTsKKyAgICBTeXN0ZW0ub3V0LnByaW50bG4oYik7CiAKICAgICAvLyBeCiAKICAgICAvLyBzdGVwCi0gICAgLy8gOyBUZXN0IGNvbXBsZXRpb24gb24gdGhlIHN0YW5kYXJkIHR5cGVzLgotICAgIC8vIHR5cGUoImxpc3QuIikKKyAgICAvLyA7IFRlc3QgY29tcGxldGlvbiBvbiB0eXBlcyBmcm9tIHRoZSBzYW1lIHBhY2thZ2UuCisgICAgLy8gd29ya3NwYWNlLndhaXRGb3JSZWFkeSgpCisgICAgLy8gdHlwZSgiYi4iKQogICAgIC8vIGNvbXBsZXRpb24udHJpZ2dlcigpCi0gICAgLy8gYXNzZXJ0IGNvbXBsZXRpb24uaXRlbXMuZmlsdGVyKGxhYmVsPSJhZGQuKiIpCisgICAgLy8gYXNzZXJ0IGNvbXBsZXRpb24uaXRlbXMuZmlsdGVyKGxhYmVsPSJmb28uKiIpCisgICAgLy8gZGVsbGluZSgpCisKKyAgICBPdGhlciBvdGhlciA9IG5ldyBPdGhlcigxLCAiZm9vIik7CisgICAgU3lzdGVtLm91dC5wcmludGxuKG90aGVyKTsKKworICAgIC8vIF4KKworICAgIC8vIHN0ZXAKKyAgICAvLyA7IFRlc3QgY29tcGxldGlvbiBvbiB0eXBlcyBmcm9tIGEgZGlmZmVyZW50IHBhY2thZ2UuCisgICAgLy8gd29ya3NwYWNlLndhaXRGb3JSZWFkeSgpCisgICAgLy8gdHlwZSgib3RoZXIuIikKKyAgICAvLyBjb21wbGV0aW9uLnRyaWdnZXIoKQorICAgIC8vIGFwcGx5KGNvbXBsZXRpb24uaXRlbXMuZmlsdGVyKGxhYmVsPSJvdGhlci4qIikuZmlyc3QoKSkKKyAgICAvLyB0eXBlKCIuIikKKyAgICAvLyBjb21wbGV0aW9uLnRyaWdnZXIoKQorICAgIC8vIGFwcGx5KGNvbXBsZXRpb24uaXRlbXMuZmlsdGVyKGxhYmVsPSJvdGhlci4qIikuZmlyc3QoKSkKKyAgICAvLyBkZWxsaW5lKCkKKyAgfQorCisgIHZvaWQgdGVzdERpYWdub3N0aWNzKCkgeworCisgICAgLy8gXgorCisgICAgLy8gc3RlcAorICAgIC8vIDsgVGVzdCBkaWFnbm9zdGljcyBhYm91dCB3cm9uZyB0eXBlIGFyZ3VtZW50IGJvdW5kcy4KKyAgICAvLyB3b3Jrc3BhY2Uud2FpdEZvclJlYWR5KCkKKyAgICAvLyB0eXBlKCJCYXI8U3RyaW5nLCBEb3VibGU+IGI7IikKKyAgICAvLyBhc3NlcnQgZGlhZ25vc3RpY3MuaXRlbXMuZmlsdGVyKAorICAgIC8vICBtZXNzYWdlPSJ0eXBlIGFyZ3VtZW50IC4qIGlzIG5vdCB3aXRoaW4gYm91bmRzIC4qIiwKKyAgICAvLyAgY29kZT0iY29tcGlsZXIuZXJyLm5vdC53aXRoaW4uYm91bmRzIiwKKyAgICAvLyApCisgICAgLy8gZGVsbGluZSgpCiAgIH0KIH0KZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9qdm0vaWRlX3F1ZXJ5Lm91dCBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9qdm0vaWRlX3F1ZXJ5Lm91dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjlmYjg2Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2p2bS9pZGVfcXVlcnkub3V0CkBAIC0wLDAgKzEsNCBAQAorCisDb3V0MlgKKzZidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9qdm0vRm9vLmphdmESAggBGhppZGVfcXVlcnlfcHJvYmVyc2NyaXB0X2p2bTrOAQorGmlkZV9xdWVyeV9wcm9iZXJzY3JpcHRfanZtEAEaNmJ1aWxkL21ha2UvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2p2bS9Gb28uamF2YRo2YnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvanZtL0Jhci5qYXZhGj5idWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9qdm0vb3RoZXIvT3RoZXIuamF2YQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9qdm0vb3RoZXIvT3RoZXIuamF2YSBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9qdm0vb3RoZXIvT3RoZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjI2NjJhCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL2p2bS9vdGhlci9PdGhlci5qYXZhCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UganZtLm90aGVyOworCisvKiogT3RoZXIgY2xhc3MgKi8KK3B1YmxpYyBjbGFzcyBPdGhlciB7CisgIHB1YmxpYyBPdGhlcihpbnQgZmlyc3QsIFN0cmluZyBzZWNvbmQpIHt9CisKKyAgcHVibGljIE90aGVyIG90aGVyKCkgeworICAgIHJldHVybiBuZXcgT3RoZXIoMCwgIiIpOworICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvcmVnZW4uc2ggYi90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvcmVnZW4uc2gKaW5kZXggMmVkZmU1My4uMDRhMDI2NCAxMDA3NTUKLS0tIGEvdG9vbHMvaWRlX3F1ZXJ5L3Byb2Jlcl9zY3JpcHRzL3JlZ2VuLnNoCisrKyBiL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9yZWdlbi5zaApAQCAtMjEsMTMgKzIxLDggQEAKICMgaWRlX3F1ZXJ5LnNoLiBUaGUgcHJvYmVyIGRvZXNuJ3QgY2hlY2stb3V0IHRoZSBmdWxsIHNvdXJjZSBjb2RlLCBzbyBpdAogIyBjYW4ndCBydW4gaWRlX3F1ZXJ5LnNoIGl0c2VsZi4KIAotY2QgJChkaXJuYW1lICRCQVNIX1NPVVJDRSkKLXNvdXJjZSAkKHB3ZCkvLi4vLi4vLi4vc2hlbGxfdXRpbHMuc2gKLXJlcXVpcmVfdG9wCi0KIGZpbGVzX3RvX2J1aWxkPSgKICAgYnVpbGQvbWFrZS90b29scy9pZGVfcXVlcnkvcHJvYmVyX3NjcmlwdHMvY3BwL2dlbmVyYWwuY2MKICkKIAotY2QgJHtUT1B9CiBidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9pZGVfcXVlcnkuc2ggLS1sdW5jaF90YXJnZXQ9YW9zcF9hcm0tdHJ1bmtfc3RhZ2luZy1lbmcgJHtmaWxlc190b19idWlsZFtAXX0gPiBidWlsZC9tYWtlL3Rvb2xzL2lkZV9xdWVyeS9wcm9iZXJfc2NyaXB0cy9pZGVfcXVlcnkub3V0CmRpZmYgLS1naXQgYS90b29scy9qYXZhLWV2ZW50LWxvZy10YWdzLnB5IGIvdG9vbHMvamF2YS1ldmVudC1sb2ctdGFncy5weQppbmRleCBiYmQ2NWZhLi5lM2RjMDdlIDEwMDc1NQotLS0gYS90b29scy9qYXZhLWV2ZW50LWxvZy10YWdzLnB5CisrKyBiL3Rvb2xzL2phdmEtZXZlbnQtbG9nLXRhZ3MucHkKQEAgLTE1LDE2ICsxNSwxMiBAQAogIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogIiIiCi1Vc2FnZTogamF2YS1ldmVudC1sb2ctdGFncy5weSBbLW8gb3V0cHV0X2ZpbGVdIDxpbnB1dF9maWxlPiA8bWVyZ2VkX3RhZ3NfZmlsZT4KLQogR2VuZXJhdGUgYSBqYXZhIGNsYXNzIGNvbnRhaW5pbmcgY29uc3RhbnRzIGZvciBlYWNoIG9mIHRoZSBldmVudCBsb2cKIHRhZ3MgaW4gdGhlIGdpdmVuIGlucHV0IGZpbGUuCi0KLS1oIHRvIGRpc3BsYXkgdGhpcyB1c2FnZSBtZXNzYWdlIGFuZCBleGl0LgogIiIiCiAKIGZyb20gaW8gaW1wb3J0IFN0cmluZ0lPCi1pbXBvcnQgZ2V0b3B0CitpbXBvcnQgYXJncGFyc2UKIGltcG9ydCBvcwogaW1wb3J0IG9zLnBhdGgKIGltcG9ydCByZQpAQCAtMzIsNTcgKzI4LDE0IEBACiAKIGltcG9ydCBldmVudF9sb2dfdGFncwogCi1vdXRwdXRfZmlsZSA9IE5vbmUKK3BhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGRlc2NyaXB0aW9uPV9fZG9jX18pCitwYXJzZXIuYWRkX2FyZ3VtZW50KCctbycsIGRlc3Q9J291dHB1dF9maWxlJykKK3BhcnNlci5hZGRfYXJndW1lbnQoJ2ZpbGUnKQorYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKCkKIAotdHJ5OgotICBvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICJobzoiKQotZXhjZXB0IGdldG9wdC5HZXRvcHRFcnJvciBhcyBlcnI6Ci0gIHByaW50KHN0cihlcnIpKQotICBwcmludChfX2RvY19fKQotICBzeXMuZXhpdCgyKQotCi1mb3IgbywgYSBpbiBvcHRzOgotICBpZiBvID09ICItaCI6Ci0gICAgcHJpbnQoX19kb2NfXykKLSAgICBzeXMuZXhpdCgyKQotICBlbGlmIG8gPT0gIi1vIjoKLSAgICBvdXRwdXRfZmlsZSA9IGEKLSAgZWxzZToKLSAgICBwcmludCgidW5oYW5kbGVkIG9wdGlvbiAlcyIgJSAobywpLCBmaWxlPXN5cy5zdGRlcnIpCi0gICAgc3lzLmV4aXQoMSkKLQotaWYgbGVuKGFyZ3MpICE9IDEgYW5kIGxlbihhcmdzKSAhPSAyOgotICBwcmludCgibmVlZCBvbmUgb3IgdHdvIGlucHV0IGZpbGVzLCBub3QgJWQiICUgKGxlbihhcmdzKSwpKQotICBwcmludChfX2RvY19fKQotICBzeXMuZXhpdCgxKQotCi1mbiA9IGFyZ3NbMF0KK2ZuID0gYXJncy5maWxlCiB0YWdmaWxlID0gZXZlbnRfbG9nX3RhZ3MuVGFnRmlsZShmbikKIAotaWYgbGVuKGFyZ3MpID4gMToKLSAgIyBMb2FkIHRoZSBtZXJnZWQgdGFnIGZpbGUgKHdoaWNoIHNob3VsZCBoYXZlIG51bWJlcnMgYXNzaWduZWQgZm9yIGFsbAotICAjIHRhZ3MuICBVc2UgdGhlIG51bWJlcnMgZnJvbSB0aGUgbWVyZ2VkIGZpbGUgdG8gZmlsbCBpbiBhbnkgbWlzc2luZwotICAjIG51bWJlcnMgZnJvbSB0aGUgaW5wdXQgZmlsZS4KLSAgbWVyZ2VkX2ZuID0gYXJnc1sxXQotICBtZXJnZWRfdGFnZmlsZSA9IGV2ZW50X2xvZ190YWdzLlRhZ0ZpbGUobWVyZ2VkX2ZuKQotICBtZXJnZWRfYnlfbmFtZSA9IGRpY3QoWyh0LnRhZ25hbWUsIHQpIGZvciB0IGluIG1lcmdlZF90YWdmaWxlLnRhZ3NdKQotICBmb3IgdCBpbiB0YWdmaWxlLnRhZ3M6Ci0gICAgaWYgdC50YWdudW0gaXMgTm9uZToKLSAgICAgIGlmIHQudGFnbmFtZSBpbiBtZXJnZWRfYnlfbmFtZToKLSAgICAgICAgdC50YWdudW0gPSBtZXJnZWRfYnlfbmFtZVt0LnRhZ25hbWVdLnRhZ251bQotICAgICAgZWxzZToKLSAgICAgICAgIyBXZSdyZSBidWlsZGluZyBzb21ldGhpbmcgdGhhdCdzIG5vdCBiZWluZyBpbmNsdWRlZCBpbiB0aGUKLSAgICAgICAgIyBwcm9kdWN0LCBzbyBpdHMgdGFncyBkb24ndCBhcHBlYXIgaW4gdGhlIG1lcmdlZCBmaWxlLiAgQXNzaWduCi0gICAgICAgICMgdGhlbSBhbGwgYW4gYXJiaXRyYXJ5IG51bWJlciBzbyB3ZSBjYW4gZW1pdCB0aGUgamF2YSBhbmQKLSAgICAgICAgIyBjb21waWxlIHRoZSAodW51c2VkKSBwYWNrYWdlLgotICAgICAgICB0LnRhZ251bSA9IDk5OTk5OQotZWxzZToKLSAgIyBOb3QgdXNpbmcgdGhlIG1lcmdlZCB0YWcgZmlsZSwgc28gYWxsIHRhZ3MgbXVzdCBoYXZlIG1hbnVhbGx5IGFzc2lnbmVkCi0gICMgbnVtYmVycwotICBmb3IgdCBpbiB0YWdmaWxlLnRhZ3M6Ci0gICAgaWYgdC50YWdudW0gaXMgTm9uZToKLSAgICAgIHRhZ2ZpbGVmLkFkZEVycm9yKCJ0YWcgXCIlc1wiIGhhcyBubyBudW1iZXIiICUgKHRhZ25hbWUsKSwgdGFnLmxpbmVudW0pCi0KIGlmICJqYXZhX3BhY2thZ2UiIG5vdCBpbiB0YWdmaWxlLm9wdGlvbnM6CiAgIHRhZ2ZpbGUuQWRkRXJyb3IoImphdmFfcGFja2FnZSBvcHRpb24gbm90IHNwZWNpZmllZCIsIGxpbmVudW09MCkKIApAQCAtMTQxLDExICs5NCwxMSBAQAogZm9yIHQgaW4gdGFnZmlsZS50YWdzOgogICBtZXRob2ROYW1lID0gamF2YU5hbWUoIndyaXRlXyIgKyB0LnRhZ25hbWUpCiAgIGlmIHQuZGVzY3JpcHRpb246Ci0gICAgYXJncyA9IFthcmcuc3RyaXAoIigpICIpLnNwbGl0KCJ8IikgZm9yIGFyZyBpbiB0LmRlc2NyaXB0aW9uLnNwbGl0KCIsIildCisgICAgZm5fYXJncyA9IFthcmcuc3RyaXAoIigpICIpLnNwbGl0KCJ8IikgZm9yIGFyZyBpbiB0LmRlc2NyaXB0aW9uLnNwbGl0KCIsIildCiAgIGVsc2U6Ci0gICAgYXJncyA9IFtdCi0gIGFyZ1R5cGVzTmFtZXMgPSAiLCAiLmpvaW4oW2phdmFUeXBlc1tpbnQoYXJnWzFdKV0gKyAiICIgKyBqYXZhTmFtZShhcmdbMF0pIGZvciBhcmcgaW4gYXJnc10pCi0gIGFyZ05hbWVzID0gIiIuam9pbihbIiwgIiArIGphdmFOYW1lKGFyZ1swXSkgZm9yIGFyZyBpbiBhcmdzXSkKKyAgICBmbl9hcmdzID0gW10KKyAgYXJnVHlwZXNOYW1lcyA9ICIsICIuam9pbihbamF2YVR5cGVzW2ludChhcmdbMV0pXSArICIgIiArIGphdmFOYW1lKGFyZ1swXSkgZm9yIGFyZyBpbiBmbl9hcmdzXSkKKyAgYXJnTmFtZXMgPSAiIi5qb2luKFsiLCAiICsgamF2YU5hbWUoYXJnWzBdKSBmb3IgYXJnIGluIGZuX2FyZ3NdKQogICBidWZmZXIud3JpdGUoIlxuICBwdWJsaWMgc3RhdGljIHZvaWQgJXMoJXMpIHsiICUgKG1ldGhvZE5hbWUsIGFyZ1R5cGVzTmFtZXMpKQogICBidWZmZXIud3JpdGUoIlxuICAgIGFuZHJvaWQudXRpbC5FdmVudExvZy53cml0ZUV2ZW50KCVzJXMpOyIgJSAodC50YWduYW1lLnVwcGVyKCksIGFyZ05hbWVzKSkKICAgYnVmZmVyLndyaXRlKCJcbiAgfVxuIikKQEAgLTE1Myw4ICsxMDYsOCBAQAogCiBidWZmZXIud3JpdGUoIn1cbiIpOwogCi1vdXRwdXRfZGlyID0gb3MucGF0aC5kaXJuYW1lKG91dHB1dF9maWxlKQorb3V0cHV0X2RpciA9IG9zLnBhdGguZGlybmFtZShhcmdzLm91dHB1dF9maWxlKQogaWYgbm90IG9zLnBhdGguZXhpc3RzKG91dHB1dF9kaXIpOgogICBvcy5tYWtlZGlycyhvdXRwdXRfZGlyKQogCi1ldmVudF9sb2dfdGFncy5Xcml0ZU91dHB1dChvdXRwdXRfZmlsZSwgYnVmZmVyKQorZXZlbnRfbG9nX3RhZ3MuV3JpdGVPdXRwdXQoYXJncy5vdXRwdXRfZmlsZSwgYnVmZmVyKQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWVyZ2UtZXZlbnQtbG9nLXRhZ3MucHkgYi90b29scy9tZXJnZS1ldmVudC1sb2ctdGFncy5weQppbmRleCAyOTI2MDRjLi41NzMwYzExIDEwMDc1NQotLS0gYS90b29scy9tZXJnZS1ldmVudC1sb2ctdGFncy5weQorKysgYi90b29scy9tZXJnZS1ldmVudC1sb2ctdGFncy5weQpAQCAtMTUsMjIgKzE1LDEzIEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAiIiIKLVVzYWdlOiBtZXJnZS1ldmVudC1sb2ctdGFncy5weSBbLW8gb3V0cHV0X2ZpbGVdIFtpbnB1dF9maWxlcy4uLl0KLQogTWVyZ2UgdG9nZXRoZXIgemVybyBvciBtb3JlIGV2ZW50LWxvZ3MtdGFncyBmaWxlcyB0byBwcm9kdWNlIGEgc2luZ2xlCiBvdXRwdXQgZmlsZSwgc3RyaXBwZWQgb2YgY29tbWVudHMuICBDaGVja3MgdGhhdCBubyB0YWcgbnVtYmVycyBjb25mbGljdAogYW5kIGZhaWxzIGlmIHRoZXkgZG8uCi0KLS1oIHRvIGRpc3BsYXkgdGhpcyB1c2FnZSBtZXNzYWdlIGFuZCBleGl0LgogIiIiCiAKIGZyb20gaW8gaW1wb3J0IFN0cmluZ0lPCi1pbXBvcnQgZ2V0b3B0Ci10cnk6Ci0gIGltcG9ydCBoYXNobGliCi1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gIGltcG9ydCBtZDUgYXMgaGFzaGxpYgotaW1wb3J0IHN0cnVjdAoraW1wb3J0IGFyZ3BhcnNlCiBpbXBvcnQgc3lzCiAKIGltcG9ydCBldmVudF9sb2dfdGFncwpAQCAtMzgsMzIgKzI5LDEwIEBACiBlcnJvcnMgPSBbXQogd2FybmluZ3MgPSBbXQogCi1vdXRwdXRfZmlsZSA9IE5vbmUKLXByZV9tZXJnZWRfZmlsZSA9IE5vbmUKLQotIyBUYWdzIHdpdGggYSB0YWcgbnVtYmVyIG9mID8gYXJlIGFzc2lnbmVkIGEgdGFnIGluIHRoZSByYW5nZQotIyBbQVNTSUdOX1NUQVJULCBBU1NJR05fTElNSVQpLgotQVNTSUdOX1NUQVJUID0gOTAwMDAwCi1BU1NJR05fTElNSVQgPSAxMDAwMDAwCi0KLXRyeToKLSAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAiaG86bToiKQotZXhjZXB0IGdldG9wdC5HZXRvcHRFcnJvciBhcyBlcnI6Ci0gIHByaW50KHN0cihlcnIpKQotICBwcmludChfX2RvY19fKQotICBzeXMuZXhpdCgyKQotCi1mb3IgbywgYSBpbiBvcHRzOgotICBpZiBvID09ICItaCI6Ci0gICAgcHJpbnQoX19kb2NfXykKLSAgICBzeXMuZXhpdCgyKQotICBlbGlmIG8gPT0gIi1vIjoKLSAgICBvdXRwdXRfZmlsZSA9IGEKLSAgZWxpZiBvID09ICItbSI6Ci0gICAgcHJlX21lcmdlZF9maWxlID0gYQotICBlbHNlOgotICAgIHByaW50KCJ1bmhhbmRsZWQgb3B0aW9uICVzIiAlIChvLCksIGZpbGU9c3lzLnN0ZGVycikKLSAgICBzeXMuZXhpdCgxKQorcGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249X19kb2NfXykKK3BhcnNlci5hZGRfYXJndW1lbnQoJy1vJywgZGVzdD0nb3V0cHV0X2ZpbGUnKQorcGFyc2VyLmFkZF9hcmd1bWVudCgnZmlsZXMnLCBuYXJncz0nKicpCithcmdzID0gcGFyc2VyLnBhcnNlX2FyZ3MoKQogCiAjIFJlc3RyaWN0aW9ucyBvbiB0YWdzOgogIwpAQCAtNzcsMTIgKzQ2LDcgQEAKIGJ5X3RhZ25hbWUgPSB7fQogYnlfdGFnbnVtID0ge30KIAotcHJlX21lcmdlZF90YWdzID0ge30KLWlmIHByZV9tZXJnZWRfZmlsZToKLSAgZm9yIHQgaW4gZXZlbnRfbG9nX3RhZ3MuVGFnRmlsZShwcmVfbWVyZ2VkX2ZpbGUpLnRhZ3M6Ci0gICAgcHJlX21lcmdlZF90YWdzW3QudGFnbmFtZV0gPSB0Ci0KLWZvciBmbiBpbiBhcmdzOgorZm9yIGZuIGluIGFyZ3MuZmlsZXM6CiAgIHRhZ2ZpbGUgPSBldmVudF9sb2dfdGFncy5UYWdGaWxlKGZuKQogCiAgIGZvciB0IGluIHRhZ2ZpbGUudGFnczoKQEAgLTkzLDEyICs1Nyw2IEBACiAgICAgaWYgdC50YWduYW1lIGluIGJ5X3RhZ25hbWU6CiAgICAgICBvcmlnID0gYnlfdGFnbmFtZVt0LnRhZ25hbWVdCiAKLSAgICAgICMgQWxsb3cgYW4gZXhwbGljaXQgdGFnIG51bWJlciB0byBkZWZpbmUgYW4gaW1wbGljaXQgdGFnIG51bWJlcgotICAgICAgaWYgb3JpZy50YWdudW0gaXMgTm9uZToKLSAgICAgICAgb3JpZy50YWdudW0gPSB0LnRhZ251bQotICAgICAgZWxpZiB0LnRhZ251bSBpcyBOb25lOgotICAgICAgICB0LnRhZ251bSA9IG9yaWcudGFnbnVtCi0KICAgICAgIGlmICh0LnRhZ251bSA9PSBvcmlnLnRhZ251bSBhbmQKICAgICAgICAgICB0LmRlc2NyaXB0aW9uID09IG9yaWcuZGVzY3JpcHRpb24pOgogICAgICAgICAjIGlmIHRoZSBuYW1lIGFuZCBkZXNjcmlwdGlvbiBhcmUgaWRlbnRpY2FsLCBpc3N1ZSBhIHdhcm5pbmcKQEAgLTExNCw3ICs3Miw3IEBACiAgICAgICAgICAgICBsaW5lbnVtPXQubGluZW51bSkKICAgICAgIGNvbnRpbnVlCiAKLSAgICBpZiB0LnRhZ251bSBpcyBub3QgTm9uZSBhbmQgdC50YWdudW0gaW4gYnlfdGFnbnVtOgorICAgIGlmIHQudGFnbnVtIGluIGJ5X3RhZ251bToKICAgICAgIG9yaWcgPSBieV90YWdudW1bdC50YWdudW1dCiAKICAgICAgIGlmIHQudGFnbmFtZSAhPSBvcmlnLnRhZ25hbWU6CkBAIC0xMjUsOCArODMsNyBAQAogICAgICAgICBjb250aW51ZQogCiAgICAgYnlfdGFnbmFtZVt0LnRhZ25hbWVdID0gdAotICAgIGlmIHQudGFnbnVtIGlzIG5vdCBOb25lOgotICAgICAgYnlfdGFnbnVtW3QudGFnbnVtXSA9IHQKKyAgICBieV90YWdudW1bdC50YWdudW1dID0gdAogCiAgIGVycm9ycy5leHRlbmQodGFnZmlsZS5lcnJvcnMpCiAgIHdhcm5pbmdzLmV4dGVuZCh0YWdmaWxlLndhcm5pbmdzKQpAQCAtMTQwLDM4ICs5Nyw2IEBACiAgIGZvciBmbiwgbG4sIG1zZyBpbiB3YXJuaW5nczoKICAgICBwcmludCgiJXM6JWQ6IHdhcm5pbmc6ICVzIiAlIChmbiwgbG4sIG1zZyksIGZpbGU9c3lzLnN0ZGVycikKIAotIyBQeXRob24ncyBoYXNoIGZ1bmN0aW9uIChhKSBpc24ndCBncmVhdCBhbmQgKGIpIHZhcmllcyBiZXR3ZWVuCi0jIHZlcnNpb25zIG9mIHB5dGhvbi4gIFVzaW5nIG1kNSBpcyBvdmVya2lsbCBoZXJlIGJ1dCBpcyB0aGUgc2FtZSBmcm9tCi0jIHBsYXRmb3JtIHRvIHBsYXRmb3JtIGFuZCBzcGVlZCBzaG91bGRuJ3QgbWF0dGVyIGluIHByYWN0aWNlLgotZGVmIGhhc2huYW1lKHN0cik6Ci0gIGQgPSBoYXNobGliLm1kNShzdHIpLmRpZ2VzdCgpWzo0XQotICByZXR1cm4gc3RydWN0LnVucGFjaygiIUkiLCBkKVswXQotCi0jIEFzc2lnbiBhIHRhZyBudW1iZXIgdG8gYWxsIHRoZSBlbnRyaWVzIHRoYXQgc2F5IHRoZXkgd2FudCBvbmUKLSMgYXNzaWduZWQuICBXZSBkbyB0aGlzIGJhc2VkIG9uIGEgaGFzaCBvZiB0aGUgdGFnIG5hbWUgc28gdGhhdCB0aGUKLSMgbnVtYmVycyBzaG91bGQgc3RheSByZWxhdGl2ZWx5IHN0YWJsZSBhcyB0YWdzIGFyZSBhZGRlZC4KLQotIyBJZiB3ZSB3ZXJlIHByb3ZpZGVkIHByZS1tZXJnZWQgdGFncyAody8gdGhlIC1tIG9wdGlvbiksIHRoZW4gZG9uJ3QKLSMgZXZlciB0cnkgdG8gYWxsb2NhdGUgb25lLCBqdXN0IGZhaWwgaWYgd2UgZG9uJ3QgaGF2ZSBhIG51bWJlcgotCi1mb3IgbmFtZSwgdCBpbiBzb3J0ZWQoYnlfdGFnbmFtZS5pdGVtcygpKToKLSAgaWYgdC50YWdudW0gaXMgTm9uZToKLSAgICBpZiBwcmVfbWVyZ2VkX3RhZ3M6Ci0gICAgICB0cnk6Ci0gICAgICAgIHQudGFnbnVtID0gcHJlX21lcmdlZF90YWdzW3QudGFnbmFtZV0KLSAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgcHJpbnQoIkVycm9yOiBUYWcgbnVtYmVyIG5vdCBkZWZpbmVkIGZvciB0YWcgYCVzJy4gSGF2ZSB5b3UgZG9uZSBhIGZ1bGwgYnVpbGQ/IiAlIHQudGFnbmFtZSwKLSAgICAgICAgICAgICAgZmlsZT1zeXMuc3RkZXJyKQotICAgICAgICBzeXMuZXhpdCgxKQotICAgIGVsc2U6Ci0gICAgICB3aGlsZSBUcnVlOgotICAgICAgICB4ID0gKGhhc2huYW1lKG5hbWUpICUgKEFTU0lHTl9MSU1JVCAtIEFTU0lHTl9TVEFSVCAtIDEpKSArIEFTU0lHTl9TVEFSVAotICAgICAgICBpZiB4IG5vdCBpbiBieV90YWdudW06Ci0gICAgICAgICAgdC50YWdudW0gPSB4Ci0gICAgICAgICAgYnlfdGFnbnVtW3hdID0gdAotICAgICAgICAgIGJyZWFrCi0gICAgICAgIG5hbWUgPSAiXyIgKyBuYW1lCi0KICMgYnlfdGFnbnVtIHNob3VsZCBiZSBjb21wbGV0ZSBub3c7IHdlJ3ZlIGFzc2lnbmVkIG51bWJlcnMgdG8gYWxsIHRhZ3MuCiAKIGJ1ZmZlciA9IFN0cmluZ0lPKCkKQEAgLTE4MSw0ICsxMDYsNCBAQAogICBlbHNlOgogICAgIGJ1ZmZlci53cml0ZSgiJWQgJXNcbiIgJSAodC50YWdudW0sIHQudGFnbmFtZSkpCiAKLWV2ZW50X2xvZ190YWdzLldyaXRlT3V0cHV0KG91dHB1dF9maWxlLCBidWZmZXIpCitldmVudF9sb2dfdGFncy5Xcml0ZU91dHB1dChhcmdzLm91dHB1dF9maWxlLCBidWZmZXIpCmRpZmYgLS1naXQgYS90b29scy9tZXRhZGF0YS9BbmRyb2lkLmJwIGIvdG9vbHMvbWV0YWRhdGEvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdkMTA2ZC4uMDAwMDAwMAotLS0gYS90b29scy9tZXRhZGF0YS9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotcGFja2FnZSB7Ci0gICAgZGVmYXVsdF9hcHBsaWNhYmxlX2xpY2Vuc2VzOiBbIkFuZHJvaWQtQXBhY2hlLTIuMCJdLAotfQotCi1ibHVlcHJpbnRfZ29fYmluYXJ5IHsKLSAgICBuYW1lOiAibWV0YWRhdGEiLAotICAgIGRlcHM6IFsKLSAgICAgICAgICAgICJzb29uZy10ZXN0aW5nLXRlc3Rfc3BlY19wcm90byIsCi0gICAgICAgICAgICAic29vbmctdGVzdGluZy1jb2RlX21ldGFkYXRhX3Byb3RvIiwKLSAgICAgICAgICAgICJzb29uZy10ZXN0aW5nLWNvZGVfbWV0YWRhdGFfaW50ZXJuYWxfcHJvdG8iLAotICAgICAgICAgICAgImdvbGFuZy1wcm90b2J1Zi1wcm90byIsCi0gICAgICAgIF0sCi0gICAgc3JjczogWwotICAgICAgICAiZ2VuZXJhdG9yLmdvIiwKLSAgICBdCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWV0YWRhdGEvT1dORVJTIGIvdG9vbHMvbWV0YWRhdGEvT1dORVJTCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwM2JjZGYxLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL21ldGFkYXRhL09XTkVSUworKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotZGFyaW9mcmVuaUBnb29nbGUuY29tCi1qb2VvQGdvb2dsZS5jb20KLXJvbmlzaEBnb29nbGUuY29tCi1jYWRpdHlhQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL3Rvb2xzL21ldGFkYXRhL2dlbmVyYXRvci5nbyBiL3Rvb2xzL21ldGFkYXRhL2dlbmVyYXRvci5nbwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjc2NjhiZS4uMDAwMDAwMAotLS0gYS90b29scy9tZXRhZGF0YS9nZW5lcmF0b3IuZ28KKysrIC9kZXYvbnVsbApAQCAtMSwzMjggKzAsMCBAQAotcGFja2FnZSBtYWluCi0KLWltcG9ydCAoCi0JImZsYWciCi0JImZtdCIKLQkiaW8iCi0JImxvZyIKLQkib3MiCi0JInNvcnQiCi0JInN0cmluZ3MiCi0JInN5bmMiCi0KLQkiYW5kcm9pZC9zb29uZy90ZXN0aW5nL2NvZGVfbWV0YWRhdGFfaW50ZXJuYWxfcHJvdG8iCi0JImFuZHJvaWQvc29vbmcvdGVzdGluZy9jb2RlX21ldGFkYXRhX3Byb3RvIgotCSJhbmRyb2lkL3Nvb25nL3Rlc3RpbmcvdGVzdF9zcGVjX3Byb3RvIgotCSJnb29nbGUuZ29sYW5nLm9yZy9wcm90b2J1Zi9wcm90byIKLSkKLQotdHlwZSBrZXlUb0xvY2tzTWFwIHN0cnVjdCB7Ci0JbG9ja3Mgc3luYy5NYXAKLX0KLQotZnVuYyAoa2wgKmtleVRvTG9ja3NNYXApIEdldExvY2tGb3JLZXkoa2V5IHN0cmluZykgKnN5bmMuTXV0ZXggewotCW11dGV4LCBfIDo9IGtsLmxvY2tzLkxvYWRPclN0b3JlKGtleSwgJnN5bmMuTXV0ZXh7fSkKLQlyZXR1cm4gbXV0ZXguKCpzeW5jLk11dGV4KQotfQotCi0vLyBEZWZpbmUgYSBzdHJ1Y3QgdG8gaG9sZCB0aGUgY29tYmluYXRpb24gb2YgdGVhbSBJRCBhbmQgbXVsdGktb3duZXJzaGlwIGZsYWcgZm9yIHZhbGlkYXRpb24KLXR5cGUgc291cmNlRmlsZUF0dHJpYnV0ZXMgc3RydWN0IHsKLQlUZWFtSUQgICAgICAgICBzdHJpbmcKLQlNdWx0aU93bmVyc2hpcCBib29sCi0JUGF0aCAgICAgICAgICAgc3RyaW5nCi19Ci0KLWZ1bmMgZ2V0U29ydGVkS2V5cyhzeW5jTWFwICpzeW5jLk1hcCkgW11zdHJpbmcgewotCXZhciBhbGxLZXlzIFtdc3RyaW5nCi0Jc3luY01hcC5SYW5nZSgKLQkJZnVuYyhrZXksIF8gaW50ZXJmYWNle30pIGJvb2wgewotCQkJYWxsS2V5cyA9IGFwcGVuZChhbGxLZXlzLCBrZXkuKHN0cmluZykpCi0JCQlyZXR1cm4gdHJ1ZQotCQl9LAotCSkKLQotCXNvcnQuU3RyaW5ncyhhbGxLZXlzKQotCXJldHVybiBhbGxLZXlzCi19Ci0KLS8vIHdyaXRlUHJvdG9Ub0ZpbGUgbWFyc2hhbHMgYSBwcm90b2J1ZiBtZXNzYWdlIGFuZCB3cml0ZXMgaXQgdG8gYSBmaWxlCi1mdW5jIHdyaXRlUHJvdG9Ub0ZpbGUob3V0cHV0RmlsZSBzdHJpbmcsIG1lc3NhZ2UgcHJvdG8uTWVzc2FnZSkgewotCWRhdGEsIGVyciA6PSBwcm90by5NYXJzaGFsKG1lc3NhZ2UpCi0JaWYgZXJyICE9IG5pbCB7Ci0JCWxvZy5GYXRhbChlcnIpCi0JfQotCWZpbGUsIGVyciA6PSBvcy5DcmVhdGUob3V0cHV0RmlsZSkKLQlpZiBlcnIgIT0gbmlsIHsKLQkJbG9nLkZhdGFsKGVycikKLQl9Ci0JZGVmZXIgZmlsZS5DbG9zZSgpCi0KLQlfLCBlcnIgPSBmaWxlLldyaXRlKGRhdGEpCi0JaWYgZXJyICE9IG5pbCB7Ci0JCWxvZy5GYXRhbChlcnIpCi0JfQotfQotCi1mdW5jIHJlYWRGaWxlVG9TdHJpbmcoZmlsZVBhdGggc3RyaW5nKSBzdHJpbmcgewotCWZpbGUsIGVyciA6PSBvcy5PcGVuKGZpbGVQYXRoKQotCWlmIGVyciAhPSBuaWwgewotCQlsb2cuRmF0YWwoZXJyKQotCX0KLQlkZWZlciBmaWxlLkNsb3NlKCkKLQotCWRhdGEsIGVyciA6PSBpby5SZWFkQWxsKGZpbGUpCi0JaWYgZXJyICE9IG5pbCB7Ci0JCWxvZy5GYXRhbChlcnIpCi0JfQotCXJldHVybiBzdHJpbmcoZGF0YSkKLX0KLQotZnVuYyB3cml0ZUVtcHR5T3V0cHV0UHJvdG8ob3V0cHV0RmlsZSBzdHJpbmcsIG1ldGFkYXRhUnVsZSBzdHJpbmcpIHsKLQlmaWxlLCBlcnIgOj0gb3MuQ3JlYXRlKG91dHB1dEZpbGUpCi0JaWYgZXJyICE9IG5pbCB7Ci0JCWxvZy5GYXRhbChlcnIpCi0JfQotCXZhciBtZXNzYWdlIHByb3RvLk1lc3NhZ2UKLQlpZiBtZXRhZGF0YVJ1bGUgPT0gInRlc3Rfc3BlYyIgewotCQltZXNzYWdlID0gJnRlc3Rfc3BlY19wcm90by5UZXN0U3BlY3t9Ci0JfSBlbHNlIGlmIG1ldGFkYXRhUnVsZSA9PSAiY29kZV9tZXRhZGF0YSIgewotCQltZXNzYWdlID0gJmNvZGVfbWV0YWRhdGFfcHJvdG8uQ29kZU1ldGFkYXRhe30KLQl9Ci0JZGF0YSwgZXJyIDo9IHByb3RvLk1hcnNoYWwobWVzc2FnZSkKLQlpZiBlcnIgIT0gbmlsIHsKLQkJbG9nLkZhdGFsKGVycikKLQl9Ci0JZGVmZXIgZmlsZS5DbG9zZSgpCi0KLQlfLCBlcnIgPSBmaWxlLldyaXRlKFtdYnl0ZShkYXRhKSkKLQlpZiBlcnIgIT0gbmlsIHsKLQkJbG9nLkZhdGFsKGVycikKLQl9Ci19Ci0KLWZ1bmMgcHJvY2Vzc1Rlc3RTcGVjUHJvdG9idWYoCi0JZmlsZVBhdGggc3RyaW5nLCBvd25lcnNoaXBNZXRhZGF0YU1hcCAqc3luYy5NYXAsIGtleUxvY2tzICprZXlUb0xvY2tzTWFwLAotCWVyckNoIGNoYW4gZXJyb3IsIHdnICpzeW5jLldhaXRHcm91cCwKLSkgewotCWRlZmVyIHdnLkRvbmUoKQotCi0JZmlsZUNvbnRlbnQgOj0gc3RyaW5ncy5UcmltUmlnaHQocmVhZEZpbGVUb1N0cmluZyhmaWxlUGF0aCksICJcbiIpCi0JdGVzdERhdGEgOj0gdGVzdF9zcGVjX3Byb3RvLlRlc3RTcGVje30KLQllcnIgOj0gcHJvdG8uVW5tYXJzaGFsKFtdYnl0ZShmaWxlQ29udGVudCksICZ0ZXN0RGF0YSkKLQlpZiBlcnIgIT0gbmlsIHsKLQkJZXJyQ2ggPC0gZXJyCi0JCXJldHVybgotCX0KLQotCW93bmVyc2hpcE1ldGFkYXRhIDo9IHRlc3REYXRhLkdldE93bmVyc2hpcE1ldGFkYXRhTGlzdCgpCi0JZm9yIF8sIG1ldGFkYXRhIDo9IHJhbmdlIG93bmVyc2hpcE1ldGFkYXRhIHsKLQkJa2V5IDo9IG1ldGFkYXRhLkdldFRhcmdldE5hbWUoKQotCQlsb2NrIDo9IGtleUxvY2tzLkdldExvY2tGb3JLZXkoa2V5KQotCQlsb2NrLkxvY2soKQotCi0JCXZhbHVlLCBsb2FkZWQgOj0gb3duZXJzaGlwTWV0YWRhdGFNYXAuTG9hZE9yU3RvcmUoCi0JCQlrZXksIFtdKnRlc3Rfc3BlY19wcm90by5UZXN0U3BlY19Pd25lcnNoaXBNZXRhZGF0YXttZXRhZGF0YX0sCi0JCSkKLQkJaWYgbG9hZGVkIHsKLQkJCWV4aXN0aW5nTWV0YWRhdGEgOj0gdmFsdWUuKFtdKnRlc3Rfc3BlY19wcm90by5UZXN0U3BlY19Pd25lcnNoaXBNZXRhZGF0YSkKLQkJCWlzRHVwbGljYXRlIDo9IGZhbHNlCi0JCQlmb3IgXywgZXhpc3RpbmcgOj0gcmFuZ2UgZXhpc3RpbmdNZXRhZGF0YSB7Ci0JCQkJaWYgbWV0YWRhdGEuR2V0VHJlbmR5VGVhbUlkKCkgIT0gZXhpc3RpbmcuR2V0VHJlbmR5VGVhbUlkKCkgewotCQkJCQllcnJDaCA8LSBmbXQuRXJyb3JmKAotCQkJCQkJIkNvbmZsaWN0aW5nIHRyZW5keSB0ZWFtIElEcyBmb3VuZCBmb3IgJXMgYXQ6XG4lcyB3aXRoIHRlYW1JZCIrCi0JCQkJCQkJIjogJXMsXG4lcyB3aXRoIHRlYW1JZDogJXMiLAotCQkJCQkJa2V5LAotCQkJCQkJbWV0YWRhdGEuR2V0UGF0aCgpLCBtZXRhZGF0YS5HZXRUcmVuZHlUZWFtSWQoKSwgZXhpc3RpbmcuR2V0UGF0aCgpLAotCQkJCQkJZXhpc3RpbmcuR2V0VHJlbmR5VGVhbUlkKCksCi0JCQkJCSkKLQotCQkJCQlsb2NrLlVubG9jaygpCi0JCQkJCXJldHVybgotCQkJCX0KLQkJCQlpZiBtZXRhZGF0YS5HZXRUcmVuZHlUZWFtSWQoKSA9PSBleGlzdGluZy5HZXRUcmVuZHlUZWFtSWQoKSAmJiBtZXRhZGF0YS5HZXRQYXRoKCkgPT0gZXhpc3RpbmcuR2V0UGF0aCgpIHsKLQkJCQkJaXNEdXBsaWNhdGUgPSB0cnVlCi0JCQkJCWJyZWFrCi0JCQkJfQotCQkJfQotCQkJaWYgIWlzRHVwbGljYXRlIHsKLQkJCQlleGlzdGluZ01ldGFkYXRhID0gYXBwZW5kKGV4aXN0aW5nTWV0YWRhdGEsIG1ldGFkYXRhKQotCQkJCW93bmVyc2hpcE1ldGFkYXRhTWFwLlN0b3JlKGtleSwgZXhpc3RpbmdNZXRhZGF0YSkKLQkJCX0KLQkJfQotCi0JCWxvY2suVW5sb2NrKCkKLQl9Ci19Ci0KLS8vIHByb2Nlc3NDb2RlTWV0YWRhdGFQcm90b2J1ZiBwcm9jZXNzZXMgQ29kZU1ldGFkYXRhIHByb3RvYnVmIGZpbGVzCi1mdW5jIHByb2Nlc3NDb2RlTWV0YWRhdGFQcm90b2J1ZigKLQlmaWxlUGF0aCBzdHJpbmcsIG93bmVyc2hpcE1ldGFkYXRhTWFwICpzeW5jLk1hcCwgc291cmNlRmlsZU1ldGFkYXRhTWFwICpzeW5jLk1hcCwga2V5TG9ja3MgKmtleVRvTG9ja3NNYXAsCi0JZXJyQ2ggY2hhbiBlcnJvciwgd2cgKnN5bmMuV2FpdEdyb3VwLAotKSB7Ci0JZGVmZXIgd2cuRG9uZSgpCi0KLQlmaWxlQ29udGVudCA6PSBzdHJpbmdzLlRyaW1SaWdodChyZWFkRmlsZVRvU3RyaW5nKGZpbGVQYXRoKSwgIlxuIikKLQlpbnRlcm5hbENvZGVEYXRhIDo9IGNvZGVfbWV0YWRhdGFfaW50ZXJuYWxfcHJvdG8uQ29kZU1ldGFkYXRhSW50ZXJuYWx7fQotCWVyciA6PSBwcm90by5Vbm1hcnNoYWwoW11ieXRlKGZpbGVDb250ZW50KSwgJmludGVybmFsQ29kZURhdGEpCi0JaWYgZXJyICE9IG5pbCB7Ci0JCWVyckNoIDwtIGVycgotCQlyZXR1cm4KLQl9Ci0KLQkvLyBQcm9jZXNzIGVhY2ggVGFyZ2V0T3duZXJzaGlwIGVudHJ5Ci0JZm9yIF8sIGludGVybmFsTWV0YWRhdGEgOj0gcmFuZ2UgaW50ZXJuYWxDb2RlRGF0YS5HZXRUYXJnZXRPd25lcnNoaXBMaXN0KCkgewotCQlrZXkgOj0gaW50ZXJuYWxNZXRhZGF0YS5HZXRUYXJnZXROYW1lKCkKLQkJbG9jayA6PSBrZXlMb2Nrcy5HZXRMb2NrRm9yS2V5KGtleSkKLQkJbG9jay5Mb2NrKCkKLQotCQlmb3IgXywgc3JjRmlsZSA6PSByYW5nZSBpbnRlcm5hbE1ldGFkYXRhLkdldFNvdXJjZUZpbGVzKCkgewotCQkJc3JjRmlsZUtleSA6PSBzcmNGaWxlCi0JCQlzcmNGaWxlTG9jayA6PSBrZXlMb2Nrcy5HZXRMb2NrRm9yS2V5KHNyY0ZpbGVLZXkpCi0JCQlzcmNGaWxlTG9jay5Mb2NrKCkKLQkJCWF0dHJpYnV0ZXMgOj0gc291cmNlRmlsZUF0dHJpYnV0ZXN7Ci0JCQkJVGVhbUlEOiAgICAgICAgIGludGVybmFsTWV0YWRhdGEuR2V0VHJlbmR5VGVhbUlkKCksCi0JCQkJTXVsdGlPd25lcnNoaXA6IGludGVybmFsTWV0YWRhdGEuR2V0TXVsdGlPd25lcnNoaXAoKSwKLQkJCQlQYXRoOiAgICAgICAgICAgaW50ZXJuYWxNZXRhZGF0YS5HZXRQYXRoKCksCi0JCQl9Ci0KLQkJCWV4aXN0aW5nQXR0cmlidXRlcywgZXhpc3RzIDo9IHNvdXJjZUZpbGVNZXRhZGF0YU1hcC5Mb2FkKHNyY0ZpbGVLZXkpCi0JCQlpZiBleGlzdHMgewotCQkJCWV4aXN0aW5nIDo9IGV4aXN0aW5nQXR0cmlidXRlcy4oc291cmNlRmlsZUF0dHJpYnV0ZXMpCi0JCQkJaWYgYXR0cmlidXRlcy5UZWFtSUQgIT0gZXhpc3RpbmcuVGVhbUlEICYmICghYXR0cmlidXRlcy5NdWx0aU93bmVyc2hpcCB8fCAhZXhpc3RpbmcuTXVsdGlPd25lcnNoaXApIHsKLQkJCQkJZXJyQ2ggPC0gZm10LkVycm9yZigKLQkJCQkJCSJDb25mbGljdCBmb3VuZCBmb3Igc291cmNlIGZpbGUgJXMgY292ZXJlZCBhdCAlcyB3aXRoIHRlYW0gSUQ6ICVzLiBFeGlzdGluZyB0ZWFtIElEOiAlcyBhbmQgcGF0aDogJXMuIisKLQkJCQkJCQkiIElmIG11bHRpLW93bmVyc2hpcCBpcyByZXF1aXJlZCwgbXVsdGlPd25lcnNoaXAgc2hvdWxkIGJlIHNldCB0byB0cnVlIGluIGFsbCB0ZXN0X3NwZWMgbW9kdWxlcyB1c2luZyB0aGlzIHRhcmdldC4gIisKLQkJCQkJCQkiTXVsdGlwbGUtb3duZXJzaGlwIGluIGdlbmVyYWwgaXMgZGlzY291cmFnZWQgdGhvdWdoIGFzIGl0IG1ha2UgaW5mcmFzdHJ1Y3R1cmUgYXJvdW5kIGFuZHJvaWQgcmVseWluZyBvbiB0aGlzIGluZm9ybWF0aW9uIHBpY2sgdXAgYSByYW5kb20gdmFsdWUgd2hlbiBpdCBuZWVkcyBvbmx5IG9uZS4iLAotCQkJCQkJc3JjRmlsZSwgaW50ZXJuYWxNZXRhZGF0YS5HZXRQYXRoKCksIGF0dHJpYnV0ZXMuVGVhbUlELCBleGlzdGluZy5UZWFtSUQsIGV4aXN0aW5nLlBhdGgsCi0JCQkJCSkKLQkJCQkJc3JjRmlsZUxvY2suVW5sb2NrKCkKLQkJCQkJbG9jay5VbmxvY2soKQotCQkJCQlyZXR1cm4KLQkJCQl9Ci0JCQl9IGVsc2UgewotCQkJCS8vIFN0b3JlIHRoZSBtZXRhZGF0YSBpZiBubyBjb25mbGljdAotCQkJCXNvdXJjZUZpbGVNZXRhZGF0YU1hcC5TdG9yZShzcmNGaWxlS2V5LCBhdHRyaWJ1dGVzKQotCQkJfQotCQkJc3JjRmlsZUxvY2suVW5sb2NrKCkKLQkJfQotCi0JCXZhbHVlLCBsb2FkZWQgOj0gb3duZXJzaGlwTWV0YWRhdGFNYXAuTG9hZE9yU3RvcmUoCi0JCQlrZXksIFtdKmNvZGVfbWV0YWRhdGFfaW50ZXJuYWxfcHJvdG8uQ29kZU1ldGFkYXRhSW50ZXJuYWxfVGFyZ2V0T3duZXJzaGlwe2ludGVybmFsTWV0YWRhdGF9LAotCQkpCi0JCWlmIGxvYWRlZCB7Ci0JCQlleGlzdGluZ01ldGFkYXRhIDo9IHZhbHVlLihbXSpjb2RlX21ldGFkYXRhX2ludGVybmFsX3Byb3RvLkNvZGVNZXRhZGF0YUludGVybmFsX1RhcmdldE93bmVyc2hpcCkKLQkJCWlzRHVwbGljYXRlIDo9IGZhbHNlCi0JCQlmb3IgXywgZXhpc3RpbmcgOj0gcmFuZ2UgZXhpc3RpbmdNZXRhZGF0YSB7Ci0JCQkJaWYgaW50ZXJuYWxNZXRhZGF0YS5HZXRUcmVuZHlUZWFtSWQoKSA9PSBleGlzdGluZy5HZXRUcmVuZHlUZWFtSWQoKSAmJiBpbnRlcm5hbE1ldGFkYXRhLkdldFBhdGgoKSA9PSBleGlzdGluZy5HZXRQYXRoKCkgewotCQkJCQlpc0R1cGxpY2F0ZSA9IHRydWUKLQkJCQkJYnJlYWsKLQkJCQl9Ci0JCQl9Ci0JCQlpZiAhaXNEdXBsaWNhdGUgewotCQkJCWV4aXN0aW5nTWV0YWRhdGEgPSBhcHBlbmQoZXhpc3RpbmdNZXRhZGF0YSwgaW50ZXJuYWxNZXRhZGF0YSkKLQkJCQlvd25lcnNoaXBNZXRhZGF0YU1hcC5TdG9yZShrZXksIGV4aXN0aW5nTWV0YWRhdGEpCi0JCQl9Ci0JCX0KLQotCQlsb2NrLlVubG9jaygpCi0JfQotfQotCi1mdW5jIG1haW4oKSB7Ci0JaW5wdXRGaWxlIDo9IGZsYWcuU3RyaW5nKCJpbnB1dEZpbGUiLCAiIiwgIklucHV0IGZpbGUgcGF0aCIpCi0Jb3V0cHV0RmlsZSA6PSBmbGFnLlN0cmluZygib3V0cHV0RmlsZSIsICIiLCAiT3V0cHV0IGZpbGUgcGF0aCIpCi0JcnVsZSA6PSBmbGFnLlN0cmluZygKLQkJInJ1bGUiLCAiIiwgIk1ldGFkYXRhIHJ1bGUgKEhpbnQ6IHRlc3Rfc3BlYyBvciBjb2RlX21ldGFkYXRhKSIsCi0JKQotCWZsYWcuUGFyc2UoKQotCi0JaWYgKmlucHV0RmlsZSA9PSAiIiB8fCAqb3V0cHV0RmlsZSA9PSAiIiB8fCAqcnVsZSA9PSAiIiB7Ci0JCWZtdC5QcmludGxuKCJVc2FnZTogbWV0YWRhdGEgLXJ1bGUgPHJ1bGU+IC1pbnB1dEZpbGUgPGlucHV0IGZpbGUgcGF0aD4gLW91dHB1dEZpbGUgPG91dHB1dCBmaWxlIHBhdGg+IikKLQkJb3MuRXhpdCgxKQotCX0KLQotCWlucHV0RmlsZURhdGEgOj0gc3RyaW5ncy5UcmltUmlnaHQocmVhZEZpbGVUb1N0cmluZygqaW5wdXRGaWxlKSwgIlxuIikKLQlmaWxlUGF0aHMgOj0gc3RyaW5ncy5TcGxpdChpbnB1dEZpbGVEYXRhLCAiICIpCi0JaWYgbGVuKGZpbGVQYXRocykgPT0gMSAmJiBmaWxlUGF0aHNbMF0gPT0gIiIgewotCQl3cml0ZUVtcHR5T3V0cHV0UHJvdG8oKm91dHB1dEZpbGUsICpydWxlKQotCQlyZXR1cm4KLQl9Ci0Jb3duZXJzaGlwTWV0YWRhdGFNYXAgOj0gJnN5bmMuTWFwe30KLQlrZXlMb2NrcyA6PSAma2V5VG9Mb2Nrc01hcHt9Ci0JZXJyQ2ggOj0gbWFrZShjaGFuIGVycm9yLCBsZW4oZmlsZVBhdGhzKSkKLQl2YXIgd2cgc3luYy5XYWl0R3JvdXAKLQotCXN3aXRjaCAqcnVsZSB7Ci0JY2FzZSAidGVzdF9zcGVjIjoKLQkJZm9yIF8sIGZpbGVQYXRoIDo9IHJhbmdlIGZpbGVQYXRocyB7Ci0JCQl3Zy5BZGQoMSkKLQkJCWdvIHByb2Nlc3NUZXN0U3BlY1Byb3RvYnVmKAotCQkJCWZpbGVQYXRoLCBvd25lcnNoaXBNZXRhZGF0YU1hcCwga2V5TG9ja3MsIGVyckNoLCAmd2csCi0JCQkpCi0JCX0KLQotCQl3Zy5XYWl0KCkKLQkJY2xvc2UoZXJyQ2gpCi0KLQkJZm9yIGVyciA6PSByYW5nZSBlcnJDaCB7Ci0JCQlsb2cuRmF0YWwoZXJyKQotCQl9Ci0KLQkJYWxsS2V5cyA6PSBnZXRTb3J0ZWRLZXlzKG93bmVyc2hpcE1ldGFkYXRhTWFwKQotCQl2YXIgYWxsTWV0YWRhdGEgW10qdGVzdF9zcGVjX3Byb3RvLlRlc3RTcGVjX093bmVyc2hpcE1ldGFkYXRhCi0KLQkJZm9yIF8sIGtleSA6PSByYW5nZSBhbGxLZXlzIHsKLQkJCXZhbHVlLCBfIDo9IG93bmVyc2hpcE1ldGFkYXRhTWFwLkxvYWQoa2V5KQotCQkJbWV0YWRhdGFMaXN0IDo9IHZhbHVlLihbXSp0ZXN0X3NwZWNfcHJvdG8uVGVzdFNwZWNfT3duZXJzaGlwTWV0YWRhdGEpCi0JCQlhbGxNZXRhZGF0YSA9IGFwcGVuZChhbGxNZXRhZGF0YSwgbWV0YWRhdGFMaXN0Li4uKQotCQl9Ci0KLQkJdGVzdFNwZWMgOj0gJnRlc3Rfc3BlY19wcm90by5UZXN0U3BlY3sKLQkJCU93bmVyc2hpcE1ldGFkYXRhTGlzdDogYWxsTWV0YWRhdGEsCi0JCX0KLQkJd3JpdGVQcm90b1RvRmlsZSgqb3V0cHV0RmlsZSwgdGVzdFNwZWMpCi0JCWJyZWFrCi0JY2FzZSAiY29kZV9tZXRhZGF0YSI6Ci0JCXNvdXJjZUZpbGVNZXRhZGF0YU1hcCA6PSAmc3luYy5NYXB7fQotCQlmb3IgXywgZmlsZVBhdGggOj0gcmFuZ2UgZmlsZVBhdGhzIHsKLQkJCXdnLkFkZCgxKQotCQkJZ28gcHJvY2Vzc0NvZGVNZXRhZGF0YVByb3RvYnVmKAotCQkJCWZpbGVQYXRoLCBvd25lcnNoaXBNZXRhZGF0YU1hcCwgc291cmNlRmlsZU1ldGFkYXRhTWFwLCBrZXlMb2NrcywgZXJyQ2gsICZ3ZywKLQkJCSkKLQkJfQotCi0JCXdnLldhaXQoKQotCQljbG9zZShlcnJDaCkKLQotCQlmb3IgZXJyIDo9IHJhbmdlIGVyckNoIHsKLQkJCWxvZy5GYXRhbChlcnIpCi0JCX0KLQotCQlzb3J0ZWRLZXlzIDo9IGdldFNvcnRlZEtleXMob3duZXJzaGlwTWV0YWRhdGFNYXApCi0JCWFsbE1ldGFkYXRhIDo9IG1ha2UoW10qY29kZV9tZXRhZGF0YV9wcm90by5Db2RlTWV0YWRhdGFfVGFyZ2V0T3duZXJzaGlwLCAwKQotCQlmb3IgXywga2V5IDo9IHJhbmdlIHNvcnRlZEtleXMgewotCQkJdmFsdWUsIF8gOj0gb3duZXJzaGlwTWV0YWRhdGFNYXAuTG9hZChrZXkpCi0JCQltZXRhZGF0YSA6PSB2YWx1ZS4oW10qY29kZV9tZXRhZGF0YV9pbnRlcm5hbF9wcm90by5Db2RlTWV0YWRhdGFJbnRlcm5hbF9UYXJnZXRPd25lcnNoaXApCi0JCQlmb3IgXywgbSA6PSByYW5nZSBtZXRhZGF0YSB7Ci0JCQkJdGFyZ2V0TmFtZSA6PSBtLkdldFRhcmdldE5hbWUoKQotCQkJCXBhdGggOj0gbS5HZXRQYXRoKCkKLQkJCQl0cmVuZHlUZWFtSWQgOj0gbS5HZXRUcmVuZHlUZWFtSWQoKQotCi0JCQkJYWxsTWV0YWRhdGEgPSBhcHBlbmQoYWxsTWV0YWRhdGEsICZjb2RlX21ldGFkYXRhX3Byb3RvLkNvZGVNZXRhZGF0YV9UYXJnZXRPd25lcnNoaXB7Ci0JCQkJCVRhcmdldE5hbWU6ICAgJnRhcmdldE5hbWUsCi0JCQkJCVBhdGg6ICAgICAgICAgJnBhdGgsCi0JCQkJCVRyZW5keVRlYW1JZDogJnRyZW5keVRlYW1JZCwKLQkJCQkJU291cmNlRmlsZXM6ICBtLkdldFNvdXJjZUZpbGVzKCksCi0JCQkJfSkKLQkJCX0KLQkJfQotCi0JCWZpbmFsTWV0YWRhdGEgOj0gJmNvZGVfbWV0YWRhdGFfcHJvdG8uQ29kZU1ldGFkYXRhewotCQkJVGFyZ2V0T3duZXJzaGlwTGlzdDogYWxsTWV0YWRhdGEsCi0JCX0KLQkJd3JpdGVQcm90b1RvRmlsZSgqb3V0cHV0RmlsZSwgZmluYWxNZXRhZGF0YSkKLQkJYnJlYWsKLQlkZWZhdWx0OgotCQlsb2cuRmF0YWxmKCJObyBzcGVjaWZpYyBwcm9jZXNzaW5nIGltcGxlbWVudGVkIGZvciBydWxlICclcycuXG4iLCAqcnVsZSkKLQl9Ci19CmRpZmYgLS1naXQgYS90b29scy9tZXRhZGF0YS9nby5tb2QgYi90b29scy9tZXRhZGF0YS9nby5tb2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZDA0YjEuLjAwMDAwMDAKLS0tIGEvdG9vbHMvbWV0YWRhdGEvZ28ubW9kCisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi1tb2R1bGUgYW5kcm9pZC9zb29uZy90b29scy9tZXRhZGF0YQotCi1yZXF1aXJlIGdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmIHYwLjAuMAotCi1yZXBsYWNlIGdvb2dsZS5nb2xhbmcub3JnL3Byb3RvYnVmIHYwLjAuMCA9PiAuLi8uLi8uLi9leHRlcm5hbC9nb2xhbmctcHJvdG9idWYKLQotZ28gMS4xOApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL21ldGFkYXRhL2dvLndvcmsgYi90b29scy9tZXRhZGF0YS9nby53b3JrCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMmNkZjhlLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL21ldGFkYXRhL2dvLndvcmsKKysrIC9kZXYvbnVsbApAQCAtMSwxMSArMCwwIEBACi1nbyAxLjE4Ci0KLXVzZSAoCi0JLgotCS4uLy4uLy4uLy4uL2V4dGVybmFsL2dvbGFuZy1wcm90b2J1ZgotCS4uLy4uLy4uL3Nvb25nL3Rlc3RpbmcvdGVzdF9zcGVjX3Byb3RvCi0JLi4vLi4vLi4vc29vbmcvdGVzdGluZy9jb2RlX21ldGFkYXRhX3Byb3RvCi0JLi4vLi4vLi4vc29vbmcvdGVzdGluZy9jb2RlX21ldGFkYXRhX3Byb3RvX2ludGVybmFsCi0pCi0KLXJlcGxhY2UgZ29vZ2xlLmdvbGFuZy5vcmcvcHJvdG9idWYgdjAuMC4wID0+IC4uLy4uLy4uLy4uL2V4dGVybmFsL2dvbGFuZy1wcm90b2J1ZgpkaWZmIC0tZ2l0IGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZW1wdHlJbnB1dEZpbGUudHh0IGIvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZW1wdHlJbnB1dEZpbGUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjEzNzg5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2VtcHR5SW5wdXRGaWxlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZXhwZWN0ZWRDb2RlTWV0YWRhdGFPdXRwdXQudHh0IGIvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZXhwZWN0ZWRDb2RlTWV0YWRhdGFPdXRwdXQudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTVjZjQwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2V4cGVjdGVkQ29kZU1ldGFkYXRhT3V0cHV0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotCi0gCi0DYmFyEgotQW5kcm9pZC5icBoFMTIzNDYiBmIuamF2YQotIAotA2ZvbxIKLUFuZHJvaWQuYnAaBTEyMzQ1IgZhLmphdmEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9leHBlY3RlZE91dHB1dEZpbGUudHh0IGIvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZXhwZWN0ZWRPdXRwdXRGaWxlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBkMzgyZi4uMDAwMDAwMAotLS0gYS90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9leHBlY3RlZE91dHB1dEZpbGUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotCi0uCi0ZamF2YS10ZXN0LW1vZHVsZS1uYW1lLW9uZRIKLUFuZHJvaWQuYnAaBTEyMzQ1Ci0uCi0ZamF2YS10ZXN0LW1vZHVsZS1uYW1lLXNpeBIKLUFuZHJvaWQuYnAaBTEyMzQ2Ci0uCi0ZamF2YS10ZXN0LW1vZHVsZS1uYW1lLXNpeBIKLUFxd2VydHkuYnAaBTEyMzQ2Ci0uCi0ZamF2YS10ZXN0LW1vZHVsZS1uYW1lLXNpeBIKLUFwb2l1eXQuYnAaBTEyMzQ2Ci0uCi0ZamF2YS10ZXN0LW1vZHVsZS1uYW1lLXR3bxIKLUFuZHJvaWQuYnAaBTEyMzQ1Ci0uCi0ZamF2YS10ZXN0LW1vZHVsZS1uYW1lLXR3bxIKLUFzZGZnaGouYnAaBTEyMzQ1Ci0uCi0ZamF2YS10ZXN0LW1vZHVsZS1uYW1lLXR3bxIKLUF6eGN2Ym4uYnAaBTEyMzQ1ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZmlsZTEudHh0IGIvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZmlsZTEudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWJlZWQwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGUxLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1vbmUSCi1BbmRyb2lkLmJwGgUxMjM0NQotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS10d28SCi1BbmRyb2lkLmJwGgUxMjM0NQotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS10d28SCi1Bc2RmZ2hqLmJwGgUxMjM0NQotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS10d28SCi1BenhjdmJuLmJwGgUxMjM0NQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZmlsZTIudHh0IGIvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZmlsZTIudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmE3NTNmLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGUyLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLQotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1vbmUSCi1BbmRyb2lkLmJwGgUxMjM0NQotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1zaXgSCi1BbmRyb2lkLmJwGgUxMjM0NgotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1vbmUSCi1BbmRyb2lkLmJwGgUxMjM0NQotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1zaXgSCi1BcXdlcnR5LmJwGgUxMjM0NgotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1zaXgSCi1BcG9pdXl0LmJwGgUxMjM0NgotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1zaXgSCi1BcG9pdXl0LmJwGgUxMjM0NgotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1zaXgSCi1BcG9pdXl0LmJwGgUxMjM0NgotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1zaXgSCi1BcG9pdXl0LmJwGgUxMjM0NgpkaWZmIC0tZ2l0IGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZmlsZTMudHh0IGIvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZmlsZTMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MWJlZWQwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGUzLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLQotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1vbmUSCi1BbmRyb2lkLmJwGgUxMjM0NQotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS10d28SCi1BbmRyb2lkLmJwGgUxMjM0NQotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS10d28SCi1Bc2RmZ2hqLmJwGgUxMjM0NQotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS10d28SCi1BenhjdmJuLmJwGgUxMjM0NQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZmlsZTQudHh0IGIvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZmlsZTQudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTc1OTAwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGU0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLQotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1vbmUSCi1BbmRyb2lkLmJwGgUxMjM0NQotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1zaXgSCi1BbmRyb2lkLmJwGgUxMjM0NgotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1vbmUSCi1BbmRyb2lkLmJwGgUxMjM0NgotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1zaXgSCi1BcXdlcnR5LmJwGgUxMjM0NgotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1zaXgSCi1BcG9pdXl0LmJwGgUxMjM0NgotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1zaXgSCi1BcG9pdXl0LmJwGgUxMjM0NgotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1zaXgSCi1BcG9pdXl0LmJwGgUxMjM0NgotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1zaXgSCi1BcG9pdXl0LmJwGgUxMjM0NgpkaWZmIC0tZ2l0IGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZmlsZTUudHh0IGIvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZmlsZTUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGRlMDY0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGU1LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCi0gCi0DZm9vEgotQW5kcm9pZC5icBoFMTIzNDUiBmEuamF2YQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZmlsZTYudHh0IGIvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZmlsZTYudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzdjZGNkLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGU2LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCi0gCi0DYmFyEgotQW5kcm9pZC5icBoFMTIzNDYiBmIuamF2YQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZmlsZTcudHh0IGIvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZmlsZTcudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGRlMDY0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGU3LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCi0gCi0DZm9vEgotQW5kcm9pZC5icBoFMTIzNDUiBmEuamF2YQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZmlsZTgudHh0IGIvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZmlsZTgudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTMxNjkwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2ZpbGU4LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotCi0gCi0DZm9vEgotQW5kcm9pZC5ncBoFMTIzNDYiBmEuamF2YQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZ2VuZXJhdGVkQ29kZU1ldGFkYXRhT3V0cHV0LnR4dCBiL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2dlbmVyYXRlZENvZGVNZXRhZGF0YU91dHB1dC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1NWNmNDAuLjAwMDAwMDAKLS0tIGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZ2VuZXJhdGVkQ29kZU1ldGFkYXRhT3V0cHV0LnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotCi0gCi0DYmFyEgotQW5kcm9pZC5icBoFMTIzNDYiBmIuamF2YQotIAotA2ZvbxIKLUFuZHJvaWQuYnAaBTEyMzQ1IgZhLmphdmEKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9nZW5lcmF0ZWRDb2RlTWV0YWRhdGFPdXRwdXRGaWxlLnR4dCBiL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2dlbmVyYXRlZENvZGVNZXRhZGF0YU91dHB1dEZpbGUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTVjZjQwLi4wMDAwMDAwCi0tLSBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2dlbmVyYXRlZENvZGVNZXRhZGF0YU91dHB1dEZpbGUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNyArMCwwIEBACi0KLSAKLQNiYXISCi1BbmRyb2lkLmJwGgUxMjM0NiIGYi5qYXZhCi0gCi0DZm9vEgotQW5kcm9pZC5icBoFMTIzNDUiBmEuamF2YQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2dlbmVyYXRlZEVtcHR5T3V0cHV0RmlsZS50eHQgYi90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9nZW5lcmF0ZWRFbXB0eU91dHB1dEZpbGUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNjlkZTI5Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2dlbmVyYXRlZEVtcHR5T3V0cHV0RmlsZS50eHQKKysrIC9kZXYvbnVsbApkaWZmIC0tZ2l0IGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvZ2VuZXJhdGVkT3V0cHV0RmlsZS50eHQgYi90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9nZW5lcmF0ZWRPdXRwdXRGaWxlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBkMzgyZi4uMDAwMDAwMAotLS0gYS90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9nZW5lcmF0ZWRPdXRwdXRGaWxlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLQotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1vbmUSCi1BbmRyb2lkLmJwGgUxMjM0NQotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1zaXgSCi1BbmRyb2lkLmJwGgUxMjM0NgotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1zaXgSCi1BcXdlcnR5LmJwGgUxMjM0NgotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS1zaXgSCi1BcG9pdXl0LmJwGgUxMjM0NgotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS10d28SCi1BbmRyb2lkLmJwGgUxMjM0NQotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS10d28SCi1Bc2RmZ2hqLmJwGgUxMjM0NQotLgotGWphdmEtdGVzdC1tb2R1bGUtbmFtZS10d28SCi1BenhjdmJuLmJwGgUxMjM0NQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2lucHV0Q29kZU1ldGFkYXRhLnR4dCBiL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2lucHV0Q29kZU1ldGFkYXRhLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2E4MWI3ZC4uMDAwMDAwMAotLS0gYS90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9pbnB1dENvZGVNZXRhZGF0YS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1maWxlNS50eHQgZmlsZTYudHh0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvaW5wdXRDb2RlTWV0YWRhdGFOZWdhdGl2ZS50eHQgYi90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9pbnB1dENvZGVNZXRhZGF0YU5lZ2F0aXZlLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY2NjhlNC4uMDAwMDAwMAotLS0gYS90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9pbnB1dENvZGVNZXRhZGF0YU5lZ2F0aXZlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWZpbGU3LnR4dCBmaWxlOC50eHQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9tZXRhZGF0YS90ZXN0ZGF0YS9pbnB1dEZpbGVzLnR4dCBiL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2lucHV0RmlsZXMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDRiYzk0Li4wMDAwMDAwCi0tLSBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2lucHV0RmlsZXMudHh0CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotZmlsZTEudHh0IGZpbGUyLnR4dApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL2lucHV0RmlsZXNOZWdhdGl2ZUNhc2UudHh0IGIvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvaW5wdXRGaWxlc05lZ2F0aXZlQ2FzZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzN2FhM2YuLjAwMDAwMDAKLS0tIGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvaW5wdXRGaWxlc05lZ2F0aXZlQ2FzZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1maWxlMy50eHQgZmlsZTQudHh0ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvbWV0YWRhdGFfdGVzdC5nbyBiL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL21ldGFkYXRhX3Rlc3QuZ28KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNGFkZDMuLjAwMDAwMDAKLS0tIGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvbWV0YWRhdGFfdGVzdC5nbworKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi1wYWNrYWdlIG1haW4KLQotaW1wb3J0ICgKLQkiZm10IgotCSJpby9pb3V0aWwiCi0JIm9zL2V4ZWMiCi0JInN0cmluZ3MiCi0JInRlc3RpbmciCi0pCi0KLWZ1bmMgVGVzdE1ldGFkYXRhKHQgKnRlc3RpbmcuVCkgewotCWNtZCA6PSBleGVjLkNvbW1hbmQoCi0JCSJtZXRhZGF0YSIsICItcnVsZSIsICJ0ZXN0X3NwZWMiLCAiLWlucHV0RmlsZSIsICIuL2lucHV0RmlsZXMudHh0IiwgIi1vdXRwdXRGaWxlIiwKLQkJIi4vZ2VuZXJhdGVkT3V0cHV0RmlsZS50eHQiLAotCSkKLQlzdGRlcnIsIGVyciA6PSBjbWQuQ29tYmluZWRPdXRwdXQoKQotCWlmIGVyciAhPSBuaWwgewotCQl0LkZhdGFsZigiRXJyb3IgcnVubmluZyBtZXRhZGF0YSBjb21tYW5kOiAlcy4gRXJyb3I6ICV2Iiwgc3RkZXJyLCBlcnIpCi0JfQotCi0JLy8gUmVhZCB0aGUgY29udGVudHMgb2YgdGhlIGV4cGVjdGVkIG91dHB1dCBmaWxlCi0JZXhwZWN0ZWRPdXRwdXQsIGVyciA6PSBpb3V0aWwuUmVhZEZpbGUoIi4vZXhwZWN0ZWRPdXRwdXRGaWxlLnR4dCIpCi0JaWYgZXJyICE9IG5pbCB7Ci0JCXQuRmF0YWxmKCJFcnJvciByZWFkaW5nIGV4cGVjdGVkIG91dHB1dCBmaWxlOiAlcyIsIGVycikKLQl9Ci0KLQkvLyBSZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgZ2VuZXJhdGVkIG91dHB1dCBmaWxlCi0JZ2VuZXJhdGVkT3V0cHV0LCBlcnIgOj0gaW91dGlsLlJlYWRGaWxlKCIuL2dlbmVyYXRlZE91dHB1dEZpbGUudHh0IikKLQlpZiBlcnIgIT0gbmlsIHsKLQkJdC5GYXRhbGYoIkVycm9yIHJlYWRpbmcgZ2VuZXJhdGVkIG91dHB1dCBmaWxlOiAlcyIsIGVycikKLQl9Ci0KLQlmbXQuUHJpbnRsbigpCi0KLQkvLyBDb21wYXJlIHRoZSBjb250ZW50cwotCWlmIHN0cmluZyhleHBlY3RlZE91dHB1dCkgIT0gc3RyaW5nKGdlbmVyYXRlZE91dHB1dCkgewotCQl0LkVycm9yZigiR2VuZXJhdGVkIGZpbGUgY29udGVudHMgZG8gbm90IG1hdGNoIHRoZSBleHBlY3RlZCBvdXRwdXQiKQotCX0KLX0KLQotZnVuYyBUZXN0TWV0YWRhdGFOZWdhdGl2ZUNhc2UodCAqdGVzdGluZy5UKSB7Ci0JY21kIDo9IGV4ZWMuQ29tbWFuZCgKLQkJIm1ldGFkYXRhIiwgIi1ydWxlIiwgInRlc3Rfc3BlYyIsICItaW5wdXRGaWxlIiwgIi4vaW5wdXRGaWxlc05lZ2F0aXZlQ2FzZS50eHQiLCAiLW91dHB1dEZpbGUiLAotCQkiLi9nZW5lcmF0ZWRPdXRwdXRGaWxlTmVnYXRpdmVDYXNlLnR4dCIsCi0JKQotCXN0ZGVyciwgZXJyIDo9IGNtZC5Db21iaW5lZE91dHB1dCgpCi0JaWYgZXJyID09IG5pbCB7Ci0JCXQuRmF0YWxmKAotCQkJIkV4cGVjdGVkIGFuIGVycm9yLCBidXQgdGhlIG1ldGFkYXRhIGNvbW1hbmQgZXhlY3V0ZWQgc3VjY2Vzc2Z1bGx5LiBPdXRwdXQ6ICVzIiwKLQkJCXN0ZGVyciwKLQkJKQotCX0KLQotCWV4cGVjdGVkRXJyb3IgOj0gIkNvbmZsaWN0aW5nIHRyZW5keSB0ZWFtIElEcyBmb3VuZCBmb3IgamF2YS10ZXN0LW1vZHVsZSIgKwotCQkiLW5hbWUtb25lIGF0OlxuQW5kcm9pZC5icCB3aXRoIHRlYW1JZDogMTIzNDYsIiArCi0JCSJcbkFuZHJvaWQuYnAgd2l0aCB0ZWFtSWQ6IDEyMzQ1IgotCWlmICFzdHJpbmdzLkNvbnRhaW5zKAotCQlzdHJpbmdzLlRyaW1TcGFjZShzdHJpbmcoc3RkZXJyKSksIHN0cmluZ3MuVHJpbVNwYWNlKGV4cGVjdGVkRXJyb3IpLAotCSkgewotCQl0LkVycm9yZigKLQkJCSJVbmV4cGVjdGVkIGVycm9yIG1lc3NhZ2UuIEV4cGVjdGVkIHRvIGNvbnRhaW46ICVzLCBHb3Q6ICVzIiwKLQkJCWV4cGVjdGVkRXJyb3IsIHN0ZGVyciwKLQkJKQotCX0KLX0KLQotZnVuYyBUZXN0RW1wdHlJbnB1dEZpbGUodCAqdGVzdGluZy5UKSB7Ci0JY21kIDo9IGV4ZWMuQ29tbWFuZCgKLQkJIm1ldGFkYXRhIiwgIi1ydWxlIiwgInRlc3Rfc3BlYyIsICItaW5wdXRGaWxlIiwgIi4vZW1wdHlJbnB1dEZpbGUudHh0IiwgIi1vdXRwdXRGaWxlIiwKLQkJIi4vZ2VuZXJhdGVkRW1wdHlPdXRwdXRGaWxlLnR4dCIsCi0JKQotCXN0ZGVyciwgZXJyIDo9IGNtZC5Db21iaW5lZE91dHB1dCgpCi0JaWYgZXJyICE9IG5pbCB7Ci0JCXQuRmF0YWxmKCJFcnJvciBydW5uaW5nIG1ldGFkYXRhIGNvbW1hbmQ6ICVzLiBFcnJvcjogJXYiLCBzdGRlcnIsIGVycikKLQl9Ci0KLQkvLyBSZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgZ2VuZXJhdGVkIG91dHB1dCBmaWxlCi0JZ2VuZXJhdGVkT3V0cHV0LCBlcnIgOj0gaW91dGlsLlJlYWRGaWxlKCIuL2dlbmVyYXRlZEVtcHR5T3V0cHV0RmlsZS50eHQiKQotCWlmIGVyciAhPSBuaWwgewotCQl0LkZhdGFsZigiRXJyb3IgcmVhZGluZyBnZW5lcmF0ZWQgb3V0cHV0IGZpbGU6ICVzIiwgZXJyKQotCX0KLQotCWZtdC5QcmludGxuKCkKLQotCS8vIENvbXBhcmUgdGhlIGNvbnRlbnRzCi0JaWYgc3RyaW5nKGdlbmVyYXRlZE91dHB1dCkgIT0gIlxuIiB7Ci0JCXQuRXJyb3JmKCJHZW5lcmF0ZWQgZmlsZSBjb250ZW50cyBkbyBub3QgbWF0Y2ggdGhlIGV4cGVjdGVkIG91dHB1dCIpCi0JfQotfQotCi1mdW5jIFRlc3RDb2RlTWV0YWRhdGEodCAqdGVzdGluZy5UKSB7Ci0JY21kIDo9IGV4ZWMuQ29tbWFuZCgKLQkJIm1ldGFkYXRhIiwgIi1ydWxlIiwgImNvZGVfbWV0YWRhdGEiLCAiLWlucHV0RmlsZSIsICIuL2lucHV0Q29kZU1ldGFkYXRhLnR4dCIsICItb3V0cHV0RmlsZSIsCi0JCSIuL2dlbmVyYXRlZENvZGVNZXRhZGF0YU91dHB1dEZpbGUudHh0IiwKLQkpCi0Jc3RkZXJyLCBlcnIgOj0gY21kLkNvbWJpbmVkT3V0cHV0KCkKLQlpZiBlcnIgIT0gbmlsIHsKLQkJdC5GYXRhbGYoIkVycm9yIHJ1bm5pbmcgbWV0YWRhdGEgY29tbWFuZDogJXMuIEVycm9yOiAldiIsIHN0ZGVyciwgZXJyKQotCX0KLQotCS8vIFJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBleHBlY3RlZCBvdXRwdXQgZmlsZQotCWV4cGVjdGVkT3V0cHV0LCBlcnIgOj0gaW91dGlsLlJlYWRGaWxlKCIuL2V4cGVjdGVkQ29kZU1ldGFkYXRhT3V0cHV0LnR4dCIpCi0JaWYgZXJyICE9IG5pbCB7Ci0JCXQuRmF0YWxmKCJFcnJvciByZWFkaW5nIGV4cGVjdGVkIG91dHB1dCBmaWxlOiAlcyIsIGVycikKLQl9Ci0KLQkvLyBSZWFkIHRoZSBjb250ZW50cyBvZiB0aGUgZ2VuZXJhdGVkIG91dHB1dCBmaWxlCi0JZ2VuZXJhdGVkT3V0cHV0LCBlcnIgOj0gaW91dGlsLlJlYWRGaWxlKCIuL2dlbmVyYXRlZENvZGVNZXRhZGF0YU91dHB1dEZpbGUudHh0IikKLQlpZiBlcnIgIT0gbmlsIHsKLQkJdC5GYXRhbGYoIkVycm9yIHJlYWRpbmcgZ2VuZXJhdGVkIG91dHB1dCBmaWxlOiAlcyIsIGVycikKLQl9Ci0KLQlmbXQuUHJpbnRsbigpCi0KLQkvLyBDb21wYXJlIHRoZSBjb250ZW50cwotCWlmIHN0cmluZyhleHBlY3RlZE91dHB1dCkgIT0gc3RyaW5nKGdlbmVyYXRlZE91dHB1dCkgewotCQl0LkVycm9yZigiR2VuZXJhdGVkIGZpbGUgY29udGVudHMgZG8gbm90IG1hdGNoIHRoZSBleHBlY3RlZCBvdXRwdXQiKQotCX0KLX0KZGlmZiAtLWdpdCBhL3Rvb2xzL21ldGFkYXRhL3Rlc3RkYXRhL291dHB1dEZpbGUudHh0IGIvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvb3V0cHV0RmlsZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwZDM4MmYuLjAwMDAwMDAKLS0tIGEvdG9vbHMvbWV0YWRhdGEvdGVzdGRhdGEvb3V0cHV0RmlsZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0KLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtb25lEgotQW5kcm9pZC5icBoFMTIzNDUKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtc2l4EgotQW5kcm9pZC5icBoFMTIzNDYKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtc2l4EgotQXF3ZXJ0eS5icBoFMTIzNDYKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtc2l4EgotQXBvaXV5dC5icBoFMTIzNDYKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtdHdvEgotQW5kcm9pZC5icBoFMTIzNDUKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtdHdvEgotQXNkZmdoai5icBoFMTIzNDUKLS4KLRlqYXZhLXRlc3QtbW9kdWxlLW5hbWUtdHdvEgotQXp4Y3Zibi5icBoFMTIzNDUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS90b29scy9taXNzaW5nX3Nvb25nX21vZHVsZV9pbmZvLnB5IGIvdG9vbHMvbWlzc2luZ19zb29uZ19tb2R1bGVfaW5mby5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi42ZmE3ZjJiCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvbWlzc2luZ19zb29uZ19tb2R1bGVfaW5mby5weQpAQCAtMCwwICsxLDUzIEBACisjIS91c3IvYmluL2VudiBweXRob24zCisjCisjIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAnTGljZW5zZScpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICdBUyBJUycgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQganNvbgoraW1wb3J0IG9zCitpbXBvcnQgc3lzCisKK2RlZiBtYWluKCk6CisgICAgdHJ5OgorICAgICAgICBwcm9kdWN0X291dCA9IG9zLmVudmlyb25bIkFORFJPSURfUFJPRFVDVF9PVVQiXQorICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiQ2FuJ3QgZ2V0IEFORFJPSURfUFJPRFVDVF9PVVQuIFJ1biBsdW5jaCBmaXJzdC5cbiIpCisgICAgICAgIHN5cy5leGl0KDEpCisKKyAgICBmaWxlbmFtZSA9IG9zLnBhdGguam9pbihwcm9kdWN0X291dCwgIm1vZHVsZS1pbmZvLmpzb24iKQorICAgIHRyeToKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVuYW1lKSBhcyBmOgorICAgICAgICAgICAgbW9kdWxlcyA9IGpzb24ubG9hZChmKQorICAgIGV4Y2VwdCBGaWxlTm90Rm91bmRFcnJvcjoKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZShmIkZpbGUgbm90IGZvdW5kOiB7ZmlsZW5hbWV9XG4iKQorICAgICAgICBzeXMuZXhpdCgxKQorICAgIGV4Y2VwdCBqc29uLkpTT05EZWNvZGVFcnJvcjoKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZShmIkludmFsaWQganNvbjoge2ZpbGVuYW1lfVxuIikKKyAgICAgICAgcmV0dXJuIE5vbmUKKworICAgIGNsYXNzZXMgPSB7fQorCisgICAgZm9yIG5hbWUsIGluZm8gaW4gbW9kdWxlcy5pdGVtcygpOgorICAgICAgICBtYWtlID0gaW5mby5nZXQoIm1ha2UiKQorICAgICAgICBtYWtlX2dlbiA9IGluZm8uZ2V0KCJtYWtlX2dlbmVyYXRlZF9tb2R1bGVfaW5mbyIpCisgICAgICAgIGlmIG5vdCBtYWtlIGFuZCBtYWtlX2dlbjoKKyAgICAgICAgICAgIGNsYXNzZXMuc2V0ZGVmYXVsdChmcm96ZW5zZXQoaW5mby5nZXQoImNsYXNzIikpLCBbXSkuYXBwZW5kKG5hbWUpCisKKyAgICBmb3IgY2wsIG5hbWVzIGluIGNsYXNzZXMuaXRlbXMoKToKKyAgICAgICAgcHJpbnQoIiAiLmpvaW4oY2wpKQorICAgICAgICBmb3IgbmFtZSBpbiBuYW1lczoKKyAgICAgICAgICAgIHByaW50KCIgIiwgbmFtZSkKKworaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL3Rvb2xzL3BlcmYvYmVuY2htYXJrcyBiL3Rvb2xzL3BlcmYvYmVuY2htYXJrcwppbmRleCA2OTk4ZWNkLi4yMjhjMWQwIDEwMDc1NQotLS0gYS90b29scy9wZXJmL2JlbmNobWFya3MKKysrIGIvdG9vbHMvcGVyZi9iZW5jaG1hcmtzCkBAIC0zMzcsNiArMzM3LDEyIEBACiAKICAgICBkZWYgUnVuKHNlbGYpOgogICAgICAgICAiIiJSdW4gYWxsIG9mIHRoZSB1c2VyLXNlbGVjdGVkIGJlbmNobWFya3MuIiIiCisKKyAgICAgICAgIyBXaXRoIGAtLWxpc3RgLCBqdXN0IGxpc3QgdGhlIGJlbmNobWFya3MgYXZhaWxhYmxlLgorICAgICAgICBpZiBzZWxmLl9vcHRpb25zLkxpc3QoKToKKyAgICAgICAgICAgIHByaW50KCIgIi5qb2luKHNlbGYuX29wdGlvbnMuQmVuY2htYXJrSWRzKCkpKQorICAgICAgICAgICAgcmV0dXJuCisKICAgICAgICAgIyBDbGVhbiBvdXQgdGhlIGxvZyBkaXIgb3IgY3JlYXRlIGl0IGlmIG5lY2Vzc2FyeQogICAgICAgICBwcmVwYXJlX2xvZ19kaXIoc2VsZi5fb3B0aW9ucy5Mb2dEaXIoKSkKIApAQCAtNTQ2LDYgKzU1Miw4IEBACiAgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tYmVuY2htYXJrIiwgbmFyZ3M9IioiLCBkZWZhdWx0PVtiLmlkIGZvciBiIGluIHNlbGYuX2JlbmNobWFya3NdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGF2YXI9IkJFTkNITUFSS1MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkJlbmNobWFya3MgdG8gcnVuLiAgRGVmYXVsdCBzdWl0ZSB3aWxsIGJlIHJ1biBpZiBvbWl0dGVkLiIpCisgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tbGlzdCIsIGFjdGlvbj0ic3RvcmVfdHJ1ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0ibGlzdCB0aGUgYXZhaWxhYmxlIGJlbmNobWFya3MuICBObyBiZW5jaG1hcmsgaXMgcnVuLiIpCiAgICAgICAgIHBhcnNlci5hZGRfYXJndW1lbnQoIi0tZGlzdC1vbmUiLCBhY3Rpb249InN0b3JlX3RydWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkNvcHkgbG9ncyBhbmQgbWV0cmljcyB0byB0aGUgZ2l2ZW4gZGlzdCBkaXIuIFJlcXVpcmVzIHRoYXQgb25seSIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG9uZSBiZW5jaG1hcmsgYmUgc3VwcGxpZWQuIFBvc3Ryb2xsIHN0ZXBzIHdpbGwgYmUgc2tpcHBlZC4iKQpAQCAtNjE1LDYgKzYyMywxMiBAQAogICAgIGRlZiBEcnlSdW4oc2VsZik6CiAgICAgICAgIHJldHVybiBzZWxmLl9hcmdzLmRyeV9ydW4KIAorICAgIGRlZiBMaXN0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fYXJncy5saXN0CisKKyAgICBkZWYgQmVuY2htYXJrSWRzKHNlbGYpIDoKKyAgICAgICAgcmV0dXJuIFtiZW5jaG1hcmsuaWQgZm9yIGJlbmNobWFyayBpbiBzZWxmLl9iZW5jaG1hcmtzXQorCiAgICAgZGVmIF9sdW5jaGVzKHNlbGYpOgogICAgICAgICBkZWYgcGFyc2VfbHVuY2gobHVuY2gpOgogICAgICAgICAgICAgcGFydHMgPSBsdW5jaC5zcGxpdCgiLSIpCkBAIC03ODYsNiArODAwLDMyIEBACiAgICAgICAgICAgICAgICAgICAgICAgcHJlcm9sbD0xLAogICAgICAgICAgICAgICAgICAgICAgIHBvc3Ryb2xsPTIsCiAgICAgICAgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgIEJlbmNobWFyayhpZD0iYWRkX3N5c3RlbXVpX2ZpZWxkX3dpdGhfdGVzdHMiLAorICAgICAgICAgICAgICAgICAgICAgIHRpdGxlPSJBZGQgU3lzdGVtVUkgZmllbGQgd2l0aCB0ZXN0cyIsCisgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlPUFkZEphdmFGaWVsZCgiZnJhbWV3b3Jrcy9iYXNlL3BhY2thZ2VzL1N5c3RlbVVJL3NyYy9jb20vYW5kcm9pZC9zeXN0ZW11aS93bXNoZWxsL1dNU2hlbGwuamF2YSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHVibGljIiksCisgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlcz1bIlN5c3RlbVVpUmF2ZW5UZXN0cyJdLAorICAgICAgICAgICAgICAgICAgICAgIHByZXJvbGw9MSwKKyAgICAgICAgICAgICAgICAgICAgICBwb3N0cm9sbD0yLAorICAgICAgICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICBCZW5jaG1hcmsoaWQ9InN5c3RlbXVpX2ZsaWNrZXJfYWRkX2xvZ19jYWxsIiwKKyAgICAgICAgICAgICAgICAgICAgICB0aXRsZT0iQWRkIGEgTG9nIGNhbGwgdG8gZmxpY2tlciIsCisgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlPU1vZGlmeSgicGxhdGZvcm1fdGVzdGluZy9saWJyYXJpZXMvZmxpY2tlci9zcmMvYW5kcm9pZC90b29scy9mbGlja2VyL0ZsaWNrZXJTZXJ2aWNlUmVzdWx0c0NvbGxlY3Rvci5rdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW1iZGE6IGYnTG9nLnYoTE9HX1RBRywgIkJFTkNITUFSSyA9IHtyYW5kb20ucmFuZGludCgwLCAxMDAwMDAwKX0iKTtcbicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWZvcmU9IkxvZy52KExPR19UQUcsIiksCisgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlcz1bIldNU2hlbGxGbGlja2VyVGVzdHNQaXAiXSwKKyAgICAgICAgICAgICAgICAgICAgICBwcmVyb2xsPTEsCisgICAgICAgICAgICAgICAgICAgICAgcG9zdHJvbGw9MiwKKyAgICAgICAgICAgICAgICAgICAgICApLAorICAgICAgICAgICAgQmVuY2htYXJrKGlkPSJzeXN0ZW11aV9jb3JlX2FkZF9sb2dfY2FsbCIsCisgICAgICAgICAgICAgICAgICAgICAgdGl0bGU9IkFkZCBhIExvZyBjYWxsIFN5c3RlbVVJQXBwbGljYXRpb24iLAorICAgICAgICAgICAgICAgICAgICAgIGNoYW5nZT1Nb2RpZnkoImZyYW1ld29ya3MvYmFzZS9wYWNrYWdlcy9TeXN0ZW1VSS9zcmMvY29tL2FuZHJvaWQvc3lzdGVtdWkvU3lzdGVtVUlBcHBsaWNhdGlvbi5qYXZhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYTogZidMb2cudihUQUcsICJCRU5DSE1BUksgPSB7cmFuZG9tLnJhbmRpbnQoMCwgMTAwMDAwMCl9Iik7XG4nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVmb3JlPSJMb2cud3RmKFRBRywiKSwKKyAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVzPVsiU3lzdGVtVUktY29yZSJdLAorICAgICAgICAgICAgICAgICAgICAgIHByZXJvbGw9MSwKKyAgICAgICAgICAgICAgICAgICAgICBwb3N0cm9sbD0yLAorICAgICAgICAgICAgICAgICAgICAgICksCiAgICAgICAgIF0KIAogICAgIGRlZiBfZXJyb3Ioc2VsZiwgbWVzc2FnZSk6CmRpZmYgLS1naXQgYS90b29scy9yZWNvcmQtZmluYWxpemVkLWZsYWdzLy5naXRpZ25vcmUgYi90b29scy9yZWNvcmQtZmluYWxpemVkLWZsYWdzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU3Y2FhOQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3JlY29yZC1maW5hbGl6ZWQtZmxhZ3MvLmdpdGlnbm9yZQpAQCAtMCwwICsxLDIgQEAKK0NhcmdvLmxvY2sKK3RhcmdldC8KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlY29yZC1maW5hbGl6ZWQtZmxhZ3MvQW5kcm9pZC5icCBiL3Rvb2xzL3JlY29yZC1maW5hbGl6ZWQtZmxhZ3MvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWEzYTM4Ci0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcmVjb3JkLWZpbmFsaXplZC1mbGFncy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjggQEAKK3BhY2thZ2UgeworICAgIGRlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlczogWyJBbmRyb2lkLUFwYWNoZS0yLjAiXSwKK30KKworcnVzdF9kZWZhdWx0cyB7CisgICAgbmFtZTogInJlY29yZC1maW5hbGl6ZWQtZmxhZ3MtZGVmYXVsdHMiLAorICAgIGVkaXRpb246ICIyMDIxIiwKKyAgICBjbGlwcHlfbGludHM6ICJhbmRyb2lkIiwKKyAgICBsaW50czogImFuZHJvaWQiLAorICAgIHNyY3M6IFsic3JjL21haW4ucnMiXSwKKyAgICBydXN0bGliczogWworICAgICAgICAibGliYWNvbmZpZ19wcm90b3MiLAorICAgICAgICAibGliYW55aG93IiwKKyAgICAgICAgImxpYmNsYXAiLAorICAgICAgICAibGlicmVnZXgiLAorICAgIF0sCit9CisKK3J1c3RfYmluYXJ5X2hvc3QgeworICAgIG5hbWU6ICJyZWNvcmQtZmluYWxpemVkLWZsYWdzIiwKKyAgICBkZWZhdWx0czogWyJyZWNvcmQtZmluYWxpemVkLWZsYWdzLWRlZmF1bHRzIl0sCit9CisKK3J1c3RfdGVzdF9ob3N0IHsKKyAgICBuYW1lOiAicmVjb3JkLWZpbmFsaXplZC1mbGFncy10ZXN0IiwKKyAgICBkZWZhdWx0czogWyJyZWNvcmQtZmluYWxpemVkLWZsYWdzLWRlZmF1bHRzIl0sCisgICAgdGVzdF9zdWl0ZXM6IFsiZ2VuZXJhbC10ZXN0cyJdLAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVjb3JkLWZpbmFsaXplZC1mbGFncy9DYXJnby50b21sIGIvdG9vbHMvcmVjb3JkLWZpbmFsaXplZC1mbGFncy9DYXJnby50b21sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYzc5NTMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9yZWNvcmQtZmluYWxpemVkLWZsYWdzL0NhcmdvLnRvbWwKQEAgLTAsMCArMSwxNSBAQAorIyBDYXJnby50b21sIGZpbGUgdG8gYWxsb3cgcmFwaWQgZGV2ZWxvcG1lbnQgb2YgcmVjb3JkLWZpbmFsaXplZC1mbGFncyB1c2luZworIyBjYXJnby4gU29vbmcgaXMgdGhlIG9mZmljaWFsIEFuZHJvaWQgYnVpbGQgc3lzdGVtLCBhbmQgdGhlIG9ubHkgc3lzdGVtCisjIGd1YXJhbnRlZWQgdG8gc3VwcG9ydCByZWNvcmQtZmluYWxpemVkLWZsYWdzLiBJZiB0aGVyZSBpcyBldmVyIGFueSBpc3N1ZSB3aXRoCisjIHRoZSBjYXJnbyBzZXR1cCwgc3VwcG9ydCBmb3IgY2FyZ28gd2lsbCBiZSBkcm9wcGVkIGFuZCB0aGlzIGZpbGUgcmVtb3ZlZC4KKworW3BhY2thZ2VdCituYW1lID0gInJlY29yZC1maW5hbGl6ZWQtZmxhZ3MiCit2ZXJzaW9uID0gIjAuMS4wIgorZWRpdGlvbiA9ICIyMDIxIgorCitbZGVwZW5kZW5jaWVzXQorYWNvbmZpZ19wcm90b3MgPSB7IHBhdGggPSAiLi4vYWNvbmZpZy9hY29uZmlnX3Byb3RvcyIgfQorYW55aG93ID0geyBwYXRoID0gIi4uLy4uLy4uLy4uL2V4dGVybmFsL3J1c3QvYW5kcm9pZC1jcmF0ZXMtaW8vY3JhdGVzL2FueWhvdyIgfQorY2xhcCA9IHsgcGF0aCA9ICIuLi8uLi8uLi8uLi9leHRlcm5hbC9ydXN0L2FuZHJvaWQtY3JhdGVzLWlvL2NyYXRlcy9jbGFwIiwgZmVhdHVyZXMgPSBbImRlcml2ZSJdIH0KK3JlZ2V4ID0geyBwYXRoID0gIi4uLy4uLy4uLy4uL2V4dGVybmFsL3J1c3QvYW5kcm9pZC1jcmF0ZXMtaW8vY3JhdGVzL3JlZ2V4IiB9CmRpZmYgLS1naXQgYS90b29scy9yZWNvcmQtZmluYWxpemVkLWZsYWdzL09XTkVSUyBiL3Rvb2xzL3JlY29yZC1maW5hbGl6ZWQtZmxhZ3MvT1dORVJTCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4NjRhMmMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9yZWNvcmQtZmluYWxpemVkLWZsYWdzL09XTkVSUwpAQCAtMCwwICsxIEBACitpbmNsdWRlIHBsYXRmb3JtL2ZyYW1ld29ya3MvYmFzZTovU0RLX09XTkVSUwpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVjb3JkLWZpbmFsaXplZC1mbGFncy9zcmMvYXBpX3NpZ25hdHVyZV9maWxlcy5ycyBiL3Rvb2xzL3JlY29yZC1maW5hbGl6ZWQtZmxhZ3Mvc3JjL2FwaV9zaWduYXR1cmVfZmlsZXMucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY4ZjRkMQotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3JlY29yZC1maW5hbGl6ZWQtZmxhZ3Mvc3JjL2FwaV9zaWduYXR1cmVfZmlsZXMucnMKQEAgLTAsMCArMSw0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3VzZSBhbnlob3c6OlJlc3VsdDsKK3VzZSByZWdleDo6UmVnZXg7Cit1c2Ugc3RkOjp7Y29sbGVjdGlvbnM6Okhhc2hTZXQsIGlvOjpSZWFkfTsKKwordXNlIGNyYXRlOjpGbGFnSWQ7CisKKy8vLyBHcmVwIGZvciBhbGwgZmxhZ3MgdXNlZCB3aXRoIEBGbGFnZ2VkQXBpIGFubm90YXRpb25zIGluIGFuIEFQSSBzaWduYXR1cmUgZmlsZSAoKmN1cnJlbnQudHh0CisvLy8gZmlsZSkuCitwdWIoY3JhdGUpIGZuIGV4dHJhY3RfZmxhZ2dlZF9hcGlfZmxhZ3M8UjogUmVhZD4obXV0IHJlYWRlcjogUikgLT4gUmVzdWx0PEhhc2hTZXQ8RmxhZ0lkPj4geworICAgIGxldCBtdXQgaGF5c3RhY2sgPSBTdHJpbmc6Om5ldygpOworICAgIHJlYWRlci5yZWFkX3RvX3N0cmluZygmbXV0IGhheXN0YWNrKT87CisgICAgbGV0IHJlZ2V4ID0gUmVnZXg6Om5ldyhyIyIoP21zKUBGbGFnZ2VkQXBpXCgiKC4qPykiXCkiIykudW53cmFwKCk7CisgICAgbGV0IGl0ZXIgPSByZWdleC5jYXB0dXJlc19pdGVyKCZoYXlzdGFjaykubWFwKHxjYXB8IGNhcFsxXS50b19vd25lZCgpKTsKKyAgICBPayhIYXNoU2V0Ojpmcm9tX2l0ZXIoaXRlcikpCit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3VwZXI6Oio7CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdCgpIHsKKyAgICAgICAgbGV0IGFwaV9zaWduYXR1cmVfZmlsZSA9IGluY2x1ZGVfYnl0ZXMhKCIuLi90ZXN0cy9hcGktc2lnbmF0dXJlLWZpbGUudHh0Iik7CisgICAgICAgIGxldCBmbGFncyA9IGV4dHJhY3RfZmxhZ2dlZF9hcGlfZmxhZ3MoJmFwaV9zaWduYXR1cmVfZmlsZVsuLl0pLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICBIYXNoU2V0Ojpmcm9tX2l0ZXIodmVjIVsKKyAgICAgICAgICAgICAgICAicmVjb3JkX2ZpbmFsaXplZF9mbGFncy50ZXN0LmZvbyIudG9fc3RyaW5nKCksCisgICAgICAgICAgICAgICAgInRoaXMuZmxhZy5pcy5ub3QudXNlZCIudG9fc3RyaW5nKCksCisgICAgICAgICAgICBdKQorICAgICAgICApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlY29yZC1maW5hbGl6ZWQtZmxhZ3Mvc3JjL2ZpbmFsaXplZF9mbGFncy5ycyBiL3Rvb2xzL3JlY29yZC1maW5hbGl6ZWQtZmxhZ3Mvc3JjL2ZpbmFsaXplZF9mbGFncy5ycwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWU0YzRkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcmVjb3JkLWZpbmFsaXplZC1mbGFncy9zcmMvZmluYWxpemVkX2ZsYWdzLnJzCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCit1c2UgYW55aG93OjpSZXN1bHQ7Cit1c2Ugc3RkOjp7Y29sbGVjdGlvbnM6Okhhc2hTZXQsIGlvOjpSZWFkfTsKKwordXNlIGNyYXRlOjpGbGFnSWQ7CisKKy8vLyBSZWFkIGEgbGlzdCBvZiBmbGFnIG5hbWVzLiBUaGUgaW5wdXQgaXMgZXhwZWN0ZWQgdG8gYmUgcGxhaW4gdGV4dCwgd2l0aCBlYWNoIGxpbmUgY29udGFpbmluZworLy8vIHRoZSBuYW1lIG9mIGEgc2luZ2xlIGZsYWcuCitwdWIoY3JhdGUpIGZuIHJlYWRfZmluYWxpemVkX2ZsYWdzPFI6IFJlYWQ+KG11dCByZWFkZXI6IFIpIC0+IFJlc3VsdDxIYXNoU2V0PEZsYWdJZD4+IHsKKyAgICBsZXQgbXV0IGNvbnRlbnRzID0gU3RyaW5nOjpuZXcoKTsKKyAgICByZWFkZXIucmVhZF90b19zdHJpbmcoJm11dCBjb250ZW50cyk/OworICAgIGxldCBpdGVyID0gY29udGVudHMubGluZXMoKS5tYXAofHN8IHMudG9fb3duZWQoKSk7CisgICAgT2soSGFzaFNldDo6ZnJvbV9pdGVyKGl0ZXIpKQorfQorCisjW2NmZyh0ZXN0KV0KK21vZCB0ZXN0cyB7CisgICAgdXNlIHN1cGVyOjoqOworCisgICAgI1t0ZXN0XQorICAgIGZuIHRlc3QoKSB7CisgICAgICAgIGxldCBpbnB1dCA9IGluY2x1ZGVfYnl0ZXMhKCIuLi90ZXN0cy9maW5hbGl6ZWQtZmxhZ3MudHh0Iik7CisgICAgICAgIGxldCBmbGFncyA9IHJlYWRfZmluYWxpemVkX2ZsYWdzKCZpbnB1dFsuLl0pLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKAorICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICBIYXNoU2V0Ojpmcm9tX2l0ZXIodmVjIVsKKyAgICAgICAgICAgICAgICAicmVjb3JkX2ZpbmFsaXplZF9mbGFncy50ZXN0LmJhciIudG9fc3RyaW5nKCksCisgICAgICAgICAgICAgICAgInJlY29yZF9maW5hbGl6ZWRfZmxhZ3MudGVzdC5iYXoiLnRvX3N0cmluZygpLAorICAgICAgICAgICAgXSkKKyAgICAgICAgKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS90b29scy9yZWNvcmQtZmluYWxpemVkLWZsYWdzL3NyYy9mbGFnX3ZhbHVlcy5ycyBiL3Rvb2xzL3JlY29yZC1maW5hbGl6ZWQtZmxhZ3Mvc3JjL2ZsYWdfdmFsdWVzLnJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMTZkMTIKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9yZWNvcmQtZmluYWxpemVkLWZsYWdzL3NyYy9mbGFnX3ZhbHVlcy5ycwpAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDI1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKwordXNlIGFjb25maWdfcHJvdG9zOjp7UGFyc2VkRmxhZ0V4dCwgUHJvdG9GbGFnUGVybWlzc2lvbiwgUHJvdG9GbGFnU3RhdGV9OwordXNlIGFueWhvdzo6e2FueWhvdywgUmVzdWx0fTsKK3VzZSBzdGQ6Ontjb2xsZWN0aW9uczo6SGFzaFNldCwgaW86OlJlYWR9OworCit1c2UgY3JhdGU6OkZsYWdJZDsKKworLy8vIFBhcnNlIGEgUHJvdG9QYXJzZWRGbGFncyBiaW5hcnkgcHJvdG9idWYgYmxvYiBhbmQgcmV0dXJuIHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZXMgb2YgZmxhZ3MKKy8vLyB0aGF0IGFyZSBzbGF0ZWQgZm9yIEFQSSBmaW5hbGl6YXRpb24gKGkuZS4gYXJlIGJvdGggRU5BQkxFRCBhbmQgUkVBRF9PTkxZKS4KK3B1YihjcmF0ZSkgZm4gZ2V0X3JlbGV2YW50X2ZsYWdzX2Zyb21fYmluYXJ5X3Byb3RvPFI6IFJlYWQ+KAorICAgIG11dCByZWFkZXI6IFIsCispIC0+IFJlc3VsdDxIYXNoU2V0PEZsYWdJZD4+IHsKKyAgICBsZXQgbXV0IGJ1ZmZlciA9IFZlYzo6bmV3KCk7CisgICAgcmVhZGVyLnJlYWRfdG9fZW5kKCZtdXQgYnVmZmVyKT87CisgICAgbGV0IHBhcnNlZF9mbGFncyA9IGFjb25maWdfcHJvdG9zOjpwYXJzZWRfZmxhZ3M6OnRyeV9mcm9tX2JpbmFyeV9wcm90bygmYnVmZmVyKQorICAgICAgICAubWFwX2Vycih8X3wgYW55aG93ISgiZmFpbGVkIHRvIHBhcnNlIGJpbmFyeSBwcm90byIpKT87CisgICAgbGV0IGl0ZXIgPSBwYXJzZWRfZmxhZ3MKKyAgICAgICAgLnBhcnNlZF9mbGFnCisgICAgICAgIC5pbnRvX2l0ZXIoKQorICAgICAgICAuZmlsdGVyKHxmbGFnfCB7CisgICAgICAgICAgICBmbGFnLnN0YXRlKCkgPT0gUHJvdG9GbGFnU3RhdGU6OkVOQUJMRUQKKyAgICAgICAgICAgICAgICAmJiBmbGFnLnBlcm1pc3Npb24oKSA9PSBQcm90b0ZsYWdQZXJtaXNzaW9uOjpSRUFEX09OTFkKKyAgICAgICAgfSkKKyAgICAgICAgLm1hcCh8ZmxhZ3wgZmxhZy5mdWxseV9xdWFsaWZpZWRfbmFtZSgpKTsKKyAgICBPayhIYXNoU2V0Ojpmcm9tX2l0ZXIoaXRlcikpCit9CisKKyNbY2ZnKHRlc3QpXQorbW9kIHRlc3RzIHsKKyAgICB1c2Ugc3VwZXI6Oio7CisKKyAgICAjW3Rlc3RdCisgICAgZm4gdGVzdF9kaXNhYmxlZF9vcl9yZWFkX3dyaXRlX2ZsYWdzX2FyZV9pZ25vcmVkKCkgeworICAgICAgICBsZXQgYnl0ZXMgPSBpbmNsdWRlX2J5dGVzISgiLi4vdGVzdHMvZmxhZ3MucHJvdG9idWYiKTsKKyAgICAgICAgbGV0IGZsYWdzID0gZ2V0X3JlbGV2YW50X2ZsYWdzX2Zyb21fYmluYXJ5X3Byb3RvKCZieXRlc1suLl0pLnVud3JhcCgpOworICAgICAgICBhc3NlcnRfZXEhKGZsYWdzLCBIYXNoU2V0Ojpmcm9tX2l0ZXIodmVjIVsicmVjb3JkX2ZpbmFsaXplZF9mbGFncy50ZXN0LmZvbyIudG9fc3RyaW5nKCldKSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVjb3JkLWZpbmFsaXplZC1mbGFncy9zcmMvbWFpbi5ycyBiL3Rvb2xzL3JlY29yZC1maW5hbGl6ZWQtZmxhZ3Mvc3JjL21haW4ucnMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWZkYmM5YgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3JlY29yZC1maW5hbGl6ZWQtZmxhZ3Mvc3JjL21haW4ucnMKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyEgYHJlY29yZC1maW5hbGl6ZWQtZmxhZ3NgIGlzIGEgdG9vbCB0byBjcmVhdGUgYSBzbmFwc2hvdCAoaW50ZW5kZWQgdG8gYmUgc3RvcmVkIGluCisvLyEgcHJlYnVpbHRzL3Nkaykgb2YgdGhlIGZsYWdzIHVzZWQgd2l0aCBARmxhZ2dlZEFwaSBBUElzCit1c2UgYW55aG93OjpSZXN1bHQ7Cit1c2UgY2xhcDo6UGFyc2VyOwordXNlIHN0ZDo6e2NvbGxlY3Rpb25zOjpIYXNoU2V0LCBmczo6RmlsZSwgcGF0aDo6UGF0aEJ1Zn07CisKK21vZCBhcGlfc2lnbmF0dXJlX2ZpbGVzOworbW9kIGZpbmFsaXplZF9mbGFnczsKK21vZCBmbGFnX3ZhbHVlczsKKworcHViKGNyYXRlKSB0eXBlIEZsYWdJZCA9IFN0cmluZzsKKworY29uc3QgQUJPVVQ6ICZzdHIgPSAiQ3JlYXRlIGEgbmV3IHByZWJ1aWx0cy9zZGsvPHZlcnNpb24+L2ZpbmFsaXplZC1mbGFncy50eHQgZmlsZQorCitUaGUgcHJlYnVpbHRzL3Nkay88dmVyc2lvbj4vZmluYWxpemVkLWZsYWdzLnR4dCBmaWxlcyBsaXN0IGFsbCBhY29uZmlnIGZsYWdzIHRoYXQgaGF2ZSBiZWVuIHVzZWQKK3dpdGggQEZsYWdnZWRBcGkgYW5ub3RhdGlvbnMgb24gQVBJcyB0aGF0IGhhdmUgYmVlbiBmaW5hbGl6ZWQuIFRoZXNlIGZpbGVzIGFyZSB1c2VkIHRvIHByZXZlbnQKK2ZsYWdzIGZyb20gYmVpbmcgcmUtdXNlZCBmb3IgbmV3LCB1bmZpbmFsaXplZCwgQVBJcywgYW5kIGJ5IHRoZSBhY29uZmlnIGNvZGUgZ2VuZXJhdGlvbi4KKworVGhpcyB0b29sIHdvcmtzIGFzIGZvbGxvd3M6CisKKyAgLSBSZWFkIEFQSSBzaWduYXR1cmUgZmlsZXMgZnJvbSBzb3VyY2UgdHJlZSAoKmN1cnJlbnQudHh0IGZpbGVzKSBbLS1hcGktc2lnbmF0dXJlLWZpbGVdCisgIC0gUmVhZCB0aGUgY3VycmVudCBhY29uZmlnIGZsYWcgdmFsdWVzIGZyb20gc291cmNlIHRyZWUgWy0tcGFyc2VkLWZsYWdzLWZpbGVdCisgIC0gUmVhZCB0aGUgcHJldmlvdXMgZmluYWxpemVkLWZsYWdzLnR4dCBmaWxlcyBmcm9tIHByZWJ1aWx0cy9zZGsgWy0tZmluYWxpemVkLWZsYWdzLWZpbGVdCisgIC0gRXh0cmFjdCB0aGUgZmxhZ3Mgc2xhdGVkIGZvciBBUEkgZmluYWxpemF0aW9uIGJ5IHNjYW5uaW5nIHRocm91Z2ggdGhlIEFQSSBzaWduYXR1cmUgZmlsZXMgZm9yCisgICAgZmxhZ3MgdGhhdCBhcmUgRU5BQkxFRCBhbmQgUkVBRF9PTkxZCisgIC0gTWVyZ2UgdGhlIGZvdW5kIGZsYWdzIHdpdGggdGhlIHJlY29yZGVkIGZsYWdzIGZyb20gcHJldmlvdXMgQVBJIGZpbmFsaXphdGlvbnMKKyAgLSBQcmludCB0aGUgc2V0IG9mIGZsYWdzIHRvIHN0ZG91dAorIjsKKworI1tkZXJpdmUoUGFyc2VyLCBEZWJ1ZyldCisjW2NsYXAoYWJvdXQ9QUJPVVQpXQorc3RydWN0IENsaSB7CisgICAgI1thcmcobG9uZyldCisgICAgcGFyc2VkX2ZsYWdzX2ZpbGU6IFBhdGhCdWYsCisKKyAgICAjW2FyZyhsb25nKV0KKyAgICBhcGlfc2lnbmF0dXJlX2ZpbGU6IFZlYzxQYXRoQnVmPiwKKworICAgICNbYXJnKGxvbmcpXQorICAgIGZpbmFsaXplZF9mbGFnc19maWxlOiBQYXRoQnVmLAorfQorCisvLy8gRmlsdGVyIG91dCB0aGUgRU5BQkxFRCBhbmQgUkVBRF9PTkxZIGZsYWdzIHVzZWQgd2l0aCBARmxhZ2dlZEFwaSBhbm5vdGF0aW9ucyBpbiB0aGUgc291cmNlCisvLy8gdHJlZSwgYW5kIGFkZCB0aG9zZSBmbGFncyB0byB0aGUgc2V0IG9mIHByZXZpb3VzbHkgZmluYWxpemVkIGZsYWdzLgorZm4gY2FsY3VsYXRlX25ld19maW5hbGl6ZWRfZmxhZ3MoCisgICAgZmxhZ3NfdXNlZF93aXRoX2ZsYWdnZWRhcGlfYW5ub3RhdGlvbjogJkhhc2hTZXQ8RmxhZ0lkPiwKKyAgICBhbGxfZmxhZ3NfdG9fYmVfZmluYWxpemVkOiAmSGFzaFNldDxGbGFnSWQ+LAorICAgIGFscmVhZHlfZmluYWxpemVkX2ZsYWdzOiAmSGFzaFNldDxGbGFnSWQ+LAorKSAtPiBIYXNoU2V0PEZsYWdJZD4geworICAgIGxldCBuZXdfZmxhZ3M6IEhhc2hTZXQ8Xz4gPSBmbGFnc191c2VkX3dpdGhfZmxhZ2dlZGFwaV9hbm5vdGF0aW9uCisgICAgICAgIC5pbnRlcnNlY3Rpb24oYWxsX2ZsYWdzX3RvX2JlX2ZpbmFsaXplZCkKKyAgICAgICAgLm1hcCh8c3wgcy50b19vd25lZCgpKQorICAgICAgICAuY29sbGVjdCgpOworICAgIGFscmVhZHlfZmluYWxpemVkX2ZsYWdzLnVuaW9uKCZuZXdfZmxhZ3MpLm1hcCh8c3wgcy50b19vd25lZCgpKS5jb2xsZWN0KCkKK30KKworZm4gbWFpbigpIC0+IFJlc3VsdDwoKT4geworICAgIGxldCBhcmdzID0gQ2xpOjpwYXJzZSgpOworCisgICAgbGV0IG11dCBmbGFnc191c2VkX3dpdGhfZmxhZ2dlZGFwaV9hbm5vdGF0aW9uID0gSGFzaFNldDo6bmV3KCk7CisgICAgZm9yIHBhdGggaW4gYXJncy5hcGlfc2lnbmF0dXJlX2ZpbGUgeworICAgICAgICBsZXQgZmlsZSA9IEZpbGU6Om9wZW4ocGF0aCk/OworICAgICAgICBmb3IgZmxhZyBpbiBhcGlfc2lnbmF0dXJlX2ZpbGVzOjpleHRyYWN0X2ZsYWdnZWRfYXBpX2ZsYWdzKGZpbGUpPy5kcmFpbigpIHsKKyAgICAgICAgICAgIGZsYWdzX3VzZWRfd2l0aF9mbGFnZ2VkYXBpX2Fubm90YXRpb24uaW5zZXJ0KGZsYWcpOworICAgICAgICB9CisgICAgfQorCisgICAgbGV0IGZpbGUgPSBGaWxlOjpvcGVuKGFyZ3MucGFyc2VkX2ZsYWdzX2ZpbGUpPzsKKyAgICBsZXQgYWxsX2ZsYWdzX3RvX2JlX2ZpbmFsaXplZCA9IGZsYWdfdmFsdWVzOjpnZXRfcmVsZXZhbnRfZmxhZ3NfZnJvbV9iaW5hcnlfcHJvdG8oZmlsZSk/OworCisgICAgbGV0IGZpbGUgPSBGaWxlOjpvcGVuKGFyZ3MuZmluYWxpemVkX2ZsYWdzX2ZpbGUpPzsKKyAgICBsZXQgYWxyZWFkeV9maW5hbGl6ZWRfZmxhZ3MgPSBmaW5hbGl6ZWRfZmxhZ3M6OnJlYWRfZmluYWxpemVkX2ZsYWdzKGZpbGUpPzsKKworICAgIGxldCBtdXQgbmV3X2ZpbmFsaXplZF9mbGFncyA9IFZlYzo6ZnJvbV9pdGVyKGNhbGN1bGF0ZV9uZXdfZmluYWxpemVkX2ZsYWdzKAorICAgICAgICAmZmxhZ3NfdXNlZF93aXRoX2ZsYWdnZWRhcGlfYW5ub3RhdGlvbiwKKyAgICAgICAgJmFsbF9mbGFnc190b19iZV9maW5hbGl6ZWQsCisgICAgICAgICZhbHJlYWR5X2ZpbmFsaXplZF9mbGFncywKKyAgICApKTsKKyAgICBuZXdfZmluYWxpemVkX2ZsYWdzLnNvcnQoKTsKKworICAgIHByaW50bG4hKCJ7fSIsIG5ld19maW5hbGl6ZWRfZmxhZ3Muam9pbigiXG4iKSk7CisKKyAgICBPaygoKSkKK30KKworI1tjZmcodGVzdCldCittb2QgdGVzdHMgeworICAgIHVzZSBzdXBlcjo6KjsKKworICAgICNbdGVzdF0KKyAgICBmbiB0ZXN0KCkgeworICAgICAgICBsZXQgaW5wdXQgPSBpbmNsdWRlX2J5dGVzISgiLi4vdGVzdHMvYXBpLXNpZ25hdHVyZS1maWxlLnR4dCIpOworICAgICAgICBsZXQgZmxhZ3NfdXNlZF93aXRoX2ZsYWdnZWRhcGlfYW5ub3RhdGlvbiA9CisgICAgICAgICAgICBhcGlfc2lnbmF0dXJlX2ZpbGVzOjpleHRyYWN0X2ZsYWdnZWRfYXBpX2ZsYWdzKCZpbnB1dFsuLl0pLnVud3JhcCgpOworCisgICAgICAgIGxldCBpbnB1dCA9IGluY2x1ZGVfYnl0ZXMhKCIuLi90ZXN0cy9mbGFncy5wcm90b2J1ZiIpOworICAgICAgICBsZXQgYWxsX2ZsYWdzX3RvX2JlX2ZpbmFsaXplZCA9CisgICAgICAgICAgICBmbGFnX3ZhbHVlczo6Z2V0X3JlbGV2YW50X2ZsYWdzX2Zyb21fYmluYXJ5X3Byb3RvKCZpbnB1dFsuLl0pLnVud3JhcCgpOworCisgICAgICAgIGxldCBpbnB1dCA9IGluY2x1ZGVfYnl0ZXMhKCIuLi90ZXN0cy9maW5hbGl6ZWQtZmxhZ3MudHh0Iik7CisgICAgICAgIGxldCBhbHJlYWR5X2ZpbmFsaXplZF9mbGFncyA9IGZpbmFsaXplZF9mbGFnczo6cmVhZF9maW5hbGl6ZWRfZmxhZ3MoJmlucHV0Wy4uXSkudW53cmFwKCk7CisKKyAgICAgICAgbGV0IG5ld19maW5hbGl6ZWRfZmxhZ3MgPSBjYWxjdWxhdGVfbmV3X2ZpbmFsaXplZF9mbGFncygKKyAgICAgICAgICAgICZmbGFnc191c2VkX3dpdGhfZmxhZ2dlZGFwaV9hbm5vdGF0aW9uLAorICAgICAgICAgICAgJmFsbF9mbGFnc190b19iZV9maW5hbGl6ZWQsCisgICAgICAgICAgICAmYWxyZWFkeV9maW5hbGl6ZWRfZmxhZ3MsCisgICAgICAgICk7CisKKyAgICAgICAgYXNzZXJ0X2VxISgKKyAgICAgICAgICAgIG5ld19maW5hbGl6ZWRfZmxhZ3MsCisgICAgICAgICAgICBIYXNoU2V0Ojpmcm9tX2l0ZXIodmVjIVsKKyAgICAgICAgICAgICAgICAicmVjb3JkX2ZpbmFsaXplZF9mbGFncy50ZXN0LmZvbyIudG9fc3RyaW5nKCksCisgICAgICAgICAgICAgICAgInJlY29yZF9maW5hbGl6ZWRfZmxhZ3MudGVzdC5iYXIiLnRvX3N0cmluZygpLAorICAgICAgICAgICAgICAgICJyZWNvcmRfZmluYWxpemVkX2ZsYWdzLnRlc3QuYmF6Ii50b19zdHJpbmcoKSwKKyAgICAgICAgICAgIF0pCisgICAgICAgICk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVjb3JkLWZpbmFsaXplZC1mbGFncy90ZXN0cy9hcGktc2lnbmF0dXJlLWZpbGUudHh0IGIvdG9vbHMvcmVjb3JkLWZpbmFsaXplZC1mbGFncy90ZXN0cy9hcGktc2lnbmF0dXJlLWZpbGUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhZDU1OWYKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9yZWNvcmQtZmluYWxpemVkLWZsYWdzL3Rlc3RzL2FwaS1zaWduYXR1cmUtZmlsZS50eHQKQEAgLTAsMCArMSwxNSBAQAorLy8gU2lnbmF0dXJlIGZvcm1hdDogMi4wCitwYWNrYWdlIGFuZHJvaWQgeworCisgIHB1YmxpYyBmaW5hbCBjbGFzcyBDIHsKKyAgICBjdG9yIHB1YmxpYyBDKCk7CisgIH0KKworICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEMuaW5uZXIgeworICAgIGN0b3IgcHVibGljIEMuaW5uZXIoKTsKKyAgICBmaWVsZCBARmxhZ2dlZEFwaSgicmVjb3JkX2ZpbmFsaXplZF9mbGFncy50ZXN0LmZvbyIpIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEZPTyA9ICJmb28iOworICAgIGZpZWxkIEBGbGFnZ2VkQXBpKCJ0aGlzLmZsYWcuaXMubm90LnVzZWQiKSBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBCQVIgPSAiYmFyIjsKKyAgfQorCit9CisKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlY29yZC1maW5hbGl6ZWQtZmxhZ3MvdGVzdHMvZmluYWxpemVkLWZsYWdzLnR4dCBiL3Rvb2xzL3JlY29yZC1maW5hbGl6ZWQtZmxhZ3MvdGVzdHMvZmluYWxpemVkLWZsYWdzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmJjYjNkCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcmVjb3JkLWZpbmFsaXplZC1mbGFncy90ZXN0cy9maW5hbGl6ZWQtZmxhZ3MudHh0CkBAIC0wLDAgKzEsMiBAQAorcmVjb3JkX2ZpbmFsaXplZF9mbGFncy50ZXN0LmJhcgorcmVjb3JkX2ZpbmFsaXplZF9mbGFncy50ZXN0LmJhegpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVjb3JkLWZpbmFsaXplZC1mbGFncy90ZXN0cy9mbGFncy5kZWNsYXJhdGlvbnMgYi90b29scy9yZWNvcmQtZmluYWxpemVkLWZsYWdzL3Rlc3RzL2ZsYWdzLmRlY2xhcmF0aW9ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDVlZjYyCi0tLSAvZGV2L251bGwKKysrIGIvdG9vbHMvcmVjb3JkLWZpbmFsaXplZC1mbGFncy90ZXN0cy9mbGFncy5kZWNsYXJhdGlvbnMKQEAgLTAsMCArMSwxNiBAQAorcGFja2FnZTogInJlY29yZF9maW5hbGl6ZWRfZmxhZ3MudGVzdCIKK2NvbnRhaW5lcjogInN5c3RlbSIKKworZmxhZyB7CisgICAgbmFtZTogImZvbyIKKyAgICBuYW1lc3BhY2U6ICJ0ZXN0IgorICAgIGRlc2NyaXB0aW9uOiAiRklYTUUiCisgICAgYnVnOiAiIgorfQorCitmbGFnIHsKKyAgICBuYW1lOiAibm90X2VuYWJsZWQiCisgICAgbmFtZXNwYWNlOiAidGVzdCIKKyAgICBkZXNjcmlwdGlvbjogIkZJWE1FIgorICAgIGJ1ZzogIiIKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlY29yZC1maW5hbGl6ZWQtZmxhZ3MvdGVzdHMvZmxhZ3MucHJvdG9idWYgYi90b29scy9yZWNvcmQtZmluYWxpemVkLWZsYWdzL3Rlc3RzL2ZsYWdzLnByb3RvYnVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjNmU2M2UKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9yZWNvcmQtZmluYWxpemVkLWZsYWdzL3Rlc3RzL2ZsYWdzLnByb3RvYnVmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlY29yZC1maW5hbGl6ZWQtZmxhZ3MvdGVzdHMvZmxhZ3MudmFsdWVzIGIvdG9vbHMvcmVjb3JkLWZpbmFsaXplZC1mbGFncy90ZXN0cy9mbGFncy52YWx1ZXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY2MjI1ZAotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3JlY29yZC1maW5hbGl6ZWQtZmxhZ3MvdGVzdHMvZmxhZ3MudmFsdWVzCkBAIC0wLDAgKzEsMTMgQEAKK2ZsYWdfdmFsdWUgeworICAgIHBhY2thZ2U6ICJyZWNvcmRfZmluYWxpemVkX2ZsYWdzLnRlc3QiCisgICAgbmFtZTogImZvbyIKKyAgICBzdGF0ZTogRU5BQkxFRAorICAgIHBlcm1pc3Npb246IFJFQURfT05MWQorfQorCitmbGFnX3ZhbHVlIHsKKyAgICBwYWNrYWdlOiAicmVjb3JkX2ZpbmFsaXplZF9mbGFncy50ZXN0IgorICAgIG5hbWU6ICJub3RfZW5hYmxlZCIKKyAgICBzdGF0ZTogRElTQUJMRUQKKyAgICBwZXJtaXNzaW9uOiBSRUFEX09OTFkKK30KZGlmZiAtLWdpdCBhL3Rvb2xzL3JlY29yZC1maW5hbGl6ZWQtZmxhZ3MvdGVzdHMvZ2VuZXJhdGUtZmxhZ3MtcHJvdG9idWYuc2ggYi90b29scy9yZWNvcmQtZmluYWxpemVkLWZsYWdzL3Rlc3RzL2dlbmVyYXRlLWZsYWdzLXByb3RvYnVmLnNoCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjcwMTE4OWMKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9yZWNvcmQtZmluYWxpemVkLWZsYWdzL3Rlc3RzL2dlbmVyYXRlLWZsYWdzLXByb3RvYnVmLnNoCkBAIC0wLDAgKzEsNyBAQAorIyEvYmluL2Jhc2gKK2Fjb25maWcgY3JlYXRlLWNhY2hlIFwKKyAgICAtLXBhY2thZ2UgcmVjb3JkX2ZpbmFsaXplZF9mbGFncy50ZXN0IFwKKyAgICAtLWNvbnRhaW5lciBzeXN0ZW0gXAorICAgIC0tZGVjbGFyYXRpb25zIGZsYWdzLmRlY2xhcmF0aW9ucyBcCisgICAgLS12YWx1ZXMgZmxhZ3MudmFsdWVzIFwKKyAgICAtLWNhY2hlIGZsYWdzLnByb3RvYnVmCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvQW5kcm9pZC5icCBiL3Rvb2xzL3JlbGVhc2V0b29scy9BbmRyb2lkLmJwCmluZGV4IDhjNzEwNDQuLmUzNzFiMjMgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9BbmRyb2lkLmJwCisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9BbmRyb2lkLmJwCkBAIC02MzcsNiArNjM3LDggQEAKICAgICBdLAogICAgIGRhdGE6IFsKICAgICAgICAgInRlc3RkYXRhLyoqLyoiLAorICAgIF0sCisgICAgZGV2aWNlX2NvbW1vbl9kYXRhOiBbCiAgICAgICAgICI6Y29tLmFuZHJvaWQuYXBleC5jb21wcmVzc2VkLnYxIiwKICAgICAgICAgIjpjb20uYW5kcm9pZC5hcGV4LnZlbmRvci5mb28ud2l0aF92aW50ZiIsCiAgICAgXSwKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9hZGRfaW1nX3RvX3RhcmdldF9maWxlcy5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy9hZGRfaW1nX3RvX3RhcmdldF9maWxlcy5weQppbmRleCBjMjVmZjI3Li4zMGE2YWNjIDEwMDY0NAotLS0gYS90b29scy9yZWxlYXNldG9vbHMvYWRkX2ltZ190b190YXJnZXRfZmlsZXMucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL2FkZF9pbWdfdG9fdGFyZ2V0X2ZpbGVzLnB5CkBAIC0xMTAwLDcgKzExMDAsNyBAQAogICAgIHZibWV0YV9wYXJ0aXRpb25zID0gY29tbW9uLkFWQl9QQVJUSVRJT05TWzpdICsgdHVwbGUoYXZiX2N1c3RvbV9wYXJ0aXRpb25zKQogCiAgICAgdmJtZXRhX3N5c3RlbSA9IE9QVElPTlMuaW5mb19kaWN0LmdldCgiYXZiX3ZibWV0YV9zeXN0ZW0iLCAiIikuc3RyaXAoKQotICAgIGlmIHZibWV0YV9zeXN0ZW06CisgICAgaWYgdmJtZXRhX3N5c3RlbSBhbmQgc2V0KHZibWV0YV9zeXN0ZW0uc3BsaXQoKSkuaW50ZXJzZWN0aW9uKHBhcnRpdGlvbnMpOgogICAgICAgYmFubmVyKCJ2Ym1ldGFfc3lzdGVtIikKICAgICAgIHBhcnRpdGlvbnNbInZibWV0YV9zeXN0ZW0iXSA9IEFkZFZCTWV0YSgKICAgICAgICAgICBvdXRwdXRfemlwLCBwYXJ0aXRpb25zLCAidmJtZXRhX3N5c3RlbSIsIHZibWV0YV9zeXN0ZW0uc3BsaXQoKSkKQEAgLTExMTAsNyArMTExMCw3IEBACiAgICAgICB2Ym1ldGFfcGFydGl0aW9ucy5hcHBlbmQoInZibWV0YV9zeXN0ZW0iKQogCiAgICAgdmJtZXRhX3ZlbmRvciA9IE9QVElPTlMuaW5mb19kaWN0LmdldCgiYXZiX3ZibWV0YV92ZW5kb3IiLCAiIikuc3RyaXAoKQotICAgIGlmIHZibWV0YV92ZW5kb3I6CisgICAgaWYgdmJtZXRhX3ZlbmRvciBhbmQgc2V0KHZibWV0YV92ZW5kb3Iuc3BsaXQoKSkuaW50ZXJzZWN0aW9uKHBhcnRpdGlvbnMpOgogICAgICAgYmFubmVyKCJ2Ym1ldGFfdmVuZG9yIikKICAgICAgIHBhcnRpdGlvbnNbInZibWV0YV92ZW5kb3IiXSA9IEFkZFZCTWV0YSgKICAgICAgICAgICBvdXRwdXRfemlwLCBwYXJ0aXRpb25zLCAidmJtZXRhX3ZlbmRvciIsIHZibWV0YV92ZW5kb3Iuc3BsaXQoKSkKQEAgLTExMzcsNyArMTEzNyw3IEBACiAgICAgICAgICAgICBpZiBpdGVtIG5vdCBpbiBpbmNsdWRlZF9wYXJ0aXRpb25zXQogICAgICAgICB2Ym1ldGFfcGFydGl0aW9ucy5hcHBlbmQocGFydGl0aW9uX25hbWUpCiAKLSAgICBpZiBPUFRJT05TLmluZm9fZGljdC5nZXQoImF2Yl9idWlsZGluZ192Ym1ldGFfaW1hZ2UiKSA9PSAidHJ1ZSI6CisgICAgaWYgT1BUSU9OUy5pbmZvX2RpY3QuZ2V0KCJhdmJfYnVpbGRpbmdfdmJtZXRhX2ltYWdlIikgPT0gInRydWUiIGFuZCBzZXQodmJtZXRhX3BhcnRpdGlvbnMpLmludGVyc2VjdGlvbihwYXJ0aXRpb25zKToKICAgICAgIGJhbm5lcigidmJtZXRhIikKICAgICAgIEFkZFZCTWV0YShvdXRwdXRfemlwLCBwYXJ0aXRpb25zLCAidmJtZXRhIiwgdmJtZXRhX3BhcnRpdGlvbnMpCiAKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9hcGV4X3V0aWxzLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL2FwZXhfdXRpbHMucHkKaW5kZXggNTRkZjk1NS4uMDhmMmI4MyAxMDA2NDQKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL2FwZXhfdXRpbHMucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL2FwZXhfdXRpbHMucHkKQEAgLTc5LDE1ICs3OSwxMCBAQAogICAgIFJldHVybnM6CiAgICAgICBUaGUgcmVwYWNrZWQgYXBleCBmaWxlIGNvbnRhaW5pbmcgdGhlIHNpZ25lZCBhcGsgZmlsZXMuCiAgICAgIiIiCi0gICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNlbGYuZGVidWdmc19wYXRoKToKLSAgICAgIHJhaXNlIEFwZXhTaWduaW5nRXJyb3IoCi0gICAgICAgICAgIkNvdWxkbid0IGZpbmQgbG9jYXRpb24gb2YgZGVidWdmc19zdGF0aWM6ICIgKwotICAgICAgICAgICJQYXRoIHt9IGRvZXMgbm90IGV4aXN0LiAiLmZvcm1hdChzZWxmLmRlYnVnZnNfcGF0aCkgKwotICAgICAgICAgICJNYWtlIHN1cmUgYmluL2RlYnVnZnNfc3RhdGljIGNhbiBiZSBmb3VuZCBpbiAtcCA8cGF0aD4iKQotICAgIGxpc3RfY21kID0gWydkZWFwZXhlcicsICctLWRlYnVnZnNfcGF0aCcsIHNlbGYuZGVidWdmc19wYXRoLAotICAgICAgICAgICAgICAgICdsaXN0Jywgc2VsZi5hcGV4X3BhdGhdCi0gICAgZW50cmllc19uYW1lcyA9IGNvbW1vbi5SdW5BbmRDaGVja091dHB1dChsaXN0X2NtZCkuc3BsaXQoKQotICAgIGFwa19lbnRyaWVzID0gW25hbWUgZm9yIG5hbWUgaW4gZW50cmllc19uYW1lcyBpZiBuYW1lLmVuZHN3aXRoKCcuYXBrJyldCisgICAgcGF5bG9hZF9kaXIgPSBzZWxmLkV4dHJhY3RBcGV4UGF5bG9hZChzZWxmLmFwZXhfcGF0aCkKKyAgICBhcGtfZW50cmllcyA9IFtdCisgICAgZm9yIGJhc2VfZGlyLCBfLCBmaWxlcyBpbiBvcy53YWxrKHBheWxvYWRfZGlyKToKKyAgICAgIGFwa19lbnRyaWVzLmV4dGVuZChvcy5wYXRoLmpvaW4oYmFzZV9kaXIsIGZpbGUpIGZvciBmaWxlIGluIGZpbGVzIGlmIGZpbGUuZW5kc3dpdGgoJy5hcGsnKSkKIAogICAgICMgTm8gbmVlZCB0byBzaWduIGFuZCByZXBhY2ssIHJldHVybiB0aGUgb3JpZ2luYWwgYXBleCBwYXRoLgogICAgIGlmIG5vdCBhcGtfZW50cmllcyBhbmQgc2VsZi5zaWduX3Rvb2wgaXMgTm9uZToKQEAgLTEwNSwxNiArMTAwLDE2IEBACiAgICAgICAgIGxvZ2dlci53YXJuaW5nKCdBcGsgcGF0aCBkb2VzIG5vdCBjb250YWluIHRoZSBpbnRlbmRlZCBkaXJlY3RvcnkgbmFtZTonCiAgICAgICAgICAgICAgICAgICAgICAgICcgJXMnLCBlbnRyeSkKIAotICAgIHBheWxvYWRfZGlyLCBoYXNfc2lnbmVkX2NvbnRlbnQgPSBzZWxmLkV4dHJhY3RBcGV4UGF5bG9hZEFuZFNpZ25Db250ZW50cygKLSAgICAgICAgYXBrX2VudHJpZXMsIGFwa19rZXlzLCBwYXlsb2FkX2tleSwgc2lnbmluZ19hcmdzKQorICAgIGhhc19zaWduZWRfY29udGVudCA9IHNlbGYuU2lnbkNvbnRlbnRzSW5QYXlsb2FkKAorICAgICAgICBwYXlsb2FkX2RpciwgYXBrX2VudHJpZXMsIGFwa19rZXlzLCBwYXlsb2FkX2tleSwgc2lnbmluZ19hcmdzKQogICAgIGlmIG5vdCBoYXNfc2lnbmVkX2NvbnRlbnQ6CiAgICAgICBsb2dnZXIuaW5mbygnTm8gY29udGVudHMgaGFzIGJlZW4gc2lnbmVkIGluICVzJywgc2VsZi5hcGV4X3BhdGgpCiAgICAgICByZXR1cm4gc2VsZi5hcGV4X3BhdGgKIAogICAgIHJldHVybiBzZWxmLlJlcGFja0FwZXhQYXlsb2FkKHBheWxvYWRfZGlyLCBwYXlsb2FkX2tleSwgc2lnbmluZ19hcmdzKQogCi0gIGRlZiBFeHRyYWN0QXBleFBheWxvYWRBbmRTaWduQ29udGVudHMoc2VsZiwgYXBrX2VudHJpZXMsIGFwa19rZXlzLCBwYXlsb2FkX2tleSwgc2lnbmluZ19hcmdzKToKLSAgICAiIiJFeHRyYWN0cyB0aGUgcGF5bG9hZCBpbWFnZSBhbmQgc2lnbnMgdGhlIGNvbnRhaW5pbmcgYXBrIGZpbGVzLiIiIgorICBkZWYgRXh0cmFjdEFwZXhQYXlsb2FkKHNlbGYsIGFwZXhfcGF0aCk6CisgICAgIiIiRXh0cmFjdHMgdGhlIGNvbnRlbnRzIG9mIGFuIEFQRVggYW5kIHJldHVybnMgdGhlIGRpcmVjdG9yeSBvZiB0aGUgY29udGVudHMiIiIKICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5kZWJ1Z2ZzX3BhdGgpOgogICAgICAgcmFpc2UgQXBleFNpZ25pbmdFcnJvcigKICAgICAgICAgICAiQ291bGRuJ3QgZmluZCBsb2NhdGlvbiBvZiBkZWJ1Z2ZzX3N0YXRpYzogIiArCkBAIC0xMjksOSArMTI0LDEyIEBACiAgICAgZXh0cmFjdF9jbWQgPSBbJ2RlYXBleGVyJywgJy0tZGVidWdmc19wYXRoJywgc2VsZi5kZWJ1Z2ZzX3BhdGgsCiAgICAgICAgICAgICAgICAgICAgJy0tZnNja2Vyb2ZzX3BhdGgnLCBzZWxmLmZzY2tlcm9mc19wYXRoLAogICAgICAgICAgICAgICAgICAgICdleHRyYWN0JywKLSAgICAgICAgICAgICAgICAgICBzZWxmLmFwZXhfcGF0aCwgcGF5bG9hZF9kaXJdCisgICAgICAgICAgICAgICAgICAgYXBleF9wYXRoLCBwYXlsb2FkX2Rpcl0KICAgICBjb21tb24uUnVuQW5kQ2hlY2tPdXRwdXQoZXh0cmFjdF9jbWQpCisgICAgcmV0dXJuIHBheWxvYWRfZGlyCiAKKyAgZGVmIFNpZ25Db250ZW50c0luUGF5bG9hZChzZWxmLCBwYXlsb2FkX2RpciwgYXBrX2VudHJpZXMsIGFwa19rZXlzLCBwYXlsb2FkX2tleSwgc2lnbmluZ19hcmdzKToKKyAgICAiIiJTaWducyB0aGUgY29udGVudHMgaW4gcGF5bG9hZC4iIiIKICAgICBoYXNfc2lnbmVkX2NvbnRlbnQgPSBGYWxzZQogICAgIGZvciBlbnRyeSBpbiBhcGtfZW50cmllczoKICAgICAgIGFwa19wYXRoID0gb3MucGF0aC5qb2luKHBheWxvYWRfZGlyLCBlbnRyeSkKQEAgLTE2Myw3ICsxNjEsNyBAQAogICAgICAgY29tbW9uLlJ1bkFuZENoZWNrT3V0cHV0KGNtZCkKICAgICAgIGhhc19zaWduZWRfY29udGVudCA9IFRydWUKIAotICAgIHJldHVybiBwYXlsb2FkX2RpciwgaGFzX3NpZ25lZF9jb250ZW50CisgICAgcmV0dXJuIGhhc19zaWduZWRfY29udGVudAogCiAgIGRlZiBSZXBhY2tBcGV4UGF5bG9hZChzZWxmLCBwYXlsb2FkX2RpciwgcGF5bG9hZF9rZXksIHNpZ25pbmdfYXJncz1Ob25lKToKICAgICAiIiJSZWJ1aWxkcyB0aGUgYXBleCBmaWxlIHdpdGggdGhlIHVwZGF0ZWQgcGF5bG9hZCBkaXJlY3RvcnkuIiIiCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvYnVpbGRfaW1hZ2UucHkgYi90b29scy9yZWxlYXNldG9vbHMvYnVpbGRfaW1hZ2UucHkKaW5kZXggNDY0YWQ5Yi4uYjZjOTZjNCAxMDA3NTUKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL2J1aWxkX2ltYWdlLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9idWlsZF9pbWFnZS5weQpAQCAtNjc3LDYgKzY3NywyMSBAQAogICAgICAgZ2xvYl9kaWN0WyJmaW5nZXJwcmludCJdID0gZmluZ2VycHJpbnQKICAgICAgIHJldHVybgogCitkZWYgVHJ5UGFyc2VGaW5nZXJwcmludEFuZFRpbWVzdGFtcChnbG9iX2RpY3QpOgorICAiIiJIZWxwZXIgZnVuY3Rpb24gdGhhdCBwYXJzZXMgZmluZ2VycHJpbnQgYW5kIHRpbWVzdGFtcCBmcm9tIHRoZSBnbG9iYWwgZGljdGlvbmFyeS4KKworICBBcmdzOgorICAgIGdsb2JfZGljdDogdGhlIGdsb2JhbCBkaWN0aW9uYXJ5IGZyb20gdGhlIGJ1aWxkIHN5c3RlbS4KKyAgIiIiCisgIFRyeVBhcnNlRmluZ2VycHJpbnQoZ2xvYl9kaWN0KQorCisgICMgU2V0IGZpeGVkIHRpbWVzdGFtcCBmb3IgYnVpbGRpbmcgdGhlIE9UQSBwYWNrYWdlLgorICBpZiAidXNlX2ZpeGVkX3RpbWVzdGFtcCIgaW4gZ2xvYl9kaWN0OgorICAgIGdsb2JfZGljdFsidGltZXN0YW1wIl0gPSBGSVhFRF9GSUxFX1RJTUVTVEFNUAorICBpZiAiYnVpbGQucHJvcCIgaW4gZ2xvYl9kaWN0OgorICAgIHRpbWVzdGFtcCA9IGdsb2JfZGljdFsiYnVpbGQucHJvcCJdLkdldFByb3AoInJvLmJ1aWxkLmRhdGUudXRjIikKKyAgICBpZiB0aW1lc3RhbXA6CisgICAgICBnbG9iX2RpY3RbInRpbWVzdGFtcCJdID0gdGltZXN0YW1wCiAKIGRlZiBJbWFnZVByb3BGcm9tR2xvYmFsRGljdChnbG9iX2RpY3QsIG1vdW50X3BvaW50KToKICAgIiIiQnVpbGQgYW4gaW1hZ2UgcHJvcGVydHkgZGljdGlvbmFyeSBmcm9tIHRoZSBnbG9iYWwgZGljdGlvbmFyeS4KQEAgLTY4NiwxNSArNzAxLDcgQEAKICAgICBtb3VudF9wb2ludDogc3VjaCBhcyAic3lzdGVtIiwgImRhdGEiIGV0Yy4KICAgIiIiCiAgIGQgPSB7fQotICBUcnlQYXJzZUZpbmdlcnByaW50KGdsb2JfZGljdCkKLQotICAjIFNldCBmaXhlZCB0aW1lc3RhbXAgZm9yIGJ1aWxkaW5nIHRoZSBPVEEgcGFja2FnZS4KLSAgaWYgInVzZV9maXhlZF90aW1lc3RhbXAiIGluIGdsb2JfZGljdDoKLSAgICBkWyJ0aW1lc3RhbXAiXSA9IEZJWEVEX0ZJTEVfVElNRVNUQU1QCi0gIGlmICJidWlsZC5wcm9wIiBpbiBnbG9iX2RpY3Q6Ci0gICAgdGltZXN0YW1wID0gZ2xvYl9kaWN0WyJidWlsZC5wcm9wIl0uR2V0UHJvcCgicm8uYnVpbGQuZGF0ZS51dGMiKQotICAgIGlmIHRpbWVzdGFtcDoKLSAgICAgIGRbInRpbWVzdGFtcCJdID0gdGltZXN0YW1wCisgIFRyeVBhcnNlRmluZ2VycHJpbnRBbmRUaW1lc3RhbXAoZ2xvYl9kaWN0KQogCiAgIGRlZiBjb3B5X3Byb3Aoc3JjX3AsIGRlc3RfcCk6CiAgICAgIiIiQ29weSBhIHByb3BlcnR5IGZyb20gdGhlIGdsb2JhbCBkaWN0aW9uYXJ5LgpAQCAtNzMwLDYgKzczNyw3IEBACiAgICAgICAiYXZiX2F2YnRvb2wiLAogICAgICAgInVzZV9keW5hbWljX3BhcnRpdGlvbl9zaXplIiwKICAgICAgICJmaW5nZXJwcmludCIsCisgICAgICAidGltZXN0YW1wIiwKICAgKQogICBmb3IgcCBpbiBjb21tb25fcHJvcHM6CiAgICAgY29weV9wcm9wKHAsIHApCkBAIC05OTIsNiArMTAwMCw3IEBACiAgICAgIyBUaGUgY2FsbGVyIGtub3dzIHRoZSBtb3VudCBwb2ludCBhbmQgcHJvdmlkZXMgYSBkaWN0aW9uYXJ5IG5lZWRlZCBieQogICAgICMgQnVpbGRJbWFnZSgpLgogICAgIGltYWdlX3Byb3BlcnRpZXMgPSBnbG9iX2RpY3QKKyAgICBUcnlQYXJzZUZpbmdlcnByaW50QW5kVGltZXN0YW1wKGltYWdlX3Byb3BlcnRpZXMpCiAgIGVsc2U6CiAgICAgaW1hZ2VfZmlsZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGFyZ3Mub3V0X2ZpbGUpCiAgICAgbW91bnRfcG9pbnQgPSAiIgpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL2NvbW1vbi5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy9jb21tb24ucHkKaW5kZXggZjA0ZGZiNy4uYjZjYmIxNSAxMDA2NDQKLS0tIGEvdG9vbHMvcmVsZWFzZXRvb2xzL2NvbW1vbi5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvY29tbW9uLnB5CkBAIC0yMyw3ICsyMyw3IEBACiBpbXBvcnQgZ2V0b3B0CiBpbXBvcnQgZ2V0cGFzcwogaW1wb3J0IGd6aXAKLWltcG9ydCBpbXAKK2ltcG9ydCBpbXBvcnRsaWIudXRpbAogaW1wb3J0IGpzb24KIGltcG9ydCBsb2dnaW5nCiBpbXBvcnQgbG9nZ2luZy5jb25maWcKQEAgLTMxMzIsMTYgKzMxMzIsMTkgQEAKICAgICAgICAgcmV0dXJuCiAgICAgICB0cnk6CiAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIocGF0aCk6Ci0gICAgICAgICAgaW5mbyA9IGltcC5maW5kX21vZHVsZSgicmVsZWFzZXRvb2xzIiwgW3BhdGhdKQotICAgICAgICBlbHNlOgotICAgICAgICAgIGQsIGYgPSBvcy5wYXRoLnNwbGl0KHBhdGgpCi0gICAgICAgICAgYiwgeCA9IG9zLnBhdGguc3BsaXRleHQoZikKLSAgICAgICAgICBpZiB4ID09ICIucHkiOgotICAgICAgICAgICAgZiA9IGIKLSAgICAgICAgICBpbmZvID0gaW1wLmZpbmRfbW9kdWxlKGYsIFtkXSkKKyAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICJyZWxlYXNldG9vbHMiKQorICAgICAgICAgIGlmIG9zLnBhdGguaXNkaXIocGF0aCk6CisgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICJfX2luaXRfXy5weSIpCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKSBhbmQgb3MucGF0aC5leGlzdHMocGF0aCArICIucHkiKToKKyAgICAgICAgICBwYXRoID0gcGF0aCArICIucHkiCisgICAgICAgIHNwZWMgPSBpbXBvcnRsaWIudXRpbC5zcGVjX2Zyb21fZmlsZV9sb2NhdGlvbigiZGV2aWNlX3NwZWNpZmljIiwgcGF0aCkKKyAgICAgICAgaWYgbm90IHNwZWM6CisgICAgICAgICAgcmFpc2UgRmlsZU5vdEZvdW5kRXJyb3IocGF0aCkKICAgICAgICAgbG9nZ2VyLmluZm8oImxvYWRlZCBkZXZpY2Utc3BlY2lmaWMgZXh0ZW5zaW9ucyBmcm9tICVzIiwgcGF0aCkKLSAgICAgICAgc2VsZi5tb2R1bGUgPSBpbXAubG9hZF9tb2R1bGUoImRldmljZV9zcGVjaWZpYyIsICppbmZvKQotICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBtb2R1bGUgPSBpbXBvcnRsaWIudXRpbC5tb2R1bGVfZnJvbV9zcGVjKHNwZWMpCisgICAgICAgIHNwZWMubG9hZGVyLmV4ZWNfbW9kdWxlKG1vZHVsZSkKKyAgICAgICAgc2VsZi5tb2R1bGUgPSBtb2R1bGUKKyAgICAgIGV4Y2VwdCAoSW1wb3J0RXJyb3IsIEZpbGVOb3RGb3VuZEVycm9yKToKICAgICAgICAgbG9nZ2VyLmluZm8oInVuYWJsZSB0byBsb2FkIGRldmljZS1zcGVjaWZpYyBtb2R1bGU7IGFzc3VtaW5nIG5vbmUiKQogCiAgIGRlZiBfRG9DYWxsKHNlbGYsIGZ1bmN0aW9uX25hbWUsICphcmdzLCAqKmt3YXJncyk6CmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvZnN2ZXJpdHlfbWV0YWRhdGFfZ2VuZXJhdG9yLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL2ZzdmVyaXR5X21ldGFkYXRhX2dlbmVyYXRvci5weQppbmRleCBmYTdjZDM5Li5lNTMxY2NhIDEwMDY0NAotLS0gYS90b29scy9yZWxlYXNldG9vbHMvZnN2ZXJpdHlfbWV0YWRhdGFfZ2VuZXJhdG9yLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9mc3Zlcml0eV9tZXRhZGF0YV9nZW5lcmF0b3IucHkKQEAgLTEwNCwxNiArMTA0LDEzIEBACiAgICAgb3V0ID0gc3VicHJvY2Vzcy5jaGVja19vdXRwdXQoY21kLCB1bml2ZXJzYWxfbmV3bGluZXM9VHJ1ZSkuc3RyaXAoKQogICAgIHJldHVybiBieXRlcyhieXRlYXJyYXkuZnJvbWhleChvdXQpKQogCi0gIGRlZiBnZW5lcmF0ZShzZWxmLCBpbnB1dF9maWxlLCBvdXRwdXRfZmlsZT1Ob25lKToKKyAgZGVmIGdlbmVyYXRlKHNlbGYsIGlucHV0X2ZpbGUsIG91dHB1dF9maWxlKToKICAgICBpZiBzZWxmLl9zaWduYXR1cmUgIT0gJ25vbmUnOgogICAgICAgaWYgbm90IHNlbGYuX2tleToKICAgICAgICAgcmFpc2UgUnVudGltZUVycm9yKCJrZXkgbXVzdCBiZSBzcGVjaWZpZWQuIikKICAgICAgIGlmIG5vdCBzZWxmLl9jZXJ0OgogICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoImNlcnQgbXVzdCBiZSBzcGVjaWZpZWQuIikKIAotICAgIGlmIG5vdCBvdXRwdXRfZmlsZToKLSAgICAgIG91dHB1dF9maWxlID0gaW5wdXRfZmlsZSArICcuZnN2X21ldGEnCi0KICAgICB3aXRoIFRlbXBEaXJlY3RvcnkoKSBhcyB0ZW1wX2RpcjoKICAgICAgIHNlbGYuX2RvX2dlbmVyYXRlKGlucHV0X2ZpbGUsIG91dHB1dF9maWxlLCB0ZW1wX2RpcikKIApAQCAtMjI5LDYgKzIyNiwyMSBAQAogICAgICAgcmVxdWlyZWQ9VHJ1ZSkKICAgYXJncyA9IHAucGFyc2VfYXJncyhzeXMuYXJndlsxOl0pCiAKKyAgb3V0cHV0X2ZpbGUgPSBhcmdzLm91dHB1dAorICBpZiBub3Qgb3V0cHV0X2ZpbGU6CisgICAgb3V0cHV0X2ZpbGUgPSBpbnB1dF9maWxlICsgJy5mc3ZfbWV0YScKKworICAjIHJlbW92ZSB0aGUgb3V0cHV0IGZpbGUgZmlyc3QsIGFzIHN3aXRjaGluZyBiZXR3ZWVuIGEgZmlsZSBhbmQgYSBzeW1saW5rIGNhbiBiZSBjb21wbGljYXRlZAorICB0cnk6CisgICAgb3MucmVtb3ZlKG91dHB1dF9maWxlKQorICBleGNlcHQgRmlsZU5vdEZvdW5kRXJyb3I6CisgICAgcGFzcworCisgIGlmIG9zLnBhdGguaXNsaW5rKGFyZ3MuaW5wdXQpOgorICAgIHRhcmdldCA9IG9zLnJlYWRsaW5rKGFyZ3MuaW5wdXQpICsgJy5mc3ZfbWV0YScKKyAgICBvcy5zeW1saW5rKHRhcmdldCwgb3V0cHV0X2ZpbGUpCisgICAgc3lzLmV4aXQoMCkKKwogICBnZW5lcmF0b3IgPSBGU1Zlcml0eU1ldGFkYXRhR2VuZXJhdG9yKGFyZ3MuZnN2ZXJpdHlfcGF0aCkKICAgZ2VuZXJhdG9yLnNldF9zaWduYXR1cmUoYXJncy5zaWduYXR1cmUpCiAgIGlmIGFyZ3Muc2lnbmF0dXJlID09ICdub25lJzoKQEAgLTI0MSw0ICsyNTMsNCBAQAogICAgIGdlbmVyYXRvci5zZXRfY2VydChhcmdzLmNlcnQpCiAgIGdlbmVyYXRvci5zZXRfa2V5X2Zvcm1hdChhcmdzLmtleV9mb3JtYXQpCiAgIGdlbmVyYXRvci5zZXRfaGFzaF9hbGcoYXJncy5oYXNoX2FsZykKLSAgZ2VuZXJhdG9yLmdlbmVyYXRlKGFyZ3MuaW5wdXQsIGFyZ3Mub3V0cHV0KQorICBnZW5lcmF0b3IuZ2VuZXJhdGUoYXJncy5pbnB1dCwgb3V0cHV0X2ZpbGUpCmRpZmYgLS1naXQgYS90b29scy9yZWxlYXNldG9vbHMvbWVyZ2Vfb3RhLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL21lcmdlX290YS5weQppbmRleCBmYjU5NTdhLi5lODczMmEyIDEwMDY0NAotLS0gYS90b29scy9yZWxlYXNldG9vbHMvbWVyZ2Vfb3RhLnB5CisrKyBiL3Rvb2xzL3JlbGVhc2V0b29scy9tZXJnZV9vdGEucHkKQEAgLTIyNiw5ICsyMjYsMjEgQEAKICAgICBsb2dnZXIuc2V0TGV2ZWwobG9nZ2luZy5JTkZPKQogCiAgIGxvZ2dlci5pbmZvKGFyZ3MpCisgIGlmIGFyZ3MuamF2YV9wYXRoOgorICAgIGNvbW1vbi5PUFRJT05TLmphdmFfcGF0aCA9IGFyZ3MuamF2YV9wYXRoCisKICAgaWYgYXJncy5zZWFyY2hfcGF0aDoKICAgICBjb21tb24uT1BUSU9OUy5zZWFyY2hfcGF0aCA9IGFyZ3Muc2VhcmNoX3BhdGgKIAorICBpZiBhcmdzLnNpZ25hcGtfcGF0aDoKKyAgICBjb21tb24uT1BUSU9OUy5zaWduYXBrX3BhdGggPSBhcmdzLnNpZ25hcGtfcGF0aAorCisgIGlmIGFyZ3MuZXh0cmFfc2lnbmFwa19hcmdzOgorICAgIGNvbW1vbi5PUFRJT05TLmV4dHJhX3NpZ25hcGtfYXJncyA9IGFyZ3MuZXh0cmFfc2lnbmFwa19hcmdzCisKKyAgaWYgYXJncy5zaWduYXBrX3NoYXJlZF9saWJyYXJ5X3BhdGg6CisgICAgY29tbW9uLk9QVElPTlMuc2lnbmFwa19zaGFyZWRfbGlicmFyeV9wYXRoID0gYXJncy5zaWduYXBrX3NoYXJlZF9saWJyYXJ5X3BhdGgKKwogICBtZXRhZGF0YV9vdGEgPSBhcmdzLnBhY2thZ2VzWy0xXQogICBpZiBhcmdzLm1ldGFkYXRhX290YSBpcyBub3QgTm9uZToKICAgICBtZXRhZGF0YV9vdGEgPSBhcmdzLm1ldGFkYXRhX290YQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL290YV9mcm9tX3Jhd19pbWcucHkgYi90b29scy9yZWxlYXNldG9vbHMvb3RhX2Zyb21fcmF3X2ltZy5weQppbmRleCAwM2I0NGYxLi4zYjkzNzRhIDEwMDY0NAotLS0gYS90b29scy9yZWxlYXNldG9vbHMvb3RhX2Zyb21fcmF3X2ltZy5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvb3RhX2Zyb21fcmF3X2ltZy5weQpAQCAtMTA1LDkgKzEwNSw2IEBACiAKICAgICBpZiBhcmdzLnBhY2thZ2Vfa2V5OgogICAgICAgbG9nZ2VyLmluZm8oIlNpZ25pbmcgcGF5bG9hZC4uLiIpCi0gICAgICAjIFRPRE86IHJlbW92ZSBPUFRJT05TIHdoZW4gbm8gbG9uZ2VyIHVzZWQgYXMgZmFsbGJhY2sgaW4gcGF5bG9hZF9zaWduZXIKLSAgICAgIGNvbW1vbi5PUFRJT05TLnBheWxvYWRfc2lnbmVyX2FyZ3MgPSBOb25lCi0gICAgICBjb21tb24uT1BUSU9OUy5wYXlsb2FkX3NpZ25lcl9tYXhpbXVtX3NpZ25hdHVyZV9zaXplID0gTm9uZQogICAgICAgc2lnbmVyID0gUGF5bG9hZFNpZ25lcihhcmdzLnBhY2thZ2Vfa2V5LCBhcmdzLnByaXZhdGVfa2V5X3N1ZmZpeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5X3Bhc3N3b3Jkc1thcmdzLnBhY2thZ2Vfa2V5XSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZF9zaWduZXI9YXJncy5wYXlsb2FkX3NpZ25lciwKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9vdGFfZnJvbV90YXJnZXRfZmlsZXMucHkgYi90b29scy9yZWxlYXNldG9vbHMvb3RhX2Zyb21fdGFyZ2V0X2ZpbGVzLnB5CmluZGV4IDk4NWNkNTYuLjc2ZDE2OGMgMTAwNzU1Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9vdGFfZnJvbV90YXJnZXRfZmlsZXMucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL290YV9mcm9tX3RhcmdldF9maWxlcy5weQpAQCAtMjY0LDYgKzI2NCwxMCBAQAogCiAgIC0tY29tcHJlc3Npb25fZmFjdG9yCiAgICAgICBTcGVjaWZ5IHRoZSBtYXhpbXVtIGJsb2NrIHNpemUgdG8gYmUgY29tcHJlc3NlZCBhdCBvbmNlIGR1cmluZyBPVEEuIHN1cHBvcnRlZCBvcHRpb25zOiA0aywgOGssIDE2aywgMzJrLCA2NGssIDEyOGssIDI1NmsKKworICAtLWZ1bGxfb3RhX3BhcnRpdGlvbnMKKyAgICAgIFNwZWNpZnkgbGlzdCBvZiBwYXJ0aXRpb25zIHNob3VsZCBiZSB1cGRhdGVkIGluIGZ1bGwgT1RBIGZhc2hpb24sIGV2ZW4gaWYKKyAgICAgIGFuIGluY3JlbWVudGFsIE9UQSBpcyBhYm91dCB0byBiZSBnZW5lcmF0ZWQKICIiIgogCiBmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCkBAIC0yODMsNyArMjg3LDcgQEAKIGltcG9ydCBvdGFfdXRpbHMKIGltcG9ydCBwYXlsb2FkX3NpZ25lcgogZnJvbSBvdGFfdXRpbHMgaW1wb3J0IChWQUJDX0NPTVBSRVNTSU9OX1BBUkFNX1NVUFBPUlQsIEZpbmFsaXplTWV0YWRhdGEsIEdldFBhY2thZ2VNZXRhZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgUGF5bG9hZEdlbmVyYXRvciwgU0VDVVJJVFlfUEFUQ0hfTEVWRUxfUFJPUF9OQU1FLCBFeHRyYWN0VGFyZ2V0RmlsZXMsIENvcHlUYXJnZXRGaWxlc0RpcikKKyAgICAgICAgICAgICAgICAgICAgICAgUGF5bG9hZEdlbmVyYXRvciwgU0VDVVJJVFlfUEFUQ0hfTEVWRUxfUFJPUF9OQU1FLCBFeHRyYWN0VGFyZ2V0RmlsZXMsIENvcHlUYXJnZXRGaWxlc0RpciwgVEFSR0VUX0ZJTEVTX0lNQUdFU19TVUJESVIpCiBmcm9tIGNvbW1vbiBpbXBvcnQgRG9lc0lucHV0RmlsZUNvbnRhaW4sIElzU3BhcnNlSW1hZ2UKIGltcG9ydCB0YXJnZXRfZmlsZXNfZGlmZgogZnJvbSBub25fYWJfb3RhIGltcG9ydCBHZW5lcmF0ZU5vbkFiT3RhUGFja2FnZQpAQCAtMzM3LDYgKzM0MSw3IEBACiBPUFRJT05TLm1heF90aHJlYWRzID0gTm9uZQogT1BUSU9OUy52YWJjX2Nvd192ZXJzaW9uID0gTm9uZQogT1BUSU9OUy5jb21wcmVzc2lvbl9mYWN0b3IgPSBOb25lCitPUFRJT05TLmZ1bGxfb3RhX3BhcnRpdGlvbnMgPSBOb25lCiAKIAogUE9TVElOU1RBTExfQ09ORklHID0gJ01FVEEvcG9zdGluc3RhbGxfY29uZmlnLnR4dCcKQEAgLTg5Miw2ICs4OTcsMTQgQEAKIAogICBpZiBzb3VyY2VfZmlsZSBpcyBub3QgTm9uZToKICAgICBzb3VyY2VfZmlsZSA9IEV4dHJhY3RUYXJnZXRGaWxlcyhzb3VyY2VfZmlsZSkKKyAgICBpZiBPUFRJT05TLmZ1bGxfb3RhX3BhcnRpdGlvbnM6CisgICAgICBmb3IgcGFydGl0aW9uIGluIE9QVElPTlMuZnVsbF9vdGFfcGFydGl0aW9uczoKKyAgICAgICAgZm9yIHN1YmRpciBpbiBUQVJHRVRfRklMRVNfSU1BR0VTX1NVQkRJUjoKKyAgICAgICAgICBpbWFnZV9wYXRoID0gb3MucGF0aC5qb2luKHNvdXJjZV9maWxlLCBzdWJkaXIsIHBhcnRpdGlvbiArICIuaW1nIikKKyAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhpbWFnZV9wYXRoKToKKyAgICAgICAgICAgIGxvZ2dlci5pbmZvKAorICAgICAgICAgICAgICAgICJJZ25vcmluZyBzb3VyY2UgaW1hZ2UgJXMgZm9yIHBhcnRpdGlvbiAlcyBiZWNhdXNlIGl0IGlzIGNvbmZpZ3VyZWQgdG8gdXNlIGZ1bGwgT1RBIiwgaW1hZ2VfcGF0aCwgcGFydGl0aW9uKQorICAgICAgICAgICAgb3MucmVtb3ZlKGltYWdlX3BhdGgpCiAgICAgYXNzZXJ0ICJhYl9wYXJ0aXRpb25zIiBpbiBPUFRJT05TLnNvdXJjZV9pbmZvX2RpY3QsIFwKICAgICAgICAgIk1FVEEvYWJfcGFydGl0aW9ucy50eHQgaXMgcmVxdWlyZWQgZm9yIGFiX3VwZGF0ZS4iCiAgICAgYXNzZXJ0ICJhYl9wYXJ0aXRpb25zIiBpbiBPUFRJT05TLnRhcmdldF9pbmZvX2RpY3QsIFwKQEAgLTEwMjYsNiArMTAzOSw5IEBACiAKICAgIyBQcmVwYXJlIGN1c3RvbSBpbWFnZXMuCiAgIGlmIE9QVElPTlMuY3VzdG9tX2ltYWdlczoKKyAgICBpZiBzb3VyY2VfZmlsZSBpcyBub3QgTm9uZToKKyAgICAgIHNvdXJjZV9maWxlID0gR2V0VGFyZ2V0RmlsZXNaaXBGb3JDdXN0b21JbWFnZXNVcGRhdGVzKAorICAgICAgICAgICBzb3VyY2VfZmlsZSwgT1BUSU9OUy5jdXN0b21faW1hZ2VzKQogICAgIHRhcmdldF9maWxlID0gR2V0VGFyZ2V0RmlsZXNaaXBGb3JDdXN0b21JbWFnZXNVcGRhdGVzKAogICAgICAgICB0YXJnZXRfZmlsZSwgT1BUSU9OUy5jdXN0b21faW1hZ2VzKQogCkBAIC0xMTA4LDE3ICsxMTI0LDE4IEBACiAgIGFkZGl0aW9uYWxfYXJncyArPSBbIi0tZW5hYmxlX2x6NGRpZmY9IiArCiAgICAgICAgICAgICAgICAgICAgICAgc3RyKE9QVElPTlMuZW5hYmxlX2x6NGRpZmYpLmxvd2VyKCldCiAKKyAgZW52X292ZXJyaWRlID0ge30KICAgaWYgc291cmNlX2ZpbGUgYW5kIE9QVElPTlMuZW5hYmxlX2x6NGRpZmY6Ci0gICAgaW5wdXRfdG1wID0gY29tbW9uLlVuemlwVGVtcChzb3VyY2VfZmlsZSwgWyJNRVRBL2xpYmx6NC5zbyJdKQotICAgIGxpYmx6NF9wYXRoID0gb3MucGF0aC5qb2luKGlucHV0X3RtcCwgIk1FVEEiLCAibGlibHo0LnNvIikKKyAgICBsaWJsejRfcGF0aCA9IG9zLnBhdGguam9pbihzb3VyY2VfZmlsZSwgIk1FVEEiLCAibGlibHo0LnNvIikKICAgICBhc3NlcnQgb3MucGF0aC5leGlzdHMoCiAgICAgICAgIGxpYmx6NF9wYXRoKSwgImxpYmx6NC5zbyBub3QgZm91bmQgaW4gTUVUQS8gZGlyIG9mIHRhcmdldCBmaWxlIHt9Ii5mb3JtYXQobGlibHo0X3BhdGgpCiAgICAgbG9nZ2VyLmluZm8oIkVuYWJsaW5nIGx6NGRpZmYgJXMiLCBsaWJsejRfcGF0aCkKLSAgICBhZGRpdGlvbmFsX2FyZ3MgKz0gWyItLWxpYmx6NF9wYXRoIiwgbGlibHo0X3BhdGhdCiAgICAgZXJvZnNfY29tcHJlc3Npb25fcGFyYW0gPSBPUFRJT05TLnRhcmdldF9pbmZvX2RpY3QuZ2V0KAogICAgICAgICAiZXJvZnNfZGVmYXVsdF9jb21wcmVzc29yIikKICAgICBhc3NlcnQgZXJvZnNfY29tcHJlc3Npb25fcGFyYW0gaXMgbm90IE5vbmUsICInZXJvZnNfZGVmYXVsdF9jb21wcmVzc29yJyBub3QgZm91bmQgaW4gTUVUQS9taXNjX2luZm8udHh0IG9mIHRhcmdldCBidWlsZC4gVGhpcyBpcyByZXF1aXJlZCB0byBlbmFibGUgbHo0ZGlmZi4iCiAgICAgYWRkaXRpb25hbF9hcmdzICs9IFsiLS1lcm9mc19jb21wcmVzc2lvbl9wYXJhbSIsIGVyb2ZzX2NvbXByZXNzaW9uX3BhcmFtXQorICAgIGVudl9vdmVycmlkZVsiTERfUFJFTE9BRCJdID0gbGlibHo0X3BhdGggKyBcCisgICAgICAgICI6IiArIG9zLmVudmlyb24uZ2V0KCJMRF9QUkVMT0FEIiwgIiIpCiAKICAgaWYgT1BUSU9OUy5kaXNhYmxlX3ZhYmM6CiAgICAgYWRkaXRpb25hbF9hcmdzICs9IFsiLS1kaXNhYmxlX3ZhYmM9dHJ1ZSJdCkBAIC0xMTI4LDEwICsxMTQ1LDE1IEBACiAgICAgYWRkaXRpb25hbF9hcmdzICs9IFsiLS1jb21wcmVzc29yX3R5cGVzIiwgT1BUSU9OUy5jb21wcmVzc29yX3R5cGVzXQogICBhZGRpdGlvbmFsX2FyZ3MgKz0gWyItLW1heF90aW1lc3RhbXAiLCBtYXhfdGltZXN0YW1wXQogCisgIGVudiA9IGRpY3Qob3MuZW52aXJvbikKKyAgaWYgZW52X292ZXJyaWRlOgorICAgIGxvZ2dlci5pbmZvKCJVc2luZyBlbnZpcm9ubWVudCB2YXJpYWJsZXMgJXMiLCBlbnZfb3ZlcnJpZGUpCisgICAgZW52LnVwZGF0ZShlbnZfb3ZlcnJpZGUpCiAgIHBheWxvYWQuR2VuZXJhdGUoCiAgICAgICB0YXJnZXRfZmlsZSwKICAgICAgIHNvdXJjZV9maWxlLAotICAgICAgYWRkaXRpb25hbF9hcmdzICsgcGFydGl0aW9uX3RpbWVzdGFtcHNfZmxhZ3MKKyAgICAgIGFkZGl0aW9uYWxfYXJncyArIHBhcnRpdGlvbl90aW1lc3RhbXBzX2ZsYWdzLAorICAgICAgZW52PWVudgogICApCiAKICAgIyBTaWduIHRoZSBwYXlsb2FkLgpAQCAtMTE5Myw3ICsxMjE1LDcgQEAKIAogZGVmIG1haW4oYXJndik6CiAKLSAgZGVmIG9wdGlvbl9oYW5kbGVyKG8sIGEpOgorICBkZWYgb3B0aW9uX2hhbmRsZXIobywgYTogc3RyKToKICAgICBpZiBvIGluICgiLWkiLCAiLS1pbmNyZW1lbnRhbF9mcm9tIik6CiAgICAgICBPUFRJT05TLmluY3JlbWVudGFsX3NvdXJjZSA9IGEKICAgICBlbGlmIG8gPT0gIi0tZnVsbF9yYWRpbyI6CkBAIC0xMzIwLDYgKzEzNDIsOSBAQAogICAgICAgZWxzZToKICAgICAgICAgcmFpc2UgVmFsdWVFcnJvcigiQ2Fubm90IHBhcnNlIHZhbHVlICVyIGZvciBvcHRpb24gJXIgLSBvbmx5ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAiaW50ZWdlcnMgYXJlIGFsbG93ZWQuIiAlIChhLCBvKSkKKyAgICBlbGlmIG8gPT0gIi0tZnVsbF9vdGFfcGFydGl0aW9ucyI6CisgICAgICBPUFRJT05TLmZ1bGxfb3RhX3BhcnRpdGlvbnMgPSBzZXQoCisgICAgICAgICAgYS5zdHJpcCgpLnN0cmlwKCJcIiIpLnN0cmlwKCInIikuc3BsaXQoIiwiKSkKICAgICBlbHNlOgogICAgICAgcmV0dXJuIEZhbHNlCiAgICAgcmV0dXJuIFRydWUKQEAgLTEzNzAsNiArMTM5NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWF4X3RocmVhZHM9IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ2YWJjX2Nvd192ZXJzaW9uPSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcHJlc3Npb25fZmFjdG9yPSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnVsbF9vdGFfcGFydGl0aW9ucz0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdLCBleHRyYV9vcHRpb25faGFuZGxlcj1bb3B0aW9uX2hhbmRsZXIsIHBheWxvYWRfc2lnbmVyLnNpZ25lcl9vcHRpb25zXSkKICAgY29tbW9uLkluaXRMb2dnaW5nKCkKIApkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL290YV9zaWduaW5nX3V0aWxzLnB5IGIvdG9vbHMvcmVsZWFzZXRvb2xzL290YV9zaWduaW5nX3V0aWxzLnB5CmluZGV4IDYwYzhjOTQuLjlkMDRjM2IgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9vdGFfc2lnbmluZ191dGlscy5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvb3RhX3NpZ25pbmdfdXRpbHMucHkKQEAgLTIzLDEwICsyMywxOCBAQAogCiAKIGRlZiBBZGRTaWduaW5nQXJndW1lbnRQYXJzZShwYXJzZXI6IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKToKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1qYXZhX3BhdGgnLCB0eXBlPXN0ciwKKyAgICAgICAgICAgICAgICAgICAgICBoZWxwPSdQYXRoIHRvIEpWTSBpZiBvdGhlciB0aGFuIGRlZmF1bHQnKQogICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXBhY2thZ2Vfa2V5JywgdHlwZT1zdHIsCiAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nUGF0aHMgdG8gcHJpdmF0ZSBrZXkgZm9yIHNpZ25pbmcgcGF5bG9hZCcpCiAgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tc2VhcmNoX3BhdGgnLCAnLS1wYXRoJywgdHlwZT1zdHIsCiAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nU2VhcmNoIHBhdGggZm9yIGZyYW1ld29yay9zaWduYXBrLmphcicpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tc2lnbmFwa19wYXRoJywgdHlwZT1zdHIsCisgICAgICAgICAgICAgICAgICAgICAgaGVscD0nUGF0aCB0byBzaWduYXBrLmphciwgcmVsYXRpdmUgdG8gc2VhcmNoX3BhdGgnKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWV4dHJhX3NpZ25hcGtfYXJncycsIHR5cGU9UGFyc2VTaWduZXJBcmdzLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J0V4dHJhIGFyZ3VtZW50cyBmb3Igc2lnbmFway5qYXInKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXNpZ25hcGtfc2hhcmVkX2xpYnJhcnlfcGF0aCcsIHR5cGU9c3RyLAorICAgICAgICAgICAgICAgICAgICAgIGhlbHA9J1BhdGggdG8gbGliNjQgbGlicmFyaWVzIHVzZWQgYnkgc2lnbmFway5qYXInKQogICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXBheWxvYWRfc2lnbmVyJywgdHlwZT1zdHIsCiAgICAgICAgICAgICAgICAgICAgICAgaGVscD0nUGF0aCB0byBjdXN0b20gcGF5bG9hZCBzaWduZXInKQogICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXBheWxvYWRfc2lnbmVyX2FyZ3MnLCB0eXBlPVBhcnNlU2lnbmVyQXJncywKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy9vdGFfdXRpbHMucHkgYi90b29scy9yZWxlYXNldG9vbHMvb3RhX3V0aWxzLnB5CmluZGV4IDgxYjUzZGMuLjg1MmQ2MmIgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3JlbGVhc2V0b29scy9vdGFfdXRpbHMucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL290YV91dGlscy5weQpAQCAtODQ1LDE2ICs4NDUsMTYgQEAKICAgICBzZWxmLmlzX3BhcnRpYWxfdXBkYXRlID0gaXNfcGFydGlhbF91cGRhdGUKICAgICBzZWxmLnNwbF9kb3duZ3JhZGUgPSBzcGxfZG93bmdyYWRlCiAKLSAgZGVmIF9SdW4oc2VsZiwgY21kKTogICMgcHlsaW50OiBkaXNhYmxlPW5vLXNlbGYtdXNlCisgIGRlZiBfUnVuKHNlbGYsIGNtZCwgKiprd2FyZ3MpOiAgIyBweWxpbnQ6IGRpc2FibGU9bm8tc2VsZi11c2UKICAgICAjIERvbid0IHBpcGUgKGJ1ZmZlcikgdGhlIG91dHB1dCBpZiB2ZXJib3NlIGlzIHNldC4gTGV0CiAgICAgIyBicmlsbG9fdXBkYXRlX3BheWxvYWQgd3JpdGUgdG8gc3Rkb3V0L3N0ZGVyciBkaXJlY3RseSwgc28gaXRzIHByb2dyZXNzIGNhbgogICAgICMgYmUgbW9uaXRvcmVkLgogICAgIGlmIE9QVElPTlMudmVyYm9zZToKLSAgICAgIGNvbW1vbi5SdW5BbmRDaGVja091dHB1dChjbWQsIHN0ZG91dD1Ob25lLCBzdGRlcnI9Tm9uZSkKKyAgICAgIGNvbW1vbi5SdW5BbmRDaGVja091dHB1dChjbWQsIHN0ZG91dD1Ob25lLCBzdGRlcnI9Tm9uZSwgKiprd2FyZ3MpCiAgICAgZWxzZToKLSAgICAgIGNvbW1vbi5SdW5BbmRDaGVja091dHB1dChjbWQpCisgICAgICBjb21tb24uUnVuQW5kQ2hlY2tPdXRwdXQoY21kLCAqKmt3YXJncykKIAotICBkZWYgR2VuZXJhdGUoc2VsZiwgdGFyZ2V0X2ZpbGUsIHNvdXJjZV9maWxlPU5vbmUsIGFkZGl0aW9uYWxfYXJncz1Ob25lKToKKyAgZGVmIEdlbmVyYXRlKHNlbGYsIHRhcmdldF9maWxlLCBzb3VyY2VfZmlsZT1Ob25lLCBhZGRpdGlvbmFsX2FyZ3M9Tm9uZSwgKiprd2FyZ3MpOgogICAgICIiIkdlbmVyYXRlcyBhIHBheWxvYWQgZnJvbSB0aGUgZ2l2ZW4gdGFyZ2V0LWZpbGVzIHppcChzKS4KIAogICAgIEFyZ3M6CkBAIC04NjMsNiArODYzLDcgQEAKICAgICAgICAgICBnZW5lcmF0aW5nIGEgZnVsbCBPVEEuCiAgICAgICBhZGRpdGlvbmFsX2FyZ3M6IEEgbGlzdCBvZiBhZGRpdGlvbmFsIGFyZ3MgdGhhdCBzaG91bGQgYmUgcGFzc2VkIHRvCiAgICAgICAgICAgZGVsdGFfZ2VuZXJhdG9yIGJpbmFyeTsgb3IgTm9uZS4KKyAgICAgIGt3YXJnczogQW55IGFkZGl0aW9uYWwgYXJncyB0byBwYXNzIHRvIHN1YnByb2Nlc3MuUG9wZW4KICAgICAiIiIKICAgICBpZiBhZGRpdGlvbmFsX2FyZ3MgaXMgTm9uZToKICAgICAgIGFkZGl0aW9uYWxfYXJncyA9IFtdCkBAIC05MTgsNyArOTE5LDcgQEAKICAgICBpZiBzZWxmLmlzX3BhcnRpYWxfdXBkYXRlOgogICAgICAgY21kLmV4dGVuZChbIi0taXNfcGFydGlhbF91cGRhdGU9dHJ1ZSJdKQogICAgIGNtZC5leHRlbmQoYWRkaXRpb25hbF9hcmdzKQotICAgIHNlbGYuX1J1bihjbWQpCisgICAgc2VsZi5fUnVuKGNtZCwgKiprd2FyZ3MpCiAKICAgICBzZWxmLnBheWxvYWRfZmlsZSA9IHBheWxvYWRfZmlsZQogICAgIHNlbGYucGF5bG9hZF9wcm9wZXJ0aWVzID0gTm9uZQpkaWZmIC0tZ2l0IGEvdG9vbHMvcmVsZWFzZXRvb2xzL3NpZ25fdGFyZ2V0X2ZpbGVzX2Fwa3MucHkgYi90b29scy9yZWxlYXNldG9vbHMvc2lnbl90YXJnZXRfZmlsZXNfYXBrcy5weQppbmRleCAwMjU0ZjM3Li4yZmEzZmI1IDEwMDc1NQotLS0gYS90b29scy9yZWxlYXNldG9vbHMvc2lnbl90YXJnZXRfZmlsZXNfYXBrcy5weQorKysgYi90b29scy9yZWxlYXNldG9vbHMvc2lnbl90YXJnZXRfZmlsZXNfYXBrcy5weQpAQCAtMTg0LDYgKzE4NCw3IEBACiBpbXBvcnQgc2h1dGlsCiBpbXBvcnQgc3RhdAogaW1wb3J0IHN5cworaW1wb3J0IHNobGV4CiBpbXBvcnQgdGVtcGZpbGUKIGltcG9ydCB6aXBmaWxlCiBmcm9tIHhtbC5ldHJlZSBpbXBvcnQgRWxlbWVudFRyZWUKQEAgLTM3Nyw2ICszNzgsMzcgQEAKICAgcmV0dXJuIGtleXNfaW5mbwogCiAKK2RlZiBHZXRNaWNyb2Ryb2lkVmJtZXRhS2V5KHZpcnRfYXBleF9wYXRoLCBhdmJ0b29sX3BhdGgpOgorICAiIiJFeHRyYWN0cyB0aGUgQVZCIHB1YmxpYyBrZXkgZnJvbSBtaWNyb2Ryb2lkX3ZibWV0YS5pbWcgd2l0aGluIGEgdmlydCBhcGV4LgorCisgIEFyZ3M6CisgICAgdmlydF9hcGV4X3BhdGg6IFRoZSBwYXRoIHRvIHRoZSBjb20uYW5kcm9pZC52aXJ0LmFwZXggZmlsZS4KKyAgICBhdmJ0b29sX3BhdGg6IFRoZSBwYXRoIHRvIHRoZSBhdmJ0b29sIGV4ZWN1dGFibGUuCisKKyAgUmV0dXJuczoKKyAgICBUaGUgQVZCIHB1YmxpYyBrZXkgKGJ5dGVzKS4KKyAgIiIiCisgICMgQ3JlYXRlcyBhbiBBcGV4QXBrU2lnbmVyIHRvIGV4dHJhY3QgbWljcm9kcm9pZF92Ym1ldGEuaW1nLgorICAjIE5vIG5lZWQgdG8gc2V0IGtleV9wYXNzd29yZHMvY29kZW5hbWVfdG9fYXBpX2xldmVsX21hcCBzaW5jZQorICAjIHdlIHdvbid0IGRvIHNpZ25pbmcgaGVyZS4KKyAgYXBleF9zaWduZXIgPSBhcGV4X3V0aWxzLkFwZXhBcGtTaWduZXIoCisgICAgICB2aXJ0X2FwZXhfcGF0aCwKKyAgICAgIE5vbmUsICAjIGtleV9wYXNzd29yZHMKKyAgICAgIE5vbmUpICAjIGNvZGVuYW1lX3RvX2FwaV9sZXZlbF9tYXAKKyAgcGF5bG9hZF9kaXIgPSBhcGV4X3NpZ25lci5FeHRyYWN0QXBleFBheWxvYWQodmlydF9hcGV4X3BhdGgpCisgIG1pY3JvZHJvaWRfdmJtZXRhX2ltYWdlID0gb3MucGF0aC5qb2luKAorICAgICAgcGF5bG9hZF9kaXIsICdldGMnLCAnZnMnLCAnbWljcm9kcm9pZF92Ym1ldGEuaW1nJykKKworICAjIEV4dHJhY3RzIHRoZSBhdmIgcHVibGljIGtleSBmcm9tIG1pY3JvZHJvaWRfdmJtZXRhLmltZy4KKyAgd2l0aCB0ZW1wZmlsZS5OYW1lZFRlbXBvcmFyeUZpbGUoKSBhcyBtaWNyb2Ryb2lkX3B1YmtleToKKyAgICBjb21tb24uUnVuQW5kQ2hlY2tPdXRwdXQoWworICAgICAgICBhdmJ0b29sX3BhdGgsICdpbmZvX2ltYWdlJywKKyAgICAgICAgJy0taW1hZ2UnLCBtaWNyb2Ryb2lkX3ZibWV0YV9pbWFnZSwKKyAgICAgICAgJy0tb3V0cHV0X3B1YmtleScsIG1pY3JvZHJvaWRfcHVia2V5Lm5hbWVdKQorICAgIHdpdGggb3BlbihtaWNyb2Ryb2lkX3B1YmtleS5uYW1lLCAncmInKSBhcyBmOgorICAgICAgcmV0dXJuIGYucmVhZCgpCisKKwogZGVmIEdldEFwa0ZpbGVJbmZvKGZpbGVuYW1lLCBjb21wcmVzc2VkX2V4dGVuc2lvbiwgc2tpcHBlZF9wcmVmaXhlcyk6CiAgICIiIlJldHVybnMgdGhlIEFQSyBpbmZvIGJhc2VkIG9uIHRoZSBnaXZlbiBmaWxlbmFtZS4KIApAQCAtNTg5LDcgKzYyMSw3IEBACiAgIGlmIE9QVElPTlMucGF5bG9hZF9zaWduZXI6CiAgICAgYXJncy5leHRlbmQoWyItLXBheWxvYWRfc2lnbmVyPSIgKyBPUFRJT05TLnBheWxvYWRfc2lnbmVyXSkKICAgaWYgT1BUSU9OUy5wYXlsb2FkX3NpZ25lcl9hcmdzOgotICAgIGFyZ3MuZXh0ZW5kKFsiLS1wYXlsb2FkX3NpZ25lcl9hcmdzPSIgKyBPUFRJT05TLnBheWxvYWRfc2lnbmVyX2FyZ3NdKQorICAgIGFyZ3MuZXh0ZW5kKFsiLS1wYXlsb2FkX3NpZ25lcl9hcmdzPSIgKyBzaGxleC5qb2luKE9QVElPTlMucGF5bG9hZF9zaWduZXJfYXJncyldKQogICBpZiBPUFRJT05TLnNlYXJjaF9wYXRoOgogICAgIGFyZ3MuZXh0ZW5kKFsiLS1zZWFyY2hfcGF0aCIsIE9QVElPTlMuc2VhcmNoX3BhdGhdKQogICBpZiBPUFRJT05TLnBheWxvYWRfc2lnbmVyX21heGltdW1fc2lnbmF0dXJlX3NpemU6CkBAIC04NjEsMjEgKzg5MywzNCBAQAogCiAgICAgIyBVcGRhdGVzIHB2bWZ3IGVtYmVkZGVkIHB1YmxpYyBrZXkgd2l0aCB0aGUgdmlydCBBUEVYIHBheWxvYWQga2V5LgogICAgIGVsaWYgZmlsZW5hbWUgPT0gIlBSRUJVSUxUX0lNQUdFUy9wdm1mdy5pbWciOgotICAgICAgIyBGaW5kIHRoZSBuYW1lIG9mIHRoZSB2aXJ0IEFQRVggaW4gdGhlIHRhcmdldCBmaWxlcy4KKyAgICAgICMgRmluZCB0aGUgcGF0aCBvZiB0aGUgdmlydCBBUEVYIGluIHRoZSB0YXJnZXQgZmlsZXMuCiAgICAgICBuYW1lbGlzdCA9IGlucHV0X3RmX3ppcC5uYW1lbGlzdCgpCi0gICAgICBhcGV4X2dlbiA9IChHZXRBcGV4RmlsZW5hbWUoZikgZm9yIGYgaW4gbmFtZWxpc3QgaWYgSXNBcGV4RmlsZShmKSkKLSAgICAgIHZpcnRfYXBleF9yZSA9IHJlLmNvbXBpbGUoIl5jb21cLihbXlwuXStcLik/YW5kcm9pZFwudmlydFwuYXBleCQiKQotICAgICAgdmlydF9hcGV4ID0gbmV4dCgoYSBmb3IgYSBpbiBhcGV4X2dlbiBpZiB2aXJ0X2FwZXhfcmUubWF0Y2goYSkpLCBOb25lKQotICAgICAgaWYgbm90IHZpcnRfYXBleDoKKyAgICAgIGFwZXhfZ2VuID0gKGYgZm9yIGYgaW4gbmFtZWxpc3QgaWYgSXNBcGV4RmlsZShmKSkKKyAgICAgIHZpcnRfYXBleF9yZSA9IHJlLmNvbXBpbGUoIl4uKmNvbVwuKFteXC5dK1wuKT9hbmRyb2lkXC52aXJ0XC5hcGV4JCIpCisgICAgICB2aXJ0X2FwZXhfcGF0aCA9IG5leHQoCisgICAgICAgIChhIGZvciBhIGluIGFwZXhfZ2VuIGlmIHZpcnRfYXBleF9yZS5tYXRjaChhKSksIE5vbmUpCisgICAgICBpZiBub3QgdmlydF9hcGV4X3BhdGg6CiAgICAgICAgIHByaW50KCJSZW1vdmluZyAlcyBmcm9tIHJhbWRpc2s6IHZpcnQgQVBFWCBub3QgZm91bmQiICUgZmlsZW5hbWUpCiAgICAgICBlbHNlOgotICAgICAgICBwcmludCgiUmVwbGFjaW5nICVzIGVtYmVkZGVkIGtleSB3aXRoICVzIGtleSIgJSAoZmlsZW5hbWUsIHZpcnRfYXBleCkpCisgICAgICAgIHByaW50KCJSZXBsYWNpbmcgJXMgZW1iZWRkZWQga2V5IHdpdGggJXMga2V5IiAlIChmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpcnRfYXBleF9wYXRoKSkKICAgICAgICAgIyBHZXQgdGhlIGN1cnJlbnQgYW5kIG5ldyBlbWJlZGRlZCBrZXlzLgorICAgICAgICB2aXJ0X2FwZXggPSBHZXRBcGV4RmlsZW5hbWUodmlydF9hcGV4X3BhdGgpCiAgICAgICAgIHBheWxvYWRfa2V5LCBjb250YWluZXJfa2V5LCBzaWduX3Rvb2wgPSBhcGV4X2tleXNbdmlydF9hcGV4XQotICAgICAgICBuZXdfcHVia2V5X3BhdGggPSBjb21tb24uRXh0cmFjdEF2YlB1YmxpY0tleSgKLSAgICAgICAgICAgIG1pc2NfaW5mb1snYXZiX2F2YnRvb2wnXSwgcGF5bG9hZF9rZXkpCi0gICAgICAgIHdpdGggb3BlbihuZXdfcHVia2V5X3BhdGgsICdyYicpIGFzIGY6Ci0gICAgICAgICAgbmV3X3B1YmtleSA9IGYucmVhZCgpCisKKyAgICAgICAgIyBiLzM4NDgxMzE5OTogaGFuZGxlcyB0aGUgcHJlLXNpZ25lZCBjb20uYW5kcm9pZC52aXJ0LmFwZXggaW4gR1NJLgorICAgICAgICBpZiBwYXlsb2FkX2tleSA9PSAnUFJFU0lHTkVEJzoKKyAgICAgICAgICB3aXRoIHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZSgpIGFzIHZpcnRfYXBleF90ZW1wX2ZpbGU6CisgICAgICAgICAgICB2aXJ0X2FwZXhfdGVtcF9maWxlLndyaXRlKGlucHV0X3RmX3ppcC5yZWFkKHZpcnRfYXBleF9wYXRoKSkKKyAgICAgICAgICAgIHZpcnRfYXBleF90ZW1wX2ZpbGUuZmx1c2goKQorICAgICAgICAgICAgbmV3X3B1YmtleSA9IEdldE1pY3JvZHJvaWRWYm1ldGFLZXkodmlydF9hcGV4X3RlbXBfZmlsZS5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzY19pbmZvWydhdmJfYXZidG9vbCddKQorICAgICAgICBlbHNlOgorICAgICAgICAgIG5ld19wdWJrZXlfcGF0aCA9IGNvbW1vbi5FeHRyYWN0QXZiUHVibGljS2V5KAorICAgICAgICAgICAgICBtaXNjX2luZm9bJ2F2Yl9hdmJ0b29sJ10sIHBheWxvYWRfa2V5KQorICAgICAgICAgIHdpdGggb3BlbihuZXdfcHVia2V5X3BhdGgsICdyYicpIGFzIGY6CisgICAgICAgICAgICBuZXdfcHVia2V5ID0gZi5yZWFkKCkKKwogICAgICAgICBwdWJrZXlfaW5mbyA9IGNvcHkuY29weSgKICAgICAgICAgICAgIGlucHV0X3RmX3ppcC5nZXRpbmZvKCJQUkVCVUlMVF9JTUFHRVMvcHZtZndfZW1iZWRkZWQuYXZicHVia2V5IikpCiAgICAgICAgIG9sZF9wdWJrZXkgPSBpbnB1dF90Zl96aXAucmVhZChwdWJrZXlfaW5mby5maWxlbmFtZSkKZGlmZiAtLWdpdCBhL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X2NvbW1vbi5weSBiL3Rvb2xzL3JlbGVhc2V0b29scy90ZXN0X2NvbW1vbi5weQppbmRleCA4OTkzM2EwLi42MmY0MjVhIDEwMDY0NAotLS0gYS90b29scy9yZWxlYXNldG9vbHMvdGVzdF9jb21tb24ucHkKKysrIGIvdG9vbHMvcmVsZWFzZXRvb2xzL3Rlc3RfY29tbW9uLnB5CkBAIC0yMTU3LDMgKzIxNTcsMTEgQEAKICAgICAgICAgJ2dvb2dsZS9jb3JhbC9jb3JhbDoxMC9SUDFBLjIwMDMyNS4wMDEvNjMzNzY3Njp1c2VyL2Rldi1rZXlzJywKICAgICAgICAgJ3JvLnByb2R1Y3Qub2RtLmRldmljZSc6ICdjb3JhbCcsCiAgICAgfSwgY29waWVkX3Byb3BzLmJ1aWxkX3Byb3BzKQorCisKK2NsYXNzIERldmljZVNwZWNpZmljUGFyYW1zVGVzdCh0ZXN0X3V0aWxzLlJlbGVhc2VUb29sc1Rlc3RDYXNlKToKKworICBkZWYgdGVzdF9taXNzaW5nU291cmNlKHNlbGYpOgorICAgIGNvbW1vbi5PUFRJT05TLmRldmljZV9zcGVjaWZpYyA9ICcvZG9lc19ub3RfZXhpc3QnCisgICAgZHMgPSBEZXZpY2VTcGVjaWZpY1BhcmFtcygpCisgICAgc2VsZi5hc3NlcnRJc05vbmUoZHMubW9kdWxlKQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2JvbS9BbmRyb2lkLmJwIGIvdG9vbHMvc2JvbS9BbmRyb2lkLmJwCmluZGV4IDY5MDFiMDYuLjdlMjg0MGYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3Nib20vQW5kcm9pZC5icAorKysgYi90b29scy9zYm9tL0FuZHJvaWQuYnAKQEAgLTMzLDYgKzMzLDEzIEBACiAgICAgXSwKIH0KIAorcHl0aG9uX2xpYnJhcnlfaG9zdCB7CisgICAgbmFtZTogImNvbXBsaWFuY2VfbWV0YWRhdGEiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImNvbXBsaWFuY2VfbWV0YWRhdGEucHkiLAorICAgIF0sCit9CisKIHB5dGhvbl9iaW5hcnlfaG9zdCB7CiAgICAgbmFtZTogImdlbl9zYm9tIiwKICAgICBzcmNzOiBbCkBAIC00NCw2ICs1MSw3IEBACiAgICAgICAgIH0sCiAgICAgfSwKICAgICBsaWJzOiBbCisgICAgICAgICJjb21wbGlhbmNlX21ldGFkYXRhIiwKICAgICAgICAgIm1ldGFkYXRhX2ZpbGVfcHJvdG9fcHkiLAogICAgICAgICAibGlicHJvdG9idWYtcHl0aG9uIiwKICAgICAgICAgInNib21fbGliIiwKQEAgLTEwOSwzICsxMTcsMTkgQEAKICAgICAgICAgInNib21fbGliIiwKICAgICBdLAogfQorCitweXRob25fYmluYXJ5X2hvc3QgeworICAgIG5hbWU6ICJnZW5fbm90aWNlX3htbCIsCisgICAgc3JjczogWworICAgICAgICAiZ2VuX25vdGljZV94bWwucHkiLAorICAgIF0sCisgICAgdmVyc2lvbjogeworICAgICAgICBweTM6IHsKKyAgICAgICAgICAgIGVtYmVkZGVkX2xhdW5jaGVyOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCisgICAgbGliczogWworICAgICAgICAiY29tcGxpYW5jZV9tZXRhZGF0YSIsCisgICAgICAgICJtZXRhZGF0YV9maWxlX3Byb3RvX3B5IiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2JvbS9jb21wbGlhbmNlX21ldGFkYXRhLnB5IGIvdG9vbHMvc2JvbS9jb21wbGlhbmNlX21ldGFkYXRhLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMmMxMTAKLS0tIC9kZXYvbnVsbAorKysgYi90b29scy9zYm9tL2NvbXBsaWFuY2VfbWV0YWRhdGEucHkKQEAgLTAsMCArMSwyMTkgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbjMKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDI0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ltcG9ydCBzcWxpdGUzCisKK2NsYXNzIE1ldGFkYXRhRGI6CisgIGRlZiBfX2luaXRfXyhzZWxmLCBkYik6CisgICAgc2VsZi5jb25uID0gc3FsaXRlMy5jb25uZWN0KCc6bWVtb3J5OicpCisgICAgc2VsZi5jb25uLnJvd19mYWN0b3J5ID0gc3FsaXRlMy5Sb3cKKyAgICB3aXRoIHNxbGl0ZTMuY29ubmVjdChkYikgYXMgYzoKKyAgICAgIGMuYmFja3VwKHNlbGYuY29ubikKKyAgICBzZWxmLnJlb3JnKCkKKworICBkZWYgcmVvcmcoc2VsZik6CisgICAgIyBwYWNrYWdlX2xpY2Vuc2UgdGFibGUKKyAgICBzZWxmLmNvbm4uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIHBhY2thZ2VfbGljZW5zZSBhcyAiCisgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdCBuYW1lIGFzIHBhY2thZ2UsIHBrZ19kZWZhdWx0X2FwcGxpY2FibGVfbGljZW5zZXMgYXMgbGljZW5zZSAiCisgICAgICAgICAgICAgICAgICAgICAgImZyb20gbW9kdWxlcyAiCisgICAgICAgICAgICAgICAgICAgICAgIndoZXJlIG1vZHVsZV90eXBlID0gJ3BhY2thZ2UnICIpCisgICAgY3Vyc29yID0gc2VsZi5jb25uLmV4ZWN1dGUoInNlbGVjdCBwYWNrYWdlLGxpY2Vuc2UgZnJvbSBwYWNrYWdlX2xpY2Vuc2Ugd2hlcmUgbGljZW5zZSBsaWtlICclICUnIikKKyAgICBtdWx0aV9saWNlbnNlc19wYWNrYWdlcyA9IGN1cnNvci5mZXRjaGFsbCgpCisgICAgY3Vyc29yLmNsb3NlKCkKKyAgICByb3dzID0gW10KKyAgICBmb3IgcCBpbiBtdWx0aV9saWNlbnNlc19wYWNrYWdlczoKKyAgICAgIGxpY2Vuc2VzID0gcFsnbGljZW5zZSddLnN0cmlwKCkuc3BsaXQoJyAnKQorICAgICAgZm9yIGxpYyBpbiBsaWNlbnNlczoKKyAgICAgICAgcm93cy5hcHBlbmQoKHBbJ3BhY2thZ2UnXSwgbGljKSkKKyAgICBzZWxmLmNvbm4uZXhlY3V0ZW1hbnkoJ2luc2VydCBpbnRvIHBhY2thZ2VfbGljZW5zZSB2YWx1ZXMgKD8sID8pJywgcm93cykKKyAgICBzZWxmLmNvbm4uY29tbWl0KCkKKworICAgIHNlbGYuY29ubi5leGVjdXRlKCJkZWxldGUgZnJvbSBwYWNrYWdlX2xpY2Vuc2Ugd2hlcmUgbGljZW5zZSBsaWtlICclICUnIikKKyAgICBzZWxmLmNvbm4uY29tbWl0KCkKKworICAgICMgbW9kdWxlX2xpY2Vuc2UgdGFibGUKKyAgICBzZWxmLmNvbm4uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIG1vZHVsZV9saWNlbnNlIGFzICIKKyAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0IGRpc3RpbmN0IG5hbWUgYXMgbW9kdWxlLCBwYWNrYWdlLCBsaWNlbnNlcyBhcyBsaWNlbnNlICIKKyAgICAgICAgICAgICAgICAgICAgICAiZnJvbSBtb2R1bGVzICIKKyAgICAgICAgICAgICAgICAgICAgICAid2hlcmUgbGljZW5zZXMgIT0gJycgIikKKyAgICBjdXJzb3IgPSBzZWxmLmNvbm4uZXhlY3V0ZSgic2VsZWN0IG1vZHVsZSxwYWNrYWdlLGxpY2Vuc2UgZnJvbSBtb2R1bGVfbGljZW5zZSB3aGVyZSBsaWNlbnNlIGxpa2UgJyUgJSciKQorICAgIG11bHRpX2xpY2Vuc2VzX21vZHVsZXMgPSBjdXJzb3IuZmV0Y2hhbGwoKQorICAgIGN1cnNvci5jbG9zZSgpCisgICAgcm93cyA9IFtdCisgICAgZm9yIG0gaW4gbXVsdGlfbGljZW5zZXNfbW9kdWxlczoKKyAgICAgIGxpY2Vuc2VzID0gbVsnbGljZW5zZSddLnN0cmlwKCkuc3BsaXQoJyAnKQorICAgICAgZm9yIGxpYyBpbiBsaWNlbnNlczoKKyAgICAgICAgcm93cy5hcHBlbmQoKG1bJ21vZHVsZSddLCBtWydwYWNrYWdlJ10sbGljKSkKKyAgICBzZWxmLmNvbm4uZXhlY3V0ZW1hbnkoJ2luc2VydCBpbnRvIG1vZHVsZV9saWNlbnNlIHZhbHVlcyAoPywgPywgPyknLCByb3dzKQorICAgIHNlbGYuY29ubi5jb21taXQoKQorCisgICAgc2VsZi5jb25uLmV4ZWN1dGUoImRlbGV0ZSBmcm9tIG1vZHVsZV9saWNlbnNlIHdoZXJlIGxpY2Vuc2UgbGlrZSAnJSAlJyIpCisgICAgc2VsZi5jb25uLmNvbW1pdCgpCisKKyAgICAjIG1vZHVsZV9pbnN0YWxsZWRfZmlsZSB0YWJsZQorICAgIHNlbGYuY29ubi5leGVjdXRlKCJjcmVhdGUgdGFibGUgbW9kdWxlX2luc3RhbGxlZF9maWxlIGFzICIKKyAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0IGlkIGFzIG1vZHVsZV9pZCwgbmFtZSBhcyBtb2R1bGVfbmFtZSwgcGFja2FnZSwgaW5zdGFsbGVkX2ZpbGVzIGFzIGluc3RhbGxlZF9maWxlICIKKyAgICAgICAgICAgICAgICAgICAgICAiZnJvbSBtb2R1bGVzICIKKyAgICAgICAgICAgICAgICAgICAgICAid2hlcmUgaW5zdGFsbGVkX2ZpbGVzICE9ICcnICIpCisgICAgY3Vyc29yID0gc2VsZi5jb25uLmV4ZWN1dGUoInNlbGVjdCBtb2R1bGVfaWQsIG1vZHVsZV9uYW1lLCBwYWNrYWdlLCBpbnN0YWxsZWRfZmlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZyb20gbW9kdWxlX2luc3RhbGxlZF9maWxlIHdoZXJlIGluc3RhbGxlZF9maWxlIGxpa2UgJyUgJSciKQorICAgIG11bHRpX2luc3RhbGxlZF9maWxlX21vZHVsZXMgPSBjdXJzb3IuZmV0Y2hhbGwoKQorICAgIGN1cnNvci5jbG9zZSgpCisgICAgcm93cyA9IFtdCisgICAgZm9yIG0gaW4gbXVsdGlfaW5zdGFsbGVkX2ZpbGVfbW9kdWxlczoKKyAgICAgIGluc3RhbGxlZF9maWxlcyA9IG1bJ2luc3RhbGxlZF9maWxlJ10uc3RyaXAoKS5zcGxpdCgnICcpCisgICAgICBmb3IgZiBpbiBpbnN0YWxsZWRfZmlsZXM6CisgICAgICAgIHJvd3MuYXBwZW5kKChtWydtb2R1bGVfaWQnXSwgbVsnbW9kdWxlX25hbWUnXSwgbVsncGFja2FnZSddLCBmKSkKKyAgICBzZWxmLmNvbm4uZXhlY3V0ZW1hbnkoJ2luc2VydCBpbnRvIG1vZHVsZV9pbnN0YWxsZWRfZmlsZSB2YWx1ZXMgKD8sID8sID8sID8pJywgcm93cykKKyAgICBzZWxmLmNvbm4uY29tbWl0KCkKKworICAgIHNlbGYuY29ubi5leGVjdXRlKCJkZWxldGUgZnJvbSBtb2R1bGVfaW5zdGFsbGVkX2ZpbGUgd2hlcmUgaW5zdGFsbGVkX2ZpbGUgbGlrZSAnJSAlJyIpCisgICAgc2VsZi5jb25uLmNvbW1pdCgpCisKKyAgICAjIG1vZHVsZV9idWlsdF9maWxlIHRhYmxlCisgICAgc2VsZi5jb25uLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBtb2R1bGVfYnVpbHRfZmlsZSBhcyAiCisgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdCBpZCBhcyBtb2R1bGVfaWQsIG5hbWUgYXMgbW9kdWxlX25hbWUsIHBhY2thZ2UsIGJ1aWx0X2ZpbGVzIGFzIGJ1aWx0X2ZpbGUgIgorICAgICAgICAgICAgICAgICAgICAgICJmcm9tIG1vZHVsZXMgIgorICAgICAgICAgICAgICAgICAgICAgICJ3aGVyZSBidWlsdF9maWxlcyAhPSAnJyAiKQorICAgIGN1cnNvciA9IHNlbGYuY29ubi5leGVjdXRlKCJzZWxlY3QgbW9kdWxlX2lkLCBtb2R1bGVfbmFtZSwgcGFja2FnZSwgYnVpbHRfZmlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZyb20gbW9kdWxlX2J1aWx0X2ZpbGUgd2hlcmUgYnVpbHRfZmlsZSBsaWtlICclICUnIikKKyAgICBtdWx0aV9idWlsdF9maWxlX21vZHVsZXMgPSBjdXJzb3IuZmV0Y2hhbGwoKQorICAgIGN1cnNvci5jbG9zZSgpCisgICAgcm93cyA9IFtdCisgICAgZm9yIG0gaW4gbXVsdGlfYnVpbHRfZmlsZV9tb2R1bGVzOgorICAgICAgYnVpbHRfZmlsZXMgPSBtWydidWlsdF9maWxlJ10uc3RyaXAoKS5zcGxpdCgnICcpCisgICAgICBmb3IgZiBpbiBidWlsdF9maWxlczoKKyAgICAgICAgcm93cy5hcHBlbmQoKG1bJ21vZHVsZV9pZCddLCBtWydtb2R1bGVfbmFtZSddLCBtWydwYWNrYWdlJ10sIGYpKQorICAgIHNlbGYuY29ubi5leGVjdXRlbWFueSgnaW5zZXJ0IGludG8gbW9kdWxlX2J1aWx0X2ZpbGUgdmFsdWVzICg/LCA/LCA/LCA/KScsIHJvd3MpCisgICAgc2VsZi5jb25uLmNvbW1pdCgpCisKKyAgICBzZWxmLmNvbm4uZXhlY3V0ZSgiZGVsZXRlIGZyb20gbW9kdWxlX2J1aWx0X2ZpbGUgd2hlcmUgYnVpbHRfZmlsZSBsaWtlICclICUnIikKKyAgICBzZWxmLmNvbm4uY29tbWl0KCkKKworCisgICAgIyBJbmRleGVzCisgICAgc2VsZi5jb25uLmV4ZWN1dGUoJ2NyZWF0ZSBpbmRleCBpZHhfbW9kdWxlc19pZCBvbiBtb2R1bGVzIChpZCknKQorICAgIHNlbGYuY29ubi5leGVjdXRlKCdjcmVhdGUgaW5kZXggaWR4X21vZHVsZXNfbmFtZSBvbiBtb2R1bGVzIChuYW1lKScpCisgICAgc2VsZi5jb25uLmV4ZWN1dGUoJ2NyZWF0ZSBpbmRleCBpZHhfcGFja2FnZV9saWNuZXNlX3BhY2thZ2Ugb24gcGFja2FnZV9saWNlbnNlIChwYWNrYWdlKScpCisgICAgc2VsZi5jb25uLmV4ZWN1dGUoJ2NyZWF0ZSBpbmRleCBpZHhfcGFja2FnZV9saWNuZXNlX2xpY2Vuc2Ugb24gcGFja2FnZV9saWNlbnNlIChsaWNlbnNlKScpCisgICAgc2VsZi5jb25uLmV4ZWN1dGUoJ2NyZWF0ZSBpbmRleCBpZHhfbW9kdWxlX2xpY25lc2VfbW9kdWxlIG9uIG1vZHVsZV9saWNlbnNlIChtb2R1bGUpJykKKyAgICBzZWxmLmNvbm4uZXhlY3V0ZSgnY3JlYXRlIGluZGV4IGlkeF9tb2R1bGVfbGljbmVzZV9saWNlbnNlIG9uIG1vZHVsZV9saWNlbnNlIChsaWNlbnNlKScpCisgICAgc2VsZi5jb25uLmV4ZWN1dGUoJ2NyZWF0ZSBpbmRleCBpZHhfbW9kdWxlX2luc3RhbGxlZF9maWxlX21vZHVsZV9pZCBvbiBtb2R1bGVfaW5zdGFsbGVkX2ZpbGUgKG1vZHVsZV9pZCknKQorICAgIHNlbGYuY29ubi5leGVjdXRlKCdjcmVhdGUgaW5kZXggaWR4X21vZHVsZV9pbnN0YWxsZWRfZmlsZV9pbnN0YWxsZWRfZmlsZSBvbiBtb2R1bGVfaW5zdGFsbGVkX2ZpbGUgKGluc3RhbGxlZF9maWxlKScpCisgICAgc2VsZi5jb25uLmV4ZWN1dGUoJ2NyZWF0ZSBpbmRleCBpZHhfbW9kdWxlX2J1aWx0X2ZpbGVfbW9kdWxlX2lkIG9uIG1vZHVsZV9idWlsdF9maWxlIChtb2R1bGVfaWQpJykKKyAgICBzZWxmLmNvbm4uZXhlY3V0ZSgnY3JlYXRlIGluZGV4IGlkeF9tb2R1bGVfYnVpbHRfZmlsZV9idWlsdF9maWxlIG9uIG1vZHVsZV9idWlsdF9maWxlIChidWlsdF9maWxlKScpCisgICAgc2VsZi5jb25uLmNvbW1pdCgpCisKKyAgZGVmIGR1bXBfZGVidWdfZGIoc2VsZiwgZGVidWdfZGIpOgorICAgIHdpdGggc3FsaXRlMy5jb25uZWN0KGRlYnVnX2RiKSBhcyBjOgorICAgICAgc2VsZi5jb25uLmJhY2t1cChjKQorCisgIGRlZiBnZXRfaW5zdGFsbGVkX2ZpbGVzKHNlbGYpOgorICAgICMgR2V0IGFsbCByZWNvcmRzIGZyb20gdGFibGUgbWFrZV9tZXRhZGF0YSwgd2hpY2ggY29udGFpbnMgYWxsIGluc3RhbGxlZCBmaWxlcyBhbmQgY29ycmVzcG9uZGluZyBtYWtlIG1vZHVsZXMnIG1ldGFkYXRhCisgICAgY3Vyc29yID0gc2VsZi5jb25uLmV4ZWN1dGUoJ3NlbGVjdCBpbnN0YWxsZWRfZmlsZSwgbW9kdWxlX3BhdGgsIGlzX3ByZWJ1aWx0X21ha2VfbW9kdWxlLCBwcm9kdWN0X2NvcHlfZmlsZXMsIGtlcm5lbF9tb2R1bGVfY29weV9maWxlcywgaXNfcGxhdGZvcm1fZ2VuZXJhdGVkLCBsaWNlbnNlX3RleHQgZnJvbSBtYWtlX21ldGFkYXRhJykKKyAgICByb3dzID0gY3Vyc29yLmZldGNoYWxsKCkKKyAgICBjdXJzb3IuY2xvc2UoKQorICAgIGluc3RhbGxlZF9maWxlc19tZXRhZGF0YSA9IFtdCisgICAgZm9yIHJvdyBpbiByb3dzOgorICAgICAgbWV0YWRhdGEgPSBkaWN0KHppcChyb3cua2V5cygpLCByb3cpKQorICAgICAgaW5zdGFsbGVkX2ZpbGVzX21ldGFkYXRhLmFwcGVuZChtZXRhZGF0YSkKKyAgICByZXR1cm4gaW5zdGFsbGVkX2ZpbGVzX21ldGFkYXRhCisKKyAgZGVmIGdldF9pbnN0YWxsZWRfZmlsZV9pbl9kaXIoc2VsZiwgZGlyKToKKyAgICBkaXIgPSBkaXIucmVtb3Zlc3VmZml4KCcvJykKKyAgICBjdXJzb3IgPSBzZWxmLmNvbm4uZXhlY3V0ZSgKKyAgICAgICAgJ3NlbGVjdCBpbnN0YWxsZWRfZmlsZSwgbW9kdWxlX3BhdGgsIGlzX3ByZWJ1aWx0X21ha2VfbW9kdWxlLCBwcm9kdWN0X2NvcHlfZmlsZXMsICcKKyAgICAgICAgJyAgICAgICBrZXJuZWxfbW9kdWxlX2NvcHlfZmlsZXMsIGlzX3BsYXRmb3JtX2dlbmVyYXRlZCwgbGljZW5zZV90ZXh0ICcKKyAgICAgICAgJ2Zyb20gbWFrZV9tZXRhZGF0YSAnCisgICAgICAgICd3aGVyZSBpbnN0YWxsZWRfZmlsZSBsaWtlID8nLCAoZGlyICsgJy8lJywpKQorICAgIHJvd3MgPSBjdXJzb3IuZmV0Y2hhbGwoKQorICAgIGN1cnNvci5jbG9zZSgpCisgICAgaW5zdGFsbGVkX2ZpbGVzX21ldGFkYXRhID0gW10KKyAgICBmb3Igcm93IGluIHJvd3M6CisgICAgICBtZXRhZGF0YSA9IGRpY3QoemlwKHJvdy5rZXlzKCksIHJvdykpCisgICAgICBpbnN0YWxsZWRfZmlsZXNfbWV0YWRhdGEuYXBwZW5kKG1ldGFkYXRhKQorICAgIHJldHVybiBpbnN0YWxsZWRfZmlsZXNfbWV0YWRhdGEKKworICBkZWYgZ2V0X3Nvb25nX21vZHVsZXMoc2VsZik6CisgICAgIyBHZXQgYWxsIHJlY29yZHMgZnJvbSB0YWJsZSBtb2R1bGVzLCB3aGljaCBjb250YWlucyBtZXRhZGF0YSBvZiBhbGwgc29vbmcgbW9kdWxlcworICAgIGN1cnNvciA9IHNlbGYuY29ubi5leGVjdXRlKCdzZWxlY3QgbmFtZSwgcGFja2FnZSwgcGFja2FnZSBhcyBtb2R1bGVfcGF0aCwgbW9kdWxlX3R5cGUgYXMgc29vbmdfbW9kdWxlX3R5cGUsIGJ1aWx0X2ZpbGVzLCBpbnN0YWxsZWRfZmlsZXMsIHN0YXRpY19kZXBfZmlsZXMsIHdob2xlX3N0YXRpY19kZXBfZmlsZXMgZnJvbSBtb2R1bGVzJykKKyAgICByb3dzID0gY3Vyc29yLmZldGNoYWxsKCkKKyAgICBjdXJzb3IuY2xvc2UoKQorICAgIHNvb25nX21vZHVsZXMgPSBbXQorICAgIGZvciByb3cgaW4gcm93czoKKyAgICAgIHNvb25nX21vZHVsZSA9IGRpY3QoemlwKHJvdy5rZXlzKCksIHJvdykpCisgICAgICBzb29uZ19tb2R1bGVzLmFwcGVuZChzb29uZ19tb2R1bGUpCisgICAgcmV0dXJuIHNvb25nX21vZHVsZXMKKworICBkZWYgZ2V0X3BhY2thZ2VfbGljZW5zZXMoc2VsZiwgcGFja2FnZSk6CisgICAgY3Vyc29yID0gc2VsZi5jb25uLmV4ZWN1dGUoJ3NlbGVjdCBtLm5hbWUsIG0ucGFja2FnZSwgbS5saWNfbGljZW5zZV90ZXh0IGFzIGxpY2Vuc2VfdGV4dCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zyb20gcGFja2FnZV9saWNlbnNlIHBsIGpvaW4gbW9kdWxlcyBtIG9uIHBsLmxpY2Vuc2UgPSBtLm5hbWUgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aGVyZSBwbC5wYWNrYWdlID0gPycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCcvLycgKyBwYWNrYWdlLCkpCisgICAgcm93cyA9IGN1cnNvci5mZXRjaGFsbCgpCisgICAgbGljZW5zZXMgPSB7fQorICAgIGZvciByIGluIHJvd3M6CisgICAgICBsaWNlbnNlc1tyWyduYW1lJ11dID0gclsnbGljZW5zZV90ZXh0J10KKyAgICByZXR1cm4gbGljZW5zZXMKKworICBkZWYgZ2V0X21vZHVsZV9saWNlbnNlcyhzZWxmLCBtb2R1bGVfbmFtZSwgcGFja2FnZSk6CisgICAgbGljZW5zZXMgPSB7fQorICAgICMgSWYgcHJvcGVydHkgImxpY2Vuc2VzIiBpcyBkZWZpbmVkIG9uIG1vZHVsZQorICAgIGN1cnNvciA9IHNlbGYuY29ubi5leGVjdXRlKCdzZWxlY3QgbS5uYW1lLCBtLnBhY2thZ2UsIG0ubGljX2xpY2Vuc2VfdGV4dCBhcyBsaWNlbnNlX3RleHQgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcm9tIG1vZHVsZV9saWNlbnNlIG1sIGpvaW4gbW9kdWxlcyBtIG9uIG1sLmxpY2Vuc2UgPSBtLm5hbWUgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aGVyZSBtbC5tb2R1bGUgPSA/IGFuZCBtbC5wYWNrYWdlID0gPycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vZHVsZV9uYW1lLCBwYWNrYWdlKSkKKyAgICByb3dzID0gY3Vyc29yLmZldGNoYWxsKCkKKyAgICBmb3IgciBpbiByb3dzOgorICAgICAgbGljZW5zZXNbclsnbmFtZSddXSA9IHJbJ2xpY2Vuc2VfdGV4dCddCisgICAgaWYgbGVuKGxpY2Vuc2VzKSA+IDA6CisgICAgICByZXR1cm4gbGljZW5zZXMKKworICAgICMgVXNlIGRlZmF1bHQgcGFja2FnZSBsaWNlbnNlCisgICAgY3Vyc29yID0gc2VsZi5jb25uLmV4ZWN1dGUoJ3NlbGVjdCBtLm5hbWUsIG0ucGFja2FnZSwgbS5saWNfbGljZW5zZV90ZXh0IGFzIGxpY2Vuc2VfdGV4dCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zyb20gcGFja2FnZV9saWNlbnNlIHBsIGpvaW4gbW9kdWxlcyBtIG9uIHBsLmxpY2Vuc2UgPSBtLm5hbWUgJworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aGVyZSBwbC5wYWNrYWdlID0gPycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCcvLycgKyBwYWNrYWdlLCkpCisgICAgcm93cyA9IGN1cnNvci5mZXRjaGFsbCgpCisgICAgZm9yIHIgaW4gcm93czoKKyAgICAgIGxpY2Vuc2VzW3JbJ25hbWUnXV0gPSByWydsaWNlbnNlX3RleHQnXQorICAgIHJldHVybiBsaWNlbnNlcworCisgIGRlZiBnZXRfc29vbmdfbW9kdWxlX29mX2luc3RhbGxlZF9maWxlKHNlbGYsIGluc3RhbGxlZF9maWxlKToKKyAgICBjdXJzb3IgPSBzZWxmLmNvbm4uZXhlY3V0ZSgnc2VsZWN0IG5hbWUsIG0ucGFja2FnZSwgbS5wYWNrYWdlIGFzIG1vZHVsZV9wYXRoLCBtb2R1bGVfdHlwZSBhcyBzb29uZ19tb2R1bGVfdHlwZSwgYnVpbHRfZmlsZXMsIGluc3RhbGxlZF9maWxlcywgc3RhdGljX2RlcF9maWxlcywgd2hvbGVfc3RhdGljX2RlcF9maWxlcyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zyb20gbW9kdWxlcyBtIGpvaW4gbW9kdWxlX2luc3RhbGxlZF9maWxlIG1pZiBvbiBtLmlkID0gbWlmLm1vZHVsZV9pZCAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3doZXJlIG1pZi5pbnN0YWxsZWRfZmlsZSA9ID8nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnN0YWxsZWRfZmlsZSwpKQorICAgIHJvd3MgPSBjdXJzb3IuZmV0Y2hhbGwoKQorICAgIGN1cnNvci5jbG9zZSgpCisgICAgaWYgcm93czoKKyAgICAgIHNvb25nX21vZHVsZSA9IGRpY3QoemlwKHJvd3NbMF0ua2V5cygpLCByb3dzWzBdKSkKKyAgICAgIHJldHVybiBzb29uZ19tb2R1bGUKKworICAgIHJldHVybiBOb25lCisKKyAgZGVmIGdldF9zb29uZ19tb2R1bGVfb2ZfYnVpbHRfZmlsZShzZWxmLCBidWlsdF9maWxlKToKKyAgICBjdXJzb3IgPSBzZWxmLmNvbm4uZXhlY3V0ZSgnc2VsZWN0IG5hbWUsIG0ucGFja2FnZSwgbS5wYWNrYWdlIGFzIG1vZHVsZV9wYXRoLCBtb2R1bGVfdHlwZSBhcyBzb29uZ19tb2R1bGVfdHlwZSwgYnVpbHRfZmlsZXMsIGluc3RhbGxlZF9maWxlcywgc3RhdGljX2RlcF9maWxlcywgd2hvbGVfc3RhdGljX2RlcF9maWxlcyAnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zyb20gbW9kdWxlcyBtIGpvaW4gbW9kdWxlX2J1aWx0X2ZpbGUgbWJmIG9uIG0uaWQgPSBtYmYubW9kdWxlX2lkICcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2hlcmUgbWJmLmJ1aWx0X2ZpbGUgPSA/JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnVpbHRfZmlsZSwpKQorICAgIHJvd3MgPSBjdXJzb3IuZmV0Y2hhbGwoKQorICAgIGN1cnNvci5jbG9zZSgpCisgICAgaWYgcm93czoKKyAgICAgIHNvb25nX21vZHVsZSA9IGRpY3QoemlwKHJvd3NbMF0ua2V5cygpLCByb3dzWzBdKSkKKyAgICAgIHJldHVybiBzb29uZ19tb2R1bGUKKworICAgIHJldHVybiBOb25lClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2JvbS9nZW5fbm90aWNlX3htbC5weSBiL3Rvb2xzL3Nib20vZ2VuX25vdGljZV94bWwucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQ3OGIxZgotLS0gL2Rldi9udWxsCisrKyBiL3Rvb2xzL3Nib20vZ2VuX25vdGljZV94bWwucHkKQEAgLTAsMCArMSwyMjQgQEAKKyMgIS91c3IvYmluL2VudiBweXRob24zCisjCisjIENvcHlyaWdodCAoQykgMjAyNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisiIiIKK0dlbmVyYXRlIE5PVElDRS54bWwuZ3ogb2YgYSBwYXJ0aXRpb24uCitVc2FnZSBleGFtcGxlOgorICBnZW5fbm90aWNlX3htbC5weSAtLW91dHB1dF9maWxlIG91dC9zb29uZy8uaW50ZXJtZWRpYXRlLy4uLi9OT1RJQ0UueG1sLmd6IFwKKyAgICAgICAgICAgICAgLS1tZXRhZGF0YSBvdXQvc29vbmcvY29tcGxpYW5jZS1tZXRhZGF0YS9hb3NwX2NmX3g4Nl82NF9waG9uZS9jb21wbGlhbmNlLW1ldGFkYXRhLmRiIFwKKyAgICAgICAgICAgICAgLS1wYXJ0aXRpb24gc3lzdGVtIFwKKyAgICAgICAgICAgICAgLS1wcm9kdWN0X291dCBvdXQvdGFyZ2V0L3Zzb2NfeDg2XzY0IFwKKyAgICAgICAgICAgICAgLS1zb29uZ19vdXQgb3V0L3Nvb25nCisiIiIKKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgY29tcGxpYW5jZV9tZXRhZGF0YQoraW1wb3J0IGdvb2dsZS5wcm90b2J1Zi50ZXh0X2Zvcm1hdCBhcyB0ZXh0X2Zvcm1hdAoraW1wb3J0IGd6aXAKK2ltcG9ydCBoYXNobGliCitpbXBvcnQgbWV0YWRhdGFfZmlsZV9wYjIKK2ltcG9ydCBvcworaW1wb3J0IHF1ZXVlCitpbXBvcnQgeG1sLnNheC5zYXh1dGlscworCisKK0ZJTEVfSEVBREVSID0gJycnXAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzxsaWNlbnNlcz4KKycnJworRklMRV9GT09URVIgPSAnJydcCis8L2xpY2Vuc2VzPgorJycnCisKKworZGVmIGdldF9hcmdzKCk6CisgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKCkKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLXYnLCAnLS12ZXJib3NlJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVmYXVsdD1GYWxzZSwgaGVscD0nUHJpbnQgbW9yZSBpbmZvcm1hdGlvbi4nKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctZCcsICctLWRlYnVnJywgYWN0aW9uPSdzdG9yZV90cnVlJywgZGVmYXVsdD1GYWxzZSwgaGVscD0nRGVidWcgbW9kZScpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tb3V0cHV0X2ZpbGUnLCByZXF1aXJlZD1UcnVlLCBoZWxwPSdUaGUgcGF0aCBvZiB0aGUgZ2VuZXJhdGVkIE5PVElDRS54bWwuZ3ogZmlsZS4nKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXBhcnRpdGlvbicsIHJlcXVpcmVkPVRydWUsIGhlbHA9J1RoZSBuYW1lIG9mIHBhcnRpdGlvbiBmb3Igd2hpY2ggdGhlIE5PVElDRS54bWwuZ3ogaXMgZ2VuZXJhdGVkLicpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoJy0tbWV0YWRhdGEnLCByZXF1aXJlZD1UcnVlLCBoZWxwPSdUaGUgcGF0aCBvZiBjb21wbGlhbmNlIG1ldGFkYXRhIERCIGZpbGUuJykKKyAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLS1wcm9kdWN0X291dCcsIHJlcXVpcmVkPVRydWUsIGhlbHA9J1RoZSBwYXRoIG9mIFBST0RVQ1RfT1VULCBlLmcuIG91dC90YXJnZXQvcHJvZHVjdC92c29jX3g4Nl82NC4nKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXNvb25nX291dCcsIHJlcXVpcmVkPVRydWUsIGhlbHA9J1RoZSBwYXRoIG9mIFNvb25nIG91dHB1dCBkaXJlY3RvcnksIGUuZy4gb3V0L3Nvb25nJykKKworICByZXR1cm4gcGFyc2VyLnBhcnNlX2FyZ3MoKQorCisKK2RlZiBsb2coKmluZm8pOgorICBpZiBhcmdzLnZlcmJvc2U6CisgICAgZm9yIGkgaW4gaW5mbzoKKyAgICAgIHByaW50KGkpCisKKworZGVmIG5ld19maWxlX25hbWVfdGFnKGZpbGVfbWV0YWRhdGEsIHBhY2thZ2VfbmFtZSwgY29udGVudF9pZCk6CisgIGZpbGVfcGF0aCA9IGZpbGVfbWV0YWRhdGFbJ2luc3RhbGxlZF9maWxlJ10ucmVtb3ZlcHJlZml4KGFyZ3MucHJvZHVjdF9vdXQpCisgIGxpYiA9ICdBbmRyb2lkJworICBpZiBwYWNrYWdlX25hbWU6CisgICAgbGliID0gcGFja2FnZV9uYW1lCisgIHJldHVybiBmJzxmaWxlLW5hbWUgY29udGVudElkPSJ7Y29udGVudF9pZH0iIGxpYj0ie2xpYn0iPntmaWxlX3BhdGh9PC9maWxlLW5hbWU+XG4nCisKKworZGVmIG5ld19maWxlX2NvbnRlbnRfdGFnKGNvbnRlbnRfaWQsIGxpY2Vuc2VfdGV4dCk6CisgIGVzY2FwZWRfbGljZW5zZV90ZXh0ID0geG1sLnNheC5zYXh1dGlscy5lc2NhcGUobGljZW5zZV90ZXh0LCB7J1x0JzogJyYjeDk7JywgJ1xuJzogJyYjeEE7JywgJ1xyJzogJyYjeEQ7J30pCisgIHJldHVybiBmJzxmaWxlLWNvbnRlbnQgY29udGVudElkPSJ7Y29udGVudF9pZH0iPjwhW0NEQVRBW3tlc2NhcGVkX2xpY2Vuc2VfdGV4dH1dXT48L2ZpbGUtY29udGVudD5cblxuJworCitkZWYgZ2V0X21ldGFkYXRhX2ZpbGVfcGF0aChmaWxlX21ldGFkYXRhKToKKyAgIiIiU2VhcmNoIGZvciBNRVRBREFUQSBmaWxlIG9mIGEgcGFja2FnZSBhbmQgcmV0dXJuIGl0cyBwYXRoLiIiIgorICBtZXRhZGF0YV9wYXRoID0gJycKKyAgaWYgZmlsZV9tZXRhZGF0YVsnbW9kdWxlX3BhdGgnXToKKyAgICBtZXRhZGF0YV9wYXRoID0gZmlsZV9tZXRhZGF0YVsnbW9kdWxlX3BhdGgnXQorICBlbGlmIGZpbGVfbWV0YWRhdGFbJ2tlcm5lbF9tb2R1bGVfY29weV9maWxlcyddOgorICAgIG1ldGFkYXRhX3BhdGggPSBvcy5wYXRoLmRpcm5hbWUoZmlsZV9tZXRhZGF0YVsna2VybmVsX21vZHVsZV9jb3B5X2ZpbGVzJ10uc3BsaXQoJzonKVswXSkKKworICB3aGlsZSBtZXRhZGF0YV9wYXRoIGFuZCBub3Qgb3MucGF0aC5leGlzdHMobWV0YWRhdGFfcGF0aCArICcvTUVUQURBVEEnKToKKyAgICBtZXRhZGF0YV9wYXRoID0gb3MucGF0aC5kaXJuYW1lKG1ldGFkYXRhX3BhdGgpCisKKyAgcmV0dXJuIG1ldGFkYXRhX3BhdGgKKworZGVmIG1kNV9maWxlX2NvbnRlbnQoZmlsZXBhdGgpOgorICBoID0gaGFzaGxpYi5tZDUoKQorICB3aXRoIG9wZW4oZmlsZXBhdGgsICdyYicpIGFzIGY6CisgICAgaC51cGRhdGUoZi5yZWFkKCkpCisgIHJldHVybiBoLmhleGRpZ2VzdCgpCisKK2RlZiBnZXRfdHJhbnNpdGl2ZV9zdGF0aWNfZGVwX21vZHVsZXMoaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGEsIGRiKToKKyAgIyBGaW5kIGFsbCB0cmFuc2l0aXZlIHN0YXRpYyBkZXAgZmlsZXMgb2YgdGhlIGluc3RhbGxlZCBmaWxlcworICBxID0gcXVldWUuUXVldWUoKQorICBpZiBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YVsnc3RhdGljX2RlcF9maWxlcyddOgorICAgIGZvciBmIGluIGluc3RhbGxlZF9maWxlX21ldGFkYXRhWydzdGF0aWNfZGVwX2ZpbGVzJ10uc3BsaXQoJyAnKToKKyAgICAgIHEucHV0KGYpCisgIGlmIGluc3RhbGxlZF9maWxlX21ldGFkYXRhWyd3aG9sZV9zdGF0aWNfZGVwX2ZpbGVzJ106CisgICAgZm9yIGYgaW4gaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ3dob2xlX3N0YXRpY19kZXBfZmlsZXMnXS5zcGxpdCgnICcpOgorICAgICAgcS5wdXQoZikKKworICBzdGF0aWNfZGVwX2ZpbGVzID0ge30KKyAgd2hpbGUgbm90IHEuZW1wdHkoKToKKyAgICBkZXBfZmlsZSA9IHEuZ2V0KCkKKyAgICBpZiBkZXBfZmlsZSBpbiBzdGF0aWNfZGVwX2ZpbGVzOgorICAgICAgIyBJdCBoYXMgYmVlbiBwcm9jZXNzZWQKKyAgICAgIGNvbnRpbnVlCisKKyAgICBzb29uZ19tb2R1bGUgPSBkYi5nZXRfc29vbmdfbW9kdWxlX29mX2J1aWx0X2ZpbGUoZGVwX2ZpbGUpCisgICAgaWYgbm90IHNvb25nX21vZHVsZToKKyAgICAgIGNvbnRpbnVlCisKKyAgICBzdGF0aWNfZGVwX2ZpbGVzW2RlcF9maWxlXSA9IHNvb25nX21vZHVsZQorCisgICAgaWYgc29vbmdfbW9kdWxlWydzdGF0aWNfZGVwX2ZpbGVzJ106CisgICAgICBmb3IgZiBpbiBzb29uZ19tb2R1bGVbJ3N0YXRpY19kZXBfZmlsZXMnXS5zcGxpdCgnICcpOgorICAgICAgICBpZiBmIG5vdCBpbiBzdGF0aWNfZGVwX2ZpbGVzOgorICAgICAgICAgIHEucHV0KGYpCisgICAgaWYgc29vbmdfbW9kdWxlWyd3aG9sZV9zdGF0aWNfZGVwX2ZpbGVzJ106CisgICAgICBmb3IgZiBpbiBzb29uZ19tb2R1bGVbJ3dob2xlX3N0YXRpY19kZXBfZmlsZXMnXS5zcGxpdCgnICcpOgorICAgICAgICBpZiBmIG5vdCBpbiBzdGF0aWNfZGVwX2ZpbGVzOgorICAgICAgICAgIHEucHV0KGYpCisKKyAgcmV0dXJuIHN0YXRpY19kZXBfZmlsZXMudmFsdWVzKCkKKworZGVmIG1haW4oKToKKyAgZ2xvYmFsIGFyZ3MKKyAgYXJncyA9IGdldF9hcmdzKCkKKyAgbG9nKCdBcmdzOicsIHZhcnMoYXJncykpCisKKyAgZ2xvYmFsIGRiCisgIGRiID0gY29tcGxpYW5jZV9tZXRhZGF0YS5NZXRhZGF0YURiKGFyZ3MubWV0YWRhdGEpCisgIGlmIGFyZ3MuZGVidWc6CisgICAgZGIuZHVtcF9kZWJ1Z19kYihvcy5wYXRoLmRpcm5hbWUoYXJncy5vdXRwdXRfZmlsZSkgKyAnL2NvbXBsaWFuY2UtbWV0YWRhdGEtZGVidWcuZGInKQorCisgICMgTk9USUNFLnhtbAorICBub3RpY2VfeG1sX2ZpbGVfcGF0aCA9IG9zLnBhdGguZGlybmFtZShhcmdzLm91dHB1dF9maWxlKSArICcvTk9USUNFLnhtbCcKKyAgd2l0aCBvcGVuKG5vdGljZV94bWxfZmlsZV9wYXRoLCAndycsIGVuY29kaW5nPSJ1dGYtOCIpIGFzIG5vdGljZV94bWxfZmlsZToKKyAgICBub3RpY2VfeG1sX2ZpbGUud3JpdGUoRklMRV9IRUFERVIpCisKKyAgICBhbGxfbGljZW5zZV9maWxlcyA9IHt9CisgICAgZm9yIG1ldGFkYXRhIGluIGRiLmdldF9pbnN0YWxsZWRfZmlsZV9pbl9kaXIoYXJncy5wcm9kdWN0X291dCArICcvJyArIGFyZ3MucGFydGl0aW9uKToKKyAgICAgIHNvb25nX21vZHVsZSA9IGRiLmdldF9zb29uZ19tb2R1bGVfb2ZfaW5zdGFsbGVkX2ZpbGUobWV0YWRhdGFbJ2luc3RhbGxlZF9maWxlJ10pCisgICAgICBpZiBzb29uZ19tb2R1bGU6CisgICAgICAgIG1ldGFkYXRhLnVwZGF0ZShzb29uZ19tb2R1bGUpCisgICAgICBlbHNlOgorICAgICAgICAjIEZvciBtYWtlIG1vZHVsZXMgc29vbmdfbW9kdWxlX3R5cGUgc2hvdWxkIGJlIGVtcHR5CisgICAgICAgIG1ldGFkYXRhWydzb29uZ19tb2R1bGVfdHlwZSddID0gJycKKyAgICAgICAgbWV0YWRhdGFbJ3N0YXRpY19kZXBfZmlsZXMnXSA9ICcnCisgICAgICAgIG1ldGFkYXRhWyd3aG9sZV9zdGF0aWNfZGVwX2ZpbGVzJ10gPSAnJworCisgICAgICBpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YV9saXN0ID0gW21ldGFkYXRhXQorICAgICAgaWYgYXJncy5wYXJ0aXRpb24gaW4gKCd2ZW5kb3InLCAncHJvZHVjdCcsICdzeXN0ZW1fZXh0Jyk6CisgICAgICAgICMgRm9yIHRyYW5zaXRpdmUgc3RhdGljIGRlcGVuZGVuY2llcyBvZiBhbiBpbnN0YWxsZWQgZmlsZSwgbWFrZSBpdCBhcyBpZiBhbiBpbnN0YWxsZWQgZmlsZSBhcmUKKyAgICAgICAgIyBhbHNvIGNyZWF0ZWQgZnJvbSBzdGF0aWMgZGVwZW5kZW5jeSBtb2R1bGVzIHdob3NlIGxpY2Vuc2VzIGFyZSBhbHNvIGNvbGxlY3RlZAorICAgICAgICBzdGF0aWNfZGVwX21vZHVsZXMgPSBnZXRfdHJhbnNpdGl2ZV9zdGF0aWNfZGVwX21vZHVsZXMobWV0YWRhdGEsIGRiKQorICAgICAgICBmb3IgZGVwIGluIHN0YXRpY19kZXBfbW9kdWxlczoKKyAgICAgICAgICBkZXBbJ2luc3RhbGxlZF9maWxlJ10gPSBtZXRhZGF0YVsnaW5zdGFsbGVkX2ZpbGUnXQorICAgICAgICAgIGluc3RhbGxlZF9maWxlX21ldGFkYXRhX2xpc3QuYXBwZW5kKGRlcCkKKworICAgICAgZm9yIGluc3RhbGxlZF9maWxlX21ldGFkYXRhIGluIGluc3RhbGxlZF9maWxlX21ldGFkYXRhX2xpc3Q6CisgICAgICAgIHBhY2thZ2VfbmFtZSA9ICdBbmRyb2lkJworICAgICAgICBsaWNlbnNlcyA9IHt9CisgICAgICAgIGlmIGluc3RhbGxlZF9maWxlX21ldGFkYXRhWydtb2R1bGVfcGF0aCddOgorICAgICAgICAgIG1ldGFkYXRhX2ZpbGVfcGF0aCA9IGdldF9tZXRhZGF0YV9maWxlX3BhdGgoaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGEpCisgICAgICAgICAgaWYgbWV0YWRhdGFfZmlsZV9wYXRoOgorICAgICAgICAgICAgcHJvdG8gPSBtZXRhZGF0YV9maWxlX3BiMi5NZXRhZGF0YSgpCisgICAgICAgICAgICB3aXRoIG9wZW4obWV0YWRhdGFfZmlsZV9wYXRoICsgJy9NRVRBREFUQScsICdydCcpIGFzIGY6CisgICAgICAgICAgICAgIHRleHRfZm9ybWF0LlBhcnNlKGYucmVhZCgpLCBwcm90bykKKyAgICAgICAgICAgIGlmIHByb3RvLm5hbWU6CisgICAgICAgICAgICAgIHBhY2thZ2VfbmFtZSA9IHByb3RvLm5hbWUKKyAgICAgICAgICAgICAgaWYgcHJvdG8udGhpcmRfcGFydHkgYW5kIHByb3RvLnRoaXJkX3BhcnR5LnZlcnNpb246CisgICAgICAgICAgICAgICAgaWYgcHJvdG8udGhpcmRfcGFydHkudmVyc2lvbi5zdGFydHN3aXRoKCd2Jyk6CisgICAgICAgICAgICAgICAgICBwYWNrYWdlX25hbWUgPSBwYWNrYWdlX25hbWUgKyAnXycgKyBwcm90by50aGlyZF9wYXJ0eS52ZXJzaW9uCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgIHBhY2thZ2VfbmFtZSA9IHBhY2thZ2VfbmFtZSArICdfdl8nICsgcHJvdG8udGhpcmRfcGFydHkudmVyc2lvbgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgcGFja2FnZV9uYW1lID0gbWV0YWRhdGFfZmlsZV9wYXRoCisgICAgICAgICAgICAgIGlmIG1ldGFkYXRhX2ZpbGVfcGF0aC5zdGFydHN3aXRoKCdleHRlcm5hbC8nKToKKyAgICAgICAgICAgICAgICBwYWNrYWdlX25hbWUgPSBtZXRhZGF0YV9maWxlX3BhdGgucmVtb3ZlcHJlZml4KCdleHRlcm5hbC8nKQorCisgICAgICAgICAgIyBFdmVyeSBsaWNlbnNlIGZpbGUgaXMgaW4gYSA8ZmlsZS1jb250ZW50PiBlbGVtZW50CisgICAgICAgICAgbGljZW5zZXMgPSBkYi5nZXRfbW9kdWxlX2xpY2Vuc2VzKGluc3RhbGxlZF9maWxlX21ldGFkYXRhLmdldCgnbmFtZScsICcnKSwgaW5zdGFsbGVkX2ZpbGVfbWV0YWRhdGFbJ21vZHVsZV9wYXRoJ10pCisKKyAgICAgICAgIyBJbnN0YWxsZWQgZmlsZSBpcyBmcm9tIFBST0RVQ1RfQ09QWV9GSUxFUworICAgICAgICBlbGlmIG1ldGFkYXRhWydwcm9kdWN0X2NvcHlfZmlsZXMnXToKKyAgICAgICAgICBsaWNlbnNlc1sndW51c2VkX25hbWUnXSA9IG1ldGFkYXRhWydsaWNlbnNlX3RleHQnXQorCisgICAgICAgICMgSW5zdGFsbGVkIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBwbGF0Zm9ybSBpbiBidWlsZHMKKyAgICAgICAgZWxpZiBtZXRhZGF0YVsnaXNfcGxhdGZvcm1fZ2VuZXJhdGVkJ106CisgICAgICAgICAgbGljZW5zZXNbJ3VudXNlZF9uYW1lJ10gPSBtZXRhZGF0YVsnbGljZW5zZV90ZXh0J10KKworICAgICAgICBpZiBsaWNlbnNlczoKKyAgICAgICAgICAjIEVhY2ggdmFsdWUgaXMgYSBzcGFjZSBzZXBhcmF0ZWQgZmlsZXBhdGggbGlzdAorICAgICAgICAgIGZvciBsaWNlbnNlX2ZpbGVzIGluIGxpY2Vuc2VzLnZhbHVlcygpOgorICAgICAgICAgICAgaWYgbm90IGxpY2Vuc2VfZmlsZXM6CisgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBmb3IgZmlsZXBhdGggaW4gbGljZW5zZV9maWxlcy5zcGxpdCgnICcpOgorICAgICAgICAgICAgICBpZiBmaWxlcGF0aCBub3QgaW4gYWxsX2xpY2Vuc2VfZmlsZXM6CisgICAgICAgICAgICAgICAgYWxsX2xpY2Vuc2VfZmlsZXNbZmlsZXBhdGhdID0gbWQ1X2ZpbGVfY29udGVudChmaWxlcGF0aCkKKyAgICAgICAgICAgICAgbWQ1ID0gYWxsX2xpY2Vuc2VfZmlsZXNbZmlsZXBhdGhdCisgICAgICAgICAgICAgIG5vdGljZV94bWxfZmlsZS53cml0ZShuZXdfZmlsZV9uYW1lX3RhZyhpbnN0YWxsZWRfZmlsZV9tZXRhZGF0YSwgcGFja2FnZV9uYW1lLCBtZDUpKQorCisgICAgIyBMaWNlbnNlcworICAgIHByb2Nlc3NlZF9tZDUgPSBbXQorICAgIGZvciBmaWxlcGF0aCwgbWQ1IGluIGFsbF9saWNlbnNlX2ZpbGVzLml0ZW1zKCk6CisgICAgICBpZiBtZDUgbm90IGluIHByb2Nlc3NlZF9tZDU6CisgICAgICAgIHByb2Nlc3NlZF9tZDUuYXBwZW5kKG1kNSkKKyAgICAgICAgd2l0aCBvcGVuKGZpbGVwYXRoLCAncnQnLCBlcnJvcnM9J2JhY2tzbGFzaHJlcGxhY2UnKSBhcyBmOgorICAgICAgICAgIG5vdGljZV94bWxfZmlsZS53cml0ZShuZXdfZmlsZV9jb250ZW50X3RhZyhtZDUsIGYucmVhZCgpKSkKKworICAgIG5vdGljZV94bWxfZmlsZS53cml0ZShGSUxFX0ZPT1RFUikKKworICAjIE5PVElDRS54bWwuZ3oKKyAgd2l0aCBvcGVuKG5vdGljZV94bWxfZmlsZV9wYXRoLCAncmInKSBhcyBub3RpY2VfeG1sX2ZpbGUsIGd6aXAub3BlbihhcmdzLm91dHB1dF9maWxlLCAnd2InKSBhcyBnel9maWxlOgorICAgIGd6X2ZpbGUud3JpdGVsaW5lcyhub3RpY2VfeG1sX2ZpbGUpCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIG1haW4oKQpkaWZmIC0tZ2l0IGEvdG9vbHMvc2JvbS9nZW5fc2JvbS5weSBiL3Rvb2xzL3Nib20vZ2VuX3Nib20ucHkKaW5kZXggYTIwMzI1OC4uNzdiY2NiYiAxMDA2NDQKLS0tIGEvdG9vbHMvc2JvbS9nZW5fc2JvbS5weQorKysgYi90b29scy9zYm9tL2dlbl9zYm9tLnB5CkBAIC0yNiw2ICsyNiw3IEBACiAiIiIKIAogaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgY29tcGxpYW5jZV9tZXRhZGF0YQogaW1wb3J0IGRhdGV0aW1lCiBpbXBvcnQgZ29vZ2xlLnByb3RvYnVmLnRleHRfZm9ybWF0IGFzIHRleHRfZm9ybWF0CiBpbXBvcnQgaGFzaGxpYgpAQCAtMzUsNyArMzYsNiBAQAogaW1wb3J0IG1ldGFkYXRhX2ZpbGVfcGIyCiBpbXBvcnQgc2JvbV9kYXRhCiBpbXBvcnQgc2JvbV93cml0ZXJzCi1pbXBvcnQgc3FsaXRlMwogCiAjIFBhY2thZ2UgdHlwZQogUEtHX1NPVVJDRSA9ICdTT1VSQ0UnCkBAIC05Miw2ICs5Miw3IEBACiAgICAgJ1NWTicsCiAgICAgJ0hnJywKICAgICAnRGFyY3MnLAorICAgICdQaXBlcicsCiAgICAgJ1ZDUycsCiAgICAgJ0FyY2hpdmUnLAogICAgICdQcmVidWlsdEJ5QWxwaGFiZXQnLApAQCAtNTY4LDIwMiArNTY5LDE2IEBACiAgIHJldHVybiBzb3J0ZWQoYWxsX3N0YXRpY19kZXBfZmlsZXMua2V5cygpKQogCiAKLWNsYXNzIE1ldGFkYXRhRGI6Ci0gIGRlZiBfX2luaXRfXyhzZWxmLCBkYik6Ci0gICAgc2VsZi5jb25uID0gc3FsaXRlMy5jb25uZWN0KCc6bWVtb3J5JykKLSAgICBzZWxmLmNvbm4ucm93X2ZhY3RvcnkgPSBzcWxpdGUzLlJvdwotICAgIHdpdGggc3FsaXRlMy5jb25uZWN0KGRiKSBhcyBjOgotICAgICAgYy5iYWNrdXAoc2VsZi5jb25uKQotICAgIHNlbGYucmVvcmcoKQotCi0gIGRlZiByZW9yZyhzZWxmKToKLSAgICAjIHBhY2thZ2VfbGljZW5zZSB0YWJsZQotICAgIHNlbGYuY29ubi5leGVjdXRlKCJjcmVhdGUgdGFibGUgcGFja2FnZV9saWNlbnNlIGFzICIKLSAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0IG5hbWUgYXMgcGFja2FnZSwgcGtnX2RlZmF1bHRfYXBwbGljYWJsZV9saWNlbnNlcyBhcyBsaWNlbnNlICIKLSAgICAgICAgICAgICAgICAgICAgICAiZnJvbSBtb2R1bGVzICIKLSAgICAgICAgICAgICAgICAgICAgICAid2hlcmUgbW9kdWxlX3R5cGUgPSAncGFja2FnZScgIikKLSAgICBjdXJzb3IgPSBzZWxmLmNvbm4uZXhlY3V0ZSgic2VsZWN0IHBhY2thZ2UsbGljZW5zZSBmcm9tIHBhY2thZ2VfbGljZW5zZSB3aGVyZSBsaWNlbnNlIGxpa2UgJyUgJSciKQotICAgIG11bHRpX2xpY2Vuc2VzX3BhY2thZ2VzID0gY3Vyc29yLmZldGNoYWxsKCkKLSAgICBjdXJzb3IuY2xvc2UoKQotICAgIHJvd3MgPSBbXQotICAgIGZvciBwIGluIG11bHRpX2xpY2Vuc2VzX3BhY2thZ2VzOgotICAgICAgbGljZW5zZXMgPSBwWydsaWNlbnNlJ10uc3RyaXAoKS5zcGxpdCgnICcpCi0gICAgICBmb3IgbGljIGluIGxpY2Vuc2VzOgotICAgICAgICByb3dzLmFwcGVuZCgocFsncGFja2FnZSddLCBsaWMpKQotICAgIHNlbGYuY29ubi5leGVjdXRlbWFueSgnaW5zZXJ0IGludG8gcGFja2FnZV9saWNlbnNlIHZhbHVlcyAoPywgPyknLCByb3dzKQotICAgIHNlbGYuY29ubi5jb21taXQoKQotCi0gICAgc2VsZi5jb25uLmV4ZWN1dGUoImRlbGV0ZSBmcm9tIHBhY2thZ2VfbGljZW5zZSB3aGVyZSBsaWNlbnNlIGxpa2UgJyUgJSciKQotICAgIHNlbGYuY29ubi5jb21taXQoKQotCi0gICAgIyBtb2R1bGVfbGljZW5zZSB0YWJsZQotICAgIHNlbGYuY29ubi5leGVjdXRlKCJjcmVhdGUgdGFibGUgbW9kdWxlX2xpY2Vuc2UgYXMgIgotICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3QgZGlzdGluY3QgbmFtZSBhcyBtb2R1bGUsIHBhY2thZ2UsIGxpY2Vuc2VzIGFzIGxpY2Vuc2UgIgotICAgICAgICAgICAgICAgICAgICAgICJmcm9tIG1vZHVsZXMgIgotICAgICAgICAgICAgICAgICAgICAgICJ3aGVyZSBsaWNlbnNlcyAhPSAnJyAiKQotICAgIGN1cnNvciA9IHNlbGYuY29ubi5leGVjdXRlKCJzZWxlY3QgbW9kdWxlLHBhY2thZ2UsbGljZW5zZSBmcm9tIG1vZHVsZV9saWNlbnNlIHdoZXJlIGxpY2Vuc2UgbGlrZSAnJSAlJyIpCi0gICAgbXVsdGlfbGljZW5zZXNfbW9kdWxlcyA9IGN1cnNvci5mZXRjaGFsbCgpCi0gICAgY3Vyc29yLmNsb3NlKCkKLSAgICByb3dzID0gW10KLSAgICBmb3IgbSBpbiBtdWx0aV9saWNlbnNlc19tb2R1bGVzOgotICAgICAgbGljZW5zZXMgPSBtWydsaWNlbnNlJ10uc3RyaXAoKS5zcGxpdCgnICcpCi0gICAgICBmb3IgbGljIGluIGxpY2Vuc2VzOgotICAgICAgICByb3dzLmFwcGVuZCgobVsnbW9kdWxlJ10sIG1bJ3BhY2thZ2UnXSxsaWMpKQotICAgIHNlbGYuY29ubi5leGVjdXRlbWFueSgnaW5zZXJ0IGludG8gbW9kdWxlX2xpY2Vuc2UgdmFsdWVzICg/LCA/LCA/KScsIHJvd3MpCi0gICAgc2VsZi5jb25uLmNvbW1pdCgpCi0KLSAgICBzZWxmLmNvbm4uZXhlY3V0ZSgiZGVsZXRlIGZyb20gbW9kdWxlX2xpY2Vuc2Ugd2hlcmUgbGljZW5zZSBsaWtlICclICUnIikKLSAgICBzZWxmLmNvbm4uY29tbWl0KCkKLQotICAgICMgbW9kdWxlX2luc3RhbGxlZF9maWxlIHRhYmxlCi0gICAgc2VsZi5jb25uLmV4ZWN1dGUoImNyZWF0ZSB0YWJsZSBtb2R1bGVfaW5zdGFsbGVkX2ZpbGUgYXMgIgotICAgICAgICAgICAgICAgICAgICAgICJzZWxlY3QgaWQgYXMgbW9kdWxlX2lkLCBuYW1lIGFzIG1vZHVsZV9uYW1lLCBwYWNrYWdlLCBpbnN0YWxsZWRfZmlsZXMgYXMgaW5zdGFsbGVkX2ZpbGUgIgotICAgICAgICAgICAgICAgICAgICAgICJmcm9tIG1vZHVsZXMgIgotICAgICAgICAgICAgICAgICAgICAgICJ3aGVyZSBpbnN0YWxsZWRfZmlsZXMgIT0gJycgIikKLSAgICBjdXJzb3IgPSBzZWxmLmNvbm4uZXhlY3V0ZSgic2VsZWN0IG1vZHVsZV9pZCwgbW9kdWxlX25hbWUsIHBhY2thZ2UsIGluc3RhbGxlZF9maWxlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJvbSBtb2R1bGVfaW5zdGFsbGVkX2ZpbGUgd2hlcmUgaW5zdGFsbGVkX2ZpbGUgbGlrZSAnJSAlJyIpCi0gICAgbXVsdGlfaW5zdGFsbGVkX2ZpbGVfbW9kdWxlcyA9IGN1cnNvci5mZXRjaGFsbCgpCi0gICAgY3Vyc29yLmNsb3NlKCkKLSAgICByb3dzID0gW10KLSAgICBmb3IgbSBpbiBtdWx0aV9pbnN0YWxsZWRfZmlsZV9tb2R1bGVzOgotICAgICAgaW5zdGFsbGVkX2ZpbGVzID0gbVsnaW5zdGFsbGVkX2ZpbGUnXS5zdHJpcCgpLnNwbGl0KCcgJykKLSAgICAgIGZvciBmIGluIGluc3RhbGxlZF9maWxlczoKLSAgICAgICAgcm93cy5hcHBlbmQoKG1bJ21vZHVsZV9pZCddLCBtWydtb2R1bGVfbmFtZSddLCBtWydwYWNrYWdlJ10sIGYpKQotICAgIHNlbGYuY29ubi5leGVjdXRlbWFueSgnaW5zZXJ0IGludG8gbW9kdWxlX2luc3RhbGxlZF9maWxlIHZhbHVlcyAoPywgPywgPywgPyknLCByb3dzKQotICAgIHNlbGYuY29ubi5jb21taXQoKQotCi0gICAgc2VsZi5jb25uLmV4ZWN1dGUoImRlbGV0ZSBmcm9tIG1vZHVsZV9pbnN0YWxsZWRfZmlsZSB3aGVyZSBpbnN0YWxsZWRfZmlsZSBsaWtlICclICUnIikKLSAgICBzZWxmLmNvbm4uY29tbWl0KCkKLQotICAgICMgbW9kdWxlX2J1aWx0X2ZpbGUgdGFibGUKLSAgICBzZWxmLmNvbm4uZXhlY3V0ZSgiY3JlYXRlIHRhYmxlIG1vZHVsZV9idWlsdF9maWxlIGFzICIKLSAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0IGlkIGFzIG1vZHVsZV9pZCwgbmFtZSBhcyBtb2R1bGVfbmFtZSwgcGFja2FnZSwgYnVpbHRfZmlsZXMgYXMgYnVpbHRfZmlsZSAiCi0gICAgICAgICAgICAgICAgICAgICAgImZyb20gbW9kdWxlcyAiCi0gICAgICAgICAgICAgICAgICAgICAgIndoZXJlIGJ1aWx0X2ZpbGVzICE9ICcnICIpCi0gICAgY3Vyc29yID0gc2VsZi5jb25uLmV4ZWN1dGUoInNlbGVjdCBtb2R1bGVfaWQsIG1vZHVsZV9uYW1lLCBwYWNrYWdlLCBidWlsdF9maWxlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJvbSBtb2R1bGVfYnVpbHRfZmlsZSB3aGVyZSBidWlsdF9maWxlIGxpa2UgJyUgJSciKQotICAgIG11bHRpX2J1aWx0X2ZpbGVfbW9kdWxlcyA9IGN1cnNvci5mZXRjaGFsbCgpCi0gICAgY3Vyc29yLmNsb3NlKCkKLSAgICByb3dzID0gW10KLSAgICBmb3IgbSBpbiBtdWx0aV9idWlsdF9maWxlX21vZHVsZXM6Ci0gICAgICBidWlsdF9maWxlcyA9IG1bJ2luc3RhbGxlZF9maWxlJ10uc3RyaXAoKS5zcGxpdCgnICcpCi0gICAgICBmb3IgZiBpbiBidWlsdF9maWxlczoKLSAgICAgICAgcm93cy5hcHBlbmQoKG1bJ21vZHVsZV9pZCddLCBtWydtb2R1bGVfbmFtZSddLCBtWydwYWNrYWdlJ10sIGYpKQotICAgIHNlbGYuY29ubi5leGVjdXRlbWFueSgnaW5zZXJ0IGludG8gbW9kdWxlX2J1aWx0X2ZpbGUgdmFsdWVzICg/LCA/LCA/LCA/KScsIHJvd3MpCi0gICAgc2VsZi5jb25uLmNvbW1pdCgpCi0KLSAgICBzZWxmLmNvbm4uZXhlY3V0ZSgiZGVsZXRlIGZyb20gbW9kdWxlX2J1aWx0X2ZpbGUgd2hlcmUgYnVpbHRfZmlsZSBsaWtlICclICUnIikKLSAgICBzZWxmLmNvbm4uY29tbWl0KCkKLQotCi0gICAgIyBJbmRleGVzCi0gICAgc2VsZi5jb25uLmV4ZWN1dGUoJ2NyZWF0ZSBpbmRleCBpZHhfbW9kdWxlc19pZCBvbiBtb2R1bGVzIChpZCknKQotICAgIHNlbGYuY29ubi5leGVjdXRlKCdjcmVhdGUgaW5kZXggaWR4X21vZHVsZXNfbmFtZSBvbiBtb2R1bGVzIChuYW1lKScpCi0gICAgc2VsZi5jb25uLmV4ZWN1dGUoJ2NyZWF0ZSBpbmRleCBpZHhfcGFja2FnZV9saWNuZXNlX3BhY2thZ2Ugb24gcGFja2FnZV9saWNlbnNlIChwYWNrYWdlKScpCi0gICAgc2VsZi5jb25uLmV4ZWN1dGUoJ2NyZWF0ZSBpbmRleCBpZHhfcGFja2FnZV9saWNuZXNlX2xpY2Vuc2Ugb24gcGFja2FnZV9saWNlbnNlIChsaWNlbnNlKScpCi0gICAgc2VsZi5jb25uLmV4ZWN1dGUoJ2NyZWF0ZSBpbmRleCBpZHhfbW9kdWxlX2xpY25lc2VfbW9kdWxlIG9uIG1vZHVsZV9saWNlbnNlIChtb2R1bGUpJykKLSAgICBzZWxmLmNvbm4uZXhlY3V0ZSgnY3JlYXRlIGluZGV4IGlkeF9tb2R1bGVfbGljbmVzZV9saWNlbnNlIG9uIG1vZHVsZV9saWNlbnNlIChsaWNlbnNlKScpCi0gICAgc2VsZi5jb25uLmV4ZWN1dGUoJ2NyZWF0ZSBpbmRleCBpZHhfbW9kdWxlX2luc3RhbGxlZF9maWxlX21vZHVsZV9pZCBvbiBtb2R1bGVfaW5zdGFsbGVkX2ZpbGUgKG1vZHVsZV9pZCknKQotICAgIHNlbGYuY29ubi5leGVjdXRlKCdjcmVhdGUgaW5kZXggaWR4X21vZHVsZV9pbnN0YWxsZWRfZmlsZV9pbnN0YWxsZWRfZmlsZSBvbiBtb2R1bGVfaW5zdGFsbGVkX2ZpbGUgKGluc3RhbGxlZF9maWxlKScpCi0gICAgc2VsZi5jb25uLmV4ZWN1dGUoJ2NyZWF0ZSBpbmRleCBpZHhfbW9kdWxlX2J1aWx0X2ZpbGVfbW9kdWxlX2lkIG9uIG1vZHVsZV9idWlsdF9maWxlIChtb2R1bGVfaWQpJykKLSAgICBzZWxmLmNvbm4uZXhlY3V0ZSgnY3JlYXRlIGluZGV4IGlkeF9tb2R1bGVfYnVpbHRfZmlsZV9idWlsdF9maWxlIG9uIG1vZHVsZV9idWlsdF9maWxlIChidWlsdF9maWxlKScpCi0gICAgc2VsZi5jb25uLmNvbW1pdCgpCi0KLSAgICBpZiBhcmdzLmRlYnVnOgotICAgICAgd2l0aCBzcWxpdGUzLmNvbm5lY3Qob3MucGF0aC5kaXJuYW1lKGFyZ3MubWV0YWRhdGEpICsgJy9jb21wbGlhbmNlLW1ldGFkYXRhLWRlYnVnLmRiJykgYXMgYzoKLSAgICAgICAgc2VsZi5jb25uLmJhY2t1cChjKQotCi0KLSAgZGVmIGdldF9pbnN0YWxsZWRfZmlsZXMoc2VsZik6Ci0gICAgIyBHZXQgYWxsIHJlY29yZHMgZnJvbSB0YWJsZSBtYWtlX21ldGFkYXRhLCB3aGljaCBjb250YWlucyBhbGwgaW5zdGFsbGVkIGZpbGVzIGFuZCBjb3JyZXNwb25kaW5nIG1ha2UgbW9kdWxlcycgbWV0YWRhdGEKLSAgICBjdXJzb3IgPSBzZWxmLmNvbm4uZXhlY3V0ZSgnc2VsZWN0IGluc3RhbGxlZF9maWxlLCBtb2R1bGVfcGF0aCwgaXNfcHJlYnVpbHRfbWFrZV9tb2R1bGUsIHByb2R1Y3RfY29weV9maWxlcywga2VybmVsX21vZHVsZV9jb3B5X2ZpbGVzLCBpc19wbGF0Zm9ybV9nZW5lcmF0ZWQsIGxpY2Vuc2VfdGV4dCBmcm9tIG1ha2VfbWV0YWRhdGEnKQotICAgIHJvd3MgPSBjdXJzb3IuZmV0Y2hhbGwoKQotICAgIGN1cnNvci5jbG9zZSgpCi0gICAgaW5zdGFsbGVkX2ZpbGVzX21ldGFkYXRhID0gW10KLSAgICBmb3Igcm93IGluIHJvd3M6Ci0gICAgICBtZXRhZGF0YSA9IGRpY3QoemlwKHJvdy5rZXlzKCksIHJvdykpCi0gICAgICBpbnN0YWxsZWRfZmlsZXNfbWV0YWRhdGEuYXBwZW5kKG1ldGFkYXRhKQotICAgIHJldHVybiBpbnN0YWxsZWRfZmlsZXNfbWV0YWRhdGEKLQotICBkZWYgZ2V0X3Nvb25nX21vZHVsZXMoc2VsZik6Ci0gICAgIyBHZXQgYWxsIHJlY29yZHMgZnJvbSB0YWJsZSBtb2R1bGVzLCB3aGljaCBjb250YWlucyBtZXRhZGF0YSBvZiBhbGwgc29vbmcgbW9kdWxlcwotICAgIGN1cnNvciA9IHNlbGYuY29ubi5leGVjdXRlKCdzZWxlY3QgbmFtZSwgcGFja2FnZSwgcGFja2FnZSBhcyBtb2R1bGVfcGF0aCwgbW9kdWxlX3R5cGUgYXMgc29vbmdfbW9kdWxlX3R5cGUsIGJ1aWx0X2ZpbGVzLCBpbnN0YWxsZWRfZmlsZXMsIHN0YXRpY19kZXBfZmlsZXMsIHdob2xlX3N0YXRpY19kZXBfZmlsZXMgZnJvbSBtb2R1bGVzJykKLSAgICByb3dzID0gY3Vyc29yLmZldGNoYWxsKCkKLSAgICBjdXJzb3IuY2xvc2UoKQotICAgIHNvb25nX21vZHVsZXMgPSBbXQotICAgIGZvciByb3cgaW4gcm93czoKLSAgICAgIHNvb25nX21vZHVsZSA9IGRpY3QoemlwKHJvdy5rZXlzKCksIHJvdykpCi0gICAgICBzb29uZ19tb2R1bGVzLmFwcGVuZChzb29uZ19tb2R1bGUpCi0gICAgcmV0dXJuIHNvb25nX21vZHVsZXMKLQotICBkZWYgZ2V0X3BhY2thZ2VfbGljZW5zZXMoc2VsZiwgcGFja2FnZSk6Ci0gICAgY3Vyc29yID0gc2VsZi5jb25uLmV4ZWN1dGUoJ3NlbGVjdCBtLm5hbWUsIG0ucGFja2FnZSwgbS5saWNfbGljZW5zZV90ZXh0IGFzIGxpY2Vuc2VfdGV4dCAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zyb20gcGFja2FnZV9saWNlbnNlIHBsIGpvaW4gbW9kdWxlcyBtIG9uIHBsLmxpY2Vuc2UgPSBtLm5hbWUgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aGVyZSBwbC5wYWNrYWdlID0gPycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCcvLycgKyBwYWNrYWdlLCkpCi0gICAgcm93cyA9IGN1cnNvci5mZXRjaGFsbCgpCi0gICAgbGljZW5zZXMgPSB7fQotICAgIGZvciByIGluIHJvd3M6Ci0gICAgICBsaWNlbnNlc1tyWyduYW1lJ11dID0gclsnbGljZW5zZV90ZXh0J10KLSAgICByZXR1cm4gbGljZW5zZXMKLQotICBkZWYgZ2V0X21vZHVsZV9saWNlbnNlcyhzZWxmLCBtb2R1bGVfbmFtZSwgcGFja2FnZSk6Ci0gICAgbGljZW5zZXMgPSB7fQotICAgICMgSWYgcHJvcGVydHkgImxpY2Vuc2VzIiBpcyBkZWZpbmVkIG9uIG1vZHVsZQotICAgIGN1cnNvciA9IHNlbGYuY29ubi5leGVjdXRlKCdzZWxlY3QgbS5uYW1lLCBtLnBhY2thZ2UsIG0ubGljX2xpY2Vuc2VfdGV4dCBhcyBsaWNlbnNlX3RleHQgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmcm9tIG1vZHVsZV9saWNlbnNlIG1sIGpvaW4gbW9kdWxlcyBtIG9uIG1sLmxpY2Vuc2UgPSBtLm5hbWUgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aGVyZSBtbC5tb2R1bGUgPSA/IGFuZCBtbC5wYWNrYWdlID0gPycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1vZHVsZV9uYW1lLCBwYWNrYWdlKSkKLSAgICByb3dzID0gY3Vyc29yLmZldGNoYWxsKCkKLSAgICBmb3IgciBpbiByb3dzOgotICAgICAgbGljZW5zZXNbclsnbmFtZSddXSA9IHJbJ2xpY2Vuc2VfdGV4dCddCi0gICAgaWYgbGVuKGxpY2Vuc2VzKSA+IDA6Ci0gICAgICByZXR1cm4gbGljZW5zZXMKLQotICAgICMgVXNlIGRlZmF1bHQgcGFja2FnZSBsaWNlbnNlCi0gICAgY3Vyc29yID0gc2VsZi5jb25uLmV4ZWN1dGUoJ3NlbGVjdCBtLm5hbWUsIG0ucGFja2FnZSwgbS5saWNfbGljZW5zZV90ZXh0IGFzIGxpY2Vuc2VfdGV4dCAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zyb20gcGFja2FnZV9saWNlbnNlIHBsIGpvaW4gbW9kdWxlcyBtIG9uIHBsLmxpY2Vuc2UgPSBtLm5hbWUgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aGVyZSBwbC5wYWNrYWdlID0gPycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCcvLycgKyBwYWNrYWdlLCkpCi0gICAgcm93cyA9IGN1cnNvci5mZXRjaGFsbCgpCi0gICAgZm9yIHIgaW4gcm93czoKLSAgICAgIGxpY2Vuc2VzW3JbJ25hbWUnXV0gPSByWydsaWNlbnNlX3RleHQnXQotICAgIHJldHVybiBsaWNlbnNlcwotCi0gIGRlZiBnZXRfc29vbmdfbW9kdWxlX29mX2luc3RhbGxlZF9maWxlKHNlbGYsIGluc3RhbGxlZF9maWxlKToKLSAgICBjdXJzb3IgPSBzZWxmLmNvbm4uZXhlY3V0ZSgnc2VsZWN0IG5hbWUsIG0ucGFja2FnZSwgbS5wYWNrYWdlIGFzIG1vZHVsZV9wYXRoLCBtb2R1bGVfdHlwZSBhcyBzb29uZ19tb2R1bGVfdHlwZSwgYnVpbHRfZmlsZXMsIGluc3RhbGxlZF9maWxlcywgc3RhdGljX2RlcF9maWxlcywgd2hvbGVfc3RhdGljX2RlcF9maWxlcyAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zyb20gbW9kdWxlcyBtIGpvaW4gbW9kdWxlX2luc3RhbGxlZF9maWxlIG1pZiBvbiBtLmlkID0gbWlmLm1vZHVsZV9pZCAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3doZXJlIG1pZi5pbnN0YWxsZWRfZmlsZSA9ID8nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnN0YWxsZWRfZmlsZSwpKQotICAgIHJvd3MgPSBjdXJzb3IuZmV0Y2hhbGwoKQotICAgIGN1cnNvci5jbG9zZSgpCi0gICAgaWYgcm93czoKLSAgICAgIHNvb25nX21vZHVsZSA9IGRpY3QoemlwKHJvd3NbMF0ua2V5cygpLCByb3dzWzBdKSkKLSAgICAgIHJldHVybiBzb29uZ19tb2R1bGUKLQotICAgIHJldHVybiBOb25lCi0KLSAgZGVmIGdldF9zb29uZ19tb2R1bGVfb2ZfYnVpbHRfZmlsZShzZWxmLCBidWlsdF9maWxlKToKLSAgICBjdXJzb3IgPSBzZWxmLmNvbm4uZXhlY3V0ZSgnc2VsZWN0IG5hbWUsIG0ucGFja2FnZSwgbS5wYWNrYWdlIGFzIG1vZHVsZV9wYXRoLCBtb2R1bGVfdHlwZSBhcyBzb29uZ19tb2R1bGVfdHlwZSwgYnVpbHRfZmlsZXMsIGluc3RhbGxlZF9maWxlcywgc3RhdGljX2RlcF9maWxlcywgd2hvbGVfc3RhdGljX2RlcF9maWxlcyAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zyb20gbW9kdWxlcyBtIGpvaW4gbW9kdWxlX2J1aWx0X2ZpbGUgbWJmIG9uIG0uaWQgPSBtYmYubW9kdWxlX2lkICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnd2hlcmUgbWJmLmJ1aWx0X2ZpbGUgPSA/JywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYnVpbHRfZmlsZSwpKQotICAgIHJvd3MgPSBjdXJzb3IuZmV0Y2hhbGwoKQotICAgIGN1cnNvci5jbG9zZSgpCi0gICAgaWYgcm93czoKLSAgICAgIHNvb25nX21vZHVsZSA9IGRpY3QoemlwKHJvd3NbMF0ua2V5cygpLCByb3dzWzBdKSkKLSAgICAgIHJldHVybiBzb29uZ19tb2R1bGUKLQotICAgIHJldHVybiBOb25lCi0KLQogZGVmIG1haW4oKToKICAgZ2xvYmFsIGFyZ3MKICAgYXJncyA9IGdldF9hcmdzKCkKICAgbG9nKCdBcmdzOicsIHZhcnMoYXJncykpCiAKICAgZ2xvYmFsIGRiCi0gIGRiID0gTWV0YWRhdGFEYihhcmdzLm1ldGFkYXRhKQorICBkYiA9IGNvbXBsaWFuY2VfbWV0YWRhdGEuTWV0YWRhdGFEYihhcmdzLm1ldGFkYXRhKQorICBpZiBhcmdzLmRlYnVnOgorICAgIGRiLmR1bXBfZGVidWdfZGIob3MucGF0aC5kaXJuYW1lKGFyZ3Mub3V0cHV0X2ZpbGUpICsgJy9jb21wbGlhbmNlLW1ldGFkYXRhLWRlYnVnLmRiJykKKwogICBnbG9iYWwgbWV0YWRhdGFfZmlsZV9wcm90b3MKICAgbWV0YWRhdGFfZmlsZV9wcm90b3MgPSB7fQogICBnbG9iYWwgbGljZW5zZXNfdGV4dApAQCAtODk0LDggKzcwOSwxNyBAQAogICAgICAgICAnaW5zdGFsbGVkX2ZpbGUnOiBkZXBfZmlsZSwKICAgICAgICAgJ2lzX3ByZWJ1aWx0X21ha2VfbW9kdWxlJzogRmFsc2UKICAgICB9Ci0gICAgZmlsZV9tZXRhZGF0YS51cGRhdGUoZGIuZ2V0X3Nvb25nX21vZHVsZV9vZl9idWlsdF9maWxlKGRlcF9maWxlKSkKLSAgICBhZGRfcGFja2FnZV9vZl9maWxlKGZpbGVfaWQsIGZpbGVfbWV0YWRhdGEsIGRvYywgcmVwb3J0KQorICAgIHNvb25nX21vZHVsZSA9IGRiLmdldF9zb29uZ19tb2R1bGVfb2ZfYnVpbHRfZmlsZShkZXBfZmlsZSkKKyAgICBpZiBub3Qgc29vbmdfbW9kdWxlOgorICAgICAgY29udGludWUKKyAgICBmaWxlX21ldGFkYXRhLnVwZGF0ZShzb29uZ19tb2R1bGUpCisgICAgaWYgaXNfc291cmNlX3BhY2thZ2UoZmlsZV9tZXRhZGF0YSkgb3IgaXNfcHJlYnVpbHRfcGFja2FnZShmaWxlX21ldGFkYXRhKToKKyAgICAgIGFkZF9wYWNrYWdlX29mX2ZpbGUoZmlsZV9pZCwgZmlsZV9tZXRhZGF0YSwgZG9jLCByZXBvcnQpCisgICAgZWxzZToKKyAgICAgICMgT3RoZXIgc3RhdGljIGxpYiBmaWxlcyBhcmUgZ2VuZXJhdGVkIGZyb20gdGhlIHBsYXRmb3JtCisgICAgICBkb2MuYWRkX3JlbGF0aW9uc2hpcChzYm9tX2RhdGEuUmVsYXRpb25zaGlwKGlkMT1maWxlX2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWxhdGlvbnNoaXA9c2JvbV9kYXRhLlJlbGF0aW9uc2hpcFR5cGUuR0VORVJBVEVEX0ZST00sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkMj1zYm9tX2RhdGEuU1BEWElEX1BMQVRGT1JNKSkKIAogICAgICMgQWRkIHJlbGF0aW9uc2hpcHMgZm9yIHN0YXRpYyBkZXBzIG9mIHN0YXRpYyBsaWJyYXJpZXMKICAgICBhZGRfc3RhdGljX2RlcHNfb2ZfZmlsZShmaWxlX2lkLCBmaWxlX21ldGFkYXRhLCBkb2MpCmRpZmYgLS1naXQgYS90b29scy9zaWduYXBrL3NyYy9jb20vYW5kcm9pZC9zaWduYXBrL1NpZ25BcGsuamF2YSBiL3Rvb2xzL3NpZ25hcGsvc3JjL2NvbS9hbmRyb2lkL3NpZ25hcGsvU2lnbkFway5qYXZhCmluZGV4IDZiMjM0MWIuLjY1NGUxOTYgMTAwNjQ0Ci0tLSBhL3Rvb2xzL3NpZ25hcGsvc3JjL2NvbS9hbmRyb2lkL3NpZ25hcGsvU2lnbkFway5qYXZhCisrKyBiL3Rvb2xzL3NpZ25hcGsvc3JjL2NvbS9hbmRyb2lkL3NpZ25hcGsvU2lnbkFway5qYXZhCkBAIC0zMDIsNyArMzAyLDYgQEAKICAgICAgICAgICAgIGZpbmFsIEtleVN0b3JlIGtleVN0b3JlLCBmaW5hbCBTdHJpbmcga2V5TmFtZSkKICAgICAgICAgICAgIHRocm93cyBDZXJ0aWZpY2F0ZUV4Y2VwdGlvbiwgS2V5U3RvcmVFeGNlcHRpb24sIE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiwKICAgICAgICAgICAgICAgICAgICAgVW5yZWNvdmVyYWJsZUtleUV4Y2VwdGlvbiwgVW5yZWNvdmVyYWJsZUVudHJ5RXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgS2V5IGtleSA9IGtleVN0b3JlLmdldEtleShrZXlOYW1lLCByZWFkUGFzc3dvcmQoa2V5TmFtZSkpOwogICAgICAgICBmaW5hbCBQcml2YXRlS2V5RW50cnkgcHJpdmF0ZUtleUVudHJ5ID0gKFByaXZhdGVLZXlFbnRyeSkga2V5U3RvcmUuZ2V0RW50cnkoa2V5TmFtZSwgbnVsbCk7CiAgICAgICAgIGlmIChwcml2YXRlS2V5RW50cnkgPT0gbnVsbCkgewogICAgICAgICB0aHJvdyBuZXcgRXJyb3IoCmRpZmYgLS1naXQgYS90b29scy90b29sX2V2ZW50X2xvZ2dlci9PV05FUlMgYi90b29scy90b29sX2V2ZW50X2xvZ2dlci9PV05FUlMKaW5kZXggYjY5MmM5ZS4uZTkzZDIwZiAxMDA2NDQKLS0tIGEvdG9vbHMvdG9vbF9ldmVudF9sb2dnZXIvT1dORVJTCisrKyBiL3Rvb2xzL3Rvb2xfZXZlbnRfbG9nZ2VyL09XTkVSUwpAQCAtMSw0ICsxLDMgQEAKIGluY2x1ZGUgcGxhdGZvcm0vdG9vbHMvYXN1aXRlOi9PV05FUlMKIAogemh1b3lhb0Bnb29nbGUuY29tCi1oemFsZWtAZ29vZ2xlLmNvbQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUK