ZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvc2hhZG93cy9hcmtfaHVuZ2VyX3NoYWRvdy5jIGIvc3RkL3BsYXllci9zaGFkb3dzL2Fya19odW5nZXJfc2hhZG93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJkNmRmZgotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvc2hhZG93cy9hcmtfaHVuZ2VyX3NoYWRvdy5jCkBAIC0wLDAgKzEsNTQgQEAKKy8qIERlciBTaGFkb3cgZnVlciBkZW4gSHVuZ2VyZmx1Y2ggKi8KKy8qIC9kL2ViZW5lL2Fyay93b2xmL29iai9odW5nZXIuYyAgKi8KKy8qIFNoYWRvdzogL3N0ZC9wbGF5ZXIvc2hhZG93cy9hcmtfaHVuZ2VyX3NoYWRvdy5jICovCisvKiBPcmlnaW5hbDogL2QvZWJlbmUvYXJrL3dvbGYvb2JqL2h1bmdlcl9vYmouYyAqLworCisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzCisKKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCisjZGVmaW5lIEJTIGJyZWFrX3N0cmluZworCitvYmplY3Qgc3BpZWxlcjsKKwordm9pZCBTZXR6ZW4ob2JqZWN0IHNwKQoreworIGlmICghb2JqZWN0cChzcCkgfHwgIWludGVyYWN0aXZlKHNwKSkgcmV0dXJuIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworIHNwaWVsZXI9c3A7CisgaWYgKCFzaGFkb3coc3AsMSkpIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworfQorCitpbnQgX3F1ZXJ5X2Zvb2QoKSB7IHJldHVybiAwOyB9CisKK2ludCBfcXVlcnlfbWF4X2Zvb2QoKSB7IHJldHVybiAwOyB9CisKK2ludCBlYXRfZm9vZChpbnQgc3RyZW5ndGgsIGludCB0ZXN0b25seSkKK3sKKyBpZiAoc3RyZW5ndGg9PTApIHJldHVybiAxOworIGlmIChzdHJlbmd0aD4wKQorIHsKKyAgc3RyZW5ndGg9MDsKKyAgaWYgKHNwaWVsZXIpCisgIHsKKyAgICB0ZWxsX29iamVjdChzcGllbGVyLCBCUygiRHUgaGFzdCB6d2FyIGVpbmVuIHRpZXJpc2NoZW4gSHVuZ2VyLCBkb2NoIGlyZ2VuZHdhcyBzYWd0IERpciwgZGFzcyBEdSBkYXMsIHdhcyAiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJEdSBnZXJhZGUgZXNzZW4gd2lsbHN0LCBuaWNodCBtZWhyIGluIERlaW5lbiBNYWdlbiBiZWtvbW1zdC4gRGFzIGlzdCB6aWVtbGljaCAiKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZWZhZWhybGljaCwgaG9mZmVudGxpY2ggdmVyaHVuZ2Vyc3QgRHUgbmljaHQgISIsIDc4KSk7CisgICAgcmV0dXJuIDA7CisgIH0KKyB9CisgZWxzZQorIHsKKyAgaWYgKHNwaWVsZXIpCisgIHsKKyAgIHRlbGxfb2JqZWN0KHNwaWVsZXIsIEJTKCJEZWluIEh1bmdlciB2ZXJ0aWVmdCBzaWNoIHNvIG51ciwgRHUgbGVpZGVzdCBIb2VsbGVucXVhbGVuLiIsIDc4KSk7CisgICBzcGllbGVyLT5yZWR1Y2VfaGl0X3BvaW50cyhzdHJlbmd0aCk7CisgIH0KKyAgcmV0dXJuIDA7CisgfQorfQorCit2b2lkIExvZXNjaGVuKCkgeworICAgIHVuc2hhZG93KCk7CisgICAgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7Cit9CmRpZmYgLS1naXQgYS9zdGQvcGxheWVyL3NoYWRvd3MvYmxvY2tfc2hhZG93LmMgYi9zdGQvcGxheWVyL3NoYWRvd3MvYmxvY2tfc2hhZG93LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdhNDMzMwotLS0gL2Rldi9udWxsCisrKyBiL3N0ZC9wbGF5ZXIvc2hhZG93cy9ibG9ja19zaGFkb3cuYwpAQCAtMCwwICsxLDQ3IEBACisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzCisKKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisKK3ByaXZhdGUgbm9zYXZlIG9iamVjdCBwbDsKKwordm9pZCBjcmVhdGUoKQoreworICBpZiggSVNfQkxVRShNRSkgKSByZXR1cm47CisgIHNoYWRvdyggUEwsIDEpOworICBwbCA9IFBMOworfQorCitpbnQKK0FkZEV4cChpbnQgZXApCit7CisgIG9iamVjdCBibG9jazsKKyAgaW50IGRpZmYsIGxpbTsKKworICBibG9jayA9IHByZXNlbnQoIlxuIGJsb2NrIiwgcGwpOworICBsaW0gPSAzMCArIHJhbmRvbSgxMCk7CisKKyAgaWYgKCBlcCA+IGxpbSAmJgkJCQkgICAgICAvLyBNaW5kZXN0d2VydAorICAgICAgIHByZXZpb3VzX29iamVjdCgpICYmCisgICAgICAgKCBwcmV2aW91c19vYmplY3QoKSA9PSBwbCB8fAkJICAgICAgLy8gekIuIEdpdmVRdWVzdCgpCisJICggbGl2aW5nKHByZXZpb3VzX29iamVjdCgpKSAmJiAJICAgICAgLy8gT2RlciBOUENzCisJICAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShwcmV2aW91c19vYmplY3QoKSkKKwkgKQorICAgICAgICkKKyAgICAgKQorICB7CisgICAgZGlmZiA9IGJsb2NrLT5HdXRzY2hyZWliZW4oZXAtbGltKTsKKyAgICByZXR1cm4gcGwtPkFkZEV4cChsaW0rZGlmZik7CisgIH0KKyAgcmV0dXJuIHBsLT5BZGRFeHAoZXApOworfQorCit2b2lkCitTZWhlckhhdEdlbnVnKCkKK3sKKyAgdW5zaGFkb3coKTsKKyAgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7Cit9CisKZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvc2hhZG93cy9tb3JwaF9zaGFkb3cuYyBiL3N0ZC9wbGF5ZXIvc2hhZG93cy9tb3JwaF9zaGFkb3cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmM5N2M0Ci0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9zaGFkb3dzL21vcnBoX3NoYWRvdy5jCkBAIC0wLDAgKzEsNTk4IEBACisvKiAtKi0gbHBjIC0qLSAqLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgbW9ycGguYworLy8KKy8vICAgKGMpIFRyb3kgKHRyb3lAbWcubXVkLmRlKQorLy8gICBLb3BpZXJlbiwgVmVyYWVuZGVybiBvZGVyIFdlaXRlcmdhYmU6IG5hIGtsYXIsIGltbWVyIHp1LCBqZSBzY2hsaW1tZXIgCisvLyAgIHVtIHNvIGJlc3NlcgorLy8KKy8vICAgT2JqZWt0IGVyc3RlbGx0OiAxNC4wOC4wMSwgVHJveQorLy8KKy8vICAgRGllc2VyIHNoYWRvdyBpbXBsZW1lbnRpZXJ0IGdlbmVyaXNjaGUgVmVyd2FuZGx1bmdlbi4gSW0gR2VnZW5zYXR6IG9kZXIKKy8vICAgaW4gRXJn5G56dW5nIHp1bSBUYXJuaGVsbSBzaW5kIGRpZXNlIG5pY2h0IGF1ZiBkaWUgQmVzY2hyZWlidW5nCisvLyAgIGJlc2NocuRua3QsIHNvbmRlcm4gc2NobGFnZW4gc2ljaCBhdWNoIGluIGFuZGVyZW4gUHJvcGVydGllcyBuaWVkZXIuCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2YXJhcmdzIGludCByZW1vdmUoIGludCBzaWxlbnQgKTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgUHJvcGVydHktRWluc3RlbGx1bmdlbiBqZSBuYWNoIFJhc3NlCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitwcml2YXRlIG1hcHBpbmcgbW9ycGhfcHJvcGVydGllczsKKworcHJpdmF0ZSBvYmplY3QgcGw7IC8vIGRlciBzY2hhdHRpZXJ0ZSBTcGllbGVyCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIHN0YXJ0X3NoYWRvdyggU3BpZWxlciwgUHJvcGVydGllcyApCisvLworLy8gICBTdGFydGV0IGRhcyBTaGFkb3dpbmcgdm9uIFNwaWVsZXIuIFByb3BlcnRpZXMgaXN0IGVpbiBNYXBwaW5nIG1pdAorLy8gICBkZW4genUg5G5kZXJuZGVuIFByb3BlcnRpZXMuIERvcnQgbmljaHQgdm9yaGFuZGVuZSBQcm9wZXJ0aWVzIHdlcmRlbgorLy8gICB6dW0gU3BpZWxlciBkdXJjaGdlcmVpY2h0LiBFcyB3ZXJkZW4gZG9ydCBlbnR3ZWRlciBlaW56ZWxuZSBXZXJ0ZQorLy8gICBlcndhcnRldCAoQmVpc3BpZWw6IChbIFBfR0VOREVSOiBNQUxFIF0pKSwgZGllIGRhbm4gZvxyIGFsbGUgUmFzc2VuCisvLyAgIGdlbHRlbiwgb2RlciBjbG9zdXJlcywgZGllIGRhbm4gYXVzZ2Vm/GhydCB3ZXJkZW4gdW50ZXIg3GJlcmdhYmUgZGVyCisvLyAgIFNwaWVsZXJyYXNzZSBhbHMgUGFyYW1ldGVyIG9kZXIgYWJlciBNYXBwaW5ncyBtaXQgZGVuIFJhc3Nlbm5hbWVuCisvLyAgIChCZWlzcGllbDogKFsgUF9HRU5ERVI6IChbICJNZW5zY2giOiBORVVURVIsICJFbGYiOiBGRU1BTEUsCisvLyAgICJad2VyZyI6IE1BTEUsIC4uLiBdKaBdKSkuIElzdCBlaW5lIFJhc3NlIGluIGRlbSBSYXNzZW5tYXBwaW5nIG5pY2h0CisvLyAgIHZvcmhhbmRlbiwgc28gd2lyZCBkYXMgUHJvcGVydHkgenVtIFNwaWVsZXIgZHVyY2hnZXJlaWNodC4gU3BlemllbGwKKy8vICAgYmVoYW5kZWx0IHdlcmRlbiBQX0lEUyAoc2llaGUgX3F1ZXJ5X2lkcygpKSB1bmQgUF9OQU1FIChzaWVoZQorLy8gICBfcXVlcnlfbmFtZSgpKS4gCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50IHN0YXJ0X3NoYWRvdyggb2JqZWN0IF9wbCwgbWFwcGluZyBwcmVzZXQgKQoreworICBpZiAoICFjbG9uZXAoIHRoaXNfb2JqZWN0KCkgKSApCisgICAgcmV0dXJuIDE7CisgIGlmICggIV9wbCB8fCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSggX3BsICkgKQorICAgIHJldHVybiByZW1vdmUoKTsKKyAgcGwgPSBfcGw7CisgIG1vcnBoX3Byb3BlcnRpZXMgPSBkZWVwX2NvcHkoIHByZXNldCApOworICBzaGFkb3coIHBsLCAxICk7CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBzdG9wX3NoYWRvdygpCisvLworLy8gICBCZWVuZGV0IGRhcyBTaGFkb3dpbmcgdW5kIHplcnN09nJ0IGRpZXNlcyBPYmpla3QKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgc3RvcF9zaGFkb3coIC8qIHZvaWQgKi8gKQoreworICBpZiAoICFjbG9uZXAoIHRoaXNfb2JqZWN0KCkgKSApCisgICAgcmV0dXJuIDA7CisgIHVuc2hhZG93KCk7CisgIHJldHVybiByZW1vdmUoKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X3Byb3BlcnR5KCBQcm9wZXJ0eSApCisvLworLy8gICBHZW5lcmlzY2hlIFByb3BlcnR5LU1hc2tpZXJ1bmcuIGxpZWZlcnQgYXVzIG1vcnBoX3Byb3BlcnRpZXMgZGVuIHp1cgorLy8gICBSYXNzZSBkZXMgVHLkZ2VycyBwYXNzZW5kZW4gRWludHJhZy4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitub21hc2sgc3RhdGljIG1peGVkIF9xdWVyeV9wcm9wZXJ0eSggc3RyaW5nIHByb3AgKQoreworICBzdHJpbmcgcmFjZTsKKworICAvLyBSYXNzZSBob2xlbi4KKyAgaWYgKCBJU19MRUFSTkVSKHBsKSApCisgICAgcmFjZSA9ICJNYWdpZXIiOworICBlbHNlIC8vIF9xdWVyeV9yYWNlKCkgaXN0IG5vdHdlbmRpZywgdW0gY2xvc3VyZXMgenUgdW1nZWhlbi4KKyAgICByYWNlID0gcGwtPl9xdWVyeV9yYWNlKCk7CisKKyAgaWYgKCBtZW1iZXIoIG1vcnBoX3Byb3BlcnRpZXMsIHByb3AgKSA9PSAwICkKKyAgICByZXR1cm4gcGwtPlF1ZXJ5KCBwcm9wICk7CisgIGlmICggY2xvc3VyZXAoIG1vcnBoX3Byb3BlcnRpZXNbIHByb3AgXSApICkKKyAgICByZXR1cm4gZnVuY2FsbCggbW9ycGhfcHJvcGVydGllc1sgcHJvcCBdLCByYWNlICk7CisgIGlmICggbWFwcGluZ3AoIG1vcnBoX3Byb3BlcnRpZXNbIHByb3AgXSApICkKKyAgeworICAgIGlmICggbWVtYmVyKCBtb3JwaF9wcm9wZXJ0aWVzWyBwcm9wIF0sIHJhY2UgKSA9PSAwICkKKyAgICAgIHJldHVybiBwbC0+UXVlcnkoIHByb3AgKTsKKyAgICBpZiAoIGNsb3N1cmVwKCBtb3JwaF9wcm9wZXJ0aWVzWyBwcm9wIF1bIHJhY2UgXSApICkKKyAgICAgIHJldHVybiBmdW5jYWxsKCBtb3JwaF9wcm9wZXJ0aWVzWyBwcm9wIF1bIHJhY2UgXSApOworCisgICAgcmV0dXJuIG1vcnBoX3Byb3BlcnRpZXNbIHByb3AgXVsgcmFjZSBdOworICB9CisgIHJldHVybiBtb3JwaF9wcm9wZXJ0aWVzWyBwcm9wIF07Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9hcnRpY2xlKCkKKy8vCisvLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfQVJUSUNMRQorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludCBfcXVlcnlfYXJ0aWNsZSggLyogdm9pZCAqLyApCit7CisgIHJldHVybiAoaW50KV9xdWVyeV9wcm9wZXJ0eSggUF9BUlRJQ0xFICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9hdmVyYWdlX3NpemUoKQorLy8KKy8vICAgUHJvcGVydHktTWFza2llcnVuZyBm/HIgUF9BVkVSQUdFX1NJWkUKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgX3F1ZXJ5X2F2ZXJhZ2Vfc2l6ZSggLyogdm9pZCAqLyApCit7CisgIHJldHVybiAoaW50KV9xdWVyeV9wcm9wZXJ0eSggUF9BVkVSQUdFX1NJWkUgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X2F2ZXJhZ2Vfd2VpZ2h0KCkKKy8vCisvLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfQVZFUkFHRV9XRUlHSFQKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgX3F1ZXJ5X2F2ZXJhZ2Vfd2VpZ2h0KCAvKiB2b2lkICovICkKK3sKKyAgcmV0dXJuIChpbnQpX3F1ZXJ5X3Byb3BlcnR5KCBQX0FWRVJBR0VfV0VJR0hUICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9ib2R5KCkKKy8vCisvLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfQk9EWQorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludCBfcXVlcnlfYm9keSggLyogdm9pZCAqLyApCit7CisgIHJldHVybiAoaW50KV9xdWVyeV9wcm9wZXJ0eSggUF9CT0RZICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9nZW5kZXIoKQorLy8KKy8vICAgUHJvcGVydHktTWFza2llcnVuZyBm/HIgUF9HRU5ERVIKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgX3F1ZXJ5X2dlbmRlciggLyogdm9pZCAqLyApCit7CisgIHJldHVybiAoaW50KV9xdWVyeV9wcm9wZXJ0eSggUF9HRU5ERVIgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X2hhbmRzKCkKKy8vCisvLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfSEFORFMKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittaXhlZCBfcXVlcnlfaGFuZHMoIC8qIHZvaWQgKi8gKQoreworICByZXR1cm4gX3F1ZXJ5X3Byb3BlcnR5KCBQX0hBTkRTICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9pZHMoKQorLy8KKy8vICAgUHJvcGVydHktTWFza2llcnVuZyBm/HIgUF9JRFMgLSBOaWNodC1TdGFuZGFyZCwgZGEgamUgbmFjaCBVcnNwcnVuZ3MtCisvLyAgIGdlc2NobGVjaHQgZGVzIFNwaWVsZXJzIHp1c+R0emxpY2hlIGlkcyBm5GxsaWcgd2VyZGVuLiBBYmxhdWY6IEVzIGdpYnQKKy8vICAgNSBTY2hyaXR0ZSwgYmVpIGRlcmVuIGpld2VpbGlnZW0gVmVyc2FnZW4gZGllIGlkcyBkZXMgU3BpZWxlcnMgZHVyY2gtCisvLyAgIGdlcmVpY2h0IHdlcmRlbjoKKy8vICAgMS4gUF9JRFMgaXN0IGltIHByb3BlcnR5LW1hcHBpbmcgdm9yaGFuZGVuCisvLyAgIDIuIGEpIGVzIGlzdCBlaW4gc3RyaW5nIG9kZXIgZWluIGFycmF5OiBlcyB3aXJkIGFuIGRpZSBpZHMgZGVzIFNwaWVsZXJzCisvLyAgICAgICAgIGFuZ2Vo5G5ndCB1bmQgenVy/GNrZ2VnZWJlbi4KKy8vICAgICAgYikgZXMgaXN0IGVpbmUgY2xvc3VyZS4gRGllc2Ugd2lyZCBhdXNnZWb8aHJ0IHVudGVyINxiZXJnYWJlIGRlcgorLy8gICAgICAgICBTcGllbGVyLWlkcywgZGVyIFJhc3NlIGRlcyBTcGllbGVycyB1bmQgZGVyIEdlc2NobGVjaHRlcgorLy8gICAgICAgICAoZGllc2VzIE9iamVrdHMgdW5kIGRlcyBTcGllbGVycykuIERlciBFcmdlYm5pc3dlcnQgZGVyIGNsb3N1cmUKKy8vICAgICAgICAgd2lyZCBkaXJla3QgenVy/GNrZ2VnZWJlbi4KKy8vICAgICAgYykgZXMgaXN0IGVpbiBtYXBwaW5nLiBIaWVyIG5laG1lbiB3aXIgbnVuIGRhcyD8YmxpY2hlIFJhc3Nlbm5hbWVuLQorLy8gICAgICAgICBtYXBwaW5nIGFuIC0+IDMuKQorLy8gICAzLiBG/HIgZGllIFJhc3NlIGRlcyBTcGllbGVycyB3aXJkIGVpbiBFaW50cmFnIGdlc3VjaHQKKy8vICAgICAgYSkgZXIgaXN0IGVpbiBzdHJpbmcgb2RlciBlaW4gYXJyYXk6IGVyIHdpcmQgYW4gZGllIGlkcyBkZXMgU3BpZWxlcnMKKy8vICAgICAgICAgYW5nZWjkbmd0IHVuZCB6dXL8Y2tnZWdlYmVuLgorLy8gICAgICBiKSBlciBpc3QgZWluZSBjbG9zdXJlLiBEaWVzZSB3aXJkIGF1c2dlZvxocnQgdW50ZXIg3GJlcmdhYmUgZGVyCisvLyAgICAgICAgIFNwaWVsZXItaWRzLCBkZXIgUmFzc2UgZGVzIFNwaWVsZXJzIHVuZCBkZXIgR2VzY2hsZWNodGVyCisvLyAgICAgICAgIChkaWVzZXMgT2JqZWt0cyB1bmQgZGVzIFNwaWVsZXJzKS4gRGVyIEVyZ2Vibmlzd2VydCBkZXIgY2xvc3VyZQorLy8gICAgICAgICB3aXJkIGRpcmVrdCB6dXL8Y2tnZWdlYmVuLgorLy8gICAgICBjKSBlciBpc3QgZWluIG1hcHBpbmcuIEVzIHdpcmQgYW5nZW5vbW1lbiwgZGFzcyBqZSBHZXNjaGxlY2h0IERJRVNFUworLy8gICAgICAgICBPYmpla3RzIGVpbiBFaW50cmFnIHZvcmhhbmRlbiBpc3QuIC0+IDQuKQorLy8gICA0LiBG/HIgZGFzIEdlc2NobGVjaHQgZGllc2VzIE9iamVrdHMgd2lyZCBlaW4gRWludHJhZyBnZXN1Y2h0CisvLyAgICAgIGEpIGVyIGlzdCBlaW4gc3RyaW5nIG9kZXIgZWluIGFycmF5OiBlciB3aXJkIGFuIGRpZSBpZHMgZGVzIFNwaWVsZXJzCisvLyAgICAgICAgIGFuZ2Vo5G5ndCB1bmQgenVy/GNrZ2VnZWJlbi4KKy8vICAgICAgYikgZXIgaXN0IGVpbmUgY2xvc3VyZS4gRGllc2Ugd2lyZCBhdXNnZWb8aHJ0IHVudGVyINxiZXJnYWJlIGRlcgorLy8gICAgICAgICBTcGllbGVyLWlkcywgZGVyIFJhc3NlIGRlcyBTcGllbGVycyB1bmQgZGVyIEdlc2NobGVjaHRlcgorLy8gICAgICAgICAoZGllc2VzIE9iamVrdHMgdW5kIGRlcyBTcGllbGVycykuIERlciBFcmdlYm5pc3dlcnQgZGVyIGNsb3N1cmUKKy8vICAgICAgICAgd2lyZCBkaXJla3QgenVy/GNrZ2VnZWJlbi4KKy8vICAgICAgYykgZXIgaXN0IGVpbiBtYXBwaW5nLiBFcyB3aXJkIGFuZ2Vub21tZW4sIGRhc3MgamUgR2VzY2hsZWNodCBERVMKKy8vICAgICAgICAgU3BpZWxlcnMgZWluIEVpbnRyYWcgdm9yaGFuZGVuIGlzdC4gLT4gNS4pCisvLyAgIDUuIEb8ciBkYXMgR2VzY2hsZWNodCBkZXMgU3BpZWxlcnMgd2lyZCBlaW4gRWludHJhZyBnZXN1Y2h0CisvLyAgICAgIGEpIGVyIGlzdCBlaW4gc3RyaW5nIG9kZXIgZWluIGFycmF5OiBlciB3aXJkIGFuIGRpZSBpZHMgZGVzIFNwaWVsZXJzCisvLyAgICAgICAgIGFuZ2Vo5G5ndCB1bmQgenVy/GNrZ2VnZWJlbi4KKy8vICAgICAgYikgZXIgaXN0IGVpbmUgY2xvc3VyZS4gRGllc2Ugd2lyZCBhdXNnZWb8aHJ0IHVudGVyINxiZXJnYWJlIGRlcgorLy8gICAgICAgICBTcGllbGVyLWlkcywgZGVyIFJhc3NlIGRlcyBTcGllbGVycyB1bmQgZGVyIEdlc2NobGVjaHRlcgorLy8gICAgICAgICAoZGllc2VzIE9iamVrdHMgdW5kIGRlcyBTcGllbGVycykuIERlciBFcmdlYm5pc3dlcnQgZGVyIGNsb3N1cmUKKy8vICAgICAgICAgd2lyZCBkaXJla3QgenVy/GNrZ2VnZWJlbi4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittaXhlZCBfcXVlcnlfaWRzKCAvKiB2b2lkICovICkKK3sKKyAgc3RyaW5nIHJhY2U7CisgIG1peGVkIGlkczsKKyAgaW50IGdlbmRlciwgc2dlbmRlcjsKKworICAvLyBUZXN0IDEuCisgIGlkcyA9IHBsLT5RdWVyeSggUF9JRFMgKTsKKyAgaWYgKCBtZW1iZXIoIG1vcnBoX3Byb3BlcnRpZXMsIFBfSURTICkgPT0gMCApCisgICAgcmV0dXJuIGlkczsKKworICAvLyBSYXNzZSBob2xlbi4KKyAgaWYgKCBJU19MRUFSTkVSKHBsKSApCisgICAgcmFjZSA9ICJNYWdpZXIiOworICBlbHNlIC8vIF9xdWVyeV9yYWNlKCkgaXN0IG5vdHdlbmRpZywgdW0gY2xvc3VyZXMgenUgdW1nZWhlbi4KKyAgICByYWNlID0gcGwtPl9xdWVyeV9yYWNlKCk7CisKKyAgLy8gR2VzY2hsZWNodGVyIGhvbGVuCisgIGdlbmRlciA9IF9xdWVyeV9nZW5kZXIoKTsKKyAgc2dlbmRlciA9IHBsLT5RdWVyeSggUF9HRU5ERVIgKTsKKworICAvLyBUZXN0IDIuCisgIC8vIHN0cmluZz8gRGFubiBlaW5mYWNoIGRlbiBub3JtYWxlbiBpZHMgZGF6dSwgZ2VuYXVzbyBtaXQgYXJyYXkKKyAgaWYgKCBzdHJpbmdwKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdICkgKQorICAgIHJldHVybiBpZHMgKyAoeyBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdIH0pOworICBpZiAoIHBvaW50ZXJwKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdICkgKQorICAgIHJldHVybiBpZHMgKyBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdOworICBpZiAoIGNsb3N1cmVwKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdICkgKQorICAgIHJldHVybiBmdW5jYWxsKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdLCBpZHMsIHJhY2UsIGdlbmRlciwgc2dlbmRlciApOworICAvLyBmYWxscyBrZWluIG1hcHBpbmcsIGRhbm4gcmF1cworICBpZiAoICFtYXBwaW5ncCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXSApICkKKyAgICByZXR1cm4gaWRzOworCisgIC8vIFRlc3QgMy4KKyAgaWYgKCBtZW1iZXIoIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF0sIHJhY2UgKSA9PSAwICkKKyAgICByZXR1cm4gaWRzOworICBpZiAoIHN0cmluZ3AoIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXSApICkKKyAgICByZXR1cm4gaWRzICsgKHsgbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdIH0pOworICBpZiAoIHBvaW50ZXJwKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF0gKSApCisgICAgcmV0dXJuIGlkcyArIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXTsKKyAgaWYgKCBjbG9zdXJlcCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdICkgKQorICAgIHJldHVybiBmdW5jYWxsKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF0sIGlkcywgcmFjZSwgZ2VuZGVyLCBzZ2VuZGVyICk7CisgIC8vIGZhbGxzIGtlaW4gbWFwcGluZywgZGFubiByYXVzCisgIGlmICggIW1hcHBpbmdwKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF0gKSApCisgICAgcmV0dXJuIGlkczsKKworICAvLyBUZXN0IDQuCisgIGlmICggbWVtYmVyKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF0sIGdlbmRlciApID09IDAgKQorICAgIHJldHVybiBpZHM7CisgIGlmICggc3RyaW5ncCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXSApICkKKyAgICByZXR1cm4gaWRzICsgKHsgbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXSB9KTsKKyAgaWYgKCBwb2ludGVycCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXSApICkKKyAgICByZXR1cm4gaWRzICsgbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXTsKKyAgaWYgKCBjbG9zdXJlcCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXSApICkKKyAgICByZXR1cm4gZnVuY2FsbCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXSwKKwkJICAgIGlkcywgcmFjZSwgZ2VuZGVyLCBzZ2VuZGVyICk7CisgIC8vIGZhbGxzIGtlaW4gbWFwcGluZywgZGFubiByYXVzCisgIGlmICggIW1hcHBpbmdwKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF1bIGdlbmRlciBdICkgKQorICAgIHJldHVybiBpZHM7CisKKyAgLy8gVGVzdCA1LgorICBpZiAoIG1lbWJlciggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXSwgc2dlbmRlciApID09IDAgKQorICAgIHJldHVybiBpZHM7CisgIGlmICggc3RyaW5ncCggbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXVsgc2dlbmRlciBdICkgKQorICAgIHJldHVybiBpZHMgKyAoeyBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF1bIGdlbmRlciBdWyBzZ2VuZGVyIF0gfSk7CisgIGlmICggcG9pbnRlcnAoIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXVsgZ2VuZGVyIF1bIHNnZW5kZXIgXSApICkKKyAgICByZXR1cm4gaWRzICsgbW9ycGhfcHJvcGVydGllc1sgUF9JRFMgXVsgcmFjZSBdWyBnZW5kZXIgXVsgc2dlbmRlciBdOworICBpZiAoIGNsb3N1cmVwKCBtb3JwaF9wcm9wZXJ0aWVzWyBQX0lEUyBdWyByYWNlIF1bIGdlbmRlciBdWyBzZ2VuZGVyIF0gKSApCisgICAgcmV0dXJuIGZ1bmNhbGwoIG1vcnBoX3Byb3BlcnRpZXNbIFBfSURTIF1bIHJhY2UgXVsgZ2VuZGVyIF1bIHNnZW5kZXIgXSwKKwkJICAgIGlkcywgcmFjZSwgZ2VuZGVyLCBzZ2VuZGVyICk7CisKKyAgcmV0dXJuIGlkczsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X2lzX21vcnBoZWQoKQorLy8KKy8vICAgUHJvcGVydHktTWV0aG9kZSBm/HIgImlzX21vcnBoZWQiCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50IF9xdWVyeV9pc19tb3JwaGVkKCAvKiB2b2lkICovICkKK3sKKyAgcmV0dXJuIDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9tYXhfaGFuZHMoKQorLy8KKy8vICAgUHJvcGVydHktTWFza2llcnVuZyBm/HIgUF9NQVhfSEFORFMKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgX3F1ZXJ5X21heF9oYW5kcyggLyogdm9pZCAqLyApCit7CisgIHJldHVybiAoaW50KV9xdWVyeV9wcm9wZXJ0eSggUF9NQVhfSEFORFMgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X21tc2dpbigpCisvLworLy8gICBQcm9wZXJ0eS1NYXNraWVydW5nIGb8ciBQX01NU0dJTgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0cmluZyBfcXVlcnlfbW1zZ2luKCAvKiB2b2lkICovICkKK3sKKyAgcmV0dXJuIChzdHJpbmcpKF9xdWVyeV9wcm9wZXJ0eSggUF9NTVNHSU4gKSB8fCAiIik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9tbXNnb3V0KCkKKy8vCisvLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfTU1TR09VVAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0cmluZyBfcXVlcnlfbW1zZ291dCggLyogdm9pZCAqLyApCit7CisgIHJldHVybiAoc3RyaW5nKShfcXVlcnlfcHJvcGVydHkoIFBfTU1TR09VVCApIHx8ICIiKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X21zZ2luKCkKKy8vCisvLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfTVNHSU4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdHJpbmcgX3F1ZXJ5X21zZ2luKCAvKiB2b2lkICovICkKK3sKKyAgcmV0dXJuIChzdHJpbmcpKF9xdWVyeV9wcm9wZXJ0eSggUF9NU0dJTiApIHx8ICIiKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X21zZ291dCgpCisvLworLy8gICBQcm9wZXJ0eS1NYXNraWVydW5nIGb8ciBQX01TR09VVAorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0cmluZyBfcXVlcnlfbXNnb3V0KCAvKiB2b2lkICovICkKK3sKKyAgcmV0dXJuIChzdHJpbmcpKF9xdWVyeV9wcm9wZXJ0eSggUF9NU0dPVVQgKSB8fCAiIik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9uYW1lKCkKKy8vCisvLyAgIFByb3BlcnR5LU1ldGhvZGUgZvxyIFBfTkFNRS4gTGVpZGVyIGlzdCBkaWUgcGxheWVyLXNoZWxsIHNvIGdyb3R0aWcsCisvLyAgIGRhc3Mg/GJlcmFsbCBhbmdlbm9tbWVuIHdpcmQsIFF1ZXJ5UHJvcChQX05BTUUpIGxpZWZlcmUgZWluZW4gU3RyaW5nIDotfAorLy8gICBWb2xsc3TkbmRpZ2VzIFByb3BlcnR5IGRhaGVyIHVudGVyIF9xdWVyeV9uYW1lX2Z1bGwoKS4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdHJpbmcgX3F1ZXJ5X25hbWUoIC8qIHZvaWQgKi8gKQoreworICBtaXhlZCBwcm9wOworICBwcm9wID0gX3F1ZXJ5X3Byb3BlcnR5KCBQX05BTUUgKTsKKyAgaWYgKCBzdHJpbmdwKCBwcm9wICkgKQorICAgIHJldHVybiBzcHJpbnRmKCBwcm9wLCBwbC0+UXVlcnkoIFBfTkFNRSApICk7CisgIGlmICggcG9pbnRlcnAoIHByb3AgKSApCisgICAgcmV0dXJuIG1hcCggcHJvcCwKKwkJICAgICAgbGFtYmRhKCAoeyAnZWwsICdzIH0pLAorCQkJICAgICAgKHsjJ3NwcmludGYsICdlbCwgJ3N9KSApLAorCQkgICAgICBwbC0+UXVlcnkoIFBfTkFNRSApIClbIFdFUiBdOworICByZXR1cm4gcGwtPlF1ZXJ5KCBQX05BTUUgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X25hbWVfZnVsbCgpCisvLworLy8gICBQcm9wZXJ0eS1NZXRob2RlIGb8ciAibmFtZV9mdWxsIi4KKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCittaXhlZCBfcXVlcnlfbmFtZV9mdWxsKCAvKiB2b2lkICovICkKK3sKKyAgbWl4ZWQgcHJvcDsKKyAgcHJvcCA9IF9xdWVyeV9wcm9wZXJ0eSggUF9OQU1FICk7CisgIGlmICggc3RyaW5ncCggcHJvcCApICkKKyAgICByZXR1cm4gc3ByaW50ZiggcHJvcCwgcGwtPlF1ZXJ5KCBQX05BTUUgKSApOworICBpZiAoIHBvaW50ZXJwKCBwcm9wICkgKQorICAgIHJldHVybiBtYXAoIHByb3AsCisJCSAgICAgIGxhbWJkYSggKHsgJ2VsLCAncyB9KSwKKwkJCSAgICAgICh7IydzcHJpbnRmLCAnZWwsICdzfSkgKSwKKwkJICAgICAgcGwtPlF1ZXJ5KCBQX05BTUUgKSApOworICByZXR1cm4gcGwtPlF1ZXJ5KCBQX05BTUUgKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X3ByZXNheSgpCisvLworLy8gICBQcm9wZXJ0eS1NYXNraWVydW5nIGb8ciBQX1BSRVNBWQorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0cmluZyBfcXVlcnlfcHJlc2F5KCAvKiB2b2lkICovICkKK3sKKyAgcmV0dXJuIChzdHJpbmcpKF9xdWVyeV9wcm9wZXJ0eSggUF9QUkVTQVkgKSB8fCAiIik7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIF9xdWVyeV9yYWNlKCkKKy8vCisvLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfUkFDRQorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0cmluZyBfcXVlcnlfcmFjZSggLyogdm9pZCAqLyApCit7CisgIHJldHVybiAoc3RyaW5nKShfcXVlcnlfcHJvcGVydHkoIFBfUkFDRSApIHx8ICIiKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgX3F1ZXJ5X3JhY2VzdHJpbmcoKQorLy8KKy8vICAgUHJvcGVydHktTWFza2llcnVuZyBm/HIgUF9SQUNFU1RSSU5HCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RyaW5nKiBfcXVlcnlfcmFjZXN0cmluZyggLyogdm9pZCAqLyApCit7CisgIHJldHVybiAoc3RyaW5nKilfcXVlcnlfcHJvcGVydHkoIFBfUkFDRVNUUklORyApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBfcXVlcnlfc2l6ZSgpCisvLworLy8gICBQcm9wZXJ0eS1NYXNraWVydW5nIGb8ciBQX1NJWkUKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitpbnQgX3F1ZXJ5X3NpemUoIC8qIHZvaWQgKi8gKQoreworICByZXR1cm4gKGludClfcXVlcnlfcHJvcGVydHkoIFBfU0laRSApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBfcXVlcnlfdGl0bGUoKQorLy8KKy8vICAgUHJvcGVydHktTWFza2llcnVuZyBm/HIgUF9USVRMRQorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0cmluZyBfcXVlcnlfdGl0bGUoIC8qIHZvaWQgKi8gKQoreworICByZXR1cm4gKHN0cmluZykoX3F1ZXJ5X3Byb3BlcnR5KCBQX1RJVExFICkgfHwgIiIpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICBfcXVlcnlfd2VpZ2h0KCkKKy8vCisvLyAgIFByb3BlcnR5LU1hc2tpZXJ1bmcgZvxyIFBfV0VJR0hUCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50IF9xdWVyeV93ZWlnaHQoIC8qIHZvaWQgKi8gKQoreworICByZXR1cm4gKGludCkoX3F1ZXJ5X3Byb3BlcnR5KCBQX1dFSUdIVCApIHx8ICIiKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vICAgaWQoIFRleHQsIExldmVsKQorLy8KKy8vICAgRGllIElkZW50aWZpemllcnVuZyBzcGlubnQgbWl0IFBfTkFNRS1BcnJheXMKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit2YXJhcmdzIGludCBpZCggc3RyaW5nIHN0ciwgaW50IGx2bCApCit7CisgIHN0cmluZyBwbG5hbWU7CisKKyAgaWYgKCBwbC0+UXVlcnlQcm9wKCBQX0dIT1NUICkgKQorICAgIGlmICggc3RyID09ICJnZWlzdCIgKQorICAgICAgcmV0dXJuIDE7CisgICAgZWxzZSBpZiAoICggc3NjYW5mKCBzdHIsICJnZWlzdCB2b24gJXMiLCBwbG5hbWUgKSA9PSAxICkgJiYKKwkgICAgICBwbC0+aWQoIHBsbmFtZSApICkKKyAgICAgIHJldHVybiAxOworICAgIGVsc2UgaWYgKCAoIHNzY2FuZiggc3RyLCAiZ2Vpc3QgJXMiLCBwbG5hbWUgKSA9PSAxICkgJiYKKwkgICAgICBwbC0+aWQoIHBsbmFtZSApICkKKyAgICAgIHJldHVybiAxOworCisgIHJldHVybiBwbC0+aWQoIHN0ciwgbHZsICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIGxvbmcoKQorLy8KKy8vICAgRGllIExhbmdiZXNjaHJlaWJ1bmcgaW0gU3BpZWxlciBoYWRlcnQgbWl0IGRlbSBHZXNjaGxlY2h0IE5FVVRFUi4uLgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZhcmFyZ3Mgc3RyaW5nIGxvbmcoIC8qIHZvaWQgKi8gKQoreworICBzdHJpbmcgc2xvbmc7CisgIHNsb25nID0gcGwtPmxvbmcoKTsKKworICBpZiAoIF9xdWVyeV9nZW5kZXIoKSA9PSBORVVURVIgKQorICB7CisgICAgc3RyaW5nICphbG9uZzsKKyAgICBpbnQgaTsKKworICAgIC8vIGFsbGUgRXItcyB1bmQgZXItcyBzdWNoZW4uLi4KKyAgICBhbG9uZyA9IHJlZ2V4cGxvZGUoIHNsb25nLCAiXFw8W0VlXXJcXD4iICk7CisgICAgLy8gLi4uIHVuZCBkYXMgciBkdXJjaCBlaW4gcyBlcnNldHplbi4KKyAgICBmb3IgKCBpID0gMSA7IGkgPCBzaXplb2YoIGFsb25nICkgOyBpICs9IDIgKQorICAgICAgYWxvbmdbIGkgXVsgMSBdID0gJ3MnOworICAgIHNsb25nID0gaW1wbG9kZSggYWxvbmcsICIiICk7CisgIH0KKworICByZXR1cm4gc2xvbmc7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgIHNob3J0KCkKKy8vCisvLyAgIERpZSBLdXJ6YmVzY2hyZWlidW5nIGltIFNwaWVsZXIgaGF0IGVpbiBQcm9ibGVtIG1pdCBQX05BTUUtQXJyYXlzCisvLworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RyaW5nIHNob3J0KCAvKiB2b2lkICovICkKK3sKKyAgbWl4ZWQgbmFtZXM7CisgIHN0cmluZyBhbnN3ZXI7CisgIHN0cmluZyB0aXRsZTsKKworICBpZiAoIHBsLT5RdWVyeVByb3AoIFBfSU5WSVMgKSApCisgICAgaWYgKCBpbnRlcmFjdGl2ZSggcHJldmlvdXNfb2JqZWN0KCkgKSAmJgorCSBJU19MRUFSTklORyggcHJldmlvdXNfb2JqZWN0KCkgKSApCisgICAgICByZXR1cm4gIigiICsgcGwtPlF1ZXJ5KCBQX05BTUUgKSArICIpIFxuIjsKKyAgICBlbHNlCisgICAgICByZXR1cm4gKHN0cmluZykwOworCisgIG5hbWVzID0gX3F1ZXJ5X25hbWVfZnVsbCgpOworICBpZiAoIHN0cmluZ3AoIG5hbWVzICkgKQorICAgIG5hbWVzID0gKHsgbmFtZXMsIG5hbWVzLCBuYW1lcywgbmFtZXMgfSk7CisKKyAgaWYgKCBwbC0+UXVlcnlQcm9wKCBQX0dIT1NUICkgKQorICAgIGFuc3dlciA9ICJEZXIgR2Vpc3QgIiArIHBsLT5RdWVyeUFydGljbGUoIFdFU1NFTiwgMCApICsgbmFtZXNbIFdFU1NFTiBdOworICBlbHNlCisgICAgYW5zd2VyID0gcGwtPlF1ZXJ5QXJ0aWNsZSggV0VSLCAwICkgKyBuYW1lc1sgV0VSIF07CisgIGlmICggKCB0aXRsZSA9IHBsLT5RdWVyeVByb3AoIFBfVElUTEUgKSApICYmCisgICAgICAgKCB0aXRsZSAhPSAiIiApICkKKyAgICAgYW5zd2VyICs9ICIgIiArIHRpdGxlOworICBpZiAoICFpbnRlcmFjdGl2ZSggcGwgKSApCisgICAgIGFuc3dlciArPSAiIChuZXR6dG90KSI7CisgIHJldHVybiBjYXBpdGFsaXplKCBhbnN3ZXIgKSArICIuXG4iOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gICByZW1vdmUoIFNjaG5hdXplICkKKy8vCisvLyAgIGF1ZnLkdW1lbgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZhcmFyZ3MgaW50IHJlbW92ZSggaW50IHNpbGVudCApCit7CisgIGRlc3RydWN0KCB0aGlzX29iamVjdCgpICk7CisgIHJldHVybiAxOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgIC0tIEVOREUgLS0KZGlmZiAtLWdpdCBhL3N0ZC9wbGF5ZXIvc2hhZG93cy9wb255LmMgYi9zdGQvcGxheWVyL3NoYWRvd3MvcG9ueS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkM2RlOGQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL3NoYWRvd3MvcG9ueS5jCkBAIC0wLDAgKzEsNTkgQEAKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMKKworI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKworLy8gCisvLyBEYSBkZXIgU2hhZG93IHNpY2ggbmljaHQgaW0gUGxheWVyIGJlZmluZGV0LCB3aXJkIGVpbgorLy8gWnVzYXR6b2JqZWt0IGJlbm9ldGlndC4KKy8vIDcuMTAuOTcgLSBEaWUgSG9vayBzb2xsdGUgaW4gZGVuIFZlcnplaWNobmlzc2VuIGRlciBCZW5uaWVxdWVzdAorLy8gICAgICAgICAgIHp1IGZpbmRlbiBzZWluLiAtIFJ1bWF0YQorCisjZGVmaW5lIEhPT0sgImQvd2FsZC9rYXNzYW5kcmEvYmVubmllL29iai9wb255X2hvb2siCisKK3N0YXRpYyBvYmplY3QgcGw7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyBpZiggSVNfQkxVRShNRSkgKSByZXR1cm47CisgIHNoYWRvdyggUEwsIDEpOworIHBsPVBMOworIC8vdGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSwiRHUgYmVzdGVpZ3N0IGRhcyBQb255IHNhbXQgU2NoYXR0ZW4uXG4iKTsKKyAgY2xvbmVfb2JqZWN0KCBIT09LICk7IC8vIFN0ZXVlcnVuZyBkZXMgc2hhZG93cyB1ZWJlciBkaWUgaG9vaworfQorCitzdHJpbmcgX3F1ZXJ5X3RpdGxlKCkKK3sgCisgaWYoIHBsLT5RdWVyeVByb3AoUF9HRU5ERVIpID09IEZFTUFMRSApCisgICAgIHJldHVybiAiZGllIFBvbnlyZWl0ZXJpbiI7CisgcmV0dXJuICJkZXIgUG9ueXJlaXRlciI7Cit9CisKK3N0cmluZyBfcXVlcnlfbXNnaW4oKSB7IHJldHVybiAicmVpdGV0IGhlcmVpbiI7IH0KK3N0cmluZyBfcXVlcnlfbXNnb3V0KCkgeyByZXR1cm4gInJlaXRldCI7IH0KKwordmFyYXJncyBpbnQgbW92ZShtaXhlZCBkZXN0LCBpbnQgbWV0aG9kLCBzdHJpbmcgZGlyLCBzdHJpbmcgdGV4dG91dCxzdHJpbmcgdGV4dGluKQoreworIGlmKCAhKG1ldGhvZCAmIE1fTk9DSEVDSykgJiYgZGVzdC0+UXVlcnlQcm9wKFBfSU5ET09SUykgKQorIHsKKyAgd3JpdGUoICJEYXMgUG9ueSB3ZWlnZXJ0IHNpY2gsIGRvcnRoaW4genUgdHJhYmVuLlxuIiApOworICByZXR1cm4gMTsKKyB9CisgcmV0dXJuIHBsLT5tb3ZlKCBkZXN0LCBtZXRob2QsIGRpciwgdGV4dG91dCwgdGV4dGluICk7Cit9CisKK2ludCBfaW52ZW50b3J5KHN0cmluZyBzdHIpCit7CisgaWYoICFlbnZpcm9ubWVudCgpIHx8IHNldF9saWdodCgwKT4wICkKKyAgd3JpdGUoICJEdSBzaXR6dCBhdWYgZWluZW0gUG9ueS5cbiIgKTsKKyByZXR1cm4gcGwtPl9pbnZlbnRvcnkoc3RyKTsKK30KKwordm9pZCBhYnN0ZWlnZW4oKSB7CisgIHVuc2hhZG93KCk7CisgIGRlc3RydWN0KE1FKTsKK30KKworaW50IFF1ZXJ5UmVpdGVyKCkgeyByZXR1cm4gMTsgfQpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9zaGFkb3dzL3NpemV0ZXN0LmMgYi9zdGQvcGxheWVyL3NoYWRvd3Mvc2l6ZXRlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjY4OTExCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9zaGFkb3dzL3NpemV0ZXN0LmMKQEAgLTAsMCArMSw1NyBAQAorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKworI2RlZmluZSBTUElFTEVSICJuZWZpcyIKKyNkZWZpbmUgREVCVUcoeCkgIGlmIChmaW5kX3BsYXllcigiemVzc3RyYSIpKVwKKyAgICAgICAgICAgIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJ6ZXNzdHJhIiksXAorCQkgICAgICAgICAgICAgICAgICAgICAgIk5lZmlzIFBfU0laRTogIit4KyJcbiIpCisjZGVmaW5lIExPRyh4KSBsb2dfZmlsZSgiemVzc3RyYS9QX1NJWkUubG9nIiwgeCkKKworcHJpdmF0ZSBub3NhdmUgb2JqZWN0IHBsOworCit2b2lkIGNyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKCkgKSByZXR1cm47CisgIHBsID0gZmluZF9wbGF5ZXIoU1BJRUxFUikgfHwgZmluZF9uZXRkZWFkKFNQSUVMRVIpOworICBpZiAoIW9iamVjdHAocGwpKSB7CisgICAgICBERUJVRygiUGxheWVyb2JqZWt0IG5pY2h0IGdlZnVuZGVuLiIpOworICAgICAgZGVzdHJ1Y3QoTUUpOworICAgICAgcmV0dXJuOworICB9CisgIHNoYWRvdyggcGwsIDEpOworICBERUJVRyhzcHJpbnRmKCIlTyBzaGFkb3dlZCBieTogJU9cbiIsIHBsLCBzaGFkb3cocGwsIDApKSk7Cit9CisKK2ludCBfc2V0X3NpemUoaW50IHN6KSB7CisgIExPRyhzcHJpbnRmKCJbJXNdIEFlbmRlcnVuZyB2b24gUF9TSVpFIGluICVPIGF1ZiAlTyxcbkNhbGxlcnN0YWNrOiAlT1xuXG4iLAorCXN0cmZ0aW1lKCIlYyIsdGltZSgpKSwgcGwsIHN6LCBjYWxsZXJfc3RhY2soKSkpOworICByZXR1cm4gcGwtPlNldChQX1NJWkUsIHN6LCBGX1ZBTFVFKTsKK30KKworcHVibGljIHZhcmFyZ3MgbWl4ZWQgU2V0KCBzdHJpbmcgbmFtZSwgbWl4ZWQgVmFsdWUsIGludCBUeXBlLCBpbnQgZXh0ZXJuICkgeworICBpZiAobmFtZSA9PSBQX1NJWkUpIHsKKyAgTE9HKHNwcmludGYoIlslc10gQWVuZGVydW5nIHZvbiBQX1NJWkUgaW4gJU8gYXVmICVPIChUeXA6ICVPKSBbU2V0KCkhXSIKKwkiLFxuQ2FsbGVyc3RhY2s6ICVPXG5cbiIsCisJICAgICAgICBzdHJmdGltZSgiJWMiLHRpbWUoKSksIHBsLCBWYWx1ZSwgVHlwZSwgY2FsbGVyX3N0YWNrKCkpKTsKKyAgfQorICByZXR1cm4gcGwtPlNldChuYW1lLCBWYWx1ZSwgVHlwZSwgZXh0ZXJuKTsKK30KKworaW50IHN0b3AoKSB7CisgIHVuc2hhZG93KCk7CisgIGRlc3RydWN0KE1FKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgcmVzZXQoKSB7CisgIGlmICghb2JqZWN0cChwbCkpIAorICAgIHN0b3AoKTsKK30KKworaW50IHJlbW92ZSgpIHsKKyAgc3RvcCgpOworICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9zaGFkb3dzL3Rhcm5oZWxtX3NoYWRvdy5jIGIvc3RkL3BsYXllci9zaGFkb3dzL3Rhcm5oZWxtX3NoYWRvdy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZWE3NDQKLS0tIC9kZXYvbnVsbAorKysgYi9zdGQvcGxheWVyL3NoYWRvd3MvdGFybmhlbG1fc2hhZG93LmMKQEAgLTAsMCArMSwxNDAgQEAKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMKKworI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisKKyNkZWZpbmUgV0VHKCkgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSkKKworb2JqZWN0IHBsYXllcjsKK2ludCBnZW5kZXI7CitzdHJpbmcgZGVzYzsKKwordm9pZCBfdGFybl90dXJuX29uKG9iamVjdCBwbCxzdHJpbmcgdHh0LGludCBnZW4pCit7CisgIGlmICghb2JqZWN0cChwbCl8fCFpbnRlcmFjdGl2ZShwbCkpIHJldHVybiBXRUcoKTsKKyAgaWYgKCFzdHJpbmdwKHR4dCl8fHR4dD09IiIpIHJldHVybiBXRUcoKTsKKyAgaWYgKGdlbjwwfHxnZW4+MikgcmV0dXJuIFdFRygpOworICBwbGF5ZXI9cGw7CisgIGRlc2M9Y2FwaXRhbGl6ZSh0eHQpOworICBnZW5kZXI9Z2VuOworICBzaGFkb3cocGwsMSk7Cit9CisKK2ludCBzcGVjaWFsX3ZlcmIoKQoreworICBzdHJpbmcgdmVyYjsKKyAgCisgIHZlcmI9cXVlcnlfdmVyYigpOworICBpZiAoIXZlcmJ8fHZlcmI9PSIiKSByZXR1cm4gMDsKKyAgaWYgKHZlcmJbMF09PSctJykgcmV0dXJuIDE7CisgIGlmICh2ZXJiPT0icnVmInx8dmVyYj09InJ1ZmUifHx2ZXJiPT0idGVpbGUifHx2ZXJiPT0idGVpbCJ8fHZlcmI9PSJtcnVmInx8CisgICAgICB2ZXJiPT0ibXJ1ZmUifHx2ZXJiPT0iZXJ6YWVobCJ8fHZlcmI9PSJlcnphZWhsZSIpIHJldHVybiAxOworICByZXR1cm4oMCk7IC8vIG5vbi12b2lkIGZ1bmt0aW9uLCBaZXNzdHJhCit9CisKK2ludCBfcXVlcnlfZ2VuZGVyKCkKK3sKKyAgcmV0dXJuIGdlbmRlcjsKK30KKworc3RyaW5nIF9xdWVyeV9uYW1lKCkKK3sKKyAgaWYgKCFzcGVjaWFsX3ZlcmIoKSkKKyAgICByZXR1cm4gY2FwaXRhbGl6ZShkZXNjKTsKKyAgcmV0dXJuIHBsYXllci0+UXVlcnkoUF9OQU1FKTsKK30KKworc3RyaW5nIF9xdWVyeV9zaG9ydCgpCit7CisgIHJldHVybiBjYXBpdGFsaXplKHBsYXllci0+bmFtZSgpKTsKK30KKworc3RyaW5nIF9xdWVyeV9sb25nKCkKK3sKKyAgc3RyaW5nIHN0cjsKKworICBzdHI9cGxheWVyLT5uYW1lKCk7CisgIHJldHVybiBjYXBpdGFsaXplKHN0cikrIiBpc3QgIitzdHIrIiBpc3QgIitzdHIrIi5cbiI7Cit9CisKK3N0cmluZyogX3F1ZXJ5X2lkcygpCit7CisgIHJldHVybiBwbGF5ZXItPlF1ZXJ5KCJpZHMiKSsoe2xvd2VyX2Nhc2UoZGVzYyl9KTsKK30KKworc3RyaW5nIF9xdWVyeV9yYWNlKCkKK3sKKyAgcmV0dXJuIGRlc2M7Cit9CisKK3ZvaWQgX3Rhcm5fdHVybl9vZmYoKQoreworICB1bnNoYWRvdygpOworICBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKK30KKworaW50IF9xdWVyeV9hcnRpY2xlKCkKK3sKKyAgaWYgKCFzcGVjaWFsX3ZlcmIoKSkKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuKDApOyAvLyBub24tdm9pZCBmdW5rdGlvbiwgWmVzc3RyYQorfQorCitzdHJpbmcgX3F1ZXJ5X3ByZXNheSgpCit7CisgIHJldHVybiAiIjsKK30KKworc3RyaW5nIF9xdWVyeV90aXRsZSgpCit7CisgIHJldHVybiAiIjsKK30KKwordm9pZCBEZWZlbmQoaW50IGRhbSxtaXhlZCBkYW1fdHlwZSxtaXhlZCBzcGVsbCxvYmplY3QgZW5lbXkpCit7CisgIG9iamVjdCBvOworCisgIGlmICghcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShwcmV2aW91c19vYmplY3QoKSkpCisgICAgcGxheWVyLT5EZWZlbmQoZGFtLCBkYW1fdHlwZSwgc3BlbGwsIGVuZW15KTsKKyAgZWxzZQorICAgIHByZXZpb3VzX29iamVjdCgpLT5TdG9wSHVudEZvcihwbGF5ZXIpOworICBpZiAoKG89cHJlc2VudCgiXG50YXJuaGVsbSIscGxheWVyKSkpCisgICAgICAgIG8tPkRvVW53ZWFyKCk7CisgIGlmICh0aGlzX29iamVjdCgpKSBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKK30KKworaW50IEtpbGwob2JqZWN0IG9iKQoreworICBvYmplY3QgbzsKKworICBpZiAoKG89cHJlc2VudCgiXG50YXJuaGVsbSIscGxheWVyKSkpCisgICAgICBvLT5Eb1Vud2VhcigpOworICBpZiAodGhpc19vYmplY3QoKSkgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7CisgIHJldHVybigwKTsgLy8gbm9uLXZvaWQgZnVua3Rpb24sIFplc3N0cmEKK30KKworaW50IEluc2VydEVuZW15KG9iamVjdCBvYikKK3sKKyAgb2JqZWN0IG87CisKKyAgaWYgKCFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSkKKyAgICBwbGF5ZXItPkluc2VydEVuZW15KG9iKTsKKyAgZWxzZQorICAgIG9iLT5TdG9wSHVudEZvcihwbGF5ZXIpOworICBpZiAoKG89cHJlc2VudCgiXG50YXJuaGVsbSIscGxheWVyKSkpCisgICAgICBvLT5Eb1Vud2VhcigpOworICBpZiAodGhpc19vYmplY3QoKSkgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7CisgIHJldHVybiAwOworfQorCitzdHJpbmcgc2hvcnQoKQoreworICBpZiAob2xkX2V4cGxvZGUob2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpLCIjIilbMF09PSIvb2JqL3dlcmxpc3RlIikKKyAgICByZXR1cm4gY2FwaXRhbGl6ZShnZXRldWlkKHBsYXllcikrIiB2ZXJrbGVpZGV0IGFscyAiK3BsYXllci0+c2hvcnQoKSk7CisgIHJldHVybiBwbGF5ZXItPnNob3J0KCk7Cit9CisKK3N0cmluZyBRdWVyeURpc2d1aXNlKCkKK3sKKyAgcmV0dXJuIGRlc2M7IAorfQpkaWZmIC0tZ2l0IGEvc3RkL3BsYXllci9zaGFkb3dzL3phdWJlcnNoLmMgYi9zdGQvcGxheWVyL3NoYWRvd3MvemF1YmVyc2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTljZWNjCi0tLSAvZGV2L251bGwKKysrIGIvc3RkL3BsYXllci9zaGFkb3dzL3phdWJlcnNoLmMKQEAgLTAsMCArMSwyMjAgQEAKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLHNhdmVfdHlwZXMKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKworb2JqZWN0IGNhc3RlcjsKK3N0cmluZyppZHMsbmFtZTsKK2ludCBnZW5kZXIsYXJ0aWNsZSxwbHVyYWw7CitzdHJpbmcgbGdkZXNjOworc3RyaW5nIG1pbixtb3V0LG1taW4sbW1vdXQ7CittaXhlZCBoYW5kczsKKwordm9pZCBJbml0aWFsaXplKG9iamVjdCBfY2FzdGVyLAorICAgICAgICAgICAgICAgIHN0cmluZypfaWRzLAorICAgICAgICAgICAgICAgIHN0cmluZyBfbmFtZSwKKyAgICAgICAgICAgICAgICBpbnQgX2dlbmRlciwKKyAgICAgICAgICAgICAgICBpbnQgX2FydGljbGUsCisgICAgICAgICAgICAgICAgaW50IF9wbHVyYWwpCit7IGlmKCFvYmplY3RwKF9jYXN0ZXIpICAgIHx8CisgICAgICFpbnRlcmFjdGl2ZShfY2FzdGVyKXx8CisgICAgICFzdHJpbmdwKF9uYW1lKSAgICAgIHx8CisgICAgIF9uYW1lPT0iIiAgICAgICAgICAgIHx8CisgICAgIF9nZW5kZXI8MCAgICAgICAgICAgIHx8CisgICAgIF9nZW5kZXI+MikKKyAgeyBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKKyAgICByZXR1cm47CisgIH0KKyAgY2FzdGVyPV9jYXN0ZXI7CisgIGlkcz1faWRzOworICBuYW1lPV9uYW1lOworICBnZW5kZXI9X2dlbmRlcjsKKyAgYXJ0aWNsZT1fYXJ0aWNsZTsKKyAgcGx1cmFsPV9wbHVyYWw7CisgIGxnZGVzYz0wOworICBzaGFkb3coY2FzdGVyLDEpOworfQorCit2b2lkIFNldExvbmdEZXNjKHN0cmluZyB0eHQpCit7IGlmKCFzdHJpbmdwKHR4dCl8fHR4dD09IiIpCisgICAgcmV0dXJuOworICBsZ2Rlc2M9dHh0OworfQorCitzdHJpbmcqIF9xdWVyeV9pZHMoKQoreyByZXR1cm4gY2FzdGVyLT5RdWVyeShQX0lEUykraWRzOworfQorCisvLyBuaWNodCBhbGxlIFZlcmJlbiBtaXQgdmVyYWVuZGVydGVtIEF1c3NlaGVuCitpbnQgc3BlY2lhbF92ZXJiKCkKK3sgc3RyaW5nIHZlcmI7CisgIHZlcmI9cXVlcnlfdmVyYigpOworICBpZighc3RyaW5ncCh2ZXJiKXx8dmVyYj09IiIpCisgICAgcmV0dXJuIDA7CisgIGlmKHZlcmJbMF09PSctJykKKyAgICByZXR1cm4gMTsKKyAgaWYobWVtYmVyKCh7InJ1ZiIsInJ1ZmUiLCJtcnVmIiwibXJ1ZmUiLAorICAgICAgICAgICAgICAidGVpbCIsInRlaWxlIiwiZXJ6YWVobCIsImVyemFlaGxlIn0pLHZlcmIpIT0tMSkKKyAgICByZXR1cm4gMTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0cmluZyBfcXVlcnlfbmFtZSgpCit7IGlmKCFzcGVjaWFsX3ZlcmIoKSkKKyAgICByZXR1cm4gbmFtZTsKKyAgcmV0dXJuIGNhcGl0YWxpemUoY2FzdGVyLT5RdWVyeShQX05BTUUpKTsKK30KKworc3RyaW5nIF9xdWVyeV9zaG9ydCgpCit7IGlmKCFzcGVjaWFsX3ZlcmIoKSkKKyAgICByZXR1cm4gY2FzdGVyLT5OYW1lKCk7CisgIHJldHVybiBjYXN0ZXItPlF1ZXJ5KFBfU0hPUlQpOworfQorCitzdHJpbmcgX3F1ZXJ5X2xvbmcoKQoreyBpZighc3BlY2lhbF92ZXJiKCkpCisgIHsgc3RyaW5nIHN0cjsKKyAgICBpZihsZ2Rlc2MpCisgICAgICByZXR1cm4gbGdkZXNjOworICAgIHN0cj1jYXN0ZXItPm5hbWUoKTsKKyAgICByZXR1cm4gYnJlYWtfc3RyaW5nKGNhcGl0YWxpemUoc3RyKSsiIGlzdCAiK3N0cisiIGlzdCAiK3N0cisiLiIsNzgpOworICB9CisgIHJldHVybiBjYXN0ZXItPlF1ZXJ5KFBfTE9ORyk7Cit9CisKK2ludCBfcXVlcnlfZ2VuZGVyKCkKK3sgaWYoIXNwZWNpYWxfdmVyYigpKQorICAgIHJldHVybiBnZW5kZXI7CisgIHJldHVybiBjYXN0ZXItPlF1ZXJ5KFBfR0VOREVSKTsKK30KKworaW50IF9xdWVyeV9hcnRpY2xlKCkKK3sgaWYoIXNwZWNpYWxfdmVyYigpKQorICAgIHJldHVybiBhcnRpY2xlOworICByZXR1cm4gY2FzdGVyLT5RdWVyeShQX0FSVElDTEUpOworfQorCitpbnQgX3F1ZXJ5X3BsdXJhbCgpCit7IGlmKCFzcGVjaWFsX3ZlcmIoKSkKKyAgICByZXR1cm4gcGx1cmFsOworICByZXR1cm4gY2FzdGVyLT5RdWVyeShQX1BMVVJBTCk7Cit9CisKK3N0cmluZyBfcXVlcnlfcmFjZSgpCit7IGlmKCFzcGVjaWFsX3ZlcmIoKSkKKyAgICByZXR1cm4gbmFtZTsKKyAgcmV0dXJuIGNhc3Rlci0+UXVlcnkoUF9SQUNFKTsKK30KKwordmFyYXJncyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpIHsKKyAgdW5zaGFkb3coKTsKKyAgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7CisgIHJldHVybiAxOworfQorCit2b2lkIHN0b3Bfc2hhZG93KCkKK3sgCisgIHJlbW92ZSgpOworfQorCitzdHJpbmcgX3F1ZXJ5X3ByZXNheSgpCit7IHJldHVybiIiOworfQorCitzdHJpbmcgX3F1ZXJ5X3RpdGxlKCkKK3sgcmV0dXJuIiI7Cit9CisKK3N0cmluZyBfc2V0X21zZ2luKHN0cmluZyB2YWwpCit7IHJldHVybiBtaW49dmFsOworfQorCitzdHJpbmcgX3F1ZXJ5X21zZ2luKCkKK3sgcmV0dXJuIG1pbjsKK30KKworc3RyaW5nIF9zZXRfbXNnb3V0KHN0cmluZyB2YWwpCit7IHJldHVybiBtb3V0PXZhbDsKK30KKworc3RyaW5nIF9xdWVyeV9tc2dvdXQoKQoreyByZXR1cm4gbW91dDsKK30KKworc3RyaW5nIF9zZXRfbW1zZ2luKHN0cmluZyB2YWwpCit7IHJldHVybiBtbWluPXZhbDsKK30KKworc3RyaW5nIF9xdWVyeV9tbXNnaW4oKQoreyByZXR1cm4gbW1pbjsKK30KKworc3RyaW5nIF9zZXRfbW1zZ291dChzdHJpbmcgdmFsKQoreyByZXR1cm4gbW1vdXQ9dmFsOworfQorCitzdHJpbmcgX3F1ZXJ5X21tc2dvdXQoKQoreyByZXR1cm4gbW1vdXQ7Cit9CisKK21peGVkIF9zZXRfaGFuZHMobWl4ZWQgdmFsKQoreyByZXR1cm4gaGFuZHM9dmFsOworfQorCittaXhlZCBfcXVlcnlfaGFuZHMoKQoreyByZXR1cm4gaGFuZHM7Cit9CisKK3ZhcmFyZ3MgaW50IERlZmVuZChpbnQgZGFtLG1peGVkIGRhbV90eXBlLG1peGVkIHNwZWxsLG9iamVjdCBlbmVteSkKK3sgb2JqZWN0IG9iOworICBpZighZW5lbXkgfHwgIC8vIFNpbHZhbmEgMjYuMS4yMDAyCisgICAgICghcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShwcmV2aW91c19vYmplY3QoKSkmJgorICAgICAgIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoZW5lbXkpKSkKKyAgICByZXR1cm4gY2FzdGVyLT5EZWZlbmQoZGFtLGRhbV90eXBlLHNwZWxsLGVuZW15KTsKKyAgZWxzZQorICB7IGVuZW15LT5TdG9wSHVudEZvcihjYXN0ZXIpOworICAgIGNhc3Rlci0+U3RvcEh1bnRGb3IoZW5lbXkpOworICB9CisgIGlmKG9iamVjdHAob2I9cHJlc2VudCgiemF1YmVyZXJcbnNoYWRvdyIsY2FzdGVyKSkpCisgICAgb2ItPnJlbW92ZSgpOworICBpZih0aGlzX29iamVjdCgpKQorICAgIHJlbW92ZSgpOworICByZXR1cm4gMDsKK30KKworaW50IEtpbGwob2JqZWN0IGVuZW15KQoreyBvYmplY3Qgb2I7CisgIGlmKCFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKGVuZW15KSkKKyAgICByZXR1cm4gY2FzdGVyLT5LaWxsKGVuZW15KTsKKyAgaWYob2JqZWN0cChvYj1wcmVzZW50KCJ6YXViZXJlclxuc2hhZG93IixjYXN0ZXIpKSkKKyAgICBvYi0+cmVtb3ZlKCk7CisgIGlmKHRoaXNfb2JqZWN0KCkpCisgICAgcmVtb3ZlKCk7CisgIHJldHVybiAwOworfQorCitpbnQgSW5zZXJ0RW5lbXkob2JqZWN0IGVuZW15KQoreyBvYmplY3Qgb2I7CisgIGlmKCFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKGVuZW15KSkKKyAgICByZXR1cm4gY2FzdGVyLT5JbnNlcnRFbmVteShlbmVteSk7CisgIGVsc2UgeworICAgIGVuZW15LT5TdG9wSHVudEZvcihjYXN0ZXIpOworICAgIGNhc3Rlci0+U3RvcEh1bnRGb3IoZW5lbXkpOworICB9CisgIGlmKG9iamVjdHAob2I9cHJlc2VudCgiemF1YmVyZXJcbnNoYWRvdyIsY2FzdGVyKSkpCisgICAgb2ItPnJlbW92ZSgpOworICBpZih0aGlzX29iamVjdCgpKQorICAgIHJlbW92ZSgpOworICByZXR1cm4gMDsKK30KKworc3RyaW5nIHNob3J0KCkKK3sgaWYobG9hZF9uYW1lKHByZXZpb3VzX29iamVjdCgpKSA9PSAiL29iai93ZXJsaXN0ZSIpCisgICAgcmV0dXJuIGNhcGl0YWxpemUoZ2V0ZXVpZChjYXN0ZXIpKSsiIHZlcmtsZWlkZXQgYWxzICIrY2FzdGVyLT5zaG9ydCgpOworICByZXR1cm4gY2FzdGVyLT5zaG9ydCgpOworfQorCit2YXJhcmdzIHN0cmluZyBsb25nKCkKK3sgaWYobGdkZXNjKQorICAgIHJldHVybiBsZ2Rlc2M7CisgIHJldHVybiBjYXN0ZXItPmxvbmcoKTsKK30K