LyoKICogbWtzd2FwLmMgLSBzZXQgdXAgYSBsaW51eCBzd2FwIGRldmljZQogKgogKiAoQykgMTk5MSBMaW51cyBUb3J2YWxkcy4gVGhpcyBmaWxlIG1heSBiZSByZWRpc3RyaWJ1dGVkIGFzIHBlcgogKiB0aGUgTGludXggY29weXJpZ2h0LgogKi8KCi8qCiAqIDIwLjEyLjkxICAtCXRpbWUgYmVnYW4uIEdvdCBWTSB3b3JraW5nIHllc3RlcmRheSBieSBkb2luZyB0aGlzIGJ5IGhhbmQuCiAqCiAqIFVzYWdlOiBta3N3YXAgWy1jXSBbLXZOXSBbLWZdIGRldmljZSBbc2l6ZS1pbi1ibG9ja3NdCiAqCiAqCS1jICAgZm9yIHJlYWRhYmlsaXR5IGNoZWNraW5nLiAoVXNlIGl0IHVubGVzcyB5b3UgYXJlIFNVUkUhKQogKgktdk4gIGZvciBzd2FwIGFyZWFzIHZlcnNpb24gTi4gKE9ubHkgTj0wLDEga25vd24gdG9kYXkuKQogKiAgICAgIC1mICAgZm9yIGZvcmNpbmcgc3dhcCBjcmVhdGlvbiBldmVuIGlmIGl0IHdvdWxkIHNtYXNoIHBhcnRpdGlvbiB0YWJsZS4KICoKICogVGhlIGRldmljZSBtYXkgYmUgYSBibG9jayBkZXZpY2Ugb3IgYW4gaW1hZ2Ugb2Ygb25lLCBidXQgdGhpcyBpc24ndAogKiBlbmZvcmNlZCAoYnV0IGl0J3Mgbm90IG11Y2ggZnVuIG9uIGEgY2hhcmFjdGVyIGRldmljZSA6LSkuCiAqCiAqIFBhdGNoZXMgZnJvbSBqYWdneUBwdXJwbGV0LmRlbW9uLmNvLnVrIChNaWtlIEphZ2RpcykgdG8gbWFrZSB0aGUKICogc2l6ZS1pbi1ibG9ja3MgcGFyYW1ldGVyIG9wdGlvbmFsIGFkZGVkIFdlZCBGZWIgIDggMTA6MzM6NDMgMTk5NS4KICoKICogVmVyc2lvbiAxIHN3YXAgYXJlYSBjb2RlIChmb3Iga2VybmVsIDIuMS4xMTcpLCBhZWIsIDk4MTAxMC4KICoKICogU3BhcmMgZml4ZXMsIGpqQHVsdHJhLmxpbnV4LmN6IChKYWt1YiBKZWxpbmVrKSwgOTgxMjAxIC0gbWFuZ2xlZCBieSBhZWIuCiAqIFYxX01BWF9QQUdFUyBmaXhlcywgamosIDk5MDMyNS4KICogc3BhcmM2NCBmaXhlcywgamosIDAwMDIxOS4KICoKICogMTk5OS0wMi0yMiBBcmthZGl1c3ogTWm2a2lld2ljeiA8bWlzaWVrQHBsZC5PUkcuUEw+CiAqIC0gYWRkZWQgTmF0aXZlIExhbmd1YWdlIFN1cHBvcnQKICoKICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxsaW1pdHMuaD4KI2luY2x1ZGUgPG1udGVudC5oPgojaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxlcnJuby5oPgojaWZkZWYgSEFWRV9MSUJTRUxJTlVYCiNpbmNsdWRlIDxzZWxpbnV4L3NlbGludXguaD4KI2luY2x1ZGUgPHNlbGludXgvY29udGV4dC5oPgojZW5kaWYKCiNpbmNsdWRlICJsaW51eF92ZXJzaW9uLmgiCiNpbmNsdWRlICJzd2FwaGVhZGVyLmgiCiNpbmNsdWRlICJ4c3RybmNweS5oIgojaW5jbHVkZSAibmxzLmgiCiNpbmNsdWRlICJibGtkZXYuaCIKI2luY2x1ZGUgInBhdGhuYW1lcy5oIgojaW5jbHVkZSAid2hvbGVkaXNrLmgiCgojaWZkZWYgSEFWRV9MSUJVVUlECiMgaWZkZWYgSEFWRV9VVUlEX1VVSURfSAojICBpbmNsdWRlIDx1dWlkL3V1aWQuaD4KIyBlbHNlCiMgIGluY2x1ZGUgPHV1aWQuaD4KIyBlbmRpZgojZW5kaWYKCiNpZmRlZiBIQVZFX0xJQkJMS0lEX0lOVEVSTkFMCiMgaW5jbHVkZSA8YmxraWQuaD4KI2VuZGlmCgpzdGF0aWMgY2hhciAqIHByb2dyYW1fbmFtZSA9ICJta3N3YXAiOwpzdGF0aWMgY2hhciAqIGRldmljZV9uYW1lID0gTlVMTDsKc3RhdGljIGludCBERVYgPSAtMTsKc3RhdGljIHVuc2lnbmVkIGxvbmcgbG9uZyBQQUdFUyA9IDA7CnN0YXRpYyB1bnNpZ25lZCBsb25nIGJhZHBhZ2VzID0gMDsKc3RhdGljIGludCBjaGVjayA9IDA7CgojZGVmaW5lIFNFTElOVVhfU1dBUEZJTEVfVFlQRQkic3dhcGZpbGVfdCIKCiNpZmRlZiBfX3NwYXJjX18KIyBpZmRlZiBfX2FyY2g2NF9fCiMgIGRlZmluZSBpc19zcGFyYzY0KCkgMQojICBkZWZpbmUgaXNfYmU2NCgpIDEKIyBlbHNlIC8qIHNwYXJjMzIgKi8Kc3RhdGljIGludAppc19zcGFyYzY0KHZvaWQpIHsKCXN0cnVjdCB1dHNuYW1lIHVuOwoJc3RhdGljIGludCBzcGFyYzY0ID0gLTE7CgoJaWYgKHNwYXJjNjQgIT0gLTEpIHJldHVybiBzcGFyYzY0OwoJc3BhcmM2NCA9IDA7CgoJaWYgKHVuYW1lKCZ1bikgPCAwKSByZXR1cm4gMDsKCWlmICghIHN0cmNtcCh1bi5tYWNoaW5lLCAic3BhcmM2NCIpKSB7CgkJc3BhcmM2NCA9IDE7CgkJcmV0dXJuIDE7Cgl9CglpZiAoc3RyY21wKHVuLm1hY2hpbmUsICJzcGFyYyIpKQoJCXJldHVybiAwOyAvKiBTaG91bGQgbm90IGhhcHBlbiAqLwoKI2lmZGVmIEhBVkVfUEVSU09OQUxJVFkKCXsKCQlleHRlcm4gaW50IHBlcnNvbmFsaXR5KHVuc2lnbmVkIGxvbmcpOwoJCWludCBvbGRwZXJzOwojZGVmaW5lIFBFUlNfTElOVVggICAgICAgICAgMHgwMDAwMDAwMAojZGVmaW5lIFBFUlNfTElOVVhfMzJCSVQgICAgMHgwMDgwMDAwMAojZGVmaW5lIFBFUlNfTElOVVgzMiAgICAgICAgMHgwMDAwMDAwOAoKCQlvbGRwZXJzID0gcGVyc29uYWxpdHkoUEVSU19MSU5VWF8zMkJJVCk7CgkJaWYgKG9sZHBlcnMgIT0gLTEpIHsKCQkJaWYgKHBlcnNvbmFsaXR5KFBFUlNfTElOVVgpICE9IC0xKSB7CgkJCQl1bmFtZSgmdW4pOwoJCQkJaWYgKCEgc3RyY21wKHVuLm1hY2hpbmUsICJzcGFyYzY0IikpIHsKCQkJCQlzcGFyYzY0ID0gMTsKCQkJCQlvbGRwZXJzID0gUEVSU19MSU5VWDMyOwoJCQkJfQoJCQl9CgkJCXBlcnNvbmFsaXR5KG9sZHBlcnMpOwoJCX0KCX0KI2VuZGlmCgoJcmV0dXJuIHNwYXJjNjQ7Cn0KIyAgZGVmaW5lIGlzX2JlNjQoKSBpc19zcGFyYzY0KCkKIyBlbmRpZiAvKiBzcGFyYzMyICovCiNlbHNlIC8qICFzcGFyYyAqLwojIGRlZmluZSBpc19iZTY0KCkgMAojZW5kaWYKCi8qCiAqIFRoZSBkZWZpbml0aW9uIG9mIHRoZSB1bmlvbiBzd2FwX2hlYWRlciB1c2VzIHRoZSBrZXJuZWwgY29uc3RhbnQgUEFHRV9TSVpFLgogKiBVbmZvcnR1bmF0ZWx5LCBvbiBzb21lIGFyY2hpdGVjdHVyZXMgdGhpcyBkZXBlbmRzIG9uIHRoZSBoYXJkd2FyZSBtb2RlbCwgYW5kCiAqIGNhbiBvbmx5IGJlIGZvdW5kIGF0IHJ1biB0aW1lIC0tIHdlIHVzZSBnZXRwYWdlc2l6ZSgpLCBzbyB0aGF0IHdlIGRvIG5vdAogKiBuZWVkIHNlcGFyYXRlIGJpbmFyaWVzIGUuZy4gZm9yIHN1bjQsIHN1bjRjL2QvbSBhbmQgc3VuNHUuCiAqCiAqIEV2ZW4gbW9yZSB1bmZvcnR1bmF0ZWx5LCBnZXRwYWdlc2l6ZSgpIGRvZXMgbm90IGFsd2F5cyByZXR1cm4gdGhlIHJpZ2h0CiAqIGluZm9ybWF0aW9uLiBGb3IgZXhhbXBsZSwgbGliYzQsIGxpYmM1IGFuZCBnbGliYyAyLjAgZG8gbm90IHVzZSB0aGUgc3lzdGVtCiAqIGNhbGwgYnV0IGludmVudCBhIHZhbHVlIHRoZW1zZWx2ZXMgKEVYRUNfUEFHRVNJWkUgb3IgTkJQRyAqIENMU0laRSBvciBOQlBDKSwKICogYW5kIHRodXMgaXQgbWF5IGhhcHBlbiB0aGF0IGUuZy4gb24gYSBzcGFyYyBrZXJuZWwgUEFHRV9TSVpFPTQwOTYgYW5kCiAqIGdldHBhZ2VzaXplKCkgcmV0dXJucyA4MTkyLgogKgogKiBXaGF0IHRvIGRvPyBMZXQgdXMgYWxsb3cgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgcGFnZXNpemUgZXhwbGljaXRseS4KICoKICovCnN0YXRpYyBpbnQgdXNlcl9wYWdlc2l6ZTsKc3RhdGljIGludCBwYWdlc2l6ZTsKc3RhdGljIHVuc2lnbmVkIGxvbmcgKnNpZ25hdHVyZV9wYWdlID0gTlVMTDsKc3RydWN0IHN3YXBfaGVhZGVyX3YxICpwOwoKc3RhdGljIHZvaWQKaW5pdF9zaWduYXR1cmVfcGFnZSh2b2lkKSB7CgoJaW50IGtlcm5lbF9wYWdlc2l6ZSA9IHBhZ2VzaXplID0gZ2V0cGFnZXNpemUoKTsKCglpZiAodXNlcl9wYWdlc2l6ZSkgewoJCWlmICgodXNlcl9wYWdlc2l6ZSAmICh1c2VyX3BhZ2VzaXplLTEpKSB8fAoJCSAgICB1c2VyX3BhZ2VzaXplIDwgMTAyNCkgewoJCQlmcHJpbnRmKHN0ZGVyciwgXygiQmFkIHVzZXItc3BlY2lmaWVkIHBhZ2Ugc2l6ZSAlZFxuIiksCgkJCQl1c2VyX3BhZ2VzaXplKTsKCQkJZXhpdCgxKTsKCQl9CgkJcGFnZXNpemUgPSB1c2VyX3BhZ2VzaXplOwoJfQoKCWlmICh1c2VyX3BhZ2VzaXplICYmIHVzZXJfcGFnZXNpemUgIT0ga2VybmVsX3BhZ2VzaXplKQoJCWZwcmludGYoc3RkZXJyLCBfKCJVc2luZyB1c2VyLXNwZWNpZmllZCBwYWdlIHNpemUgJWQsICIKCQkJCSAgImluc3RlYWQgb2YgdGhlIHN5c3RlbSB2YWx1ZSAlZFxuIiksCgkJCQlwYWdlc2l6ZSwga2VybmVsX3BhZ2VzaXplKTsKCglzaWduYXR1cmVfcGFnZSA9ICh1bnNpZ25lZCBsb25nICopIG1hbGxvYyhwYWdlc2l6ZSk7CgltZW1zZXQoc2lnbmF0dXJlX3BhZ2UsIDAsIHBhZ2VzaXplKTsKCXAgPSAoc3RydWN0IHN3YXBfaGVhZGVyX3YxICopIHNpZ25hdHVyZV9wYWdlOwp9CgpzdGF0aWMgdm9pZApkZWluaXRfc2lnbmF0dXJlX3BhZ2Uodm9pZCkgewoJZnJlZShzaWduYXR1cmVfcGFnZSk7Cn0KCnN0YXRpYyB2b2lkCndyaXRlX3NpZ25hdHVyZShjaGFyICpzaWcpIHsKCWNoYXIgKnNwID0gKGNoYXIgKikgc2lnbmF0dXJlX3BhZ2U7CgoJc3RybmNweShzcCtwYWdlc2l6ZS0xMCwgc2lnLCAxMCk7Cn0KCnN0YXRpYyB2b2lkCndyaXRlX3V1aWRfYW5kX2xhYmVsKHVuc2lnbmVkIGNoYXIgKnV1aWQsIGNoYXIgKnZvbHVtZV9uYW1lKSB7CglzdHJ1Y3Qgc3dhcF9oZWFkZXJfdjFfMiAqaDsKCgkvKiBTYW5pdHkgY2hlY2sgKi8KCWlmIChzaXplb2Yoc3RydWN0IHN3YXBfaGVhZGVyX3YxKSAhPQoJICAgIHNpemVvZihzdHJ1Y3Qgc3dhcF9oZWFkZXJfdjFfMikpIHsKCQlmcHJpbnRmKHN0ZGVyciwKCQkJXygiQmFkIHN3YXAgaGVhZGVyIHNpemUsIG5vIGxhYmVsIHdyaXR0ZW4uXG4iKSk7CgkJcmV0dXJuOwoJfQoKCWggPSAoc3RydWN0IHN3YXBfaGVhZGVyX3YxXzIgKikgc2lnbmF0dXJlX3BhZ2U7CglpZiAodXVpZCkKCQltZW1jcHkoaC0+dXVpZCwgdXVpZCwgc2l6ZW9mKGgtPnV1aWQpKTsKCWlmICh2b2x1bWVfbmFtZSkgewoJCXhzdHJuY3B5KGgtPnZvbHVtZV9uYW1lLCB2b2x1bWVfbmFtZSwgc2l6ZW9mKGgtPnZvbHVtZV9uYW1lKSk7CgkJaWYgKHN0cmxlbih2b2x1bWVfbmFtZSkgPiBzdHJsZW4oaC0+dm9sdW1lX25hbWUpKQoJCQlmcHJpbnRmKHN0ZGVyciwgXygiTGFiZWwgd2FzIHRydW5jYXRlZC5cbiIpKTsKCX0KCWlmICh1dWlkIHx8IHZvbHVtZV9uYW1lKSB7CgkJaWYgKHZvbHVtZV9uYW1lKQoJCQlwcmludGYoIkxBQkVMPSVzLCAiLCBoLT52b2x1bWVfbmFtZSk7CgkJZWxzZQoJCQlwcmludGYoXygibm8gbGFiZWwsICIpKTsKI2lmZGVmIEhBVkVfTElCVVVJRAoJCWlmICh1dWlkKSB7CgkJCWNoYXIgdXVpZF9zdHJpbmdbMzddOwoJCQl1dWlkX3VucGFyc2UodXVpZCwgdXVpZF9zdHJpbmcpOwoJCQlwcmludGYoIlVVSUQ9JXNcbiIsIHV1aWRfc3RyaW5nKTsKCQl9IGVsc2UKI2VuZGlmCgkJCXByaW50ZihfKCJubyB1dWlkXG4iKSk7Cgl9Cn0KCi8qCiAqIEZpbmQgb3V0IHdoYXQgdGhlIG1heGltdW0gYW1vdW50IG9mIHN3YXAgc3BhY2UgaXMgdGhhdCB0aGUga2VybmVsIHdpbGwKICogaGFuZGxlLiAgVGhpcyB3b3VsZG4ndCBtYXR0ZXIgaWYgdGhlIGtlcm5lbCBqdXN0IHVzZWQgYXMgbXVjaCBvZiB0aGUKICogc3dhcCBzcGFjZSBhcyBpdCBjYW4gaGFuZGxlLCBidXQgdW50aWwgMi4zLjQgaXQgd291bGQgcmV0dXJuIGFuIGVycm9yCiAqIHRvIHN3YXBvbigpIGlmIHRoZSBzd2Fwc3BhY2Ugd2FzIHRvbyBsYXJnZS4KICovCi8qIEJlZm9yZSAyLjIuMHByZTkgKi8KI2RlZmluZSBWMV9PTERfTUFYX1BBR0VTCSgoMHg3ZmZmZmZmZiAvIHBhZ2VzaXplKSAtIDEpCi8qIFNpbmNlIDIuMi4wcHJlOSwgYmVmb3JlIDIuMy40OgogICBlcnJvciBpZiBuciBvZiBwYWdlcyA+PSBTV1BfT0ZGU0VUKFNXUF9FTlRSWSgwLH4wVUwpKQogICB3aXRoIHZhcmlhdGlvbnMgb24KCSNkZWZpbmUgU1dQX0VOVFJZKHR5cGUsb2Zmc2V0KSAoKCh0eXBlKSA8PCAxKSB8ICgob2Zmc2V0KSA8PCA4KSkKCSNkZWZpbmUgU1dQX09GRlNFVChlbnRyeSkgKChlbnRyeSkgPj4gOCkKICAgb24gdGhlIHZhcmlvdXMgYXJjaGl0ZWN0dXJlcy4gQmVsb3cgdGhlIHJlc3VsdCAtIHl1ay4KCiAgIE1hY2hpbmUJcGFnZXNpemUJU1dQX0VOVFJZCVNXUF9PRkZTRVQJYm91bmQrMQlvbGRib3VuZCsyCiAgIGkzODYJCTJeMTIJCW88PDgJCWU+PjgJCTE8PDI0CTE8PDE5CiAgIG1pcHMJCTJeMTIJCW88PDE1CQllPj4xNQkJMTw8MTcJMTw8MTkKICAgYWxwaGEJMl4xMwkJbzw8NDAJCWU+PjQwCQkxPDwyNAkxPDwxOAogICBtNjhrCQkyXjEyCQlvPDwxMgkJZT4+MTIJCTE8PDIwCTE8PDE5CiAgIHNwYXJjCTJeezEyLDEzfQkobyYweDNmZmZmKTw8OQkoZT4+OSkmMHgzZmZmZgkxPDwxOAkxPDx7MTksMTh9CiAgIHNwYXJjNjQJMl4xMwkJbzw8MTMJCWU+PjEzCQkxPDw1MQkxPDwxOAogICBwcGMJCTJeMTIJCW88PDgJCWU+PjgJCTE8PDI0CTE8PDE5CiAgIGFybW8JCTJeezEzLDE0LDE1fQlvPDw4CQllPj44CQkxPDwyNAkxPDx7MTgsMTcsMTZ9CiAgIGFybXYJCTJeMTIJCW88PDkJCWU+PjkJCTE8PDIzCTE8PDE5CgogICBhc3N1bWluZyB0aGF0IGxvbmdzIGhhdmUgNjQgYml0cyBvbiBhbHBoYSBhbmQgc3BhcmM2NCBhbmQgMzIgYml0cyBlbHNld2hlcmUuCgogICBUaGUgYmFkIHBhcnQgaXMgdGhhdCB3ZSBuZWVkIHRvIGtub3cgdGhpcyBzaW5jZSB0aGUga2VybmVsIHdpbGwKICAgcmVmdXNlIGEgc3dhcCBzcGFjZSBpZiBpdCBpcyB0b28gbGFyZ2UuCiovCi8qIHBhdGNoIGZyb20gamogLSB3aHkgZG9lcyB0aGlzIGRpZmZlciBmcm9tIHRoZSBhYm92ZT8gKi8KLyogMzJiaXQga2VybmVscyBoYXZlIGEgc2Vjb25kIGxpbWl0YXRpb24gb2YgMkdCLCBzcGFyYzY0IGlzIGxpbWl0ZWQgYnkKICAgdGhlIHNpemUgb2YgdmlydHVhbCBhZGRyZXNzIHNwYWNlIGFsbG9jYXRpb24gZm9yIHZtYWxsb2MgKi8KI2lmIGRlZmluZWQoX19hbHBoYV9fKQojZGVmaW5lIFYxX01BWF9QQUdFUyAgICAgICAgICAgKCgxIDw8IDI0KSAtIDEpCiNlbGlmIGRlZmluZWQoX19taXBzX18pCiNkZWZpbmUgVjFfTUFYX1BBR0VTICAgICAgICAgICAoKDEgPDwgMTcpIC0gMSkKI2VsaWYgZGVmaW5lZChfX3NwYXJjX18pCiNkZWZpbmUgVjFfTUFYX1BBR0VTICAgICAgICAgICAoaXNfc3BhcmM2NCgpID8gKCgzIDw8IDI5KSAtIDEpIDogKCgxIDw8IDE4KSAtIDEpKQojZWxpZiBkZWZpbmVkKF9faWE2NF9fKQovKgogKiBUaGUgYWN0dWFsIHNpemUgd2lsbCBkZXBlbmQgb24gdGhlIGFtb3VudCBvZiB2aXJ0dWFsIGFkZHJlc3Mgc3BhY2UKICogYXZhaWxhYmxlIHRvIHZtYWxsb2MgdGhlIHN3YXAgbWFwLgogKi8KI2RlZmluZSBWMV9NQVhfUEFHRVMgICAgICAgICAgKCgxVUwgPDwgNTQpIC0gMSkKI2Vsc2UKI2RlZmluZSBWMV9NQVhfUEFHRVMgICAgICAgICAgIFYxX09MRF9NQVhfUEFHRVMKI2VuZGlmCi8qIG1hbiBwYWdlIG5vdyBzYXlzOgpUaGUgbWF4aW11bSB1c2VmdWwgc2l6ZSBvZiBhIHN3YXAgYXJlYSBub3cgZGVwZW5kcyBvbiB0aGUgYXJjaGl0ZWN0dXJlLgpJdCBpcyByb3VnaGx5IDJHQiBvbiBpMzg2LCBQUEMsIG02OGssIEFSTSwgMUdCIG9uIHNwYXJjLCA1MTJNQiBvbiBtaXBzLAoxMjhHQiBvbiBhbHBoYSBhbmQgM1RCIG9uIHNwYXJjNjQuCiovCgojZGVmaW5lIE1BWF9CQURQQUdFUwkoKHBhZ2VzaXplLTEwMjQtMTI4KnNpemVvZihpbnQpLTEwKS9zaXplb2YoaW50KSkKI2RlZmluZSBNSU5fR09PRFBBR0VTCTEwCgpzdGF0aWMgdm9pZAp1c2FnZSh2b2lkKSB7CglmcHJpbnRmKHN0ZGVyciwKCQlfKCJVc2FnZTogJXMgWy1jXSBbLXBQQUdFU1pdIFstTCBsYWJlbF0gWy1VIFVVSURdIC9kZXYvbmFtZSBbYmxvY2tzXVxuIiksCgkJcHJvZ3JhbV9uYW1lKTsKCWV4aXQoMSk7Cn0KCnN0YXRpYyB2b2lkCmRpZShjb25zdCBjaGFyICpzdHIpIHsKCWZwcmludGYoc3RkZXJyLCAiJXM6ICVzXG4iLCBwcm9ncmFtX25hbWUsIHN0cik7CglleGl0KDEpOwp9CgpzdGF0aWMgdm9pZApwYWdlX2JhZChpbnQgcGFnZSkgewoJaWYgKGJhZHBhZ2VzID09IE1BWF9CQURQQUdFUykKCQlkaWUoXygidG9vIG1hbnkgYmFkIHBhZ2VzIikpOwoJcC0+YmFkcGFnZXNbYmFkcGFnZXNdID0gcGFnZTsKCWJhZHBhZ2VzKys7Cn0KCnN0YXRpYyB2b2lkCmNoZWNrX2Jsb2Nrcyh2b2lkKSB7Cgl1bnNpZ25lZCBpbnQgY3VycmVudF9wYWdlOwoJaW50IGRvX3NlZWsgPSAxOwoJY2hhciAqYnVmZmVyOwoKCWJ1ZmZlciA9IG1hbGxvYyhwYWdlc2l6ZSk7CglpZiAoIWJ1ZmZlcikKCQlkaWUoXygiT3V0IG9mIG1lbW9yeSIpKTsKCWN1cnJlbnRfcGFnZSA9IDA7Cgl3aGlsZSAoY3VycmVudF9wYWdlIDwgUEFHRVMpIHsKCQlpZiAoZG9fc2VlayAmJiBsc2VlayhERVYsY3VycmVudF9wYWdlKnBhZ2VzaXplLFNFRUtfU0VUKSAhPQoJCSAgICBjdXJyZW50X3BhZ2UqcGFnZXNpemUpCgkJCWRpZShfKCJzZWVrIGZhaWxlZCBpbiBjaGVja19ibG9ja3MiKSk7CgkJaWYgKChkb19zZWVrID0gKHBhZ2VzaXplICE9IHJlYWQoREVWLCBidWZmZXIsIHBhZ2VzaXplKSkpKQoJCQlwYWdlX2JhZChjdXJyZW50X3BhZ2UpOwoJCWN1cnJlbnRfcGFnZSsrOwoJfQoJaWYgKGJhZHBhZ2VzID09IDEpCgkJcHJpbnRmKF8oIm9uZSBiYWQgcGFnZVxuIikpOwoJZWxzZSBpZiAoYmFkcGFnZXMgPiAxKQoJCXByaW50ZihfKCIlbHUgYmFkIHBhZ2VzXG4iKSwgYmFkcGFnZXMpOwoJZnJlZShidWZmZXIpOwp9CgovKiByZXR1cm4gc2l6ZSBpbiBwYWdlcyAqLwpzdGF0aWMgdW5zaWduZWQgbG9uZyBsb25nCmdldF9zaXplKGNvbnN0IGNoYXIgICpmaWxlKSB7CglpbnQJZmQ7Cgl1bnNpZ25lZCBsb25nIGxvbmcgc2l6ZTsKCglmZCA9IG9wZW4oZmlsZSwgT19SRE9OTFkpOwoJaWYgKGZkIDwgMCkgewoJCXBlcnJvcihmaWxlKTsKCQlleGl0KDEpOwoJfQoJaWYgKGJsa2Rldl9nZXRfc2l6ZShmZCwgJnNpemUpID09IDApCgkJc2l6ZSAvPSBwYWdlc2l6ZTsKCWVsc2UKCQlzaXplID0gYmxrZGV2X2ZpbmRfc2l6ZShmZCkgLyBwYWdlc2l6ZTsKCgljbG9zZShmZCk7CglyZXR1cm4gc2l6ZTsKfQoKc3RhdGljIGludAppc256ZGlnaXQoY2hhciBjKSB7CglyZXR1cm4gKGMgPj0gJzEnICYmIGMgPD0gJzknKTsKfQoKCi8qCiAqIENoZWNrIHRvIG1ha2UgY2VydGFpbiB0aGF0IG91ciBuZXcgZmlsZXN5c3RlbSB3b24ndCBiZSBjcmVhdGVkIG9uCiAqIGFuIGFscmVhZHkgbW91bnRlZCBwYXJ0aXRpb24uICBDb2RlIGFkYXB0ZWQgZnJvbSBta2UyZnMsIENvcHlyaWdodAogKiAoQykgMTk5NCBUaGVvZG9yZSBUcydvLiAgQWxzbyBsaWNlbnNlZCB1bmRlciBHUEwuCiAqIChDKSAyMDA2IEthcmVsIFphayAtLSBwb3J0IHRvIG1rc3dhcAogKi8Kc3RhdGljIGludApjaGVja19tb3VudCh2b2lkKSB7CglGSUxFICogZjsKCXN0cnVjdCBtbnRlbnQgKiBtbnQ7CgoJaWYgKChmID0gc2V0bW50ZW50IChfUEFUSF9NT1VOVEVELCAiciIpKSA9PSBOVUxMKQoJCXJldHVybiAwOwoJd2hpbGUgKChtbnQgPSBnZXRtbnRlbnQgKGYpKSAhPSBOVUxMKQoJCWlmIChzdHJjbXAgKGRldmljZV9uYW1lLCBtbnQtPm1udF9mc25hbWUpID09IDApCgkJCWJyZWFrOwoJZW5kbW50ZW50IChmKTsKCWlmICghbW50KQoJCXJldHVybiAwOwoJcmV0dXJuIDE7Cn0KCgpzdGF0aWMgaW50CndyaXRlX2FsbChpbnQgZmQsIGNvbnN0IHZvaWQgKmJ1Ziwgc2l6ZV90IGNvdW50KSB7Cgl3aGlsZShjb3VudCkgewoJCXNzaXplX3QgdG1wOwoKCQllcnJubyA9IDA7CgkJdG1wID0gd3JpdGUoZmQsIGJ1ZiwgY291bnQpOwoJCWlmICh0bXAgPiAwKSB7CgkJCWNvdW50IC09IHRtcDsKCQkJaWYgKGNvdW50KQoJCQkJYnVmICs9IHRtcDsKCQl9IGVsc2UgaWYgKGVycm5vICE9IEVJTlRSICYmIGVycm5vICE9IEVBR0FJTikKCQkJcmV0dXJuIC0xOwoJfQoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkCnphcF9ib290Yml0cyhpbnQgZmQsIGNvbnN0IGNoYXIgKmRldm5hbWUsIGludCBmb3JjZSkKewoJY2hhciAqdHlwZSA9IE5VTEw7CglpbnQgd2hvbGUgPSAwOwoJaW50IHphcCA9IDE7CgoJaWYgKCFmb3JjZSkgewoJCWlmIChsc2VlayhmZCwgMCwgU0VFS19TRVQpICE9IDApCgkgICAgICAgICAgICAgICAgZGllKF8oInVuYWJsZSB0byByZXdpbmQgc3dhcC1kZXZpY2UiKSk7CgoJCWlmIChpc193aG9sZV9kaXNrX2ZkKGZkLCBkZXZuYW1lKSkgewoJCQkvKiBkb24ndCB6YXAgYm9vdGJpdHMgb24gd2hvbGUgZGlzayAtLSB3ZSBrbm93IG5vdGhpbmcKCQkJICogYWJvdXQgYm9vdGxvYWRlcnMgb24gdGhlIGRldmljZSAqLwoJCQl3aG9sZSA9IDE7CgkJCXphcCA9IDA7CgkJfSBlbHNlIHsKI2lmZGVmIEhBVkVfTElCQkxLSURfSU5URVJOQUwKCQkJYmxraWRfcHJvYmUgcHIgPSBibGtpZF9uZXdfcHJvYmUoKTsKCQkJaWYgKCFwcikKCQkJCWRpZShfKCJ1bmFibGUgdG8gYWxsb2MgbmV3IGxpYmJsa2lkIHByb2JlIikpOwoJCQlpZiAoYmxraWRfcHJvYmVfc2V0X2RldmljZShwciwgZmQsIDAsIDApKQoJCQkJZGllKF8oInVuYWJsZSB0byBhc3NpZ24gZGV2aWNlIHRvIGxpYmxraWQgcHJvYmUiKSk7CgoJCQlibGtpZF9wcm9iZV9lbmFibGVfcGFydGl0aW9ucyhwciwgMSk7CgkJCWJsa2lkX3Byb2JlX2VuYWJsZV9zdXBlcmJsb2NrcyhwciwgMCk7CgoJCQlpZiAoYmxraWRfZG9fZnVsbHByb2JlKHByKSA9PSAwKQoJCQkJYmxraWRfcHJvYmVfbG9va3VwX3ZhbHVlKHByLCAiUFRUWVBFIiwKCQkJCQkJKGNvbnN0IGNoYXIgKiopICZ0eXBlLCBOVUxMKTsKCQkJaWYgKHR5cGUpIHsKCQkJCXR5cGUgPSBzdHJkdXAodHlwZSk7CgkJCQl6YXAgPSAwOwoJCQl9CgkJCWJsa2lkX2ZyZWVfcHJvYmUocHIpOwojZWxzZQoJCQkvKiBkb24ndCB6YXAgaWYgY29tcGlsZWQgd2l0aG91dCBsaWJibGtpZCAqLwoJCQl6YXAgPSAwOwojZW5kaWYKCQl9Cgl9CgoJaWYgKHphcCkgewoJCWNoYXIgYnVmWzEwMjRdOwoKCQlpZiAobHNlZWsoZmQsIDAsIFNFRUtfU0VUKSAhPSAwKQoJICAgICAgICAgICAgICAgIGRpZShfKCJ1bmFibGUgdG8gcmV3aW5kIHN3YXAtZGV2aWNlIikpOwoKCQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CgkJaWYgKHdyaXRlX2FsbChmZCwgYnVmLCBzaXplb2YoYnVmKSkpCgkJCWRpZShfKCJ1bmFibGUgdG8gZXJhc2UgYm9vdGJpdHMgc2VjdG9ycyIpKTsKCQlyZXR1cm47Cgl9CgoJZnByaW50ZihzdGRlcnIsIF8oIiVzOiAlczogd2FybmluZzogZG9uJ3QgZXJhc2UgYm9vdGJpdHMgc2VjdG9yc1xuIiksCgkJcHJvZ3JhbV9uYW1lLCBkZXZuYW1lKTsKCWlmICh0eXBlKQoJCWZwcmludGYoc3RkZXJyLCBfKCIgICAgICAgICglcyBwYXJ0aXRpb24gdGFibGUgZGV0ZWN0ZWQpLiAiKSwgdHlwZSk7CgllbHNlIGlmICh3aG9sZSkKCQlmcHJpbnRmKHN0ZGVyciwgXygiICAgICAgICBvbiB3aG9sZSBkaXNrLiAiKSk7CgllbHNlCgkJZnByaW50ZihzdGRlcnIsIF8oIiAgICAgICAgKGNvbXBpbGVkIHdpdGhvdXQgbGliYmxraWQpLiAiKSk7CglmcHJpbnRmKHN0ZGVyciwgIlVzZSAtZiB0byBmb3JjZS5cbiIpOwp9CgppbnQKbWFpbihpbnQgYXJnYywgY2hhciAqKiBhcmd2KSB7CglzdHJ1Y3Qgc3RhdCBzdGF0YnVmOwoJaW50IGk7Cgl1bnNpZ25lZCBsb25nIGxvbmcgbWF4cGFnZXM7Cgl1bnNpZ25lZCBsb25nIGxvbmcgZ29vZHBhZ2VzOwoJdW5zaWduZWQgbG9uZyBsb25nIHN6OwoJb2ZmX3Qgb2Zmc2V0OwoJaW50IGZvcmNlID0gMDsKCWludCB2ZXJzaW9uID0gMTsKCWNoYXIgKmJsb2NrX2NvdW50ID0gMDsKCWNoYXIgKnBwOwoJY2hhciAqb3B0X2xhYmVsID0gTlVMTDsKCXVuc2lnbmVkIGNoYXIgKnV1aWQgPSBOVUxMOwojaWZkZWYgSEFWRV9MSUJVVUlECgljb25zdCBjaGFyICpvcHRfdXVpZCA9IE5VTEw7Cgl1dWlkX3QgdXVpZF9kYXQ7CiNlbmRpZgoKCXByb2dyYW1fbmFtZSA9IChhcmdjICYmICphcmd2KSA/IGFyZ3ZbMF0gOiAibWtzd2FwIjsKCWlmICgocHAgPSBzdHJyY2hyKHByb2dyYW1fbmFtZSwgJy8nKSkgIT0gTlVMTCkKCQlwcm9ncmFtX25hbWUgPSBwcCsxOwoKCXNldGxvY2FsZShMQ19BTEwsICIiKTsKCWJpbmR0ZXh0ZG9tYWluKFBBQ0tBR0UsIExPQ0FMRURJUik7Cgl0ZXh0ZG9tYWluKFBBQ0tBR0UpOwoKCWlmIChhcmdjID09IDIgJiYKCSAgICAoIXN0cmNtcChhcmd2WzFdLCAiLVYiKSB8fCAhc3RyY21wKGFyZ3ZbMV0sICItLXZlcnNpb24iKSkpIHsKCQlwcmludGYoXygiJXMgKCVzKVxuIiksIHByb2dyYW1fbmFtZSwgUEFDS0FHRV9TVFJJTkcpOwoJCWV4aXQoMCk7Cgl9CgoJZm9yIChpPTE7IGk8YXJnYzsgaSsrKSB7CgkJaWYgKGFyZ3ZbaV1bMF0gPT0gJy0nKSB7CgkJCXN3aXRjaCAoYXJndltpXVsxXSkgewoJCQkJY2FzZSAnYyc6CgkJCQkJY2hlY2s9MTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ2YnOgoJCQkJCWZvcmNlPTE7CgkJCQkJYnJlYWs7CgkJCQljYXNlICdwJzoKCQkJCQlwcCA9IGFyZ3ZbaV0rMjsKCQkJCQlpZiAoISpwcCAmJiBpKzEgPCBhcmdjKQoJCQkJCQlwcCA9IGFyZ3ZbKytpXTsKCQkJCQlpZiAoaXNuemRpZ2l0KCpwcCkpCgkJCQkJCXVzZXJfcGFnZXNpemUgPSBhdG9pKHBwKTsKCQkJCQllbHNlCgkJCQkJCXVzYWdlKCk7CgkJCQkJYnJlYWs7CgkJCSAgICAgICAgY2FzZSAnTCc6CgkJCQkJcHAgPSBhcmd2W2ldKzI7CgkJCQkJaWYgKCEqcHAgJiYgaSsxIDwgYXJnYykKCQkJCQkJcHAgPSBhcmd2WysraV07CgkJCQkJb3B0X2xhYmVsID0gcHA7CgkJCQkgICAgICAgIGJyZWFrOwoJCQkJY2FzZSAndic6CgkJCQkJdmVyc2lvbiA9IGF0b2koYXJndltpXSsyKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgJ1UnOgojaWZkZWYgSEFWRV9MSUJVVUlECgkJCQkJb3B0X3V1aWQgPSBhcmd2W2ldKzI7CgkJCQkJaWYgKCEqb3B0X3V1aWQgJiYgaSsxIDwgYXJnYykKCQkJCQkJb3B0X3V1aWQgPSBhcmd2WysraV07CiNlbHNlCgkJCQkJZnByaW50ZihzdGRlcnIsIF8oIiUxJHM6IHdhcm5pbmc6IGlnbm9yZSAtVSAoVVVJRHMgYXJlIHVuc3VwcG9ydGVkIGJ5ICUxJHMpXG4iKSwKCQkJCQkJcHJvZ3JhbV9uYW1lKTsKI2VuZGlmCgkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCXVzYWdlKCk7CgkJCX0KCQl9IGVsc2UgaWYgKCFkZXZpY2VfbmFtZSkgewoJCQlkZXZpY2VfbmFtZSA9IGFyZ3ZbaV07CgkJfSBlbHNlIGlmICghYmxvY2tfY291bnQpIHsKCQkJYmxvY2tfY291bnQgPSBhcmd2W2ldOwoJCX0gZWxzZQoJCQl1c2FnZSgpOwoJfQoKCWlmICh2ZXJzaW9uICE9IDEpIHsKCQlmcHJpbnRmKHN0ZGVyciwgXygiJXM6IGRvZXMgbm90IHN1cHBvcnQgc3dhcHNwYWNlIHZlcnNpb24gJWQuXG4iKSwKCQkJcHJvZ3JhbV9uYW1lLCB2ZXJzaW9uKTsKCQlleGl0KEVYSVRfRkFJTFVSRSk7Cgl9CgojaWZkZWYgSEFWRV9MSUJVVUlECglpZihvcHRfdXVpZCkgewoJCWlmICh1dWlkX3BhcnNlKG9wdF91dWlkLCB1dWlkX2RhdCkgIT0gMCkKCQkJZGllKF8oImVycm9yOiBVVUlEIHBhcnNpbmcgZmFpbGVkIikpOwoJfSBlbHNlCgkJdXVpZF9nZW5lcmF0ZSh1dWlkX2RhdCk7Cgl1dWlkID0gdXVpZF9kYXQ7CiNlbmRpZgoKCWluaXRfc2lnbmF0dXJlX3BhZ2UoKTsJLyogZ2V0IHBhZ2VzaXplICovCglhdGV4aXQoZGVpbml0X3NpZ25hdHVyZV9wYWdlKTsKCglpZiAoIWRldmljZV9uYW1lKSB7CgkJZnByaW50ZihzdGRlcnIsCgkJCV8oIiVzOiBlcnJvcjogTm93aGVyZSB0byBzZXQgdXAgc3dhcCBvbj9cbiIpLAoJCQlwcm9ncmFtX25hbWUpOwoJCXVzYWdlKCk7Cgl9CglpZiAoYmxvY2tfY291bnQpIHsKCQkvKiB0aGlzIHNpbGx5IHVzZXIgc3BlY2lmaWVkIHRoZSBudW1iZXIgb2YgYmxvY2tzCgkJICAgZXhwbGljaXRseSAqLwoJCWNoYXIgKnRtcDsKCQlpbnQgYmxvY2tzX3Blcl9wYWdlID0gcGFnZXNpemUvMTAyNDsKCQlQQUdFUyA9IHN0cnRvdWxsKGJsb2NrX2NvdW50LCZ0bXAsMCkvYmxvY2tzX3Blcl9wYWdlOwoJCWlmICgqdG1wKQoJCQl1c2FnZSgpOwoJfQoJc3ogPSBnZXRfc2l6ZShkZXZpY2VfbmFtZSk7CglpZiAoIVBBR0VTKSB7CgkJUEFHRVMgPSBzejsKCX0gZWxzZSBpZiAoUEFHRVMgPiBzeiAmJiAhZm9yY2UpIHsKCQlmcHJpbnRmKHN0ZGVyciwKCQkJXygiJXM6IGVycm9yOiAiCgkJCSAgInNpemUgJWxsdSBLaUIgaXMgbGFyZ2VyIHRoYW4gZGV2aWNlIHNpemUgJWxsdSBLaUJcbiIpLAoJCQlwcm9ncmFtX25hbWUsCgkJCVBBR0VTKihwYWdlc2l6ZS8xMDI0KSwgc3oqKHBhZ2VzaXplLzEwMjQpKTsKCQlleGl0KDEpOwoJfQoKCWlmIChQQUdFUyA8IE1JTl9HT09EUEFHRVMpIHsKCQlmcHJpbnRmKHN0ZGVyciwKCQkJXygiJXM6IGVycm9yOiBzd2FwIGFyZWEgbmVlZHMgdG8gYmUgYXQgbGVhc3QgJWxkIEtpQlxuIiksCgkJCXByb2dyYW1fbmFtZSwgKGxvbmcpKE1JTl9HT09EUEFHRVMgKiBwYWdlc2l6ZS8xMDI0KSk7CgkJdXNhZ2UoKTsKCX0KCiNpZmRlZiBfX2xpbnV4X18KCWlmIChnZXRfbGludXhfdmVyc2lvbigpID49IEtFUk5FTF9WRVJTSU9OKDIsMyw0KSkKCQltYXhwYWdlcyA9IFVJTlRfTUFYICsgMVVMTDsKCWVsc2UgaWYgKGdldF9saW51eF92ZXJzaW9uKCkgPj0gS0VSTkVMX1ZFUlNJT04oMiwyLDEpKQoJCW1heHBhZ2VzID0gVjFfTUFYX1BBR0VTOwoJZWxzZQojZW5kaWYKCQltYXhwYWdlcyA9IFYxX09MRF9NQVhfUEFHRVM7CgoJaWYgKFBBR0VTID4gbWF4cGFnZXMpIHsKCQlQQUdFUyA9IG1heHBhZ2VzOwoJCWZwcmludGYoc3RkZXJyLAoJCQlfKCIlczogd2FybmluZzogdHJ1bmNhdGluZyBzd2FwIGFyZWEgdG8gJWxsdSBLaUJcbiIpLAoJCQlwcm9ncmFtX25hbWUsIFBBR0VTICogcGFnZXNpemUgLyAxMDI0KTsKCX0KCglpZiAoc3RhdChkZXZpY2VfbmFtZSwgJnN0YXRidWYpIDwgMCkgewoJCXBlcnJvcihkZXZpY2VfbmFtZSk7CgkJZXhpdChFWElUX0ZBSUxVUkUpOwoJfQoJaWYgKFNfSVNCTEsoc3RhdGJ1Zi5zdF9tb2RlKSkKCQlERVYgPSBvcGVuKGRldmljZV9uYW1lLCBPX1JEV1IgfCBPX0VYQ0wpOwoJZWxzZQoJCURFViA9IG9wZW4oZGV2aWNlX25hbWUsIE9fUkRXUik7CgoJaWYgKERFViA8IDApIHsKCQlwZXJyb3IoZGV2aWNlX25hbWUpOwoJCWV4aXQoMSk7Cgl9CgoJLyogV2FudCBhIGJsb2NrIGRldmljZS4gUHJvYmFibHkgbm90IC9kZXYvaGRhIG9yIC9kZXYvaGRiLiAqLwoJaWYgKCFTX0lTQkxLKHN0YXRidWYuc3RfbW9kZSkpCgkJY2hlY2s9MDsKCWVsc2UgaWYgKHN0YXRidWYuc3RfcmRldiA9PSAweDAzMDAgfHwgc3RhdGJ1Zi5zdF9yZGV2ID09IDB4MDM0MCkgewoJCWZwcmludGYoc3RkZXJyLAoJCQlfKCIlczogZXJyb3I6ICIKCQkJICAid2lsbCBub3QgdHJ5IHRvIG1ha2Ugc3dhcGRldmljZSBvbiAnJXMnXG4iKSwKCQkJcHJvZ3JhbV9uYW1lLCBkZXZpY2VfbmFtZSk7CgkJZXhpdCgxKTsKCX0gZWxzZSBpZiAoY2hlY2tfbW91bnQoKSkgewoJCWZwcmludGYoc3RkZXJyLAoJCQlfKCIlczogZXJyb3I6ICIKCQkJICAiJXMgaXMgbW91bnRlZDsgd2lsbCBub3QgbWFrZSBzd2Fwc3BhY2UuXG4iKSwKCQkJcHJvZ3JhbV9uYW1lLCBkZXZpY2VfbmFtZSk7CgkJZXhpdCgxKTsKCX0KCglpZiAoY2hlY2spCgkJY2hlY2tfYmxvY2tzKCk7CgoJemFwX2Jvb3RiaXRzKERFViwgZGV2aWNlX25hbWUsIGZvcmNlKTsKCglwLT52ZXJzaW9uID0gMTsKCXAtPmxhc3RfcGFnZSA9IFBBR0VTLTE7CglwLT5ucl9iYWRwYWdlcyA9IGJhZHBhZ2VzOwoKCWlmIChiYWRwYWdlcyA+IFBBR0VTIC0gTUlOX0dPT0RQQUdFUykKCQlkaWUoXygiVW5hYmxlIHRvIHNldCB1cCBzd2FwLXNwYWNlOiB1bnJlYWRhYmxlIikpOwoKCWdvb2RwYWdlcyA9IFBBR0VTIC0gYmFkcGFnZXMgLSAxOwoJcHJpbnRmKF8oIlNldHRpbmcgdXAgc3dhcHNwYWNlIHZlcnNpb24gMSwgc2l6ZSA9ICVsbHUgS2lCXG4iKSwKCQlnb29kcGFnZXMgKiBwYWdlc2l6ZSAvIDEwMjQpOwoKCXdyaXRlX3NpZ25hdHVyZSgiU1dBUFNQQUNFMiIpOwoJd3JpdGVfdXVpZF9hbmRfbGFiZWwodXVpZCwgb3B0X2xhYmVsKTsKCglvZmZzZXQgPSAxMDI0OwoJaWYgKGxzZWVrKERFViwgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gb2Zmc2V0KQoJCWRpZShfKCJ1bmFibGUgdG8gcmV3aW5kIHN3YXAtZGV2aWNlIikpOwoJaWYgKHdyaXRlX2FsbChERVYsIChjaGFyICopIHNpZ25hdHVyZV9wYWdlICsgb2Zmc2V0LAoJCQkJICAgIHBhZ2VzaXplIC0gb2Zmc2V0KSA9PSAtMSkgewoJCWZwcmludGYoc3RkZXJyLCBfKCIlczogJXM6IHVuYWJsZSB0byB3cml0ZSBzaWduYXR1cmUgcGFnZTogJXMiKSwKCQkJcHJvZ3JhbV9uYW1lLCBkZXZpY2VfbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKCQlleGl0KDEpOwoJfQoKCS8qCgkgKiBBIHN1YnNlcXVlbnQgc3dhcG9uKCkgd2lsbCBmYWlsIGlmIHRoZSBzaWduYXR1cmUKCSAqIGlzIG5vdCBhY3R1YWxseSBvbiBkaXNrLiAoVGhpcyBpcyBhIGtlcm5lbCBidWcuKQoJICovCiNpZmRlZiBIQVZFX0ZTWU5DCglpZiAoZnN5bmMoREVWKSkKCQkgZGllKF8oImZzeW5jIGZhaWxlZCIpKTsKI2VuZGlmCgojaWZkZWYgSEFWRV9MSUJTRUxJTlVYCglpZiAoU19JU1JFRyhzdGF0YnVmLnN0X21vZGUpICYmIGlzX3NlbGludXhfZW5hYmxlZCgpID4gMCkgewoJCXNlY3VyaXR5X2NvbnRleHRfdCBjb250ZXh0X3N0cmluZzsKCQlzZWN1cml0eV9jb250ZXh0X3Qgb2xkY29udGV4dDsKCQljb250ZXh0X3QgbmV3Y29udGV4dDsKCgkJaWYgKGZnZXRmaWxlY29uKERFViwgJm9sZGNvbnRleHQpIDwgMCkgewoJCQlpZiAoZXJybm8gIT0gRU5PREFUQSkgewoJCQkJZnByaW50ZihzdGRlcnIsIF8oIiVzOiAlczogdW5hYmxlIHRvIG9idGFpbiBzZWxpbnV4IGZpbGUgbGFiZWw6ICVzXG4iKSwKCQkJCQkJcHJvZ3JhbV9uYW1lLCBkZXZpY2VfbmFtZSwKCQkJCQkJc3RyZXJyb3IoZXJybm8pKTsKCQkJCWV4aXQoMSk7CgkJCX0KCQkJaWYgKG1hdGNocGF0aGNvbihkZXZpY2VfbmFtZSwgc3RhdGJ1Zi5zdF9tb2RlLCAmb2xkY29udGV4dCkpCgkJCQlkaWUoXygidW5hYmxlIHRvIG1hdGNocGF0aGNvbigpIikpOwoJCX0KCQlpZiAoIShuZXdjb250ZXh0ID0gY29udGV4dF9uZXcob2xkY29udGV4dCkpKQoJCQlkaWUoXygidW5hYmxlIHRvIGNyZWF0ZSBuZXcgc2VsaW51eCBjb250ZXh0IikpOwoJCWlmIChjb250ZXh0X3R5cGVfc2V0KG5ld2NvbnRleHQsIFNFTElOVVhfU1dBUEZJTEVfVFlQRSkpCgkJCWRpZShfKCJjb3VsZG4ndCBjb21wdXRlIHNlbGludXggY29udGV4dCIpKTsKCgkJY29udGV4dF9zdHJpbmcgPSBjb250ZXh0X3N0cihuZXdjb250ZXh0KTsKCgkJaWYgKHN0cmNtcChjb250ZXh0X3N0cmluZywgb2xkY29udGV4dCkhPTApIHsKCQkJaWYgKGZzZXRmaWxlY29uKERFViwgY29udGV4dF9zdHJpbmcpKSB7CgkJCQlmcHJpbnRmKHN0ZGVyciwgXygiJXM6IHVuYWJsZSB0byByZWxhYmVsICVzIHRvICVzOiAlc1xuIiksCgkJCQkJCXByb2dyYW1fbmFtZSwgZGV2aWNlX25hbWUsCgkJCQkJCWNvbnRleHRfc3RyaW5nLAoJCQkJCQlzdHJlcnJvcihlcnJubykpOwoJCQkJZXhpdCgxKTsKCQkJfQoJCX0KCQljb250ZXh0X2ZyZWUobmV3Y29udGV4dCk7CgkJZnJlZWNvbihvbGRjb250ZXh0KTsKCX0KI2VuZGlmCglyZXR1cm4gMDsKfQo=