ZGlmZiAtLWdpdCBhL29iai8ucmVhZG1lIGIvb2JqLy5yZWFkbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU3NDgzYQotLS0gL2Rldi9udWxsCisrKyBiL29iai8ucmVhZG1lCkBAIC0wLDAgKzEsNSBAQAorSW4gZGllc2VtIFZlcnplaWNobmlzIGJla29tbWVuIGFsbGUgT2JqZWt0ZSBkaWUgVUlEIGRlcyBlcnpldWdlcnMgKHdhcworZGVtZW50c3ByZWNoZW5kIGJpcyBHb3R0IGdlaHQpLCBkYWhlciBkdWVyZmVuIGhpZXIgbnVyIEVNKyBzY2hyZWliZW4gdW5kIGhpZXIKK2FuZ2VzY2hsb3NzZW5lciBDb2RlIHNvbGx0ZSBzZWhyIGdydWVuZGxpY2ggZ2VwcnVlZnQgd2VyZGVuLgorRnVlciBnbG9iYWwgdmVyZnVlZ2JhcmUgSXRlbXMgaW4gU3BpZWxlcmhhZW5kZW4gc29sbHRlIC9pdGVtcy8gdmVyd2VuZGV0Cit3ZXJkZW4uCmRpZmYgLS1naXQgYS9vYmovYm9lcnNlLmMgYi9vYmovYm9lcnNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI1NGQ3NAotLS0gL2Rldi9udWxsCisrKyBiL29iai9ib2Vyc2UuYwpAQCAtMCwwICsxLDIgQEAKKyNwcmFnbWEgbm9fY2xvbmUKKwpkaWZmIC0tZ2l0IGEvb2JqL2Rvb3JtYXN0ZXIuYyBiL29iai9kb29ybWFzdGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZlOTM2NAotLS0gL2Rldi9udWxsCisrKyBiL29iai9kb29ybWFzdGVyLmMKQEAgLTAsMCArMSw0NjkgQEAKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisjaW5jbHVkZSA8ZG9vcnJvb20uaD4KKworaW5oZXJpdCAiL3N0ZC90aGluZyI7CisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisKK3ByaXZhdGUgbWFwcGluZyBkb29yX3N0YXR1czsKK3ByaXZhdGUgaW50IGlkX3phZWhsZXI7CisvLyBGb3JtYXQ6ICJmaWxlbmFtZTE6ZmlsZW5hbWUyIjpzdGF0dXMKKworaW50IG9lZmZuZW4gKHN0cmluZyBzdHIpOworCittYXBwaW5nIFF1ZXJ5QWxsRG9vcnMoKSB7cmV0dXJuIGRvb3Jfc3RhdHVzO30KKworaW50IFF1ZXJ5RG9vclN0YXR1cyhzdHJpbmcgZGVzdCkgeworICBzdHJpbmcgc291cmNlLGRrZXk7CisgIG9iamVjdCBlbnY7CisKKyAgaWYgKCFkZXN0KSByZXR1cm4gMDsKKyAgaWYgKCFvYmplY3RwKGVudj1wcmV2aW91c19vYmplY3QoKSkpIHJldHVybiAwOworICBzb3VyY2U9b2JqZWN0X25hbWUoZW52KTsKKyAgZGtleT0oc291cmNlPGRlc3QpPyhzb3VyY2UrIjoiK2Rlc3QpOihkZXN0KyI6Iitzb3VyY2UpOworICByZXR1cm4gZG9vcl9zdGF0dXNbZGtleV07Cit9CisKK3ZvaWQgU2V0RG9vclN0YXR1cyhzdHJpbmcgZGVzdCwgaW50IHgpIHsKKyAgc3RyaW5nIHNvdXJjZSxka2V5OworICBvYmplY3QgZW52OworCisgIGlmICghZGVzdCkgcmV0dXJuOworICBpZiAoIW9iamVjdHAoZW52PXByZXZpb3VzX29iamVjdCgpKSkgcmV0dXJuOworICBzb3VyY2U9b2JqZWN0X25hbWUoZW52KTsKKyAgZGtleT0oc291cmNlPGRlc3QpPyhzb3VyY2UrIjoiK2Rlc3QpOihkZXN0KyI6Iitzb3VyY2UpOworICBkb29yX3N0YXR1c1tka2V5XT14OworfQorCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKSB7CisgIGRvb3Jfc3RhdHVzPShbXSk7CisgIGlkX3phZWhsZXI9MDsKKyAgaWYgKElTX0NMT05FKHRoaXNfb2JqZWN0KCkpKSByZW1vdmUoKTsKK30KKwordmFyYXJncyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpIHtyZXR1cm4gMDt9CisKK3ZhcmFyZ3MgaW50IE5ld0Rvb3Ioc3RyaW5nfHN0cmluZyogY21kcywgc3RyaW5nIGRlc3QsIHN0cmluZ3xzdHJpbmcqIGlkcywKKyAgICAgICAgICAgICAgICAgICAgbWFwcGluZ3w8aW50fHN0cmluZ3xzdHJpbmcqPiogcHJvcHMpCit7CisgIG9iamVjdCBlbnY7CisgIHN0cmluZyBzb3VyY2UsZGtleSxzZWNfaWQ7CisgIG1peGVkICppbmZvMix6dzsKKyAgbWFwcGluZyBpbmZvOworICBpbnQgaTsKKworICBpZiAoIW9iamVjdHAoZW52PXByZXZpb3VzX29iamVjdCgpKSkgcmV0dXJuIDA7CisgIGlmICghY21kcyB8fCAhZGVzdCkgcmV0dXJuIDA7CisgIGlmICghaWRzKSBpZHM9KHsidHVlciJ9KTsKKyAgaWYgKHN0cmluZ3AoY21kcykpIGNtZHM9KHtjbWRzfSk7CisgIGlmIChzdHJpbmdwKGlkcykpIGlkcz0oe2lkc30pOworICBpZiAoIXBvaW50ZXJwKGNtZHMpIHx8ICFwb2ludGVycChpZHMpKSByZXR1cm4gMDsKKyAgaWYgKGRlc3RbMC4uMF0hPSIvIikgZGVzdD0iLyIrZGVzdDsKKyAgaWRfemFlaGxlcisrOworICBzZWNfaWQ9c3ByaW50Zigic2VjdXJlX2lkOmRvb3IlZCIsaWRfemFlaGxlcik7CisKKyAgaW5mbz0oW0RfREVTVCAgIDogZGVzdCwKKwkgRF9DTURTICAgOiBjbWRzLAorCSBEX0lEUyAgICA6ICh7IHNlY19pZCB9KSArIGlkcywKKwkgRF9GTEFHUyAgOiAoRE9PUl9DTE9TRUR8RE9PUl9SRVNFVF9DTCksCisgICAgICAgICBEX0xPTkcgICA6ICJFaW5lIFR1ZXIuXG4iLAorCSBEX1NIT1JUICA6ICJFaW5lICVzZSBUdWVyLiAiLAorCSBEX05BTUUgICA6ICJUdWVyIiwKKwkgRF9HRU5ERVIgOiBGRU1BTEVdKTsKKyAgc291cmNlPW9iamVjdF9uYW1lKGVudik7CisgIGRrZXk9KHNvdXJjZTxkZXN0KT8oc291cmNlKyI6IitkZXN0KTooZGVzdCsiOiIrc291cmNlKTsKKworICBpZiAocG9pbnRlcnAocHJvcHMpKSB7CisgICAgZm9yIChpPTA7aTxzaXplb2YocHJvcHMpLTE7aSs9MikKKyAgICAgIGlmIChpbnRwKHByb3BzW2ldKSAmJiBwcm9wc1tpXT49RF9NSU5QUk9QUyAmJiBwcm9wc1tpXTw9RF9NQVhQUk9QUykKKyAgICAgICAgaW5mb1twcm9wc1tpXV09cHJvcHNbaSsxXTsKKyAgfQorICBlbHNlIGlmKG1hcHBpbmdwKHByb3BzKSl7CisgICAgaW5mbyArPSBwcm9wczsKKyAgfQorCisgIGlmICghZG9vcl9zdGF0dXNbZGtleV0pIHsKKyAgICAvLyBOdXIgaW5pdGlhbGlzaWVyZW4sIHdlbm4gVHVlciBub2NoIG5pY2h0IGV4aXN0aWVydC4KKyAgICBpZiAoaW5mb1tEX0ZMQUdTXSAmIERPT1JfT1BFTikKKyAgICAgICAgZG9vcl9zdGF0dXNbZGtleV09RF9TVEFUVVNfT1BFTjsKKyAgICBpZiAoaW5mb1tEX0ZMQUdTXSAmIERPT1JfQ0xPU0VEKQorICAgICAgICBkb29yX3N0YXR1c1tka2V5XT0KKyAgICAgICAgICAoKGluZm9bRF9GTEFHU10gJiBET09SX05FRURLRVkpID8gRF9TVEFUVVNfTE9DS0VEIDogRF9TVEFUVVNfQ0xPU0VEKTsKKyAgfQorICBpbmZvMj1lbnYtPlF1ZXJ5UHJvcChQX0RPT1JfSU5GT1MpOworICBpZiAoIXBvaW50ZXJwKGluZm8yKSkKKyAgICBpbmZvMj0oe2luZm99KTsKKyAgZWxzZQorICAgIGluZm8yKz0oe2luZm99KTsKKyAgZW52LT5TZXRQcm9wKFBfRE9PUl9JTkZPUyxpbmZvMik7CisKKyAgaWYobWFwcGluZ3AoaW5mb1tEX0xPTkddKSAmJiBwb2ludGVycCh6dz1tX2luZGljZXMoaW5mb1tEX0xPTkddKSkgJiYKKyAgICAgc2l6ZW9mKHp3KSAmJiBpbnRwKHp3WzBdKSkKKyAgICBlbnYtPkFkZFNwZWNpYWxEZXRhaWwoaWRzLCJzcGVjaWFsX2RldGFpbF9kb29ycyIpOworICBlbHNlIGlmKGluZm9bRF9MT05HXSAmJiBpbmZvW0RfTE9OR10hPSIiKQorICAgIGVudi0+QWRkRGV0YWlsKGlkcyxpbmZvW0RfTE9OR10pOworCisgIHJldHVybiAxOworfQorCit2b2lkIGluaXRfZG9vcnMgKCkgeworICBvYmplY3QgZW52OworICBtaXhlZCAqaW5mbzsKKyAgc3RyaW5nIHNvdXJjZSxkZXN0LGRrZXk7CisgIGludCBpOworCisgIGlmICghb2JqZWN0cChlbnY9cHJldmlvdXNfb2JqZWN0KCkpKSByZXR1cm47CisgIGluZm89ZW52LT5RdWVyeVByb3AoUF9ET09SX0lORk9TKTsKKyAgaWYgKCFwb2ludGVycChpbmZvKSkgcmV0dXJuOworCisgIHNvdXJjZT1vYmplY3RfbmFtZShlbnYpOworICBmb3IgKGk9c2l6ZW9mKGluZm8pLTE7aT49MDtpLS0pIHsKKyAgICBpZiAoIW1hcHBpbmdwKGluZm9baV0pKSBjb250aW51ZTsKKyAgICBkZXN0PWluZm9baV1bRF9ERVNUXTsKKyAgICBka2V5PShzb3VyY2U8ZGVzdCk/KHNvdXJjZSsiOiIrZGVzdCk6KGRlc3QrIjoiK3NvdXJjZSk7CisgICAgZW52LT5zZXRfZG9vcnMoaW5mb1tpXVtEX0NNRFNdLChkb29yX3N0YXR1c1tka2V5XT4wKSk7CisgIH0KK30KKworc3RyaW5nIGxvb2tfZG9vcnMgKCkgeworICBvYmplY3QgZW52OworICBtaXhlZCAqaW5mbywgZHM7CisgIHN0cmluZyBzb3VyY2UsZGtleSxkZXN0LHJlczsKKyAgaW50IGksIHN0OworCisgIGlmICghb2JqZWN0cChlbnY9cHJldmlvdXNfb2JqZWN0KCkpKSByZXR1cm4gIiI7CisgIGluZm89ZW52LT5RdWVyeVByb3AoUF9ET09SX0lORk9TKTsKKyAgaWYgKCFwb2ludGVycChpbmZvKSkgcmV0dXJuICIiOworICBpbml0X2Rvb3JzKCk7IC8vIEFrdHVlbGxlciBadXN0YW5kIHNvbGwgYXVjaCBiZWkgZGVuIEV4aXRzIGFuZ2V6ZWlndCB3ZXJkZW4KKworICBzb3VyY2U9b2JqZWN0X25hbWUoZW52KTtyZXM9IiI7CisgIGZvciAoaT1zaXplb2YoaW5mbyktMTtpPj0wO2ktLSkgeworICAgIGlmICghbWFwcGluZ3AoaW5mb1tpXSkpIGNvbnRpbnVlOworICAgIGRlc3Q9aW5mb1tpXVtEX0RFU1RdOworICAgIGRrZXk9KHNvdXJjZTxkZXN0KT8oc291cmNlKyI6IitkZXN0KTooZGVzdCsiOiIrc291cmNlKTsKKyAgICBpZiAoc3RyaW5ncChpbmZvW2ldW0RfU0hPUlRdKSkgeworICAgICAgcmVzKz1zcHJpbnRmKGluZm9baV1bRF9TSE9SVF0sCisJCSAgICAoKGRvb3Jfc3RhdHVzW2RrZXldPj1EX1NUQVRVU19PUEVOKT8iZ2VvZWZmbmV0IjoKKwkJCSAoKGRvb3Jfc3RhdHVzW2RrZXldIT1EX1NUQVRVU19DTE9TRUQpPyJhYiI6IiIpKyJnZXNjaGxvc3NlbiIpKTsKKwkgIGlmIChzaXplb2YocmVzKSAmJiByZXNbPDFdIT0nXG4nKQorCQlyZXMrPSIgIjsKKwl9CisgICAgZWxzZSBpZihtYXBwaW5ncChkcz1pbmZvW2ldW0RfU0hPUlRdKSl7CisgICAgICBzdD1kb29yX3N0YXR1c1tka2V5XTsKKyAgICAgIGlmKChzdD09RF9TVEFUVVNfTE9DS0VEKSAmJiAhZHNbRF9TVEFUVVNfTE9DS0VEXSkKKyAgICAgICAgc3Q9RF9TVEFUVVNfQ0xPU0VEOworICAgICAgaWYoc3RyaW5ncChkc1tzdF0pKXsKKyAgICAgICAgcmVzICs9IGRzW3N0XTsKKyAgICAgICAgaWYoc2l6ZW9mKGRzW3N0XSkgJiYgcmVzWzwxXSE9J1xuJylyZXMrPSIgIjsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYgKHJlcyAmJiByZXMhPSIiKQorICAgIHJldHVybiBicmVha19zdHJpbmcocmVzLDc4LDAsMSk7CisgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyB2b2lkIGRvb3JfbWVzc2FnZShvYmplY3Qgcm9vbSwgc3RyaW5nIGRuYW1lLCBpbnQgZGdlbmRlciwgc3RyaW5nIG1zZykgeworICBvYmplY3Qgb2I7CisKKyAgLy8gcHJpbnRmKCIlTywlTywlTywlT1xuIixyb29tLGRuYW1lLGRnZW5kZXIsbXNnKTsKKyAgaWYgKCFyb29tIHx8ICFkbmFtZSB8fCAhbXNnKSByZXR1cm47CisgIG9iPXRoaXNfb2JqZWN0KCk7CisgIG9iLT5TZXRQcm9wKFBfTkFNRSxkbmFtZSk7CisgIG9iLT5TZXRQcm9wKFBfR0VOREVSLGRnZW5kZXIpOworICBvYi0+U2V0UHJvcChQX0FSVElDTEUsMSk7CisgIHRlbGxfcm9vbShyb29tLGNhcGl0YWxpemUob2ItPm5hbWUoV0VSKSkrbXNnKyJcbiIpOworfQorCitzdGF0aWMgdm9pZCBkb29yX21lc3NhZ2Vfb3RoZXIoc3RyaW5nIHNvdXJjZSwgc3RyaW5nIGRlc3QsIHN0cmluZyBtc2cpIHsKKyAgbWl4ZWQgaW5mbzsKKyAgb2JqZWN0IGVudjsKKyAgaW50IGk7CisKKyAgLy8gcHJpbnRmKCIlTyAlTyAlT1xuIixzb3VyY2UsZGVzdCxtc2cpOworICBpZiAoIXNvdXJjZSB8fCAhZGVzdCB8fCAhbXNnKSByZXR1cm47CisgIGlmICghb2JqZWN0cChlbnY9ZmluZF9vYmplY3QoZGVzdCkpKSByZXR1cm47CisgIGlmICghcG9pbnRlcnAoaW5mbz1lbnYtPlF1ZXJ5UHJvcChQX0RPT1JfSU5GT1MpKSkgcmV0dXJuOworICBmb3IgKGk9c2l6ZW9mKGluZm8pLTE7aT49MDtpLS0pIHsKKyAgICBpZiAoIW1hcHBpbmdwKGluZm9baV0pKSBjb250aW51ZTsKKyAgICBpZiAoaW5mb1tpXVtEX0RFU1RdIT1zb3VyY2UpIGNvbnRpbnVlOyAvLyBBbmRlcmUgVHVlciB6dSBkaWVzZW0gUmF1bQorICAgIGRvb3JfbWVzc2FnZShlbnYsaW5mb1tpXVtEX05BTUVdLGluZm9baV1bRF9HRU5ERVJdLG1zZyk7CisgIH0KK30KKwordm9pZCByZXNldF9kb29ycyAoKSB7CisgIG9iamVjdCBlbnY7CisgIG1peGVkICppbmZvOworICBzdHJpbmcgc291cmNlLGRlc3QsZGtleSxtc2c7CisgIGludCBpLGo7CisKKyAgaWYgKCFvYmplY3RwKGVudj1wcmV2aW91c19vYmplY3QoKSkpIHJldHVybjsKKyAgaW5mbz1lbnYtPlF1ZXJ5UHJvcChQX0RPT1JfSU5GT1MpOworICBpZiAoIXBvaW50ZXJwKGluZm8pKSByZXR1cm47CisKKyAgc291cmNlPW9iamVjdF9uYW1lKGVudik7CisgIGZvciAoaT1zaXplb2YoaW5mbyktMTtpPj0wO2ktLSkgeworICAgIGlmICghbWFwcGluZ3AoaW5mb1tpXSkpIGNvbnRpbnVlOworICAgIGRlc3Q9aW5mb1tpXVtEX0RFU1RdOworICAgIGRrZXk9KHNvdXJjZTxkZXN0KT8oc291cmNlKyI6IitkZXN0KTooZGVzdCsiOiIrc291cmNlKTsKKworLy8gCWlmIChkb29yX3N0YXR1c1tka2V5XT4tMiAmJiBkb29yX3N0YXR1c1tka2V5XTwyKSB7CisvLyAJICBpZiAoZG9vcl9zdGF0dXNbZGtleV0+MCkKKy8vIAkJZG9vcl9zdGF0dXNbZGtleV09MjsKKy8vIAkgIGVsc2UKKy8vIAkJZG9vcl9zdGF0dXNbZGtleV09LTI7CisvLyAJICBjb250aW51ZTsgLy8gbnVyIGplZGVyIDIuIFJlc2V0IHdpcmQgYXVzZ2VmdWVocnQuCisvLyAJfQorCisgICAgaWYgKGluZm9baV1bRF9GTEFHU10gJiBET09SX1JFU0VUX0NMKSB7CisgICAgICAvLyBUdWVyIG11c3MgYmVpIFJlc2V0IGdlc2NobG9zc2VuIHdlcmRlbgorICAgICAgaWYgKGRvb3Jfc3RhdHVzW2RrZXldID49IERfU1RBVFVTX09QRU4pIHsKKyAgICAgICAgaWYoIW1zZz1pbmZvW2ldW0RfUkVTRVRfTVNHXSltc2c9IiBzY2hsaWVzc3Qgc2ljaC4iOworICAgICAgICBkb29yX21lc3NhZ2UoZW52LGluZm9baV1bRF9OQU1FXSxpbmZvW2ldW0RfR0VOREVSXSxtc2cpOworICAgICAgICBkb29yX21lc3NhZ2Vfb3RoZXIoc291cmNlLGRlc3QsbXNnKTsKKyAgICAgIH0KKwkgIGlmIChkb29yX3N0YXR1c1tka2V5XSE9RF9TVEFUVVNfTE9DS0VEKQorCQlkb29yX3N0YXR1c1tka2V5XT0KKyAgICAgICgoaW5mb1tpXVtEX0ZMQUdTXSAmIERPT1JfTkVFREtFWSkgPyBEX1NUQVRVU19MT0NLRUQgOiBEX1NUQVRVU19DTE9TRUQpOworICAgIH0KKyAgICBpZiAoaW5mb1tpXVtEX0ZMQUdTXSAmIERPT1JfUkVTRVRfT1ApIHsKKyAgICAgIC8vIFR1ZXIgbXVzcyBiZWkgUmVzZXQgZ2VvZWZmbmV0IHdlcmRlbgorICAgICAgaWYgKGRvb3Jfc3RhdHVzW2RrZXldIDwgRF9TVEFUVVNfT1BFTikgeworICAgICAgICBpZighbXNnPWluZm9baV1bRF9SRVNFVF9NU0ddKW1zZz0iIG9lZmZuZXQgc2ljaC4iOworICAgICAgICBkb29yX21lc3NhZ2UoZW52LGluZm9baV1bRF9OQU1FXSxpbmZvW2ldW0RfR0VOREVSXSxtc2cpOworICAgICAgICBkb29yX21lc3NhZ2Vfb3RoZXIoc291cmNlLGRlc3QsbXNnKTsKKyAgICAgIH0KKyAgICAgIGRvb3Jfc3RhdHVzW2RrZXldPURfU1RBVFVTX09QRU47CisgICAgfQorICB9CisgIGluaXRfZG9vcnMoKTsKK30KKworc3RhdGljIHZhcmFyZ3MgaW50IGV4ZWNfZnVuYzIoc3RyaW5nIGRlc3QsIG1peGVkIGZ1bmMpIHsKKyAgaWYgKCFzdHJpbmdwKGRlc3QpIHx8ICFzdHJpbmdwKGZ1bmMpKSByZXR1cm4gMTsKKyAgY2FsbF9vdGhlcihkZXN0LGZ1bmMpOworICByZXR1cm4gMTsKK30KKwordmFyYXJncyBpbnQgZ29fZG9vciAoc3RyaW5nIHN0cikgeworICBvYmplY3QgZW52LHBsLG9iOworICBtaXhlZCAqaW5mbzsKKyAgc3RyaW5nIHNvdXJjZSxkZXN0LGRrZXk7CisgIGludCBpOworCisgIGlmICghc3RyKSByZXR1cm4gMDsKKyAgaWYgKCFvYmplY3RwKGVudj1wcmV2aW91c19vYmplY3QoKSkpIHJldHVybiAwOworICBpZiAoIW9iamVjdHAocGw9dGhpc19wbGF5ZXIoKSkpIHJldHVybiAwOworICBpbmZvPWVudi0+UXVlcnlQcm9wKFBfRE9PUl9JTkZPUyk7CisgIGlmICghcG9pbnRlcnAoaW5mbykpIHJldHVybiAwOworCisgIHNvdXJjZT1vYmplY3RfbmFtZShlbnYpOworICBvYj10aGlzX29iamVjdCgpOworICBvYi0+U2V0UHJvcChQX0FSVElDTEUsMSk7CisgIGZvciAoaT1zaXplb2YoaW5mbyktMTtpPj0wO2ktLSkgeworICAgIGlmICghbWFwcGluZ3AoaW5mb1tpXSkpIGNvbnRpbnVlOworICAgIGlmIChtZW1iZXIoaW5mb1tpXVtEX0NNRFNdLHN0cik8MCkgY29udGludWU7CisgICAgZGVzdD1pbmZvW2ldW0RfREVTVF07CisgICAgZGtleT0oc291cmNlPGRlc3QpPyhzb3VyY2UrIjoiK2Rlc3QpOihkZXN0KyI6Iitzb3VyY2UpOworICAgIG9iLT5TZXRQcm9wKFBfTkFNRSxpbmZvW2ldW0RfTkFNRV0pOworICAgIG9iLT5TZXRQcm9wKFBfR0VOREVSLGluZm9baV1bRF9HRU5ERVJdKTsKKyAgICBub3RpZnlfZmFpbChjYXBpdGFsaXplKG9iLT5uYW1lKFdFUiwxKSkrIiBpc3QgZ2VzY2hsb3NzZW4uXG4iKTsKKyAgICBpZigoZG9vcl9zdGF0dXNbZGtleV08PTApICYmCisgICAgICAgIWluZm9baV1bRF9PUEVOX1dJVEhfTU9WRV0pIGNvbnRpbnVlOyAvLyBUdWVyIGdlc2NobG9zc2VuCisgICAgaWYoZG9vcl9zdGF0dXNbZGtleV08PTApeworICAgICAgLy8gSW4gZGllc2VtIEZhbGwgdmVyc3VjaGVuLCBkaWUgVHVlciB6dSBvZWZmbmVuLgorICAgICAgb2VmZm5lbihpbmZvW2ldW0RfSURTXVswXSk7CisgICAgfQorICAgIG5vdGlmeV9mYWlsKGNhcGl0YWxpemUob2ItPm5hbWUoV0VSLDEpKSsiIGlzdCBnZXNjaGxvc3Nlbi5cbiIpOworICAgIGlmIChkb29yX3N0YXR1c1tka2V5XTw9MCkgY29udGludWU7IC8vIFR1ZXIgaW1tZXIgbm9jaCB6dS4KKyAgICBpZiAoc3RyaW5ncChpbmZvW2ldW0RfVEVTVEZVTkNdKSkKKyAgICAgIGlmIChjYWxsX290aGVyKGVudixpbmZvW2ldW0RfVEVTVEZVTkNdKSkKKwkJcmV0dXJuIDE7IC8vIER1cmNoZ2FuZyB2b24gZGVyIFR1ZXIgbmljaHQgZXJsYXVidC4KKyAgICBpZiAoc3RyaW5ncChpbmZvW2ldW0RfRlVOQ10pKQorICAgICAgY2FsbF9vdGhlcihlbnYsaW5mb1tpXVtEX0ZVTkNdKTsKKwlpZiAoc3RyaW5ncChpbmZvW2ldW0RfTVNHU10pKSB7CisJICBpZiAocGwtPm1vdmUoZGVzdCxNX0dPLGluZm9baV1bRF9NU0dTXSk+MCkKKwkJcmV0dXJuIGV4ZWNfZnVuYzIoZGVzdCxpbmZvW2ldW0RfRlVOQzJdKTsKKwkgIGVsc2UKKwkJcmV0dXJuIDE7CisJfQorCWlmIChwb2ludGVycChpbmZvW2ldW0RfTVNHU10pICYmIHNpemVvZihpbmZvW2ldW0RfTVNHU10pPj0zKSB7CisJICBpZiAocGwtPm1vdmUoZGVzdCxNX0dPLGluZm9baV1bRF9NU0dTXVswXSwKKwkJCQkgICBpbmZvW2ldW0RfTVNHU11bMV0saW5mb1tpXVtEX01TR1NdWzJdKSkKKwkJcmV0dXJuIGV4ZWNfZnVuYzIoZGVzdCxpbmZvW2ldW0RfRlVOQzJdKTsKKwkgIGVsc2UKKwkJcmV0dXJuIDE7CisJfQorICAgIGlmIChwbC0+bW92ZShkZXN0LE1fR08sIm5hY2ggIitjYXBpdGFsaXplKHN0cikpKQorCSAgcmV0dXJuIGV4ZWNfZnVuYzIoZGVzdCxpbmZvW2ldW0RfRlVOQzJdKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50IG9lZmZuZW4gKHN0cmluZyBzdHIpIHsKKyAgb2JqZWN0IGVudixzY2hsLG9iOworICBtaXhlZCAqaW5mbyxzMjsKKyAgc3RyaW5nIHNvdXJjZSxka2V5LGRlc3QsczE7CisgIGludCBpOworCisgIG5vdGlmeV9mYWlsKCJXQVMgd2lsbHN0IER1IG9lZmZuZW4/XG4iKTsKKyAgaWYgKCFzdHIgfHwgIXRoaXNfcGxheWVyKCkpIHJldHVybiAwOworICBub3RpZnlfZmFpbCgiRGFzIGthbm5zdCBEdSBuaWNodCBvZWZmbmVuLlxuIik7CisgIHN0cj1sb3dlcl9jYXNlKHN0cik7CisgIGlmIChzc2NhbmYoc3RyLCIlcyBtaXQgJXMiLHMxLHMyKSE9MikKKyAgICB7czE9c3RyO3MyPTA7fQorICBpZiAoczIpIHsKKyAgICBpZiAoIShzY2hsPXByZXNlbnQobG93ZXJfY2FzZShzMiksdGhpc19wbGF5ZXIoKSkpKSB7CisgICAgICBub3RpZnlfZmFpbCgiU28gZWluZW4gU2NobHVlc3NlbCBoYXN0IER1IG5pY2h0LlxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgczI9c2NobC0+UXVlcnlEb29yS2V5KCk7CisJICBpZiAoc3RyaW5ncChzMikpIHMyPSh7czJ9KTsKKyAgICB9CisgIH0KKworICBpZiAoIW9iamVjdHAoZW52PXByZXZpb3VzX29iamVjdCgpKSkgcmV0dXJuIDA7CisgIGluZm89ZW52LT5RdWVyeVByb3AoUF9ET09SX0lORk9TKTsKKyAgaWYgKCFwb2ludGVycChpbmZvKSkgcmV0dXJuIDA7CisKKyAgc291cmNlPW9iamVjdF9uYW1lKGVudik7CisgIG9iPXRoaXNfb2JqZWN0KCk7CisgIG9iLT5TZXRQcm9wKFBfQVJUSUNMRSwxKTsKKyAgZm9yIChpPXNpemVvZihpbmZvKS0xO2k+PTA7aS0tKSB7CisgICAgaWYgKCFtYXBwaW5ncChpbmZvW2ldKSkgY29udGludWU7CisgICAgaWYgKG1lbWJlcihpbmZvW2ldW0RfSURTXSxzMSk8MCkgY29udGludWU7IC8vIEZhbHNjaGUgVHVlcgorICAgIG9iLT5TZXRQcm9wKFBfTkFNRSxpbmZvW2ldW0RfTkFNRV0pOworICAgIG9iLT5TZXRQcm9wKFBfR0VOREVSLGluZm9baV1bRF9HRU5ERVJdKTsKKyAgICBkZXN0PWluZm9baV1bRF9ERVNUXTsKKyAgICBka2V5PShzb3VyY2U8ZGVzdCk/KHNvdXJjZSsiOiIrZGVzdCk6KGRlc3QrIjoiK3NvdXJjZSk7CisgICAgbm90aWZ5X2ZhaWwoY2FwaXRhbGl6ZShvYi0+bmFtZShXRVIsMSkpKyIgaXN0IGRvY2ggc2Nob24gZ2VvZWZmbmV0IVxuIik7CisgICAgaWYgKGRvb3Jfc3RhdHVzW2RrZXldPjApCisgICAgICBjb250aW51ZTsgLy8gRWluZSBhbmRlcmUgVHVlciBrb2VubnRlIGdlbWVpbnQgc2Vpbi4KKyAgICBpZiAoKGluZm9baV1bRF9GTEFHU10gJiBET09SX05FRURLRVkpCisgICAgICAgICYmIGRvb3Jfc3RhdHVzW2RrZXldID09IERfU1RBVFVTX0xPQ0tFRCkgeyAvLyBhYmdlc2NobG9zc2VuCisgICAgICBub3RpZnlfZmFpbCgiRHUgYnJhdWNoc3QgZWluZW4gU2NobHVlc3NlbCwgdW0gIitvYi0+bmFtZShXRU4sMSkrIiB6dSBvZWZmbmVuLlxuIik7CisgICAgICBpZiAoIXNjaGwpIGNvbnRpbnVlOyAvLyBFaW5lIGFuZGVyZSBUdWVyIGtvZW5udGUgZ2VtZWludCBzZWluLgorICAgICAgbm90aWZ5X2ZhaWwoY2FwaXRhbGl6ZShzY2hsLT5uYW1lKFdFUikpKyIgcGFzc3QgbmljaHQhXG4iKTsKKyAgICAgIGlmICghcG9pbnRlcnAoczIpKSBjb250aW51ZTsKKwkgIGlmIChtZW1iZXIoczIsZGtleSk8MCkgY29udGludWU7IC8vIEtvZW5udGUgYW4gZWluZXIgYW5kZXJlbiBwYXNzZW4uCisgICAgfQorICAgIGRvb3Jfc3RhdHVzW2RrZXldPTE7CisgICAgaW5pdF9kb29ycygpOworICAgIHdyaXRlKCJEdSBvZWZmbmVzdCAiK29iLT5uYW1lKFdFTikrIi5cbiIpOworICAgIHNheShjYXBpdGFsaXplKG9iLT5uYW1lKFdFUikpKyIgd2lyZCB2b24gIit0aGlzX3BsYXllcigpLT5uYW1lKFdFTSkrCisgICAgICAgICIgZ2VvZWZmbmV0LlxuIik7CisgICAgZG9vcl9tZXNzYWdlX290aGVyKHNvdXJjZSxkZXN0LCIgd2lyZCB2b24gZGVyIGFuZGVyZW4gU2VpdGUgZ2VvZWZmbmV0LiIpOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCitpbnQgc2NobGllc3NlbiAoc3RyaW5nIHN0cikgeworICBvYmplY3QgZW52LHNjaGwsb2I7CisgIG1peGVkICppbmZvLHMyOworICBzdHJpbmcgc291cmNlLGRrZXksZGVzdCxzMTsKKyAgaW50IGksYWJnOworCisgIG5vdGlmeV9mYWlsKCJXQVMgd2lsbHN0IER1IHNjaGxpZXNzZW4/XG4iKTsKKyAgaWYgKCFzdHIgfHwgIXRoaXNfcGxheWVyKCkpIHJldHVybiAwOworICBub3RpZnlfZmFpbCgiRGFzIGthbm5zdCBEdSBuaWNodCBzY2hsaWVzc2VuLlxuIik7CisgIHN0cj1sb3dlcl9jYXNlKHN0cik7CisgIGlmIChzc2NhbmYoc3RyLCIlcyBtaXQgJXMiLHMxLHMyKSE9MikKKyAgICB7czE9c3RyO3MyPTA7fQorICBpZiAoczIpIHsKKyAgICBpZiAoIShzY2hsPXByZXNlbnQobG93ZXJfY2FzZShzMiksdGhpc19wbGF5ZXIoKSkpKSB7CisgICAgICBub3RpZnlfZmFpbCgiU28gZWluZW4gU2NobHVlc3NlbCBoYXN0IER1IG5pY2h0LlxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9IGVsc2UgeworICAgICAgczI9c2NobC0+UXVlcnlEb29yS2V5KCk7CisJICBpZiAoc3RyaW5ncChzMikpIHMyPSh7czJ9KTsKKyAgICB9CisgIH0KKworICBpZiAoIW9iamVjdHAoZW52PXByZXZpb3VzX29iamVjdCgpKSkgcmV0dXJuIDA7CisgIGluZm89ZW52LT5RdWVyeVByb3AoUF9ET09SX0lORk9TKTsKKyAgaWYgKCFwb2ludGVycChpbmZvKSkgcmV0dXJuIDA7CisKKyAgc291cmNlPW9iamVjdF9uYW1lKGVudik7CisgIG9iPXRoaXNfb2JqZWN0KCk7CisgIG9iLT5TZXRQcm9wKFBfQVJUSUNMRSwxKTsKKyAgYWJnPTA7CisgIGZvciAoaT1zaXplb2YoaW5mbyktMTtpPj0wO2ktLSkgeworICAgIGlmICghbWFwcGluZ3AoaW5mb1tpXSkpIGNvbnRpbnVlOworICAgIGlmIChtZW1iZXIoaW5mb1tpXVtEX0lEU10sczEpPDApIGNvbnRpbnVlOyAvLyBGYWxzY2hlIFR1ZXIKKyAgICBvYi0+U2V0UHJvcChQX05BTUUsaW5mb1tpXVtEX05BTUVdKTsKKyAgICBvYi0+U2V0UHJvcChQX0dFTkRFUixpbmZvW2ldW0RfR0VOREVSXSk7CisgICAgZGVzdD1pbmZvW2ldW0RfREVTVF07CisgICAgZGtleT0oc291cmNlPGRlc3QpPyhzb3VyY2UrIjoiK2Rlc3QpOihkZXN0KyI6Iitzb3VyY2UpOworCWlmIChzY2hsKSB7CisJICBub3RpZnlfZmFpbChjYXBpdGFsaXplKG9iLT5uYW1lKFdFUiwxKSkrIiBpc3QgZG9jaCBzY2hvbiBhYmdlc2NobG9zc2VuIVxuIik7CisJICBpZiAoZG9vcl9zdGF0dXNbZGtleV08PTAKKyAgICAgICAgJiYgZG9vcl9zdGF0dXNbZGtleV0gPT0gRF9TVEFUVVNfTE9DS0VEKQorICAgICAgY29udGludWU7IC8vIEVpbmUgYW5kZXJlIFR1ZXIga29lbm50ZSBnZW1laW50IHNlaW4uCisJICBpZiAoaW5mb1tpXVtEX0ZMQUdTXSAmIERPT1JfQ0xPU0VLRVkpIHsgLy8gU2NobHVlc3NlbCBub2V0aWc/CisJCSAgbm90aWZ5X2ZhaWwoY2FwaXRhbGl6ZShzY2hsLT5uYW1lKFdFUikpKyIgcGFzc3QgbmljaHQhXG4iKTsKKwkJICBpZiAoIXBvaW50ZXJwKHMyKSkgY29udGludWU7CisJCSAgaWYgKG1lbWJlcihzMixka2V5KTwwKSBjb250aW51ZTsgLy8gS29lbm50ZSBhbiBlaW5lciBhbmRlcmVuIHBhc3Nlbi4KKwkJICBkb29yX3N0YXR1c1tka2V5XT1EX1NUQVRVU19MT0NLRUQ7CisJCSAgYWJnPTE7ICAvLyBUdWVyIHdpcmQgcmljaHRpZyBhYmdlc2NobG9zc2VuCisJICB9CisgICAgZWxzZSB7CisJCSAgLy8gb2huZSBTY2hsdWVzc2VsIGFic2NobGllc3NiYXIKKwkJICBkb29yX3N0YXR1c1tka2V5XT0KKyAgICAgICAgKChpbmZvW2ldW0RfRkxBR1NdICYgRE9PUl9ORUVES0VZKSA/IERfU1RBVFVTX0xPQ0tFRCA6IERfU1RBVFVTX0NMT1NFRCk7CisJICB9CisJfQorICBlbHNlIHsKKwkgIG5vdGlmeV9mYWlsKGNhcGl0YWxpemUob2ItPm5hbWUoV0VSLDEpKSsiIGlzdCBkb2NoIHNjaG9uIGdlc2NobG9zc2VuIVxuIik7CisJICBpZiAoZG9vcl9zdGF0dXNbZGtleV0gPCBEX1NUQVRVU19PUEVOKQorCQkgIGNvbnRpbnVlOyAvLyBFaW5lIGFuZGVyZSBUdWVyIGtvZW5udGUgZ2VtZWludCBzZWluLgorCSAgaWYgKChpbmZvW2ldW0RfRkxBR1NdICYgRE9PUl9ORUVES0VZKSAmJiAKKyAgICAgICAgIShpbmZvW2ldW0RfRkxBR1NdICYgRE9PUl9DTE9TRUtFWSkpCisJCSAgZG9vcl9zdGF0dXNbZGtleV09RF9TVEFUVVNfTE9DS0VEOyAvLyBBYnNjaGxpZXNzYmFyLCBhYmVyIGRhenUgc2NobHVlc3NlbCB1bm5vZXRpZworCSAgZWxzZQorCQkgIGRvb3Jfc3RhdHVzW2RrZXldPURfU1RBVFVTX0NMT1NFRDsKKwl9CisJaW5pdF9kb29ycygpOworCXdyaXRlKCJEdSBzY2hsaWVzc3QgIitvYi0+bmFtZShXRU4pKworCQkgIChhYmc/IiBhYiI6IiIpKyIuXG4iKTsKKwlzYXkoY2FwaXRhbGl6ZShvYi0+bmFtZShXRVIpKSsiIHdpcmQgdm9uICIrdGhpc19wbGF5ZXIoKS0+bmFtZShXRU0pKworCQkoYWJnPyIgYWIiOiIgIikrImdlc2NobG9zc2VuLlxuIik7CisJZG9vcl9tZXNzYWdlX290aGVyKHNvdXJjZSxkZXN0LCIgd2lyZCB2b24gZGVyIGFuZGVyZW4gU2VpdGUgIisKKwkJCQkJICAgKGFiZz8iYWIiOiIiKSsiZ2VzY2hsb3NzZW4uIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CitzdHJpbmcgc3BlY2lhbF9kZXRhaWxfZG9vcnMoc3RyaW5nIGtleSl7CisgIG9iamVjdCBlbnY7CisgIG1peGVkICppbmZvOworICBtYXBwaW5nIGRsOworICBpbnQgaSwgc3Q7CisgIHN0cmluZyBzb3VyY2UsIGRlc3QsIGRrZXk7CisKKyAgaWYoIW9iamVjdHAoZW52PXByZXZpb3VzX29iamVjdCgpKSlyZXR1cm4gMDsKKyAgaWYoIXBvaW50ZXJwKGluZm89ZW52LT5RdWVyeVByb3AoUF9ET09SX0lORk9TKSkpcmV0dXJuIDA7CisgIHNvdXJjZT1vYmplY3RfbmFtZShlbnYpOworCisgIGZvcihpPXNpemVvZihpbmZvKS0xO2k+PTA7aS0tKXsKKyAgICBpZighbWFwcGluZ3AoaW5mb1tpXSkpY29udGludWU7CisgICAgaWYobWVtYmVyKGluZm9baV1bRF9JRFNdLGtleSk8MCljb250aW51ZTsKKyAgICBpZihzdHJpbmdwKGluZm9baV1bRF9MT05HXSkpcmV0dXJuIGluZm9baV1bRF9MT05HXTsKKyAgICBpZighbWFwcGluZ3AoaW5mb1tpXVtEX0xPTkddKSljb250aW51ZTsKKyAgICBkbD1pbmZvW2ldW0RfTE9OR107CisgICAgZGVzdD1pbmZvW2ldW0RfREVTVF07CisgICAgZGtleT0oc291cmNlPGRlc3QpPyhzb3VyY2UrIjoiK2Rlc3QpOihkZXN0KyI6Iitzb3VyY2UpOworICAgIHN0PWRvb3Jfc3RhdHVzW2RrZXldOworICAgIGlmKChzdD09RF9TVEFUVVNfTE9DS0VEKSAmJiAhZGxbRF9TVEFUVVNfTE9DS0VEXSkKKyAgICAgICAgc3Q9RF9TVEFUVVNfQ0xPU0VEOyAvKiBGYWxscyBrZWluZSBlaWdlbmUgQmVzY2hyZWlidW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogZnVlciBhYmdlc2NobG9zc2VuZSBUdWVyIHZvcmhhbmRlbiAqLworICAgIHJldHVybiBkbFtzdF07CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vYmovZW50c29yZy5jIGIvb2JqL2VudHNvcmcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmRkYTEzCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL2VudHNvcmcuYwpAQCAtMCwwICsxLDkyIEBACisjcHJhZ21hIHN0cmljdF90eXBlcworCitpbmhlcml0ICIvc3RkL25wYyI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKworICBTZXRQcm9wKFBfU0hPUlQsIkVpbiBNdWVsbHNjaGx1Y2tlciIpOworICBTZXRQcm9wKFBfTE9ORyxicmVha19zdHJpbmcoCisgICAgIkRlciBNdWVsbHNjaGx1Y2tlciBnZWhvZXJ0IHp1IEZhbWlsaWUgZGVyIEtsZWluc2F1cmllciB1bmQgemVpY2huZXQgIisKKyAgICAic2ljaCBkdXJjaCBlaW4gc2VociBncm9zc2VzIE1hdWwgdW5kIG5haGV6dSB1bmJlZ3Jlbnp0ZW4gQXBwZXRpdCBhdXMuICIrCisgICAgIkRhcyBlaW56aWdlLCB3YXMgZXIgbmljaHQgbWFnLCBzaW5kIERpbmdlLCBkaWUgbWF0ZXJpZWxsZW4gV2VydCBoYWJlbi4gIisKKyAgICAiQWxsZXMgYW5kZXJlIGthbm4gbWFuIGlobSBtaXQgJ2Z1ZXR0ZXJlIG11ZWxsc2NobHVja2VyIG1pdCA8bmFtZT4nICIrCisgICAgImluIGRlbiBSYWNoZW4gc3RvcGZlbi4iLDc4KSk7CisgIFNldFByb3AoUF9JTkZPLGJyZWFrX3N0cmluZygKKyAgICAiRGllc2VyIE11ZWxsc2NobHVja2VyIHZlcnNjaGxpbmd0IGF1Y2ggbG9zZSBoZXJ1bWxpZWdlbmRlIERpbmdlLiBBbHNvICIrCisgICAgInBhc3MgYXVmLCB3YXMgRHUgd2Vnd2lyZnN0LiIsNzgpKTsKKyAgU2V0UHJvcChQX05BTUUsIk11ZWxsc2NobHVja2VyIik7CisgIFNldFByb3AoUF9HRU5ERVIsIE1BTEUpOworICBTZXRQcm9wKFBfUkFDRSwic2F1cmllciIpOworICBTZXRQcm9wKFBfQVJUSUNMRSwxKTsKKyAgQWRkSWQoKHsibXVlbGxzY2hsdWNrZXIiLCJzY2hsdWNrZXIiLCJrbGVpbnNhdXJpZXIiLCJzYXVyaWVyIn0pKTsKKyAgY3JlYXRlX2RlZmF1bHRfbnBjKCAxICk7CisgIFNldFByb3AoUF9YUCwwKTsKKyAgU2V0UHJvcChQX0JPRFksMTAwKTsKKyAgU2V0UHJvcChQX0hBTkRTLCh7IiBtaXQgZGVtIGFsbGVzIHZlcnNjaGxpbmdlbmRlbiBHZWJpc3MiLDIwfSkpOworICBTZXRQcm9wKFBfQUxJR04sIDApOworICBzZXRldWlkKGdldHVpZCh0aGlzX29iamVjdCgpKSk7CisgIFNldFByb3AoUF9ERUZBVUxUX0lORk8sImdydW56dCBudXIgdm9yIHNpY2ggaGluLlxuIik7CisgIFNldFByb3AoUF9NU0dJTiwicm9sbHQgaGVyZWluIik7CisgIFNldFByb3AoUF9NU0dPVVQsInJvbGx0Iik7CisgIFNldFByb3AoUF9NQVhfV0VJR0hULCAyMDAwMDApOworICBBZGRDbWQoKHsiZnVldHRlciIsImZ1ZXR0ZXJlIn0pLCJoYXBzIik7CisgIGVuYWJsZV9jb21tYW5kcygpOworfQorCitpbnQgaGFwcyhzdHJpbmcgc3RyKQoreworICBzdHJpbmcgczEsczI7CisgIG9iamVjdCBvYjsKKyAgbm90aWZ5X2ZhaWwoIlN5bnRheDogZnVldHRlcmUgbXVlbGxzY2hsdWNrZXIgbWl0IDxuYW1lPlxuIik7CisgIGlmKCFzdHIpcmV0dXJuIDA7CisgIGlmKHNzY2FuZihzdHIsIiVzIG1pdCAlcyIsczEsczIpIT0yKXJldHVybiAwOworICBpZighaWQoczEpKXJldHVybiAwOworICBub3RpZnlfZmFpbCgiU28gZXR3YXMgaGFzdCBEdSBuaWNodC5cbiIpOworICBpZigoIW9iPXByZXNlbnQoczIsdGhpc19wbGF5ZXIoKSkpICYmIAorICAgICAoIW9iPXByZXNlbnQoczIsZW52aXJvbm1lbnQoKSkpKSByZXR1cm4gMDsKKyAgaWYob2ItPlF1ZXJ5UHJvcChQX05PRFJPUCkgfHwgb2ItPlF1ZXJ5UHJvcChQX05FVkVSRFJPUCkpeworICAgIHdyaXRlKCJEYXMga2FubnN0IER1IG5pY2h0IHdlZ3dlcmZlbi5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmKGxpdmluZyhvYikpeworICAgIHdyaXRlKCJEZXIgTXVlbGxzY2hsdWNrZXIgZnJpc3N0IGtlaW5lIExlYmV3ZXNlbi5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmKG9iLT5RdWVyeVByb3AoUF9WQUxVRSkpeworICAgIHdyaXRlKCJEYXMgaXN0IHp1IHdlcnR2b2xsLCBkYXMgdmVydHJhZWd0IGRlciBNdWVsbHNjaGx1Y2tlciBuaWNodC5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChvYi0+UXVlcnlQcm9wKFBfQ1VSU0VEKSkgeworICAgIHdyaXRlKCJWZXJmbHVjaHRlIERpbmdlIGJla29tbWVuIGRlbSBNdWVsbHNjaGx1Y2tlciBuaWNodCFcbiIpOworICAgIHJldHVybiAxOworICB9CisgIG9iLT5yZW1vdmUoKTsKKyAgaWYob2IpeworICAgIHdyaXRlKCJBdXMgaXJnZW5kZWluZW0gR3J1bmQgc2NoZWludCBkYXMgZGVtIE11ZWxsc2NobHVja2VyIG5pY2h0ICIrCisgICAgInp1IHNjaG1lY2tlbi5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIHdyaXRlKCJNaXQgZWluZW0gbGF1dGVuIFJ1ZWxwc2VuIHZlcnNjaGxpbmd0IGRlciBNdWVsbHNjaGx1Y2tlciBhbGxlcy5cbiIpOworCisgIHJldHVybiAxOworfQorCit2b2lkIHJlc2V0KCkKK3sKKyAgaW50IGk7CisgIG9iamVjdCAqaW52OworICA6OnJlc2V0KCk7CisgIAorICBpbnY9YWxsX2ludmVudG9yeSh0aGlzX29iamVjdCgpKTsKKyAgaWYoaW52ICYmIHNpemVvZihpbnYpKQorICAgIGZvcihpPXNpemVvZihpbnYpLTE7aT49MDtpLS0pCisgICAgICBkZXN0cnVjdChpbnZbaV0pOworICBjb21tYW5kKCJuaW1tIGFsbGVzIik7Cit9CisKZGlmZiAtLWdpdCBhL29iai9taXNjL2JvbmJvbi5jIGIvb2JqL21pc2MvYm9uYm9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDNiZjdmNQotLS0gL2Rldi9udWxsCisrKyBiL29iai9taXNjL2JvbmJvbi5jCkBAIC0wLDAgKzEsMTAyIEBACisvLyBBc3JhaGVsCisKK2luaGVyaXQgInN0ZC90aGluZyIgOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorCit2b2lkIGdlc2NobWFjaygpCit7CisJaW50IG51bTsKKwludW0gPSByYW5kb20gKDgpOworCXN3aXRjaChudW0pCisJeworCQljYXNlIDAgOgkKKwkJCVNldFByb3AoUF9TSE9SVCwiRWluIE9yYW5nZW5ib25ib24iKTsKKwkJCVNldFByb3AoUF9MT05HLCJFaW4gZ2VmdWVsbHRlcyBCb25ib24gbWl0IE9yYW5nZW5nZXNjaG1hY2suXG4iKTsKKwkJCVNldFByb3AoUF9OQU1FLCJPcmFuZ2VuYm9uYm9uIik7CisJCQlBZGRJZCgoeyJvcmFuZ2VuYm9uYm9uIn0pKTsKKwkJCWJyZWFrOworCQljYXNlIDEgOgorCQkJU2V0UHJvcChQX1NIT1JULCJFaW4gWml0cm9uZW5ib25ib24iKTsKKwkJCVNldFByb3AoUF9MT05HLCJFaW4gZ2VmdWVsbHRlcyBCb25ib24gbWl0IFppdHJvbmVuZ2VzY2htYWNrLlxuIik7CisJCQlTZXRQcm9wKFBfTkFNRSwiWml0cm9uZW5ib25ib24iKTsKKwkJCUFkZElkKCh7InppdHJvbmVuYm9uYm9uIn0pKTsKKwkJCWJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMiA6CisJCQlTZXRQcm9wKFBfU0hPUlQsIkVpbiBTY2hva29sYWRlbmJvbmJvbiIpOworCQkJU2V0UHJvcChQX0xPTkcsIkVpbiBTY2hva29sYWRlbmJvbmJvbiwgcGFzcyBhdWYsIGRhc3MgZXMgbmljaHQgc2NobWlsenQuXG4iKTsKKwkJCVNldFByb3AoUF9OQU1FLCJTY2hva29sYWRlbmJvbmJvbiIpOworCQkJQWRkSWQoKHsic2Nob2tvYm9uYm9uIiwic2Nob2tvbGFkZW5ib25ib24ifSkpOworCQkJYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAzIDoKKwkJCVNldFByb3AoUF9TSE9SVCwiRWluIFBmZWZmZXJtaW56Ym9uYm9uIik7CisJCQlTZXRQcm9wKFBfTE9ORywiUGZlZmZlcm1pbnplIGJlZnJlaXQgZGVuIEhhbHMgdW5kIGtpdHplbHQgaW4gZGVyIE5hc2UuXG4iKTsKKwkJCVNldFByb3AoUF9OQU1FLCJQZmVmZmVybWluemJvbmJvbiIpOworCQkJQWRkSWQoKHsicGZlZmZlcm1pbnpib25ib24iLCJtaW56ZSIsInBmZWZmZXJtaW56In0pKTsKKwkJCWJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgNCA6CisJCQlTZXRQcm9wKFBfU0hPUlQsIkVpbiBTYWhuZWJvbmJvbiIpOworCQkJU2V0UHJvcChQX0xPTkcsIlNlaHIgc3Vlc3MgdW5kIHNlaHIga2xlYnJpZy5cbiIpOworCQkJU2V0UHJvcChQX05BTUUsIlNhaG5lYm9uYm9uIik7CisJCQlBZGRJZCgoeyJzYWhuZWJvbmJvbiJ9KSk7CisJCQlicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDUgOgorCQkJU2V0UHJvcChQX1NIT1JULCJFaW4gS2FyYW1lbGJvbmJvbiIpOworCQkJU2V0UHJvcChQX0xPTkcsIkVpbiBLYXJhbWVsYm9uYm9uLCBkZXIgUmVzdCB2b24gS2FybmV2YWw/XG4iKTsKKwkJCVNldFByb3AoUF9OQU1FLCJLYXJhbWVsYm9uYm9uIik7CisJCQlBZGRJZCgoeyJrYXJhbWVsYm9uYm9uIn0pKTsKKwkJCWJyZWFrOworCQljYXNlIDYgOgorCQkJU2V0UHJvcChQX1NIT1JULCJFaW4gQW5hbmFuYXNib25ib24iKTsKKwkJCVNldFByb3AoUF9MT05HLCJFaW4gZHJlaWVja2lnZXMgQW5hbmFuYXNib25ib24sIGRhcyBzY2htZWNrdCBiZXN0aW1tdCBnYW56IGFuYW5hc3NpZy5cbiIpOworCQkJU2V0UHJvcChQX05BTUUsIkFuYW5hc2JvbmJvbiIpOworCQkJQWRkSWQoKHsiYW5hbmFzYm9uYm9uIn0pKTsKKwkJCWJyZWFrOworCQljYXNlIDcgOgorCQkJU2V0UHJvcChQX1NIT1JULCJFaW4gSGltYmVlcmRyb3BzIik7CisJCQlTZXRQcm9wKFBfTE9ORywiRGllc2VzIGhpbWJlZXJpZ2UgRnJ1Y2h0Ym9uYm9uIGlzdCB2aWVsIGdyb2Vzc2VyIGFscyBlaW5lIEhpbWJlZXJlLlxuIik7CisJCQlTZXRQcm9wKFBfTkFNRSwiSGltYmVlcmRyb3BzIik7CisJCQlBZGRJZCgoeyJkcm9wcyIsImhpbWJlZXJkcm9wcyIsImZydWNodGJvbmJvbiJ9KSk7CisJCQlicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0IDoKKwkJCVNldFByb3AoUF9TSE9SVCwiRWluIE11bHRpdml0YW1pbmJvbmJvbiIpOworCQkJU2V0UHJvcChQX0xPTkcsIkVpbiBNdWx0aXZpdGFtaW5ib25ib24sIHNlaHIgZ2VzdW5kIChiZXNvbmRlcnMgYmVpIGRlbSBXZXR0ZXIgaW4gTXVlbnN0ZXIpLlxuIik7CisJCQlTZXRQcm9wKFBfTkFNRSwiTXVsdGl2aXRhbWluYm9uYm9uIik7CisJCQlBZGRJZCgoeyJ2aXRhbWluYm9uYm9uIiwibXVsdGl2aXRhbWluYm9uYm9uIn0pKTsKKwkJCWJyZWFrOworICAgIH0KK30KKwordm9pZCBjcmVhdGUoKQoreworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworCTo6Y3JlYXRlKCk7CisJU2V0UHJvcChQX1dFSUdIVCwgMjUpOworCVNldFByb3AoUF9WQUxVRSwgMCk7CisJU2V0UHJvcChQX0dFTkRFUiwgTkVVVEVSICk7CisJQWRkSWQoImJvbmJvbiIpOworCWdlc2NobWFjaygpOworfQorCisKK3ZvaWQgaW5pdCgpCit7CisJOjppbml0KCk7CisJYWRkX2FjdGlvbigiZXNzZW4iLCJlc3NlIik7CisJYWRkX2FjdGlvbigiZXNzZW4iLCJpc3MiKTsKKwlhZGRfYWN0aW9uKCJlc3NlbiIsImx1dHNjaGUiKTsKK30KKworaW50IGVzc2VuKHN0cmluZyBzdHIpCit7CisJbm90aWZ5X2ZhaWwoIldhcyBtb2VjaHRlc3QgRHUgZXNzZW4/XG4iKTsKKwlpZiAoICFzdHIgfHwgIWlkKHN0cikgKQorCSAgICByZXR1cm4gMDsKKwl3cml0ZSgiRHUgbHV0c2Noc3QgZ2VudWVzc2xpY2ggIiArIG5hbWUoV0VOLDApICsgIi5cbiIpOworCXNheSggUEwtPk5hbWUoV0VSLDIpICsgIiBsdXRzY2h0ICIgKyBuYW1lKFdFTiwwKSArICIuXG4iKTsKKwlyZW1vdmUoKTsKKwlyZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL29iai9taXNjL2tpc3Nlbi5jIGIvb2JqL21pc2Mva2lzc2VuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzNjMzY1YgotLS0gL2Rldi9udWxsCisrKyBiL29iai9taXNjL2tpc3Nlbi5jCkBAIC0wLDAgKzEsMTI4IEBACitpbmhlcml0ICJzdGQvdGhpbmciOworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorCitzdHJpbmcgY3N0cjsgIAorCitpbml0KCkKK3sKKyAgaW50IGNvbG91cjsKKyAgOjppbml0KCk7CisgIGNvbG91ciA9IHJhbmRvbSg4KTsKKyAgaWYgKGNvbG91cj09MCkgY3N0ciA9ICJncnVlbmVzIjsKKyAgaWYgKGNvbG91cj09MSkgY3N0ciA9ICJyb3RlcyI7CisgIGlmIChjb2xvdXI9PTIpIGNzdHIgPSAiYmxhdWVzIjsKKyAgaWYgKGNvbG91cj09MykgY3N0ciA9ICJnZWxiZXMiOworICBpZiAoY29sb3VyPT00KSBjc3RyID0gInNjaHdhcnotd2Vpc3Mta2FyaWVydGVzIjsKKyAgaWYgKGNvbG91cj09NSkgY3N0ciA9ICJvcmFuZ2UtcGluay1nZXN0cmVpZnRlcyI7CisgIGlmIChjb2xvdXI9PTYpIGNzdHIgPSAibGlsYS1ncnVlbi1nZXR1ZXBmZWx0ZXMiOworICBpZiAoY29sb3VyPT03KSBjc3RyID0gInNpbGJlcmdyYXVlcyI7CisgIGFkZF9hY3Rpb24oInRocm93X2l0Iiwid2lyZiIpOyAKKyAgYWRkX2FjdGlvbigid3ciLCAid3ciKTsKK30KKworc2hvcnQoKQoreworICByZXR1cm4gIkVpbiAiICsgY3N0ciArICIgS2lzc2VuXG4iOworfQorCitsb25nKCkKK3sKKyAgcmV0dXJuICJEaWVzIGlzdCBlaW4gd3VuZGVyc2Nob2VuZXMsICIgKyBjc3RyICsgIiBLaXNzZW4uXG4iKworICAgICAgICAgICJEdSBrYW5uc3QgdmVyc3VjaGVuIGVzIHp1IHdlcmZlbi5cbiI7Cit9CisKK2NyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIGNzdHIgPSAidm9uIEJvaW5nIGhhbmRnZW5hZWh0ZXMiOworICBBZGRJZCgia2lzc2VuIik7CisgIFNldFByb3AoUF9XRUlHSFQsIDEpOworICBTZXRQcm9wKFBfVkFMVUUsIDEpOworICBTZXRQcm9wKFBfTkFNRSwgIktpc3NlbiIpOworICBTZXRQcm9wKFBfR0VOREVSLCAwKTsKK30KKword3coc3RyKQoreworICBpZiAoc3RyKQorICAgIHJldHVybiB0aHJvd19pdCgia2lzc2VuIG5hY2ggIitzdHIpOworICBlbHNlCisgIHsKKyAgICBvYmplY3QgKmFsbCwgKmxpdjsKKyAgICBpbnQgaTsKKworICAgIGFsbD1hbGxfaW52ZW50b3J5KGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpKTsKKyAgICBmb3IgKGk9MDsgaTxzaXplb2YoYWxsKTsgaSsrKQorICAgICAgaWYgKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoYWxsW2ldKSkKKyAgICAgICAgaWYgKCFsaXYpCisJICBsaXYgPSAoe2FsbFtpXX0pOworICAgICAgICBlbHNlCisgICAgICAgICAgbGl2ID0gbGl2Kyh7YWxsW2ldfSk7CisgICAgaSA9IHJhbmRvbShzaXplb2YobGl2KSk7CisgICAgcmV0dXJuIHRocm93X2l0KCJraXNzZW4gbmFjaCAiK2xvd2VyX2Nhc2UobGl2W2ldLT5xdWVyeV9yZWFsX25hbWUoKSkpOworICB9Cit9CisKK3Rocm93X2l0KHN0cikKK3sKKyAgaW50IHRyZWZmZXI7CisgIHN0cmluZyB3ZXJmZXJfbmFtZTsKKyAgc3RyaW5nIHZpY3RpbV9zdHJpbmcsd2VyZmVyX3N0cmluZzsKKyAgc3RyaW5nIHdhcyxhdCx3ZW47CisgIGludCBmZWhsZXI7CisgIG9iamVjdCB2aWN0aW07CisKKyAgaWYgKCFzdHIpIHJldHVybiAwOworICBmZWhsZXIgPSAwOworICBpZiAoc3NjYW5mKHN0ciwiJXMgJXMgJXMiLHdhcyxhdCx3ZW4pICE9IDMpCisgICAgZmVobGVyID0gMTsKKyAgaWYgKCFpZCh3YXMpIHx8IGF0ICE9ICJuYWNoIikKKyAgICBmZWhsZXIgPSAxOworICBpZiAoZmVobGVyKQorICB7IAorICAgICBub3RpZnlfZmFpbCgiWnVtIFdlcmZlbjogd2lyZiBraXNzZW4gbmFjaCA8c3BpZWxlcm5hbWU+XG4iKTsKKyAgICAgcmV0dXJuIDA7CisgIH0KKyAgdmljdGltID0gcHJlc2VudCh3ZW4sZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkpOworICBpZiAoIXZpY3RpbSkKKyAgeyAKKyAgICAgd3JpdGUoIkRpZXNlciBTcGllbGVyIGlzdCBuaWNodCBoaWVyIVxuIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgcmV0dXJuIDE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICB3ZXJmZXJfbmFtZSA9IHRoaXNfcGxheWVyKCktPm5hbWUoKTsKKyAgdHJlZmZlciA9IHJhbmRvbSg1KTsKKyAgd3JpdGUoIkR1IHNjaG1laXNzdCBlaW4gS2lzc2VuIG5hY2ggIiArIHZpY3RpbS0+bmFtZShXRU0pICsiLlxuIik7CisgIHNheSh3ZXJmZXJfbmFtZSArICIgd2lyZnQgZWluIEtpc3NlbiBuYWNoICIgKyB2aWN0aW0tPm5hbWUoV0VNKSArICIuXG4iKTsKKyAgaWYgKHRyZWZmZXI9PTApCisgIHsKKyAgICB3ZXJmZXJfc3RyaW5nID0gIkR1IHZlcmZlaGxzdCAiICsgdmljdGltLT5uYW1lKFdFTikgKyAiIG1laWxlbndlaXQuXG4iOworICAgIHZpY3RpbV9zdHJpbmcgPSB3ZXJmZXJfbmFtZSArICIgdmVyZmVobHQgRGljaCBtZWlsZW53ZWl0LlxuIjsKKyAgICB0aGlzX29iamVjdCgpLT5tb3ZlKGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpKTsKKyAgfQorICBpZiAodHJlZmZlcj09MSkKKyAgeworICAgIHdlcmZlcl9zdHJpbmcgPSAiRGFzIEtpc3NlbiBzdHJlaWZ0ICIgKyB2aWN0aW0tPm5hbWUoV0VOKSsgIiBhbSBPaHJsYWVwcGNoZW4uXG4iOworICAgIHZpY3RpbV9zdHJpbmcgPSAiRGFzIEtpc3NlbiBzdHJlaWZ0IERpY2ggYW0gT2hybGFlcHBjaGVuLlxuIjsKKyAgfQorICBpZiAodHJlZmZlcj09MikKKyAgeworICAgIHdlcmZlcl9zdHJpbmcgPSAiUEFGRiEgRHUgdHJpZmZzdCAiICsgdmljdGltLT5uYW1lKFdFTikgKyAiIG1pdHRlbiBpbnMgR2VzaWNodC5cbiI7CisgICAgdmljdGltX3N0cmluZyA9ICJQQUZGISBEYXMgS2lzc2VuIHRyaWZmdCBEaWNoIG1pdHRlbiBpbSBHZXNpY2h0IVxuIjsKKyAgfQorICBpZiAodHJlZmZlcj09MykKKyAgeworICAgIHdlcmZlcl9zdHJpbmcgPSAiV1VTQ0ghIERhcyBLaXNzZW4gdHJpZmZ0ICIgKyB2aWN0aW0tPm5hbWUoV0VTU0VOKSArICIgQmF1Y2ggbWl0IHZvbGxlciBXdWNodC5cbiI7CisgICAgdmljdGltX3N0cmluZyA9ICJXVVNDSCEgRGFzIEtpc3NlbiBmbGllZ3QgbWl0IHZvbGxlciBXdWNodCBnZWdlbiBEZWluZW4gQmF1Y2guXG4iOworICB9CisgIGlmICh0cmVmZmVyPT00KQorICB7CisgICAgd2VyZmVyX3N0cmluZyA9ICB2aWN0aW0tPm5hbWUoKSArICIgdmVyc3VjaHQgd2VnenVyZW5uZW4sIGRvY2ggZGFzIEtpc3NlbiB0cmlmZnQgZGVuIEhpbnRlcmtvcGYuXG4iOworICAgIHZpY3RpbV9zdHJpbmcgPSAiRHUgdmVyc3VjaHN0IHdlZ3p1cmVubmVuLCBhYmVyIGRhcyBLaXNzZW4gdHJpZmZ0IERpY2ggYW0gSGludGVya29wZi5cbiI7CisgIH0KKyAgd3JpdGUod2VyZmVyX3N0cmluZyk7CisgIHRlbGxfb2JqZWN0KHZpY3RpbSx2aWN0aW1fc3RyaW5nKTsKKyAgaWYgKHRyZWZmZXIpIHRoaXNfb2JqZWN0KCktPm1vdmUodmljdGltKTsKKyAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL29iai9taXNjL2xvbGxpLmMgYi9vYmovbWlzYy9sb2xsaS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiODI3OGUKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovbWlzYy9sb2xsaS5jCkBAIC0wLDAgKzEsMjkgQEAKK2luaGVyaXQgInN0ZC90aGluZyI7CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgIC8vIExhZWRlbiBlcndhcnRlbiBTaG9ydCB1bmQgVmFsdWUgaW4gZGVyIEJsdWVwcmludC4KKyAgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBMb2xsaSIpOworICAgU2V0UHJvcChQX1ZBTFVFLCA1KTsKKyAgIAorICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICAgOjpjcmVhdGUoKTsKKyAgIFNldFByb3AoUF9TSE9SVCwgIkVpbiBMb2xsaSIpOworICAgU2V0UHJvcChQX05BTUUsICJMb2xsaSIpOworICAgU2V0UHJvcChQX0dFTkRFUiwgTUFMRSk7CisgICBTZXRQcm9wKFBfTE9ORywgIkVpbiBsZWNrZXJlciBMb2xsaSwgRHUga2FubnN0IGlobiBzY2hsZWNrZW4uXG4iKTsKKyAgIEFkZElkKCJsb2xsaSIpOworICAgU2V0UHJvcChQX1dFSUdIVCwgMTApOworICAgQWRkQ21kKCAoeyJzY2hsZWNrIiwic2NobGVja2UiLCJsZWNrIiwibGVja2UifSksICJzY2hsZWNrIiApOworfQorCitpbnQgc2NobGVjayhzdHJpbmcgc3RyKQoreworICAgbm90aWZ5X2ZhaWwoIldhcyBtb2VjaHRlc3QgRHUgc2NobGVja2VuP1xuIik7CisgICBpZiAoIXN0ciB8fCAhaWQoc3RyKSkgcmV0dXJuIDA7CisgICB3cml0ZSgiRHUgc2NobGVja3N0IGFuIERlaW5lbSBMb2xsaS4gRXIgc2NobWVja3QgYXVzZ2V6ZWljaG5ldC5cbiIpOworICAgc2F5KHRoaXNfcGxheWVyKCktPm5hbWUoKSsiIHNjaGxlY2t0IGFuICIrdGhpc19wbGF5ZXIoKS0+UXVlcnlQb3NzUHJvbm91bih0aGlzX29iamVjdCgpLCBXRU0pKyIgTG9sbGkuXG4iKTsKKyAgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvb2JqL21pc2MvdHVldGUuYyBiL29iai9taXNjL3R1ZXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTcxNzNiZAotLS0gL2Rldi9udWxsCisrKyBiL29iai9taXNjL3R1ZXRlLmMKQEAgLTAsMCArMSw0NyBAQAorLy9Bc3JhaGVsCisKK2luaGVyaXQgInN0ZC90aGluZyIgOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorCit2b2lkIGNyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIDo6Y3JlYXRlKCkgOworCisgIFNldFByb3AoIFBfU0hPUlQsICJFaW5lIFR1ZXRlIEJvbmJvbnMiICkgOworICBTZXRQcm9wKCBQX0xPTkcsICJFaW5lIG1hZ2lzY2hlIEJvbmJvbnR1ZXRlLiBTbyBvZnQgRHUgYXVjaCBoaW5laW5ncmVpZnN0LCBzaWUgd2lyZCBuaWVtYWxzIGxlZXJcbiIKKwkJKyAgInVuZCBlbnRoYWVsdCBpbW1lciBlaW5lIGJ1bnRlIE1pc2NodW5nLlxuIik7CisKKyAgU2V0UHJvcCggUF9XRUlHSFQsIDAgKSA7CisgIFNldFByb3AoIFBfTk9CVVksIDEpIDsKKyAgU2V0UHJvcCggUF9OT0RST1AsICJOZWluLCBEdSB3aWxsc3QgZG9jaCBuaWNodCBkaWVzZXMgR2VzY2hlbmsgd2VnZ2ViZW4gIT9cbiIpOworICBTZXRQcm9wKCBQX05FVkVSRFJPUCwgMSkgOworICBTZXRQcm9wKCBQX05BTUUsICJUdWV0ZSIpIDsKKyAgU2V0UHJvcCggUF9HRU5ERVIsIEZFTUFMRSApIDsKKyAgQWRkSWQoICh7ICJib25ib250dWV0ZSIsInR1ZXRlIiwgImJvbmJvbnMiIH0pICkgOworICBTZXRQcm9wKFBfQVVUT0xPQURPQkosIDEpOworCit9CisKK3ZvaWQgaW5pdCgpCit7CisJOjppbml0KCk7CisJYWRkX2FjdGlvbigibmFzY2hlbiIsImdyZWlmZSIpOworCWFkZF9hY3Rpb24oIm5hc2NoZW4iLCJncmVpZiIpOworfQorCitpbnQgbmFzY2hlbiAoc3RyaW5nIHN0cikKK3sKKyAgbm90aWZ5X2ZhaWwoIldvaGluZWluIG1vZWNodGVzdCBEdSBncmVpZmVuID9cbiIpOworCWlmICggc3RyICE9ICJ0dWV0ZSIgJiYgc3RyICE9ICJpbiB0dWV0ZSIgJiYgc3RyICE9ICJib25ib25zIiAmJiBzdHIgIT0gImluIGJvbmJvbnR1ZXRlIikKKwkJIHJldHVybiAwOworCXdyaXRlKCJEdSBncmVpZnN0IGluIERlaW5lIFR1ZXRlIHVuZCBob2xzdCBlaW4gQm9uYm9uIGhlcmF1cy5cbiIpOworCXNheSggUEwtPm5hbWUoV0VSLDIpICsgIiBob2x0IGVpbiBCb25ib24gYXVzIGVpbmVyIFR1ZXRlLlxuIik7CisJY2xvbmVfb2JqZWN0KCJvYmovbWlzYy9ib25ib24iKS0+bW92ZShQTCk7CisJcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL29iai9taXNjL3d1ZXJmZWwuYyBiL29iai9taXNjL3d1ZXJmZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWNjYjY5Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL21pc2Mvd3VlcmZlbC5jCkBAIC0wLDAgKzEsMzAgQEAKK2luaGVyaXQgInN0ZC90aGluZyI7CisKKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKwordm9pZCBjcmVhdGUoKQoreworICAvLyBTaG9ydCB1bmQgVmFsdWUgd2VyZGVuIHZvbiBMYWVkZW4gaW4gZGVyIEJsdWVwcmludCBlcndhcnRldAorICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gV3VlcmZlbCIpOworICBTZXRQcm9wKFBfVkFMVUUsIDEpOworICAKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX0xPTkcsICJFaW4gV3VlcmZlbCBtaXQgNiBTZWl0ZW4uXG4iKTsKKyAgU2V0UHJvcChQX05BTUUsICJXdWVyZmVsIik7CisgIFNldFByb3AoUF9HRU5ERVIsIE1BTEUpOworICBTZXRQcm9wKFBfV0VJR0hULCAxKTsKKyAgQWRkSWQoInd1ZXJmZWwiKTsKKwlBZGRDbWQoInd1ZXJmZWwiLCJ3dWVyZmVsIik7Cit9CisKK2ludCB3dWVyZmVsKHN0cmluZyBzdHIpCit7CisgIGludCB6YWhsOworCisgIHphaGwgPSByYW5kb20oNikgKyAxOworICB3cml0ZSgiRHUgd3VlcmZlbHN0IGVpbmUgIiArIHphaGwgKyAiLlxuIik7CisgIHNheSh0aGlzX3BsYXllcigpLT5uYW1lKCkgKyAiIHd1ZXJmZWx0IGVpbmUgIiArIHphaGwgKyAiLlxuIik7CisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvb2JqL21saXN0ZS5jIGIvb2JqL21saXN0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmOTU1ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovbWxpc3RlLmMKQEAgLTAsMCArMSwxMDYgQEAKK2luaGVyaXQgIi9zdGQvdGhpbmcvcHJvcGVydGllcyI7CisKKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHN5c19kZWJ1Zy5oPgorCisjZGVmaW5lIEVNX0RBVEEgICAiL2V0Yy9FcnptYWdpZXIiCisjZGVmaW5lIE1BR0lFUiAgICAiL2V0Yy9NYWdpZXJsaXN0ZSIKKyNkZWZpbmUgTUFTVEVSICAgICIvc2VjdXJlL21hc3RlciIKKyNkZWZpbmUgV0laX0hPTUUgICIvcGxheWVycyIKKworI2RlZmluZSBSRU0gICAwICAgLy8gUmVnaW9uc0Vyek1hZ2llcgorI2RlZmluZSBNQUcgICAxICAgLy8gTm9ybWFsZSBNYWdpZXIKKworcHJpdmF0ZSBtYXBwaW5nIGRvbWFpbnMsIGJ1aWxkX2RvbWFpbnM7Citwcml2YXRlIGludCBGaW5pc2hlZCwgdG9kYXk7Cit2b2lkIE1hZ2llckxpc3RlKCk7CisKK3ByaXZhdGUgbWFwcGluZyBfcXVlcnlfTWFnaWVybGlzdGUoKSB7IHJldHVybiBkb21haW5zOyB9CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgOjpjcmVhdGUoKTsKKyAgc2V0ZXVpZChnZXR1aWQoKSk7CisgIFNldCgiTWFnaWVybGlzdGUiLCAjJ19xdWVyeV9NYWdpZXJsaXN0ZS8qJyovLCBGX1FVRVJZX01FVEhPRCk7CisgIGNhbGxfb3V0KCJyZXNldCIsIDApOworfQorCit2b2lkIHJlc2V0KCkKK3sKKyAgaWYgKHRvZGF5ID49IHRpbWUoKS84NjQwMCkKKyAgICByZXR1cm47CisKKyAgdG9kYXk9dGltZSgpLzg2NDAwOworICBNYWdpZXJMaXN0ZSgpOworfQorCit2b2lkIFByb2Nlc3NMaXN0KG1peGVkIG5hbWVzKQoreworICBtaXhlZCBEbmFtZTsKKyAgaW50IGk7CisgIGkgPSA1OworCisgIHdoaWxlKGktLSAmJiBzaXplb2YobmFtZXMpKQorICB7CisgICAgaWYoIXBvaW50ZXJwKERuYW1lID0gTUFTVEVSLT5nZXRfZG9tYWluX2hvbWVzKG5hbWVzWzBdKSkpCisgICAgICBEbmFtZSA9ICh7RG5hbWV9KTsKKyAgICBpZighc2l6ZW9mKERuYW1lKSkgRG5hbWUgPSAoeyJLZWluZSBSZWdpb24ifSk7CisgICAgd2hpbGUoc2l6ZW9mKERuYW1lKSkKKyAgICB7CisgICAgICBpZighYnVpbGRfZG9tYWluc1tEbmFtZVswXV0pCisgICAgICB7CisgICAgICAgIGJ1aWxkX2RvbWFpbnNbRG5hbWVbMF0sIFJFTV0gPSAoe30pOworICAgICAgICBidWlsZF9kb21haW5zW0RuYW1lWzBdLCBNQUddID0gKHt9KTsKKyAgICAgIH0KKyAgICAgIGlmKERuYW1lWzBdIT0iS2VpbmUgUmVnaW9uIiAmJiBNQVNURVItPmRvbWFpbl9tYXN0ZXIobmFtZXNbMF0sIERuYW1lWzBdKSkKKyAgICAgICAgYnVpbGRfZG9tYWluc1tEbmFtZVswXSwgUkVNXSArPSAoe25hbWVzWzBdfSk7CisgICAgICBlbHNlCisgICAgICAgIGJ1aWxkX2RvbWFpbnNbRG5hbWVbMF0sIE1BR10gKz0gKHtuYW1lc1swXX0pOworICAgICAgRG5hbWUgPSBEbmFtZVsxLi5dOworICAgIH0KKyAgICBuYW1lcyA9IG5hbWVzWzEuLl07CisgIH0KKyAgaWYoc2l6ZW9mKG5hbWVzKSkgY2FsbF9vdXQoIlByb2Nlc3NMaXN0IiwgMCwgbmFtZXMpOworICBlbHNlIHsgRmluaXNoZWQgPSAxOyBNYWdpZXJMaXN0ZSgpOyB9Cit9CisKK3ZvaWQgTWFnaWVyTGlzdGUoKQoreworICBzdHJpbmcgb3V0cHV0OworICBtaXhlZCBkOworCisgIGlmKCFGaW5pc2hlZCkKKyAgeworICAgIGlmKGZpbmRfY2FsbF9vdXQoIlByb2Nlc3NMaXN0IikgPT0gLTEpCisgICAgeworICAgICAgRmluaXNoZWQgPSAwOworICAgICAgYnVpbGRfZG9tYWlucyA9IG1fYWxsb2NhdGUoMCwyKTsKKyAgICAgIGNhbGxfb3V0KCJQcm9jZXNzTGlzdCIsIDAsIGdldF9kaXIoV0laX0hPTUUrIi8qIikgLSAoeyIuIiwgIi4uIiwgIi5yZWFkbWUifSkpOworICAgIH0KKyAgICBjYWxsX291dCgiTWFnaWVyTGlzdGUiLCAyMCwgMSk7CisgICAgcmV0dXJuOworICB9CisgIHdoaWxlKHJlbW92ZV9jYWxsX291dCgiTWFnaWVybGlzdGUiKSAhPSAgLTEpOworCisgIGlmICghYnVpbGRfZG9tYWlucykKKyAgICByZXR1cm47CisKKyAgb3V0cHV0ID0gIk1hZ2llcmxpc3RlIHZvbiBNb3JnZW5HcmF1ZW4gdm9tICIrZHRpbWUodGltZSgpKSsiXG4iOworCisgIGRvbWFpbnMgPSBkZWVwX2NvcHkoYnVpbGRfZG9tYWlucyk7CisgIGJ1aWxkX2RvbWFpbnM9MDsKKyAgZm9yKGQgPSBtX2luZGljZXMoZG9tYWlucyk7IHNpemVvZihkKTsgZCA9IGRbMS4uXSkKKyAgeworICAgIG91dHB1dCArPSAiUkVHSU9OOiAiK2NhcGl0YWxpemUoZFswXSkKKyAgICAgICAgICAgICArIiBSRU06ICIKKyAgICAgICAgICAgICAraW1wbG9kZShtYXAoZG9tYWluc1tkWzBdLCBSRU1dLCAjJ2NhcGl0YWxpemUpLCAiLCAiKQorICAgICAgICAgICAgICsiICgiK3NpemVvZihkb21haW5zW2RbMF0sIFJFTV0rZG9tYWluc1tkWzBdLCBNQUddKQorICAgICAgICAgICAgICsiIE1hZ2llcilcbiIKKyAgICAgICAgICAgICArIGJyZWFrX3N0cmluZyhpbXBsb2RlKG1hcChkb21haW5zW2RbMF0sIE1BR10sIydjYXBpdGFsaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsICIpLCA2MiwgOCkKKyAgICAgICAgICAgICArIlxuIjsKKyAgfQorICBybShNQUdJRVIpOworICB3cml0ZV9maWxlKE1BR0lFUiwgb3V0cHV0KTsKK30KZGlmZiAtLWdpdCBhL29iai9tcGEuYyBiL29iai9tcGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmQxOTcyCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL21wYS5jCkBAIC0wLDAgKzEsMTU3MyBAQAorLyogRGFzIFNlcnZpY2VwYWtldCBkZXIgTW9yZ2VuZ3JhdWVuLVByZXNzZWFnZW50dXIuIEVpbmUgZXJ3ZWl0ZXJ0ZSBaZWl0dW5nLgorICAgVGVpbHdlaXNlIHp1ciBhbHRlbiBaZWl0dW5nIGlkZW50aXNjaC4KKworICAgdW50ZXIgVmVyd2VuZHVuZyBkZXIgWmVpdHVuZyB2b24gSm9mLCB2b2VsbGlnIHVtZ2VzY2hyaWViZW4uCisKKyAgIChDKSBOb3YgMTk5MyAtIDE5OTYgIExvY29ATW9yZ2VuZ3JhdWVuCisKKyAgIFZlcndlbmR1bmcgYXVzc2VyaGFsYiB2b24gTW9yZ2VuZ3JhdWVuIGlzdCBnZXN0YXR0ZXQgdW50ZXIgZm9sZ2VuZGVuCisgICBCZWRpbmd1bmdlbjoKKyAgIC0gQmVudXR6dW5nIGVyZm9sZ3QgYXVmIGVpZ2VuZSBHZWZhaHIuIEplZ2xpY2hlIFZlcmFudHdvcnR1bmcgd2lyZAorICAgICBhYmdlbGVobnQuIEJ1Z3MgYXVzc2VyaGFsYiB2b24gTUcgc2luZCBuaWNodCBtZWluIFByb2JsZW0uCisgICAtIEF1Y2ggaW4gdmVyYWVuZGVydGVuIG9kZXIgYWJnZWxlaXRldGVuIE9iamVrdGVuIG11c3MgZWluIEhpbndlaXMgYXVmCisgICAgIGRpZSBIZXJrdW5mdCBlcmhhbHRlbiBibGVpYmVuLgorICAgLSBCaXR0ZSBmcmFndCBtaWNoIHZvcmhlciEKKyAgIEVpbiBVcGRhdGUtU2VydmljZSBiZXN0ZWh0IG5pY2h0LiBSdWVja25haG1lIGRpZXNlciBMaXplbnogaXN0IGplZGVyemVpdAorICAgbW9lZ2xpY2guIFVuZCB3ZXIgbmljaHQgaW4gZGVyIExhZ2UgaXN0LCBuZXVlIFZlcnNpb25lbiBzZWxiZXIgYW56dXBhc3NlbiwKKyAgIGhhdCBpbiBkZXIgQWRtaW5pc3RyYXRpb24gZWluZXMgTXVkcyBuaWNodHMgenUgc3VjaGVuLgorCisKKyAgIDA0LjExLjkzICAgRXJzdGUgYnJhdWNoYmFyZSBWZXJzaW9uCisgICAoLi4uIHNlaXRkZW0gdmllbGUgQWVuZGVydW5nZW4gLi4uKQorICAgMTMuMDkuOTUgY2EgMDI6MDAgIGVyd2FydGUgbXBhCisgICAxMy4wOS45NSBjYSAyMzowMCAgUmVidWlsZEdyb3VwTGlzdCgpCisgICAxNS4wOS45NSAgICAgICAgICAgICB2b3JsYWV1ZmlnIGF1c2dlYmF1dAorICAgMTYuMDkuICAgICAgICAgICAgICAgYW5kZXJzIHdpZWRlciBlaW5nZWJhdXQsIHVuZCBLbGVpbmlna2VpdGVuCisgICAwNS4xMi45NSBjYSAxOToyMCAgU3BpZWxlciBrb2VubmVuIG51ciBub2NoIGVpZ2VuZSBBcnRpa2VsIGxvZXNjaGVuL3ZlcmwuCisgICAwNy4xMi45NSBjYSAyMzowMCAgS2VpbmUgQW56ZWlnZSBkZXIgU3RhdHVzemVpbGUuIFN0YXR1c3plaWxlbiBiZWdpbm5lbgorICAgICAgICAgICAgICAgICAgICAgIG1pdCB+IyEsIHNpbmQgZGFtaXQgbmljaHQgbWl0IGRlbSBFZGl0b3IgZXJ6ZXVnYmFyLgorICAgMjAuMTIuOTUgY2EgMTc6MDAgIHVlYmVyZ2VoZSB0aHJlYWQvYW50d29ydGVuCisgICAzMS4wMS45NiAgICAgICAgICAgd2llZGVyaG9sZS91bmNhdGNodXAKKyAgIDIyLjA0Ljk2ICAgICAgICAgICBBdWZyYWV1bWVuIGlnbm9yaWVydGVyIHRocmVhZHMuIEFMUEhBIQorICAgMjQuMDQuOTYgICAgICAgICAgICsgLSAuIGFscyBBZHJlc3NpZXJ1bmdlbiwgemVpdHVuZ3NtZWxkdW5nCisgICAwMi4xMC45NiAgICAgICAgICAgS2xlaW5pZ2tlaXRlbgorICAgMDguMTAuOTYgICAgICAgICAgIEtsZWluaWdrZWl0ZW4KKyAgIDA1LjEyLjk2ICAgICAgICAgICBhbnR3b3J0ZSBhdWYgYXJ0aWtlbCA8bnI+LCByZXBseSA8bmV1ZXIgdGl0ZWw+LAorICAgICAgICAgICAgICAgICAgICAgIHZlcnNlbmRlIGFydGlrZWwsIEFia3Vlcnp1bmdlbiBmdWVyIFJ1YnJpa2VubmFtZW4sCisgICAgICAgICAgICAgICAgICAgICAgTGF5b3V0YWVuZGVydW5nZW4sCisgICAgICAgICAgICAgICAgICAgICAgSGVya3VuZnQgYmVpIHZlcmxlZ3RlbiBBcnRpa2VsbiBpbiBTdGF0dXN6ZWlsZQorCisgICBMZXR6dGUgQWVuZGVydW5nOiAKKyAgIDA0LjExLjA2IFplc3N0cmEgIEFucGFzc3VuZyBhbiBkYXMgbmV1ZSBWZXJoYWx0ZW4gdm9uIGluaGVyaXRfbGlzdCgpIGluIExECisKKyovCisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxuZXdzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8YW5zaS5oPgorI2luY2x1ZGUgPGlucHV0X3RvLmg+CisjaW5jbHVkZSAiL21haWwvcG9zdC5oIgorCitpbmhlcml0ICIvc3RkL3RoaW5nIjsKK2luaGVyaXQgTkVESVQ7CisvKgorI2RlZmluZSBERUJVRyh4KSAgICAgICAgaWYgKGZ1bmNhbGwoc3ltYm9sX2Z1bmN0aW9uKCdmaW5kX3BsYXllciksInplc3N0cmEiKSlcCisgICAgICAgICAgdGVsbF9vYmplY3QoZnVuY2FsbChzeW1ib2xfZnVuY3Rpb24oJ2ZpbmRfcGxheWVyKSwiemVzc3RyYSIpLFwKKyAgICAgICAgICAgICAgICAgICAgICAiTVBBOiAiK3grIlxuIikKKyNkZWZpbmUgREVCVUdWQVIoeCkgREVCVUcoc3ByaW50Zih4KyI6XG4lT1xuIix4KSkKKyovCisjZGVmaW5lIERFQlVHVkFSKHgpCisKKy8vIEtvbmZpZ3VyYXRpb24sIGdnZiBtdWRhYmhhZW5naWcKKyNkZWZpbmUgREVGQVVMVEdST1VQICJhbGxnZW1laW5lcyIKKyNkZWZpbmUgTUlOSUhFTFBQQUdFICJwL3NlcnZpY2UvbG9jby9kb2MvbWluaS1tcGEudHh0IgorI2RlZmluZSBIRUxQUEFHRSAgICAgIi9wL3NlcnZpY2UvbG9jby9kb2MvbXBhIgorI2RlZmluZSBXSVpIRUxQUEFHRSAgIi9wL3NlcnZpY2UvbG9jby9kb2MvbXBhLndpeiIKKyNkZWZpbmUgU0FWRU1TR1BBVEgocGwpICgiL29wZW4vTmV3cy8iKyhnZXRldWlkKHBsKSkrIi5uZXdzIikKKyNkZWZpbmUgSVNfUE9TVChyKSAgKG1lbWJlcihpbmhlcml0X2xpc3QociksU1REUE9TVCsiLmMiKT49MCkKKyNkZWZpbmUgSU5JVElBTF9TVUJTQ1JJUFRJT05TIFwKKyAgKHsgICJiZWthbm50bWFjaHVuZ2VuIiwgXAorICAgICAgImQuZWJlbmUiLCBcCisgICAgICAiZC53dWVzdGUiLCBcCisgICAgICAiZC5pbnNlbG4iLCBcCisgICAgICAiZC51bnRlcndlbHQiLCBcCisgICAgICAiZC5kc2NodW5nZWwiLCBcCisgICAgICAiZC5nZWJpcmdlIiwgXAorICAgICAgImQucG9sYXIiLCBcCisgICAgICAiZC53YWxkIiwgXAorICAgICAgImQuZmVybndlc3QiLCBcCisgICAgICAiZC52bGFuZCIsIFwKKyAgICAgICJkLmFuZmFlbmdlciIsIFwKKyAgICAgICJlbnR3aWNrbHVuZyIsIFwKKyAgIH0pCisKKy8vIE1ha3JvcyBldGMuCisKKyNkZWZpbmUgVFAgICAgICAgICAgdGhpc19wbGF5ZXIoKQorI2RlZmluZSBUSSAgICAgICAgICB0aGlzX2ludGVyYWN0aXZlKCkKKyNkZWZpbmUgU1RBVFVTRVNDQVBFICJ+IyEiIAorI2RlZmluZSBJU19TVEFUVVNMSU5FKHMpICgoc1swLi4xXT09IiMhIil8fChzWzAuLjJdPT0ifiMhIikpCisvLyNkZWZpbmUgSVNfU1RBVFVTTElORShzKSAoc1swLi4yXT09In4jISIpCisvLyBpbiBSdWJyaWsgbXVlbGwgZmFuZGVuIHNpY2ggdGF0c2FlY2hsaWNoIG5vY2ggc29sY2hlIHVyYWx0ZW4gbm90ZXMuLi4KKyNkZWZpbmUgSUdOT1JFR1JPVVAgIippZ25vcmVkKiIKKyNkZWZpbmUgTk5BRFdNU0cgICAgIipOTkFEV01TRyoiCisjZGVmaW5lIFNZU1RFTUdST1VQUyAoe0lHTk9SRUdST1VQLE5OQURXTVNHfSkKKworLy8gQXVmYmF1IGRlciBpZ25vcmVncm91cDoKKy8vICAgKFtncm91cDE6KFt0aWQxOmxhc3R0aW1lMSx0aWQyOmxhc3R0aW1lMiwuLi5dKSxncm91cDI6Li4uXSkKKworLy8gRmxhZ3MgZnVlciBNZXNzYWdlMnN0cmluZygpCisjZGVmaW5lIE0yU19WVDEwMCAgICAxCisjZGVmaW5lIE0yU19BTlNJICAgICBNMlNfVlQxMDAKKyNkZWZpbmUgTTJTX1JFTU9URSAgIDIKKworLy8gRm9ybWF0IHZvbiBsYXN0dGl0bGUKKyNkZWZpbmUgTEFTVF9USVRMRSAgIDAKKyNkZWZpbmUgTEFTVF9XUklURVIgIDEKKyNkZWZpbmUgTEFTVF9USU1FICAgIDIKKyNkZWZpbmUgTEFTVF9USUQgICAgIDMKKyNkZWZpbmUgTEFTVF9HUk9VUCAgIDQKKyNkZWZpbmUgTEFTVF9OUiAgICAgIDUKKyNkZWZpbmUgTEFTVF9TSVpFT0YgIDYKKworCittYXBwaW5nIHJlYWRfdW50aWw7CittaXhlZCAgIGxhc3R0aXRsZTsgLy8gQXVmYmF1IHMuby4KK21peGVkICAgbWVzc2FnZTsKK2ludCAgICAgZGVhZFRJRDsKK3N0cmluZyAgR1JPVVA7CisKK2ludCBHZXRUSUQobWl4ZWQgbWVzc2FnZSk7Citwcml2YXRlIHZvaWQgSW5pdGlhbFN1YnNjcmlwdGlvbnMoKTsKKworY3JlYXRlKCkKK3sKKyAgOjpjcmVhdGUoKTsKKyAgc2V0ZXVpZChnZXR1aWQoKSk7CisgIEdST1VQPSJiZWthbm50bWFjaHVuZ2VuIjsKKyAgU2V0UHJvcChQX1NIT1JULCJEaWUgWmVpdHVuZyIpOworICBTZXRQcm9wKFBfTkFNRSwiWmVpdHVuZyIpOworICBTZXRQcm9wKFBfV0VJR0hULCA1MCk7CisgIFNldFByb3AoUF9TSVpFLCAzNSk7CisgIFNldFByb3AoUF9NQVRFUklBTCwgKFtNQVRfUEFQRVI6IDEwMF0pICk7CisgIFNldFByb3AoUF9HRU5ERVIsIEZFTUFMRSk7CisgIEFkZElkKCh7Im5uIiwiemVpdHVuZyIsInNlcnZpY2VwYWtldCIsIm1wYSJ9KSk7CisgIFNldFByb3AoUF9OT0RST1AsCisgICAgIkRhcyBwZXJzb2VubGljaGUgU2VydmljZXBha2V0IGRlciBNUEEga2FubiBtYW4gbmljaHQgd2Vnd2VyZmVuLlxuIik7CisgIFNldFByb3AoUF9ORVZFUkRST1AsIDEpOworCisgIGlmICghcmVhZF91bnRpbCkgcmVhZF91bnRpbD0oWyJtdWVsbCI6LTFdKTsKK30KKworc3RhdGljIG1peGVkIF9xdWVyeV9yZWFkX21zZygpIHsgcmV0dXJuIGxvbmcoKTsgfQorCitsb25nKCkgeworICByZXR1cm4gIlwKK0RpZXMgaXN0IGRhcyBTZXJ2aWNlcGFrZXQgZGVyIE1QQSAoTW9yZ2VuZ3JhdWVucyBQcmVzc2UgQWdlbnR1cikgLVxuXAorZGllIFplaXR1bmcgZGVzIE1vcmdlbmdyYXVlbnMuXG5cCitEdSBrYW5uc3QgZGFtaXQgYWt0dWVsbGUgQXJ0aWtlbCBsZXNlbiB1bmQgc2NocmVpYmVuLCBtaXQgZm9sZ2VuZGVuIEJlZmVobGVuOlxuXAorICdubiBbcnVicmlrXScgKE5ldWVzdGUgTmFjaHJpY2h0ZW4pIHd1ZWhsdCBkaWUgUnVicmlrIGR1cmNoIHVuZCBzY2hhdXQsXG5cCisgICAgICAgICAgICAgICAgb2Igd2FzIG5ldSBpc3QuIERlciBlcnN0ZSB1bmdlbGVzZW5lIEFydGlrZWwgd2lyZCBhbmdlemVpZ3QuXG5cCisgICAgICAgICAgICAgICAgT2huZSBBcmd1bWVudCB3ZXJkZW4gYWxsZSBSdWJyaWtlbiBkdXJjaHd1ZWhsdC5cblwKKyAnaGlsZmUgbXBhJyAgICBBdXNmdWVocmxpY2hlIEhpbGZzc2VpdGUuIExlc2VuIGRyaW5nZW5kIGVtcGZvaGxlbiFcblwKK1dlaXRlcmUgQmVmZWhsZTpcblwKKyBydWJyaWtlbiBbbmV1XSAgICAgICAgICAgICAgICAgICAgICAgYmVzdGVsbGUgPHJ1YnJpaz4gYWJcblwKKyBbbGllcyBdcnVicmlrIDxydWJyaWs+ICAgICAgICAgICAgICAgYWJvbm5pZXJlIDxydWJyaWs+XG5cCisgaW5oYWx0IFs8cnVicmlrPnxuZXV8c3VjaGUgPHRleHQ+XSAgIHdpZWRlcmhvbGUgLi4uXG5cCisgbm4gPHJ1YnJpa2VuPnw8bGlzdGU+ICAgICAgICAgICAgICAgIHVlYmVyZ2VoZSAuLi5cblwKKyBbbGllcyBdYXJ0aWtlbCA8bnVtbWVyPiIrCisgICggKElTX0xFQVJORVIoVFApKSA/ICIgICAgICAgICAgICAgIHNwZWljaGVyZSBhcnRpa2VsIDxucj4iIDogIiIgKSsiXG5cCisgc2NocmVpYiA8dGl0ZWw+ICAgICAgICAgICAgICAgICAgICAgIHZlcnNlbmRlIGFydGlrZWwgW25yXSBhbiA8YWRyZXNzZT5cblwKKyBhbnR3b3J0ZSBbYXVmIGFydGlrZWwgPG5yPl0gW3RpdGVsXSAgdmVybGVnZSBhcnRpa2VsIDxucj4gbmFjaCA8cnVicmlrPlxuXAorIGxvZXNjaGUgYXJ0aWtlbCA8bnI+ICAgICAgICAgICAgICAgICB6ZWl0dW5nc21lbGR1bmcgW25ldWUgTWVsZHVuZ11cblwKKyB2ZXJicmVubmUgemVpdHVuZyAgICAgICAgICAgICAgICAgICAgd2VubiBEaXIgYWxsZXMgenV2aWVsIHdpcmQuLi4uXG5cCisiKyAoSVNfU0VFUihUUCkgPyAiXAorTWl0ICdtYWlsJyBiencgJ21haWwgPHNwaWVsZXI+JyBrYW5uc3QgRHUgUG9zdCBsZXNlbiB1bmQgc2NocmVpYmVuLlxuXAorIiA6ICIiICkrIlwKK0VpbmdlYmF1dGUgYWxpYXNlOiBub3RlLCBjYXRjaHVwLCByZXBseSwgdW5zdWJzY3JpYmUsIHN1YnNjcmliZSwgdW5jYXRjaHVwLlxuXAorVmllbGUgQmVmZWhsZSBnZWJlbiBtaXQgJzxiZWZlaGw+ID8nIGVpbmlnZSBTeW50YXhoaW53ZWlzZS5cblwKK0FrdHVlbGxlIFJ1YnJpazogIitHUk9VUCsiXG5cCisiOworfQorCisKK2luaXQoKQoreworICA6OmluaXQoKTsKKworICBhZGRfYWN0aW9uKCJzY2hyZWliIiwic2NocmVpYiIpOworICBhZGRfYWN0aW9uKCJzY2hyZWliIiwic2NocmVpYmUiKTsKKyAgYWRkX2FjdGlvbigic2NocmVpYiIsIm5vdGUiKTsKKyAgYWRkX2FjdGlvbigiTGllc0FydGlrZWwiLCJsaWVzIik7CisgIGFkZF9hY3Rpb24oImFydGlrZWwiLCJhcnRpa2VsIik7CisgIGFkZF9hY3Rpb24oImxvZXNjaGUiLCJsb2VzY2giKTsKKyAgYWRkX2FjdGlvbigibG9lc2NoZSIsImxvZXNjaGUiKTsKKyAgYWRkX2FjdGlvbigicnVicmlrIiwicnVicmlrIik7CisgIGFkZF9hY3Rpb24oImluaGFsdCIsImluaGFsdCIpOworICBhZGRfYWN0aW9uKCJydWJyaWtlbiIsInJ1YnJpa2VuIik7CisgIGFkZF9hY3Rpb24oIlJlYWROZXh0VW5yZWFkIiwibm4iKTsKKyAgYWRkX2FjdGlvbigiQ2F0Y2h1cCIsImNhdGNodXAiKTsKKyAgYWRkX2FjdGlvbigiQ2F0Y2h1cCIsInVlYmVyZ2VoIik7CisgIGFkZF9hY3Rpb24oIkNhdGNodXAiLCJ1ZWJlcmdlaGUiKTsKKyAgYWRkX2FjdGlvbigiVW5jYXRjaHVwIiwid2llZGVyaG9sIik7CisgIGFkZF9hY3Rpb24oIlVuY2F0Y2h1cCIsIndpZWRlcmhvbGUiKTsKKyAgYWRkX2FjdGlvbigiVW5jYXRjaHVwIiwidW5jYXRjaHVwIik7CisgIGFkZF9hY3Rpb24oIlJlcGx5IiwiYW50d29ydCIpOworICBhZGRfYWN0aW9uKCJSZXBseSIsImFudHdvcnRlIik7CisgIGFkZF9hY3Rpb24oIlJlcGx5MiIsInJlcGx5Iik7CisgIGFkZF9hY3Rpb24oIkhlbHBQYWdlIiwiaGlsZmUiKTsKKyAgYWRkX2FjdGlvbigiSGVscFBhZ2UiLCJtYW4iKTsKKyAgYWRkX2FjdGlvbigiVW5zdWJzY3JpYmUiLCJ1bnN1YnNjcmliZSIpOworICBhZGRfYWN0aW9uKCJCZXN0ZWxsZSIsImJlc3RlbGwiKTsKKyAgYWRkX2FjdGlvbigiQmVzdGVsbGUiLCJiZXN0ZWxsZSIpOworICBhZGRfYWN0aW9uKCJTdWJzY3JpYmUiLCJzdWJzY3JpYmUiKTsKKyAgYWRkX2FjdGlvbigiU3Vic2NyaWJlIiwiYWJvbm5pZXIiKTsKKyAgYWRkX2FjdGlvbigiU3Vic2NyaWJlIiwiYWJvbm5pZXJlIik7CisgIGFkZF9hY3Rpb24oIk1vdmVNZXNzYWdlIiwidmVybGVnIik7CisgIGFkZF9hY3Rpb24oIk1vdmVNZXNzYWdlIiwidmVybGVnZSIpOworICBhZGRfYWN0aW9uKCJTZXROTkFEV01TRyIsInplaXR1bmdzbWVsZHVuZyIpOworICBhZGRfYWN0aW9uKCJJZ25vcmUiLCJpZ25vcmllciIpOworICBhZGRfYWN0aW9uKCJJZ25vcmUiLCJpZ25vcmllcmUiKTsKKyAgYWRkX2FjdGlvbigiTWFpbE1lc3NhZ2UiLCJ2ZXJzZW5kZSIpOworICBhZGRfYWN0aW9uKCJ2ZXJicmVubmVuIiwidmVyYnJlbm5lIik7CisKKyAgaWYgKElTX1NFRVIoVFApKSB7CisgICAgYWRkX2FjdGlvbigiTWFpbCIsIm1haWwiKTsKKyAgfQorICBpZiAoSVNfTEVBUk5FUihUUCkpIHsKKyAgICBhZGRfYWN0aW9uKCJTYXZlTWVzc2FnZSIsInNwZWljaGVyIik7CisgICAgYWRkX2FjdGlvbigiU2F2ZU1lc3NhZ2UiLCJzcGVpY2hlcmUiKTsKKyAgICBhZGRfYWN0aW9uKCJSZWFkTmV4dFVucmVhZCIsInJlYWQiKTsgLyogTkYgQ29tcGF0aWJpbGl0eSBTcGVjaWFsICovCisgIH0KKyAgaWYgKElTX0VMREVSKFRQKSkKKyAgeworICAgIGFkZF9hY3Rpb24oIk1vdmVUcmFzaCIsInRyYXNoIik7CisgIH0KKyAgaW5pdF9yZXNjdWUoKTsKK30KKwordmVyYnJlbm5lbihzdHIpIHsKKyAgaWYgKCFzdHIgfHwgIWlkKHN0cikpIHJldHVybiAwOworICB3cml0ZSgiRHUgdmVyYnJlbm5zdCBEZWluZSBaZWl0dW5nIG1pdCBncm9lc3N0ZW0gVmVyZ251ZWdlbi5cbiIpOworICBzYXkoVFAtPk5hbWUoV0VSKSsiIHZlcmJyZW5udCAiKworICAgIFRQLT5RdWVyeVBvc3NQcm9ub3VuKEZFTUFMRSwgV0VOLCBTSU5HVUxBUikrIiBaZWl0dW5nIGluIGVpbmVtICIKKyAgICAiRnJldWRlbmZldWVyLlxuIik7CisgIHJlbW92ZSgxKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8vIEtpbGxHcm91cCAtIGxvZXNjaHQgZWluZSBuaWNodCBtZWhyIGJlbm9ldGlndGUgUnVicmlrIGF1cyBkZXIgTGlzdGUuCisvLyBBdWZydWYgYXVzIHJ1YnJpa2VuKCkgdW5kIFJlYWROZXh0VW5yZWFkKCksIHdlbm4gZGllIGd1ZWx0aWdlCisvLyBSdWJyaWtlbmxpc3RlIHNvd2llc28gc2Nob24gYWJnZXJ1ZmVuIHd1cmRlLgorCitzdGF0aWMgS2lsbEdyb3VwKG5hbWUpIHsgcmVhZF91bnRpbD1tX2NvcHlfZGVsZXRlKHJlYWRfdW50aWwsbmFtZSk7IH0KKworLyogUmVidWlsZEdyb3VwTGlzdCgpIC0gdHV0IGRvY2ggbmljaHQgc28sIHdlaWwgL3NlY3VyZS9uZXdzIGFuZGVycyBhcmJlaXRldC4KKyAqIEJsZWlidCB2b3JlcnN0IHp1bSBOYWNoc2NobGFnZW4uCitzdGF0aWMgUmVnaXN0ZXJHcm91cChuYW1lKSB7IHJlYWRfdW50aWxbbmFtZV09MTsgfQorc3RhdGljIFJlYnVpbGRHcm91cExpc3QoKSB7CisgIG1peGVkIGdyb3VwczsKKyAgaWYgKChwb2ludGVycChncm91cHM9TkVXU1NFUlZFUi0+R2V0R3JvdXBzKCkpKSYmKHNpemVvZihncm91cHMpKSkgeworICAgIG1hcChtX2luZGljZXMocmVhZF91bnRpbCktZ3JvdXBzLVNZU1RFTUdST1VQUywjJ0tpbGxHcm91cCk7CisgICAgbWFwKGdyb3Vwcy1tX2luZGljZXMocmVhZF91bnRpbCksIydSZWdpc3Rlckdyb3VwKTsKKyAgfQorICBUUC0+U2V0UHJvcChQX1JFQURfTkVXUyxyZWFkX3VudGlsKTsKK30gICAgCisqLworCisKK19zZXRfYXV0b2xvYWRvYmoobWl4ZWQgYXJnKSB7CisKKyAgaWYgKHBvaW50ZXJwKGFyZykgJiYgc2l6ZW9mKGFyZyk+PTIpCisgIHsKKyAgICByZWFkX3VudGlsPWFyZ1sxXTsKKyAgfQorICBlbHNlIHsKKyAgICBpZiAoVFApCisgICAgICAgcmVhZF91bnRpbD0oKFRQLT5RdWVyeVByb3AoUF9SRUFEX05FV1MpKXx8KFtdKSk7CisgIH0KKworICBpZiAoVFApIFRQLT5TZXRQcm9wKFBfUkVBRF9ORVdTLHJlYWRfdW50aWwpOworfQorCitfcXVlcnlfYXV0b2xvYWRvYmooKSB7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgTWFpbChzdHIpIHsKKyAgb2JqZWN0IG1haWxlcjsKKyAgaWYgKHRoaXNfaW50ZXJhY3RpdmUoKSE9dGhpc19wbGF5ZXIoKSkgcmV0dXJuIDA7CisgIG1haWxlcj1jbG9uZV9vYmplY3QoTUFJTEVSKTsKKyAgbWFpbGVyLT5TZXRPZmZpY2VOYW1lKCJtcGEgS3VyaWVyZGllbnN0Iik7CisgIG1haWxlci0+ZG9fbWFpbCggKCghc3RyKXx8KHN0cj09Im1haWwiKSkgPyAwIDogVFAtPl91bnBhcnNlZF9hcmdzKCkgKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2YXJhcmdzIHN0cmluZyBNZXNzYWdlMnN0cmluZyhtaXhlZCBtc2csbWl4ZWQgbWVzc2FnZXMsaW50IGZsYWcsc3RyaW5nIGdyb3VwKSB7CisgIC8vIEF1ZnJ1ZmU6IChOdW1tZXIsTm90ZXNbLGZsYWdbLGdyb3VwXV0pIG9kZXIgKE5vdGUsTm90ZXNbLGZsYWdbLGdyb3VwXV0pCisgIC8vIGZsYWc6IE0yU19WVDEwMCA6IGdnZiBBTlNJLUNvZGVzIHZlcndlbmRlbgorICAvLyAgICAgICBNMlNfUkVNT1RFOiBSdWJyaWsgdW5kIEFydGlrZWxudW1tZXIgYXVzZ2ViZW4gKHNwZWljaGVybiwgdmVyc2VuZGVuKQorICAvLyBBY2h0dW5nOiBXZW5uIGZsYWcmTTJTX1JFTU9URSwgbXVzcyBtc2cgaW50IHNlaW4KKyAgLy8gZ3JvdXA6IE5hbWUgZGVyIFJ1YnJpaywgd2VubiBuaWNodCBha3R1ZWxsZSBSdWJyaWsuIE51ciBiZWkgTTJTX1JFTU9URQorCisgIHN0cmluZyB0eHQsaHMscywqbSxzMjsKKyAgaW50IGksaGksdGhpc25yLGFuc2lmbGFnOworCisgIGlmIChmbGFnJk0yU19SRU1PVEUpIHR4dD0iUnVicmlrOiAiKyhncm91cD9ncm91cDpHUk9VUCkrIiwgQXJ0aWtlbDogIisKKyAgICAoaW50cChtc2cpP3RvX3N0cmluZyhtc2crMSk6Ij8/PyIpKyIgdm9uICIrc2l6ZW9mKG1lc3NhZ2VzKSsiXG4iOworICBlbHNlIHR4dD0iIjsKKworICBpZiAoaW50cChtc2cpKSB7CisgICAgdGhpc25yPW1zZzsKKyAgICBtc2c9bWVzc2FnZXNbbXNnXTsKKyAgfSBlbHNlIHRoaXNucj0tMTsKKyAgaWYgKCFtc2cpIHJldHVybiAwOworCisgIGFuc2lmbGFnPShmbGFnJk0yU19WVDEwMCkmJih0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoUF9UVFkpIT0iZHVtYiIpOworCisgIHR4dCArPSAoYW5zaWZsYWc/QU5TSV9CT0xEOiIiKSsgbXNnW01fVElUTEVdKyhhbnNpZmxhZz9BTlNJX05PUk1BTDoiIikrCisgICAgIiAoIittc2dbTV9XUklURVJdKyIsICIrCisgICAgZHRpbWUobXNnW01fVElNRV0pWzUuLjI2XSsiKTpcbiI7CisvLyAgaWYgKGdldGV1aWQoVFApPT0ic2l0b3BhbmFraSIpIHR4dCs9IlRJRD0iK0dldFRJRChtc2cpKyJcbiI7IC8vIERlYnVnCisgIGlmICghSVNfU1RBVFVTTElORShtc2dbTV9NRVNTQUdFXSkpCisgICAgcmV0dXJuIHR4dCsiXG4iK21zZ1tNX01FU1NBR0VdOworICBtPWV4cGxvZGUobXNnW01fTUVTU0FHRV0sIlxuIik7CisgIHdoaWxlIChJU19TVEFUVVNMSU5FKG1bMF0pKSB7CisvLyAgICB0eHQrPW1bMF0rIlxuIjsgLy8gIyMjCisgICAgaWYgKHNzY2FuZihtWzBdLCIlcyBybj0lcyBydD0lZCByZz0lcyIsaHMscyxoaSxocyk9PTQgfHwKKyAgICAgICAgc3NjYW5mKG1bMF0sIiVzIHJuPSVzIHJ0PSVkIixocyxzLGhpKT09MykKKyAgICB7CisgICAgICBpbnQgbnIsaDsKKyAgICAgIG5yPS0xOworICAgICAgaWYgKHBvaW50ZXJwKG1lc3NhZ2VzKSkKKyAgICAgIHsKKyAgICAgICAgZm9yIChoPSgodGhpc25yPj0wKSA/IHRoaXNuci0xIDogc2l6ZW9mKG1lc3NhZ2VzKS0xKTsKKyAgICAgICAgICAgICAoaD49MCAmJiBtZXNzYWdlc1toXVtNX1RJTUVdPj1oaSk7aC0tKSAKKyAgICAgICAgICBpZiAobWVzc2FnZXNbaF1bTV9USU1FXT09aGkgJiYKKyAgICAgICAgICAgICAgbG93ZXJfY2FzZShtZXNzYWdlc1toXVtNX1dSSVRFUl0pPT1sb3dlcl9jYXNlKHMpKQorICAgICAgICAgICAgbnI9aDsKKyAgICAgIH0KKyAgICAgIHR4dCs9IltCZXp1ZzogQXJ0aWtlbCAiKygobnI+PTApID8gKG5yKzEpIDogCisgICAgICAgICAoaHM9PVNUQVRVU0VTQ0FQRXx8aHM9PShncm91cD9ncm91cDpHUk9VUCk/IihnZWxvZXNjaHQ/KSI6ImluICIraHMpKSsKKyAgICAgICAgICIgdm9uICIrY2FwaXRhbGl6ZShzKSsiIHZvbSAiK2R0aW1lKGhpKVs1Li4yNl0rIl1cbiI7CisgICAgfQorICAgIGlmIChzc2NhbmYobVswXSwiJXMgb249JXMgb3Q9JWQgb2c9JXMiLGhzLHMsaGksaHMpPT00KSB7CisgICAgICB0eHQrPSJbQXV0b3I6ICIrcysiLCAiK2R0aW1lKGhpKVs1Li4yNl0rIiwgdmVybGVndCB2b24gIitocysiXVxuIjsKKyAgICB9CisgICAgbT1tWzEuLl07CisgIH0KKyAgcmV0dXJuIHR4dCsiXG4iK2ltcGxvZGUobSwiXG4iKTsKK30KKworc3RhdGljIHZhcmFyZ3MgbGllcyhtaXhlZCBzdHIpIHsKKyAgbWl4ZWQgbnVtOworICBtaXhlZCAqbWVzc2FnZXM7CisgIGludCB0aWQ7CisKKyAgaWYgKHN0cj09Ij8ifHxzdHI9PSItPyIpIHJldHVybiAKKyAgICB3cml0ZSgiU3ludGF4OiBsaWVzIDxucj5cbiIKKyAgICAgICAgICAiICAgICAgICBhcnRpa2VsIDxucj5cbiIKKyAgICAgICAgICAiU2llaGUgYXVjaDogbm5cbiIpLDE7CisKKyAgaWYgKGludHAoc3RyKSkgbnVtPXN0cjsKKyAgaWYgKCghbnVtICYmICghc3RyIHx8IHN0cj09IiIgfHwgc3NjYW5mKHN0ciwiJWQiLG51bSkhPTEpKSB8fCBudW08PTApIHsKKyAgICBub3RpZnlfZmFpbCgiV0VMQ0hFIE5hY2hyaWNodCB3aWxsc3QgRHUgbGVzZW4/XG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIXBvaW50ZXJwKG1lc3NhZ2VzPU5FV1NTRVJWRVItPkdldE5vdGVzKEdST1VQKSkpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJTZWx0c2FtLCBkaWUgUnVicmlrICciK0dST1VQKworICAgICAgICAiJyBnaWJ0IGVzIG5pY2h0IG1laHIuLi5cbiIpLCAwOworICBudW0tLTsKKyAgaWYgKHNpemVvZihtZXNzYWdlcyk8PW51bSkgeworICAgIG5vdGlmeV9mYWlsKCJTbyB2aWVsZSBBcnRpa2VsIHNpbmQgZGEgbmljaHQhXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICAKKyAgbGFzdHRpdGxlPSh7bWVzc2FnZXNbbnVtXVtNX1RJVExFXSxtZXNzYWdlc1tudW1dW01fV1JJVEVSXSwKKyAgICAgIG1lc3NhZ2VzW251bV1bTV9USU1FXSxHZXRUSUQobWVzc2FnZXNbbnVtXSksR1JPVVAsbnVtfSk7CisgIHRoaXNfcGxheWVyKCktPk1vcmUoTWVzc2FnZTJzdHJpbmcobWVzc2FnZXNbbnVtXSxtZXNzYWdlcyxNMlNfVlQxMDApKTsKKyAgaWYgKHRoaXNfcGxheWVyKCkgJiYgSVNfTEVBUk5FUih0aGlzX3BsYXllcigpKSkKKyAgICB0aGlzX3BsYXllcigpLT5zYXZlX21lKDEpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZhcmFyZ3MgbWl4ZWQgR2V0R3JvdXBOYW1lKG1peGVkIGcsbWl4ZWQgZ3JvdXBzKSB7CisgIC8qIE5hbWUgZWluZXIgUnVicmlrLiBnIGlzdCBpbnQgb2RlciBzdHJpbmcsIGVudGhhZWx0IE5hbWUgb2RlciBOdW1tZXIKKyAgICAgKGFiIDEgbnVtZXJpZXJ0KSAqLworICBtaXhlZCBpLGV4cHIsZ2c7CisgIGlmICghZykgcmV0dXJuIHdyaXRlKCJEdSBzb2xsdGVzdCBzY2hvbiBkaWUgUnVicmlrIGFuZ2ViZW4uXG4iKSwwOworICBpZiAoIWdyb3VwcykgZ3JvdXBzPU5FV1NTRVJWRVItPkdldEdyb3VwcygpOworICBpZiAoaW50cChpPWcpIHx8IHNzY2FuZihnLCIlZCIsaSkpIHsKKyAgICBpZiAoaT4wICYmIGk8PXNpemVvZihncm91cHMpKSByZXR1cm4gZ3JvdXBzW2ktMV07CisgICAgd3JpdGUoIkVpbmUgUnVicmlrIG1pdCBkZXIgTnVtbWVyICIraSsiIGdpYnQgZXMgbGVpZGVyIG5pY2h0LlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgZz1sb3dlcl9jYXNlKGcpOworICBzd2l0Y2goZyl7CisgIGNhc2UgIi4iOiByZXR1cm4gR1JPVVA7CisgIGNhc2UgIisiOiByZXR1cm4gZ3JvdXBzWyhtZW1iZXIoZ3JvdXBzLEdST1VQKSsxKSVzaXplb2YoZ3JvdXBzKV07CisgIGNhc2UgIi0iOiAKKyAgICByZXR1cm4gZ3JvdXBzWyhtZW1iZXIoZ3JvdXBzLEdST1VQKS0xK3NpemVvZihncm91cHMpKSVzaXplb2YoZ3JvdXBzKV07CisgIH0KKworICAvLyBFeGlzdGllcnQgZGllIFJ1YnJpayBnZW5hdSBzbz8KKyAgaWYgKG1lbWJlcihncm91cHMsZyk+LTEpIHJldHVybiBnOworCisgIGcgPSByZWdyZXBsYWNlKGcsIltbXFxdXFwqKCk/XSIsIiIsMSk7CisgIC8vIGhhZXJ0ZXJlcyBLcml0ZXJpdW06IEFsbGUgQWJzY2huaXR0ZSBhbmdlZ2ViZW4KKyAgZXhwcj0iXiIraW1wbG9kZShleHBsb2RlKGcsIi4iKSwiW15cXC5dKlxcLiIpKyJbXlxcLl0qJCI7CisvLyAgd3JpdGUoIlJFR0VYUD0iK2V4cHIrIlxuIik7CisgIGdnPXJlZ2V4cChncm91cHMsZXhwcik7CisgIGlmIChzaXplb2YoZ2cpPT0xKSByZXR1cm4gZ2dbMF07CisKKyAgLy8gd2VpY2hlcmVzIEtyaXRlcml1bTogTmljaHQgYWxsZSBBYnNjaG5pdHRlIGFuZ2VnZWJlbgorICBleHByPSJeKC4qXFwuKSoiK2ltcGxvZGUoZXhwbG9kZShnLCIuIiksIi4qXFwuIikrIi4qJCI7CisvLyAgd3JpdGUoIlJFR0VYUD0iK2V4cHIrIlxuIik7CisgIGdnPXJlZ2V4cChncm91cHMsZXhwcik7CisKKyAgaWYgKCFzaXplb2YoZ2cpKSB7CisgICAgd3JpdGUoIkVpbmUgUnVicmlrICciK2crIicgZ2lidCBlcyBoaWVyIGxlaWRlciBuaWNodC5cbiIpOworICAgIHJldHVybiAwOworICB9CisKKyAgaWYgKHNpemVvZihnZyk9PTEpIHJldHVybiBnZ1swXTsKKyAgCisgIHdyaXRlKGJyZWFrX3N0cmluZygiRGllIFJ1YnJpayAiK2crIiBpc3QgbmljaHQgZWluZGV1dGlnLiBXYWhyc2NoZWlubGljaCAiCisgICAgICAgICJtZWluc3QgRHUgZWluZSBkZXIgZm9sZ2VuZGVuOiAiK2ltcGxvZGUoZ2csIiwgIikrIi5cbiIsNzgpKTsKKyAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBydWJyaWsoc3RyKQoreworICBtaXhlZCAqZ3J1cHBlbjsKKyAgbWl4ZWQgbmV3czsKKyAgaW50IGFueixpOworICAKKyAgaWYgKHN0cj09Ij8ifHxzdHI9PSItPyIpIHJldHVybgorICAgIHdyaXRlKCJTeW50YXg6IHJ1YnJpayA8cnVicmlrPlxuIgorICAgICAgICAgICIgIHdlY2hzZWx0IGRpZSBha3R1ZWxsZSBSdWJyaWsuIEVzIHdpcmQgZGllIE51bW1lciBkZXIgUnVicmlrLFxuIgorICAgICAgICAgICIgIGlociBOYW1lIG9kZXIgamVkZSBlaW5kZXV0aWdlIEFia3Vlcnp1bmcgYWt6ZXB0aWVydC5cbiIpLDE7CisKKyAgaWYgKCFzdHIgfHwgc3RyPT0wKSB7CisgICAgICBpZiAoIXBvaW50ZXJwKG5ld3M9TkVXU1NFUlZFUi0+R2V0Tm90ZXMoR1JPVVApKSl7CisgICAgICBHUk9VUD1ERUZBVUxUR1JPVVA7CisgICAgaWYgKCFwb2ludGVycChuZXdzPU5FV1NTRVJWRVItPkdldE5vdGVzKEdST1VQKSkpCisgICAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIlNlbHRzYW0sIGlyZ2VuZHdpZSBnZWh0IGhpZXIgZWluaWdlcyBzY2hpZWYuLi5cbiIpLDA7CisgICAgICB9CisgICAgcmV0dXJuIHdyaXRlKCJBa3R1ZWxsZSBSdWJyaWs6ICIrR1JPVVArIiAoIitzaXplb2YobmV3cykrIiBBcnRpa2VsKS5cbiIpLDE7CisgIH0KKyAgc3RyPUdldEdyb3VwTmFtZShzdHIpOworICBpZiAoIXN0cikgcmV0dXJuIDE7CisgIEdST1VQPXN0cjsKKyAgbmV3cz1ORVdTU0VSVkVSLT5HZXROb3RlcyhHUk9VUCk7CisgIHdyaXRlKGJyZWFrX3N0cmluZygiT2ssIER1IGhhc3QgZGllIFJ1YnJpayAiK0dST1VQKyIgbWl0ICIrc2l6ZW9mKG5ld3MpKworICAgICAgICAgICAgICAgICAgICAgIiBBcnRpa2VsIisoc2l6ZW9mKG5ld3MpPT0xPyIiOiJuIikrIiBhdWZnZXNjaGxhZ2VuLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgIDc4KSk7CisgIHJldHVybiAxOworfQorCitMaWVzQXJ0aWtlbChzdHIpIHsKKyAgc3RyaW5nIHMxOworICBpbnQgaTE7CisgIGlmICggIXN0ciApIHJldHVybiAwOworICBpZiAoc3NjYW5mKHN0ciwicnVicmlrICVzIixzMSkpCisgICAgcmV0dXJuIHJ1YnJpayhzMSk7CisgICBpZiAoc3NjYW5mKHN0ciwiJWQiLGkxKSkKKyAgICByZXR1cm4gbGllcyh0b19pbnQoaTEpKTsKKyAgaWYgKHNzY2FuZihzdHIsImFydGlrZWwgJXMiLHMxKSkKKyAgICByZXR1cm4gbGllcyhzMSk7Cit9CisKKworLyogVWViZXJwcnVlZmUsIG9iIGluIFJ1YnJpayB0b3RlIHRocmVhZHMgaWdub3JpZXJ0IHdlcmRlbi4gVG90IGJlZGV1dGV0LAorICAgZGFzcyBkZXIgbGV0enRlIGRhcmluIHVlYmVyZ2FuZ2VuZSBBcnRpa2VsIGJlcmVpdHMgZXhwaXJlZCBpc3QgVU5ECisgICBrZWluZSBBcnRpa2VsIGF1cyBkaWVzZW0gdGhyZWFkIG1laHIgdm9yaGFuZGVuIHNpbmQuCisgICBBQ0hUVU5HOiBFcyBrYW5uIHBhc3NpZXJlbiwgZGFzcyBkYXp3aXNjaGVuIG5vY2ggZWluIG5ldWVyIEFydGlrZWwKKyAgIGRhenVnZWtvbW1lbiBpc3QuCisgICBIaWVyIHdpcmQgYXVmIGV4cGlyZWQgZ2VwcnVlZnQgdW5kIGdnZiBWYXJpYWJsZSBkZWFkVElEIGdlc2V0enQuIFdpcmQgYmVpbQorICAgTGVzZW4gbWl0IG5uIGVpbiBBcnRpa2VsIG1pdCBkaWVzZXIgVElEIGdlZnVuZGVuIChwYXNzaWVydCBkaXJla3QgaGludGVyCisgICBQcnVlZnVuZyksIHdpcmQgZGVhZFRJRCB3aWVkZXIgYXVmIDAgZ2VzZXR6dC4gSXN0IGRlYWRUSUQgYmVpbSBVbXNjaGFsdGVuCisgICBhdWYgbmFlY2hzdGUgUnVicmlrICE9MCwgaXN0IGRlciB0aHJlYWQgdG90LgorKi8KKworc3RhdGljIGludCBDaGVja1RocmVhZHMoc3RyaW5nIHJ1YnJpayxpbnQgdGltZW91dCkgeworICBtaXhlZCB0aWRzOworICBpbnQgaTsKKworLy8gIGRlYWRUSUQ9MDsKKyAgdGlkcz1tX2luZGljZXMocmVhZF91bnRpbFtJR05PUkVHUk9VUF1bcnVicmlrXSk7CisgIGZvciAoaT1zaXplb2YodGlkcyktMTtpPj0wJiYhZGVhZFRJRDtpLS0pCisgICAgaWYgKHJlYWRfdW50aWxbSUdOT1JFR1JPVVBdW3J1YnJpa11bdGlkc1tpXV08dGltZW91dCkgZGVhZFRJRD10aWRzW2ldOworICByZXR1cm4gMTsKK30gIAorCitzdGF0aWMgaW50IHJ1YnJpa2VuKG1peGVkIGFyZykKK3sKKyAgbWl4ZWQgKmdydXBwZW4sICptZXNzYWdlczsKKyAgbWl4ZWQgbmV3czsKKyAgaW50IGFueixpLGxhc3R0aW1lLHRpbWVvdXQsZm91bmRvbmU7CisgIHN0cmluZyBzOworICAKKyAgaWYgKGFyZz09Ij8ifHxhcmc9PSItPyIpIHJldHVybgorICAgIHdyaXRlKCJTeW50YXg6IHJ1YnJpa2VuICAgICAgICBsaXN0ZXQgYWxsZSBSdWJyaWtlblxuIgorICAgICAgICAgICIgICAgICAgIHJ1YnJpa2VuIG5ldSAgICBudXIgUnVicmlrZW4gbWl0IHVuZ2VsZXNlbmVuIEFydGlrZWxuXG4iKSwxOworCisgIGdydXBwZW49TkVXU1NFUlZFUi0+R2V0R3JvdXBzKCk7CisgIG1hcChtX2luZGljZXMocmVhZF91bnRpbCktZ3J1cHBlbi1TWVNURU1HUk9VUFMsIydLaWxsR3JvdXApOyAvLyAnKTsKKyAgcz0iXG5FcyBnaWJ0IHp1ciBaZWl0ICI7CisgIGFuej1zaXplb2YoZ3J1cHBlbik7CisgIGlmIChhbno9PTApIHsKKyAgICB3cml0ZShzKyJrZWluZSBSdWJyaWtlbiAod2llIHNlbHRzYW0gLi4uKVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcys9YW56KyIgUnVicmlrIisoYW56PT0xID8gIiIgOiAiZW4iKSsiLiI7CisgIGlmIChhcmc9PSJuZXUiKSBzKz0iXG5EYXZvbiBlbnRoYWx0ZW4gbmV1ZSBBcnRpa2VsOlxuXG4iOworICBlbHNlIHMrPSJcbigqIG9kZXIgeDogZW50aGFlbHQgbmV1ZSBBcnRpa2VsLCB4IG9kZXIgLTogYWJiZXN0ZWxsdCwgIgorICAgICI+OiBha3R1ZWxsZSBSdWJyaWspXG5cbiI7CisgIGZvciAoaT0wO2k8YW56O2krKykgeworICAgIHRpbWVvdXQ9cmVhZF91bnRpbFtncnVwcGVuW2ldXTsKKyAgICAvKiBHZXROZXdzVGltZSBsaWVmZXJ0ZSBsZWlkZXIgbWFuY2htYWwgd2FzIGZhbHNjaGVzIDotKCAgKi8KKyAgICAvKiBqZXR6dCBob2ZmZW50bGljaCByaWNodGlnPyBXZW5uIG5pY2h0LCBkYXMgaWYgYXVza2xhbW1lcm4gKi8KKyAgICBpZiAoIGFyZyE9Im5ldSIgfHwgKGxhc3R0aW1lPU5FV1NTRVJWRVItPkdldE5ld3NUaW1lKGdydXBwZW5baV0pKSA+IHRpbWVvdXQpIHsKKyAgICAgIG1lc3NhZ2VzPU5FV1NTRVJWRVItPkdldE5vdGVzKGdydXBwZW5baV0pOworICAgICAgaWYgKCFtZXNzYWdlcyB8fCAhc2l6ZW9mKG1lc3NhZ2VzKSkgbGFzdHRpbWU9MDsKKyAgICAgIGVsc2UgbGFzdHRpbWU9bWVzc2FnZXNbc2l6ZW9mKG1lc3NhZ2VzKS0xXVtNX1RJTUVdOworICAgICAgZm91bmRvbmU9MTsKKyAgICB9CisgICAgaWYgKGFyZyE9Im5ldSIgfHwgKHRpbWVvdXQ+PTAgJiYgbGFzdHRpbWU+YWJzKHRpbWVvdXQpKSkKKyAgICAgIHMrPXNwcmludGYoIiVzJXMlM2RcLiAlLTM5LjM5czogIiwKKyAgICAgICAgICAgICAgICAgKChncnVwcGVuW2ldPT1HUk9VUCk/Ij4iOiIgIiksCisgICAgICAgICAgICAgICAgICgobGFzdHRpbWU+YWJzKHRpbWVvdXQpKSA/ICgodGltZW91dDwwKSA/ICJ4IiA6ICIqIikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKCh0aW1lb3V0PDApID8gIi0iIDogIiAiKSApLAorICAgICAgICAgICAgICAgICBpKzEsZ3J1cHBlbltpXSkrIAorICAgICAgICAgKGxhc3R0aW1lID8gc3ByaW50ZigiJTNkIEFydGlrZWwgKCVzKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKG1lc3NhZ2VzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKChzaXplb2YobWVzc2FnZXMpPT0xKSA/ICIuICAiIDogImVuLiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdGltZShsYXN0dGltZSlbNS4uMTJdK2N0aW1lKGxhc3R0aW1lKVs8Mi4uXSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAtIGxlZXIgLVxuIik7CisgIH0KKyAgaWYgKGFyZz09Im5ldSImJiFmb3VuZG9uZSkgcys9IktlaW5lIFJ1YnJpayBlbnRoYWVsdCBuZXVlIEFydGlrZWwuXG4iOworICB0aGlzX3BsYXllcigpLT5Nb3JlKHMpOworICByZXR1cm4gMTsKK30KKworI2RlZmluZSBNX1JFQURORVhUICAxCisjZGVmaW5lIE1fTElTVE5FVyAgIDIKKyNkZWZpbmUgTV9MSVNUTkVXR1IgMworI2RlZmluZSBNX1JFQURHUiAgICA0CisKK3N0YXRpYyBSZWFkTmV4dFVucmVhZChzdHIpCit7CisgIHN0cmluZyAqZ3JvdXBzLGdyb3VwOworICBtaXhlZCAqbWVzc2FnZXM7CisgIGludCBjdXJncixjdXJtc2csdGltZW91dCxzdGFydCxucmdyb3Vwcyxzb2csbW9kZTsKKworICBpZiAoc3RyPT0ibWFpbCIpIHJldHVybiBNYWlsKDApOyAvKiBORiBDb21wYXRpYmlsaXR5IFNwZWNpYWwgKi8KKworICBpZiAoc3RyPT0iPyJ8fHN0cj09Ii0/IikgcmV0dXJuCisgICAgd3JpdGUoIlN5bnRheDogbm4gICAgICAgICAgICAgbmFlY2hzdGVyIG5ldWVyIEFydGlrZWxcbiIKKyAgICAgICAgICAiICAgICAgICBubiA8cnVicmlrPiAgICBpbiBlbnRzcHIuIFJ1YnJpaywgd2VubiBkYSB3YXMgbmV1IGlzdFxuIgorICAgICAgICAgICIgICAgICAgIG5uIHJ1YnJpa2VuICAgIExpc3RlIGRlciBSdWJyaWtlbiBtaXQgbmV1ZW4gQXJ0aWtlbG5cbiIKKyAgICAgICAgICAiICAgICAgICBubiBsaXN0ZSAgICAgICBMaXN0ZSBkZXIgdW5nZWxlc2VuZW4gQXJ0aWtlbFxuIiksMTsKKworICBncm91cHM9TkVXU1NFUlZFUi0+R2V0R3JvdXBzKCk7CisgIGRlYWRUSUQ9MDsKKyAgbWFwKG1faW5kaWNlcyhyZWFkX3VudGlsKS1ncm91cHMtU1lTVEVNR1JPVVBTLCMnS2lsbEdyb3VwKTsgLy8nCisgIG5yZ3JvdXBzPXNpemVvZihncm91cHMpOworICBpZiAoc3RyICYmIHN0ciE9InJ1YnJpa2VuIiAmJiBzdHIhPSJsaXN0ZSIpeworICAgIGlmICghZ3JvdXA9R2V0R3JvdXBOYW1lKHN0cikpIHJldHVybiAxOworICB9CisgIGVsc2UKKyAgICBncm91cD0wOworICBpZiAoZ3JvdXAgJiYgKGN1cmdyPW1lbWJlcihncm91cHMsZ3JvdXApKzEpKSB7CisgICAgLS1jdXJncjsKKyAgICBpZiAoY3VyZ3I8MCB8fCBjdXJncj49c2l6ZW9mKGdyb3VwcykpIAorICAgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJOZWUuLi4gc28gZWluZSBSdWJyaWsgZ2lidHMgaGllciBuaWNodC5cbiIpLDA7CisgICAgR1JPVVA9Z3JvdXA7CisgICAgc3RhcnQ9Y3VyZ3IrMTsKKyAgICBtb2RlPU1fUkVBREdSOworICAgIHdyaXRlKCJSdWJyaWsgIisoY3VyZ3IrMSkrIjogIitHUk9VUCsiXG4iKTsKKyAgfSBlbHNlIHsKKyAgICBzd2l0Y2ggKHN0cikgeworICAgIGNhc2UgMDogbW9kZT1NX1JFQURORVhUOyBicmVhazsKKyAgICBjYXNlICJsaXN0ZSI6IG1vZGU9TV9MSVNUTkVXOyB3cml0ZSgiRHUgaGFzdCBub2NoIG5pY2h0IGdlbGVzZW46XG4iKTsgYnJlYWs7CisgICAgY2FzZSAicnVicmlrZW4iOiByZXR1cm4gcnVicmlrZW4oIm5ldSIpOworICAgIGRlZmF1bHQ6CisgICAgICBub3RpZnlfZmFpbCgiXAorRGllc2VuIFBhcmFtZXRlciB2ZXJzdGVoZSBpY2ggbmljaHQuIEVudHdlZGVyIGdhciBuaWNodHMsIFwibGlzdGVcIlxuXAorXCJydWJyaWtlblwiLCBvZGVyIE5hbWUgYnp3LiBOdW1tZXIgZWluZXIgUnVicmlrLlxuIik7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgY3VyZ3I9bWVtYmVyKGdyb3VwcyxHUk9VUCk7CisgICAgc3RhcnQ9Y3VyZ3IrbnJncm91cHM7CisgIH0KKyAgaWYgKCFwb2ludGVycChtZXNzYWdlcz1ORVdTU0VSVkVSLT5HZXROb3RlcyhHUk9VUCkpKXsKKyAgICBHUk9VUD1ERUZBVUxUR1JPVVA7CisgICAgaWYgKCFwb2ludGVycChtZXNzYWdlcz1ORVdTU0VSVkVSLT5HZXROb3RlcyhHUk9VUCkpKQorICAgIHJldHVybiBub3RpZnlfZmFpbCgiU2VsdHNhbSwgaXJnZW5kd2llIGdlaHQgaGllciBlaW5pZ2VzIHNjaGllZi4uLlxuIiksMDsKKyAgfQorICB0aW1lb3V0PXJlYWRfdW50aWxbR1JPVVBdOworICBjdXJtc2c9MDsKKyAgc29nPXNpemVvZihtZXNzYWdlcyk7CisgIHdoaWxlIChjdXJncjxzdGFydCkgeworICAgICsrY3VybXNnOworICAgIGlmIChjdXJtc2c+c29nKSB7CisgICAgICBpZiAoZGVhZFRJRCkKKyAgICAgICAgcmVhZF91bnRpbFtJR05PUkVHUk9VUF1bR1JPVVBdPQorICAgICAgICAgIG1fY29weV9kZWxldGUocmVhZF91bnRpbFtJR05PUkVHUk9VUF1bR1JPVVBdLGRlYWRUSUQpOworICAgICAgKytjdXJncjsKKyAgICAgIGRlYWRUSUQ9MDsKKyAgICAgIGlmIChtb2RlIT1NX1JFQURHUikgeworICAgICAgICBHUk9VUD1ncm91cHNbY3VyZ3IlbnJncm91cHNdOworICAgICAgICB0aW1lb3V0PXJlYWRfdW50aWxbR1JPVVBdOworICAgICAgICBpZiAoIXRpbWVvdXQpIHJlYWRfdW50aWxbR1JPVVBdPTE7ICAvLyBOaW1tIG5ldWUgR3J1cHBlbiBpbiBMaXN0ZSBhdWYKKyAgICAgICAgaWYgKHRpbWVvdXQ8MCB8fCB0aW1lb3V0Pj1ORVdTU0VSVkVSLT5HZXROZXdzVGltZShHUk9VUCkpIHsKKyAgICAgICAgICBzb2c9MDsgICAgLyogVWViZXJsaXN0dW5nOiBHcnVwcGUgaGF0IG5peCBuZXVlcyBvZGVyICovCisgICAgICAgICAgY3VybXNnPTE7IC8qIGlzdCB1bnN1YnNjcmliZWQgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICBtZXNzYWdlcz1ORVdTU0VSVkVSLT5HZXROb3RlcyhHUk9VUCk7CisgICAgICAgICAgY3VybXNnPTA7CisgICAgICAgICAgc29nPXNpemVvZihtZXNzYWdlcyk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKCh0aW1lb3V0Pj0wIHx8IG1vZGU9PU1fUkVBREdSKSAmJiBtZXNzYWdlc1tjdXJtc2ctMV1bTV9USU1FXSA+IGFicyh0aW1lb3V0KSkgeworICAgICAgICBpZiAocG9pbnRlcnAodGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfSUdOT1JFKSkgJiYKKyAgICAgICAgICAgIG1lbWJlcih0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoUF9JR05PUkUpLAorICAgICAgICAgICAgICAgICAgIGxvd2VyX2Nhc2UobWVzc2FnZXNbY3VybXNnLTFdW01fV1JJVEVSXSkrIi5uZXdzIikgIT0gLTEpIHsKKyAgICAgICAgICBwcmludGYoIlVlYmVyZ2VoZSBpZ25vcmllcnRlbiBBcnRpa2VsICVkIHZvbiAlcyBpbiBSdWJyaWsgJXMuXG4iLAorICAgICAgICAgICAgICAgICBjdXJtc2csbWVzc2FnZXNbY3VybXNnLTFdW01fV1JJVEVSXSxHUk9VUCk7CisgICAgICAgICAgcmVhZF91bnRpbFtHUk9VUF09bWVzc2FnZXNbY3VybXNnLTFdW01fVElNRV07CisgICAgICAgICAgaWYgKFRQKSBUUC0+U2V0UHJvcChQX1JFQURfTkVXUyxyZWFkX3VudGlsKTsKKyAgICAgICAgfSBlbHNlIGlmIAorICAgICAgICAgIChyZWFkX3VudGlsW0lHTk9SRUdST1VQXSYmCisgICAgICAgICAgIHJlYWRfdW50aWxbSUdOT1JFR1JPVVBdW0dST1VQXSYmCisgICAgICAgICAgIENoZWNrVGhyZWFkcyhHUk9VUCxtZXNzYWdlc1swXVtNX1RJTUVdKSYmIC8qIFRvdGUgdGhyZWFkcyB3ZWcgKi8KKyAgICAgICAgICAgcmVhZF91bnRpbFtJR05PUkVHUk9VUF1bR1JPVVBdW0dldFRJRChtZXNzYWdlc1tjdXJtc2ctMV0pXSkgeworICAgICAgICAgICAgcHJpbnRmKCJVZWJlcmdlaGUgQXJ0aWtlbCAlZCBhdXMgaWdub3JpZXJ0ZW0gVGhyZWFkLlxuIixjdXJtc2cpOworICAgICAgICAgICAgcmVhZF91bnRpbFtJR05PUkVHUk9VUF1bR1JPVVBdW0dldFRJRChtZXNzYWdlc1tjdXJtc2ctMV0pXT0KKyAgICAgICAgICAgICAgbWVzc2FnZXNbY3VybXNnLTFdW01fVElNRV07CisgICAgICAgICAgICBpZiAoZGVhZFRJRCYmZGVhZFRJRD09R2V0VElEKG1lc3NhZ2VzW2N1cm1zZy0xXSkpIGRlYWRUSUQ9MDsKKyAgICAgICAgICAgIHJlYWRfdW50aWxbR1JPVVBdPW1lc3NhZ2VzW2N1cm1zZy0xXVtNX1RJTUVdOworICAgICAgICAgICAgaWYgKFRQKSBUUC0+U2V0UHJvcChQX1JFQURfTkVXUyxyZWFkX3VudGlsKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB3cml0ZSgiXG5SdWJyaWsgIisoY3VyZ3IlbnJncm91cHMrMSkrIjogIitHUk9VUCsiLCBBcnRpa2VsOiAiK2N1cm1zZysiIHZvbiAiK3NvZysiXG4iKTsKKyAgICAgICAgICBpZiAobW9kZT09TV9MSVNUTkVXKSB7CisgICAgICAgICAgICB3cml0ZShzcHJpbnRmKCIgICUtNDVzIFslLTExc10gJXNcbiIsbWVzc2FnZXNbY3VybXNnLTFdW01fVElUTEVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc1tjdXJtc2ctMV1bTV9XUklURVJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkdGltZShtZXNzYWdlc1tjdXJtc2ctMV1bTV9USU1FXSlbNS4uMTZdKSk7CisgICAgICAgICAgfSBlbHNlIHsgLyogbW9kZSA9PSBNX1JFQURORVhUIHx8IG1vZGU9PU1fUkVBREdSICovCisgICAgICAgICAgICBpZiAodGltZW91dD49MCkgcmVhZF91bnRpbFtHUk9VUF09bWVzc2FnZXNbY3VybXNnLTFdW01fVElNRV07CisgICAgICAgICAgICBlbHNlIHJlYWRfdW50aWxbR1JPVVBdPS1tZXNzYWdlc1tjdXJtc2ctMV1bTV9USU1FXTsKKyAgICAgICAgICAgIGlmIChUUCkgVFAtPlNldFByb3AoUF9SRUFEX05FV1MscmVhZF91bnRpbCk7CisgICAgICAgICAgICByZXR1cm4gKGxpZXMoIiIrY3VybXNnKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgICAvKiBzb25zdCBtYWNoIGVpbmZhY2ggZ2Fybml4LiBTY2hsZWlmZSBsYWV1ZnQgd2VpdGVyLiAqLworICAgIH0KKyAgfQorICBzd2l0Y2gobW9kZSkgeworICAgIGNhc2UgTV9MSVNUTkVXOiAgcmV0dXJuIDE7CisgICAgY2FzZSBNX1JFQURORVhUOiB3cml0ZSgocmVhZF91bnRpbFtOTkFEV01TR118fCJOaXggTmV1ZXMgYXVmIGRlciBXZWx0LiIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICArIlxuIik7IGJyZWFrOworICAgIGNhc2UgTV9SRUFER1I6ICAgd3JpdGUoIk5peCBOZXVlcyBpbiBkaWVzZXIgUnVicmlrLlxuIik7IGJyZWFrOworICB9CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBTZXROTkFEV01TRyhzdHIpIHsKKyAgaWYgKHN0cj09Ij8ifHxzdHI9PSItPyIpIHJldHVybgorICAgIHdyaXRlKCJTeW50YXg6IHplaXR1bmdzbWVsZHVuZyA8bmV1ZSBNZWxkdW5nPiAgICBzZXR6dCBNZWxkdW5nXG4iCisgICAgICAgICAgIiAgICAgICAgemVpdHVuZ3NtZWxkdW5nICAgICAgICAgICAgICAgICAgIGxvZXNjaHQgTWVsZHVuZ1xuIiksMTsKKyAgaWYgKCFyZWFkX3VudGlsW05OQURXTVNHXSkgeworICAgIHdyaXRlKCJEdSBoYXN0IHp1ciBaZWl0IGtlaW5lIGVpZ2VuZSBOTkFEVy1NZWxkdW5nIGRlZmluaWVydC5cbiIpOworICAgIGlmICghc3RyKSByZXR1cm4gMTsKKyAgfQorICBlbHNlIHdyaXRlKCJEZWluZSBhbHRlIE5OQURXLU1lbGR1bmcgd2FyOlxuIityZWFkX3VudGlsW05OQURXTVNHXSsiXG4iKTsKKyAgaWYgKCFzdHIpIHsKKyAgICByZWFkX3VudGlsPW1fY29weV9kZWxldGUocmVhZF91bnRpbCxOTkFEV01TRyk7CisgICAgd3JpdGUoIk1lbGR1bmcgaXN0IGdlbG9lc2NodCwgZXMgZ2lsdCB3aWVkZXIgZGllIFN0YW5kYXJkbWVsZHVuZy5cbiIpOworICB9IGVsc2UgeworICAgIHJlYWRfdW50aWxbTk5BRFdNU0ddPXRoaXNfcGxheWVyKCktPl91bnBhcnNlZF9hcmdzKCk7CisgICAgd3JpdGUoIkRlaW5lIG5ldWUgTWVsZHVuZyBsYXV0ZXQgamV0enQ6XG4iK3JlYWRfdW50aWxbTk5BRFdNU0ddKyJcbiIpOworICB9CisgIGlmIChUUCkgVFAtPlNldFByb3AoUF9SRUFEX05FV1MscmVhZF91bnRpbCk7CisgIHJldHVybiAxOworfSAgICAKKwordmFyYXJncyBpbnQgSW50ZXJwcmV0VGltZShtaXhlZCBhLGludCBmbGFnKSB7CisgIC8vIHN0cmluZyBvZGVyIHN0cmluZyAqCisgIC8vIGFremVwdGllcnQgZm9sZ2VuZGUgRm9ybWF0ZToKKyAgLy8gICBkZC5tbS5qaiAgICAgKFJ1ZWNrZ2FiZTogMDowMCBkZXMgZW50c3ByZWNoZW5kZW4gVGFnZXMpCisgIC8vICAgdm9yIFs8YW56PiBkfHRhZ2VuXSBbPGFuej4gaHxzdHVuZGVuXSBbPGFuej4gbXxtaW51dGVuXQorICAvLyBmbGFnPTE6ICJpbmtsdXNpdmUiOiBiZWkgZGQubW0uamotRm9ybWF0IDIzOjU5OjU5IHN0YXR0IDA6MDAgVWhyCisKKyAgaW50IGksaixrLHQsbnJhcmdzOworICBzdHJpbmcgczsKKyAgaWYgKHN0cmluZ3AoYSkpIGE9ZXhwbG9kZShhLCIgIik7CisKKy8vICBwcmludGYoIiVPXG4iLGEpOworCisgIGlmICgobnJhcmdzPXNzY2FuZihhWzBdLCIlZC4lZC4lZCIsaSxqLGspKT09MyB8fCAKKyAgICAgIChucmFyZ3M9c3NjYW5mKGFbMF0sIiVkLiVkLiIsaSxqKSk9PTIpIHsKKyAgICAvLyBEYXR1bSAtPiBaZWl0OiBGdW5rdGlvbmllcnQgaW0gWmVpdHJhdW0gMTk3MyAtIGNhLiAyMDkwCisgICAgLy8gICAgICAgICAgICAgICAgaW4gWmVpdHpvbmVuIG1pdCBnYW56ZW4gU3R1bmRlbiBnZ3VlIFJlY2huZXJ1aHIuCisgICAgaWYgKG5yYXJncz09MikgCisgICAgICBrPTcwK3RpbWUoKS8zMTUzNjAwMDsKKyAgICBpZiAoazw3MCkgays9MTAwOworICAgIGlmIChrPjE5NzApIGstPTE5MDA7CisgICAgaWYgKGs8NzB8fGs+MTUwKSByZXR1cm4KKyAgICAgIHdyaXRlKCJVbnp1bGFlc3NpZ2VzIEphaHIgKGVybGF1YnQ6IDcwLWhldXRlKS5cbiIpLDA7CisgICAgdD0oay03MCkqMzE1MzYwMDA7CisKKyAgICBpZiAoaTwxfHxpPjMxKSByZXR1cm4gd3JpdGUoIlVuenVsYWVzc2lnZXIgVGFnIChlcmxhdWJ0OiAxLTMxKS5cbiIpLDA7CisgICAgaWYgKGo8MXx8aj4xMikgcmV0dXJuIHdyaXRlKCJVbnp1bGFlc3NpZ2VyIE1vbmF0IChlcmxhdWJ0OiAxLTEyKS5cbiIpLDA7CisvLyAgICBwcmludGYoIiVkLiVkLiVkXG4iLGksaixrKTsKKyAgICBzPWN0aW1lKHQpOworICAgIGlmICgoaj4yKSAmJiAhKGslNCkpIHQrPTg2NDAwOyAgICAvLyBTY2hhbHRqYWhya29ycmVrdHVyIGZ1ZXIgTW9uYXRlPj0zCisgICAgdCs9KHsgICAgICAgIDAsICAyNjc4NDAwLCAgNTA5NzYwMCwgIDc3NzYwMDAsCisgICAgICAgICAgMTAzNjgwMDAsIDEzMDQ2NDAwLCAxNTYzODQwMCwgMTgzMTY4MDAsCisgICAgICAgICAgMjA5OTUyMDAsIDIzNTg3MjAwLCAyNjI2NTYwMCwgMjg4NTc2MDB9KVtqLTFdOworICAgIHQrPTg2NDAwKihpLTEpOworICAgIHQrPTg2NDAwKigzMi10b19pbnQoc1s4Li45XSkpOyAgLy8gU2NoYWx0amFocmtvcnJla3R1cgorICAgIHQtPTM2MDAqdG9faW50KHNbMTEuLjEyXSk7ICAgICAgLy8gWmVpdHpvbmVua29ycmVrdHVyCisgICAgdC09MzYwMCp0b19pbnQoY3RpbWUodClbMTEuLjEyXSk7ICAgICAgLy8gU29tbWVyemVpdGtvcnJla3R1cgorLy8gICAgd3JpdGUoIktvbnRyb2xsZTogIitkdGltZSh0KSsiXG4iKTsKKyAgICBpZiAobnJhcmdzPT0yICYmIHQ+dGltZSgpKSB0LT0zMTUzNjAwMDsKKyAgICByZXR1cm4gKGZsYWc/dCs4NjM5OTp0KTsKKyAgfQorCisgIHQ9MDsKKyAgaWYgKGFbMF09PSJ2b3IiKSBmb3IgKGk9c2l6ZW9mKGEpLTE7aT4wO2ktLSkgeworICAgIHN3aXRjaCAoYVtpXSkgeworICAgIGNhc2UgIm0iOiAKKyAgICBjYXNlICJtaW51dGVuIjogCisgICAgY2FzZSAibWluIjogCisgICAgY2FzZSAibWludXRlIjoKKyAgICAgIHQrPTYwKnRvX2ludChhW2ktMV0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSAiaCI6IAorICAgIGNhc2UgInN0dW5kZSI6IAorICAgIGNhc2UgInN0dW5kZW4iOiAKKyAgICBjYXNlICJzIjoKKyAgICAgIHQrPTM2MDAqdG9faW50KGFbaS0xXSk7CisgICAgICBicmVhazsKKyAgICBjYXNlICJkIjogCisgICAgY2FzZSAidGFnIjogCisgICAgY2FzZSAidGFnZSI6IAorICAgIGNhc2UgInQiOgorICAgICAgdCs9ODY0MDAqdG9faW50KGFbaS0xXSk7CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OiAKKyAgICAgIGlmICghdG9faW50KGFbaV0pKQorICAgICAgICB3cml0ZSgiQXJndW1lbnRmZWhsZXI6IEthbm4gbmljaHRzIG1pdCAnIithW2ldKyInIGFuZmFuZ2VuLlxuIik7CisgICAgfQorICAgIHJldHVybiB0aW1lKCktdDsKKyAgfQorICBlbHNlIHJldHVybiB3cml0ZSgiQXJndW1lbnRmZWhsZXIuXG4iKSwwOworfQorCitzdGF0aWMgQ2F0Y2h1cChzdHJpbmcgc3RyKQoreworICBpbnQgd2VsY2hlLHplaXQsaTsKKyAgc3RyaW5nIGdyOworICBtaXhlZCBncm91cHMsbmV3cyxhcmdzOworCisgIGlmICghcG9pbnRlcnAoTkVXU1NFUlZFUi0+R2V0Tm90ZXMoR1JPVVApKSkKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIlNlbHRzYW0sIGRpZSBSdWJyaWsgJyIrR1JPVVArCisgICAgICAgICInIGdpYnQgZXMgbmljaHQgbWVoci4uLlxuIiksIDA7CisKKyAgc3RyPXRoaXNfcGxheWVyKCktPl91bnBhcnNlZF9hcmdzKCk7ICAgLy8gd2cuIERhdHVtCisgIGlmIChzdHIpIHN0cj1sb3dlcl9jYXNlKHN0cik7CisgIGVsc2Ugc3RyPUdST1VQOyAvLyBkZWZhdWx0OiBha3R1ZWxsZSBSdWJyaWsga29tcGxldHQuCisKKyAgaWYgKHN0cj09Ij8ifHwgc3RyPT0iLT8iKSByZXR1cm4gQ2F0Y2h1cFN5bnRheCgpOworCisgIC8vIHVlYmVyZ2VoZSBBbnR3b3J0ZW4gKFRocmVhZCBpZ25vcmllcmVuKQorICBpZiAoc3RyJiYoc3RyWzAuLjZdPT0iYW50d29ydCJ8fHN0cj09InRocmVhZCIpKSB7CisgICAgaWYgKCFwb2ludGVycChsYXN0dGl0bGUpKSByZXR1cm4gCisgICAgICB3cml0ZSgiRHUgaGFzdCBiaXNoZXIgbm9jaCBrZWluZW4gQXJ0aWtlbCBnZWxlc2VuLCBkYW1pdCBrYW5uIGljaCBuaWNodCB3aXNzZW4sXG53ZWxjaGVuIFRocmVhZCBkdSB1ZWJlcmdlaGVuIHdpbGxzdC5cbiIpLDE7CisgICAgaWYgKCFyZWFkX3VudGlsW0lHTk9SRUdST1VQXSkgcmVhZF91bnRpbFtJR05PUkVHUk9VUF09KFtdKTsKKyAgICBpZiAoIXJlYWRfdW50aWxbSUdOT1JFR1JPVVBdW0dST1VQXSkgcmVhZF91bnRpbFtJR05PUkVHUk9VUF1bR1JPVVBdPShbXSk7CisgICAgaWYgKHJlYWRfdW50aWxbSUdOT1JFR1JPVVBdW0dST1VQXVtsYXN0dGl0bGVbM11dKSB7CisgICAgICByZWFkX3VudGlsW0lHTk9SRUdST1VQXVtHUk9VUF09bV9jb3B5X2RlbGV0ZShyZWFkX3VudGlsW0lHTk9SRUdST1VQXVtHUk9VUF0sbGFzdHRpdGxlWzNdKTsKKyAgICAgIHdyaXRlKCJEaWVzZXIgVGhyZWFkIHdpcmQgamV0enQgbmljaHQgbWVociB1ZWJlcmdhbmdlbi5cbiIpOworICAgIH0gZWxzZSB7CisgICAgICByZWFkX3VudGlsW0lHTk9SRUdST1VQXVtHUk9VUF1bbGFzdHRpdGxlWzNdXT1sYXN0dGl0bGVbMl07CisgICAgICB3cml0ZSgiRGllc2VyIFRocmVhZCB3aXJkIGFiIHNvZm9ydCB1ZWJlcmdhbmdlbi5cbkZhbGxzIGRhcyBlaW4gSXJydHVtIHdhciwgd2llZGVyaG9sZSBkZW4gQmVmZWhsIGF1Z2VuYmxpY2tsaWNoLlxuIik7CisgICAgfQorICAgIGlmIChUUCkgVFAtPlNldFByb3AoUF9SRUFEX05FV1MscmVhZF91bnRpbCk7CisgICAgcmV0dXJuIDE7CisgIH0gICAgCisKKyAgZ3JvdXBzPU5FV1NTRVJWRVItPkdldEdyb3VwcygpOworCisgIGFyZ3M9ZXhwbG9kZShzdHIsIiAiKTsKKworICAvLyBVZWJlcmdlaGUgYWxsZXMKKworICBpZiAoYXJnc1swXT09ImFsbGUiIHx8IGFyZ3NbMF09PSJhbGxlcyIgfHwgYXJnc1swXT09ImFsbCIpIHsKKyAgICBpZiAoc2l6ZW9mKGFyZ3MpPD0xKSB6ZWl0PXRpbWUoKS0xOworICAgIGVsc2UgaWYgKGFyZ3NbMV0hPSJiaXMiKSByZXR1cm4gQ2F0Y2h1cFN5bnRheCgpOworICAgIGVsc2UgaWYgKHNpemVvZihhcmdzKTwzKSByZXR1cm4gQ2F0Y2h1cFN5bnRheCgpOworCisgICAgZWxzZSB6ZWl0PUludGVycHJldFRpbWUoYXJnc1syLi5dLDEpOworICAgIGlmICh6ZWl0PnRpbWUoKSkgemVpdD10aW1lKCktMTsKKyAgICB3cml0ZSgiVWViZXJnZWhlIGFsbGUgUnVicmlrZW4gYmlzICIrZHRpbWUoemVpdCkrIi5cbiIpOworICAgIGZvciAod2VsY2hlPTA7d2VsY2hlPHNpemVvZihncm91cHMpOysrd2VsY2hlKSB7CisgICAgICBncj1ncm91cHNbd2VsY2hlXTsKKy8vICAgICAgemVpdD1ORVdTU0VSVkVSLT5HZXROZXdzVGltZShncik7CisgICAgICBpZiAoYWJzKHJlYWRfdW50aWxbZ3JdKTx6ZWl0KSAKKyAgICAgICAgcmVhZF91bnRpbFtncl09KHJlYWRfdW50aWxbZ3JdPj0wKT96ZWl0Oi16ZWl0OworICAgICAgaWYgKFRQKSBUUC0+U2V0UHJvcChQX1JFQURfTkVXUyxyZWFkX3VudGlsKTsKKyAgICB9CisgICAgcmV0dXJuIDE7CisgIH0KKworICAvLyBBbnphaGwgQXJ0aWtlbAorICAKKyAgaWYgKHNpemVvZihhcmdzKT49MiAmJiBhcmdzWzFdPT0iYXJ0aWtlbCIpIHsKKyAgICBpZiAoIXRvX2ludChhcmdzWzBdKSkgcmV0dXJuIENhdGNodXBTeW50YXgoKTsKKyAgICBuZXdzPU5FV1NTRVJWRVItPkdldE5vdGVzKEdST1VQKTsKKyAgICBmb3IgKGk9c2l6ZW9mKG5ld3MpLTE7aT49MCYmbmV3c1tpXVtNX1RJTUVdPnJlYWRfdW50aWxbR1JPVVBdO2ktLSk7CisgICAgd2VsY2hlPWkrdG9faW50KGFyZ3NbMF0pOworICAgIGlmICh3ZWxjaGU+PXNpemVvZihuZXdzKSkgd2VsY2hlPXNpemVvZihuZXdzKS0xOworICAgIHdyaXRlKCJVZWJlcmdlaGUgZGllIG5hZWNoc3RlbiAiKyh3ZWxjaGUtaSkrIiBBcnRpa2VsIGluIFJ1YnJpayAiKworICAgICAgICBHUk9VUCsiXG4uIik7CisgICAgaWYgKHdlbGNoZT49MCkgeworICAgICAgemVpdD1uZXdzW3dlbGNoZV1bTV9USU1FXTsKKyAgICAgIHJlYWRfdW50aWxbR1JPVVBdPShyZWFkX3VudGlsW0dST1VQXT49MCk/emVpdDotemVpdDsKKyAgICAgIGlmIChUUCkgVFAtPlNldFByb3AoUF9SRUFEX05FV1MscmVhZF91bnRpbCk7CisgICAgfQorICAgIHJldHVybiAxOworICB9CisKKyAgLy8gZWluemVsbmUgUnVicmlrLgorCisgIGlmICghKGdyPUdldEdyb3VwTmFtZShhcmdzWzBdKSkpIHJldHVybiAxOworICBuZXdzPU5FV1NTRVJWRVItPkdldE5vdGVzKGdyKTsKKyAgaWYgKCFzaXplb2YobmV3cykpIHsKKyAgICB3cml0ZSgiUnVicmlrICIrZ3IrIiBpc3QgbGVlci5cbiIpOworICAgIHJldHVybiAxOworICB9CisvLyAgemVpdD1uZXdzW3NpemVvZihuZXdzKS0xXVtNX1RJTUVdOworICBpZiAoc2l6ZW9mKGFyZ3MpPD0xKQorICAgIHplaXQ9dGltZSgpOworICBlbHNlCisgICAgaWYgKGFyZ3NbMV0hPSJiaXMiKSByZXR1cm4gQ2F0Y2h1cFN5bnRheCgpOworICBlbHNlIAorICAgIHplaXQ9SW50ZXJwcmV0VGltZShhcmdzWzIuLl0sMSk7CisgIGlmICh6ZWl0PnRpbWUoKSkgemVpdD10aW1lKCk7CisgIHJlYWRfdW50aWxbZ3JdPXplaXQ7CisgIGlmIChUUCkgVFAtPlNldFByb3AoUF9SRUFEX05FV1MscmVhZF91bnRpbCk7CisgIHdyaXRlKCJVZWJlcmdlaGUgIitncisiIGJpcyAiK2R0aW1lKHplaXQpKyIsXG5sZXR6dGVyIEFydGlrZWwgd2FyIHZvbSAiKworICAgICAgZHRpbWUoTkVXU1NFUlZFUi0+R2V0TmV3c1RpbWUoZ3IpKSsiXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIElnbm9yZShzdHIpIHsKKyAgaWYgKHN0cj09InRocmVhZCJ8fHN0cj09ImFudHdvcnRlbiIpIHJldHVybiBDYXRjaHVwKHN0cik7CisgIHJldHVybiAwOworfQorCitzdGF0aWMgQ2F0Y2h1cFN5bnRheCgpIHsKKyAgd3JpdGUoIlN5bnRheCBkZXMgQmVmZWhscyB1ZWJlcmdlaGUgKG9kZXIgY2F0Y2h1cCk6XG4iCisgICAgICAgICIgIHVlYmVyZ2VoZSBbcnVicmlrXSAgICAgICAgICAgICAgKGRlZmF1bHQ6IGFrdHVlbGxlIFJ1YnJpaylcbiIKKyAgICAgICAgIiAgdWViZXJnZWhlIGFsbGVzICAgICAgICAgICAgICAgICAoaW4gYWxsZW4gUnVicmlrZW4pXG4iCisgICAgICAgICIgIHVlYmVyZ2VoZSA8YW56PiBhcnRpa2VsICAgICAgICAgKGluIGFrdC4gUnVicmlrKVxuIgorICAgICAgICAiICB1ZWJlcmdlaGUgW3J1YnJpa118YWxsZXMgYmlzIDx0YWc+Ljxtb25hdD4uWzxqYWhyPl1cbiIKKyAgICAgICAgIiAgdWViZXJnZWhlIFtydWJyaWtdfGFsbGVzIGJpcyB2b3IgPHplaXQ+ICAgICAgICB3b2JlaVxuIgorICAgICAgICAiICAgICAgPHplaXQ+ID0gWzxuPiBkfHRhZ2VdIFs8bj4gaHxzdHVuZGVuXSBbPG4+IG18bWlufG1pbnV0ZW5dXG4iCisgICAgICAgICIgIHVlYmVyZ2VoZSB0aHJlYWR8YW50d29ydGVuICAgICAgKGVudHNwci4gJ2lnbm9yaWVyZSB0aHJlYWQnKVxuIik7CisKKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCBVbmNhdGNodXBTeW50YXgoKQoreworICBub3RpZnlfZmFpbCgKKyAgICAiU3ludGF4OiB3aWVkZXJob2xlIDxhbno+IFthcnRpa2VsXVxuIgorICAgICIgICAgICAgIHdpZWRlcmhvbGUgW2FiIHZvcl0gWzxhbno+IG18bWludXRlW25dXSBbPGFuej4gaHxzdHVuZGVbbl1dIFs8YW56PiBkfHRhZ1tlXV1cbiIKKyAgICAiICAgICAgICB3aWVkZXJob2xlIGFiIHRhZy5tb25hdFsuamFocl1cbiIKKyAgICAiICAgICAgICB3aWVkZXJob2xlIGFsbGVzXG4iCisgICAgIkRlciB3aWVkZXJob2xlLSBvZGVyIHVuY2F0Y2h1cC1CZWZlaGwgYmV6aWVodCBzaWNoIGltbWVyIGF1ZiBkaWUgYWt0dWVsbGVcbiIKKyAgICAiUnVicmlrIHVuZCBtYXJraWVydCBkaWUgYW5nZWdlYmVuZW4gQXJ0aWtlbCB3aWVkZXIgYWxzIHVuZ2VsZXNlbi5cbiIKKyAgICAiWmVpdGVuICgyLiBTeW50YXgpIHNpbmQgcnVlY2t3YWVydHMgYWIgYWt0dWVsbGVyIFVocnplaXQgZ2VyZWNobmV0LlxuIiksMDsKKyAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIFVuY2F0Y2h1cChzdHJpbmcgc3RyKQoreworICBtaXhlZCBhcmdzOworICBpbnQgaSx6ZWl0OworICBpbnQgbW9kZTsgLy8gMCA9IG5peCwgMT1BbnphaGwgQXJ0aWtlbCwgMj1aZWl0LCAzPWFsbGVzCisKKyAgc3RyPXRoaXNfcGxheWVyKCktPl91bnBhcnNlZF9hcmdzKCk7ICAgLy8gd2cuIERhdHVtCisgIGlmICggIVRQIHx8ICFzdHIgfHwgIXN0cmluZ3Aoc3RyKSB8fCBzdHI9PSI/IiB8fCBzdHI9PSItPyIgKQorICAgIHJldHVybiBVbmNhdGNodXBTeW50YXgoKTsKKworICBpZiAoIXBvaW50ZXJwKE5FV1NTRVJWRVItPkdldE5vdGVzKEdST1VQKSkpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJTZWx0c2FtLCBkaWUgUnVicmlrICciK0dST1VQKworICAgICAgICAiJyBnaWJ0IGVzIG5pY2h0IG1laHIuLi5cbiIpLCAwOworCisgIGFyZ3M9KHsiIn0pK2V4cGxvZGUobG93ZXJfY2FzZShzdHIpLCIgIik7CisgIGlmIChhcmdzWzFdPT0iYWIiKSB7CisgICAgbW9kZT0yOworICAgIGlmIChzaXplb2YoYXJncyk8MykKKyAgICAgIHJldHVybiBVbmNhdGNodXBTeW50YXgoKTsKKyAgICB6ZWl0PUludGVycHJldFRpbWUoYXJnc1syLi5dKTsKKyAgfSBlbHNlIHsKKyAgICB6ZWl0PXRpbWUoKTsKKyAgICBmb3IgKGk9c2l6ZW9mKGFyZ3MpLTE7aT4wO2ktLSkgeworICAgICAgc3dpdGNoKGFyZ3NbaV0peworICAgICAgY2FzZSAiYWxsZXMiOgorICAgICAgY2FzZSAiYWxsZSI6CisgICAgICBjYXNlICJhbGwiOgorICAgICAgICBpZiAobW9kZSYmbW9kZSE9MykgcmV0dXJuCisgICAgICAgICAgbm90aWZ5X2ZhaWwoIkJpdHRlIG51ciBaZWl0IE9ERVIgYWxsZXMgT0RFUiBBbnphaGwgYW5nZWJlbiFcbiIpLDA7CisgICAgICAgIG1vZGU9MzsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICJtaW51dGVuIjoKKyAgICAgIGNhc2UgIm1pbnV0ZSI6CisgICAgICBjYXNlICJtIjoKKyAgICAgIGNhc2UgInN0dW5kZW4iOgorICAgICAgY2FzZSAic3R1bmRlIjoKKyAgICAgIGNhc2UgImgiOgorICAgICAgY2FzZSAidGFnZSI6CisgICAgICBjYXNlICJ0YWciOgorICAgICAgY2FzZSAiZCI6CisgICAgICAgIGlmIChtb2RlJiZtb2RlIT0yKSByZXR1cm4KKyAgICAgICAgICBub3RpZnlfZmFpbCgiQml0dGUgbnVyIFplaXQvRGF0dW0gT0RFUiBhbGxlcyBPREVSICIKKyAgICAgICAgICAgICAgIkFuemFobCBhbmdlYmVuIVxuIiksMDsKKyAgICAgICAgbW9kZT0yOworICAgICAgICB6ZWl0LT0oKChhcmdzW2ldWzBdPT0nbScpID8gNjAgOgorICAgICAgICAgICAgICAgICgoYXJnc1tpXVswXT09J3MnIHx8IGFyZ3NbaV1bMF09PSdoJykgPyAzNjAwIDogODY0MDApKQorICAgICAgICAgICAgICAgKnRvX2ludChhcmdzW2ktMV0pKTsKKyAgICAgICAgaS0tOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgImFydGlrZWwiOgorICAgICAgICBpZiAobW9kZSYmbW9kZSE9MSkgcmV0dXJuIAorICAgICAgICAgIG5vdGlmeV9mYWlsKCJCaXR0ZSBudXIgWmVpdC9EYXR1bSBPREVSIGFsbGVzIE9ERVIgIgorICAgICAgICAgICAgICAiQW56YWhsIGFuZ2ViZW4hXG4iKSwwOworICAgICAgICBtb2RlPTE7CisgICAgICAgIHplaXQ9dG9faW50KGFyZ3NbaS0xXSk7CisgICAgICAgIGktLTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlICJhYiI6CisgICAgICAgIHJldHVybiAKKyAgICAgICAgICBub3RpZnlfZmFpbCgiQml0dGUgbnVyIFplaXQvRGF0dW0gT0RFUiBhbGxlcyBPREVSICIKKyAgICAgICAgICAgICAgIkFuemFobCBhbmdlYmVuIVxuIiksMDsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICghdG9faW50KGFyZ3NbaV0pKSAKKyAgICAgICAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIlVuYmVrYW5udGVzIEFyZ3VtZW50ICciK2FyZ3NbaV0rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICInISBBa3Rpb24gYWJnZWJyb2NoZW4uXG4iKSwwOworICAgICAgICBpZiAobW9kZSYmbW9kZSE9MSkgcmV0dXJuIAorICAgICAgICAgIG5vdGlmeV9mYWlsKCJCaXR0ZSBudXIgWmVpdC9EYXR1bSBPREVSIGFsbGVzIE9ERVIgIgorICAgICAgICAgICAgICAiQW56YWhsIGFuZ2ViZW4hXG4iKSwwOworICAgICAgICBtb2RlPTE7CisgICAgICAgIHplaXQ9dG9faW50KGFyZ3NbaV0pOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHN3aXRjaChtb2RlKXsKKyAgY2FzZSAwOgorICAgIHJldHVybiBub3RpZnlfZmFpbCgiR2liIGJpdHRlIGlyZ2VuZGVpbmUgRWluaGVpdCBhbiAiCisgICAgICAgICIoSGlsZmUgbWl0IHdpZWRlcmhvbGUgLT8pIVxuIik7CisgIGNhc2UgMjoKKyAgICByZWFkX3VudGlsW0dST1VQXT0ocmVhZF91bnRpbFtHUk9VUF0+PTApP3plaXQ6LXplaXQ7CisgICAgd3JpdGUoYnJlYWtfc3RyaW5nKCJNYXJraWVyZSBhbGxlIEFydGlrZWwgaW4gUnVicmlrICIrR1JPVVArCisgICAgICAgICAgIiBzZWl0ICIrZHRpbWUoemVpdCkrIiBhbHMgdW5nZWxlc2VuLlxuIiw3OCkpOworICAgIGJyZWFrOworICBjYXNlIDM6CisgICAgcmVhZF91bnRpbFtHUk9VUF09KHJlYWRfdW50aWxbR1JPVVBdPj0wPzE6LTEpOworICAgIHdyaXRlKCJNYXJraWVyZSBkaWUga29tcGxldHRlIFJ1YnJpayAiK0dST1VQKyIgYWxzIHVuZ2VsZXNlbi5cbiIpOworICAgIGJyZWFrOworICBjYXNlIDE6CisgICAgd3JpdGUoYnJlYWtfc3RyaW5nKCJNYXJraWVyZSBkaWUgbGV0enRlbiAiK3plaXQrCisgICAgICAgICAgIiBnZWxlc2VuZW4gQXJ0aWtlbCBpbiBSdWJyaWsgIitHUk9VUCsiIGFscyB1bmdlbGVzZW4uXG4iLDc4KSk7CisgICAgeyBpbnQgaDsgbWl4ZWQgbm90ZXM7CisgICAgICBub3Rlcz1ORVdTU0VSVkVSLT5HZXROb3RlcyhHUk9VUCk7CisgICAgICBoPXNpemVvZihub3RlcyktMTsKKyAgICAgIHdoaWxlICggKGg+PTApICYmIChhYnMocmVhZF91bnRpbFtHUk9VUF0pIDwgbm90ZXNbaF1bTV9USU1FXSkgKSB7CisgICAgICAgIGgtLTsKKyAgICAgIH0KKyAgICAgIGlmIChoPT0tMXx8aDx6ZWl0KQorICAgICAgICByZWFkX3VudGlsW0dST1VQXT0KKyAgICAgICAgICAocmVhZF91bnRpbFtHUk9VUF0+PTApPzE6LTE7CisgICAgICBlbHNlCisgICAgICAgIHJlYWRfdW50aWxbR1JPVVBdPSgKKyAgICAgICAgICAocmVhZF91bnRpbFtHUk9VUF0+PTApP25vdGVzW2gtemVpdF1bTV9USU1FXQorICAgICAgICAgICAgOi1ub3Rlc1toLXplaXRdW01fVElNRV0pOworICAgIH0KKyAgfQorICB3cml0ZSgiT2suIER1IGthbm5zdCBkaWUgYWxzIHVuZ2VsZXNlbiBtYXJraWVydGVuIEFydGlrZWwgIgorICAgICAgIm1pdCBubiBub2NobWFsIGxlc2VuLlxuIik7CisgIAorICBpZiAoVFApIFRQLT5TZXRQcm9wKFBfUkVBRF9ORVdTLHJlYWRfdW50aWwpOworICByZXR1cm4gMTsKK30KKworCitRdWVyeVJlYWQoKSB7IAorICByZXR1cm4gcmVhZF91bnRpbDsgCit9CisKK3N0YXRpYyBDYXRjaE5ld3NFcnJvcihpbnQgZXJyLHN0cmluZyB0ZXh0NG1pbnVzMykgeworICBzd2l0Y2ggKGVycikgeworICAgIGNhc2UgIDE6IHJldHVybiAxOworICAgIGNhc2UgLTE6IHdyaXRlKCJEdSBkYXJmc3QgaW4gZGllc2VyIFJ1YnJpayBuaWNodCBzY2hyZWliZW4hXG4iKTsgcmV0dXJuIDA7CisgICAgY2FzZSAtMjogd3JpdGUoIkRpZSBSdWJyaWsgZ2lidCBlcyBuaWNodCBtZWhyLCBzZWhyIHNlbHRzYW0uLi5cbiIpOyByZXR1cm4gMDsKKyAgICBjYXNlIC0zOiB3cml0ZSh0ZXh0NG1pbnVzMysiXG4iKTsgcmV0dXJuIDA7CisgICAgZGVmYXVsdDogd3JpdGUoIkludGVybmVyIEZlaGxlciAiK2VycisiLCBFcnptYWdpZXIgdmVyc3RhZW5kaWdlbiFcbiIpOyByZXR1cm4gMDsKKyAgfQorfQorCitzdGF0aWMgdmFyYXJncyBzY2hyZWliKHN0cixwcmV0ZXh0LGNhbGxlZF9ieV9pdHNlbGYsc3RhdHVzbGluZXMpIHsKKyAgaW50IGVycjsKKworICBpZiAoc3RyPT0iPyJ8fHN0cj09Ii0/IikgeworICAgIHdyaXRlKCJTeW50YXg6IHNjaHJlaWIgPFRpdGVsPlxuIgorICAgICAgICAgICIgIGJlZ2lubnQgZWluZW4gbmV1ZW4gQXJ0aWtlbCBpbiBkZXIgWmVpdHVuZy5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIAorICBpZiAoIXRoaXNfaW50ZXJhY3RpdmUoKSB8fCAhdGhpc19pbnRlcmFjdGl2ZSgpLT5xdWVyeV9yZWFsX25hbWUoKSkgcmV0dXJuIDA7CisgIGlmICghY2FsbGVkX2J5X2l0c2VsZiAmJiBleHRlcm5fY2FsbCgpICYmICFwcmV0ZXh0KQorICAgIHN0cj10aGlzX2ludGVyYWN0aXZlKCktPl91bnBhcnNlZF9hcmdzKCl8fCIiOworICBpZiAoY2FsbGVkX2J5X2l0c2VsZiAmJiBzdHI9PSJ+cSIpIHsKKyAgICB3cml0ZSgiQWJnZWJyb2NoZW4uXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoIUNhdGNoTmV3c0Vycm9yKAorICAgICAgICAgICAgICAgICAgICAgIE5FV1NTRVJWRVItPkFza0FsbG93ZWRXcml0ZShHUk9VUCksCisgICAgICAgICAgICAgICAgICAgICAgIkRpZXNlIFJ1YnJpayBpc3QgbGVpZGVyIHNjaG9uIHJhbmR2b2xsISIpKSByZXR1cm4gMTsKKyAgaWYgKCFjYWxsZWRfYnlfaXRzZWxmKQorICAgIHdyaXRlKCJOZXVlciBBcnRpa2VsIGluIFJ1YnJpayAiK0dST1VQKyI6XG4iKTsKKyAgaWYgKCFzdHIgfHwgc3RyPT0iIiB8fCBzdHI9PSJhcnRpa2VsIikgeworICAgIGlucHV0X3RvKCJzY2hyZWliIiwgSU5QVVRfUFJPTVBULCAiVGl0ZWwgZGVzIEFydGlrZWxzOiAiLCBwcmV0ZXh0LDEpOworICAgIHJldHVybiAxOworICB9CisgIC8vIHdyaXRlcj10aGlzX2ludGVyYWN0aXZlKCktPnF1ZXJ5X3JlYWxfbmFtZSgpOworICBtZXNzYWdlPWFsbG9jYXRlKDYpOworICBtZXNzYWdlW01fQk9BUkRdPUdST1VQOworICBtZXNzYWdlW01fVElUTEVdPWtpbGxjdHJsKHN0cik7CisgIG1lc3NhZ2VbTV9NRVNTQUdFXT1zdGF0dXNsaW5lczsKKyAgd3JpdGUoIlRpdGVsIGlzdDogIitzdHIrIi5cblwKK0dpYiBqZXR6dCBEZWluZW4gVGV4dCBlaW4sXG5cCisqKiBvZGVyIC4gd2VubiBEdSBmZXJ0aWcgYmlzdCwgfnEgenVtIEFiYnJlY2hlbiwgfmggZnVlciBlaW5lIEhpbGZzc2VpdGUuXG4iKTsKKyAgbmVkaXQoIlBvc3ROb3RlIixwcmV0ZXh0KTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2YXJhcmdzIFJlcGx5KHN0cmluZyBzdHIsc3RyaW5nIG5ld3RpdGxlKSB7CisgIG1peGVkIGR1bW15LHJlcGx5dGl0bGUsczsKKyAgaW50IG5yOworCisgIGlmICgoZHVtbXk9KHN0cnx8bmV3dGl0bGUpKT09Ij8ifHxkdW1teT09Ii0/IikgeworICAgIHdyaXRlKCJEZXIgQW50d29ydGUtQmVmZWhsIGlzdCBkb3BwZWx0IGJlbGVndC5cbiIKKyAgICAgICAgICAiMS4gKFplaXR1bmcpOiBTY2hyZWliZSBBbnR3b3J0IGF1ZiBlaW5lbiBBcnRpa2VsIGluIGRlciBaZWl0dW5nLlxuIgorICAgICAgICAgICIgICBTeW50YXg6IGFudHdvcnRlXG4iCisgICAgICAgICAgIiAgICAgICAgICAgYW50d29ydGUgYXVmIGFydGlrZWwgPG5yPiBbbmV1ZXIgVGl0ZWxdXG4iCisgICAgICAgICAgIiAgICAgICAgICAgcmVwbHkgW2F1ZiBhcnRpa2VsIDxucj4gfCB0byBub3RlIDxucj5dIFtuZXVlciBUaXRlbF1cbiIKKyAgICAgICAgICAiMi4gYWVobmxpY2ggJ3NhZ2UnOlxuIgorICAgICAgICAgICIgICBEdSB0aXBwc3QgenVtIEJlaXNwaWVsOlxuIgorICAgICAgICAgICIgICAgIGFudHdvcnRlIGphLCBkYXMgd2Vpc3MgaWNoXG4iCisgICAgICAgICAgIiAgIEFsbGUgU3BpZWxlciBpbSBSYXVtIHNlaGVuIGRhbm46XG4iCisgICAgICAgICAgIiAgICAgPERlaW4gTmFtZT4gYW50d29ydGV0OiBqYSwgZGFzIHdlaXNzIGljaC5cbiIKKyAgICAgICAgICAiQml0dGUgYmVhY2h0ZSwgZGFzcyBqZWRlIFN5bnRheCwgZGllIGF1ZiBkZW4gYW50d29ydGUtQmVmZWhsIGRlciAiCisgICAgICAgICAgIlplaXR1bmdcbnBhc3N0LCBhdWNoIHZvbiBkZXIgWmVpdHVuZyBhdXNnZXdlcnRldCB3aXJkLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBpZiAoc3RyJiYKKyAgICAgICgoc3NjYW5mKGxvd2VyX2Nhc2Uoc3RyKSwiYXVmIGFydGlrZWwgJWQiLGR1bW15KT09MSAmJiAKKyAgICAgICAgc3RyPXRoaXNfcGxheWVyKCktPl91bnBhcnNlZF9hcmdzKClbMTIuLl0pfHwKKyAgICAgICAoc3NjYW5mKGxvd2VyX2Nhc2Uoc3RyKSwidG8gbm90ZSAlZCIsZHVtbXkpPT0xICYmIAorICAgICAgICBzdHI9dGhpc19wbGF5ZXIoKS0+X3VucGFyc2VkX2FyZ3MoKVs4Li5dKSkpIHsKKyAgICBtaXhlZCBub3RlczsKKyAgICBub3Rlcz1ORVdTU0VSVkVSLT5HZXROb3RlcyhHUk9VUCk7CisgICAgaWYgKGR1bW15PDF8fGR1bW15PnNpemVvZihub3RlcykpCisgICAgICByZXR1cm4gd3JpdGUoIkVpbmVuIEFydGlrZWwgbWl0IGRlciBOdW1tZXIgIitkdW1teSsKKyAgICAgICAgICAgICAgICAgICAiIGdpYnQgZXMgaW4gZGllc2VyIFJ1YnJpayBuaWNodC5cbiIpLDE7CisgICAgZHVtbXktLTsKKyAgICByZXBseXRpdGxlPSh7bm90ZXNbZHVtbXldW01fVElUTEVdLG5vdGVzW2R1bW15XVtNX1dSSVRFUl0sCisgICAgICAgICAgICAgICAgICAgbm90ZXNbZHVtbXldW01fVElNRV0sR2V0VElEKG5vdGVzW2R1bW15XSksR1JPVVB9KTsKKyAgICBERUJVR1ZBUihzdHIpOworICAgIGlmICghbmV3dGl0bGUmJnN0ciYmc2l6ZW9mKHN0cikmJnNzY2FuZihzdHIsIiVkICVzIixkdW1teSxzdHIpPT0yKQorICAgICAgbmV3dGl0bGU9c3RyOworICB9CisgIGVsc2UgaWYgKCFzdHJ8fCFzaXplb2Yoc3RyKSkgeworICAgIGlmICghbGFzdHRpdGxlKSByZXR1cm4KKyAgICAgIHdyaXRlKCJEdSBoYXN0IG5vY2ggZ2FyIG5pY2h0cyBnZWxlc2VuLCB3b3JhdWYgRHUgIgorICAgICAgICAgICJhbnR3b3J0ZW4ga29lbm50ZXN0LlxuIiksMTsKKyAgICByZXBseXRpdGxlPWxhc3R0aXRsZTsKKyAgfQorICBlbHNlIHJldHVybiAwOyAgICAgIAorCisvLyByZXR1cm4gQ29tcG9zZVJlcGx5KHJlcGx5dGl0bGUpOworLy99CisvLworLy8KKy8vQ29tcG9zZVJlcGx5KG1peGVkIHJlcGx5dGl0bGUpIHsKKworICBpZiAoIW5ld3RpdGxlKSB7CisgICAgaWYgKHJlcGx5dGl0bGVbMF1bMC4uN109PSJSZTogUmU6ICIpIG5ld3RpdGxlPSJSZV4zOiAiK3JlcGx5dGl0bGVbMF1bOC4uXTsKKyAgICBlbHNlIGlmIChzc2NhbmYocmVwbHl0aXRsZVswXSwiUmVeJWQ6ICVzIixucixuZXd0aXRsZSkpCisgICAgICBuZXd0aXRsZT0iUmVeIisobnIrMSkrIjogIituZXd0aXRsZTsKKyAgICBlbHNlIG5ld3RpdGxlPSJSZTogIityZXBseXRpdGxlWzBdOworICB9CisgIHJldHVybiBzY2hyZWliKG5ld3RpdGxlLDAsMCwKKyAgICAgICAgICAgICAgICAgU1RBVFVTRVNDQVBFKyIgcm49IityZXBseXRpdGxlW0xBU1RfV1JJVEVSXSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcnQ9IityZXBseXRpdGxlW0xBU1RfVElNRV0rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHJnPSIrcmVwbHl0aXRsZVtMQVNUX0dST1VQXSsiXG4iKworICAgICAgICAgICAgICAgICBTVEFUVVNFU0NBUEUrIiB0aWQ9IityZXBseXRpdGxlW0xBU1RfVElEXSsiXG4iKTsKK30KKworc3RhdGljIFJlcGx5MihzdHIpIHsKKyAgc3RyID0gdGhpc19wbGF5ZXIoKS0+X3VucGFyc2VkX2FyZ3MoKTsKKyAgaWYgKCFzdHJ8fHN0clswLi4xMV09PSJhdWYgYXJ0aWtlbCAifHxzdHJbMC4uN109PSJ0byBub3RlICIpCisgICAgcmV0dXJuIFJlcGx5KHN0cik7CisgIHJldHVybiBSZXBseSgwLHN0cik7Cit9CisKK3N0YXRpYyB2b2lkIEluZm9ybVBsYXllcnMoc3RyaW5nIGdyb3VwLHN0cmluZyBwbGF5ZXIsc3RyaW5nIHRleHQpCit7CisgIG9iamVjdCAqcGxheWVyczsKKyAgaW50IGk7CisgIG1peGVkIGRhdGE7CisgIHN0cmluZyBpZzsKKworICBwbGF5ZXJzPXVzZXJzKCk7CisgIGlnPWxvd2VyX2Nhc2UocGxheWVyKSsiLm5ld3MiOworICBmb3IgKGk9c2l6ZW9mKHBsYXllcnMpLTE7aT49MDtpLS0pIHsKKyAgICBkYXRhPXBsYXllcnNbaV0tPlF1ZXJ5UHJvcChQX1dBSVRGT1IpOworICAgIGlmIChwb2ludGVycChkYXRhKSYmKG1lbWJlcihkYXRhLCJNcGEiKT4tMSkpIHsKKyAgICAgIGRhdGE9cGxheWVyc1tpXS0+UXVlcnlQcm9wKFBfUkVBRF9ORVdTKTsKKyAgICAgIGlmIChtYXBwaW5ncChkYXRhKSYmKGRhdGFbZ3JvdXBdPjApKSB7CisgICAgICAgIGRhdGE9cGxheWVyc1tpXS0+UXVlcnlQcm9wKFBfSUdOT1JFKTsKKyAgICAgICAgaWYgKCghcG9pbnRlcnAoZGF0YSkpfHwobWVtYmVyKGRhdGEsaWcpPT0tMSkpCisgICAgICAgICAgdGVsbF9vYmplY3QocGxheWVyc1tpXSx0ZXh0KTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworc3RhdGljIFBvc3ROb3RlKHRleHQpIHsKKyAgaW50IGVycjsKKyAgc3RyaW5nIHNpZzsKKworICBpZiAoIXRleHQpIHsKKyAgICB3cml0ZSgiQWJicnVjaCEgQXJ0aWtlbCBsYW5kZXQgaW0gUmVpc3N3b2xmLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKCFzaXplb2Yob2xkX2V4cGxvZGUodGV4dCwiXG4iKS0KKyAgICAgICAgICAgICAgKHsicSIsInF1aXQiLCIgKioiLCIqKiAiLCJlbmRlIiwiIiwiZXhpdCIsIiAifSkgCisgICAgICAgICAgICAgICkgKQorICAgIHJldHVybiB3cml0ZSgiXAorQUNIVFVORzogV29sbHRlc3QgRHUgd2lya2xpY2ggZWluZW4gQXJ0aWtlbCBvaG5lIEluaGFsdCBpbiBkaWUgbXBhIHNldHplbj9cblwKK0FydGlrZWwgb2huZSBlcmtlbm5iYXJlbiBJbmhhbHQgd2VyZGVuIE5JQ0hUIHZlcm9lZmZlbnRsaWNodC4gQml0dGUgdWViZXItXG5cCitwcnVlZiBEZWluZSBTeW50YXgsIGZhbGxzIER1IGtlaW5lbiBBcnRpa2VsIHNjaHJlaWJlbiB3b2xsdGVzdCwgb2RlciBzY2hyZWliXG5cCithdWNoIGVpbiBiaXNzY2hlbiBUZXh0IVxuXAorQXJ0aWtlbCBsYW5kZXQgaW0gUmVpc3N3b2xmLlxuIiksMTsKKyAgaWYgKCFtZXNzYWdlW01fTUVTU0FHRV0pCisgICAgbWVzc2FnZVtNX01FU1NBR0VdID0gdGV4dDsKKyAgZWxzZQorICAgIG1lc3NhZ2VbTV9NRVNTQUdFXSs9dGV4dDsKKyAgaWYgKHNpZz1yZWFkX2ZpbGUoIi9wbGF5ZXJzLyIrZ2V0ZXVpZCh0aGlzX2ludGVyYWN0aXZlKCkpKyIvLnNpZ25hdHVyZSIpKQorICAgIG1lc3NhZ2VbTV9NRVNTQUdFXSs9c2lnOworICBpZiAoIUNhdGNoTmV3c0Vycm9yKE5FV1NTRVJWRVItPldyaXRlTm90ZShtZXNzYWdlKSwKKyAgICAgICAiRGllc2UgUnVicmlrIGlzdCB2b2xsLiBNaXN0LCBkYSB3YXIgamVtYW5kIHNjaG5lbGxlci4uLiIpKSB7CisgICAgd3JpdGUoIlZlcnN1Y2gsIFBsYXR6IGluIGRlciBSdWJyaWsgenUgZmluZGVuLCBkYW5uIGthbm5zdCBEdSBtaXIgfnIgbm9jaG1hbFxuaW4gZGVuIFRleHQgZWluc3RlaWdlbiB1bmQgaWhuIGFuc2NobGllc3NlbmQgdmVyb2VmZmVudGxpY2hlbi5cbihWb3JzY2hsYWc6IEVpbmVuIHZlcmFsdGV0ZW4gQXJ0aWtlbCBhYmhhZW5nZW4gb2RlciB2ZXJsZWdlbi5cbiIpOworICAgIHJldHVybiAwOworICB9CisgIHdyaXRlKCJPSywgQXJ0aWtlbCBpc3QgdmVyb2VmZmVudGxpY2h0LlxuIik7CisgIHNheShjYXBpdGFsaXplKFRQLT5uYW1lKCkpKworICAgICAgIiBoYXQgZWluZW4gQXJ0aWtlbCBpbiBkZXIgWmVpdHVuZyB2ZXJvZWZmZW50bGljaHQuXG4iKTsKKyAgaWYgKGdldGV1aWQoVFApIT0ic2l0b3BhbmFraSIpCisgICAgSW5mb3JtUGxheWVycyhtZXNzYWdlW01fQk9BUkRdLGdldGV1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSwKKyAgICAgICAgICAgICAgICAiKiBNUEE6IE5ldWVyIEFydGlrZWwgdm9uICIrCisgICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShnZXRldWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkpKworICAgICAgICAgICAgICAgICIgaW4gUnVicmlrIFwiIittZXNzYWdlW01fQk9BUkRdKyJcIi5cbiIpOworICBtZXNzYWdlPTA7IC8qIFBsYXR6IHNwYXJlbiEgKi8KKyAgcmV0dXJuIDE7Cit9CisKKworLy9zdGF0aWMgLy8gYWxsb3dpbmcgYWxpYXNpbmcgKlJ1bWF0YSogNS84Lzk2CitpbmhhbHQoc3RyKSB7CisgIGludCBpLGVuZGZsYWcsdGltZW91dDsKKyAgc3RyaW5nICpncnVwcGVuLHMsdHh0LHN1Y2hlOworICBtaXhlZCBtZXNzYWdlczsKKworICBpZiAoc3RyPT0iPyJ8fHN0cj09Ii0/IikgcmV0dXJuCisgICAgd3JpdGUoIlN5bnRheDogaW5oYWx0IFs8cnVicmlrPl0gW2VuZGVdIFtzdWNoZSA8dGV4dD5dXG4iKSwxOworCisgIHN0cj0oIXN0cik/KHt9KTpleHBsb2RlKHN0ciwiICIpOworCisgIGlmIChzaXplb2Yoc3RyKSAmJiAoc3RyWzBdPT0ibmV1IiB8fCBzdHJbMF09PSJuZXVlcyIpICkKKyAgICByZXR1cm4gUmVhZE5leHRVbnJlYWQoImxpc3RlIiksMTsKKworICBpZiAoZW5kZmxhZz1tZW1iZXIoc3RyLCJlbmRlIikrMSkgc3RyLT0oeyJlbmRlIn0pOworICBpZiAoKChpPW1lbWJlcihzdHIsInN1Y2hlIikpICE9IC0xKSAmJiAoc2l6ZW9mKHN0cikgPiBpKSkgeworICAgIHN1Y2hlPWxvd2VyX2Nhc2UoaW1wbG9kZShzdHJbaSsxLi5dLCIgIikpOworICAgIHN0cj1zdHJbMC4uaS0xXTsKKyAgfQorICBlbHNlCisgICAgc3VjaGU9MDsKKyAgaWYgKCFzaXplb2Yoc3RyKSkgeworICAgIHN0cj1HUk9VUDsKKyAgICBpZiAoIXBvaW50ZXJwKG1lc3NhZ2VzPU5FV1NTRVJWRVItPkdldE5vdGVzKHN0cikpKXsKKyAgICAgIHN0cj1HUk9VUD1ERUZBVUxUR1JPVVA7CisgICAgaWYgKCFwb2ludGVycChtZXNzYWdlcz1ORVdTU0VSVkVSLT5HZXROb3RlcyhzdHIpKSkKKyAgICAgIHJldHVybiBub3RpZnlfZmFpbCgiU2VsdHNhbSwgaXJnZW5kd2llIGdlaHQgaGllciBlaW5pZ2VzIHNjaGllZi4uLlxuIiksMDsKKyAgICB9CisgIH0KKyAgZWxzZSB7CisgICAgc3RyPUdldEdyb3VwTmFtZShzdHJbMF0pOworICAgIGlmICghc3RyKSByZXR1cm4gMTsKKyAgICBtZXNzYWdlcz1ORVdTU0VSVkVSLT5HZXROb3RlcyhzdHIpOworICB9CisgIHRpbWVvdXQ9YWJzKHJlYWRfdW50aWxbc3RyXSk7CisgIHM9IkluaGFsdCBkZXIgUnVicmlrICIrc3RyKyI6XG5cbiI7CisgIGlmICghcG9pbnRlcnAobWVzc2FnZXMpIHx8ICFzaXplb2YobWVzc2FnZXMpKQorICAgIHJldHVybiAKKyAgICAgIHdyaXRlKHMrIlp1ciBaZWl0IGJlZmluZGVuIHNpY2gga2VpbmUgQXJ0aWtlbCBpbiBkaWVzZXIgUnVicmlrLlxuIiksMTsKKyAgaWYgKHN1Y2hlKQorICAgIHMrPSJTdWNoZSBuYWNoICciK3N1Y2hlKyInIGluIGRlciBSdWJyaWsgZXJnYWIgZm9sZ2VuZGUgVHJlZmZlcjpcblxuIjsKKyAgZWxzZQorICAgIGlmIChzaXplb2YobWVzc2FnZXMpPT0xKQorICAgICAgcys9Ilp1ciBaZWl0IGJlZmluZGV0IHNpY2ggZWluIEFydGlrZWwgaW4gZGVyIFJ1YnJpazpcblxuIjsKKyAgICBlbHNlCisgICAgICBzKz0iWnVyIFplaXQgYmVmaW5kZW4gc2ljaCAiK3NpemVvZihtZXNzYWdlcykrCisgICAgICAgICIgQXJ0aWtlbCBpbiBkZXIgUnVicmlrOlxuXG4iOworICBpZiAoZW5kZmxhZyYmKHNpemVvZihtZXNzYWdlcyk+MTYpJiYKKyAgICAgIG1lc3NhZ2VzW3NpemVvZihtZXNzYWdlcyktMTZdW01fVElNRV0+PXRpbWVvdXQpIHRpbWVvdXQ9LTE7CisgIGZvciAoaT0oZW5kZmxhZz8oKChlbmRmbGFnPXNpemVvZihtZXNzYWdlcyktMTUpPDApPzA6ZW5kZmxhZyk6MCk7CisgICAgICAgaTxzaXplb2YobWVzc2FnZXMpO2krKykKKyAgeworICAgIHR4dD1zcHJpbnRmKCIlMmQuJXMlLTQ4cyU0ZCAoJS0xMXMpICVzXG4iLGkrMSwKKyAgICAgICAgICAgICAgICAoKCh0aW1lb3V0Pj0wKSAmJiB0aW1lb3V0PG1lc3NhZ2VzW2ldW01fVElNRV0gKT8KKyAgICAgICAgICAgICAgICAgKCAodGltZW91dD0tMSksIioiKToiICIpLG1lc3NhZ2VzW2ldW01fVElUTEVdLAorICAgICAgICAgICAgICAgIHNpemVvZihleHBsb2RlKG1lc3NhZ2VzW2ldW01fTUVTU0FHRV0sIlxuIikpLAorICAgICAgICAgICAgICAgIG1lc3NhZ2VzW2ldW01fV1JJVEVSXSwKKyAgICAgICAgICAgICAgICBkdGltZShtZXNzYWdlc1tpXVtNX1RJTUVdKVs1Li4xMV0pOworICAgIGlmICghc3VjaGUgfHwgKHN0cnN0cihsb3dlcl9jYXNlKHR4dCksIHN1Y2hlKSAhPSAtMSkpCisgICAgICBzKz10eHQ7CisgIH0KKyAgaWYgKGVuZGZsYWcpIHdyaXRlKHMpOworICBlbHNlIHRoaXNfcGxheWVyKCktPk1vcmUocyk7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBhcnRpa2VsKHN0cikgeworICByZXR1cm4gbGllcyhzdHIpOworfQorCisKK3N0YXRpYyBsb2VzY2hlKHN0cikgeworICBpbnQgbnVtOworICBtaXhlZCAqbWVzc2FnZXM7CisKKyAgaWYgKHN0cj09Ij8ifHxzdHI9PSItPyIpIHJldHVybiAKKyAgICB3cml0ZSgiU3ludGF4OiBsb2VzY2hlIGFydGlrZWwgPG5yPlxuIgorICAgICAgICAgICIgIChiZXppZWh0IHNpY2ggaW1tZXIgYXVmIGRpZSBha3R1ZWxsZSBSdWJyaWsuXG4iKSwxOworCisgIGlmICghc3RyIHx8IHNzY2FuZihzdHIsImFydGlrZWwgJWQiLG51bSkhPTEgfHwgbnVtPD0wKSAKKyAgIHJldHVybiBub3RpZnlfZmFpbCgiV0VMQ0hFTiBBcnRpa2VsIHdpbGxzdCBEdSBsb2VzY2hlbiA/XG4iKSwwOworICBudW0tLTsKKyAgbWVzc2FnZXM9KE5FV1NTRVJWRVItPkdldE5vdGVzKEdST1VQKSk7CisgIGlmIChzaXplb2YobWVzc2FnZXMpPD1udW0pIHJldHVybgorICAgIG5vdGlmeV9mYWlsKCJTbyB2aWVsZSBBcnRpa2VsIHNpbmQgZGEgbmljaHQhXG4iKSwwOworICAKKyAgd3JpdGUoIlJ1YnJpayAiK0dST1VQKyIsIEFydGlrZWwgIisobnVtKzEpKworICAgICAgICAiIHZvbiAiK2NhcGl0YWxpemUobWVzc2FnZXNbbnVtXVtNX1dSSVRFUl0pKworICAgICAgICAiIHZvbSAiK2R0aW1lKG1lc3NhZ2VzW251bV1bTV9USU1FXSlbNS4uMjZdKworICAgICAgICAiLFxuVGl0ZWw6ICIrbWVzc2FnZXNbbnVtXVtNX1RJVExFXSsiLFxuXG4iKTsKKworICAvKiAodWViZXJmbHVlc3NpZ2UgQWJmcmFnZSwgbWFjaHQgc2Nob24gL3NlY3VyZS9uZXdzKQorICBpZiAoIUlTX0xFQVJORVIoVEkpICYmIGxvd2VyX2Nhc2UobWVzc2FnZXNbbnVtXVtNX1dSSVRFUl0pIT1nZXRldWlkKFRJKSkgCisgICAgcmV0dXJuIAorICAgICAgd3JpdGUoIk5pY2h0IGdlbG9lc2NodCAtIGR1IGRhcmZzdCBudXIgZWlnZW5lIEFydGlrZWwgbG9lc2NoZW4uXG4iKSwxOworICAgICAgICAgICovCisKKyAgc3dpdGNoIChORVdTU0VSVkVSLT5SZW1vdmVOb3RlKEdST1VQLCBudW0pKXsKKyAgY2FzZSAxOiB3cml0ZSgiQXJ0aWtlbCBpc3QgZ2Vsb2VzY2h0LlxuIik7CisgICAgc2F5KHRoaXNfcGxheWVyKCktPm5hbWUoKSsiIGxvZXNjaHQgZWluZW4gQXJ0aWtlbCBhdXMgZGVyIFplaXR1bmcuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgY2FzZSAtMTogd3JpdGUoIkRpZXNlbiBBcnRpa2VsIGRhcmZzdCBEdSBuaWNodCBsb2VzY2hlbi5cbiIpOworICAgIHNheSh0aGlzX3BsYXllcigpLT5uYW1lKCkrIiB2ZXJzdWNodCB2ZXJnZWJsaWNoLCBlaW5lbiBBcnRpa2VsIHp1IGxvZXNjaGVuLlxuIik7CisgICAgcmV0dXJuIDE7CisgIGNhc2UgLTM6IHdyaXRlKCJTbyB2aWVsZSBBcnRpa2VsIHNpbmQgZGEgbmljaHQgIVxuIik7CisgICAgcmV0dXJuIDE7CisgIGRlZmF1bHQ6IHdyaXRlKCJJbnRlcm5lciBGZWhsZXIuIEJpdHRlIEVyem1hZ2llciB2ZXJzdGFlbmRpZ2VuICFcbiIpOworICAgIHJldHVybiAxOworICB9ICAKK30KKworLy8gTG93LWxldmVsIEZ1bmt0aW9uIHp1bSBBYm9ubmllcmVuL0FiYmVzdGVsbGVuIHZvbiBSdWJyaWtlbgorLy8gYmVzdGVsbGVuPT0wIC0+IGFiYmVzdGVsbGVuLCBiZXN0ZWxsZW4hPTAgLT4gYmVzdGVsbGVuCisvLyBSdWVja2dhYmU6IDAsIHdlbm4gZGVyIGdld3VlbnNjaHRlIFp1c3RhbmQgc2Nob24gZWluZ2VzdGVsbHQgd2FyLCBzb25zdCAxCitwcml2YXRlIGludCBfc3Vic2NyaWJlKHN0cmluZyBncm91cG5hbWUsIGludCBiZXN0ZWxsZW4pIHsKKworICBpbnQgdGltZW91dCA9IHJlYWRfdW50aWxbZ3JvdXBuYW1lXTsKKyAgLy8gZ2FyIG5pY2h0IGFib25uaWVydC9hYmJlc3RlbGx0PworICBpZiAoIWJlc3RlbGxlbiAmJiB0aW1lb3V0IDwgMCkKKyAgICByZXR1cm4gMDsKKyAgZWxzZSBpZiAoYmVzdGVsbGVuICYmIHRpbWVvdXQgPiAwKQorICAgIHJldHVybiAwOworCisgIC8vIHdlbm4gbm9jaCBrZWluIHRpbWVvdXQsIGVyc3RtYWwgYXVmIDEgc2V0emVuCisgIHRpbWVvdXQgfHw9IDE7CisKKyAgLy8gLTEgZnVlciBhYmJlc3RlbGxlbiwgKzEgZnVlciBiZXN0ZWxsZW4KKyAgaWYgKGJlc3RlbGxlbikKKyAgICByZWFkX3VudGlsW2dyb3VwbmFtZV0gPSBhYnModGltZW91dCk7CisgIGVsc2UKKyAgICByZWFkX3VudGlsW2dyb3VwbmFtZV0gPSAtdGltZW91dDsKKworICBpZiAoZW52aXJvbm1lbnQoKSkKKyAgICBlbnZpcm9ubWVudCgpLT5TZXRQcm9wKFBfUkVBRF9ORVdTLCByZWFkX3VudGlsKTsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIFVuc3Vic2NyaWJlKHN0cikgeworICBpbnQgdGltZW91dDsKKyAgaWYgKHN0cj09Ij8ifHxzdHI9PSItPyIpIHJldHVybgorICAgIHdyaXRlKCJTeW50YXg6IHVuc3Vic2NyaWJlIDxydWJyaWs+IgorICAgICAgICAgICIgIG9kZXI6IGJlc3RlbGxlIDxydWJyaWs+IGFiXG4iKSwxOworICBzdHI9R2V0R3JvdXBOYW1lKHN0cik7CisgIGlmICghc3RyKSByZXR1cm4gMTsKKyAgaWYgKCFfc3Vic2NyaWJlKHN0ciwwKSkgeworICAgIG5vdGlmeV9mYWlsKCJEaWUgUnVicmlrIGhhc3QgRHUgZ2FyIG5pY2h0IGFib25uaWVydCFcbiIpOworICAgIHJldHVybiAwOworICB9CisgIGVsc2UgeworICAgIHdyaXRlKCJSdWJyaWsgIitzdHIrIiBhYmJlc3RlbGx0LlxuIik7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIEJlc3RlbGxlKHN0cikgeyAvKiBhYiAhICovCisgIGlmICghc3RyIHx8ICFzc2NhbmYoc3RyLCIlcyBhYiIsc3RyKSkgcmV0dXJuIF9ub3RpZnlfZmFpbCgKKyAgICAgICAiRGllIFN5bnRheCBpc3Q6ICdiZXN0ZWxsZSA8cnVicmlrPiBhYicsICIKKyAgICAgICAib2RlciBtZWluc3QgRHUgJ2Fib25uaWVyZSc/XG4iKSwwOworICByZXR1cm4gVW5zdWJzY3JpYmUoc3RyKTsKK30KKworc3RhdGljIFN1YnNjcmliZShzdHIpIHsKKyAgaW50IHRpbWVvdXQ7CisgIGlmIChzdHI9PSI/Inx8c3RyPT0iLT8iKSByZXR1cm4KKyAgICB3cml0ZSgiU3ludGF4OiBhYm9ubmllcmUgPHJ1YnJpaz5cbiIKKyAgICAgICAgICAiICBvZGVyOiBzdWJzY3JpYmUgPHJ1YnJpaz5cbiIpLDE7CisgIHN0cj1HZXRHcm91cE5hbWUoc3RyKTsKKyAgaWYgKCFzdHIpIHJldHVybiAxOworICBpZiAoIV9zdWJzY3JpYmUoc3RyLDEpKSB7CisgICAgbm90aWZ5X2ZhaWwoIkRpZSBSdWJyaWsgaGFzdCBEdSBkb2NoIHNjaG9uIGFib25uaWVydCFcbiIpOworICAgIHJldHVybiAwOworICB9CisgIGVsc2UgeworICAgIHdyaXRlKCJSdWJyaWsgIitzdHIrIiBhYm9ubmllcnQuXG4iKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworLy8gTGVndCBkaWUgYW5mYWVuZ2xpY2hlbiBBYm9ubmVtZW50cyBlaW5lcyBOZXVsZXNlcnMgZmVzdCB1bmQgYmVzdGVsbHQgYWxsZQorLy8gYW5kZXJlbiBhYi4KK3ByaXZhdGUgdm9pZCBJbml0aWFsU3Vic2NyaXB0aW9ucygpIHsKKyAgLy8gYWxsZSBhYmJlc3RlbGxlbi4gOy0pCisgIC8vIEFsdGVybmF0aXZlOiBmdWVyIGFsbGUgX3N1YnNjcmliZSgsMCkgcnVmZW4KKyAgaWYgKCFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKGVudmlyb25tZW50KCkpKQorICAgIHJldHVybjsKKyAgc3RyaW5nICpncnVwcGVuID0gTkVXU1NFUlZFUi0+R2V0R3JvdXBzKCk7CisgIGludCAqdmFscyA9IGFsbG9jYXRlKHNpemVvZihncnVwcGVuKSwtMSk7CisgIHJlYWRfdW50aWwgPSBta21hcHBpbmcoZ3J1cHBlbix2YWxzKTsKKworICAvLyBqZXR6dCBkaWUgdm9yYXVzZ2V3YWVobHRlbiBiZXN0ZWxsZW4KKyAgZm9yZWFjaChzdHJpbmcgZ3J1cHBlIDogSU5JVElBTF9TVUJTQ1JJUFRJT05TKSB7CisgICAgaWYgKG1lbWJlcihncnVwcGVuLCBncnVwcGUpID4gLTEpCisgICAgICBfc3Vic2NyaWJlKGdydXBwZSwxKTsKKyAgfQorICAvLyB1bmQgZ2dmLiBub2NoIGRpZSBlaWdlbmUgR2lsZGVucnVicmlrCisgIHN0cmluZyBnaWxkZSA9IGVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX0dVSUxEKTsKKyAgaWYgKHN0cmluZ3AoZ2lsZGUpCisgICAgICAmJiBtZW1iZXIoZ3J1cHBlbiwgImdpbGRlbi4iK2dpbGRlKSA+IC0xKQorICAgIF9zdWJzY3JpYmUoImdpbGRlbi4iK2dpbGRlLDEpOworCisgIGVudmlyb25tZW50KCktPlNldFByb3AoUF9SRUFEX05FV1MsIHJlYWRfdW50aWwpOworfQorCitzdGF0aWMgTW92ZU1lc3NhZ2Uoc3RyKSB7CisgIGludCBudW0saTsKKyAgbWl4ZWQgbXNnLyosZXhwbCovOworICBzdHJpbmcgZ3I7CisgIGlmIChzdHI9PSI/Inx8c3RyPT0iLT8iKSByZXR1cm4KKyAgICB3cml0ZSgiU3ludGF4OiB2ZXJsZWdlIGFydGlrZWwgPG5yPiBuYWNoIDxydWJyaWs+XG4iCisgICAgICAgICAgIiAgQXJ0aWtlbCB1bmQgUnVicmlrIG11ZXNzZW4gZXhwbGl6aXQgYW5nZWdlYmVuIHdlcmRlbi5cbiIpLDE7CisgIGlmICghc3RyIHx8IHNzY2FuZihzdHIsImFydGlrZWwgJWQgbmFjaCAlcyIsbnVtLGdyKSE9MikgcmV0dXJuIChpbnQpbm90aWZ5X2ZhaWwoCisgICAgICAgICJ2ZXJsZWdlIGFydGlrZWwgPG5yPiBuYWNoIDxydWJyaWs+LCBvZGVyIHdhcz9cbiIpOworICBpZiAoIShncj1HZXRHcm91cE5hbWUoZ3IpKSkgcmV0dXJuIDE7CisgIGlmICghKENhdGNoTmV3c0Vycm9yKE5FV1NTRVJWRVItPkFza0FsbG93ZWRXcml0ZShnciksIkRpZSBSdWJyaWsgaXN0IGxlaWRlciB2b2xsLlxuIikpKSByZXR1cm4gMTsKKworICBpZiAoIXBvaW50ZXJwKG1zZz1ORVdTU0VSVkVSLT5HZXROb3RlcyhHUk9VUCkpKQorICAgIHJldHVybiBub3RpZnlfZmFpbCgiU2VsdHNhbSwgZGllIFJ1YnJpayAnIitHUk9VUCsKKyAgICAgICAgIicgZ2lidCBlcyBuaWNodCBtZWhyLi4uXG4iKSwgMDsKKworICBudW0tLTsKKyAgaWYgKHNpemVvZihtc2cpPD1udW0pIHJldHVybgorICAgIG5vdGlmeV9mYWlsKCJTbyB2aWVsZSBOYWNocmljaHRlbiBzaW5kIGRhIG5pY2h0ICFcbiIpLDA7CisgIG1zZz1tc2dbbnVtXTsKKyAgaWYgKGdldGV1aWQoVEkpICE9IGxvd2VyX2Nhc2UobXNnW01fV1JJVEVSXSkpIHsgICAgCisgICAgaWYgKCFJU19MRUFSTkVSKFRJKSkgcmV0dXJuIAorICAgICAgd3JpdGUoIkR1IGRhcmZzdCBudXIgRGVpbmUgZWlnZW5lbiBBcnRpa2VsIHZlcmxlZ2VuLlxuIiksMTsKKyAgICB3cml0ZSgiV0FSTlVORzogRGFzIGlzdCBuaWNodCBEZWluIGVpZ2VuZXIgQXJ0aWtlbCFcbiIpOworICB9CisgICAgLy8gIHJldHVybiAoaW50KW5vdGlmeV9mYWlsKCJNYW4gZGFyZiB6dXIgWmVpdCBudXIgZWlnZW5lIEFydGlrZWwgdmVybGVnZW4uXG4iKTsKKyAgaWYgKCFDYXRjaE5ld3NFcnJvcihORVdTU0VSVkVSLT5SZW1vdmVOb3RlKEdST1VQLG51bSksIkRpZXNlciBGZWhsZXIga2FubiBlaWdlbnRsaWNoIG5pY2h0IGF1ZnRyZXRlbiIpKQorICAgIHdyaXRlKCJXYXJudW5nISBLb25udGUgQXJ0aWtlbCBhbiBhbHRlciBQb3NpdGlvbiBuaWNodCBsb2VzY2hlbi5cbiIpOworICBlbHNlIHdyaXRlKCJBcnRpa2VsIHZvbiBSdWJyaWsgIitHUk9VUCsiIGVudGZlcm50LlxuIik7CisKKyAgbXNnW01fTUVTU0FHRV09CisgICAgc3ByaW50ZigiJXMgb249JXMgb3Q9JWQgb2c9JXNcbiIsCisgICAgICAgICAgICBTVEFUVVNFU0NBUEUsbXNnW01fV1JJVEVSXSxtc2dbTV9USU1FXSxtc2dbTV9CT0FSRF0pCisgICAgICArbXNnW01fTUVTU0FHRV07CisKKy8qCisgIGV4cGw9ZXhwbG9kZShtc2dbTV9NRVNTQUdFXSwiXG4iKTsKKyAgZm9yIChpPTA7KElTX1NUQVRVU0xJTkUoZXhwbFtpXVswLi4yXSkpO2krKyk7CisgIG1zZ1tNX01FU1NBR0VdPSggKGkpID8gaW1wbG9kZShleHBsWzAuLmktMV0sIlxuIikrIlxuIiA6ICIiICkgKworICAgICJbVmVybGVndCB2b24gIittc2dbTV9CT0FSRF0rIiwgIittc2dbTV9XUklURVJdKyIsICIrCisgICAgZHRpbWUobXNnW01fVElNRV0pWzUuLjI2XSsiXTpcbiIrCisgICAgICBpbXBsb2RlKGV4cGxbaS4uXSwiXG4iKSsiXG4iOworKi8KKworICBtc2dbTV9CT0FSRF09Z3I7CisgIE5FV1NTRVJWRVItPldyaXRlTm90ZShtc2cpOworICB3cml0ZSgiQXJ0aWtlbCBuYWNoIFJ1YnJpayAiK2dyKyIgdmVybGVndC5cbiIpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIE1vdmVUcmFzaCgpCit7CisgIGlmICghcG9pbnRlcnAobGFzdHRpdGxlKXx8c2l6ZW9mKGxhc3R0aXRsZSk8TEFTVF9TSVpFT0YpIHJldHVybgorICAgIHdyaXRlKCJXYXMgZGVubiBiaXR0ZT8gRHUgaGFzdCBub2NoIGdhciBuaWNodHMgZ2VsZXNlbiFcbiIpLDE7CisgIGlmIChsYXN0dGl0bGVbTEFTVF9HUk9VUF0hPUdST1VQKSByZXR1cm4KKyAgICB3cml0ZSgiTml4IGdpYnRzISBEdSBoYXN0IGRpZSBSdWJyaWsgZ2V3ZWNoc2VsdCFcbiIpLDE7CisgIHJldHVybiBNb3ZlTWVzc2FnZShzcHJpbnRmKCJhcnRpa2VsICVkIG5hY2ggbXVlbGwiLGxhc3R0aXRsZVtMQVNUX05SXSsxKSk7Cit9CisKK3N0YXRpYyBTYXZlTWVzc2FnZShzdHIpIHsKKyAgbWl4ZWQgbnVtOworICBtaXhlZCAqbWVzc2FnZXM7CisKKyAgaWYgKGludHAoc3RyKSkgbnVtPXN0cjsKKyAgaWYgKCghbnVtICYmICghc3RyIHx8IHN0cj09IiIgfHwgc3NjYW5mKHN0ciwiYXJ0aWtlbCAlZCIsbnVtKSE9MSkpIHx8IG51bTw9MCkgeworICAgIG5vdGlmeV9mYWlsKCJXZWxjaGVuIEFydGlrZWwgd2lsbHN0IER1IGFic3BlaWNoZXJuP1xuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKCFwb2ludGVycChtZXNzYWdlcz1ORVdTU0VSVkVSLT5HZXROb3RlcyhHUk9VUCkpKQorICAgIHJldHVybiBub3RpZnlfZmFpbCgiU2VsdHNhbSwgZGllIFJ1YnJpayAnIitHUk9VUCsKKyAgICAgICAgIicgZ2lidCBlcyBuaWNodCBtZWhyLi4uXG4iKSwgMDsKKyAgbnVtLS07CisgIGlmIChzaXplb2YobWVzc2FnZXMpPD1udW0pIHsKKyAgICBub3RpZnlfZmFpbCgiU28gdmllbGUgTmFjaHJpY2h0ZW4gc2luZCBkYSBuaWNodCAhXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZih3cml0ZV9maWxlKFNBVkVNU0dQQVRIKFRQKSxNZXNzYWdlMnN0cmluZyhudW0sbWVzc2FnZXMsTTJTX1JFTU9URSkrIlxuIikpCisgICAgd3JpdGUoYnJlYWtfc3RyaW5nKAorICAgICAgIkluaGFsdCBkZXMgQXJ0aWtlbHMgd3VyZGUgbmFjaCAiK1NBVkVNU0dQQVRIKFRQKSsiIGdlc3BlaWNoZXJ0LlxuIikpOworICBlbHNlCisgICAgd3JpdGUoYnJlYWtfc3RyaW5nKAorICAgICAgIkZlaGxlciBiZWltIFNjaHJlaWJlbiBuYWNoICIrU0FWRU1TR1BBVEgoVFApKyIhXG4iKSk7CisgIHJldHVybiAxOworfQorCisKK3N0YXRpYyBNYWlsTWVzc2FnZShzdHIpIHsKKyAgbWl4ZWQgbnVtLHJlYyxncm91cDsKKyAgbWl4ZWQgKm1lc3NhZ2VzOworCisvLyAgcHJpbnRmKCIlT1xuIixpbmhlcml0X2xpc3QoZW52aXJvbm1lbnQoVFApKSk7CisvLyAgaWYgKG1lbWJlcihxdWVyeV9hY3Rpb25zKHRoaXNfcGxheWVyKCkpLCJtYWlsIik8MCkKKy8vICAgICB0dXQgbmljaHQgd2VnZW4gYW5kZXJlciBJbXBsZW10aWVydW5nIHZvbiBBZGRDbWQgaW4gUmFldW1lbgorICAKKyAgaWYgKHN0cj09Ij8ifHxzdHI9PSItPyIpIHJldHVybgorICAgIHdyaXRlKCJTeW50YXg6IHZlcnNlbmRlIGFydGlrZWwgPG5yPiBhbiA8YWRyZXNzZT5cbiIpLDE7CisKKyAgc3RyPVRQLT5fdW5wYXJzZWRfYXJncygpOyAgICAgLy8gd2VnZW4gTWFpbGFkcmVzc2VuCisgIGlmIChzdHIpIHN0cj1sb3dlcl9jYXNlKHN0cik7CisKKyAgaWYgKCFJU19TRUVSKFRQKSAmJiAhSVNfUE9TVChlbnZpcm9ubWVudChUUCkpKQorICAgIHJldHVybiBub3RpZnlfZmFpbCgiRHUgbXVzc3QgaW4gZWluIFBvc3RhbXQgZ2VoZW4sICIKKyAgICAgICAgInVtIGV0d2FzIHZlcnNlbmRlbiB6dSBrb2VubmVuLlxuIiksMDsKKyAgCisgIG51bT0wOworICAKKyAgaWYgKCFzdHIgfHwgKHNzY2FuZihzdHIsImFydGlrZWwgJWQgYW4gJXMiLG51bSxyZWMpIT0yICYmCisgICAgICAgICAgICAgICBzc2NhbmYoc3RyLCJub3RlICVkIHRvICVzIixudW0scmVjKSE9MiAmJgorICAgICAgICAgICAgICAgc3NjYW5mKHN0ciwibm90ZSB0byAlcyIscmVjKSE9MSAmJgorICAgICAgICAgICAgICAgc3NjYW5mKHN0ciwiYXJ0aWtlbCBhbiAlcyIscmVjKSE9MSkpeworICAgICBpZiAoIXN0ciB8fCBzdHJbMC4uNl09PSJhcnRpa2VsInx8c3RyWzAuLjNdPT0ibm90ZSIpIHJldHVybiAKKyAgICAgIHdyaXRlKCJXZWxjaGVuIEFydGlrZWwgd2lsbHN0IER1IHZlcnNlbmRlbiwgdW5kIHdvaGluP1xuIiksMTsKKyAgICBlbHNlIHJldHVybiAKKyAgICAgIG5vdGlmeV9mYWlsKCJXZWxjaGVuIEFydGlrZWwgd2lsbHN0IER1IHZlcnNlbmRlbiwgdW5kIHdvaGluP1xuIiksMDsKKyAgfQorICBpZiAoIW51bSYmKCFwb2ludGVycChsYXN0dGl0bGUpfHxzaXplb2YobGFzdHRpdGxlKTxMQVNUX1NJWkVPRikpCisgICAgcmV0dXJuIHdyaXRlKCJEdSBoYXN0IHNjaGVpbmJhciBub2NoIG5pY2h0cyBnZWxlc2VuLCB3b3JhdWYgbWFuIHNpY2ggIgorICAgICAgICAiYmV6aWVoZW4ga2Fubi5cbkdpYiBub3RmYWxscyBkaWUgTnVtbWVyIGRlcyBBcnRpa2VscyBhbi5cbiIpLDE7CisKKyAgLy8gIHByaW50ZigibGFzdHRpdGxlPSAlT1xubnVtPSVkXG4iLGxhc3R0aXRsZSxudW0pOworCisgIGlmICghcG9pbnRlcnAobWVzc2FnZXM9CisgICAgICBORVdTU0VSVkVSLT5HZXROb3Rlcyhncm91cD0obnVtP0dST1VQOmxhc3R0aXRsZVtMQVNUX0dST1VQXSkpKSkKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIlNlbHRzYW0sIGRpZSBSdWJyaWsgZ2lidCBlcyBuaWNodCBtZWhyLi4uXG4iKSwgMDsKKworICBpZiAoIXBvaW50ZXJwKG1lc3NhZ2VzKXx8IXNpemVvZihtZXNzYWdlcykpCisgICAgcmV0dXJuIHdyaXRlKCJEaWUgUnVicmlrICIrZ3JvdXArIiBpc3QgbGVlci5cbiIpLDE7CisgIGlmIChudW08MHx8c2l6ZW9mKG1lc3NhZ2VzKTxudW0pIHJldHVybgorICAgIHdyaXRlKCJFaW5lbiBBcnRpa2VsIG1pdCBOdW1tZXIgIitudW0rIiBnaWJ0IGVzIGluIFJ1YnJpayAiK2dyb3VwKworICAgICAgICAiIG5pY2h0IVxuIiksMTsKKworICBpZiAobnVtKSBudW0tLTsKKyAgZWxzZSB7CisgICAgaW50IGg7CisgICAgbnVtPS0xOworICAgIGlmIChwb2ludGVycChtZXNzYWdlcykpIHsKKyAgICAgIGZvciAoaD1zaXplb2YobWVzc2FnZXMpLTE7CisgICAgICAgICAgIChoPj0wICYmIG1lc3NhZ2VzW2hdW01fVElNRV0+PWxhc3R0aXRsZVtMQVNUX1RJTUVdKTtoLS0pIAorICAgICAgICBpZiAobWVzc2FnZXNbaF1bTV9USU1FXT09bGFzdHRpdGxlW0xBU1RfVElNRV0gJiYgCisgICAgICAgICAgICBsb3dlcl9jYXNlKG1lc3NhZ2VzW2hdW01fV1JJVEVSXSk9PQorICAgICAgICAgICAgbG93ZXJfY2FzZShsYXN0dGl0bGVbTEFTVF9XUklURVJdKSkKKyAgICAgICAgICBudW09aDsKKyAgICB9CisgICAgaWYgKG51bTwwKQorICAgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJLb25udGUgQXJ0aWtlbCBuaWNodCB3aWVkZXJmaW5kZW4sICIKKyAgICAgICAgICAiYml0dGUgZ2liIGRpZSBOdW1tZXIgYW4uXG4iKSwwOworICB9CisgIE1BSUxFUi0+ZG9fbWFpbCggcmVjLAorICAgICAgIk1QQTogIittZXNzYWdlc1tudW1dW01fVElUTEVdKyIgKCIrbWVzc2FnZXNbbnVtXVtNX1dSSVRFUl0rIikiLAorICAgICAgTWVzc2FnZTJzdHJpbmcobnVtLG1lc3NhZ2VzLE0yU19SRU1PVEUsZ3JvdXApKyJcbiIpOworICByZXR1cm4gMTsKK30KKworCisKK0hlbHBQYWdlKHN0cikgeworICBpZiAoc3RyIT0ibXBhIiYmc3RyIT0iemVpdHVuZyIpIHJldHVybiAwOworICB0aGlzX3BsYXllcigpLT5Nb3JlKHJlYWRfZmlsZShIRUxQUEFHRSkrCisgICAgICAoSVNfTEVBUk5FUihUUCkgPyByZWFkX2ZpbGUoV0laSEVMUFBBR0UpIDogIiIpKTsKKyAgcmV0dXJuIDE7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitwcm90ZWN0ZWQgdm9pZCBOb3RpZnlNb3ZlKG9iamVjdCBkZXN0LCBvYmplY3Qgb2xkZW52LCBpbnQgbWV0aG9kKSB7CisgIDo6Tm90aWZ5TW92ZShkZXN0LCBvbGRlbnYsIG1ldGhvZCk7CisKKyAgLy8gUF9SRUFEX05FV1MgYXVzIGRlbSBTcGllbGVyIGhvbGVuLgorICBpZiAob2JqZWN0cChlbnZpcm9ubWVudCgpKSAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKGVudmlyb25tZW50KCkpKSB7CisgICAgcmVhZF91bnRpbD1lbnZpcm9ubWVudCgpLT5RdWVyeVByb3AoUF9SRUFEX05FV1MpOworICB9CisKKyAgaWYgKCFtYXBwaW5ncChyZWFkX3VudGlsKSB8fCAhc2l6ZW9mKHJlYWRfdW50aWwpKQorICAgIEluaXRpYWxTdWJzY3JpcHRpb25zKCk7Cit9CisKK2ludCBHZXRUSUQobWl4ZWQgbWVzc2FnZSkgeworICBzdHJpbmcgZHVtbXk7CisgIGludCB0aWQ7CisgIHJldHVybiAoc3NjYW5mKG1lc3NhZ2VbTV9NRVNTQUdFXSwiJXMiIFNUQVRVU0VTQ0FQRSAiIHRpZD0lZCIsZHVtbXksdGlkKT09MikgCisgICAgPyB0aWQgOiBtZXNzYWdlW01fVElNRV07Cit9CisKZGlmZiAtLWdpdCBhL29iai9wbGF5ZXJkYXRhLmMgYi9vYmovcGxheWVyZGF0YS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMjcyOWIKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovcGxheWVyZGF0YS5jCkBAIC0wLDAgKzEsMTA0IEBACisvLyBEaWVzZXMgRGluZyBrcmllZ3QgZGllIFVJRCB2b20gQ2xvbmVuZGVuLgorLy8gRGVyIE1hc3RlciBleHBvcnRpZXJ0IGFsbGVyZGluZ3MgcGVyIGV4cG9ydF91aWQoKSBnZ2YuIGVpbmUgVUlEIGFuIGRpZXNlcworLy8gT2JqZWt0LgorLy8gQWJmcmFnZW4ga2FubiBlcyBudXIgZGFzIE9iamVrdCwgd2VsY2hlcyBkZW4gU3BpZWxlciBnZWxhZGVuIGhhdC4KKworI3ByYWdtYSBub19pbmhlcml0LG5vX3NoYWRvdworI3ByYWdtYSBzdHJvbmdfdHlwZXMsc2F2ZV90eXBlcyxydHRfY2hlY2tzCisKKyNpbmNsdWRlIDxjb25maWcuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKworaW5oZXJpdCAiL3N0ZC90aGluZy9wcm9wZXJ0aWVzIjsKKworb2JqZWN0fHN0cmluZyBwbDsKK29iamVjdCB1c2VyOworCitwcm90ZWN0ZWQgdm9pZCBjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworICBzZXRldWlkKDApOworICBzZXRfbmV4dF9yZXNldCgzMDApOworfQorCitwdWJsaWMgaW50IFJlbGVhc2VQbGF5ZXIoKQoreworICBwbCA9IDA7CisgIHVzZXIgPSAwOworICAvLyBEYXMgT2JqZWt0IGRhcmYga2VpbmUgRVVJRCBtZWhyIGhhYmVuLCBkYW1pdCBST09ULU9iamVrdGUgaWhtIGdnZi4gZWluZQorICAvLyBuZXVlIFVJRCBleHBvcnRpZXJlbiBrb2VubmVuLCBkYW1pdCBlcyBlaW5lbiBuZXVlbiBTcGllbGVyIGxhZGVuIGthbm4uCisgIHNldGV1aWQoMCk7CisgIHJldHVybiAxOworfQorCitwdWJsaWMgaW50IExvYWRQbGF5ZXIoc3RyaW5nIG5hbWUpCit7CisgIGlmIChxdWVyeV93aXpfbGV2ZWwoZ2V0dWlkKHByZXZpb3VzX29iamVjdCgpKSkgPCBXSVpBUkRfTFZMKQorICAgIHJldHVybiAwOworCisgIHNldGV1aWQoZ2V0dWlkKCkpOworCisgIG1peGVkIHVzZXJpbmZvPU1BU1RFUi0+Z2V0X3VzZXJpbmZvKG5hbWUpOworICBpZiAoIXBvaW50ZXJwKHVzZXJpbmZvKSkKKyAgICByZXR1cm4gMDsKKyAgLy8gV2VubiBlcyBkYXMgU3BpZWxlcm9iamVrdCBnaWJ0LCBpc3QgYWxsZXMgZ3V0LCBkYW5uIGZyYWdlbiB3aXIgZWluZmFjaAorICAvLyBkYXMuCisgIHBsID0gZmluZF9wbGF5ZXIobmFtZSkgfHwgZmluZF9uZXRkZWFkKG5hbWUpOworICBpZiAoIXBsKQorICB7CisgICAgLy8gd2VubiBuaWNodDogU2F2ZWZpbGUgZWlubGVzZW4uCisgICAgcmVzdG9yZV9vYmplY3QoIi8iU0FWRVBBVEggKyBuYW1lWzAuLjBdICsgIi8iICsgbmFtZSk7CisgICAgcGwgPSBuYW1lOworICB9CisgIHVzZXIgPSBwcmV2aW91c19vYmplY3QoKTsKKyAgc2V0X25leHRfcmVzZXQoMzAwKTsKKyAgcmV0dXJuIDE7Cit9CisKK3B1YmxpYyB2YXJhcmdzIG1peGVkIFF1ZXJ5KCBzdHJpbmcgbmFtZSwgaW50IFR5cGUgKQoreworICBpZiAoIXVzZXIgfHwgdXNlciAhPSBwcmV2aW91c19vYmplY3QoKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAob2JqZWN0cChwbCkpCisgICAgcmV0dXJuIHBsLT5RdWVyeShuYW1lLFR5cGUpOworICBlbHNlIGlmIChzdHJpbmdwKHBsKSkKKyAgICByZXR1cm4gOjpRdWVyeShuYW1lLCBUeXBlKTsKKyAgcmV0dXJuIDA7Cit9CisKK3B1YmxpYyB2YXJhcmdzIG1peGVkIFF1ZXJ5UHJvcCggc3RyaW5nIG5hbWUgKQoreworICBpZiAoIXVzZXIgfHwgdXNlciAhPSBwcmV2aW91c19vYmplY3QoKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAob2JqZWN0cChwbCkpCisgICAgcmV0dXJuIHBsLT5RdWVyeVByb3AobmFtZSk7CisgIGVsc2UgaWYgKHN0cmluZ3AocGwpKQorICAgIHJldHVybiA6OlF1ZXJ5UHJvcChuYW1lKTsKKyAgcmV0dXJuIDA7Cit9CisKKworLy8ga2VpbiBTY2hyZWlienVncmlmZgorcHVibGljIHZhcmFyZ3MgbWl4ZWQgU2V0KCBzdHJpbmcgbmFtZSwgbWl4ZWQgVmFsdWUsIGludCBUeXBlLCBpbnQgZXh0ZXJuICkKK3sKKyAgcmV0dXJuIDA7Cit9CisKK3B1YmxpYyB2b2lkIHJlc2V0KCkKK3sKKyAgaWYgKGNsb25lcCh0aGlzX29iamVjdCgpKSkKKyAgICBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKK30KKworcHVibGljIGludCBjbGVhbl91cChpbnQgcmVmKQoreworICBpZiAoY2xvbmVwKHRoaXNfb2JqZWN0KCkpCisgICAgICB8fCByZWYgPD0gMSApCisgIHsKKyAgICBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKKyAgfQorICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvb2JqL3NlZXJjYXJkLmMgYi9vYmovc2VlcmNhcmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjU0ZDc0Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3NlZXJjYXJkLmMKQEAgLTAsMCArMSwyIEBACisjcHJhZ21hIG5vX2Nsb25lCisKZGlmZiAtLWdpdCBhL29iai9zaHV0LmMgYi9vYmovc2h1dC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhODI2OTQKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovc2h1dC5jCkBAIC0wLDAgKzEsMzc3IEBACisvKiBTaHV0ZG93bi1EYWVtb24gLS0gZGllIE1lc3NhZ2VzIG11ZXNzZW4gd29obCBub2NobWFsIHVlYmVyYXJiZWl0ZXQgd2VyZGVuICovCisvKgorICogIDA0LjA0LjIwMDQgICBWYW5pb24gIGRpZSgpIHVlYmVyc2NocmllYmVuLCBpZ25vcmllcmJhciBnZW1hY2h0CisgKiAgMTUuMDEuMjAwMCAgIFRpYW1hayAgYXVmZ2VyYWV1bXQsIHNpY2hlcmVyIGdlbWFjaHQgCisgKiAgMTUuMDIuMTk5OCAgIFdhcmdvbiAgQXJtYWdlZGRvbiB0ZWlsdCBlaW5lbSBkaWUgUmVzdHplaXQgbWl0CisgKiAgMDcuMDEuMTk5OCAgICAgICAgIFJ1bWF0YSAgSVNfRUxERVIgYXVzZ2ViYXV0LgorICoKKyAqICAyMy4wNy4xOTk3ICAgICAgICAgMTcuMDAgICAgICAgICBZYW50cm8KKyAqICAgIEljaCBoYWIgbWFsIGRpZSBzaG91dHMgWmVpdGFiaGFlbmdpZyBnZW1hY2h0LCBhbHNvIHNpZSBzb2xsdGVuCisgKiAgICBoZWZ0aWdlciB3ZXJkZW4gbWl0IEFubmFlaGVydW5nIGFuIGRlbiBSZWJvb3QuIERlc3dlZ2VuIGdpYnQKKyAqICAgIGVzIG51biA0IGFycmF5cyBtaXQgbWVzc2FnZXMgdW5kIGRpZSBFbnRzcHJlY2hlbmRlIEF1ZnJ1ZmFlbmRlcnVuZworICogICAgaW4gQXJtYXNTaG91dCgpCisgKi8KKworI3ByYWdtYSBjb21iaW5lX3N0cmluZ3MKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBub19pbmhlcml0CisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIG5vX3NoYWRvdworCitpbmhlcml0ICJzdGQvbnBjIjsKKworI2RlZmluZSBTX1BSRVNBWSAxCisjZGVmaW5lIFNfSUdOT1JFIDIKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlICIvc2VjdXJlL3dpemxldmVscy5oIgorCisjZGVmaW5lIG1lc3NhZ2VzMSAoeyBcCisgICJXb2xrZW4gYmFsbGVuIHNpY2ggYW0gSGltbWVsLiBFcyBzY2hlaW50IHdvaGwgZWluIFVud2V0dGVyIGF1Znp1emllaGVuLiAiIFwKKyAgIkR1IGhhc3QgZWluIHVuZ3V0ZXMgR2VmdWVobCBpbiBEZWluZXIgSGF1dC4iLCBcCisgICJBdXMgZGVyIEZlcm5lIGhvZXJzdCBEdSBlaW4gRG9ubmVybiAuLi4gb2IgZGFzIGVpbiBHZXdpdHRlciBpc3Q/IiwgXAorICAiV29sa2VuIHppZWhlbiBzY2huZWxsIHZvcmJlaSB1bmQgdmVyZHVua2VsbiBkaWUgU29ubmUgdW5kIGRpZSBTdGVybmUuICIgXAorICAiRGllcyBzY2hlaW50IGtlaW5lcyBkZXIgbm9ybWFsZW4gVW53ZXR0ZXIgenUgc2VpbiwgZGllIER1IHNjaG9uIGVybGVidCAiIFwKKyAgImhhc3QuIiwgXAorICAiRGFzIGZlcm5lIFJhdXNjaGVuIGRlciBCYWVjaGUgdW5kIEZsdWVzc2Ugd2lyZCBsYXV0ZXIuIERpZSBXYXNzZXJtYXNzZW4gIiBcCisgICJzY2hlaW5lbiBuaWNodCBtZWhyIGtvbnRyb2xsaWVydCB6dSBmbGllc3NlbiB1bmQgRHUgYmVrb21tc3QgQW5nc3QhIiwgXAorICAiRGVyIEhpbW1lbCBmYWVyYnQgc2ljaCB2aW9sZXR0LiBEYXMgVW53ZXR0ZXIgc2NoZWludCBnZXdhbHRpZ2VyIHp1ICIgXAorICAid2VyZGVuIGFscyBzb25zdC4gRGlyIGxhZXVmdCBlaW4gU2NoYXVlciB1ZWJlciBkZW4gUnVlY2tlbi4iIFwKKyAgfSkKKworI2RlZmluZSBtZXNzYWdlczIgKHsgXAorICAiRGllIFdvbGtlbiB2ZXJkdW5rZWxuIGRlbiBIaW1tZWwuIEVzIHdpcmQgdWViZXJhbGwgZHVlc3RlciBpbiBkZXIgV2VsdCAiIFwKKyAgInVuZCBEdSBrYW5uc3Qga2F1bSBub2NoIGVya2VubmVuLCB3YXMgdW0gRGljaCBoZXJ1bSBnZXNjaGllaHQuIiwgXAorICAiRWluIHN0YXJrZXIgV2luZCB3ZWh0IGR1cmNoIGFsbGUgR2VnZW5kZW4gdW5kIHplcnJ0IGFuIGFsbGVtLCB3YXMgbmljaHQgIiBcCisgICJmZXN0IGlzdC4gSG9mZmVudGxpY2ggd2lyZCBkYXMgbmljaHQgbm9jaCBzY2hsaW1tZXIuIiwgXAorICAiUmVnZW4gcHJhc3NlbHQgdWViZXJhbGwgbmllZGVyIHVuZCBmdWVsbHQgZGllIEJhZWNoZSB1bmQgU2VlbiwgZGllIGRhcyAiIFwKKyAgIldhc3NlciBhYmVyIGthdW0gbm9jaCBoYWx0ZW4ga29lbm5lbi4gRHUgdmVyc3VjaHQgZWluZSB0cm9ja2VuZSBTdGVsbGUgIiBcCisgICJ6dSBmaW5kZW4uIiwgXAorICAiRGVyIEhpbW1lbCBpc3QgZmFzdCBzY2h3YXJ6LiBEZXIgUmVnZW4gZmFlbGx0IGluIGVpbmVyIE1lbmdlLCBhbHMgaGFldHRlbiAiIFwKKyAgImFsbGUgU2NobGV1c2VuIGRlciBXZWx0IGdlb2VmZm5ldCwgdW0gc2llIGZ1ZXIgaW1tZXIgenUgZXJ0cmFlbmtlbi4iLCBcCisgICJEaWUgTHVmdCBzY2hlaW50IHp1IGtuaXN0ZXJuISBEYXMgRW5kZSBkZXMgVW53ZXR0ZXJzIGlzdCBzaWNoZXIgbm9jaCBuaWNodCAiXAorICAiaW4gU2ljaHQuIEVsZWt0cml6aXRhZXQgZW50bGFlZHQgc2ljaCBpbSBIaW1tZWwgendpc2NoZW4gZGVuIFdvbGtlbi4gIiBcCisgICJXYXMgZnVlciBlaW4gTGljaHRzcGllbCEiLCBcCisgICJCbGl0eiB1bmQgRG9ubmVyIGhhbGxlbiBkdXJjaCBkaWUgV2VsdC4gRXMgc2NoZWludCBrZWluZSBTdGVsbGUgenUgZ2ViZW4sICIgXAorICAiYW4gZGVyIG1hbiBzaWNoZXIgc2VpbiBrYW5uLiIgXAorICB9KQorCisjZGVmaW5lIG1lc3NhZ2VzMyAoeyBcCisgICJEdSBzaWVoc3QsIHdpZSBkaWUgRWlud29obmVyIGRlciBXZWx0IHZlcnN1Y2hlbiwgc2ljaCBwYW5pc2NoIHZvciBkZW0gIiBcCisgICJVbndldHRlciB6dSByZXR0ZW4sIGFiZXIgZXMgaXN0IGZ1ZXIgc2llIHp1IHNwYWV0LiIsIFwKKyAgIkJsaXR6ZSBuaWUgZ2VzZWhlbmVyIEdld2FsdCBzY2hsYWdlbiBydW5kIHVtIERpY2ggZWluLiBGZXVlciBmbGFtbWVuIGF1ZiAiIFwKKyAgInVuZCBzY2hlaW5lbiBhbGxlcyB2ZXJicmVubmVuIHp1IHdvbGxlbiwgd2FzIHVtIERpY2ggaGVydW0gZXhpc3RpZXJ0LiIsIFwKKyAgIkRpY2tlIFdvbGtlbiB0dWVybWVuIHNpY2ggaW1tZXIgd2VpdGVyIGF1ZiB1bmQgc2NoZWluZW4gRGljaCBlcmRydWVja2VuIHp1ICJcCisgICJ3b2xsZW4uIFNpZSBzaW5kIG5pY2h0IG1laHIgc2Nod2Fyeiwgc29uZGVybiBibHV0cm90IHdpZSBkYXMgV2Fzc2VyLCB3YXMgIiBcCisgICJzaWUgdm9uIHNpY2ggZ2ViZW4uIiwgXAorICAiRGllIEZsdWVzc2UgdW5kIE1lZXJlIGRlciBXZWx0IHRyZXRlbiB1ZWJlciBpaHJlIFVmZXIgdW5kIHplcnN0b2VyZW4gYWxsZXMgIlwKKyAgIkxlYmVuLiBEYXMgV2Fzc2VyIGhhdCBzaWNoIHp1IEJsdXQgZ2V3YW5kZWx0ISBVbSBEaWNoIGhlcnVtIHdpcmQgYWxsZXMgIiBcCisgICJyb3QhIiwgXAorICAiRGVyIERvbm5lciBncm9sbHQgbWl0IHJvaGVyIEdld2FsdCBkdXJjaCBkaWUgV2VsdC4gRGllIFNjaGFsbHdlbGxlbiAiIFwKKyAgInNjaGxhZ2VuIG1pdCBhbGxlciBLcmFmdCBnZWdlbiBkaWUgR2ViaXJnZSB1bmQgc2NoZWluZW4gc2llIHJlaXplbiB6dSAiIFwKKyAgIndvbGxlbi4gRHUga3JpZWdzdCBBbmdzdCEiLCBcCisgICJEZXIgUmVnZW4gZmFlcmJ0IHNpY2ggcm90ISBEYXMgaXN0IGtlaW4gV2Fzc2VyIG1laHIsIHNvbmRlcm4gQmx1dCwgd2FzIGRhICIgXAorICAiYXVmIERpY2ggaGVyYWJyZWduZXQuIERpciBzY2h3aW5kZW4ga3VyeiBkaWUgU2lubmUgYmVpbSBHZWRhbmtlbiBhbiBkYXMsICIgXAorICAid2FzIG5vY2gga29tbWVuIG1hZy4iIFwKKyAgfSkKKworI2RlZmluZSBtZXNzYWdlczQgKHsgXAorICAiRGFzIEJsdXQgZGVzIFJlZ2VucyBzY2hlaW50IERpY2ggZm9ydHp1c2Nod2VtbWVuLiBVZWJlcmFsbCBpc3QgZGFzIEJsdXQgIiBcCisgICJ1ZWJlciBkaWUgVWZlciBnZXRyZXRlbiB1bmQgc3VjaHQgc2ljaCBzZWluZW4gdG9lZGxpY2hlbiBXZWcuIiwgXAorICAiRGllIFZ1bGthbmUgZGVyIFdlbHQgYnJlY2hlbiBhdXMgdW5kIGRpZSBMYXZhIHZlcmJyZW5udCBhbGxlcywgd2FzIHNpY2ggIiBcCisgICJpaHIgaW4gZGVuIFdlZyBzdGVsbHQuIFNpZSBicmluZ3QgZGFzIEJsdXQgenVtIFZlcmRhbXBmZW4gdW5kIGVyZnVlbGx0ICIgXAorICAiYWxsZXMgbWl0IGlocmVyIHplcnN0b2VyZXJpc2NoZW4sIGdyYXVzYW1lbiBIaXR6ZS4iLCBcCisgICJQbG9ldHpsaWNoIGlzdCBhbGxlcyBtaXQgRmV1ZXIgdW5kIEhpdHplIGVyZnVlbGx0LiBEaWUgTWVlcmUgdW5kICIgXAorICAiRmx1ZXNzZSB2ZXJkYW1wZmVuIHVuZCBkZXIgRGFtcGYgdHJlaWJ0IGhlaXNzIHVlYmVyIGRpZSBXZWx0LCB1bSBhbGxlcyAiIFwKKyAgInp1IHZlcmJydWVoZW4sIHdhcyBzaWNoIG5pY2h0IHNjaHVldHp0ISIsIFwKKyAgIlZvbiB1ZWJlcmFsbCBob2Vyc3QgRHUgU2NocmVpZSB1bmQgRHUgZXJrZW5uc3QgcGFuaXNjaGUgQW5nc3QgaW4gZGVuICIgXAorICAiQXVnZW4gZGVyIEVpbmdlYm9yZW5lbi4gRWxlbmRpZyB2ZXJlbmRlbiBzaWUgaW4gZGVyIEhpdHplIHp3aXNjaGVuIEZldWVyICIgXAorICAidW5kIExhdmEuIERpciB3aXJkIHVlYmVsLiIsIFwKKyAgIlVtIERpY2ggaGVydW0gc2llaHN0IER1IG51ciBicmVubmVuZGUgVHJ1ZW1tZXIuIERpZSBXZWx0IHNjaGVpbnQgdm9yICIgXAorICAiaWhyZW0gVW50ZXJnYW5nLCBkZW5uIHVlYmVyYWxsIG9lZmZuZXQgc2ljaCBkZXIgQm9kZW4gdW5kIHNwdWNrdCBGZXVlci4gIiBcCisgICJIZWlzc2VzIE1hZ21hIHF1aWxsdCBhdXMgaWhtIGhlcmF1cyB1bmQgbWlzY2h0IHNpY2ggemlzY2hlbmQgbWl0IGRlbSBCbHV0ICIgXAorICAiZGVyIE1lZXJlLiBFcyBnaWJ0IG51biBzaWNoZXIga2VpbiBFbnRyaW5uZW4gbWVoci4iLCBcCisgICJEdSBrYW5uc3QgRGljaCBrYXVtIG5vY2ggaGFsdGVuLiBFcmRiZWJlbiBlcnNjaHVldHRlcm4gYWxsZXMgdW0gRGljaCAiIFwKKyAgImhlcnVtLiBVZWJlcmFsbCBrYW5uc3QgRHUgbnVyIG5vY2ggVHJ1ZW1tZXIgZXJrZW5uZW4sIHdvIGVpbm1hbCBIYWV1c2VyICIgXAorICAic3RhbmRlbi4gQWxsZXMgaXN0IGVyZnVlbGx0IHZvbSBHZXJ1Y2ggZGVzIFRvZGVzISIgXAorICB9KQorCitzdGF0aWMgaW50IHJlc3R6ZWl0Oworc3RhdGljIHN0cmluZyAqaWdub3JpZXJlciA9ICh7fSk7CisKK3N0YXRpYyBpbnQgX3F1ZXJ5X3Jlc3R6ZWl0KCkgeyByZXR1cm4gcmVzdHplaXQgKyBmaW5kX2NhbGxfb3V0KCJOZXh0U3RlcCIpOyB9CitzdGF0aWMgc3RyaW5nICpfcXVlcnlfaWdub3JlKCkgeyByZXR1cm4gaWdub3JpZXJlcjsgfQorCitwdWJsaWMgdmFyYXJncyB2b2lkIGRpZShpbnQgcG9pc29uZGVhdGgsaW50IGV4dGVybikKK3sKKyAgb2JqZWN0IHRwOworICBvYmplY3Qgcm9vbTsKKworICBpZiAob2JqZWN0cChyb29tPWVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpKSkKKyAgICBpZiAoIW9iamVjdHAodHA9dGhpc19wbGF5ZXIoKSkpCisgICAgICB0ZWxsX3Jvb20ocm9vbSwiQXJtYWdlZGRvbiBrcmF0enQgc2ljaCByYXRsb3MgYW0gS29wZi5cbiIpOworICAgIGVsc2UgCisgICAgICB0ZWxsX3Jvb20ocm9vbSwKKyAgICAgICAgIkFybWFnZWRkb24gc2FndDogSWNoIHdlaWdlcmUgbWljaCwgZWluZmFjaCBzbyB6dSBzdGVyYmVuLCAiKworICAgICAgICAodHAtPk5hbWUoKSkrIi5cbiIpOworICByZXR1cm47Cit9CisKK3N0YXR1cyBhY2Nlc3NfY2hlY2soKSB7CisgICAgLy93ZXIgZGFyZiByZWJvb3Rlbj8KKworICAgIC8vaW4gZWluZW0gcHJvY2Vzc19zdHJpbmcoKSBnYXIgbmljaHQuCisgICAgaWYgKHByb2Nlc3NfY2FsbCgpKSByZXR1cm4oMCk7CisKKyAgICAvL01hc3RlciBkYXJmIG5hdHVlcmxpY2guICgtPnNsb3dfc2h1dF9kb3duKCksIHZvbSBEcml2ZXIgYmVpCisgICAgLy9TcGVpY2hlcmtuYXBwaGVpdCBnZXJ1ZmVuLikKKyAgICBpZiAocHJldmlvdXNfb2JqZWN0KCkgJiYgCisgICAgICAgIHByZXZpb3VzX29iamVjdCgpPT1maW5kX29iamVjdChfX01BU1RFUl9PQkpFQ1RfXykpCisgICAgICAgIHJldHVybigxKTsKKworICAgIC8vIHJlYm9vdGVuIGR1ZXJmZW4gYW5zb25zdGVuIG51ciBbV10rCisgICAgaWYgKCBFTERFUl9TRUNVUklUWSkgeworICAgICAgICByZXR1cm4oMSk7CisgICAgfQorCisgICAgLy9hbmRlcmUgbmljaHQuCisgICAgcmV0dXJuKDApOworfQorCitwdWJsaWMgdm9pZCBjcmVhdGUoKQoreyAgICAKKyAgICA6OmNyZWF0ZSgpOworICAgIAorICAgIFNldFByb3AoIFBfTkFNRSwgIkFybWFnZWRkb24iICk7CisgICAgU2V0UHJvcCggUF9HRU5ERVIsIE1BTEUgKTsKKyAgICBTZXRQcm9wKCBQX1NIT1JULCAiQXJtYWdlZGRvbiwgZGVyIFdlbHRlbnZlcm5pY2h0ZXIiICk7CisgICAgQWRkSWQoICJhcm1hZ2VkZG9uIiApOworICAgIHNldF9saXZpbmdfbmFtZSggImFybWFnZWRkb24iICk7CisgICAgU2V0UHJvcCggUF9BUlRJQ0xFLCAwICk7CisgICAgU2V0UHJvcCggUF9YUCwgMCApOworICAgIFNldFByb3AoIFBfTk9fQVRUQUNLLAorICAgICAgICAgICAgICJBcm1hZ2VkZG9uIGdyaW5zdDogRGVpbiBFbmRlIGtvbW10IG5vY2ggZnJ1ZWggZ2VudWchXG4iICk7CisKKyAgICBpZiAoIWFjY2Vzc19jaGVjaygpKSB7CisgICAgICAgIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworICAgICAgICByYWlzZV9lcnJvcigiQXJtYWdlZGRvbiBkYXJmIG51ciB2b24gVysgYWt0aXZpZXJ0IHdlcmRlbiEiKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZhcmFyZ3Mgc3RyaW5nIHRleHRfdGltZSggaW50IHNlYywgaW50IGZsYWcgKQoreworICAgIHN0cmluZyBzOworICAgIGludCB0YWdlLCBzdHVuZGVuLCBtaW51dGVuLCBzZWt1bmRlbjsKKworICAgIHNla3VuZGVuID0gc2VjOworICAgIHRhZ2UgPSBzZWt1bmRlbiAvIDg2NDAwOworICAgIHN0dW5kZW4gPSAoc2VrdW5kZW4gJSA4NjQwMCkgLyAzNjAwOworICAgIG1pbnV0ZW4gPSAoc2VrdW5kZW4gJSAzNjAwKSAvIDYwOworICAgIHNla3VuZGVuID0gc2VjICUgNjA7CisgICAgcyA9ICIiOworICAgIAorICAgIGlmICggc2VjID49IDg2NDAwICkKKyAgICAgICAgcyArPSB0YWdlICsgIiBUYWciICsgKHRhZ2UgPT0gMSA/ICIsICIgOiAoZmxhZyA/ICJlbiwgIiA6ICJlLCAiKSk7CisgICAgCisgICAgaWYgKCBzZWMgPj0gMzYwMCApCisgICAgICAgIHMgKz0gc3R1bmRlbiArICIgU3R1bmRlIiArIChzdHVuZGVuID09IDEgPyAiLCAiIDogIm4sICIpOworICAgIAorICAgIGlmICggc2VjID49IDYwICkKKyAgICAgICAgcyArPSBtaW51dGVuICsgIiBNaW51dGUiICsgKG1pbnV0ZW4gPT0gMSA/ICIiIDogIm4iKTsKKyAgICAKKyAgICBzICs9IChzZWMvNjAgPyAiIHVuZCAiIDogIiAiKSArIHNla3VuZGVuICsgIiBTZWt1bmRlIiArCisgICAgICAgIChzZWt1bmRlbiA9PSAxID8gIiIgOiAibiIpOworICAgIAorICAgIHJldHVybiBzOworfQorCisKK3B1YmxpYyBzdHJpbmcgX3F1ZXJ5X2xvbmcoKQoreworICAgIHJldHVybiBicmVha19zdHJpbmcoICJEaWVzIGlzdCBBcm1hZ2VkZG9uLCBkZXIgV2VsdGVudmVybmljaHRlci4gQWxzIER1ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaWhuIGFuc2llaHN0LCBibGlja3QgZXIgYXVmIHVuZCBmbHVlc3RlcnQgRGlyIHp1OiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIk5vY2ggIiArIHRleHRfdGltZShfcXVlcnlfcmVzdHplaXQoKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICIgbXVlc3NlbiB2ZXJnZWhlbiwgZWhlIGljaCBkaWUgV2VsdCB2ZXJuaWNodGUuIiwgNzggKTsKK30KKworCitwdWJsaWMgc3RyaW5nIF9xdWVyeV9zaG9ydCgpCit7CisgICAgcmV0dXJuICJBcm1hZ2VkZG9uLCBkZXIgV2VsdGVudmVybmljaHRlciI7Cit9CisKKworcHVibGljIGludCBzaHV0KCBtaXhlZCBtaW51dGVzICkKK3sKKyAgICBpbnQgYSwgYiwgYzsKKworICAgIGlmICghYWNjZXNzX2NoZWNrKCkpIHsKKyAgICAgICAgZGVzdHJ1Y3QodGhpc19vYmplY3QoKSk7CisgICAgICAgIHJhaXNlX2Vycm9yKCJBcm1hZ2VkZG9uIGRhcmYgbnVyIHZvbiBXKyBha3RpdmllcnQgd2VyZGVuISIpOworICAgICAgICByZXR1cm4oLTEpOyAgIC8vbmV2ZXIgcmVhY2hlZAorICAgIH0KKyAgICAKKyAgICBhID0gYiA9IGMgPSAwOworICAgIG1vdmUoICIvZ2lsZGVuL2FiZW50ZXVyZXIiLCBNX0dPICk7CisgICAgCisgICAgaWYgKCBpbnRwKG1pbnV0ZXMpICkKKyAgICAgICAgYyA9IG1pbnV0ZXM7CisgICAgZWxzZSBpZiAoIHN0cmluZ3AobWludXRlcykgKXsKKyAgICAgICAgaWYgKCBzc2NhbmYoIG1pbnV0ZXMsICIlZDolZDolZCIsIGEsIGIsIGMgKSA9PSAzICkKKyAgICAgICAgICAgIGMgKz0gYiAqIDYwICsgYSAqIDI0ICogNjA7CisgICAgICAgIGVsc2UgaWYoIHNzY2FuZiggbWludXRlcywgIiVkOiVkIiwgYiwgYykgPT0gMiApCisgICAgICAgICAgICBjICs9IGIgKiA2MDsKKyAgICAgICAgZWxzZSBpZiggc3NjYW5mKCBtaW51dGVzLCAiJWQiLCBjICkgIT0gMSApCisgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgZGVzdHJ1Y3QoTUUpOworICAgICAgcmFpc2VfZXJyb3IoIklsbGVnYWwgYXJndW1lbnQgdHlwZSB0byBzaHV0KClcbiIpOworICAgIH0KKworICAgIHdoaWxlICggcmVtb3ZlX2NhbGxfb3V0KCJOZXh0U3RlcCIpID49IDAgKQorICAgICAgICA7CisgICAgCisgICAgcmVzdHplaXQgPSBjICogNjA7CisgICAgY2FsbF9vdXQoICJOZXh0U3RlcCIsIDAsIHJlc3R6ZWl0ICk7CisgICAgcmV0dXJuIHJlc3R6ZWl0OworfQorCisvLyBTY2hpY2t0IGRpZSBNZWxkdW5nIHN0ciBhbiBhbGxlIFNwaWVsZXIsIGRpZSBBcm1hZ2VkZG9uIG5pY2h0IGlnbm9yaWVyZW4KKy8vIEZsYWdzOiBTX0lHTk9SRSAtIFNob3V0IGthbm4gdm9uIFNwaWVsZXJuIGlnbm9yaWVydCB3ZXJkZW4uCisvLyAgICAgICAgU19QUkVTQVkgLSBFcyB3aXJkIGVpbiAiQXJtYWdlZGRvbiBydWZ0OiIgdm9yYW5nZXN0ZWxsdC4KK3N0YXRpYyB2b2lkIFNIT1VUKCBzdHJpbmcgc3RyLCBpbnQgZmxhZ3MgKQoreworICAgaWYgKGZsYWdzJlNfUFJFU0FZKQorICAgICBzdHIgPSBicmVha19zdHJpbmcoc3RyLCA3OCwgIkFybWFnZWRkb24gcnVmdDogIik7CisgICBlbHNlCisgICAgIHN0ciA9IGJyZWFrX3N0cmluZyhzdHIsIDc4KTsKKyAgICAgCisgICBpZiAoZmxhZ3MmU19JR05PUkUpCisgICAgIGZpbHRlcigKKyAgICAgICB1c2VycygpLWZpbHRlcl9vYmplY3RzKHVzZXJzKCksIlRlc3RJZ25vcmUiLCh7ImFybWFnZWRkb24ifSkpCisgICAgICAgICAgICAgIC1tYXAoaWdub3JpZXJlciwgIydmaW5kX3BsYXllciksCisgICAgICAgIyd0ZWxsX29iamVjdCwgc3RyKTsKKyAgIGVsc2UKKyAgICAgZmlsdGVyKCB1c2VycygpLCAjJ3RlbGxfb2JqZWN0LCBzdHIpOworfQorCisKK3N0YXRpYyB2b2lkIE5leHRTdGVwKCBpbnQgc2Vjb25kcyApCit7CisgICAgaW50IG5ldTsKKworICAgIGlmICggc2Vjb25kcyA8PSAwICl7CisgICAgICAgIFNIT1VUKCAiSWNoIHN0YXJ0ZSBkYXMgU3BpZWwgamV0enQgbmV1ICEiLCBTX1BSRVNBWSk7CisgICAgICAgIHNodXRkb3duKCIiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAKKyAgICBpZiAoIHNlY29uZHMgPD0gNjAwICkKKyAgICAgIFNIT1VUKCAiVGVpbGUgbWlyIG1pdCwgd2VubiBEdSBpbiBkZW4gTGFkZW4gZ2VicmFjaHQgd2VyZGVuIHdpbGxzdCEiLCAKKyAgICAgICAgICAgICAgU19QUkVTQVl8U19JR05PUkUpOworICAgIAorICAgIGlmICggc2Vjb25kcyA+IDIgKiA4NjQwMCApCisgICAgICAgIG5ldSA9IHNlY29uZHMgLSA1ICogMzYwMDsKKyAgICBlbHNlIGlmICggc2Vjb25kcyA+IDQ4MDAgKQorICAgICAgICBuZXUgPSBzZWNvbmRzIC0gMTgwMDsKKyAgICBlbHNlCisgICAgICAgIG5ldSA9IHNlY29uZHMgKiAzIC8gNCAtIDEwOworICAgIAorICAgIHJlc3R6ZWl0ID0gbmV1OworICAgIGNhbGxfb3V0KCAiTmV4dFN0ZXAiLCBzZWNvbmRzLW5ldSwgbmV1ICk7CisgICAgCisgICAgU0hPVVQoICJJbiAiICsgdGV4dF90aW1lKCBzZWNvbmRzLCAxICkgKyAiIHdlcmRlIGljaCBkaWUgV2VsdCAiCisgICAgICAgICAgICJ6ZXJzdG9lcmVuIHVuZCBuZXUgZXJzY2hhZmZlbiEiLCBTX1BSRVNBWXxTX0lHTk9SRSk7CisgICAgCisgICAgaWYgKCBuZXUgPCA5MDAgJiYgZmluZF9jYWxsX291dCgiQXJtYXNTaG91dCIpID09IC0xICkKKyAgICAgICAgY2FsbF9vdXQoICJBcm1hc1Nob3V0IiwgcmFuZG9tKDYwKSsxMCApOworfQorCisKK3N0YXRpYyB2b2lkIEFybWFzU2hvdXQoKQoreworICAgIGludCBkYXVlcjsKKyAgICAKKyAgICBkYXVlciA9IF9xdWVyeV9yZXN0emVpdCgpOworICAgIGNhbGxfb3V0KCAiQXJtYXNTaG91dCIsIDQwK3JhbmRvbSg0MCkgKTsKKyAgICAKKyAgICBpZiAoIDcwMSA8IGRhdWVyICkKKyAgICAgICAgU0hPVVQoIG1lc3NhZ2VzMVsgcmFuZG9tKHNpemVvZihtZXNzYWdlczEpKV0sIFNfSUdOT1JFKTsKKyAgICBlbHNlIGlmICggNTAxIDwgZGF1ZXIgKQorICAgICAgICBTSE9VVCggbWVzc2FnZXMyWyByYW5kb20oc2l6ZW9mKG1lc3NhZ2VzMikpXSwgU19JR05PUkUpOworICAgIGVsc2UgaWYgKCAyNTEgPCBkYXVlciApCisgICAgICAgIFNIT1VUKCBtZXNzYWdlczNbIHJhbmRvbShzaXplb2YobWVzc2FnZXMzKSldLCBTX0lHTk9SRSk7CisgICAgZWxzZQorICAgICAgICBTSE9VVCggbWVzc2FnZXM0WyByYW5kb20oc2l6ZW9mKG1lc3NhZ2VzNCkpXSwgU19JR05PUkUpOworfQorCisKK3B1YmxpYyB2b2lkIGNhdGNoX3RlbGwoIHN0cmluZyBzdHIgKQoreworICAgIHN0cmluZyB3aG8sIHdoYXQ7CisgICAgb2JqZWN0IG9iOworCisgICAgaWYgKCBzc2NhbmYoIHN0ciwgIiVzIHRlaWx0IERpciBtaXQ6ICVzIiwgd2hvLCB3aGF0ICkgIT0gMiB8fAorICAgICAgICAgIXRoaXNfcGxheWVyKCkgKQorICAgICAgICByZXR1cm47CisgICAgCisgICAgLy8gRWluIFNwaWVsZXIgd2lsbCBmdWVyIGRpZXNlcyBSZWJvb3QgaWdub3JpZXJ0IHdlcmRlbiwgb2RlcgorICAgIC8vIGRhcyBJZ25vcmllcmUgc29sbCBhdWZnZWhvYmVuIHdlcmRlbi4KKyAgICBpZiAobG93ZXJfY2FzZSh3aGF0KVswLi48Ml09PSJydWhlIil7CisgICAgICBpZiAobWVtYmVyKGlnbm9yaWVyZXIsIGdldHVpZCh0aGlzX3BsYXllcigpKSk+LTEpCisgICAgICB7CisgICAgICAgICBpZ25vcmllcmVyIC09ICh7IGdldHVpZCh0aGlzX3BsYXllcigpKSB9KTsKKyAgICAgICAgIHRlbGxfb2JqZWN0KCB0aGlzX3BsYXllcigpLCBicmVha19zdHJpbmcoCisgICAgICAgICAgIkd1dCwgaWNoIG5vdGllcidzIG1pci4gQWIgbnVuIGhhc3QgRHUgd2llZGVyIGFtIGdyb3NzZW4gU2hvd2Rvd24gIgorICAgICAgICAgICJ0ZWlsLiBWaWVsIFNwYXNzIGRhYmVpLlxuIiwgNzgsICJBcm1hZ2VkZG9uIHRlaWx0IERpciBtaXQ6ICIpKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICBpZ25vcmllcmVyICs9ICh7IGdldHVpZCh0aGlzX3BsYXllcigpKSB9KTsKKyAgICAgICAgIHRlbGxfb2JqZWN0KCB0aGlzX3BsYXllcigpLCBicmVha19zdHJpbmcoCisgICAgICAgICAgIkd1dCwgaWNoIG5vdGllcidzIG1pci4gRGVyIFdlbHR1bnRlcmdhbmcgc29sbCBEaWNoIGJlaW0gU3BpZWxlbiAiCisgICAgICAgICAgIm5pY2h0IHdlaXRlciBzdG9lcmVuLlxuIiwgNzgsICJBcm1hZ2VkZG9uIHRlaWx0IERpciBtaXQ6ICIpKTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisgICAKKyAgICAvLyBJbiBkZW4gTGFkZW4KKyAgICBpZiAoIF9xdWVyeV9yZXN0emVpdCgpIDwgNjAwICl7CisgICAgICAgIHRoaXNfcGxheWVyKCktPm1vdmUoICIvZC9lYmVuZS9yb29tL1BvcnRWYWluL2xhZGVuIiwgTV9UUE9SVCApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIAorICAgIHRlbGxfb2JqZWN0KCB0aGlzX3BsYXllcigpLAorICAgICAgICAgICAgICAgICBicmVha19zdHJpbmcoICJFcyBpc3Qgbm9jaCB6dSBmcnVlaCEgUHJvYmllciBlcyAxMCBNaW51dGVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidm9yIGRlbSBFbmRlIG5vY2htYWwhXG5JbiAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3RpbWUoIF9xdWVyeV9yZXN0emVpdCgpLCAxICkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaXN0IGVzIHNvd2VpdCEiLCA3OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQXJtYWdlZGRvbiB0ZWlsdCBEaXIgbWl0OiAiLCAxICkgKTsKKyAgICByZXR1cm47Cit9CisKKworcHVibGljIHZhcmFyZ3MgaW50IHJlbW92ZSgpCit7CisgICAgd3JpdGUoICJBcm1hZ2VkZG9uIHdpbGwgbmljaHQgcmVtb3ZlZCB3ZXJkZW4hXG4iICk7CisgICAgcmV0dXJuIDA7Cit9CisKKworcHVibGljIGludCBkb19kYW1hZ2UoIGludCBkYW0sIG9iamVjdCBlbmVteSApCit7CisgICAgcmV0dXJuIDA7Cit9CisKKy8vIE5pY2h0IGplZGVyIE1hZ2llciBkYXJmIEFybWFnZWRkb24gZGVzdHJ1Y3Rlbi4KK3N0cmluZyBOb3RpZnlEZXN0cnVjdChvYmplY3QgY2FsbGVyKSB7CisgICAgaWYoIChjYWxsZXIhPXRoaXNfb2JqZWN0KCkgJiYgIUVMREVSX1NFQ1VSSVRZKSB8fCBwcm9jZXNzX2NhbGwoKSApIHsKKyAgICAgIHJldHVybiAiRHUgZGFyZnN0IEFybWFnZWRkb24gbmljaHQgemVyc3RvZXJlbiFcbiI7CisgICAgfQorICAgIHJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9vYmovc3BlcnJlci5jIGIvb2JqL3NwZXJyZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTk0Y2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3NwZXJyZXIuYwpAQCAtMCwwICsxLDk4IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gJElkOiBzcGVycmVyLmMgODc0NyAyMDE0LTA0LTI2IDEzOjA4OjQ3WiBaZXNzdHJhICQKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisKKyNkZWZpbmUgUE8gcHJldmlvdXNfb2JqZWN0KCkKKyNkZWZpbmUgVEkgdGhpc19pbnRlcmFjdGl2ZSgpCisKK2NyZWF0ZSgpCit7CisgIGlmIChjbG9uZXAoTUUpKQorICB7CisgICAgd3JpdGUoIkF1dG9kZXN0XG4iKTsKKyAgICBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKKyAgfQorICB1cGQoKTsKK30KKwordXBkKCkKK3sKKyAgbW92ZV9vYmplY3QoIi9yb29tL25ldHp0b3QiKTsKK30KKworZGVidWcod2hhdCxhcmcpCit7CisgIHN0cmluZyBsb2c7CisgIAorICBpZiAoIWVudmlyb25tZW50KCkpCisgICAgcmV0dXJuOworICBsb2c9c3ByaW50ZigiJXMgJXMgJU8gUE89JU8gUFBPPSVPIFRPPSVPIFRJPSVPIHZlcmI9JU9cbiIsCisgICAgICBkdGltZSh0aW1lKCkpLCB3aGF0LCBhcmcsIAorICAgICAgcHJldmlvdXNfb2JqZWN0KCksIHByZXZpb3VzX29iamVjdCgxKSwgCisgICAgICB0aGlzX29iamVjdCgpLCB0aGlzX2ludGVyYWN0aXZlKCksIAorICAgICAgKHRoaXNfaW50ZXJhY3RpdmUoKXx8dGhpc19wbGF5ZXIoKXx8dGhpc19vYmplY3QoKSktPl91bnBhcnNlZF9hcmdzKCkpOworICBsb2dfZmlsZSgiTkRFQUQiLGxvZyk7CisgIAorICBpZiAoZmluZF9wbGF5ZXIoImpvZiIpKQorICAgIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJqb2YiKSxsb2cpOworICBpZiAocHJldmlvdXNfb2JqZWN0KCkgJiYgCisgICAgICAoIWludGVyYWN0aXZlKFBPKXx8SVNfTEVBUk5FUihQTykpICYmIAorICAgICAgZ2V0dWlkKFBPKSE9Uk9PVElEICYmIFBPIT10aGlzX29iamVjdCgpKQorICB7CisgICAgbG9nX2ZpbGUoIk5ERUFEIixzcHJpbnRmKCJERUxFVEVEICVPXG4iLFBPKSk7CisgICAgY2F0Y2goUE8tPnJlbW92ZSgpKTsKKyAgICBpZiAoUE8gJiYgIShQTz09dGhpc19vYmplY3QoKSkgJiYgb2JqZWN0X25hbWUoUE8pIT0iL3NlY3VyZS9zaW11bF9lZnVuIikKKyAgICAgIGRlc3RydWN0KFBPKTsKKyAgICBpZiAoVEkgJiYgSVNfTEVBUk5FUihUSSkpCisgICAgeworICAgICAgdGVsbF9vYmplY3QoVEksIk1FU1NJTkcgV0lUSCBORVRERUFEIFJPT00gLSBTVE9QXG4iKTsKKyAgICAgIFRJLT5yZW1vdmUoKTsKKyAgICAgIGlmIChUSSkKKyAgICAgICAgZGVzdHJ1Y3QoVEkpOworICAgICAgbG9nX2ZpbGUoIk5ERUFEIixzcHJpbnRmKCJTVE9QUEVEICVPXG4iLFRJKSk7CisgICAgfQorICAgIHJhaXNlX2Vycm9yKCJET05UIE1FU1MgV0lUSCBORVRERUFEXG4iKTsKKyAgfQorICBlbHNlIGlmICggcHJldmlvdXNfb2JqZWN0KCkgJiYgaW50ZXJhY3RpdmUocHJldmlvdXNfb2JqZWN0KCkpICl7CisgICAgICB0ZWxsX29iamVjdCggcHJldmlvdXNfb2JqZWN0KCksICJXaWUgYmlzdCBEdSBkZW5uIGhpZXJoaW4gZ2Vrb21tZW4/XG4iCisgICAgICAgICAgICAgICAgICAgIkljaCBzZXR6IERpY2ggYmVzc2VyIG1hbCBpbiBkZXIgQWJlbnRldXJlcmdpbGRlIGFiLlxuIiApOworICAgICAgcHJldmlvdXNfb2JqZWN0KCktPm1vdmUoICIvZ2lsZGVuL2FiZW50ZXVyZXIiLCBNX0dPfE1fTk9DSEVDSyApOworICAgICAgbG9nX2ZpbGUoICJOREVBRCIsIHNwcmludGYoICJNT1ZFRCAlT1xuIiwgcHJldmlvdXNfb2JqZWN0KCkgKSApOworICB9Cit9CisKK3Jlc2V0KCkKK3sKKyAgdXBkKCk7Cit9CisKK2lkKHN0cikKK3sKKyAgZGVidWcoImlkIixzdHIpOworfQorCitRdWVyeSh3aGF0KQoreworICBkZWJ1ZygicXVlcnkiLHdoYXQpOworfQorCityZW1vdmUoKQoreworICBkZWJ1ZygicmVtb3ZlIiwwKTsKK30KKworbG9uZygpCit7CisgIGRlYnVnKCJsb25nIiwwKTsKK30KKworc2hvcnQoKQoreworICBkZWJ1Zygic2hvcnQiLDApOworfQpkaWZmIC0tZ2l0IGEvb2JqL3RlYW0uYyBiL29iai90ZWFtLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMxOWY1ZQotLS0gL2Rldi9udWxsCisrKyBiL29iai90ZWFtLmMKQEAgLTAsMCArMSwxNDMyIEBACisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzCisjcHJhZ21hIG5vX3NoYWRvdworLy8gVE9ETzogTW9yZ290aCBlcmJ0IGRhcyBUZWFtb2JqZWt0OiBrbGFlcmVuIHdhcnVtIHVuZCB3aWVzbyBlaWdlbnRsaWNoLgorLy8jcHJhZ21hIG5vX2luaGVyaXQKKyNwcmFnbWEgcGVkYW50aWMKKworI2luY2x1ZGUgPGxpdmluZy90ZWFtLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8bmV3X3NraWxscy5oPgorI2luY2x1ZGUgPGFuc2kuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNkZWZpbmUgTUUgdGhpc19vYmplY3QoKQorI2RlZmluZSBQTyBwcmV2aW91c19vYmplY3QoKQorI2RlZmluZSBUUCB0aGlzX3BsYXllcigpCisjZGVmaW5lIFRJIHRoaXNfaW50ZXJhY3RpdmUoKQorCisjZGVmaW5lIEFVVE9JTkZfSFBfTUlOVVMgMHgwMQorI2RlZmluZSBBVVRPSU5GX0hQX1BMVVMgIDB4MDIKKyNkZWZpbmUgQVVUT0lORl9TUF9NSU5VUyAweDA0CisjZGVmaW5lIEFVVE9JTkZfU1BfUExVUyAgMHgwOAorI2RlZmluZSBBVVRPSU5GX0lOU1RBTlQgIDB4MTAKKworcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBpc19tZW1iZXI7ICAgLy8gVGVhbW1pdGdsaWVkZXIKK3ByaXZhdGUgbm9zYXZlIG9iamVjdCBsZWFkZXI7ICAgICAgIC8vIFRlYW1sZWl0ZXIKK3ByaXZhdGUgbm9zYXZlIHN0cmluZyB0bmFtZTsgICAgICAgIC8vIFRlYW1uYW1lCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIHdhbnRlZF9yb3c7ICAvLyBHZXd1ZW5zY2h0ZSBSZWloZQorcHJpdmF0ZSBub3NhdmUgbWFwcGluZyB3aW1weV9yb3c7ICAgLy8gRmx1Y2h0cmVpaGUKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgYWN0X3JvdzsgICAgIC8vIEFrdHVlbGxlIFJlaWhlCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIGF1dG9mb2xsb3c7ICAvLyBTcGllbGVyIGZvbGd0IFRlYW1sZWl0ZXIKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgYXR0YWNrX2NtZDsgIC8vIFNwaWVsZXIgaGF0IEFuZ3JpZmZzYmVmZWhsCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIGFzc29jX21lbTsgICAvLyBadWdlb3JkbmV0ZSBNaXRnbGllZGVyIChLYW1wZiBOUENzKQorcHJpdmF0ZSBub3NhdmUgaW50ICpmb3JtaW4sKmZvcm1heDsgLy8gRm9ybWF0aW9uCitwcml2YXRlIG5vc2F2ZSBtaXhlZCAqcm93czsgICAgICAgICAvLyBEaWUgUmVpaGVuCitwcml2YXRlIG5vc2F2ZSBpbnQgbGFzdF9yZW9yZGVyOyAgICAvLyBMZXR6dGUgRm9ybWF0aW9uc3BydWVmdW5nCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIGg7ICAgICAgICAgICAvLyBTb3J0aWVyLVNjb3JlOiAxMjUqRy5SZWloZS1IUAorcHJpdmF0ZSBub3NhdmUgb2JqZWN0ICphdHRfZXhlYzsgICAgLy8gTWl0Z2xpZWRlciwgZGllIEF0dGFja2UgYXVzZnVlaHJlbi4KK3ByaXZhdGUgbm9zYXZlIG9iamVjdCAqbWlzX2F0dGFja2VkOy8vIChFeC0pTWl0Z2xpZWRlciBvaG5lIEJlZ3J1ZXNzdW5nc3NjaGxhZworcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBtaXNfaW5pdF9hdHQ7Ly8gRmVobGVuZGUgQmVncnVlc3N1bmdzc2NobGFlZ2UKK3ByaXZhdGUgbm9zYXZlIG1hcHBpbmcgaHBfaW5mbzsgICAgIC8vIEhQLCBNQVhfSFAsIFNQLCBNQVhfU1AKK3ByaXZhdGUgbm9zYXZlIGludCBhdXRvaW5mX2ZsYWdzOworcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBhdXRvaW5mX2hwOworcHJpdmF0ZSBub3NhdmUgbWFwcGluZyBhdXRvaW5mX3NwOworcHJpdmF0ZSBub3NhdmUgaW50IGF1dG9pbmZfdGltZTsKK3ByaXZhdGUgbm9zYXZlIHN0cmluZyAqaGlzdDsKKworcHJpdmF0ZSBub3NhdmUgb2JqZWN0IGRlYnVnZ2VyOworCit2b2lkIF9zZXRfZGVidWcoKSB7CisgIGlmICghZGVidWdnZXIgJiYgSVNfTEVBUk5FUihUSSkpCisgICAgZGVidWdnZXI9VEk7CisgIGVsc2UgaWYgKGRlYnVnZ2VyPT1USSkKKyAgICBkZWJ1Z2dlcj0wOworfQorIAorcHJpdmF0ZSB2b2lkIGRlYnVnKHN0cmluZyBzdHIpIHsKKyAgaWYgKG9iamVjdHAoZGVidWdnZXIpICYmIHN0cmluZ3Aoc3RyKSkKKyAgICB0ZWxsX29iamVjdChkZWJ1Z2dlciwiI1RFQU06ICIrc3RyKTsKK30KKwordm9pZCBjcmVhdGUoKSB7CisgIGF1dG9pbmZfZmxhZ3M9MDsKKyAgYXV0b2luZl9zcD0oW10pOworICBhdXRvaW5mX2hwPShbXSk7CisgIGlzX21lbWJlcj0oW10pOworICBsZWFkZXI9MDsKKyAgd2FudGVkX3Jvdz0oW10pOworICBhY3Rfcm93PShbXSk7CisgIHdpbXB5X3Jvdz0oW10pOworICBhdXRvZm9sbG93PShbXSk7CisgIGF0dGFja19jbWQ9KFtdKTsKKyAgYXNzb2NfbWVtPShbXSk7CisgIGZvcm1pbj0oezEsMCwwLDAsMH0pOworICBmb3JtYXg9KHs1LDQsMywyLDF9KTsKKyAgcm93cz1FTVBUWV9URUFNQVJSQVk7CisgIGg9KFtdKTsKKyAgYXR0X2V4ZWM9KHt9KTsKKyAgbWlzX2luaXRfYXR0PShbXSk7CisgIG1pc19hdHRhY2tlZD0oe30pOworICBocF9pbmZvPShbXSk7CisgIGhpc3Q9KHt9KTsKKyAgaWYgKG9iamVjdF9uYW1lKE1FKT09VEVBTV9PQkpFQ1QpCisgICAgcmV0dXJuOworICBpZiAoIXN0cmluZ3AodG5hbWU9VEVBTV9NQVNURVItPlJlZ2lzdGVyVGVhbSgpKSkKKyAgICB0bmFtZT0iPyI7Cit9CisKK29iamVjdCAqTWVtYmVycygpIHsKKyAgcmV0dXJuIChtX2luZGljZXMoaXNfbWVtYmVyKS0oezB9KSk7Cit9CisKK29iamVjdCBMZWFkZXIoKSB7CisgIHJldHVybiBsZWFkZXI7Cit9CisKK3ZhcmFyZ3Mgc3RyaW5nIG5hbWUoaW50IGNhc3VzLCBpbnQgZGVtb24pIHsKKyAgaWYgKCFzdHJpbmdwKHRuYW1lKSkKKyAgICByZXR1cm4gIlRlYW0gPyI7CisgIHJldHVybiAiVGVhbSAiK2NhcGl0YWxpemUodG5hbWUpOworfQorCit2YXJhcmdzIHN0cmluZyBOYW1lKGludCBjYXN1cywgaW50IGRlbW9uKSB7CisgIHJldHVybiBuYW1lKGNhc3VzLGRlbW9uKTsKK30KKwordmFyYXJncyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpIHsKKyAgaWYgKG1hcHBpbmdwKGlzX21lbWJlcikgJiYgc2l6ZW9mKE1lbWJlcnMoKSkpIC8vIE51ciBsZWVyZSBUZWFtcyByZW1vdmVuCisgICAgcmV0dXJuIDA7CisgIFRFQU1fTUFTVEVSLT5VbnJlZ2lzdGVyVGVhbSgpOyAvLyBUZWFtbmFtZW4gZnJlaWdlYmVuLgorICBkZXN0cnVjdChNRSk7CisgIHJldHVybiAxOworfQorCitwcml2YXRlIHZvaWQgVHJ5UmVtb3ZlKCkgeworICBpZiAoY2xvbmVwKE1FKQorICAgICAgJiYgKCFtYXBwaW5ncChpc19tZW1iZXIpIHx8ICFzaXplb2YoTWVtYmVycygpKSkKKyAgICAgICYmICFmaXJzdF9pbnZlbnRvcnkoTUUpCisgICAgICAmJiBmaW5kX2NhbGxfb3V0KCJyZW1vdmUiKTwwKQorICAgIGNhbGxfb3V0KCJyZW1vdmUiLDApOworfQorCitpbnQgQ21wRmlyc3RBcnJheUVsZW1lbnQobWl4ZWQgKmEsIG1peGVkICpiKSB7CisgIHJldHVybihhWzBdPGJbMF0pOworfQorCit2YXJhcmdzIHByaXZhdGUgdm9pZCBndGVsbChzdHJpbmcgc3RyLCBzdHJpbmcgd2hvLCBpbnQgdG9oaXN0KSB7CisgIGludCBpOworICBvYmplY3QgKnRtZW1iZXJzLHJvY2h1czsKKyAgc3RyaW5nIHByZWZpeCxtc2c7CisKKyAgdG1lbWJlcnM9TWVtYmVycygpOworICBwcmVmaXg9c3ByaW50ZigiWyVzOiVzXSAiLG5hbWUoKSxzdHJpbmdwKHdobyk/d2hvOiIiKTsKKyAgbXNnPWJyZWFrX3N0cmluZyhzdHIsNzgscHJlZml4KTsKKyAgZm9yIChpPXNpemVvZih0bWVtYmVycyktMTtpPj0wO2ktLSkKKyAgICB0ZWxsX29iamVjdCh0bWVtYmVyc1tpXSxtc2cpOworICBpZiAob2JqZWN0cChyb2NodXM9ZmluZF9wbGF5ZXIoInJvY2h1cyIpKQorICAgICAgJiYgcm9jaHVzLT5RdWVyeVByb3AoImRlYnVnX3RlYW0iKSkKKyAgICB0ZWxsX29iamVjdChyb2NodXMsbXNnKTsKKyAgaWYgKHRvaGlzdCkKKyAgICBoaXN0PShoaXN0Kyh7YnJlYWtfc3RyaW5nKHN0cisiIDwiK2N0aW1lKClbMTEuLjE1XSsiPiIsNzgscHJlZml4KX0pKVstMTAwLi5dOworfQorCitpbnQgSXNNZW1iZXIob2JqZWN0IG9iKSB7CisgIHJldHVybiAob2JqZWN0cChvYikgJiYgaXNfbWVtYmVyW29iXSk7Cit9CisKK2ludCBJc0ludGVyYWN0aXZlTWVtYmVyKG9iamVjdCBvYikgeworICByZXR1cm4gKG9iamVjdHAob2IpICYmIGlzX21lbWJlcltvYl0gJiYgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikpOworfQorCit2YXJhcmdzIHByaXZhdGUgaW50ICpHZXRIcEluZm8ob2JqZWN0IG9iLCBjbG9zdXJlIGNsKSB7CisgIGludCAqcmVzOworCisgIGlmICghY2xvc3VyZXAoY2wpKSBjbD1zeW1ib2xfZnVuY3Rpb24oIlF1ZXJ5UHJvcCIsb2IpOworICBpZiAoIXBvaW50ZXJwKHJlcz1ocF9pbmZvW29iXSkgfHwgc2l6ZW9mKHJlcyk8NCkKKyAgICByZXM9KHswLGZ1bmNhbGwoY2wsUF9NQVhfSFApLDAsZnVuY2FsbChjbCxQX01BWF9TUCl9KTsKKyAgcmVzWzBdPWZ1bmNhbGwoY2wsUF9IUCk7CisgIHJlc1syXT1mdW5jYWxsKGNsLFBfU1ApOworICByZXR1cm4gaHBfaW5mb1tvYl09cmVzOworfQorCitpbnQgQ29tcGFyZUhwKG9iamVjdCBhLCBvYmplY3QgYikgeworICByZXR1cm4gaFthXT5oW2JdOworfQorCisvLyBBa3R1YWxpc2llcnQgYWN0X3JvdyAoLT53ZXIgc3RlaHQgaW4gd2VsY2hlciBSZWloZSkuCitwcml2YXRlIHZvaWQgVXBkYXRlQWN0Um93KCkgeworICBpbnQgaSxqLHVwZGF0ZV9ocDsKKyAgb2JqZWN0ICpuZXc7CisgIG1peGVkIGFzbzsKKworICBhY3Rfcm93PShbXSk7CisgIHJvd3NbMF0rPU1lbWJlcnMoKTsKKyAgdXBkYXRlX2hwPTA7CisgIGlmICghbWFwcGluZ3AoaCkpIHsKKyAgICBoPShbXSk7CisgICAgdXBkYXRlX2hwPTE7CisgIH0KKyAgZm9yIChpPU1BWF9URUFNUk9XUy0xO2k+PTA7aS0tKSB7CisgICAgbmV3PSh7fSk7CisgICAgZm9yZWFjaChvYmplY3Qgb2I6IHJvd3NbaV0pIHsKKyAgICAgIGlmIChvYmplY3RwKG9iKSAmJiBpc19tZW1iZXJbb2JdICYmICFhY3Rfcm93W29iXSkgeworICAgICAgICBhY3Rfcm93W29iXT1pKzE7CisgICAgICAgIG5ldys9KHtvYn0pOworICAgICAgICBpZiAodXBkYXRlX2hwKSB7CisgICAgICAgICAgaWYgKCFvYmplY3RwKGFzbz1hc3NvY19tZW1bb2JdKSB8fCBlbnZpcm9ubWVudChhc28pIT1lbnZpcm9ubWVudChvYikpCisgICAgICAgICAgICBhc289b2I7CisgICAgICAgICAgaFtvYl09CisgICAgICAgICAgICAxMDAwKndhbnRlZF9yb3dbYXNvXQorICAgICAgICAgICAgKzQwKmFjdF9yb3dbYXNvXQorICAgICAgICAgICAgLShxdWVyeV9vbmNlX2ludGVyYWN0aXZlKGFzbyk/ODoyKSphc28tPlF1ZXJ5UHJvcChQX0hQKQorICAgICAgICAgICAgLXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2IpOworICAgICAgICAgIC8vIE5QQ3MgYmVrb21tZW4gZmFzdCBnbGVpY2hlbiBXZXJ0IHdpZSBDYXN0ZXIsCisgICAgICAgICAgLy8gaW0gWndlaWZlbHNmYWxsZSBzdGVodCBkZXIgQ2FzdGVyIHdlaXRlciB2b3JuZS4uLgorICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIHJvd3NbaV09c29ydF9hcnJheShuZXcsIkNvbXBhcmVIcCIsTUUpOworICB9Cit9CisKK3ByaXZhdGUgdm9pZCBDaGVja0Zvcm1hdGlvbigpIHsKKyAgaW50IGksbWluY2FwLG1heGNhcCxkLG51bTsKKworICBtaW5jYXA9bWF4Y2FwPTA7CisgIGlmIChmb3JtaW5bMF08MSkKKyAgICBmb3JtaW5bMF09MTsKKyAgCisgIC8vIGVyc3RtYWwgZGllIFd1ZW5zY2hlIG5vcm1hbGlzaWVyZW4va29ycmlnaWVyZW4gYXVmIHNpbm52b2xsZSBXZXJ0ZS4KKyAgZm9yIChpPTA7aTxNQVhfVEVBTVJPV1M7aSsrKSB7CisgICAgaWYgKGZvcm1pbltpXTwwKSBmb3JtaW5baV09MDsKKyAgICBpZiAoZm9ybWF4W2ldPGZvcm1pbltpXSkgZm9ybWF4W2ldPWZvcm1pbltpXTsKKyAgICBpZiAoZm9ybWF4W2ldPk1BWF9URUFNX1JPV0xFTikgZm9ybWF4W2ldPU1BWF9URUFNX1JPV0xFTjsKKyAgICBpZiAoZm9ybWluW2ldPmZvcm1heFtpXSkgZm9ybWluW2ldPWZvcm1heFtpXTsKKyAgICBtaW5jYXArPWZvcm1pbltpXTsgLy8gU3VtbWUgZGVyIG1pbi4gamUgUmVpaGUgZ2V3dWVuc2NodGVuLgorICAgIG1heGNhcCs9Zm9ybWF4W2ldOyAvLyBTdW1tZSBkZXIgbWF4LiBqZSBSZWloZSBnZXd1ZW5zY2h0ZW4uCisgIH0KKworICBudW09c2l6ZW9mKE1lbWJlcnMoKSk7CisKKyAgLy8gbWF4LiBnZXd1ZW5zY2h0ZSBSZWloZW5sYWVuZ2UgdmVybGFlbmdlcm4sIHdlbm4gZGllIFN1bW1lIGRlciBtYXhpbWFsIGplCisgIC8vIFJlaWhlIGdld3VlbnNjaHRlbiBrbGVpbmVyIGFscyBkaWUgQW56YWhsIGRlciBTcGllbGVyIGlzdC4gVm9uIHZvcm5lCisgIC8vIG5hdHVlcmxpY2guCisgIGQ9bnVtLW1heGNhcDsKKyAgZm9yIChpPTA7aTxNQVhfVEVBTVJPV1M7aSsrKSB7CisgICAgaWYgKGQ8PTApCisgICAgICBicmVhazsKKyAgICBkLT0oTUFYX1RFQU1fUk9XTEVOLWZvcm1heFtpXSk7CisgICAgZm9ybWF4W2ldPU1BWF9URUFNX1JPV0xFTjsKKyAgICBpZiAoZDwwKQorICAgICAgZm9ybWF4W2ldKz1kOyAgLy8gZG9jaCBub2NoIHdhcyB1ZWJyaWcsIHdpZWRlciBhbmhhZW5nZW4uIAorICB9CisgIC8vIG1pbi4gZ2V3dWVuc2NodGUgUmVpaGVubGFlbmdlIGF1ZiAwIHZlcmt1ZXJ6ZW4sIHdlbm4gZGllIFN1bW1lIGRlcgorICAvLyBtaW5pbWFsIGplIFJlaWhlIGdld3VlbnNjaHRlbiBncm9lc3NlciBhbHMgZGllIEFuemFobCBkZXIgU3BpZWxlciBpc3QuCisgIC8vIFZvbiBoaW50ZW4gbmF0dWVybGljaC4KKyAgZD1taW5jYXAtbnVtOyAvLyAKKyAgZm9yIChpPU1BWF9URUFNUk9XUy0xO2k+PTA7aS0tKSB7CisgICAgaWYgKGQ8PTApCisgICAgICBicmVhazsKKyAgICBkLT1mb3JtaW5baV07CisgICAgZm9ybWluW2ldPTA7CisgICAgaWYgKGQ8MCkKKyAgICAgIGZvcm1pbltpXS09ZDsgLy8gZG9jaCBub2NoIHdhcyB1ZWJyaWcsIHdpZWRlciBhbmhhZW5nZW4uCisgIH0KK30KKworcHJpdmF0ZSB2b2lkIE1ha2VGb3JtYXRpb24oKSB7CisgIC8vIFZlcmxlZ3VuZ3NzdHJhdGVnaWU6CisgIC8vICAgIFJpY2h0dW5nIFRlc3QgVmVyc2NoaWViZW4KKyAgLy8gMS4gLS0tLS0+IGEpIE1BWCAgICAgICAgICA8LSBYCisgIC8vICAgICAgICAgICBiKSBNQVggICAgICAgICAgICAgWCAtPgorICAvLyAgICAgICAgICAgYykgTUlOICAgICAgICAgICAgIFggPC0gPC0gPC0gPC0KKyAgLy8gMi4gPC0tLS0tIGEpIE1JTiAtPiAtPiAtPiAtPiBYCisgIC8vICAgICAgICAgICBiKSBNQVggICAgICAgICAgPC0gWAorICBpbnQgaSxqLGQ7CisKKyAgbGFzdF9yZW9yZGVyPXRpbWUoKTsKKyAgVXBkYXRlQWN0Um93KCk7CisgIENoZWNrRm9ybWF0aW9uKCk7CisgIGZvciAoaT0wO2k8TUFYX1RFQU1ST1dTO2krKykgeworICAgIGQ9c2l6ZW9mKHJvd3NbaV0pOworICAgIGlmIChkPGZvcm1pbltpXSB8fCBkPmZvcm1heFtpXSkKKyAgICAgIGJyZWFrOworICB9CisgIGlmIChpPj1NQVhfVEVBTVJPV1MpCisgICAgcmV0dXJuOyAvLyBGb3JtYXRpb24gaXN0IG5vY2ggaW4gT3JkbnVuZworCisgIGZvciAoaT0wO2k8TUFYX1RFQU1ST1dTO2krKykgeworICAgIGlmIChzaXplb2Yocm93c1tpXSk+Zm9ybWF4W2ldKSB7ICAgICAvLyBSZWloZSBpc3QgenUgdm9sbAorICAgICAgaWYgKGk+MCkgeworICAgICAgICBkPWZvcm1heFtpLTFdLXNpemVvZihyb3dzW2ktMV0pOworICAgICAgICBpZiAoZD4wKSB7ICAgICAgICAgICAgICAgICAgICAgICAvLyBSZWloZSB2b3JoZXIgaGF0IGQgZnJlaWUgUGxhZXR6ZQorICAgICAgICAgIHJvd3NbaS0xXSs9cm93c1tpXVswLi4oZC0xKV07ICAvLyBBbHNvIGQgTWl0Z2xpZWRlciBhYmdlYmVuCisgICAgICAgICAgcm93c1tpXT1yb3dzW2ldW2QuLl07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGlmIChpPE1BWF9URUFNUk9XUy0xICYmIHNpemVvZihyb3dzW2ldKT5mb3JtYXhbaV0pIHsvLyBJbW1lciBub2NoIHp1IHZvbGwKKyAgICAgICAgcm93c1tpKzFdPXJvd3NbaV1bZm9ybWF4W2ldLi5dK3Jvd3NbaSsxXTsgICAgICAgICAvLyBSZXN0IG5hY2ggaGludGVuLgorICAgICAgICByb3dzW2ldPXJvd3NbaV1bMC4uKGZvcm1heFtpXS0xKV07CisgICAgICB9CisgICAgICBjb250aW51ZTsgLy8gV2FyIHp1IHZvbGwsIGthbm4gbmljaHQgenUgbGVlciBzZWluCisgICAgfQorICAgIGZvciAoaj1pKzE7ajxNQVhfVEVBTVJPV1M7aisrKSB7CisgICAgICBkPWZvcm1pbltpXS1zaXplb2Yocm93c1tpXSk7CisgICAgICBpZiAoZDw9MCkgICAgICAgICAgICAgICAgICAgLy8gQXVzcmVpY2hlbmRlIEFuemFobAorICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgIC8vIGtlaW4gd2VpdGVyZXMgaiBub2V0aWcKKyAgICAgIHJvd3NbaV0rPXJvd3Nbal1bMC4uKGQtMSldOyAvLyBTb25zdCBOYWNoc2NodWIgdm9uIGhpbnRlbiBob2xlbgorICAgICAgcm93c1tqXT1yb3dzW2pdW2QuLl07CisgICAgfQorICB9CisgIGZvciAoaT1NQVhfVEVBTVJPV1MtMTtpPjA7aS0tKSB7CisgICAgZm9yIChqPWktMTtqPj0wO2otLSkgeworICAgICAgZD1mb3JtaW5baV0tc2l6ZW9mKHJvd3NbaV0pOworICAgICAgaWYgKGQ8PTApICAgICAgICAgICAgICAgICAgIC8vIEF1c3JlaWNoZW5kZSBBbnphaGwKKyAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAvLyBrZWluIHdlaXRlcmVzIGogbm9ldGlnCisgICAgICByb3dzW2ldKz1yb3dzW2pdWzAuLihkLTEpXTsgLy8gU29uc3QgTmFjaHNjaHViIHZvbiB2b3JuZSBob2xlbgorICAgICAgcm93c1tqXT1yb3dzW2pdW2QuLl07CisgICAgfQorICAgIGQ9c2l6ZW9mKHJvd3NbaV0pLWZvcm1heFtpXTsKKyAgICBpZiAoZD4wKSB7CisgICAgICByb3dzW2ktMV0rPXJvd3NbaV1bMC4uKGQtMSldOyAvLyBVZWJlcnNjaHVzcyBuYWNoIHZvcm5lIHNjaGllYmVuCisgICAgICByb3dzW2ldPXJvd3NbaV1bZC4uXTsKKyAgICB9CisgIH0KKyAgVXBkYXRlQWN0Um93KCk7Cit9CisKK3ByaXZhdGUgdm9pZCBSZW1vdmVGcm9tUm93KG9iamVjdCBvYiwgaW50IHNyYykgeworICBpZiAoc3JjPDAgfHwgc3JjPj1NQVhfVEVBTVJPV1MpCisgICAgcmV0dXJuOworICByb3dzW3NyY10tPSh7b2J9KTsKKyAgaWYgKHNpemVvZihyb3dzW3NyY10pPj1mb3JtaW5bc3JjXSkKKyAgICByZXR1cm47CisgIC8vIEZhbGxzIGhpbnRlbiBub2NoIFVlYmVyc2NodXNzIGRhIGlzdCwgaGVyIGRhbWl0LgorICBpZiAoc3JjPE1BWF9URUFNUk9XUy0xICYmIHNpemVvZihyb3dzW3NyYysxXSktMT49Zm9ybWluW3NyYysxXSkgeworICAgIHJvd3Nbc3JjXSs9cm93c1tzcmMrMV1bMC4uMF07CisgICAgcm93c1tzcmMrMV09cm93c1tzcmMrMV1bMS4uXTsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gRmFsbHMgdm9ybmUgbm9jaCBVZWJlcnNjaHVzcyBkYSBpc3QsIGhlciBkYW1pdC4KKyAgaWYgKHNyYz4wICYmIHNpemVvZihyb3dzW3NyYy0xXSktMT49Zm9ybWluW3NyYy0xXSkgeworICAgIHJvd3Nbc3JjXT1yb3dzW3NyYy0xXVs8MS4uXStyb3dzW3NyY107CisgICAgcm93c1tzcmMtMV09cm93c1tzcmMtMV1bMC4uPDJdOworICB9Cit9CisKK3ByaXZhdGUgdm9pZCBBZGRUb1JvdyhvYmplY3Qgb2IsIGludCBkZXN0KSB7CisgIGlmIChkZXN0PDAgfHwgZGVzdD49TUFYX1RFQU1ST1dTKQorICAgIHJldHVybjsKKyAgcm93c1tkZXN0XSs9KHtvYn0pOworICBpZiAoc2l6ZW9mKHJvd3NbZGVzdF0pPD1mb3JtYXhbZGVzdF0pCisgICAgcmV0dXJuOworICAvLyBGYWxscyB2b3JuZSBub2NoIGplbWFuZCBoaW4ga2FubiwgZG9ydGhpbgorICBpZiAoZGVzdD4wICYmIHNpemVvZihyb3dzW2Rlc3QtMV0pKzE8PWZvcm1heFtkZXN0LTFdKSB7CisgICAgcm93c1tkZXN0LTFdKz1yb3dzW2Rlc3RdWzAuLl07CisgICAgcm93c1tkZXN0XT1yb3dzW2Rlc3RdWzEuLl07CisgICAgcmV0dXJuOworICB9CisgIC8vIEZhbGxzIGhpbnRlbiBub2NoIGplbWFuZCBoaW4ga2FubiwgZG9ydGhpbgorICBpZiAoZGVzdDxNQVhfVEVBTVJPV1MtMSAmJiBzaXplb2Yocm93c1tkZXN0KzFdKSsxPD1mb3JtYXhbZGVzdCsxXSkgeworICAgIC8vIERlc3Q6ICh7Li4uIDwzLCA8Miwgb2J9KTsKKyAgICByb3dzW2Rlc3QrMV09cm93c1tkZXN0XVs8Mi4uPDJdK3Jvd3NbZGVzdCsxXTsKKyAgICByb3dzW2Rlc3RdPXJvd3NbZGVzdF1bMC4uPDNdKyh7b2J9KTsKKyAgfQorfQorCitwcml2YXRlIHZvaWQgQ3ljbGVSb3dzKG9iamVjdCBvYiwgaW50IHNyYywgaW50IGRlc3QpIHsKKyAgaW50IGk7CisKKyAgaWYgKHNyYzwwIHx8IHNyYz49TUFYX1RFQU1ST1dTIHx8IGRlc3Q8MCB8fCBkZXN0Pj1NQVhfVEVBTVJPV1MpCisgICAgcmV0dXJuOworICByb3dzW3NyY10tPSh7b2J9KTsKKyAgaWYgKHNpemVvZihyb3dzW3NyY10pPGZvcm1pbltzcmNdIHx8IHNpemVvZihyb3dzW2Rlc3RdKT49Zm9ybWF4W2Rlc3RdKSB7CisgICAgaWYgKHNyYzxkZXN0KSB7ICAgICAgICAgICAgIC8vICg8LSAtWCkgPC0gPC0gPC0gPC0gKCtYIDwtKQorICAgICAgZm9yIChpPXNyYysxO2k8PWRlc3Q7aSsrKSB7CisgICAgICAgIHJvd3NbaS0xXSs9cm93c1tpXVswLi4wXTsKKyAgICAgICAgcm93c1tpXT1yb3dzW2ldWzEuLl07CisgICAgICB9CisgICAgfSBlbHNlIGlmIChzcmM+ZGVzdCkgeyAgICAgICAgICAgLy8gKC0+ICtYKSAtPiAtPiAtPiAtPiAoLVggLT4pCisgICAgICBmb3IgKGk9c3JjLTE7aT49ZGVzdDtpLS0pIHsKKyAgICAgICAgcm93c1tpKzFdPXJvd3NbaV1bPDEuLl0rcm93c1tpKzFdOworICAgICAgICByb3dzW2ldPXJvd3NbaV1bMC4uPDJdOworICAgICAgfQorICAgIH0KKyAgfQorICBpZiAoc3JjPD1kZXN0KQorICAgIHJvd3NbZGVzdF0rPSh7b2J9KTsKKyAgZWxzZQorICAgIHJvd3NbZGVzdF09KHtvYn0pK3Jvd3NbZGVzdF07Cit9CisKKy8vIHRhdXNjaHQgenVmYWVsbGlnIGF1cyBkZW4gZXJzdGVuIDQgUmVpaGVuIGF1cyBlaW5lciBSZWloZSBkZW4gbGV0enRlbiBtaXQKKy8vIGRlbSBlcnN0ZW4gYXVzIGRlciBGb2xnZXJlaWhlLCB3ZW5uIGRpZSBkZXIgU2NvcmUgZGVzIHZvcmRlcmVuIFNwaWVsZXIgbWVocgorLy8gYWxzIDEwIGdyb2Vzc2VyIGFscyBkZXIgZGVzIGhpbnRlcmVuIFNwaWVsZXJzIGlzdC4KK3ByaXZhdGUgdm9pZCBSYW5kb21DaGFuZ2VSb3coKSB7CisgIGludCAqbnVtcyxpOworICBvYmplY3QgcDEscDI7CisKKyAgaWYgKCFtYXBwaW5ncChoKSkKKyAgICBVcGRhdGVBY3RSb3coKTsKKyAgZm9yIChudW1zPSh7MCwxLDIsM30pO3NpemVvZihudW1zKTtudW1zLT0oe2l9KSkgeworICAgIGk9bnVtc1tyYW5kb20oc2l6ZW9mKG51bXMpKV07CisgICAgaWYgKCFzaXplb2Yocm93c1tpXSkgfHwgIXNpemVvZihyb3dzW2krMV0pKSBjb250aW51ZTsKKyAgICBpZiAoIW9iamVjdHAocDE9cm93c1tpXVs8MV0pIHx8ICFvYmplY3RwKHAyPXJvd3NbaSsxXVswXSkpIGNvbnRpbnVlOworICAgIGlmICh3YW50ZWRfcm93W3AxXTx3YW50ZWRfcm93W3AyXSkgY29udGludWU7CisgICAgaWYgKGhbcDJdLWhbcDFdPj0tMTApIGNvbnRpbnVlOworICAgIHJvd3NbaV1bPDFdPXAyOworICAgIHJvd3NbaSsxXVswXT1wMTsKKyAgICByZXR1cm47CisgIH0KK30KKwordmFyYXJncyBwcml2YXRlIHN0cmluZworQ291bnRVcE5hbWVzKG9iamVjdCAqb2JzLCBzdHJpbmcgenNpbmcsIHN0cmluZyB6cGx1cikgeworICBzdHJpbmcgcmVzOworICBvYmplY3Qgb2I7CisgIGludCBpLHN6OworCisgIHJlcz0iIjsKKyAgaWYgKCFwb2ludGVycChvYnMpKSByZXR1cm4gcmVzOworICBpZiAoIXN0cmluZ3AoenNpbmcpKSB6c2luZz0iIjsKKyAgaWYgKCFzdHJpbmdwKHpwbHVyKSkgenBsdXI9IiI7CisgIGlmIChzej1zaXplb2Yob2JzKSkgeworICAgIGZvciAoaT0wO2k8c3o7aSsrKSB7CisgICAgICBpZiAoaSkKKwkgICAgICByZXMrPSgoaTxzei0xKT8iLCAiOiIgdW5kICIpOworICAgICAgaWYgKG9iamVjdHAob2I9b2JzW2ldKSkKKyAgICAgICAgcmVzKz1vYi0+bmFtZShXRVIpOworICAgIH0KKyAgICBpZiAoc3o+MSkKKyAgICAgIHJlcys9enBsdXI7CisgICAgZWxzZQorICAgICAgcmVzKz16c2luZzsKKyAgfQorICByZXR1cm4gcmVzOworfQorCitzdGF0aWMgdm9pZCBEb0NoYW5nZVJvdyhvYmplY3QgcGwsIGludCBkZXN0KSB7CisgIG1hcHBpbmcgb2xkX3JvdyxlYzEsZWMyLGVjYjsKKyAgaW50IGk7CisgIG9iamVjdCAqb2JzLCplbnZzLGVudjsKKyAgc3RyaW5nICptc2csc3RyOworCisgIGRlc3QtLTsKKyAgQ2hlY2tGb3JtYXRpb24oKTsKKyAgaD0wOyAgLy8gZGFtaXQgSFAtTGlzdGUgZ2V1cGRhdGVkIHdpcmQuCisgIFVwZGF0ZUFjdFJvdygpOworICBvbGRfcm93PWRlZXBfY29weShhY3Rfcm93KTsKKworICAvLyB3ZWxjaGUgT2JqZWt0ZSBiZXdlZ2VuPworICBvYnM9KHt9KTsKKyAgaWYgKG9iamVjdHAocGwpKSB7CisgICAgb2JzPSh7cGx9KTsKKyAgICBpZiAocG9pbnRlcnAoYXNzb2NfbWVtW3BsXSkpCisgICAgICBvYnMrPWFzc29jX21lbVtwbF07CisgIH0gZWxzZSB7CisgICAgUmFuZG9tQ2hhbmdlUm93KCk7CisgIH0KKworICBmb3JlYWNoIChvYmplY3Qgb2I6b2JzKSB7CisgICAgaWYgKCFvYmplY3RwKG9iKSkKKyAgICAgIGNvbnRpbnVlOworICAgIC8vIEFsbGUgYXNzb3ppaWVydGVuIE5QQyBrcmllZ2VuIGRpZSBnbGVpY2hlIGdld3VlbnNjaHRlIFJlaWhlIHdpZSBkZXIKKyAgICAvLyBTcGllbGVyLgorICAgIHdhbnRlZF9yb3dbb2JdPXdhbnRlZF9yb3dbcGxdOworICAgIFVwZGF0ZUFjdFJvdygpOworICAgIC8vIHVuZCBkYW5uIGluIGRpZSBnZXcuIFJlaWhlIHN0b3BmZW4uCisgICAgaW50IHNyYz1hY3Rfcm93W29iXS0xOworICAgIGlmIChkZXN0PDAgfHwgZGVzdD49TUFYX1RFQU1ST1dTKQorICAgICAgUmVtb3ZlRnJvbVJvdyhvYixzcmMpOworICAgIGVsc2UgaWYgKHNyYzwwIHx8IHNyYz49TUFYX1RFQU1ST1dTKQorICAgICAgQWRkVG9Sb3cob2IsZGVzdCk7CisgICAgZWxzZSBpZiAoc3JjIT1kZXN0KQorICAgICAgQ3ljbGVSb3dzKG9iLHNyYyxkZXN0KTsKKyAgfQorCisgIE1ha2VGb3JtYXRpb24oKTsKKworICBvYnMgPSBNZW1iZXJzKCk7IC8vIGFsbGUgTWVtYmVycyBiZXJ1ZWNrc2ljaHRpZ2VuIGJlaW0gQWJnbGVpY2ghCisgIG9iamVjdCAqY2hhbmdlZCA9IGFsbG9jYXRlKDApOworICBmb3JlYWNoIChvYmplY3Qgb2I6b2JzKQorICAgIGlmIChvYmplY3RwKG9iKSAmJiBvbGRfcm93W29iXSE9YWN0X3Jvd1tvYl0pIHsKKyAgICAgIG9iLT5JbmZvcm1Sb3dDaGFuZ2Uob2xkX3Jvd1tvYl0sYWN0X3Jvd1tvYl0pOworICAgICAgY2hhbmdlZCArPSAoe29ifSk7CisgICAgfQorCisgIC8vIEFiIGpldHp0IG51ciBub2NoIEF1c2dhYmUuCisgIGlmIChnZXRfZXZhbF9jb3N0KCk8ODAwMDAwKSByZXR1cm47IC8vIFdhciBzY2hvbiB0ZXVlciBnZW51ZywgTGFndmVybWVpZHVuZworICBtc2c9KHt9KTtlYzE9KFtdKTtlYzI9KFtdKTtlY2I9KFtdKTsKKyAgZm9yZWFjaCAob2JqZWN0IG9iOmNoYW5nZWQpIHsKKyAgICB0ZWxsX29iamVjdChvYixzcHJpbnRmKCJEdSBiaXN0IGpldHp0IGluIFJlaWhlICVkLlxuIixhY3Rfcm93W29iXSkpOworICAgIG1zZys9KHtzcHJpbnRmKCIlcy0+JWQiLG9iLT5OYW1lKFdFUiksYWN0X3Jvd1tvYl0pfSk7CisgICAgaWYgKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2IpICYmICFpbnRlcmFjdGl2ZShvYikpIGNvbnRpbnVlOworICAgIGlmICghb2JqZWN0cChlbnY9ZW52aXJvbm1lbnQob2IpKSkgY29udGludWU7CisgICAgaWYgKG9sZF9yb3dbb2JdPD0xKSB7CisgICAgICBpZiAoIXBvaW50ZXJwKGVudnM9ZWMxW2Vudl0pKSBlbnZzPSh7fSk7CisgICAgICBlYzFbZW52XT1lbnZzKyh7b2J9KTtlY2JbZW52XXw9MTsKKyAgICB9CisgICAgaWYgKGFjdF9yb3dbb2JdPD0xKSB7CisgICAgICBpZiAoIXBvaW50ZXJwKGVudnM9ZWMyW2Vudl0pKSBlbnZzPSh7fSk7CisgICAgICBlYzJbZW52XT1lbnZzKyh7b2J9KTtlY2JbZW52XXw9MjsKKyAgICB9CisgIH0KKyAgaWYgKHNpemVvZihtc2cpKQorICAgIGd0ZWxsKGltcGxvZGUobXNnLCIsICIpKTsgLy8gQXVzZ2FiZSBhbiBhbGxlIEdydXBwZW5taXRnbGllZGVyLgorICBtX2RlbGV0ZShlY2IsZmluZF9vYmplY3QoIi9yb29tL25ldHp0b3QiKSk7IC8vIERhcyBnYWViZSBNZWdhLUxhZyA6LSkKKyAgZW52cz1tX2luZGljZXMoZWNiKTtvYnM9TWVtYmVycygpOworICBmb3IgKGk9c2l6ZW9mKGVudnMpLTE7aT49MDtpLS0pIHsKKyAgICBpZiAoIW9iamVjdHAoZW52PWVudnNbaV0pKSBjb250aW51ZTsKKyAgICBzdHI9IiI7CisgICAgc3RyKz1Db3VudFVwTmFtZXMoZWMxW2Vudl0sIiB0cml0dCB6dXJ1ZWNrIiwiIHRyZXRlbiB6dXJ1ZWNrIik7CisgICAgaWYgKGVjYltlbnZdPT0zKSBzdHIrPSIsICI7CisgICAgc3RyKz1Db3VudFVwTmFtZXMoZWMyW2Vudl0sIiB0cml0dCB2b3IiLCIgdHJldGVuIHZvciIpOworICAgIHN0cis9Ii5cbiI7CisgICAgdGVsbF9yb29tKGVudixjYXBpdGFsaXplKGJyZWFrX3N0cmluZyhzdHIsNzgpKSxvYnMpOworICB9Cit9CisKK3ZvaWQgVXBkYXRlRm9ybWF0aW9uKCkgeworICBEb0NoYW5nZVJvdygwLDApOworfQorCitpbnQgU3dhcFJvd3Mob2JqZWN0IG9iMSwgb2JqZWN0IG9iMikgeworICBpbnQgaSxyMSxyMixwMSxwMjsKKworICBpZiAoIW9iamVjdHAob2IxKSB8fCAhb2JqZWN0cChvYjIpIHx8IG9iMT09b2IyKQorICAgIHJldHVybiAwOworICByMT1yMj0tMTsKKyAgZm9yIChpPTA7aTxNQVhfVEVBTVJPV1M7aSsrKSB7CisgICAgaWYgKHIxPT0tMSAmJiAocDE9bWVtYmVyKHJvd3NbaV0sb2IxKSk+PTApCisgICAgICByMT1pOworICAgIGlmIChyMj09LTEgJiYgKHAyPW1lbWJlcihyb3dzW2ldLG9iMikpPj0wKQorICAgICAgcjI9aTsKKyAgfQorICBpZiAocjE9PS0xIHx8IHIyPT0tMSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKHIxPT1yMikKKyAgICByZXR1cm4gMTsKKyAgaWYgKHIxPHIyKSB7IC8vIE5pY2h0IE1vbnN0ZXIgdm9yIFNwaWVsZXIgc3RlbGxlbgorICAgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iMSkgJiYgIWludGVyYWN0aXZlKG9iMikpCisgICAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICBpZiAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYjIpICYmICFpbnRlcmFjdGl2ZShvYjEpKQorICAgICAgcmV0dXJuIDA7CisgIH0KKyAgcm93c1tyMV1bcDFdPW9iMjtvYjItPkluZm9ybVJvd0NoYW5nZShyMixyMSk7CisgIHJvd3NbcjJdW3AyXT1vYjE7b2IxLT5JbmZvcm1Sb3dDaGFuZ2UocjEscjIpOworICBndGVsbChvYjEtPk5hbWUoV0VSKSsiIHVuZCAiK29iMi0+bmFtZShXRVIpKyIgdGF1c2NoZW4gZGllIFBsYWV0emUuXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ByaXZhdGUgaW50IENoYW5nZVJvdyhzdHJpbmcgYXJnKSB7CisgIGludCBudW07CisKKyAgaWYgKCFhcmcgfHwgc3NjYW5mKGFyZywiJWQiLG51bSkhPTEpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJJbiB3ZWxjaGUgUmVpaGUgd2lsbHN0IER1IGRlbm4gd2VjaHNlbG4/XG4iKSwwOworICBpZiAobnVtPDEgfHwgbnVtPk1BWF9URUFNUk9XUykKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIkRpZSBSZWloZW5hbmdhYmUgaXN0IHVuZ3VlbHRpZy5cbiIpLDA7CisgIFRQLT5TZXRQcm9wKFBfVEVBTV9XQU5URURfUk9XLHdhbnRlZF9yb3dbVFBdPW51bSk7CisgIHByaW50ZigiRHUgdmVyc3VjaHN0IGluIFJlaWhlICVkIHp1IHdlY2hzZWxuLlxuIixudW0pOworICBEb0NoYW5nZVJvdyhUUCxudW0pOworICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSBpbnQgQ2hhbmdlV2ltcHlSb3coc3RyaW5nIGFyZykgeworICBpbnQgbnVtOworCisgIGlmICghYXJnIHx8IHNzY2FuZihhcmcsIiVkIixudW0pIT0xKQorICAgIHJldHVybiBub3RpZnlfZmFpbCgiSW4gd2VsY2hlIFJlaWhlIHdpbGxzdCBEdSBmbGllaGVuP1xuIiksMDsKKyAgaWYgKG51bTwwIHx8IG51bT5NQVhfVEVBTVJPV1MpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJEaWUgUmVpaGVuYW5nYWJlIGlzdCB1bmd1ZWx0aWcuXG4iKSwwOworICBUUC0+U2V0UHJvcChQX1RFQU1fV0lNUFlfUk9XLHdpbXB5X3Jvd1tUUF09bnVtKTsKKyAgaWYgKG51bT4xKQorICAgIHByaW50ZigiQmVpIGRlciBGbHVjaHQgd2lyc3QgRHUgaW4gUmVpaGUgJWQgd2VjaHNlbG4uXG4iLG51bSk7CisgIGVsc2UKKyAgICB3cml0ZSgiQmVpIGRlciBGbHVjaHQgd2lyc3QgRHUgZGVuIFJhdW0gdmVybGFzc2VuLlxuIik7CisgIHJldHVybiAxOworfQorCittaXhlZCAqUHJlc2VudFJvd3Mob2JqZWN0IGVudikgeworICBpbnQgaSxqLGQsYXJiZWl0OworICBtaXhlZCAqcmVzOworICBvYmplY3QgKm5kLG9iOworCisgIGlmICghb2JqZWN0cChlbnYpKQorICAgIGVudj1lbnZpcm9ubWVudChUUCk7CisgIGlmIChsYXN0X3Jlb3JkZXIhPXRpbWUoKSB8fCAhbWFwcGluZ3AoaCkpCisgICAgVXBkYXRlRm9ybWF0aW9uKCk7CisgIHJlcz1FTVBUWV9URUFNQVJSQVk7YXJiZWl0PTA7bmQ9KHt9KTsKKyAgZm9yIChpPTA7aTxNQVhfVEVBTVJPV1M7aSsrKSB7CisgICAgb2JqZWN0ICpuZXc9KHt9KTsKKyAgICBmb3JlYWNoKG9iOiByb3dzW2ldKSB7CisgICAgICBpZiAob2JqZWN0cChvYikgJiYgaXNfbWVtYmVyW29iXSAmJiBlbnZpcm9ubWVudChvYik9PWVudikgeworICAgICAgICBpZiAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikgJiYgIWludGVyYWN0aXZlKG9iKSkgeworICAgICAgICAgIG5kKz0oe29ifSk7CisgICAgICAgICAgYXJiZWl0PTE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbmV3Kz0oe29ifSk7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGFyYmVpdD0xOworICAgICAgfQorICAgIH0KKyAgICByZXNbaV09bmV3OworICB9CisgIGlmICghYXJiZWl0KQorICAgIHJldHVybiByZXM7CisgIGZvciAoaT1qPTA7aTxNQVhfVEVBTVJPV1M7aSsrKSB7CisgICAgaWYgKGo8PWkpIGo9aSsxOworICAgIGZvciAoO2o8TUFYX1RFQU1ST1dTO2orKykgeworICAgICAgZD1mb3JtaW5baV0tc2l6ZW9mKHJlc1tpXSk7CisgICAgICBpZiAoZDw9MCkgICAgICAgICAgICAgICAgICAgLy8gQXVzcmVpY2hlbmRlIEFuemFobAorICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgIC8vIGtlaW4gd2VpdGVyZXMgaiBub2V0aWcKKyAgICAgIHJlc1tpXSs9cmVzW2pdWzAuLihkLTEpXTsgICAvLyBTb25zdCBOYWNoc2NodWIgdm9uIGhpbnRlbiBob2xlbgorICAgICAgcmVzW2pdPXJlc1tqXVtkLi5dOworICAgIH0KKyAgfQorICByZXNbTUFYX1RFQU1ST1dTLTFdKz1uZDsgLy8gTmV0enRvdGUgYmlldGVuIGtlaW5lIERlY2t1bmcsIG5hY2ggaGludGVuLgorICByZXR1cm4gcmVzOworfQorCittYXBwaW5nIFByZXNlbnRQb3NpdGlvbnMobWl4ZWQgcHJlc19yb3dzKSB7CisgIG1hcHBpbmcgcmVzPShbXSk7CisgIGlmIChvYmplY3RwKHByZXNfcm93cykpCisgICAgcHJlc19yb3dzPVByZXNlbnRSb3dzKHByZXNfcm93cyk7CisgIGlmICghcG9pbnRlcnAocHJlc19yb3dzKSkKKyAgICByZXR1cm4gcmVzOworICBmb3IgKGludCBpPTA7aTxNQVhfVEVBTVJPV1M7aSsrKSB7CisgICAgZm9yZWFjaChvYmplY3Qgb2I6IHByZXNfcm93c1tpXSkKKyAgICAgIGlmIChvYikKKyAgICAgICAgcmVzW29iXT1pKzE7CisgIH0KKyAgcmV0dXJuIHJlczsKK30KKworCit2YXJhcmdzIGludCBGbGVlVG9Sb3cob2JqZWN0IG9iKSB7CisgIGludCBudW07CisKKyAgaWYgKCFvYmplY3RwKG9iKSkKKyAgICBvYj1UUDsKKyAgaWYgKCFJc01lbWJlcihvYikpCisgICAgcmV0dXJuIDA7CisgIGg9MDsgLy8gUmVpaGVuIGJlaSBuYWVjaHN0ZXIgQWJmcmFnZSBuZXUgc29ydGllcmVuCisgIG51bT13aW1weV9yb3dbb2JdOworICBpZiAobnVtPDIgfHwgbnVtPk1BWF9URUFNUk9XUykgLy8gRmx1Y2h0IGluIDEuIFJlaWhlIG5pY2h0IHNpbm52b2xsLgorICAgIHJldHVybiAwOworICBpZiAobnVtPT13YW50ZWRfcm93W29iXSkgLy8gSXN0IHNjaG9ubWFsIG5hY2ggaGludGVuIGdlZmxvaGVuLgorICAgIHJldHVybiAwOworICB0ZWxsX29iamVjdChvYixzcHJpbnRmKCJEdSB2ZXJzdWNoc3QgaW4gUmVpaGUgJWQgenUgZmxpZWhlbi5cbiIsbnVtKSk7CisgIG9iLT5TZXRQcm9wKFBfVEVBTV9XQU5URURfUk9XLHdhbnRlZF9yb3dbb2JdPW51bSk7CisgIERvQ2hhbmdlUm93KG9iLG51bSk7CisgIGlmIChQcmVzZW50UG9zaXRpb25zKGVudmlyb25tZW50KG9iKSlbb2JdPD0xKSAvLyBGbHVjaHQgZ2VzY2hlaXRlcnQ/CisgICAgcmV0dXJuIDA7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IENoYW5nZUZvcm1hdGlvbihzdHJpbmcgYXJnKSB7CisgIHN0cmluZyAqd29yZHM7CisgIGludCBpLG1pbixtYXg7CisgIG1hcHBpbmcgb2xkX3JvdzsKKworICBpZiAoYXJnPT0iYXVzIikKKyAgICBhcmc9IjEtNiAwLTYgMC02IDAtNiAwLTYiOworICBpPXNpemVvZih3b3Jkcz1vbGRfZXhwbG9kZShhcmcsIiAiKSk7CisgIGlmIChpPk1BWF9URUFNUk9XUykKKyAgICBpPU1BWF9URUFNUk9XUzsKKyAgZm9yICgtLWk7aT49MDtpLS0pIHsKKyAgICBpZiAoc3NjYW5mKHdvcmRzW2ldLCIlZC0lZCIsbWluLG1heCk9PTIpIHsKKyAgICAgIGZvcm1pbltpXT1taW47CisgICAgICBmb3JtYXhbaV09bWF4OworICAgIH0gZWxzZSBpZiAoc3NjYW5mKHdvcmRzW2ldLCIlZCIsbWluKT09MSkgeworICAgICAgZm9ybWluW2ldPWZvcm1heFtpXT1taW47CisgICAgfQorICB9CisKKyAgVXBkYXRlRm9ybWF0aW9uKCk7CisKKyAgd29yZHM9KHt9KTsKKyAgZm9yIChpPTA7aTxNQVhfVEVBTVJPV1M7aSsrKQorICAgIHdvcmRzKz0oe3NwcmludGYoIiVkLSVkIixmb3JtaW5baV0sZm9ybWF4W2ldKX0pOworICBndGVsbCgiRGllIEZvcm1hdGlvbiBpc3QgamV0enQgIitpbXBsb2RlKHdvcmRzLCIgLyAiKSsiLlxuIik7CisgIHJldHVybiAxOworfQorCitpbnQgU2hvdXQoc3RyaW5nIHN0cikgeworICBpZiAoIXN0ciB8fCBzdHI9PSIiKQorICAgIHJldHVybiBub3RpZnlfZmFpbCgiV2FzIHdpbGxzdCBEdSBkZW4gYW5kZXJlbiBUZWFtbWl0Z2xpZWRlcm4gc2FnZW4/XG4iKSwwOworICBndGVsbChzdHIsVFAtPk5hbWUoV0VSKSwxKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBIaXN0KHN0cmluZyBzdHIpIHsKKyAgaW50IGksYW56LG1heGltYWw7CisKKyAgLy8gbm9uLWludGVyYWN0aXZlIG9kZXIgTmljaHQtTWl0Z2xpZWRlciBzb2xsdGVuIGRpZSBIaXN0IG5pY2h0IGFiZnJhZ2VuLgorICBpZiAoIUlzSW50ZXJhY3RpdmVNZW1iZXIoVFApKSByZXR1cm4gLTE7CisKKyAgbWF4aW1hbD1zaXplb2YoaGlzdCk7CisgIGlmIChzdHIgJiYgc3NjYW5mKHN0ciwiJWQiLGFueik9PTEpCisgICAgaT1tYXhpbWFsLWFuejsKKyAgaWYgKGk8MCkKKyAgICBpPTA7CisKKyAgVFAtPk1vcmUoc3ByaW50ZigiJUBzIixoaXN0W2kuLm1heGltYWxdKXx8IiIpOworICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSB2b2lkIERvQ2hhbmdlTGVhZGVyKG9iamVjdCBvYikgeworICBpZiAob2JqZWN0cChsZWFkZXIpICYmIGxlYWRlci0+UXVlcnlQcm9wKFBfVEVBTV9MRUFERVIpPT1NRSkKKyAgICBsZWFkZXItPlNldFByb3AoUF9URUFNX0xFQURFUiwwKTsKKyAgbGVhZGVyPW9iOworICBsZWFkZXItPlNldFByb3AoUF9URUFNX0xFQURFUixNRSk7Cit9CisKK3ByaXZhdGUgaW50IENoYW5nZUxlYWRlcihzdHJpbmcgYXJnKSB7CisgIG9iamVjdCBvYjsKKworICBpZiAoc3RyaW5ncChhcmcpICYmIGFyZyE9IiIpIHsKKyAgICBpZiAoIW9iamVjdHAob2I9ZmluZF9wbGF5ZXIoYXJnKSkKKyAgICAgICAgJiYgIW9iamVjdHAob2I9cHJlc2VudChhcmcsZW52aXJvbm1lbnQoVFApKSkpCisgICAgICByZXR1cm4gbm90aWZ5X2ZhaWwoY2FwaXRhbGl6ZShhcmcpKyIgbmljaHQgZ2VmdW5kZW4uXG4iKSwwOworICB9IGVsc2UgeworICAgIG9iPVRQOworICB9CisgIGlmIChvYmplY3RwKGxlYWRlcikKKyAgICAgICYmIFRQIT1sZWFkZXIKKyAgICAgICYmICghaW50ZXJhY3RpdmUoVFApIHx8IChpbnRlcmFjdGl2ZShsZWFkZXIpICYmIHF1ZXJ5X2lkbGUobGVhZGVyKTwxODApKSkKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIkRlciBUZWFtbGVpdGVyIGlzdCBub2NoIGFrdGl2LlxuIiksMDsKKyAgaWYgKG9iamVjdHAobGVhZGVyKQorICAgICAgJiYgcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShsZWFkZXIpCisgICAgICAmJiAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShsZWFkZXIpKQorICAgIHJldHVybiBub3RpZnlfZmFpbCgiTnVyIGVpbiBTcGllbGVyIGthbm4gZGFzIFRlYW0gbGVpdGVuLlxuIiksMDsKKyAgaWYgKCFJc01lbWJlcihvYikpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKG9iLT5OYW1lKFdFUikrIiBpc3Qga2VpbiBUZWFtbWl0Z2xpZWQuXG4iKSwwOworICBEb0NoYW5nZUxlYWRlcihvYik7CisgIGd0ZWxsKG9iLT5OYW1lKFdFUikrIiBsZWl0ZXQgamV0enQgZGFzIFRlYW0uXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZhcmFyZ3MgcHJpdmF0ZSBpbnQgQ2hlY2tTZWNvbmQob2JqZWN0IHBsLCBvYmplY3QgKm9icykgeworICBtaXhlZCB4LGlwOworICBtYXBwaW5nIHNlY29uZDsKKyAgb2JqZWN0IG9iOworICBpbnQgaTsKKworICBpZiAoIW9iamVjdHAocGwpKQorICAgIHBsPVRQOworICBpZiAoIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUocGwpKQorICAgIHJldHVybiAwOworICBpZiAoIXBvaW50ZXJwKG9icykpCisgICAgb2JzPU1lbWJlcnMoKTsKKyAgb2JzLT0oe3BsfSk7CisgIHNlY29uZD0oW10pOworICBmb3IgKGk9c2l6ZW9mKG9icyktMTtpPj0wO2ktLSkgeworICAgIGlmICghb2JqZWN0cChvYj1vYnNbaV0pIHx8ICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSkgY29udGludWU7CisgICAgc2Vjb25kW2dldHVpZChvYildPTE7CisgICAgaWYgKHN0cmluZ3AoeD1vYi0+UXVlcnlQcm9wKFBfU0VDT05EKSkpCisgICAgICBzZWNvbmRbbG93ZXJfY2FzZSh4KV09MTsKKyAgfQorICBpZiAoc2Vjb25kW2dldHVpZChwbCldIHx8CisgICAgICAoc3RyaW5ncCh4PXBsLT5RdWVyeVByb3AoUF9TRUNPTkQpKSAmJiBzZWNvbmRbbG93ZXJfY2FzZSh4KV0pKQorICAgIHJldHVybiAxOworCisgIGlmICghc3RyaW5ncChpcD1wbC0+UXVlcnlQcm9wKFBfQ0FMTEVEX0ZST01fSVApKSB8fCBpcD09IiIpCisgICAgcmV0dXJuIDA7CisgIGZvciAoaT1zaXplb2Yob2JzKS0xO2k+PTA7aS0tKSB7CisgICAgaWYgKCFvYmplY3RwKG9iPW9ic1tpXSkgfHwgIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2IpKSBjb250aW51ZTsKKyAgICBpZiAob2ItPlF1ZXJ5UHJvcChQX0NBTExFRF9GUk9NX0lQKSE9aXApIGNvbnRpbnVlOworICAgIGxvZ19maWxlKCJyb2NodXMvendlaXRpZXZlcmRhY2h0IiwKKyAgICAgICAgICAgICBzcHJpbnRmKCIlcyAlcywlc1xuIixjdGltZSgpWzQuLjE1XSxnZXR1aWQocGwpLGdldHVpZChvYikpKTsKKyAgICBicmVhazsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIGludCBBbGxvd2VkKG9iamVjdCBwbCkgeworICBtaXhlZCB4OworICBzdHJpbmcgbm07CisKKyAgaWYgKCFvYmplY3RwKHBsKSkKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIldFUiBzb2xsIGlucyBUZWFtIGF1Zmdlbm9tbWVuIHdlcmRlbj9cbiIpLDA7CisgIGlmIChwbD09VFApCisgICAgbm09IkR1IGIiOworICBlbHNlCisgICAgbm09cGwtPk5hbWUoV0VSKSsiICI7CisgIGlmIChvYmplY3RwKHg9cGwtPlF1ZXJ5UHJvcChQX1RFQU0pKSAmJiB4IT1NRSkKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwobm0rImlzdCBzY2hvbiBpbiBlaW5lbSBhbmRlcmVuIFRlYW0uXG4iKSwwOworICBpZiAocGwtPlF1ZXJ5R3Vlc3QoKSkKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwobm0rImlzdCBlaW4gR2FzdC5cbiIpLDA7CisgIGlmIChwbC0+UXVlcnlQcm9wKFBfR0hPU1QpKQorICAgIHJldHVybiBub3RpZnlfZmFpbChubSsiaXN0IGVpbiBHZWlzdC5cbiIpLDA7CisgIGlmIChDaGVja1NlY29uZChwbCkpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKG5tKyJpc3QgWndlaXRzcGllbGVyIGVpbmVzIFRlYW1taXRnbGllZHMuXG4iKSwwOworICBpZiAoc2l6ZW9mKGZpbHRlcihNZW1iZXJzKCksIklzSW50ZXJhY3RpdmVNZW1iZXIiLE1FKSkKKyAgICAgID49TUFYX1RFQU1fTUVNQkVSUykKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIkVzIHNpbmQgc2Nob24genV2aWVsZSBTcGllbGVyIGltIFRlYW0uXG4iKSwwOworICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSB2b2lkIERvQWRkTWVtYmVyKG9iamVjdCBvYikgeworICBjbG9zdXJlIGNsOworCisgIGlmICghSXNNZW1iZXIobGVhZGVyKSkKKyAgICBEb0NoYW5nZUxlYWRlcihvYik7CisgIG9iLT5TZXRQcm9wKFBfVEVBTSxNRSk7CisgIGlmIChJc01lbWJlcihvYikpCisgICAgcmV0dXJuOworICBpc19tZW1iZXJbb2JdPTE7CisgIGNsPXN5bWJvbF9mdW5jdGlvbigiUXVlcnlQcm9wIixvYik7CisgIGF0dGFja19jbWRbb2JdPWZ1bmNhbGwoY2wsUF9URUFNX0FUVEFDS19DTUQpOworICBhdXRvZm9sbG93W29iXT1mdW5jYWxsKGNsLFBfVEVBTV9BVVRPRk9MTE9XKTsKKyAgd2ltcHlfcm93W29iXT1mdW5jYWxsKGNsLFBfVEVBTV9XSU1QWV9ST1cpOworICB3YW50ZWRfcm93W29iXT1mdW5jYWxsKGNsLFBfVEVBTV9XQU5URURfUk9XKTsKKyAgaWYgKCF3YW50ZWRfcm93W29iXSkgd2FudGVkX3Jvd1tvYl09MTs7CisgIG9iLT5TZXRQcm9wKFBfVEVBTV9ORVdNRU1CRVIsMCk7CisgIEdldEhwSW5mbyhvYixjbCk7CisgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSkgb2ItPkFkZEhwSG9vayhNRSk7CisgIGlmICghb2JqZWN0cChhc3NvY19tZW1bb2JdKSkKKyAgICBndGVsbChvYi0+TmFtZShXRVIpKyIgd3VyZGUgaW5zIFRlYW0gYXVmZ2Vub21tZW4uXG4iKTsKKyAgRG9DaGFuZ2VSb3cob2Isd2FudGVkX3Jvd1tvYl0pOworfQorCitpbnQgQWRkQXNzb2NNZW1iZXIob2JqZWN0IGNhc3Rlciwgb2JqZWN0IG5wYykgeworICBvYmplY3QgKm9iczsKKworICBpZiAoZXh0ZXJuX2NhbGwoKSAmJiBQTyE9Y2FzdGVyKQorICAgIHJldHVybiAwOworICBpZiAoIUlzTWVtYmVyKGNhc3RlcikKKyAgICAgIHx8ICFvYmplY3RwKG5wYykKKyAgICAgIHx8IHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUobnBjKQorICAgICAgfHwgSXNNZW1iZXIobnBjKQorICAgICAgfHwgb2JqZWN0cChhc3NvY19tZW1bY2FzdGVyXSkKKyAgICAgIHx8IGFzc29jX21lbVtucGNdCisgICAgICB8fCBjYXN0ZXI9PW5wYykKKyAgICByZXR1cm4gMDsKKyAgYXNzb2NfbWVtW25wY109Y2FzdGVyOworICBEb0FkZE1lbWJlcihucGMpOworICBpZiAoIXBvaW50ZXJwKG9icz1hc3NvY19tZW1bY2FzdGVyXSkpCisgICAgb2JzPSh7fSk7CisgIG9icz0ob2JzLSh7bnBjLDB9KSkrKHtucGN9KTsKKyAgYXNzb2NfbWVtW2Nhc3Rlcl09b2JzOworICByZXR1cm4gMTsKK30KKworc3RhdGljIHZvaWQgQWRkTWVtYmVyQW5kQXNzb2NzKG9iamVjdCBjYXN0ZXIpIHsKKyAgb2JqZWN0ICpvYnMsb2I7CisgIGludCBpOworCisgIERvQWRkTWVtYmVyKGNhc3Rlcik7CisgIGlmICghcG9pbnRlcnAob2JzPWNhc3Rlci0+UXVlcnlQcm9wKFBfVEVBTV9BU1NPQ19NRU1CRVJTKSkpCisgICAgcmV0dXJuOworICBmb3IgKGk9c2l6ZW9mKG9icyktMTtpPj0wO2ktLSkKKyAgICBpZiAob2JqZWN0cChvYj1vYnNbaV0pICYmICFjYXN0ZXItPklzRW5lbXkob2IpKQorICAgICAgQWRkQXNzb2NNZW1iZXIoY2FzdGVyLG9iKTsKK30KKworaW50IEFkZE1lbWJlcihvYmplY3Qgb2IpIHsKKyAKKyAgaWYgKCFBbGxvd2VkKG9iKSkKKyAgICByZXR1cm4gMDsKKyAgCisgIC8vIFdlbm4gZXMgZWluZW4gVFAgZ2lidCwgdW50ZXJsaWVndCBlciBlaW5pZ2VuIEVpbnNjaHJhZW5rdW5nZW4uCisgIC8vIERhZnVlciB3aXJkIGVyIGFiZXIgdmlhIEF1Zm5haG1lIGlucyBUZWFtIGF1Y2ggZ2dmLiBUZWFtbGVpdGVyLCB3ZW5uCisgIC8vIG5vZXRpZy4KKyAgLy8gVE9ETzogRGllc2VyIENvZGUgZ2VodCBkYXZvbiBhdXMsIGRhc3MgZXIgbnVyIGF1cyBlaW5lbSBLb21tYW5kbworICAvLyBhdXNnZWZ1ZWhydCB3aXJkIHVuZCBUUCBkZXIgVmVyYW5sYXNzZXIgZGVyIEF1Zm5haG1lIGlzdC4gRGllcyBzY2hlaW50CisgIC8vIG1pciB1bnJlYWxpc3Rpc2NoLiAoWmVzc3RyYSkKKyAgaWYgKFRQICYmIFRQPT1wcmV2aW91c19vYmplY3QoKSkgeworICAgIGlmICghQWxsb3dlZChUUCkpCisgICAgICByZXR1cm4gMDsKKyAgICBpZiAoVFAhPW9iICYmIENoZWNrU2Vjb25kKG9iLCh7VFB9KSkpIHsvLyBad2VpdGllcmVnbHVuZyBiZWkgR3J1ZW5kdW5nLgorICAgICAgbm90aWZ5X2ZhaWwob2ItPk5hbWUoV0VSKSsiIGlzdCBad2VpdHNwaWVsZXIgdm9uIERpci5cbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmICghSXNNZW1iZXIobGVhZGVyKSkKKyAgICAgIEFkZE1lbWJlckFuZEFzc29jcyhUUCk7CisgICAgaWYgKFRQIT1sZWFkZXIpIHsKKyAgICAgIG5vdGlmeV9mYWlsKCJOdXIgZGVyIFRlYW1sZWl0ZXIga2FubiBNaXRnbGllZGVyIGF1Zm5laG1lbi5cbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgQWRkTWVtYmVyQW5kQXNzb2NzKG9iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ByaXZhdGUgdm9pZCBEb1JlbW92ZU1lbWJlcihvYmplY3Qgb2IpIHsKKyAgb2JqZWN0ICp0bWVtYmVycyxjYXN0ZXI7CisgIG1peGVkIGFzbWVtOworICBpbnQgaTsKKworICBvYi0+U2V0UHJvcChQX1RFQU0sMCk7CisgIG1fZGVsZXRlKGlzX21lbWJlcixvYik7CisgIG1fZGVsZXRlKHdhbnRlZF9yb3csb2IpOworICBtX2RlbGV0ZShhY3Rfcm93LG9iKTsKKyAgbV9kZWxldGUod2ltcHlfcm93LG9iKTsKKyAgbV9kZWxldGUoYXV0b2ZvbGxvdyxvYik7CisgIG1fZGVsZXRlKGF0dGFja19jbWQsb2IpOworICBpZiAob2JqZWN0cChjYXN0ZXI9YXNzb2NfbWVtW29iXSkgJiYgcG9pbnRlcnAoYXNtZW09YXNzb2NfbWVtW2Nhc3Rlcl0pKQorICAgIGFzc29jX21lbVtjYXN0ZXJdPWFzbWVtLSh7b2IsMH0pOworICBpZiAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikpIG9iLT5SZW1vdmVIcEhvb2soTUUpOworICBtX2RlbGV0ZShocF9pbmZvLG9iKTsKKyAgbV9kZWxldGUoYXV0b2luZl9ocCxvYik7CisgIG1fZGVsZXRlKGF1dG9pbmZfc3Asb2IpOworICBEb0NoYW5nZVJvdyhvYiwtMSk7CisKKyAgaWYgKCFvYmplY3RwKGFzc29jX21lbVtvYl0pKSB7CisgICAgaWYgKG9iLT5RdWVyeVByb3AoUF9HSE9TVCkpIHsKKyAgICAgIGd0ZWxsKHVwcGVyX2Nhc2Uob2ItPm5hbWUoV0VSKSkrIiBIQVQgREFTIFRFQU0gVkVSTEFTU0VOLiIsIlRvZCIpOworICAgIH0gZWxzZSB7CisgICAgICB0ZWxsX29iamVjdChvYiwiRHUgdmVybGFlc3N0IGRhcyBUZWFtLlxuIik7CisgICAgICBndGVsbChvYi0+TmFtZShXRVIpKyIgaGF0IGRhcyBUZWFtIHZlcmxhc3Nlbi5cbiIpOworICAgIH0KKyAgfQorICBtX2RlbGV0ZShhc3NvY19tZW0sb2IpOworCisgIGlmIChJc01lbWJlcihsZWFkZXIpKSAvLyBIYXQgZGFzIFRlYW0gbm9jaCBlaW5lbiBMZWl0ZXI/CisgICAgcmV0dXJuOworICB0bWVtYmVycz1NZW1iZXJzKCk7b2I9MDsKKyAgaWYgKGk9c2l6ZW9mKHRtZW1iZXJzKSkgeworICAgIG9iPXRtZW1iZXJzWzBdOworICAgIGZvciAoLS1pO2k+PTA7aS0tKSB7CisgICAgICBpZiAoaW50ZXJhY3RpdmUodG1lbWJlcnNbaV0pKSB7CisgICAgICAgIG9iPXRtZW1iZXJzW2ldOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHRtZW1iZXJzW2ldKSkKKyAgICAgICAgb2I9PXRtZW1iZXJzW2ldOworICAgIH0KKyAgICBEb0NoYW5nZUxlYWRlcihvYik7CisgICAgZ3RlbGwobGVhZGVyLT5OYW1lKFdFUikrIiBoYXQgZGllIFRlYW1sZWl0dW5nIHVlYmVybm9tbWVuLlxuIik7CisgICAgcmV0dXJuOworICB9CisgIFRyeVJlbW92ZSgpOworfQorCitpbnQgUmVtb3ZlQXNzb2NNZW1iZXIob2JqZWN0IGNhc3Rlciwgb2JqZWN0IG5wYykgeworICBvYmplY3QgKm9iczsKKworICBpZiAoZXh0ZXJuX2NhbGwoKSAmJiBQTyE9Y2FzdGVyKQorICAgIHJldHVybiAwOworICBpZiAoIUlzTWVtYmVyKGNhc3RlcikgfHwgYXNzb2NfbWVtW25wY10hPWNhc3RlcikKKyAgICByZXR1cm4gMDsKKyAgRG9SZW1vdmVNZW1iZXIobnBjKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyB2b2lkIFJlbW92ZU1lbWJlckFuZEFzc29jcyhvYmplY3QgY2FzdGVyKSB7CisgIG9iamVjdCAqb2JzLG9iOworICBpbnQgaTsKKworICBpZiAocG9pbnRlcnAob2JzPWNhc3Rlci0+UXVlcnlQcm9wKFBfVEVBTV9BU1NPQ19NRU1CRVJTKSkpIHsKKyAgICBmb3IgKGk9c2l6ZW9mKG9icyktMTtpPj0wO2ktLSkKKyAgICAgIGlmIChvYmplY3RwKG9iPW9ic1tpXSkpCisgICAgICAgIFJlbW92ZUFzc29jTWVtYmVyKGNhc3RlcixvYik7CisgIH0KKyAgRG9SZW1vdmVNZW1iZXIoY2FzdGVyKTsKK30KKworcHJpdmF0ZSB2b2lkIFJlbW92ZVNpbmdsZXMoKSB7CisgIG9iamVjdCAqb2JzOworICBtaXhlZCBhc287CisKKyAgaWYgKCFJc01lbWJlcihsZWFkZXIpKSByZXR1cm47CisgIGlmICghcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShsZWFkZXIpKSByZXR1cm47IC8vIE5QQyBUZWFtCisgIG9icz1NZW1iZXJzKCktKHtsZWFkZXJ9KTsKKyAgaWYgKHBvaW50ZXJwKGFzbz1hc3NvY19tZW1bbGVhZGVyXSkpCisgICAgb2JzLT1hc287CisgIGlmIChzaXplb2Yob2JzKSkgcmV0dXJuOworICBndGVsbCgiRGFzIFRlYW0gbG9lc3Qgc2ljaCBhdWYuXG4iKTsKKyAgUmVtb3ZlTWVtYmVyQW5kQXNzb2NzKGxlYWRlcik7CisgIFRyeVJlbW92ZSgpOworfQorCitpbnQgUmVtb3ZlTWVtYmVyKG1peGVkIGFyZykgeworICBvYmplY3QgKm1lbXMsbWVtLG9iOworICBpbnQgaTsKKyAgCisgIGlmIChvYmplY3RwKGFyZykpIHsKKyAgICBvYj1hcmc7CisgIH0gZWxzZSBpZiAoc3RyaW5ncChhcmcpICYmIGFyZyE9IiIpIHsKKyAgICBtZW1zPU1lbWJlcnMoKS0oe2xlYWRlcn0pOworICAgIGZvciAoaT1zaXplb2YobWVtcyktMTtpPj0wO2ktLSkgeworICAgICAgaWYgKG9iamVjdHAobWVtPW1lbXNbaV0pICYmIG1lbS0+aWQoYXJnKSkgIHsKKyAgICAgICAgb2I9bWVtOworICAgICAgICBpZiAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShvYikpCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmICghb2JqZWN0cChvYikpCisgICAgICByZXR1cm4gbm90aWZ5X2ZhaWwoY2FwaXRhbGl6ZShhcmcpKyIgbmljaHQgZ2VmdW5kZW4uXG4iKSwwOworICB9IGVsc2UgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChUUCE9bGVhZGVyICYmIFRQIT1vYiAmJiBvYiE9UE8pCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJOdXIgZGVyIFRlYW1sZWl0ZXIga2FubiBNaXRnbGllZGVyIGVudGxhc3Nlbi5cbiIpLDA7CisgIGlmICghSXNNZW1iZXIob2IpICYmIG9iLT5RdWVyeVByb3AoUF9URUFNKSE9TUUpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKG9iLT5OYW1lKFdFUikrIiBpc3Qga2VpbiBUZWFtbWl0Z2xpZWQuXG4iKSwwOworICBpZiAoUE8hPW9iICYmIG9iamVjdHAoYXNzb2NfbWVtW29iXSkpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKG9iLT5OYW1lKFdFUikrIiBnZWhvZXJ0IHp1ICIrCisgICAgICAgICAgICAgICAgICAgICAgIGFzc29jX21lbVtvYl0tPk5hbWUoV0VNKSsiLlxuIiksMDsKKworICBSZW1vdmVNZW1iZXJBbmRBc3NvY3Mob2IpOworICBSZW1vdmVTaW5nbGVzKCk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IENoYW5nZU5hbWUoc3RyaW5nIHN0cikgeworICBpZiAobGVhZGVyICYmIFRQIT1sZWFkZXIpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJOdXIgZGVyIFRlYW1sZWl0ZXIga2FubiBkZW4gTmFtZW4gYWVuZGVybi5cbiIpLDA7CisgIGlmICghc3RyIHx8IHN0cj09IiIpCisgICAgcmV0dXJuIDA7CisgIHN0cj1zdHJbMC4uMTldOworICBpZiAoIXN0cmluZ3Aoc3RyPShURUFNX01BU1RFUi0+UmVnaXN0ZXJUZWFtKHN0cikpKSkKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIkRlciBOYW1lIGlzdCBzY2hvbiB2ZXJnZWJlbi5cbiIpLDA7CisgIHRuYW1lPXN0cjsKKyAgaWYgKG9iamVjdHAoVFApKQorICAgIGd0ZWxsKFRQLT5OYW1lKFdFUikrIiBhZW5kZXJ0IGRlbiBUZWFtbmFtZW4gYXVmIFwiIit0bmFtZSsiXCIuXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgVGVhbUluaXRBdHRhY2soKSB7CisgIG9iamVjdCAqb2JzLCplbnMsKnJlbW92ZWQsb2IsZW47CisgIGludCBpLGo7CisKKyAgZGVidWcoc3ByaW50ZigibWlzX2luaXRfYXR0OiAlT1xuIixtaXNfaW5pdF9hdHQpKTsKKyAgZW5zPW1faW5kaWNlcyhtaXNfaW5pdF9hdHQpO3JlbW92ZWQ9KHt9KTsKKyAgZm9yIChpPXNpemVvZihlbnMpLTE7aT49MDtpLS0pIHsKKyAgICBpZiAoIW9iamVjdHAoZW49ZW5zW2ldKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmICghcG9pbnRlcnAob2JzPW1pc19pbml0X2F0dFtlbl0pKQorICAgICAgY29udGludWU7CisgICAgZm9yIChqPXNpemVvZihvYnMpLTE7aj49MDtqLS0pCisgICAgICBpZiAoIUlzTWVtYmVyKG9iPW9ic1tqXSkgfHwgZW52aXJvbm1lbnQob2IpIT1lbnZpcm9ubWVudChlbikpCisgICAgICAgIG9ic1tqXT0wOworICAgIG9icy09KHswfSk7CisgICAgb2I9ZW4tPlNlbGVjdE5lYXJFbmVteShvYnMsMSk7CisgICAgZGVidWcoc3ByaW50ZigiQmVncnVlc3N1bmdzc2NobGFnIHZvbiAlTyBmdWVyICVPXG4iLGVuLG9iKSk7CisgICAgaWYgKCFvYmplY3RwKG9iKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGVuLT5BdHRhY2syKG9iKTsgLy8gQmVncnVlc3N1bmdzc2NobGFnCisgICAgcmVtb3ZlZCs9KHtlbn0pOyAvLyBLZWluIEJlZ3J1ZXNzdW5nc3NjaGxhZyBtZWhyIHZvbiBkaWVzZW0gTW9uc3RlcgorICB9CisKKyAgZm9yIChpPXNpemVvZihtaXNfYXR0YWNrZWQpLTE7aT49MDtpLS0pCisgICAgaWYgKG9iamVjdHAob2I9bWlzX2F0dGFja2VkW2ldKSkKKyAgICAgIG9iLT5FeGVjdXRlTWlzc2luZ0F0dGFja3MocmVtb3ZlZCk7CisgIC8vIEJlZ3J1ZXNzdW5nc3NjaGxhZWdlIGRpZSBhdXNnZWZ1ZWhydCB3dXJkZW4gZW50ZmVybmVuCisgIC8vIHVuZCBuaWNodCBhdXNnZWZ1ZWhydGUgbmFjaGhvbGVuCisKKyAgbWlzX2F0dGFja2VkPSh7fSk7CisgIG1pc19pbml0X2F0dD0oW10pOworICBhdHRfZXhlYz0oe30pOworfQorCitpbnQgSW5pdEF0dGFja19DYWxsYmFjayhvYmplY3QgZW5lbXkpIHsKKyAgb2JqZWN0ICphcnI7CisKKyAgaWYgKCFJc01lbWJlcihQTykgfHwgbWVtYmVyKGF0dF9leGVjLFBPKTwwKQorICAgIHJldHVybiAwOworICBpZiAoIXBvaW50ZXJwKGFycj1taXNfaW5pdF9hdHRbZW5lbXldKSkKKyAgICBhcnI9KHt9KTsKKyAgbWlzX2luaXRfYXR0W2VuZW15XT1hcnIrKHtQT30pOworICBpZiAobWVtYmVyKG1pc19hdHRhY2tlZCxQTyk8MCkKKyAgICBtaXNfYXR0YWNrZWQrPSh7UE99KTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgVGVhbUF0dGFja0V4ZWN1dGVkX0NhbGxiYWNrKGludCBzdWNjZXNzKSB7CisgIGlmICghSXNNZW1iZXIoUE8pKQorICAgIHJldHVybjsKKyAgYXR0X2V4ZWMtPSh7UE8sMH0pOworICBpZiAoIXNpemVvZihhdHRfZXhlYykpCisgICAgVGVhbUluaXRBdHRhY2soKTsKK30KKworcHJpdmF0ZSBpbnQgU3RhcnRBdHRhY2soKSB7CisgIG9iamVjdCAqdG1lbWJlcnMsb2IsZW52OworICBpbnQgaTsKKworICBpZiAoVFAhPWxlYWRlciB8fCAhb2JqZWN0cChlbnY9ZW52aXJvbm1lbnQoVFApKSkKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIk51ciBkZXIgVGVhbWxlaXRlciBrYW5uIGRlbiBBbmdyaWZmIHN0YXJ0ZW4uXG4iKSwwOworICB0bWVtYmVycz1NZW1iZXJzKCk7CisgIFRlYW1Jbml0QXR0YWNrKCk7IC8vIEZhbGxzIG5vY2ggU2NobGFlZ2UgZmVobGVuLi4uLgorICBmb3IgKGk9c2l6ZW9mKHRtZW1iZXJzKS0xO2k+PTA7aS0tKQorICAgIGlmIChvYmplY3RwKG9iPXRtZW1iZXJzW2ldKSAmJiBzdHJpbmdwKGF0dGFja19jbWRbb2JdKSkKKyAgICAgIGlmIChvYi0+Q2FsbFRlYW1BdHRhY2soZW52KSkgLy8gQW5ncmlmZiB3aXJkIGF1c2dlZnVlaHJ0PworICAgICAgICBhdHRfZXhlYys9KHtvYn0pOyAgICAgICAgICAvLyBMaXN0ZSBkZXIgQW5ncmVpZmVyCisgIGd0ZWxsKFRQLT5OYW1lKFdFUikrIiBzdGFydGV0IGRlbiBBbmdyaWZmLlxuIik7CisgIHJldHVybiAxOworfQorCit2b2lkIFN0YXJ0Rm9sbG93KG9iamVjdCBlbnYpIHsKKyAgb2JqZWN0ICp0bWVtYmVycyxvYjsKKyAgaW50IGk7CisgIHN0cmluZyBjbWQsYXJnczsKKworICAvLyBwcmludGYoImxkOiVPIFBPOiVPIFRQOiVPIHF2OiVPIGVudjolT1xuIixsZWFkZXIsUE8sVFAscXVlcnlfdmVyYigpLGVudik7CisgIGlmIChUUCE9bGVhZGVyCisgICAgICB8fCAhc3RyaW5ncChjbWQ9cXVlcnlfdmVyYigpKQorICAgICAgfHwgIW9iamVjdHAoZW52KQorICAgICAgfHwgVFAhPVBPCisgICAgICB8fCBUUC0+UXVlcnlQcm9wKFBfR0hPU1QpIC8vIERlciBCZWZlaGwgd2FyIHdvaGwgdW5nZXN1bmQuLi4KKyAgICAgIHx8IFRQLT5Jc1RlYW1Nb3ZlKCkpIC8vIEFuZ3JpZmZzYmVmZWhsIG5pY2h0IGR1cmNoIHZlcmZvbGdlIDIgbWFsLi4uCisgICAgcmV0dXJuOworICBjbWQ9IlxcIitjbWQ7CisgIGlmIChzdHJpbmdwKGFyZ3M9VFAtPl91bnBhcnNlZF9hcmdzKCkpICYmIGFyZ3MhPSIiKQorICAgIGNtZCs9KCIgIithcmdzKTsKKyAgdG1lbWJlcnM9TWVtYmVycygpLSh7bGVhZGVyfSk7CisgIGZvciAoaT1zaXplb2YodG1lbWJlcnMpLTE7aT49MDtpLS0pCisgICAgaWYgKG9iamVjdHAob2I9dG1lbWJlcnNbaV0pICYmIGF1dG9mb2xsb3dbb2JdKSAgICAKKyAgICAJaWYoIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2IpICB8fCBlbnY9PWVudmlyb25tZW50KG9iKSkgLy8gYXV0b2ZvbGdlIG51ciBiZWkgYW5mdWVocmVyIGltIGdsZWljaGVuIHJhdW0KKyAgICAJICAgICAgb2ItPkNhbGxUZWFtRm9sbG93KGVudixjbWQpOworfQorCit2b2lkIFNob3dUZWFtSW5mbygpIHsKKyAgaW50IGk7CisgIG9iamVjdCAqdG1lbWJlcnMsb2I7CisgIHN0cmluZyBmb3JtOworCisgIGlmICghVEkgfHwgVFAhPVRJIHx8ICFJU19MRUFSTkVSKFRJKSkKKyAgICByZXR1cm47CisKKyAgVXBkYXRlQWN0Um93KCk7CisgIGZvcm09IiI7CisgIGZvciAoaT0wO2k8TUFYX1RFQU1ST1dTO2krKykKKyAgICBmb3JtKz1zcHJpbnRmKCIgJWQtJWQiLGZvcm1pbltpXSxmb3JtYXhbaV0pOworICBwcmludGYoIiVzIFslT10gTDogJXMgRjolc1xuIixuYW1lKCksTUUsCisgICAgICAgICAob2JqZWN0cChsZWFkZXIpP2xlYWRlci0+TmFtZShXRVIpOiI/IiksZm9ybSk7CisgIHRtZW1iZXJzPU1lbWJlcnMoKTsKKyAgZm9yIChpPXNpemVvZih0bWVtYmVycyktMTtpPj0wO2ktLSkgeworICAgIG9iPXRtZW1iZXJzW2ldOworICAgIHByaW50ZigiICAlZCglZCkgJXMgWyVPXVxuIiwKKyAgICAgICAgICAgYWN0X3Jvd1tvYl0sd2FudGVkX3Jvd1tvYl0sb2ItPk5hbWUoV0VSKSxvYik7CisgIH0KK30KKwordmFyYXJncyBpbnQgU2hvd1RlYW1IUChzdHJpbmcgYXJnKSB7CisgIG9iamVjdCAqdG1lbWJlcnMsb2I7CisgIGNsb3N1cmUgcXA7CisgIGludCBpLGxvbmdpbmY7CisgIG1peGVkICp2YWxzLCpyZXMsY29scyxmcixycix0ZXJtc3RyOworICBtYXBwaW5nIHJlYWxfcm93OworICBzdHJpbmcgbm0saW5mOworCisgIGlmIChhcmcgJiYgYXJnWzAuLjNdPT0ibGFuZyIpIHsKKyAgICBpZiAoVFAhPWxlYWRlcikKKyAgICAgIHJldHVybiBub3RpZnlfZmFpbCgiTnVyIGRlciBUZWFtbGVpdGVyIGthbm4gZGllIGxhbmdlICIrCisgICAgICAgICAgICAgICAgICAgICAgICAgIlVlYmVyc2ljaHQgYXVmcnVmZW4uXG4iKSwwOworICAgIGxvbmdpbmY9MTsKKyAgICBhcmc9YXJnWzUuLl07CisgIH0gZWxzZQorICAgIGxvbmdpbmY9MDsKKyAgcmVhbF9yb3c9UHJlc2VudFBvc2l0aW9ucyhlbnZpcm9ubWVudChUUCkpOworICB0bWVtYmVycz0oe30pOworICBmb3IgKGk9MDtpPE1BWF9URUFNUk9XUztpKyspCisgICAgdG1lbWJlcnMrPXJvd3NbaV07CisgIHJlcz0oe30pOworICBzd2l0Y2goVFAtPlF1ZXJ5UHJvcChQX1RUWSkpIHsKKyAgY2FzZSAiYW5zaSI6CisgICAgdGVybXN0cj0oe0FOU0lfUkVEK0FOU0lfQk9MRCxBTlNJX1lFTExPVyxBTlNJX0dSRUVOLEFOU0lfTk9STUFMLAorICAgICAgICAgICAgICBBTlNJX1VOREVSTH0pOworICAgIGJyZWFrOworICBjYXNlICJ2dDEwMCI6CisgICAgdGVybXN0cj0oe0FOU0lfQk9MRCwiIiwiIixBTlNJX05PUk1BTCxBTlNJX1VOREVSTH0pOworICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHRlcm1zdHI9KHsiIiwiIiwiIiwiIiwiIn0pOworICB9CisgIHZhbHM9KHsiIiwwLDAsdGVybXN0clszXSwiIiwwLDAsdGVybXN0clszXX0pOworCisgIHByaW50ZigiICBOYW1lICAgICAgICBHaWxkZSAgICAgICAgICAgTFYgR0xWICBMUCAoTUxQKSAgS1AgKE1LUCkgVm9ycy4gR1IgQVIgVFIgRlIgQSBWXG4iKTsKKyAgaWYgKGxvbmdpbmYpCisgICAgcHJpbnRmKCIgIChaZWlsZSAyKSAgIEFuZ3JpZmZzYmVmZWhsICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbHVjaHRyaWNodHVuZ1xuIik7CisKKyAgZm9yIChpPXNpemVvZih0bWVtYmVycyktMTtpPj0wO2ktLSkgeworICAgIGlmICghb2JqZWN0cChvYj10bWVtYmVyc1tpXSkpIGNvbnRpbnVlOworICAgIHFwPXN5bWJvbF9mdW5jdGlvbigiUXVlcnlQcm9wIixvYik7CisgICAgZnI9R2V0SHBJbmZvKG9iLHFwKTsKKyAgICB2YWxzWzFdPWZyWzBdO3ZhbHNbMl09ZnJbMV07dmFsc1s1XT1mclsyXTt2YWxzWzZdPWZyWzNdOworICAgIC8qCisgICAgdmFsc1sxXT1mdW5jYWxsKHFwLFBfSFApO3ZhbHNbMl09ZnVuY2FsbChxcCxQX01BWF9IUCk7CisgICAgdmFsc1s1XT1mdW5jYWxsKHFwLFBfU1ApO3ZhbHNbNl09ZnVuY2FsbChxcCxQX01BWF9TUCk7CisgICAgKi8KKyAgICBpZiAoIXBvaW50ZXJwKGNvbHM9ZnVuY2FsbChxcCxQX1RFQU1fQ09MT1JTKSkgfHwgc2l6ZW9mKGNvbHMpPDQpCisgICAgICBjb2xzPSh7dmFsc1syXS80LHZhbHNbMl0vMix2YWxzWzZdLzQsdmFsc1s2XS8yfSk7CisgICAgaWYgKHZhbHNbMV08Y29sc1swXSkKKyAgICAgIHZhbHNbMF09dGVybXN0clswXTsKKyAgICBlbHNlIGlmICh2YWxzWzFdPGNvbHNbMV0pCisgICAgICB2YWxzWzBdPXRlcm1zdHJbMV07CisgICAgZWxzZQorICAgICAgdmFsc1swXT10ZXJtc3RyWzJdOworICAgIGlmICh2YWxzWzVdPGNvbHNbMl0pCisgICAgICB2YWxzWzRdPXRlcm1zdHJbMF07CisgICAgZWxzZSBpZiAodmFsc1s1XTxjb2xzWzNdKQorICAgICAgdmFsc1s0XT10ZXJtc3RyWzFdOworICAgIGVsc2UKKyAgICAgIHZhbHNbNF09dGVybXN0clsyXTsKKyAgICBpZiAoaW50cChmcj13aW1weV9yb3dbb2JdKSAmJiBmcj4xKSBmcj1zcHJpbnRmKCIlMmQiLGZyKTsgZWxzZSBmcj0iLS0iOworICAgIGlmIChpbnRwKHJyPXJlYWxfcm93W29iXSkgJiYgcnI+MCkgIHJyPXNwcmludGYoIiUyZCIscnIpOyBlbHNlIHJyPSItLSI7CisgICAgbm09b2ItPk5hbWUoUkFXKTsKKyAgICBpbmY9c3ByaW50ZigiJXMgJS0xMXMlcyAlLTE0cyAlM2QgJTNkICVzJTNkICglM2QpJXMgJXMlM2QgKCUzZCklcyAlNWQgJTJkICUyZCAlMnMgJTJzICUxcyAlMXNcbiIsCisgICAgICAgICAgICAgICAoKG9iPT1sZWFkZXIpPyh0ZXJtc3RyWzRdKyIqIik6IiAiKSwKKyAgICAgICAgICAgICAgIG5tWzAuLjEwXSx0ZXJtc3RyWzNdLAorICAgICAgICAgICAgICAgY2FwaXRhbGl6ZShmdW5jYWxsKHFwLFBfR1VJTEQpfHwiIilbMC4uMTNdLAorICAgICAgICAgICAgICAgZnVuY2FsbChxcCxQX0xFVkVMKSwKKyAgICAgICAgICAgICAgIGZ1bmNhbGwocXAsUF9HVUlMRF9MRVZFTCksCisgICAgICAgICAgICAgICB2YWxzWzBdLHZhbHNbMV0sdmFsc1syXSx2YWxzWzNdLAorICAgICAgICAgICAgICAgdmFsc1s0XSx2YWxzWzVdLHZhbHNbNl0sdmFsc1s3XSwKKyAgICAgICAgICAgICAgIGZ1bmNhbGwocXAsUF9XSU1QWSksCisgICAgICAgICAgICAgICB3YW50ZWRfcm93W29iXSxhY3Rfcm93W29iXSxycixmciwKKyAgICAgICAgICAgICAgIChhdHRhY2tfY21kW29iXT8iWCI6Ii0iKSwKKyAgICAgICAgICAgICAgIChhdXRvZm9sbG93W29iXT8iWCI6Ii0iKSk7CisgICAgaWYgKGxvbmdpbmYpIHsKKyAgICAgIGlmICghc3RyaW5ncChmcj1mdW5jYWxsKHFwLFBfV0lNUFlfRElSRUNUSU9OKSkpIGZyPSIiOworICAgICAgaWYgKCFzdHJpbmdwKHJyPWF0dGFja19jbWRbb2JdKSkgcnI9IiI7CisgICAgICBpZiAoZnIhPSIiIHx8IHJyIT0iIikKKyAgICAgICAgaW5mKz1zcHJpbnRmKCIgICAgICAgICAgICAgICUtNDJzICUtMjFzXG4iLHJyWzAuLjQxXSxmclswLi4yMF0pOworICAgIH0KKworICAgIHN3aXRjaCAoYXJnKSB7CisgICAgY2FzZSAiYWxwaGFiZXRpc2NoIjoKKyAgICAgIHJlcys9KHsoeyhxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKT8iMCI6IjEiKStubSxpbmZ9KX0pOworICAgICAgYnJlYWs7CisgICAgY2FzZSAic29ydGllcnQiOgorICAgICAgcmVzKz0oeyh7c3ByaW50ZigiJTJzICUyZCAlMmQgJXMiLHJyLGFjdF9yb3dbb2JdLHdhbnRlZF9yb3dbb2JdLG5tKSwKKyAgICAgICAgICAgICAgICAgaW5mfSl9KTsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICByZXMrPSh7KHtpLGluZn0pfSk7CisgICAgfQorICB9CisgIGlmIChhcmcgJiYgYXJnIT0iIikKKyAgICByZXM9c29ydF9hcnJheShyZXMsIkNtcEZpcnN0QXJyYXlFbGVtZW50IixNRSk7CisgIGZvciAoaT1zaXplb2YocmVzKS0xO2k+PTA7aS0tKQorICAgIHdyaXRlKHJlc1tpXVsxXSk7CisgIHJldHVybiAxOworfQorCit2YXJhcmdzIGludCBTaG93VGVhbVJvb21zKHN0cmluZyBhcmcpIHsKKyAgb2JqZWN0ICp0bWVtYmVycyxvYjsKKyAgc3RyaW5nIHMxLHMyOworICBtaXhlZCAqcmVzOworICBpbnQgaTsKKworICB0bWVtYmVycz1NZW1iZXJzKCk7cmVzPSh7fSk7CisgIGZvciAoaT1zaXplb2YodG1lbWJlcnMpLTE7aT49MDtpLS0pIHsKKyAgICBpZiAoIW9iamVjdHAob2I9dG1lbWJlcnNbaV0pKSBjb250aW51ZTsKKyAgICBpZiAoIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2IpICYmIGFyZyE9ImFsbGUiKSBjb250aW51ZTsKKyAgICBzMT1vYi0+TmFtZShSQVcpOworICAgIGlmICghb2JqZWN0cChvYj1lbnZpcm9ubWVudChvYikpKSBjb250aW51ZTsKKyAgICBpZiAoIXN0cmluZ3AoczI9b2ItPlF1ZXJ5UHJvcChQX0lOVF9TSE9SVCkpKSBzMj0iIjsKKyAgICByZXMrPSh7KHtzMSxzMn0pfSk7CisgIH0KKyAgcmVzPXNvcnRfYXJyYXkocmVzLCJDbXBGaXJzdEFycmF5RWxlbWVudCIsTUUpOworICBmb3IgKGk9c2l6ZW9mKHJlcyktMTtpPj0wO2ktLSkKKyAgICBwcmludGYoIiUtMTFzICUtNjZzXG4iLHJlc1tpXVswXVswLi4xMF0scmVzW2ldWzFdWzAuLjY1XSk7CisgIHJldHVybiAxOworfQorCitpbnQgQ2hhbmdlQ29sb3JzKHN0cmluZyBhcmcpIHsKKyAgaW50ICpjb2w7CisKKyAgbm90aWZ5X2ZhaWwoInRlYW0gZmFyYmVuIGxwX3JvdCBscF9nZWxiIFtrcF9yb3Qga3BfZ2VsYl1cbiIpOworICBpZiAoIWFyZykKKyAgICByZXR1cm4gMDsKKyAgY29sPSh7MCwwLDAsMH0pOworICBpZiAoc3NjYW5mKGFyZywiJWQgJWQgJWQgJWQiLGNvbFswXSxjb2xbMV0sY29sWzJdLGNvbFszXSkhPTQpIHsKKyAgICBpZiAoc3NjYW5mKGFyZywiJWQgJWQiLGNvbFswXSxjb2xbMV0pIT0yKQorICAgICAgcmV0dXJuIDA7CisgICAgY29sWzJdPWNvbFswXTtjb2xbM109Y29sWzFdOworICB9CisgIHByaW50ZigiRGllIEFuemVpZ2UgaXN0IGpldHp0IGdlbGIgdW50ZXIgJWQgTFAsIHJvdCB1bnRlciAlZCBMUFxuIisKKyAgICAgICAgICIgICAgICAgICAgICAgICAgIGJ6dy4gZ2VsYiB1bnRlciAlZCBLUCwgcm90IHVudGVyICVkIEtQLlxuIiwKKyAgICAgICAgIGNvbFsxXSxjb2xbMF0sY29sWzNdLGNvbFsyXSk7CisgIFRQLT5TZXRQcm9wKFBfVEVBTV9DT0xPUlMsY29sKTsKKyAgVFAtPlNldChQX1RFQU1fQ09MT1JTLFNBVkUsRl9NT0RFX0FTKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBDaGFuZ2VBdXRvSW5mbyhzdHJpbmcgYXJnKSB7CisgIHN0cmluZyAqd29yZHMsdHh0OworICBpbnQgaSxmbDsKKworICBpZiAoVFAhPWxlYWRlcikKKyAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIk51ciBkZXIgVGVhbWxlaXRlciBrYW5uIGF1dG9tYXRpc2NoICIrCisgICAgICAgICAgICAgICAgICAgICAgICJpbmZvcm1pZXJ0IHdlcmRlbi5cbiIpLDA7CisgIHdvcmRzPW9sZF9leHBsb2RlKGFyZz9hcmc6IiIsIiAiKTtmbD0wOworICBmb3IgKGk9c2l6ZW9mKHdvcmRzKS0xO2k+PTA7aS0tKSB7CisgICAgc3dpdGNoKHdvcmRzW2ldKSB7CisgICAgY2FzZSAiYXVzIjoKKyAgICAgIHdyaXRlKCJEdSB3aXJzdCBuaWNodCBtZWhyIGF1dG9tYXRpc2NoIGluZm9ybWllcnQuXG4iKTsKKyAgICAgIGF1dG9pbmZfZmxhZ3M9MDsKKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgIitrcCI6CisgICAgICBmbHw9QVVUT0lORl9TUF9QTFVTOworICAgIGNhc2UgImtwIjoKKyAgICAgIGZsfD1BVVRPSU5GX1NQX01JTlVTOworICAgICAgYnJlYWs7CisgICAgY2FzZSAiK2xwIjoKKyAgICAgIGZsfD1BVVRPSU5GX0hQX1BMVVM7CisgICAgY2FzZSAibHAiOgorICAgIGNhc2UgImVpbiI6CisgICAgY2FzZSAiYW4iOgorICAgICAgZmx8PUFVVE9JTkZfSFBfTUlOVVM7CisgICAgICBicmVhazsKKyAgICBjYXNlICJzb2ZvcnQiOgorICAgICAgZmx8PUFVVE9JTkZfSU5TVEFOVDsKKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICA7CisgICAgfQorICB9CisgIGlmICghZmwpCisgICAgcmV0dXJuIG5vdGlmeV9mYWlsKCJXSUUgbW9lY2h0ZXN0IER1IGF1dG9tYXRpc2NoIGluZm9ybWllcnQgd2VyZGVuP1xuIiksMDsKKyAgaWYgKGZsPT1BVVRPSU5GX0lOU1RBTlQpIGZsfD1BVVRPSU5GX0hQX01JTlVTOworICBhdXRvaW5mX2ZsYWdzPWZsOworICB0eHQ9IkR1IHdpcnN0IisoKGZsJkFVVE9JTkZfSU5TVEFOVCk/IiBzb2ZvcnQgIjoiICIpKyJpbmZvcm1pZXJ0LCB3ZW5uIjsKKyAgaWYgKGZsJihBVVRPSU5GX0hQX1BMVVN8QVVUT0lORl9IUF9NSU5VUykpIHsKKyAgICB0eHQrPSIgZGllIExlYmVuc3B1bmt0ZSBlaW5lcyBUZWFtbWl0Z2xpZWRzIjsKKyAgICBpZiAoZmwmKEFVVE9JTkZfSFBfUExVUykpIHR4dCs9IiBzaWNoIGFlbmRlcm4iOyBlbHNlIHR4dCs9IiBmYWxsZW4iOworICAgIGlmIChmbCYoQVVUT0lORl9TUF9QTFVTfEFVVE9JTkZfU1BfTUlOVVMpKSB0eHQrPSIgb2RlciI7CisgIH0KKyAgaWYgKGZsJihBVVRPSU5GX1NQX1BMVVN8QVVUT0lORl9TUF9NSU5VUykpIHsKKyAgICB0eHQrPSIgZGllIEtvbnplbnRyYXRpb25zcHVua3RlIjsKKyAgICBpZiAoZmwmKEFVVE9JTkZfU1BfUExVUykpIHR4dCs9IiBzaWNoIGFlbmRlcm4iOyBlbHNlIHR4dCs9IiBmYWxsZW4iOworICB9CisgIHdyaXRlKGJyZWFrX3N0cmluZyh0eHQrIi5cbiIsNzgpKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ByaXZhdGUgdm9pZCBEb05vdGlmeUhwQ2hhbmdlKCkgeworICBvYmplY3QgKm9icyxvYjsKKyAgc3RyaW5nIHN0cjsKKyAgaW50IGk7CisKKyAgYXV0b2luZl90aW1lPXRpbWUoKTsKKyAgc3RyPSIiOworICBvYnM9bV9pbmRpY2VzKGF1dG9pbmZfaHApOworICBmb3IgKGk9c2l6ZW9mKG9icyktMTtpPj0wO2ktLSkgeworICAgIGlmICghb2JqZWN0cChvYj1vYnNbaV0pKSBjb250aW51ZTsKKyAgICBpZiAoc3RyIT0iIikgc3RyKz0iLCAiOworICAgIHN0cis9c3ByaW50ZigiJXM6ICVkIExQIixvYi0+bmFtZShXRVIpLGF1dG9pbmZfaHBbb2JdKTsKKyAgICBpZiAobWVtYmVyKGF1dG9pbmZfc3Asb2IpKQorICAgICAgc3RyKz1zcHJpbnRmKCIgLyAlZCBLUCIsYXV0b2luZl9zcFtvYl0pOworICAgIG1fZGVsZXRlKGF1dG9pbmZfc3Asb2IpOworICB9CisgIG9icz1tX2luZGljZXMoYXV0b2luZl9zcCk7CisgIGZvciAoaT1zaXplb2Yob2JzKS0xO2k+PTA7aS0tKSB7CisgICAgaWYgKCFvYmplY3RwKG9iPW9ic1tpXSkpIGNvbnRpbnVlOworICAgIGlmIChzdHIhPSIiKSBzdHIrPSIsICI7CisgICAgc3RyKz1zcHJpbnRmKCIlczogJWQgS1AiLG9iLT5uYW1lKFdFUiksYXV0b2luZl9zcFtvYl0pOworICB9CisKKyAgaWYgKHN0ciE9IiIgJiYgSXNNZW1iZXIobGVhZGVyKSkKKyAgICB0ZWxsX29iamVjdChsZWFkZXIsYnJlYWtfc3RyaW5nKGNhcGl0YWxpemUoc3RyKSsiXG4iLDc4KSk7CisgIGF1dG9pbmZfaHA9KFtdKTsKKyAgYXV0b2luZl9zcD0oW10pOworfQorCit2b2lkIE5vdGlmeUhwQ2hhbmdlKCkgeworICBtaXhlZCBhY3Qsb2xkOworICBpbnQgY2hhbmdlOworCisgIGlmICghSXNNZW1iZXIoUE8pIHx8ICFwb2ludGVycChhY3Q9aHBfaW5mb1tQT10pKQorICAgIHJldHVybjsKKyAgb2xkPWFjdFswLi5dOworICBhY3Q9R2V0SHBJbmZvKFBPKTtjaGFuZ2U9MDsKKyAgaWYgKCFhdXRvaW5mX2ZsYWdzKSByZXR1cm47CisgIGlmICgoKGF1dG9pbmZfZmxhZ3MmQVVUT0lORl9IUF9NSU5VUykgJiYgYWN0WzBdPG9sZFswXSkgfHwKKyAgICAgICgoYXV0b2luZl9mbGFncyZBVVRPSU5GX0hQX1BMVVMpICAmJiBhY3RbMF0+b2xkWzBdKSkKKyAgICBhdXRvaW5mX2hwW1BPXT1hY3RbMF0sY2hhbmdlPTE7CisgIGlmICgoKGF1dG9pbmZfZmxhZ3MmQVVUT0lORl9TUF9NSU5VUykgJiYgYWN0WzJdPG9sZFsyXSkgfHwKKyAgICAgICgoYXV0b2luZl9mbGFncyZBVVRPSU5GX1NQX1BMVVMpICAmJiBhY3RbMl0+b2xkWzJdKSkKKyAgICBhdXRvaW5mX3NwW1BPXT1hY3RbMl0sY2hhbmdlPTE7CisKKyAgaWYgKGF1dG9pbmZfdGltZTx0aW1lKCkgfHwgKGNoYW5nZSAmJiAoYXV0b2luZl9mbGFncyZBVVRPSU5GX0lOU1RBTlQpKSkKKyAgICBEb05vdGlmeUhwQ2hhbmdlKCk7Cit9CisKK2ludCBUZWFtQ21kKHN0cmluZyBjbWQsIHN0cmluZyBhcmcpIHsKKyAgaWYgKCFJc01lbWJlcihUUCkpIHsKKyAgICBub3RpZnlfZmFpbCgiRHUgYmlzdCBrZWluIFRlYW1taXRnbGllZC5cbiIpOworICAgIGlmIChUUC0+UXVlcnlQcm9wKFBfVEVBTSk9PU1FKQorICAgICAgVFAtPlNldFByb3AoUF9URUFNLDApOworICAgIHJldHVybiAwOworICB9CisgIHN3aXRjaChjbWQpIHsKKyAgY2FzZSAiYW5ncmlmZiI6CisgICAgcmV0dXJuIFN0YXJ0QXR0YWNrKCk7CisgIGNhc2UgImFuZ3JpZmZzYmVmZWhsIjoKKyAgICBpZiAoc3RyaW5ncChhcmcpKQorICAgICAgYXR0YWNrX2NtZFtUUF09YXJnOworICAgIGVsc2UKKyAgICAgIG1fZGVsZXRlKGF0dGFja19jbWQsYXJnKTsKKyAgICByZXR1cm4gMTsKKyAgY2FzZSAiYXV0b2ZvbGdlIjoKKyAgY2FzZSAiYXV0b2YiOgorICAgIGlmIChhcmc9PSJlaW4iIHx8IGFyZz09ImFuIikKKyAgICAgIGF1dG9mb2xsb3dbVFBdPTE7CisgICAgZWxzZQorICAgICAgbV9kZWxldGUoYXV0b2ZvbGxvdyxUUCk7CisgICAgcmV0dXJuIDE7CisgIGNhc2UgImF1dG9pIjoKKyAgY2FzZSAiYXV0b2luZiI6CisgIGNhc2UgImF1dG9pbmZvIjoKKyAgY2FzZSAiYXV0b2luZm9ybSI6CisgICAgcmV0dXJuIENoYW5nZUF1dG9JbmZvKGFyZyk7CisgIGNhc2UgImVudGxhc3NlIjoKKyAgICByZXR1cm4gUmVtb3ZlTWVtYmVyKGFyZyk7CisgIGNhc2UgImZhcmJlbiI6CisgICAgcmV0dXJuIENoYW5nZUNvbG9ycyhhcmcpOworICBjYXNlICJmbHVjaHRyZWloZSI6CisgIGNhc2UgImZsdWNodCI6CisgICAgcmV0dXJuIENoYW5nZVdpbXB5Um93KGFyZyk7CisgIGNhc2UgImZvcm1hdGlvbiI6CisgICAgaWYgKFRQIT1sZWFkZXIpCisgICAgICByZXR1cm4gbm90aWZ5X2ZhaWwoIk51ciBkZXIgVGVhbWxlaXRlciBrYW5uIGRpZSBGb3JtYXRpb24gYWVuZGVybi5cbiIpLDA7CisgICAgcmV0dXJuIENoYW5nZUZvcm1hdGlvbihhcmcpOworICBjYXNlICJoaXN0IjoKKyAgY2FzZSAiaGlzdG9yeSI6CisgICAgcmV0dXJuIEhpc3QoYXJnKTsKKyAgY2FzZSAiIjoKKyAgY2FzZSAiaW5mbyI6CisgICAgcmV0dXJuIFNob3dUZWFtSFAoYXJnKTsKKyAgY2FzZSAibGVpdGVyIjoKKyAgY2FzZSAibGVpdGVyaW4iOgorICBjYXNlICJsZWl0dW5nIjoKKyAgICByZXR1cm4gQ2hhbmdlTGVhZGVyKGFyZyk7CisgIGNhc2UgIm5hbWUiOgorICAgIHJldHVybiBDaGFuZ2VOYW1lKGFyZyk7CisgIGNhc2UgIm9ydGUiOgorICAgIHJldHVybiBTaG93VGVhbVJvb21zKGFyZyk7CisgIGNhc2UgImthbXBmcmVpaGUiOgorICBjYXNlICJyZWloZSI6CisgICAgcmV0dXJuIENoYW5nZVJvdyhhcmcpOworICBjYXNlICJydWYiOgorICBjYXNlICJydWZlIjoKKyAgICByZXR1cm4gU2hvdXQoYXJnKTsKKyAgY2FzZSAidmVybGFzc2UiOgorICAgIFRQLT5TZXRQcm9wKFBfVEVBTSwwKTsKKyAgICByZXR1cm4gUmVtb3ZlTWVtYmVyKFRQKTsKKyAgZGVmYXVsdDo7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgcmVzZXQoKSB7CisgIFJlbW92ZVNpbmdsZXMoKTsKKyAgVHJ5UmVtb3ZlKCk7Cit9CmRpZmYgLS1naXQgYS9vYmovdGVzdG1vbnN0ZXIuYyBiL29iai90ZXN0bW9uc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYmYwYjQKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdGVzdG1vbnN0ZXIuYwpAQCAtMCwwICsxLDg5IEBACitpbmhlcml0ICJzdGQvbnBjIjsKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKworaW50IHdhcnRlOworIAorY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX05BTUUsICJUZXN0bW9uc3RlciIpOworICBTZXRQcm9wKFBfR0VOREVSLCBORVVURVIpOworICBTZXRQcm9wKFBfU0hPUlQsICJEYXMgVGVzdG1vbnN0ZXIgLSBuZXJ2dG9ldGVuZCAtIik7CisgIFNldFByb3AoUF9BTElHTiwgMTAwKTsKKyAgU2V0UHJvcChQX0xPTkcsIAorICAiRGllcyBpc3QgVGVzdGllLCBkYXMgVGVzdG1vbnN0ZXIuIEVzIGhhdHRlIGFsbGUgbW9lZ2xpY2hlbiwgdWViZWwgYXVzc2VoZW5kZW5cbiIrCisgICJUZXN0Z2VyYWV0ZSBkYWJlaS4gTGVnIERpY2ggbGllYmVyIG5pY2h0IG1pdCBpaG0gYW4gLi4uXG4iKTsKKyAgQWRkSWQoIm1vbnN0ZXIiKTsKKyAgQWRkSWQoInRlc3Rtb25zdGVyIik7CisgIEFkZElkKCJ0ZXN0aWUiKTsKKyAgU2V0UHJvcChQX1JBQ0UsICJ0ZXN0ZXIiKTsKKyAgU2V0UHJvcChQX0xFVkVMLCAxOSk7CisgIFNldFByb3AoUF9NQVhfSFAsIDI3NSk7CisgIFNldFByb3AoUF9IUCwgMjc1KTsKKyAgU2V0UHJvcChQX1hQLCAwKTsKKyAgU2V0UHJvcChQX0hBTkRTLCAoeyIgbWl0IGVpbmVtIFNwYW5udW5nc3BydWVmZXIiLCA1fSkgKTsKKyAgU2V0UHJvcChQX0FDLCAxKTsKKyAgc2V0ZXVpZChnZXR1aWQodGhpc19vYmplY3QoKSkpOworICBBZGRTcGVsbCgxLDUsIkVpbiBUZXN0bW9uc3RlciBzY2hsYWVndCBEaXIgZWluIFRlc3RoZWZ0IHVtIGRpZSBPaHJlbi5cbiIsCisgICAgICAgICAgICAgICAiRWluIFRlc3Rtb25zdGVyIHNjaGxhZWd0IEBXRU4gbWl0IGVpbmVtIFRlc3RoZWZ0LlxuIik7CisgIEFkZFNwZWxsKDEsOCwiRWluIFRlc3Rtb25zdGVyIHRlc3RldCBEZWluZSBSZWFrdGlvbiBhdWYgSGl0emUuXG4iLAorICAgICAgICAgICAgICAgIkVpbiBUZXN0bW9uc3RlciBoYWVsdCBlaW4gRmV1ZXJ6ZXVnIHVudGVyIEBXRVNTRU4gSGludGVybi5cbiIpOworICBBZGRTcGVsbCgxLDExLCJFaW4gVGVzdG1vbnN0ZXIgdGVzdGV0IERlaW5lIFJlYWt0aW9uIGF1ZiBlbGVrdHJpc2NoZW4gU3Ryb20uXG4iLAorICAgICAgICAgICAgICAgICJFaW4gVGVzdG1vbnN0ZXIgdmVycGFzc3QgQFdFTSBlaW5lbiBFbGVrdHJvc2Nob2NrLlxuIik7CisgIEFkZFNwZWxsKDEsMTUsIkVpbiBUZXN0bW9uc3RlciB0ZXN0ZXQgRGVpbmUgU2FldXJlYmVzdGFlbmRpZ2tlaXQuXG4iLAorICAgICAgICAgICAgICAgICJFaW4gVGVzdG1vbnN0ZXIgdWViZXJzY2h1ZXR0ZXQgQFdFTiBtaXQga29uemVudHJpZXJ0ZXIgU2FldXJlLlxuIik7CisgIEFkZFNwZWxsKDEsMTAsIkVpbiBUZXN0bW9uc3RlciBuaW1tdCBlaW5lIEJsdXRwcm9iZSB2b24gRGlyLlxuIiwKKyAgICAgICAgICAgICAgICAiRWluIFRlc3Rtb25zdGVyIHN0aWNodCBAV0VOIG1pdCBlaW5lciBnaWdhbnRpc2NoZW4gTmFkZWwuXG4iKTsKKyAgU2V0UHJvcChQX1NQRUxMUkFURSw1MCk7CisgIHdhcnRlPTEwOworfQorCitnaXZlX25vdGlmeShvYmopCit7CisgIHdyaXRlKCJEYW5rZSBmdWVyICIrb2JqLT5uYW1lKFdFTiwgMSkrIi5cbiIpOworICByZXR1cm4gMTsKK30KKworY2F0Y2hfdGVsbChzdHIpCit7CisgIHN0cmluZyBzMSwgczI7CisKKyAgaWYgKCFzdHIgfHwgc3RyPT0iIikgcmV0dXJuOworICBpZiAoc3NjYW5mKHN0ciwiJXMgdHJpdHQlc1Rlc3Rtb25zdGVyIixzMSxzMikpCisgIHsKKyAgICBzYXlfc3RyKGNhcGl0YWxpemUobmFtZSgpKSsiIHNhZ3Q6IEF1YSwgd2llc28gdHJpdHRzdCBEdSBtaWNoLCAiK3MxKyI/XG4iKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHNzY2FuZihzdHIsIiVzIHNhZ3Q6ICVzIixzMSxzMikpCisgIHsKKyAgICBpZiAoIXMyKSBzMj0iICI7CisgICAgczI9b2xkX2V4cGxvZGUoczIsIlxuIik7CisgICAgaWYgKHNpemVvZihzMikpCisgICAgICBzMj1pbXBsb2RlKHMyLCIgIik7CisgICAgZWxzZQorICAgICAgcmV0dXJuOworICAgIHNheV9zdHIoY2FwaXRhbGl6ZShuYW1lKCkpKyIgc2FndDogV2llc28gc2Fnc3QgRHUgXCIiK3MyKyJcIiwgIitzMSsiPyBcbiIpOworICAgIHJldHVybjsKKyAgfQorfQorCitzYXlfc3RyKHN0cikKK3sKKyAgY2FsbF9vdXQoImRvX3NheSIsMCxzdHIpOworfQorCitkb19zYXkoc3RyKQoreworICBzYXkoc3RyKTsKK30KKworaGVhcnRfYmVhdCgpCit7CisgIDo6aGVhcnRfYmVhdCgpOworICB3YXJ0ZS0tOworICBpZiAod2FydGUpIHJldHVybjsKKyAgd2FydGU9ODsKKyAgRmxlZSgpOworfQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC5jIGIvb2JqL3Rvb2xzL01HdG9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyN2YzNGYKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sLmMKQEAgLTAsMCArMSwxODIzIEBACisvKgorICogIE1HdG9vbC0xLjMKKyAqICBGaWxlOiBNR3Rvb2wuYworICogIE1haW50YWluZXI6IEtpcmtATW9yZ2VuR3JhdWVuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogdGhlIG9yaWdpbmFsIFh0b29sIGlzIGNvcHlyaWdodGVkIGJ5IEh5cCAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjcHJhZ21hIHN0cmljdF90eXBlcworCitpbmhlcml0ICIvc3RkL3RoaW5nL3Byb3BlcnRpZXMiOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2lmICFkZWZpbmVkKFFVRVJZQ0FDSEVEKQorI2RlZmluZSBRVUVSWUNBQ0hFRCA0MDk2CisjZW5kaWYKKyNpZiAhZGVmaW5lZCAoU0VUQ0FDSEVEKQorI2RlZmluZSBTRVRDQUNIRUQgNDA5NgorI2VuZGlmCisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSAiL3NlY3VyZS93aXpsZXZlbHMuaCIKKyNpbmNsdWRlICIvc2VjdXJlL2NvbmZpZy5oIgorI2luY2x1ZGUgPHVzZXJpbmZvLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorCisjaW5jbHVkZSAiTUd0b29sL3Rvb2wuaCIKKworI2luY2x1ZGUgIk1HdG9vbC90b29sbGliLmgiCisKKyNkZWZpbmUgWERCRyAxCisKK25vc2F2ZSBvYmplY3QgIGNsb25lcjsKK25vc2F2ZSBvYmplY3QgIG1zZ3RvPU5VTEw7Citub3NhdmUgc3RyaW5nICptYW5wYXRoPSh7VE9PTF9QQVRIKyIvbWFuLmQvIiwKKwkJCSAiL2RvYy9lZnVuLyIsCisJCQkgIi9kb2MvbGZ1bi8iLAorCQkJICIvZG9jL3cvIiwKKwkJCSAiL2RvYy9oZWxwZGlyLyIsCisJCQkgIi9kb2MvTFBDLyIsCisJCQkgIi9kb2Mvc3RkLyIsCisJCQkgIi9kb2MvY29uY2VwdHMvIiwKKwkJCSAiIn0pOworbm9zYXZlIHN0cmluZyAgbW9yZWZpbGU9TlVMTDsKK25vc2F2ZSBzdHJpbmcgKnNjcmlwdGxpbmU9TlVMTDsKK25vc2F2ZSBzdHJpbmcgKmhpc3Rvcnk9YWxsb2NhdGUoTUFYX0hJU1RPUlkpOworbm9zYXZlIGludCAgICAgbW9yZWZsYWc9RkFMU0U7Citub3NhdmUgaW50ICAgICBtb3Jlb2Zmc2V0PTE7Citub3NhdmUgaW50ICAgICB0ZXJtPU5VTEw7Citub3NhdmUgaW50ICAgICBzY3JpcHRzaXplPU5VTEw7Citub3NhdmUgaW50ICAgICBub3N0b3JlPUZBTFNFOworbm9zYXZlIGludCAgICAgeGxpZ2h0PTA7Citub3NhdmUgaW50ICAgICBwaXBlX2luPUZBTFNFOworbm9zYXZlIGludCAgICAgcGlwZV9vdXQ9RkFMU0U7Citub3NhdmUgaW50ICAgICBwaXBlX292cj1UUlVFOworbm9zYXZlIHN0cmluZyAgcGlwZV9pZj1OVUxMOworbm9zYXZlIHN0cmluZyAgcGlwZV9vZj1OVUxMOworbm9zYXZlIGludCAgICAgeHRrPUZBTFNFOworbm9zYXZlIG1hcHBpbmcgdmFyaWFibGU9KFtdKTsKK25vc2F2ZSBzdHJpbmcgKmNtZHM7Citwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIGxpbmVfYnVmZmVyPShbXSk7Citwcml2YXRlIG5vc2F2ZSBzdHJpbmcgbGluZV9idWZmZXJfbmFtZT0iIjsKK3ByaXZhdGUgbm9zYXZlIHN0cmluZyBtb3JlX3NlYXJjaGV4cHI9IiI7CitpbnQgICAgbW9yZWxpbmVzPU1PUkVfTElORVM7CitpbnQgICAgbW9kaT0oTU9ERV9GSVJTVHxNT0RFX1BST1RFQ1R8TU9ERV9TSE9SVCk7CisKKyNpbmNsdWRlICJNR3Rvb2wvdG9vbGxpYi5jIgorI2luY2x1ZGUgIk1HdG9vbC90b29sY21kLmMiCisKKyNkZWZpbmUgU2FmZVJldHVybih4KSBcCit7IFwKKyAgY21kcz0oe30pOyBcCisgIHBpcGVfaW49RkFMU0U7IFwKKyAgcGlwZV9vZj1OVUxMOyBcCisgIHBpcGVfb3ZyPVRSVUU7IFwKKyAgcGlwZV9vdXQ9RkFMU0U7IFwKKyAgcGlwZV9vZj1OVUxMOyBcCisgIHJldHVybiAoeCk7IFwKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBjaGVjayBzb21lIHNlY3VyaXR5IGFzcGVjdHMKKyAqLworCitzdGF0aWMgaW50IHNlY3VyaXR5KCkKK3sKKyAgb2JqZWN0IHByZXY7CisgCisgIGlmKCBwcm9jZXNzX2NhbGwoKSB8fCBnZXR1aWQoKSE9Z2V0dWlkKGNsb25lcikgKSByZXR1cm4gRkFMU0U7IC8vIFJ1bWF0YQorCisgIFRLKCJVSUQ6ICIrZ2V0dWlkKE1FKSsiIGNsb25lcjoiK2dldHVpZChjbG9uZXIpKTsKKy8vICBUSygicHJldjogIitvYmplY3RfbmFtZShQUkVWKSsiIG1lOiIrb2JqZWN0X25hbWUoTUUpKTsKKyAgaWYocHJldj1QUkVWKQorICB7CisgICAgaWYoIWNsb25lcikKKyAgICAgIHJldHVybiBUUlVFOworICAgIGlmKGdldHVpZChwcmV2KT09Uk9PVElEfHxJU19BUkNIKHByZXYpKQorICAgICAgcmV0dXJuIFRSVUU7CisgICAgaWYocHJldj09TUUpCisgICAgICByZXR1cm4gVFJVRTsKKyAgICByZXR1cm4gc2VjdXJlX2xldmVsKCk+PXF1ZXJ5X3dpel9sZXZlbChjbG9uZXIpOyAvLyBSdW1hdGEKKyAgICAvL3JldHVybiBnZXR1aWQocHJldik9PWdldHVpZCgpJiZnZXRldWlkKHByZXYpPT1nZXRldWlkKCkmJmNsb25lcj09UlRQOworICB9CisgIGVsc2UKKyAgICByZXR1cm4gY2xvbmVyPT1OVUxMOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIG93biB3cml0ZSBmdW5jdGlvbgorICovCisKK3N0YXRpYyBpbnQgV3JpdGUoc3RyaW5nIHN0cikKK3sKKyAgaWYoIXN0cmluZ3Aoc3RyKSB8fCBzdHI9PSIiKQorICAgIHJldHVybiBGQUxTRTsKKyAgaWYoIWNsb25lciAmJiBvYmplY3RwKHRoaXNfcGxheWVyKCkpKQorICAgIHdyaXRlKHN0cik7CisgIGVsc2UKKyAgICB0ZWxsX29iamVjdChjbG9uZXIsIHN0cik7CisgIHJldHVybiBUUlVFOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIG93biBjb21tYW5kIGZ1bmN0aW9uCisgKi8KKworc3RhdGljIGludCBDb21tYW5kKHN0cmluZyBzdHIpCit7CisgIGludCBpOworICBUSygiQ29tbWFuZDogc3RyOiAiKyhzdHI/c3RyOiIoTlVMTCkiKSk7CisgIG5vc3RvcmUrKzsKKyAgaWYoTU9ERShNT0RFX0VDSE8pKQorICAgIFdMTigiRG9pbmc6ICIrc3RyKTsKKyAgaT0oaW50KWNsb25lci0+Y29tbWFuZF9tZShzdHIpOworICBub3N0b3JlLS07CisgIHJldHVybiBpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIG9iamVjdCBzZWFyY2hpbmcKKyAqLworCitzdGF0aWMgdmFyYXJncyBvYmplY3QgWEZpbmRPYmooc3RyaW5nIHN0ciwgaW50IHNpbGVudCkKK3sKKyAgb2JqZWN0IG9iaiwgZW52OworICBzdHJpbmcgKnN0cnM7CisgIGludCBpLCBzLCBjbnQ7CisgIAorICBpZighc3RyKQorICAgIHJldHVybiBOVUxMOworICBUSygiWEZpbmRPYmo6IHN0cjogIisoc3RyP3N0cjoiKE5VTEwpIikpOworICBlbnY9RU5WKGNsb25lcik7CisgIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsICJcXC4iLCKwMDEiKTsKKyAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwgIlxcXiIsICKwMDIiKTsKKyAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwgIlxcJCIsICKwMDMiKTsKKyAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwgIlxcXFwiLCAiXFwiKTsKKyAgaWYgKGZpbmRfb2JqZWN0KHN0cikpIHJldHVybiBmaW5kX29iamVjdChzdHIpOworICBpZiAoZmlsZV9zaXplKHN0cik+MSkgeworICAgICBjYWxsX290aGVyKHN0ciwgIj8/PyIpOworICAgICByZXR1cm4gZmluZF9vYmplY3Qoc3RyKTsKKyAgfQorICBzPXNpemVvZihzdHJzPXN0cmlwX2V4cGxvZGUoc3RyLCAiLiIpKTsKKyAgd2hpbGUocy0tKQorICB7CisgICAgaWYoc3Ryc1tpXT09Im0ifHxzdHJzW2ldPT0ibWUiKQorICAgICAgc3Ryc1tpXT1STkFNRShjbG9uZXIpOworICAgIGVsc2UgaWYoc3Ryc1tpXT09ImgifHxzdHJzW2ldPT0iaGVyZSIpCisgICAgICBzdHJzW2ldPW9iamVjdF9uYW1lKEVOVihjbG9uZXIpKTsKKyAgICBpZihvYmo9RmluZE9iaihzdHJzW2krK10sZW52LChzaWxlbnQ/MTowKSkpCisgICAgICBlbnY9b2JqOworICAgIGVsc2UKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiBvYmo7Cit9CisKK3N0YXRpYyB2YXJhcmdzIG9iamVjdCBGaW5kT2JqKHN0cmluZyBzdHIsIG9iamVjdCBlbnYsIGludCBzaWxlbnQpCit7CisgIG9iamVjdCBvYmosICppbnY7CisgIHN0cmluZyB0bXA7CisgIGludCBudW0sIGU7CisgIAorICBpZiAoIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikgfHwgIW9iamVjdHAoZW52KSkKKyAgICByZXR1cm4gTlVMTDsKKyAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwgIrAwMSIsICIuIik7CisgIHdoaWxlKHN0cltlKytdPT0nXicpCisgICAgOworICBzdHI9c3RyWy0tZS4uPDFdOworICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCAisDAyIiwgIl4iKTsKKyAgaWYob2JqPVZhclRvT2JqKHN0cikpCisgICAgOworICBlbHNlIGlmKHN0clswXT09JwMnKQorICAgIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsICKwMDMiLCAiJCIpOworICBlbHNlIGlmKHNzY2FuZihzdHIsICIlZCIsIG51bSkmJihpbnY9YWxsX2ludmVudG9yeShlbnYpKSkKKyAgeworICAgIGlmKG51bT4wJiZudW08PXNpemVvZihpbnYpKQorICAgICAgb2JqPWludltudW0tMV07CisgICAgZWxzZQorICAgIHsKKyAgICAgIFdETE4oIlNwZWNpZmllZCBvYmplY3QgbnVtYmVyIG91dCBvZiByYW5nZSBbMS0iK3NpemVvZihpbnYpKyJdIik7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgIH0KKyAgaWYob2JqfHwob2JqPXByZXNlbnQoc3RyLCBlbnYpKXx8CisgICAgIChvYmo9ZmluZF9wbGF5ZXIoTE9XRVIoc3RyKSkpfHwKKyAgICAgKG9iaj1maW5kX2xpdmluZyhzdHIpKXx8CisgICAgIChvYmo9ZmluZF9vYmplY3QobG9uZ19wYXRoKHN0cikpKSkKKyAgeworICAgIHdoaWxlKGUtLSkKKyAgICB7CisgICAgICBpZighKG9iaj1FTlYob2JqKSkpCisgICAgICB7CisJVygiU3BlY2lmaWVkIG9iamVjdCBoYXMgbm8gZW52aXJvbm1lbnQgWyIpOworCXdoaWxlKGUtLSkKKwkgIFcoIl4iKTsKKwlXRExOKHN0cisiXSIpOworCXJldHVybiBOVUxMOworICAgICAgfQorICAgIH0KKyAgfQorICBlbHNlCisgICAgaWYoIXNpbGVudCkKKyAgICAgIFdETE4oIlNwZWNpZmllZCBvYmplY3QgZG9lcyBub3QgZXhpc3QgWyIrc3RyKyJdIik7CisgIHJldHVybiBvYmo7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogb2JqZWN0IHZhcmlhYmxlIGhhbmRsaW5nCisgKi8KKworc3RhdGljIG9iamVjdCBWYXJUb09iaihzdHJpbmcgc3RyKQoreworICBpZiAoIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikgfHwgc3RyWzBdIT0nJCcpCisgICAgcmV0dXJuIE5VTEw7CisgIHN3aXRjaChzdHIpCisgIHsKKyAgICBjYXNlICIkbSI6CisgICAgY2FzZSAiJG1lIjoKKyAgICByZXR1cm4gY2xvbmVyOworICAgIGNhc2UgIiRoIjoKKyAgICBjYXNlICIkaGVyZSI6CisgICAgcmV0dXJuIEVOVihjbG9uZXIpOworICAgIGRlZmF1bHQ6CisgICAgcmV0dXJuIHZhcmlhYmxlW3N0clsxLi48MV1dOworICB9CisgIHJldHVybihOVUxMKTsgLy9uZXZlciByZWFjaGVkCit9CisKK3N0YXRpYyBzdHJpbmcgVmFyVG9GaWxlKHN0cmluZyBzdHIpCit7CisgIHJldHVybiBzb3VyY2VfZmlsZV9uYW1lKFZhclRvT2JqKHN0cikpOworfQorCitzdGF0aWMgc3RyaW5nIFZhclRvUHVyZUZpbGUoc3RyaW5nIHN0cikKK3sKKyAgcmV0dXJuIHB1cmVfZmlsZV9uYW1lKFZhclRvT2JqKHN0cikpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIG9iamVjdCBkZXNjcmlwdGlvbiBwcmludGluZworICovCisKK3N0YXRpYyB2b2lkIFByaW50T2JqKG9iamVjdCBvYmosIHN0cmluZyBmaWxlKQoreworICBvYmplY3QgaXRlbSwgdG1wOworICBzdHJpbmcgc3RyOworICBpbnQgaTsKKworICBTRUNVUkUxKCk7CisgIGlmKCFvYmopCisgICAgcmV0dXJuOworICBQcmludFNob3J0KCJTaG9ydDogIiwgb2JqLCBmaWxlKTsKKyAgaWYoIWZpbGV8fGZpbGU9PSIiKQorICAgIFdMTigiTG9uZyA6Iik7CisgIGVsc2UKKyAgICB3cml0ZV9maWxlKGZpbGUsIkxvbmcgOlxuIik7CisgIGlmKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2JqKSkKKyAgICBzdHI9Y2FwaXRhbGl6ZShnZXR1aWQob2JqKSk7CisgIGVsc2UKKyAgeworICAgIGlmKG9iamVjdF9uYW1lKG9iailbMC4uMjZdPT0iL2QvdW50ZXJ3ZWx0L29iamVrdGUvdGVkZHkjIiAmJgorICAgICAgIElTX0FSQ0godGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICAgIHN0cj0iRWluIFRlZGR5IChzdHVtbSkiOworICAgIGVsc2UKKyAgICB7CisgICAgICBpZihzdHI9KHN0cmluZylvYmotPlF1ZXJ5UHJvcChQX0lOVF9MT05HKSkKKwk7CisgICAgICBlbHNlIGlmKHN0cj0oc3RyaW5nKW9iai0+UXVlcnlQcm9wKFBfTE9ORykpCisJOworICAgICAgZWxzZQorCXN0cj0iLSBubyBsb25nIGRlc2NyaXB0aW9uIC1cbiI7CisgICAgfQorICB9CisgIGlmKCFmaWxlfHxmaWxlPT0iIikKKyAgICBXKHN0cik7CisgIGVsc2UKKyAgICB3cml0ZV9maWxlKGZpbGUsc3RyKTsKKyAgRk9SQUxMKGl0ZW0sIG9iaikKKyAgeworICAgIGlmKCFpKQorICAgICAgaWYoIWZpbGV8fGZpbGU9PSIiKQorCVdMTigiQ29udGVudDoiKTsKKyAgICAgIGVsc2UKKwl3cml0ZV9maWxlKGZpbGUsIkNvbnRlbnQ6XG4iKTsKKyAgICBQcmludFNob3J0KEFSSUdIVCgrK2krIi4gIiwgNCwgIiAiKSwgaXRlbSwgZmlsZSk7CisgIH0KK30KKworc3RhdGljIHN0cmluZyBPYmpGaWxlKG9iamVjdCBvYmopCit7CisgIHJldHVybiAiWyIrc2hvcnRfcGF0aChvYmplY3RfbmFtZShvYmopKSsiXSI7Cit9CisKK3N0YXRpYyB2YXJhcmdzIHZvaWQgUHJpbnRTaG9ydChzdHJpbmcgcHJlLCBvYmplY3Qgb2JqLCBzdHJpbmcgZmlsZSkKK3sKKyAgc3RyaW5nIHN0cjsKKworICBTRUNVUkUxKCk7CisgIGlmKCFvYmopCisgICAgcmV0dXJuOworICBpZihNT0RFKE1PREVfU0hPUlQpKQorICB7CisgICAgaWYgKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2JqKSkKKyAgICAgIHN0cj1jYXBpdGFsaXplKGdldHVpZChvYmopKTsKKyAgICBlbHNlCisgICAgeworICAgICAgaWYoISgoc3RyPShzdHJpbmcpb2JqLT5RdWVyeVByb3AoUF9JTlRfU0hPUlQpKXx8CisJICAgKHN0cj0oc3RyaW5nKW9iai0+UXVlcnlQcm9wKFBfU0hPUlQpKSkpCisJaWYoaXNfcGxheWVyKG9iaikpCisJICBzdHI9Q1JOQU1FKG9iaikrIiAoaW52aXNpYmxlKSI7CisJZWxzZQorCSAgc3RyPSItIG5vIHNob3J0IGRlc2NyaXB0aW9uIC0iOworICAgIH0KKyAgICBzdHI9QUxFRlQoc3ByaW50ZigiJU8gIixzdHIpLCAzNCwgIi4iKSsiICI7CisgIH0KKyAgZWxzZQorICAgIHN0cj0iIjsKKyAgaWYoaW50ZXJhY3RpdmUob2JqKSkKKyAgICBzdHIrPSJpIjsKKyAgZWxzZSBpZihsaXZpbmcob2JqKSkKKyAgICBzdHIrPSJsIjsKKyAgZWxzZQorICAgIHN0cis9Ii4iOworICBzdHIrPShzaGFkb3cob2JqLCAwKSA/ICJzIiA6ICIuIik7CisgIGlmKCFmaWxlfHxmaWxlPT0iIikKKyAgICBXTE4oKHByZStDQVAoc3RyKSsiICIrT2JqRmlsZShvYmopKVswLi43OV0pOworICBlbHNlCisgICAgd3JpdGVfZmlsZShmaWxlLChwcmUrQ0FQKHN0cikrIiAiK09iakZpbGUob2JqKSlbMC4uNzldKyJcbiIpOworfQorCitzdGF0aWMgdmFyYXJncyB2b2lkIERlZXBQcmludFNob3J0KG9iamVjdCBlbnYsIGludCBpbmRlbnQsIHN0cmluZyBwcmUsIHN0cmluZyBmaWxlKQoreworICBpbnQgaTsKKyAgb2JqZWN0IGl0ZW07CisgIHN0cmluZyBzdHI7CisgIAorICBTRUNVUkUxKCk7CisgIGlmKCFlbnYpCisgICAgcmV0dXJuOworICBmb3IoaT1pbmRlbnQsc3RyPSIiOyBpLS07IHN0cis9IiAgIik7CisgIGlmKHByZSkKKyAgICBzdHIrPXByZTsKKyAgaWYoIWZpbGV8fGZpbGU9PSIiKQorICAgIFcoc3RyKTsKKyAgZWxzZQorICAgIHdyaXRlX2ZpbGUoZmlsZSxzdHIpOworICBpKys7CisgIFByaW50U2hvcnQoIiIsZW52LGZpbGUpOworICBGT1JBTEwoaXRlbSwgZW52KQorICAgIERlZXBQcmludFNob3J0KGl0ZW0saW5kZW50KzEsQVJJR0hUKCgrK2kpKyIuICIsNCwiICIpLGZpbGUpOworfQorCitzdGF0aWMgc3RyaW5nIGJyZWFrX3N0cmluZ19oYXJkKHN0cmluZyBzdHIsIGludCBsZW4sIHN0cmluZyBwcmUpCit7CisgIGludCBzLHAsdDsKKyAgc3RyaW5nIHRtcDsKKworICBpZighc3RyfHwhKHM9c2l6ZW9mKHN0cikpKQorICAgIHJldHVybiAiIjsKKyAgdD1sZW4tKHA9c2l6ZW9mKHByZSkpLTE7CisKKyAgdG1wPSIiOworICB3aGlsZShwK3M+bGVuKQorICB7CisgICAgdG1wKz1wcmUrc3RyWzAuLnRdKyJcbiI7CisJc3RyPXN0clt0KzEuLl07CisJcy09dDsKKyAgfQorICBpZihzaXplb2Yoc3RyKSkKKyAgICB0bXArPXByZStzdHJbMC4uXSsiXG4iOworICByZXR1cm4gdG1wOworfQorICAKK3N0YXRpYyB2b2lkIGRwcm9wKHN0cmluZyBrZXksIG1peGVkIGRhdGEsIG9iamVjdCBvYmopCit7CisgIGlmKHBpcGVfb3V0JiZwaXBlX29mKQorICAgIHdyaXRlX2ZpbGUocGlwZV9vZixicmVha19zdHJpbmdfaGFyZChtaXhlZF90b19zdHJpbmcob2JqLT5RdWVyeVByb3Aoa2V5KSxNQVhfUkVDVVJTSU9OKSw3OCxBTEVGVChrZXkrIiAiLDE4LCIuIikrIiA9ICIpKTsKKyAgZWxzZQorICAgIFcoYnJlYWtfc3RyaW5nX2hhcmQobWl4ZWRfdG9fc3RyaW5nKG9iai0+UXVlcnlQcm9wKGtleSksTUFYX1JFQ1VSU0lPTiksNzgsQUxFRlQoa2V5KyIgIiwxOCwiLiIpKyIgPSAiKSk7Cit9CisKK3N0YXRpYyBzdHJpbmcgcHJvcGZsYWdzKHN0cmluZyBrZXksIG9iamVjdCBvYikKK3sKKyAgaW50IHRtcDsKKyAgc3RyaW5nICpmbGFnczsKKyAgdG1wPShpbnQpb2ItPlF1ZXJ5KGtleSwxKTsKKyAgZmxhZ3M9KHt9KTsKKyAgdG1wJlNBVkUgPwkgICAgICAgZmxhZ3MrPSh7IlNBViJ9KSA6IGZsYWdzKz0oeyIgICAifSk7CisgIHRtcCZQUk9URUNURUQgPyAgICAgIGZsYWdzKz0oeyJQUk8ifSkgOiBmbGFncys9KHsiICAgIn0pOworICB0bXAmU0VDVVJFRCA/ICAgICAgICBmbGFncys9KHsiU0VDIn0pIDogZmxhZ3MrPSh7IiAgICJ9KTsKKyAgdG1wJk5PU0VUTUVUSE9EID8gICAgZmxhZ3MrPSh7Ik5TTSJ9KSA6IGZsYWdzKz0oeyIgICAifSk7CisgIHRtcCZTRVRNTk9URk9VTkQgPyAgIGZsYWdzKz0oeyJTTU4ifSkgOiBmbGFncys9KHsiICAgIn0pOworICB0bXAmUVVFUllNTk9URk9VTkQgPyBmbGFncys9KHsiUU1OIn0pIDogZmxhZ3MrPSh7IiAgICJ9KTsKKyAgdG1wJlFVRVJZQ0FDSEVEID8gICAgZmxhZ3MrPSh7IlFDQSJ9KSA6IGZsYWdzKz0oeyIgICAifSk7CisgIHRtcCZTRVRDQUNIRUQgPyAgICAgIGZsYWdzKz0oeyJTQ0EifSkgOiBmbGFncys9KHsiICAgIn0pOworICByZXR1cm4gIiIraW1wbG9kZShmbGFncywifCIpOworfQorCitzdGF0aWMgdm9pZCBkcHJvcDIoc3RyaW5nIGtleSwgbWl4ZWQgZGF0YSwgb2JqZWN0IG9iKQoreworICBpZihwaXBlX291dCYmcGlwZV9vZikKKyAgICB3cml0ZV9maWxlKHBpcGVfb2YsYnJlYWtfc3RyaW5nX2hhcmQobWl4ZWRfdG9fc3RyaW5nKHByb3BmbGFncyhrZXksb2IpLE1BWF9SRUNVUlNJT04pLDc4LEFMRUZUKGtleSsiICIsMTgsIi4iKSsiID0gIikpOworICBlbHNlCisgICAgVyhicmVha19zdHJpbmdfaGFyZChtaXhlZF90b19zdHJpbmcocHJvcGZsYWdzKGtleSxvYiksTUFYX1JFQ1VSU0lPTiksNzgsQUxFRlQoa2V5KyIgIiwxOCwiLiIpKyIgPSAiKSk7Cit9CisKK3N0YXRpYyBtaXhlZCBwcm9wbWV0aG9kcyhzdHJpbmcga2V5LCBvYmplY3Qgb2IpCit7CisgIHJldHVybiAobWl4ZWQpb2ItPlF1ZXJ5KGtleSwyKTsKK30KKworc3RhdGljIHZvaWQgZHByb3AzKHN0cmluZyBrZXksIG1peGVkIGRhdGEsIG9iamVjdCBvYikKK3sKKyAgaWYocGlwZV9vdXQmJnBpcGVfb2YpCisgICAgd3JpdGVfZmlsZShwaXBlX29mLGJyZWFrX3N0cmluZ19oYXJkKG1peGVkX3RvX3N0cmluZyhwcm9wbWV0aG9kcyhrZXksb2IpLE1BWF9SRUNVUlNJT04pLDc4LEFMRUZUKGtleSsiICIsMTgsIi4iKSsiID0gIikpOworICBlbHNlCisgICAgVyhicmVha19zdHJpbmdfaGFyZChtaXhlZF90b19zdHJpbmcocHJvcG1ldGhvZHMoa2V5LG9iKSxNQVhfUkVDVVJTSU9OKSw3OCxBTEVGVChrZXkrIiAiLDE4LCIuIikrIiA9ICIpKTsKK30KKworc3RhdGljIHZvaWQgRHVtcFByb3BlcnRpZXMob2JqZWN0IG9iaiwgaW50IGZsYWcpCit7CisgIFNFQ1VSRTEoKTsKKyAgaWYoIW9iaikKKyAgICByZXR1cm47CisgIFBJUEVfREVMRVRFKHBpcGVfb2YpOworICBzd2l0Y2ggKGZsYWcpIHsKKyAgICBjYXNlIDA6CisgICAgICB3YWxrX21hcHBpbmcoKChtYXBwaW5nICopKG9iai0+X19xdWVyeV9wcm9wZXJ0aWVzKCkpKVswXSwjJ2Rwcm9wLG9iaik7IC8vJykKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIHdhbGtfbWFwcGluZygoKG1hcHBpbmcgKikob2JqLT5fX3F1ZXJ5X3Byb3BlcnRpZXMoKSkpWzBdLCMnZHByb3AyLG9iaik7IC8vJykKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIHdhbGtfbWFwcGluZygoKG1hcHBpbmcgKikob2JqLT5fX3F1ZXJ5X3Byb3BlcnRpZXMoKSkpWzBdLCMnZHByb3AzLG9iaik7IC8vJykKKyAgICAgIGJyZWFrOworICB9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogbW92aW5nIG9iamVjdHMKKyAqLworCitzdGF0aWMgaW50IE1vdmVPYmoob2JqZWN0IG9iajEsIG9iamVjdCBvYmoyLCBpbnQgc2lsZW50KQoreworICBpbnQgZXJyOworICBvYmplY3Qgb2xkZW52OworCisgIFNFQ1VSRTIoRkFMU0UpOworICBpZighKG9iajEmJm9iajIpKQorICAgIHJldHVybiBGQUxTRTsKKyAgb2xkZW52PUVOVihvYmoxKTsKKyAgZXJyPShpbnQpb2JqMS0+bW92ZShvYmoyLCBNX1NJTEVOVHxNX05PQ0hFQ0spOworICBpZighc2lsZW50KQorICAgIHN3aXRjaChlcnIpCisgICAgeworICAgICAgY2FzZSBNRV9QTEFZRVI6CisgICAgICBXRExOKCJPYmplY3QgcmV0dXJuZWQgTUVfUExBWUVSIik7CisgICAgICBpZihvbGRlbnYgJiYgb2xkZW52ICE9IEVOVihvYmoxKSkKKwlXRExOKCJPYmplY3QgaGFzIGJlZW4gbW92ZWQiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIGNhc2UgTUVfVE9PX0hFQVZZOgorICAgICAgV0RMTigiT2JqZWN0IHJldHVybmVkIE1FX1RPT19IRUFWWSIpOworICAgICAgaWYob2xkZW52ICYmIG9sZGVudiAhPSBFTlYob2JqMSkpCisJV0RMTigiT2JqZWN0IGhhcyBiZWVuIG1vdmVkIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBjYXNlIE1FX0NBTlRfVFBPUlRfSU46CisgICAgICBXRExOKCJPYmplY3QgcmV0dXJuZWQgTUVfQ0FOVF9UUE9SVF9JTiIpOworICAgICAgaWYob2xkZW52ICYmIG9sZGVudiAhPSBFTlYob2JqMSkpCisJV0RMTigiT2JqZWN0IGhhcyBiZWVuIG1vdmVkIik7CisgICAgICByZXR1cm4gRkFMU0U7CisgICAgICBjYXNlIE1FX0NBTlRfVFBPUlRfT1VUOgorICAgICAgV0RMTigiT2JqZWN0IHJldHVybmVkIE1FX0NBTlRfVFBPUlRfT1VUIik7CisgICAgICBpZihvbGRlbnYgJiYgb2xkZW52ICE9IEVOVihvYmoxKSkKKwlXRExOKCJPYmplY3QgaGFzIGJlZW4gbW92ZWQiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICBXRExOKCJPYmplY3QgcmV0dXJuZWQgdW5rbm93biByZXR1cm4gdmFsdWUiKTsKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgIHJldHVybiBUUlVFOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHNhdmUgZGVzdHJ1Y3Rpbmcgb2Ygb2JqZWN0cworICovCisKK3N0YXRpYyB2b2lkIERlc3RydWN0KG9iamVjdCBvYmopCit7CisgIGlmKCFvYmogfHwgIXRoaXNfb2JqZWN0KCkpCisgICAgcmV0dXJuOworICBjYXRjaChvYmotPnJlbW92ZSgpKTsKKyAgaWYob2JqZWN0cChvYmopICYmICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iaikpCisgICAgZGVzdHJ1Y3Qob2JqKTsKK30KKworc3RhdGljIHZvaWQgRGVlcENsZWFuKG9iamVjdCBvYmopCit7CisgIGlmKCFvYmopCisgICAgcmV0dXJuOworICBmaWx0ZXIoZmlsdGVyKGRlZXBfaW52ZW50b3J5KG9iaiksICJpc19ub3RfcGxheWVyIiwgTUUpLAorCSAgICAgICAiRGVzdHJ1Y3QiLCBNRSk7CisgIGlmKGlzX25vdF9wbGF5ZXIob2JqKSkKKyAgICBEZXN0cnVjdChvYmopOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIFNob3cgdGhlIGluaGVyaXRhbmNlIHRyZWUgb2Ygb2JqZWN0cworICovCisKK3N0YXRpYyBvYmplY3QgKlN1Yk5vZGVzKG9iamVjdCBvYmopCit7CisgIGludCBzOworICBvYmplY3QgKm9ianM7CisgIHN0cmluZyAqaW5saXN0OworICAKKyAgaWYoIW9iaikKKyAgICByZXR1cm4gTlVMTDsKKyAgaW5saXN0PWluaGVyaXRfbGlzdChvYmopOworICBzPXNpemVvZihpbmxpc3QpOworICBvYmpzPSh7fSk7CisgIHdoaWxlKHMtLT4xKQorICAgIG9ianM9KHtmaW5kX29iamVjdChpbmxpc3Rbc10pfSkrb2JqczsKKyAgcmV0dXJuIG9ianM7Cit9CisKK3N0YXRpYyB2b2lkIEluaGVyaXRhbmNlKG9iamVjdCBvYmosIHN0cmluZyBmdW5jLCBzdHJpbmcgcHJlKQoreworICBpbnQgaSwgczsKKyAgb2JqZWN0ICpsbjsKKyAgc3RyaW5nIHN0cjsKKyAgCisgIGlmKCFvYmopCisgICAgcmV0dXJuOworICBzdHI9cHJlKyIgIitPYmpGaWxlKG9iaik7CisgIGlmKGZ1bmMpCisgIHsKKyAgICBzdHI9QUxFRlQoc3RyKyIgIiwgNTAsICIuIik7CisgICAgaWYoZnVuY3Rpb25fZXhpc3RzKGZ1bmMsIG9iaik9PW9iamVjdF9uYW1lKG9iaikpCisgICAgICBzdHIrPUFSSUdIVCgiICIrZnVuYywgMTksICIuIik7CisgICAgZWxzZQorICAgICAgc3RyKz1BUklHSFQoIiIsIDE5LCAiLiIpOworICB9CisgIGlmKHBpcGVfb3V0JiZwaXBlX29mKQorICAgIHdyaXRlX2ZpbGUocGlwZV9vZixzdHIrIlxuIik7CisgIGVsc2UKKyAgICBXTE4oc3RyKTsKKyAgbG49U3ViTm9kZXMob2JqKTsKKyAgZm9yKGk9MDsgaTxzaXplb2YobG4pOyBpKyspCisgICAgbG49bG4tU3ViTm9kZXMobG5baV0pOworICBzPXNpemVvZihsbik7CisgIGZvcihpPTA7IGk8czsgaSsrKQorICAgIEluaGVyaXRhbmNlKGxuW2ldLCBmdW5jLCBwcmUrIi4uLi4uIik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogZmlsZSBuYW1lIGhhbmRsaW5nCisgKi8KKworc3RhdGljIHN0cmluZyBYRmlsZShzdHJpbmcgZmlsZSkKK3sKKyAgVEsoIlhGaWxlOiBmaWxlOiAiKyhmaWxlP2ZpbGU6IihOVUxMKSIpKTsKKyAgaWYoZmlsZSkKKyAgICBzd2l0Y2goZmlsZVswXSkKKyAgICB7CisgICAgICBjYXNlICdAJzoKKwlyZXR1cm4gc291cmNlX2ZpbGVfbmFtZShYRmluZE9iaihmaWxlWzEuLjwxXSkpOworICAgICAgY2FzZSAnJCc6CisJcmV0dXJuIHNvdXJjZV9maWxlX25hbWUoWEZpbmRPYmooZmlsZSkpOworICAgICAgZGVmYXVsdDoKKwlyZXR1cm4gb2xkX2V4cGxvZGUobG9uZ19wYXRoKGZpbGUpLCIjIilbMF07CisgICAgfQorICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIHN0cmluZyBYRmluZEZpbGUoc3RyaW5nIGZpbGUpCit7CisgIFRLKCJYRmluZEZpbGU6IGZpbGU6ICIrKGZpbGU/ZmlsZToiKE5VTEwpIikpOworICBpZihmaWxlPVhGaWxlKGZpbGUpKQorICB7CisgICAgaWYoZmlsZV9zaXplKGZpbGUpPj0wKQorICAgICAgcmV0dXJuIGZpbGU7CisgICAgaWYoZmlsZVs8My4uPDFdIT0iLmMiICYmIGZpbGVfc2l6ZShmaWxlKyIuYyIpPjApCisgICAgICByZXR1cm4gZmlsZSsiLmMiOworICB9CisgIFdETE4oIkZpbGUgbm90IGZvdW5kIG9yIG5vdCByZWFkYWJsZSBbIitzaG9ydF9wYXRoKGZpbGUpKyJdIik7CisgIHJldHVybiBOVUxMOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGZpbGUgcHJpbnRpbmcsIHNlYXJjaGluZyBhbmQgZXhlY3V0aW5nCisgKi8KKworc3RhdGljIHZvaWQgWE1vcmVGaWxlKHN0cmluZyBmaWxlLCBpbnQgZmxhZykKK3sKKyAgaW50IHMsc2l6ZTsKKyAgCisgIFNFQ1VSRTEoKTsKKyAgaWYoIWZpbGUpCisgICAgcmV0dXJuOworICAKKyAgLy8gdGVybT0oc3RyaW5nKWNsb25lci0+UXVlcnlQcm9wKFBfVFRZKSE9ImR1bWIiOworICBpZigoc2l6ZT0oZmlsZV9zaXplKG1vcmVmaWxlPWxvbmdfcGF0aChmaWxlKSkpKT4wKQorICB7CisgICAgaWYoc2l6ZT4xMDAwMDApCisgICAgICBXRExOKCJXYXJuaW5nOiBsYXJnZSBmaWxlIik7CisgICAgTW9yZUZpbGUoTlVMTCk7CisgIH0KKyAgZWxzZSBpZihmbGFnKQorICAgIFdETE4oIkNhbm5vdCByZWFkIGZpbGUiKTsKK30KKworLyoKK3N0YXRpYyBzdHJpbmcgcmVhZF9idWZmZXIoc3RyaW5nIGZpbGVuYW1lLCBpbnQgc3RhcnQsIGludCBudW1iZXIpCit7CisgIG1peGVkIHRtcDsKKyAgc3RyaW5nIHJlc3VsdDsKKyAgaW50IGN1cnJlbnQ7CisKKyAgaWYoIWZpbGVuYW1lfHxmaWxlbmFtZT09IiIpCisgICAgcmV0dXJuICIiOworICBpZihudW1iZXI8PTEpCisgICAgbnVtYmVyPTE7CisgIG51bWJlci0tOworICByZXN1bHQ9IiI7CisgIGlmKGZpbGVuYW1lIT1saW5lX2J1ZmZlcl9uYW1lKQorICB7CisgICAgLy8gVEsoInJlYWRfYnVmZmVyOiBpbml0aWFsaXppbmciKTsKKyAgICBsaW5lX2J1ZmZlcj0oW10pOworICAgIGxpbmVfYnVmZmVyX25hbWU9ZmlsZW5hbWU7CisgICAgY3VycmVudD0wOworICB9CisgIGVsc2UKKyAgICBjdXJyZW50PXN0YXJ0OworCisgIHdoaWxlKGN1cnJlbnQ8PXN0YXJ0K251bWJlciAmJiBzdHJpbmdwKCh0bXA9bG9hZF9idWZmZXIoY3VycmVudCsrKSkpKQorICAgIGlmKGN1cnJlbnQ+PXN0YXJ0KQorICAgICAgcmVzdWx0Kz10bXA7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBzdHJpbmcgbG9hZF9idWZmZXIoaW50IGxpbmUpCit7CisgIGludCBpLCBjdXJyZW50LCBzdGFydCwgbGVuZ3RoLCAqaWR4OworCisgIGlmKGludHAobGluZV9idWZmZXJbbGluZV0pKQorICB7CisgICAgLy8gVEsoImxvYWRfYnVmZmVyOiBOb3Rmb3VuZDogIitsaW5lKTsKKyAgICBjdXJyZW50PWxpbmU7CisgICAgd2hpbGUoY3VycmVudD4wJiZpbnRwKGxpbmVfYnVmZmVyWy0tY3VycmVudF0pKTsKKyAgICBmb3IoaT1jdXJyZW50O2k8PWxpbmU7aSsrKQorICAgIHsKKyAgICAgIC8vIFRLKCJsb2FkX2J1ZmZlcjogdHJ5aW5nOiAiK2kpOworICAgICAgaWYoaT4wKQorCWlkeD1saW5lX2J1ZmZlcltpLTFdOworICAgICAgZWxzZQorCWlkeD0oezAsMH0pOworICAgICAgbGVuZ3RoPXJlYWRfbGluZSgoc3RhcnQ9aWR4WzBdK2lkeFsxXSkpOworICAgICAgLy8gVEsoImxvYWRfYnVmZmVyOiAiK3N0YXJ0KyIvIitsZW5ndGgpOworICAgICAgbGluZV9idWZmZXJbaV09KHtzdGFydCxsZW5ndGh9KTsKKyAgICB9CisgIH0KKyAgaWR4PWxpbmVfYnVmZmVyW2xpbmVdOworICByZXR1cm4KKyAgICByZWFkX2J5dGVzKGxpbmVfYnVmZmVyX25hbWUsaWR4WzBdLGlkeFsxXSk7Cit9CisKK3N0YXRpYyBpbnQgcmVhZF9saW5lKGludCBvZmZzZXQpCit7CisgIG1peGVkIGxvY19idWY7CisgIGludCBsZW5ndGgsIHBvczsKKworICAvLyBUSygicmVhZF9saW5lOiAiK29mZnNldCk7CisgIGxlbmd0aD0wOworICB3aGlsZSghaW50cCgobG9jX2J1Zj1yZWFkX2J5dGVzKGxpbmVfYnVmZmVyX25hbWUsb2Zmc2V0K2xlbmd0aCwxMDI0KSkpKQorICB7CisgICAgaWYoKHBvcz1tZW1iZXIobG9jX2J1ZiwnXG4nKSk+PTApCisgICAgICByZXR1cm4gbGVuZ3RoK3BvcysxOworICAgIGxlbmd0aCs9MTAyNDsKKyAgfQorICByZXR1cm4gbGVuZ3RoOworfQorKi8KKworc3RhdGljIHZvaWQgTW9yZUZpbGUoc3RyaW5nIHN0cikKK3sKKyAgaW50IGksIG9mZjsKKyAgc3RyaW5nIGYsIGwsIHI7CisgIAorICBTRUNVUkUxKCk7CisgIAorICBpZiAoc3RyIC8qJiYgc2l6ZW9mKHN0cikqLykKKyAgeworCQlpZiggIXNpemVvZihzdHIpICkgc3RyPSJcMCI7CisgICAgaWYodGVybSkKKyAgICAgIFcoIhtNG1sxTSIpOworICAgIHN3aXRjaChzdHJbMF0pCisgICAgeworICAgICAgY2FzZSAncSc6CisgICAgICBjYXNlICd4JzoKKyAgICAgIG1vcmVmbGFnPUZBTFNFOworICAgICAgbW9yZW9mZnNldD0xOworICAgICAgaWYobW9yZWZpbGU9PVRNUF9GSUxFfHxtb3JlZmlsZT09UElQRV9GSUxFKQorCXJtKG1vcmVmaWxlKTsKKyAgICAgIHJldHVybiBOVUxMOworICAgICAgYnJlYWs7CisgICAgICBjYXNlICdQJzoKKyAgICAgIGNhc2UgJ1UnOgorICAgICAgbW9yZWZsYWc9RkFMU0U7CisgICAgICBtb3Jlb2Zmc2V0PW1vcmVvZmZzZXQtbW9yZWxpbmVzOworICAgICAgY2FzZSAncCc6CisgICAgICBjYXNlICd1JzoKKyAgICAgIG1vcmVvZmZzZXQ9bW9yZW9mZnNldC0yKm1vcmVsaW5lczsKKyAgICAgIGJyZWFrOworICAgICAgY2FzZSAnRCc6CisgICAgICBjYXNlICdOJzoKKyAgICAgIG1vcmVvZmZzZXQrPW1vcmVsaW5lczsKKyAgICAgIGNhc2UgMDoJLyogUkVUVVJOICovCisgICAgICBjYXNlICdkJzoKKyAgICAgIGlmKG1vcmVmbGFnKQorICAgICAgeworCW1vcmVmbGFnPUZBTFNFOworCW1vcmVvZmZzZXQ9MTsKKwlpZihtb3JlZmlsZT09VE1QX0ZJTEUpCisJICBybShtb3JlZmlsZSk7CisJcmV0dXJuOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgICBjYXNlICcvJzoKKyAgICAgIG1vcmVvZmZzZXQtLTsKKyAgICAgIG1vcmVfc2VhcmNoZXhwcj1zdHJbMS4uPDFdOworICAgICAgY2FzZSAnbic6CisgICAgICBpPW1vcmVvZmZzZXQtbW9yZWxpbmVzKzE7CisgICAgICBpZihtb3JlX3NlYXJjaGV4cHI9PSIiKQorICAgICAgeworCVdETE4oIk5vIHByZXZpb3VzIHJlZ3VsYXIgZXhwcmVzc2lvbiIpOworCXJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmKCFyZWdleHAoKHsiZHVtbXkifSksIG1vcmVfc2VhcmNoZXhwcikpCisJV0RMTigiQmFkIHJlZ3VsYXIgZXhwcmVzc2lvbiIpOworICAgICAgZWxzZQorCXdoaWxlKChsPXJlYWRfZmlsZShtb3JlZmlsZSwgaSsrLCAxKSkmJgorCSAgICAgICFzaXplb2YocmVnZXhwKCh7bH0pLCBtb3JlX3NlYXJjaGV4cHIpKSkKKwkgIDsKKyAgICAgIGlmKGwpCisgICAgICB7CisJV0xOKCIqKiogU2tpcHBpbmcgLi4uIik7CisJbW9yZW9mZnNldD1pLTE7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisJV0xOKCIqKiogUGF0dGVybiBub3QgZm91bmQiKTsKKwltb3Jlb2Zmc2V0LT1tb3JlbGluZXM7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICAgIGNhc2UgJzAnLi4nOSc6CisgICAgICBzc2NhbmYoc3RyLCAiJWQiLCBpKTsKKyAgICAgIG1vcmVvZmZzZXQ9aTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBtb3Jlb2Zmc2V0PTE7CisgICAgbW9yZWZsYWc9RkFMU0U7CisgIH0KKyAgaWYobW9yZW9mZnNldDwxKQorICAgIG1vcmVvZmZzZXQ9MTsKKyAgaWYoQ2F0RmlsZSgpKQorICAgIFcoIioqKiBNb3JlOiBxLHUsVSxkLEQsLzxyZWdleHA+LDxsaW5lPiBbIisobW9yZW9mZnNldC0xKSsiXSAqKiogIik7CisgIGVsc2UKKyAgeworICAgIFcoIioqKiBNb3JlOiBxLHUsVSxkLEQsLzxyZWdleHA+LDxsaW5lPiBbIisobW9yZW9mZnNldC0xKSsiPUVPRl0gKioqICIpOworICAgIG1vcmVmbGFnPVRSVUU7CisgIH0KKyAgaW5wdXRfdG8oIk1vcmVGaWxlIik7CisgIHJldHVybjsKK30KKworLy8gU2NoYWRlIGVpZ2VudGxpY2ggZGFzIGljaCBlcyBuZXVzY2hyZWliZW4gbXVzc3RlLCBhYmVyIGVzIGlzdAorLy8gc2NobmVsbGVyIG5ldSBnZXNjaHJpZWJlbiBhbHMgZHVyY2ggZGllIHVuZG9rdW1lbnRpZXJlbiBhbHRlbiBGdW5rdGlvbmVuCisvLyBkdXJjaHp1c3RlaWdlbi4uLiAqc2V1ZnoqCisvLwkJCQkJICBQYWRyZWljCisKK3N0YXRpYyBzdHJpbmcgbGFzdF9maWxlLCAqbGFzdF9maWxlX2J1ZmZlcjsKK3N0YXRpYyBpbnQgICAgbGFzdF9maWxlX2RhdGUsIGxhc3RfZmlsZV9zaXplLCBsYXN0X2ZpbGVfY29tcGxldGU7CisKK3N0YXRpYyBzdHJpbmcgc3JlYWRfbGluZShpbnQgbnVtKQoreworICAgaWYgKCFtb3JlZmlsZSkgcmV0dXJuICIiOworICAgaWYgKGxhc3RfZmlsZSE9bW9yZWZpbGUgfHwgbGFzdF9maWxlX2RhdGUhPWZpbGVfdGltZShtb3JlZmlsZSkpIHsKKyAgICAgIGlmICghKGxhc3RfZmlsZT1yZWFkX2J5dGVzKG1vcmVmaWxlLCAwLCA1MDAwMCkpKSByZXR1cm4gIiI7CisgICAgICBsYXN0X2ZpbGVfZGF0ZT1maWxlX3RpbWUobW9yZWZpbGUpOworICAgICAgbGFzdF9maWxlX2J1ZmZlcj1leHBsb2RlKGxhc3RfZmlsZSwgIlxuIik7CisgICAgICBsYXN0X2ZpbGVfc2l6ZT1zaXplb2YobGFzdF9maWxlX2J1ZmZlcik7CisgICAgICBpZiAoc2l6ZW9mKGxhc3RfZmlsZSk9PTUwMDAwICYmIGxhc3RfZmlsZVs8MV0hPSdcbicpIHsKKwkgbGFzdF9maWxlX3NpemUtLTsgLy8gbGV0enRlIFplaWxlIG5pY2h0IHZvbGxzdGFlbmRpZyBnZWxlc2VuCisJIGxhc3RfZmlsZV9jb21wbGV0ZT0wOworICAgICAgfQorICAgICAgZWxzZSBpZiAoZmlsZV9zaXplKG1vcmVmaWxlKT41MDAwMCkKKwlsYXN0X2ZpbGVfY29tcGxldGU9MDsKKyAgICAgIGVsc2UgbGFzdF9maWxlX2NvbXBsZXRlPTE7CisgICAgICBsYXN0X2ZpbGU9bW9yZWZpbGU7CisgICB9CisgICBpZiAobnVtPT0wKSBudW09MTsKKyAgIC8vIGJlaSB6dSBncm9zc2VuIEZpbGVzIG5pY2h0IG1laHIgYWxsZXMgYnVmZmVybi4uLgorICAgaWYgKG51bT5sYXN0X2ZpbGVfc2l6ZSkgeworICAgICAgaWYgKGxhc3RfZmlsZV9jb21wbGV0ZSkgcmV0dXJuICIiOworICAgICAgcmV0dXJuIChyZWFkX2ZpbGUobW9yZWZpbGUsIG51bSwgMSkgfHwgIiIpOworICAgfQorICAgcmV0dXJuIGxhc3RfZmlsZV9idWZmZXJbbnVtLTFdKyJcbiI7Cit9CisKK3N0YXRpYyBpbnQgQ2F0RmlsZSgpCit7CisgIGludCBlbmQ7CisgIHN0cmluZyBsOworICAKKyAgZW5kPW1vcmVvZmZzZXQrbW9yZWxpbmVzOworICB3aGlsZShtb3Jlb2Zmc2V0PGVuZCkKKy8vICAgIGlmKChsPXJlYWRfZmlsZShtb3JlZmlsZSwgbW9yZW9mZnNldCwgMSkpIT0iIikKKyAgICBpZigobD1zcmVhZF9saW5lKG1vcmVvZmZzZXQpKSE9IiIpCisgICAgeworICAgICAgbW9yZW9mZnNldCsrOworICAgICAgVyhsKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgcmV0dXJuIEZBTFNFOworLy8gIGlmKHJlYWRfZmlsZShtb3JlZmlsZSwgbW9yZW9mZnNldCsxLCAxKSE9IiIpCisgIGlmKHNyZWFkX2xpbmUobW9yZW9mZnNldCsxKSE9IiIpCisgICAgcmV0dXJuIFRSVUU7CisgIGVsc2UKKyAgICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBpbnQgWEdyZXBGaWxlKHN0cmluZyBwYXQsIHN0cmluZyBmaWxlLCBpbnQgbW9kZSkKK3sKKyAgaW50IGksIGosIGYsIHMsIGZzaXplOworICBzdHJpbmcgdGZpbGUsICp0bXAsICp0cywgdDsKKyAgCisgIFNFQ1VSRTIoRkFMU0UpOworICBUSygiWEdyZXBGaWxlOiBwYXQ6ICIrcGF0KyIgZmlsZTogIitmaWxlKyIgbW9kZTogIittb2RlKTsKKyAgaWYoIShwYXQmJmZpbGUpKQorICAgIHJldHVybiBGQUxTRTsKKyAgdGZpbGU9VE1QX0ZJTEU7CisgIGZzaXplPWZpbGVfc2l6ZShmaWxlKTsKKyAgZm9yKGk9MCxmPTA7IGk8ZnNpemUgJiYgdD1yZWFkX2J5dGVzKGZpbGUsIGksIDUwMDAwKTsgaSs9NTAwMDApCisgICAgdG1wPXN0cmlwX2V4cGxvZGUodCwiXG4iKTsKKyAgICBpZiAodCAmJiB0WzwxXSE9J1xuJyAmJiBzaXplb2YodCk9PTUwMDAwKSB7CisgICAgICAgaS09c2l6ZW9mKHRtcFs8MV0pOworICAgICAgIHRtcD10bXBbMC4uPDJdOworICAgIH0KKyAgICBpZihzPXNpemVvZih0bXApKQorICAgIHsKKyAgICAgIGZvcihqPTA7ajxzO2orKykKKyAgICAgIHsKKwlpZihzaXplb2YodHM9cmVnZXhwKCh7KG1vZGUmWEdSRVBfSUNBU0U/bG93ZXJfY2FzZSh0bXBbal0pOnRtcFtqXSl9KSxwYXQpKSkKKwl7CisJICBpZighKG1vZGUmWEdSRVBfUkVWRVJUKSkKKwkgICB7CisJICAgICBpZighZisrKQorCSAgICAgICB3cml0ZV9maWxlKHRmaWxlLCAiKioqIEZpbGU6ICIrZmlsZSsiICoqKlxuIik7CisJICAgICB3cml0ZV9maWxlKHRmaWxlLCB0bXBbal0rIlxuIik7CisJICAgfQorCX0KKwllbHNlIGlmKG1vZGUmWEdSRVBfUkVWRVJUKQorCXsKKwkgIGlmKCFmKyspCisJICAgIHdyaXRlX2ZpbGUodGZpbGUsICIqKiogRmlsZTogIitmaWxlKyIgKioqXG4iKTsKKwkgIHdyaXRlX2ZpbGUodGZpbGUsIHRtcFtqXSsiXG4iKTsKKwl9CisgICAgICB9CisgICAgfQorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIHZvaWQgWEV4ZWNGaWxlKGludCBsaW5lKQoreworICBpbnQgaTsKKyAgCisgIGlmKCFzY3JpcHRsaW5lKQorICAgIHJldHVybjsKKyAgZm9yKGk9bGluZTsgaTxzY3JpcHRzaXplJiZpPGxpbmUrRVhFQ19MSU5FUzsgaSsrKQorICB7CisgICAgaWYoIXNjcmlwdGxpbmVbaV0pCisgICAgICBjb250aW51ZTsKKyAgICBpZighQ29tbWFuZChzY3JpcHRsaW5lW2ldKSkKKyAgICB7CisgICAgICBzY3JpcHRsaW5lPU5VTEw7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIGlmKGk8c2NyaXB0c2l6ZSkKKyAgICBjYWxsX291dCgiWEV4ZWNGaWxlIiwgRVhFQ19USU1FLCBpKTsKKyAgZWxzZQorICAgIHNjcmlwdGxpbmU9TlVMTDsKK30KKworc3RhdGljIHZvaWQgWG10cFNjcmlwdChzdHJpbmcgZGlyLCBzdHJpbmcgZmlsZSwgc3RyaW5nIG9wdCkKK3sKKyAgaW50IHMsIHQ7CisgIHN0cmluZyAqZmlsZXM7CisgIAorICBzPXNpemVvZihmaWxlcz1nZXRfZGlyKGRpcisiLyoiKSk7CisgIHdoaWxlKHMtLSkKKyAgeworICAgIHQ9c2l6ZW9mKGZpbGVzW3NdKS0xOworICAgIGlmKGZpbGVzW3NdID09ICIuLiIgfHwgZmlsZXNbc10gPT0gIi4iIHx8IGZpbGVzW3NdW3RdID09ICd+JyB8fAorICAgICAgIChmaWxlc1tzXVswXSA9PSAnIycgJiYgZmlsZXNbc11bdF0gPT0gJyMnKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGlmKGZpbGVfc2l6ZShkaXIrIi8iK2ZpbGVzW3NdKT09LTIpCisgICAgeworICAgICAgd3JpdGVfZmlsZShmaWxlLCAibWtkaXIgIitmaWxlc1tzXSsiIDsgY2QgIitmaWxlc1tzXSsiXG4iKTsKKyAgICAgIFhtdHBTY3JpcHQoZGlyKyIvIitmaWxlc1tzXSwgZmlsZSwgb3B0KTsKKyAgICAgIHdyaXRlX2ZpbGUoZmlsZSwgImNkIC4uXG4iKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgd3JpdGVfZmlsZShmaWxlLCAibXRwIC1yICIrb3B0KyIgIitkaXIrIi8iK2ZpbGVzW3NdKyJcbiIpOworICB9Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIHBsYXllciBwcm9wZXJ0aWVzIGhhbmRsaW5nCisgKi8KKworc3RhdGljIHN0cmluZyBQbGF5ZXJJZGxlKG9iamVjdCBvYmopCit7CisgIHN0cmluZyBzdHI7CisgIGludCBpLCB0bXA7CisgIAorICBpZighb2JqKQorICAgIHJldHVybiBOVUxMOworICBpZigoaT1xdWVyeV9pZGxlKG9iaikpPj02MCkKKyAgeworICAgIHN0cj1BUklHSFQoIiIrKGkvMzYwMCksIDIsICIwIik7CisgICAgaS09KGkvMzYwMCkqMzYwMDsKKyAgICBzdHIrPSInIitBUklHSFQoIiIrKGkvNjApLCAyLCAiMCIpOworICB9CisgIGVsc2UKKyAgICBzdHI9Ii4uLi4uIjsKKyAgcmV0dXJuIHN0cjsKK30KKworc3RhdGljIHN0cmluZyBQbGF5ZXJBZ2Uob2JqZWN0IG9iaikKK3sKKyAgc3RyaW5nIHN0cjsKKyAgaW50IGksIHRtcDsKKyAgCisgIGlmKCFvYmopCisgICAgcmV0dXJuIE5VTEw7CisgIGk9KGludClvYmotPlF1ZXJ5UHJvcChQX0FHRSk7CisgIHN0cj0iICIrQVJJR0hUKCIiKyhpLzQzMjAwKSwgNCwgIi4iKTsKKyAgaS09KGkvNDMyMDApKjQzMjAwOworICByZXR1cm4gc3RyKyI6IitBUklHSFQoIiIrKGkvMTgwMCksIDIsICIwIik7Cit9CisKK3N0YXRpYyBzdHJpbmcgY3JuYW1lKG9iamVjdCB3aG8pCit7CisgIHN0cmluZyB1aWQsIGxuYW1lOworCisgIGlmKCh1aWQ9Z2V0dWlkKHdobykpPT1ST09USUQgJiYgCisgICAgIG9iamVjdF9uYW1lKHdobylbMC4uN109PSIvc2VjdXJlLyIgJiYKKyAgICAgKGxuYW1lPShzdHJpbmcpd2hvLT5sb2dpbm5hbWUoKSkpCisgICAgcmV0dXJuIENBUChsbmFtZSk7CisgIHJldHVybiBDQVAodWlkKTsKK30KKworc3RhdGljIHN0cmluZyBQbGF5ZXJXaG8ob2JqZWN0IG9iaikKK3sKKyAgb2JqZWN0IHRtcDsKKyAgc3RyaW5nIHN0ciwgc3RtcDsKKyAgc3RyPUFSSUdIVCgiIitMRVZFTChvYmopICAsICAzLCAiICIpOworICBzdHIrPUFMRUZUKCIgIitjcm5hbWUob2JqKSsiICIsIDEyLCAiLiIpOworICBzdHIrPVBsYXllckFnZShvYmopOworICBzdHIrPSgoaW50KW9iai0+UXVlcnlQcm9wKFBfR0VOREVSKT09MSA/ICIgbSAiIDogIiBmICIpOworICBzdHIrPShvYmotPlF1ZXJ5UHJvcChQX0ZST0cpKSAgPyAiZiIgOiAiLiI7CisgIHN0cis9KG9iai0+UXVlcnlQcm9wKFBfR0hPU1QpKSA/ICJnIiA6ICIuIjsKKyAgc3RyKz0ob2JqLT5RdWVyeVByb3AoUF9JTlZJUykpID8gImkiIDogIi4iOworICBzdHIrPShxdWVyeV9lZGl0aW5nKG9iail8fHF1ZXJ5X2lucHV0X3BlbmRpbmcob2JqKSA/ICJlIiA6ICIuIik7CisgIHN0cis9KG9iai0+UXVlcnlQcm9wKFBfQVdBWSkpICA/ICJhIiA6ICIuIjsKKyAgc3RyKz0iICIrUGxheWVySWRsZShvYmopKyIgIjsKKyAgc3RyKz0odG1wPUVOVihvYmopKSA/IE9iakZpbGUodG1wKSA6ICItIGZhYnJpYyBvZiBzcGFjZSAtIjsKKyAgcmV0dXJuIHN0cjsKK30KKworc3RhdGljIHN0cmluZyBQbGF5ZXJNYWlsKG9iamVjdCBvYmosIGludCBmbGFnKQoreworICBzdHJpbmcgcHJlOworICAKKyAgcHJlPShmbGFnKSA/IEFMRUZUKGNybmFtZShvYmopKyIgIiwgMTIsICIuIikrIiAiIDogIiI7CisgIHJldHVybiBwcmUrIm1haWw6ICIrb2JqLT5RdWVyeVByb3AoUF9NQUlMQUREUik7Cit9CisKK3N0YXRpYyBzdHJpbmcgUGxheWVySVAob2JqZWN0IG9iaiwgaW50IGZsYWcpCit7CisgIHN0cmluZyBwcmU7CisgIAorICBwcmU9KGZsYWcpID8gQUxFRlQoY3JuYW1lKG9iaikrIiAiLCAxMiwgIi4iKSsiICIgOiAiIjsKKyAgcmV0dXJuIHByZSsiaG9zdDogIitxdWVyeV9pcF9uYW1lKG9iaikrIiAoIitxdWVyeV9pcF9udW1iZXIob2JqKSsiKSI7Cit9CisKK3N0YXRpYyBzdHJpbmcgUGxheWVyUmFjZShvYmplY3Qgb2JqLCBpbnQgZmxhZykKK3sKKyAgc3RyaW5nIHRtcCwgcHJlOworICAKKyAgcHJlPShmbGFnKSA/IEFMRUZUKGNybmFtZShvYmopKyIgIiwgMTIsICIuIikrIiAiIDogIiI7CisgIHByZT1wcmUrInJhY2U6ICIrQUxFRlQob2JqLT5RdWVyeVByb3AoUF9SQUNFKSsiICIsIDEwLCAiLiIpKyIgZ3VpbGQ6ICI7CisgIHRtcD0oc3RyaW5nKW9iai0+UXVlcnlQcm9wKFBfR1VJTEQpOworICByZXR1cm4gdG1wID8gcHJlK3RtcCA6IHByZSsiLSBub25lIC0iOworfQorCitzdGF0aWMgc3RyaW5nIFBsYXllckRvbWFpbihvYmplY3Qgb2JqLCBpbnQgZmxhZykKK3sKKyAgaW50IGksIHM7CisgIG1peGVkICp1aW5mbzsKKyAgc3RyaW5nICpkb21haW5zLCBwcmU7CisgIAorICBwcmU9KGZsYWcpID8gQUxFRlQoY3JuYW1lKG9iaikrIiAiLCAxMiwgIi4iKSsiICIgOiAiIjsKKyAgcHJlKz0iZG9tYWlubG9yZCBvZjogIjsKKyAgdWluZm89KG1peGVkKilNQVNURVItPmdldF91c2VyaW5mbyhnZXR1aWQob2JqKSk7CisgIGlmKHVpbmZvJiYoZG9tYWlucz11aW5mb1szXSkmJihzPXNpemVvZihkb21haW5zKSkpCisgIHsKKyAgICBmb3IoaT0wOyBpPHM7IGkrKykKKyAgICB7CisgICAgICBwcmUgKz0gQ0FQKGRvbWFpbnNbaV0pOworICAgICAgaWYoaTxzLTEpCisJcHJlICs9ICIsICI7CisgICAgfQorICB9CisgIHJldHVybiBwcmU7Cit9CisKK3N0YXRpYyBzdHJpbmcgUGxheWVyU3RhdHMob2JqZWN0IG9iaiwgaW50IGZsYWcpCit7CisgIHN0cmluZyBwcmU7CisgIAorICBwcmU9KGZsYWcpID8gQUxFRlQoY3JuYW1lKG9iaikrIiAiLCAxMiwgIi4iKSsiICIgOiAiIjsKKyAgcHJlKz0iaHA9IitBUklHSFQob2JqLT5RdWVyeVByb3AoUF9IUCksIDMsICIwIik7CisgIHByZSs9Ii8iK0FSSUdIVChvYmotPlF1ZXJ5UHJvcChQX01BWF9IUCksIDMsICIwIik7CisgIHByZSs9IiBzcD0iK0FSSUdIVChvYmotPlF1ZXJ5UHJvcChQX1NQKSwgMywgIjAiKTsKKyAgcHJlKz0iLyIrQVJJR0hUKG9iai0+UXVlcnlQcm9wKFBfTUFYX1NQKSwgMywgIjAiKTsKKyAgcHJlKz0iIGZvb2Q9IitBUklHSFQob2JqLT5RdWVyeVByb3AoUF9GT09EKSwgMywgIjAiKTsKKyAgcHJlKz0iLyIrQVJJR0hUKG9iai0+UXVlcnlQcm9wKFBfTUFYX0ZPT0QpLCAzLCAiMCIpOworICBwcmUrPSIgZHJpbms9IitBUklHSFQob2JqLT5RdWVyeVByb3AoUF9EUklOSyksIDMsICIwIik7CisgIHByZSs9Ii8iK0FSSUdIVChvYmotPlF1ZXJ5UHJvcChQX01BWF9EUklOSyksIDMsICIwIik7CisgIHByZSs9IiBleHBzPSIrb2JqLT5RdWVyeVByb3AoUF9YUCk7CisgIHJldHVybiBwcmU7Cit9CisKK3N0YXRpYyBzdHJpbmcgUGxheWVyU25vb3Aob2JqZWN0IG9iaiwgaW50IGZsYWcpCit7CisgIHN0cmluZyB0bXAsIHByZTsKKyAgb2JqZWN0IHZpY3RpbTsKKyAgCisgIHByZT0oZmxhZykgPyBBTEVGVChjcm5hbWUob2JqKSsiICIsIDEyLCAiLiIpKyIgIiA6ICIiOworICBwcmU9cHJlKyJpcyBzbm9vcGVkIGJ5OiAiOworICBpZih2aWN0aW09cXVlcnlfc25vb3Aob2JqKSkKKyAgICBwcmUrPUFSSUdIVCgiICIrY3JuYW1lKHZpY3RpbSksIDEyLCAiLiIpOworICBlbHNlCisgICAgcHJlKz0iLi4uLi4uLi4uLi4uIjsKKyAgcmV0dXJuIHByZTsKK30KKworc3RhdGljIHN0cmluZyBQbGF5ZXJDbWRBdmcob2JqZWN0IG9iaiwgaW50IGZsYWcpCit7CisgIHN0cmluZyBwcmU7CisgIAorICBwcmU9KGZsYWcpID8gQUxFRlQoY3JuYW1lKG9iaikrIiAiLCAxMiwgIi4iKSsiICIgOiAiIjsKKyAgcmV0dXJuIHByZSsiY21kYXZnOiAiKyhpbnQpb2JqLT5fcXVlcnlfY29tbWFuZF9hdmVyYWdlKCk7Cit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBtc2cgaW5wdXQgdG8gb2JqZWN0cworICovCisKK3N0YXRpYyB2b2lkIFhNc2dTYXkoc3RyaW5nIHN0cikKK3sKKyAgaWYoc3RyPT0iLiJ8fHN0cj09IioqIikKKyAgeworICAgIFdMTigiW0VuZCBvZiBtZXNzYWdlXSIpOworICAgIHNheSgiW0VuZCBvZiBtZXNzYWdlXVxuIik7CisgIH0KKyAgZWxzZQorICB7CisgICAgc2F5KHN0cisiXG4iKTsKKyAgICBpbnB1dF90bygiWE1zZ1NheSIpOworICB9Cit9CisKK3N0YXRpYyB2b2lkIFhNc2dUZWxsKHN0cmluZyBzdHIpCit7CisgIGlmKHN0cj09Ii4ifHxzdHI9PSIqKiIpCisgIHsKKyAgICBXTE4oIltFbmQgb2YgbWVzc2FnZV0iKTsKKyAgICB0ZWxsX29iamVjdChtc2d0bywgIltFbmQgb2YgbWVzc2FnZV1cbiIpOworICB9CisgIGVsc2UKKyAgeworICAgIHRlbGxfb2JqZWN0KG1zZ3RvLCBzdHIrIlxuIik7CisgICAgaW5wdXRfdG8oIlhNc2dUZWxsIik7CisgIH0KK30KKworc3RhdGljIHZvaWQgWE1zZ1Nob3V0KHN0cmluZyBzdHIpCit7CisgIGlmKHN0cj09Ii4ifHxzdHI9PSIqKiIpCisgIHsKKyAgICBXTE4oIltFbmQgb2YgbWVzc2FnZV0iKTsKKyAgICBzaG91dCgiW0VuZCBvZiBtZXNzYWdlXVxuIik7CisgIH0KKyAgZWxzZQorICB7CisgICAgc2hvdXQoc3RyKyJcbiIpOworICAgIGlucHV0X3RvKCJYTXNnU2hvdXQiKTsKKyAgfQorfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIG93biBvYmplY3QgbW92aW5nCisgKi8KKworaW50IG1vdmUobWl4ZWQgZGVzdCkKK3sKKyAgbW92ZV9vYmplY3QoTUUsIGNsb25lcj9jbG9uZXI6ZGVzdCk7CisgIHJldHVybiBUUlVFOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIG9iamVjdCBpZAorICovCisKK2ludCBpZChzdHJpbmcgc3RyKQoreworICBpZighc2VjdXJpdHkoKSYmTU9ERShNT0RFX1NDQU5DSEspJiZSVFAmJiFJU19BUkNIKFJUUCkpCisgICAgV0RMTihjcm5hbWUoUlRQKSsiIHNjYW5uZWQgeW91IChpZCkgWyIrcXVlcnlfdmVyYigpKyJdICIrCisJIChQUkVWID8gT2JqRmlsZShQUkVWKSA6ICJbZGVzdHJ1Y3RlZCBvYmplY3RdIikpOworICByZXR1cm4gTE9XRVIoc3RyKT09TE9XRVIoVE9PTF9OQU1FKTsKK30KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBzaG9ydCBhbmQgbG9uZyBkZXNjcmlwdGlvbgorICovCisKK3N0cmluZyBzaG9ydCgpCit7CisgIHJldHVybiBfcXVlcnlfc2hvcnQoKSsiLlxuIjsKK30KKworc3RyaW5nIF9xdWVyeV9zaG9ydCgpCit7CisgIHN0cmluZyBzaDsgLy8gYWRkZWQgYnkgUnVtYXRhCisgIGlmKGNsb25lcikKKyAgeworICAgIGlmKCghc2VjdXJpdHkoKSkmJk1PREUoTU9ERV9TQ0FOQ0hLKSYmIUlTX0FSQ0goUlRQKSkKKyAgICAgIFdETE4oY3JuYW1lKFJUUCkrIiBzY2FubmVkIHlvdSAoc2hvcnQpIFsiK3F1ZXJ5X3ZlcmIoKSsiXSAiKworCSAgIChQUkVWID8gT2JqRmlsZShQUkVWKSA6ICJbZGVzdHJ1Y3RlZCBvYmplY3RdIikpOworCWlmKCBzaD1RdWVyeShQX1NIT1JUKSApIHJldHVybiBzaDsgLy8gYWRkZWQgYnkgUnVtYXRhCisgICAgcmV0dXJuIGNsb25lci0+bmFtZShXRVNTRU4pKyIgIitUT09MX1RJVExFKyIgWyIrCisgICAgICBjdGltZSh0aW1lKCkpWzExLi4xOF0rIl0iOworICB9CisgIHJldHVybiBUT09MX1RJVExFOworfQorCitzdHJpbmcgbG9uZygpCit7CisgIHJldHVybiBfcXVlcnlfbG9uZygpOworfQorCitzdHJpbmcgX3F1ZXJ5X2xvbmcoKQoreworICBpZihjbG9uZXImJiFzZWN1cml0eSgpJiZNT0RFKE1PREVfU0NBTkNISykmJiFJU19BUkNIKFJUUCkpCisgIHsKKyAgICBXRExOKGNybmFtZShSVFApKyIgc2Nhbm5lZCB5b3UgKGxvbmcpIFsiK3F1ZXJ5X3ZlcmIoKSsiXSAiKworCSAoUFJFViA/IE9iakZpbGUoUFJFVikgOiAiW2Rlc3RydWN0ZWQgb2JqZWN0XSIpKTsKKyAgfQorICByZXR1cm4gCisgICAgIlRoaXMgaXMgIitUT09MX05BTUUrIiB2ZXJzaW9uICIrVE9PTF9WRVJTSU9OKworICAgICIgKG1haW50YWluZWQgYnkgS2lya0BNb3JnZW5HcmF1ZW4pXG4iKworICAgICJPcmlnaW5hbCBjb3B5cmlnaHQgaGVsZCBieSBIeXAuXG4iKworICAgICJHYW1lZHJpdmVyIHBhdGNobGV2ZWw6ICIrX19WRVJTSU9OX18rIiBtYXN0ZXIgb2JqZWN0OiAiK19fTUFTVEVSX09CSkVDVF9fKworICAgICJcblxuRG8gJ3hoZWxwJyBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiI7Cit9CisKK3N0cmluZyBuYW1lKG1peGVkIGR1bW15MSwgbWl4ZWQgZHVtbXkyKQoreworICByZXR1cm4gX3F1ZXJ5X3Nob3J0KCk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogbGlnaHQgc3R1ZmYKKyAqLworCitpbnQgX3F1ZXJ5X2xpZ2h0KCkKK3sKKyAgcmV0dXJuIHhsaWdodDsKK30KKworaW50IF9zZXRfbGlnaHQoaW50IHgpCit7CisgIHJldHVybiB4bGlnaHQ7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogQXV0b2xvYWRpbmcKKyAqLworCittaXhlZCAqX3F1ZXJ5X2F1dG9sb2Fkb2JqKCkKK3sKKyAgcmV0dXJuIEFVVE9MT0FEX0FSR1M7Cit9CisKK3ZvaWQgX3NldF9hdXRvbG9hZG9iaihtaXhlZCAqYXJncykKK3sKKyAgV0xOKFRPT0xfVElUTEUrIiAuLi4iKTsKKyAgaWYoIXBvaW50ZXJwKGFyZ3MpKQorICAgIDsKKyAgZWxzZSBpZihzaXplb2YoYXJncykhPTMpCisgICAgOworICBlbHNlIGlmKCFzdHJpbmdwKGFyZ3NbMF0pKQorICAgIDsKKyAgZWxzZSBpZighaW50cChhcmdzWzFdKSkKKyAgICA7CisgIGVsc2UgaWYoIWludHAoYXJnc1syXSkpCisgICAgOworICBlbHNlCisgIHsKKyAgICBpZigoc3RyaW5nKWFyZ3NbMF0hPVRPT0xfSU5URVJOQUwpCisgICAgeworICAgICAgV0xOKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOworICAgICAgV0xOKCIqKioJICAgIE5FVyBFRElUSU9OICAgICAgKioqIik7CisgICAgICBXTE4oIioqKglkbyAneHRvb2wgbmV3cycgZm9yICAqKioiKTsKKyAgICAgIFdMTigiKioqCSBtb3JlIGluZm9ybWF0aW9uICAgICoqKiIpOworICAgICAgV0xOKCIqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiIpOworICAgIH0KKyAgICBtb2RpPShpbnQpYXJnc1sxXTsKKyAgICBtb3JlbGluZXM9KGludClhcmdzWzJdOworICAgIHJldHVybjsKKyAgfQorICBXKCIoYmFkIGF1dG9sb2FkLCB1c2luZyBkZWZhdWx0KVxuIik7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogY3JlYXRpb24sIHVwZGF0aW5nIGFuZCBpbml0aWFsaXphdGlvbiBzdHVmZgorICovCisKK3ZvaWQgdXBkYXRlX3Rvb2wobWl4ZWQgKmFyZ3MsIG9iamVjdCBvYmopCit7CisgIFNFQ1VSRTEoKTsKKyAgaWYoIShvYmomJmFyZ3MpKQorICAgIHJldHVybjsKKyAgRGVzdHJ1Y3QoUFJFVik7CisgIF9zZXRfYXV0b2xvYWRvYmooYXJncyk7CisgIG1vdmUob2JqKTsKK30KKwordm9pZCBjcmVhdGUoKQoreworICBvYmplY3Qgb2JqOworICAKKyAgaWYobWVtYmVyKG9iamVjdF9uYW1lKCksJyMnKTwwKQorICAgIHJldHVybjsKKyAgaWYoIWNsb25lciYmISgoY2xvbmVyPVRQKXx8KGNsb25lcj1FTlYoTUUpKSkmJiFpbnRlcmFjdGl2ZShjbG9uZXIpKQorICAgIGRlc3RydWN0KE1FKTsKKyAgaWYoIUlTX0xFQVJORVIoY2xvbmVyKSkKKyAgICBkZXN0cnVjdChNRSk7CisgIFNldFByb3AoUF9OT0RST1AsIkRhcyB3YWVyZSB6dSBnZWZhZWhybGljaC5cbiIpOworICBTZXRQcm9wKFBfTkVWRVJEUk9QLDEpOworICBTZXRQcm9wKFBfTk9CVVksMSk7CisgIGlmKGZpbGVfc2l6ZShTQVZFX0ZJTEUrIi5vIik+MCkKKyAgeworICAgIFdETE4oIkxvYWRpbmcgIitUT09MX1RJVExFKyIgc2V0dGluZ3MiKTsKKyAgICByZXN0b3JlX29iamVjdChTQVZFX0ZJTEUpOworICB9CisgIGlmKE1PREUoTU9ERV9GSVJTVCkpCisgICAgY2FsbF9vdXQoIm1vdmUiLDAsY2xvbmVyKTsKKyAgY2FsbF9vdXQoImFkZF9pbnNlcnRfaG9vayIsMSxNRSk7Cit9CisKK3ZvaWQgVEsoc3RyaW5nIHN0cikKK3sKKyAgaWYgKCF4dGspCisgICAgcmV0dXJuOworICB0ZWxsX29iamVjdChjbG9uZXIsIlhUT09MOiAiK3N0cisiXG4iKTsKK30KKworaW50IFh0ayhzdHJpbmcgc3RyKQoreworICB4dGs9IXh0azsKKyAgV0RMTigiWHRvb2wgaW50ZXJuYWwgdHJhY2luZyAiKyh4dGs/ImVuYWJsZWQiOiJkaXNhYmxlZCIpKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQgYWRkX2luc2VydF9ob29rKG9iamVjdCBvYmopCit7CisgIGlmKG9iamVjdHAob2JqKSkKKyAgICBjbG9uZXItPkFkZEluc2VydEhvb2sob2JqKTsKK30KKwordm9pZCBpbml0KCkKK3sKKyAgb2JqZWN0IGZpcnN0LCBwcmV2OworICAKKyAgaWYobWVtYmVyKG9iamVjdF9uYW1lKCksJyMnKTwwKSByZXR1cm47CisgIGZpcnN0PWZpcnN0X2ludmVudG9yeShFTlYoTUUpKTsKKyAgaWYoTU9ERShNT0RFX1BST1RFQ1QpJiZpc19wbGF5ZXIoZmlyc3QpJiYhSVNfQVJDSChmaXJzdCkpCisgIHsKKyAgICBXRExOKCJXQVJOSU5HOiAiK2NybmFtZShmaXJzdCkrIiB0cmllZCB0byBtb3ZlIGludG8geW91ciBpbnZlbnRvcnkiKTsKKyAgICB0ZWxsX29iamVjdChmaXJzdCwgIllvdSBjYW5ub3QgbW92ZSB5b3Vyc2VsZiBpbnRvICIrCisJCWNybmFtZShjbG9uZXIpKyIncyBpbnZlbnRvcnkuXG4iKTsKKyAgICBjYWxsX291dCgiRHJvcE9iaiIsMCxmaXJzdCk7CisgICAgcmV0dXJuOworICB9CisgIGVsc2UgaWYoTU9ERShNT0RFX0ZJUlNUKSYmZmlyc3QhPU1FKQorICAgIG1vdmUoY2xvbmVyKTsKKyAgZWxzZSBhY3Rpb25zKCk7Cit9CisKK3ZvaWQgRHJvcE9iaihvYmplY3Qgb2JqKQoreworICBpZighb2JqfHwhb2JqZWN0cChvYmopKQorICAgIHJldHVybjsKKyAgb2JqLT5tb3ZlKEVOVihjbG9uZXIpLE1fTk9DSEVDS3xNX05PX1NIT1cpOworfQorCisjZGVmaW5lIEFDVElPTlNcCisoW1wKKyAgInhjYWxsb3V0cyIgOiAiWGNhbGxvdXRzIjswOzEsXAorICAieGNhbGwiICAgICA6ICJYY2FsbCI7MDsxLFwKKyAgInhjYXQiICAgICAgOiAiWGNhdCI7MTsxLFwKKyAgInhjZCIgICAgICAgOiAiWGNkIjswOzAsXAorICAieGNsZWFuIiAgICA6ICJYY2xlYW4iOzA7MCxcCisgICJ4Y2xvbmUiICAgIDogIlhjbG9uZSI7MDswLFwKKyAgInh1Y2xvbmUiICAgOiAiWHVjbG9uZSI7MDswLFwKKyAgInhjbWRzIiAgICAgOiAiWGNtZHMiOzA7MSxcCisgICJ4ZGJnIiAgICAgIDogIlhkYmciOzA7MCxcCisgICJ4ZGNsZWFuIiAgIDogIlhkY2xlYW4iOzA7MCxcCisgICJ4ZGRlcyIgICAgIDogIlhkZGVzIjswOzAsXAorICAieGRlcyIgICAgICA6ICJYZGVzIjswOzAsXAorICAieGRlc3QiICAgICA6ICJYZGVzIjswOzAsXAorICAieGRsb29rIiAgICA6ICJYZGxvb2siOzA7MSxcCisgICJ4ZG8iICAgICAgIDogIlhkbyI7MDswLFwKKyAgInhkdXBkYXRlIiAgOiAiWGR1cGRhdGUiOzA7MCxcCisgICJ4ZWNobyIgICAgIDogIlhlY2hvIjswOzAsXAorICAieGV2YWwiICAgICA6ICJYZXZhbCI7MDsxLFwKKyAgInhmb3JhbGwiICAgOiAiWGZvcmFsbCI7MDswLFwKKyAgInhnb3RvIiAgICAgOiAiWGdvdG8iOzA7MCxcCisgICJ4aGJlYXRzIiAgIDogIlhoYmVhdHMiOzA7MSxcCisgICJ4Z3JlcCIgICAgIDogIlhncmVwIjsxOzEsXAorICAieGhlYWQiICAgICA6ICJYaGVhZCI7MTsxLFwKKyAgInhoZWxwIiAgICAgOiAiWGhlbHAiOzA7MCxcCisgICJ4aW52ZW50b3J5IjogIlhpbnZlbnRvcnkiOzA7MSxcCisgICJ4aWRzIiAgICAgIDogIlhpZHMiOzA7MCxcCisgICJ4aW5mbyIgICAgIDogIlhpbmZvIjswOzAsXAorICAieGluaGVyaXQiICA6ICJYaW5oZXJpdCI7MDsxLFwKKyAgInhsYWciICAgICAgOiAiWGxhZyI7MDswLFwKKyAgInhsaWdodCIgICAgOiAiWGxpZ2h0IjswOzAsXAorICAieGxvYWQiICAgICA6ICJYbG9hZCI7MDswLFwKKyAgInhsb29rIiAgICAgOiAiWGxvb2siOzA7MSxcCisgICJ4bHBjIiAgICAgIDogIlhscGMiOzA7MCxcCisgICJ4bWFuIiAgICAgIDogIlhtYW4iOzA7MCxcCisgICJ4bW9yZSIgICAgIDogIlhtb3JlIjsxOzAsXAorICAieG1vdmUiICAgICA6ICJYbW92ZSI7MDswLFwKKyAgInhtc2ciICAgICAgOiAiWG1zZyI7MTswLFwKKyAgInhtdHAiICAgICAgOiAiWG10cCI7MDswLFwKKyAgInhwcm9jIiAgICAgOiAiWHByb2MiOzA7MSxcCisgICJ4cHJvZiIgICAgIDogIlhwcm9mIjswOzAsXAorICAieHByb3BzIiAgICA6ICJYcHJvcHMiOzA7MSxcCisgICJ4cXVpdCIgICAgIDogIlhxdWl0IjswOzAsXAorICAieHNjYW4iICAgICA6ICJYc2NhbiI7MDswLFwKKyAgInhzZXQiICAgICAgOiAiWHNldCI7MDswLFwKKyAgInhzaCIgICAgICAgOiAiWHNoIjswOzAsXAorICAieHNvcnQiICAgICA6ICJYc29ydCI7MTsxLFwKKyAgInh0YWlsIiAgICAgOiAiWHRhaWwiOzE7MSxcCisgICJ4dGsiICAgICAgIDogIlh0ayI7MDswLFwKKyAgInh0b29sIiAgICAgOiAiWHRvb2wiOzA7MCxcCisgICJ4dHJhY2UiICAgIDogIlh0cmFjZSI7MDswLFwKKyAgInh0cmFucyIgICAgOiAiWHRyYW5zIjswOzAsXAorICAieHVwZGF0ZSIgICA6ICJYdXBkYXRlIjswOzAsXAorICAieHdjIiAgICAgICA6ICJYd2MiOzE7MCxcCisgICJ4d2hvIiAgICAgIDogIlh3aG8iOzA7MSxcCisgIF0pCisKK3N0YXRpYyBzdHJpbmcgUHJlcGFyZUxpbmUoc3RyaW5nIHN0cikKK3sKKyAgcmV0dXJuIHN0cjsKK30KKworc3RhdGljIHN0cmluZyBRdW90ZUxpbmUoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nICp0bXAsKnRtcDI7CisgIGludCBpLCBpMiwgbGVuLCBsZW4yLCBxZCwgcXM7CisKKyAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwiXFxcXCIsIrBCU0hMIik7CisgIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsIlxcXCIiLCKwREJMUSIpOworICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCJcXFwnIiwisFNHTFEiKTsKKyAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwiXFx8IiwisFBJUEUiKTsKKyAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwifHwiLCKwT1JPUiIpOworICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCItPiIsIrBMQVJSIik7CisgIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsIlxcJCIsIrBET0xSIik7CisgIHRtcD1yZWdleHBsb2RlKHN0ciwiKFwifCcpIik7CisgIGxlbj1zaXplb2YodG1wKTsKKyAgcWQ9cXM9MDsKKyAgZm9yKGk9MDtpPGxlbjtpKyspCisgIHsKKyAgICBpZihpJTIpCisgICAgeworICAgICAgaWYodG1wW2ldPT0iJyIpCisJcWQ9KCFxcz8hcWQ6cWQpOworICAgICAgZWxzZQorCXFzPSghcWQ/IXFzOnFzKTsKKyAgICAgIGlmKCh0bXBbaV09PSJcIiImJiFxZCl8fCh0bXBbaV09PSInIiYmIXFzKSkKKwl0bXBbaV09IiI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBpZighcWQpCisgICAgICB7CisJbGVuMj1zaXplb2YodG1wMj1yZWdleHBsb2RlKHRtcFtpXSwiXFwkW14gXVteIF0qIikpOworCWZvcihpMj0wO2kyPGxlbjI7aTIrKykKKwkgIGlmKGkyJTIpCisJICB7CisJICAgIFRLKCJRdW90ZUxpbmU6ICIrdG1wMltpMl1bMS4uXSk7CisJICAgIHRtcDJbaTJdPShzdHJpbmcpWEZpbmRPYmooKHRtcDJbaTJdKVsxLi5dKTsKKwkgIH0KKwl0bXBbaV09aW1wbG9kZSh0bXAyLCIiKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYocWR8fHFzKQorICAgIHJldHVybiBOVUxMOworICBzdHI9aW1wbG9kZSh0bXAsIiIpOworICBUSygiUXVvdGVMaW5lOiBzdHI6ICIrc3RyKTsKKyAgcmV0dXJuIHN0cjsKK30KKworc3RhdGljIHN0cmluZyBVbnF1b3RlTGluZShzdHJpbmcgc3RyKQoreworICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCKwQlNITCIsIlxcIik7CisgIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsIrBEQkxRIiwiXCIiKTsKKyAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwisFNHTFEiLCJcJyIpOworICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCKwRFFVTyIsIiIpOworICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCKwU1FVTyIsIiIpOworICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCKwUElQRSIsInwiKTsKKyAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwisE9ST1IiLCJ8fCIpOworICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCKwTEFSUiIsIi0+Iik7CisgIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsIrBET0xSIiwiJCIpOworICBUSygiVW5xdW90ZUxpbmU6IHN0cjogIitzdHIpOworICByZXR1cm4gc3RyOworfQorCitzdGF0aWMgc3RyaW5nICpFeHBsb2RlQ21kcyhzdHJpbmcgc3RyKQoreworICBzdHJpbmcgKnRtcDsKKyAgCisgIHRtcD1yZWdleHBsb2RlKHN0ciwiXFx8fD58Pj4iKTsKKyAgd2hpbGUodG1wWzwxXT09IiIpCisgICAgdG1wPXRtcFswLi48Ml07CisgIHJldHVybiB0bXA7Cit9CisKK3ZhcmFyZ3MgaW50IFBhcnNlTGluZShzdHJpbmcgc3RyKQoreworICBzdHJpbmcgdmVyYiwgYXJnOworICBpbnQgcmV0OworICAKKyAgVEsoIlBhcnNlTGluZTogc3RyOiAiKyhzdHI/c3RyOiIiKSk7CisgIGlmKCFzaXplb2YoY21kcykpCisgIHsKKyAgICAvLyB0aGlzIGlzIGEgc2luZ2xlIGNvbW1hbmQgb3IgYmVnaW5uaW5nIG9mIGEgY29tbWFuZCBwaXBlCisgICAgdmVyYj1xdWVyeV92ZXJiKCk7CisKKyAgICAvLyByZXR1cm4gb24gdW5rbm93biBjb21tYW5kcworICAgIGlmKCF2ZXJifHwhc2l6ZW9mKHZlcmIpfHwhR2V0RnVuYyh2ZXJiLFRSVUUpKQorICAgICAgcmV0dXJuIEZBTFNFOworCisgICAgc3RyPShzdHJpbmcpdGhpc19wbGF5ZXIoKS0+X3VucGFyc2VkX2FyZ3MoKTsKKyAgICBwaXBlX2luPUZBTFNFOworICAgIHBpcGVfb2Y9TlVMTDsKKyAgICBwaXBlX292cj1UUlVFOworICAgIHBpcGVfb3V0PUZBTFNFOworICAgIHBpcGVfb2Y9TlVMTDsKKyAgICAvLyBwYXNzIGFyZ3VtZW50cyB0byBzb21lIHNwZWNpYWwgZnVuY3Rpb25zIHVucGFyc2VkCisgICAgaWYobWVtYmVyKCh7InhscGMiLCJ4Y2FsbCIsInhldmFsIn0pLHZlcmIpPj0wKQorICAgIHsKKyNpZmRlZiBYREJHCisgICAgICBUSygiUGFyc2VMaW5lOiBzcGVjaWFsIGZ1bmM6ICIrdmVyYik7CisjZW5kaWYKKyAgICAgIHJldD1DYWxsRnVuYyh2ZXJiLHN0cik7CisgICAgICBTYWZlUmV0dXJuKHJldCk7CisgICAgfQorICAgIC8vIG9rLCBoZXJlIHdlIGdvCisgICAgcGlwZV9pbj1waXBlX291dD1GQUxTRTsKKyAgICBwaXBlX2lmPXBpcGVfb2Y9TlVMTDsKKyAgICBwaXBlX292cj1UUlVFOworICAgIGlmKGZpbGVfc2l6ZShQSVBFX0ZJTEUpPj0wKQorICAgICAgcm0oUElQRV9GSUxFKTsKKyAgICBpZiAoc3RyJiZzdHIhPSIiKQkgIAorICAgIHsKKyAgICAgIGlmKCEoc3RyPVF1b3RlTGluZShzdHIpKSkKKyAgICAgIHsKKwlXRExOKCJVbnRlcm1pbmF0ZWQgcXVvdGF0aW9uIik7CisJU2FmZVJldHVybihUUlVFKTsKKyAgICAgIH0KKyAgICAgIGNtZHM9RXhwbG9kZUNtZHMoc3RyKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgY21kcz0oeyIifSk7CisgICAgYXJnPXN0cmlwX3N0cmluZyhjbWRzWzBdKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBjbWRzWzBdPXN0cmlwX3N0cmluZyhjbWRzWzBdKTsKKyAgICBUSygiUGFyc2VMaW5lOiBjbWRzWzBdOiAiK2NtZHNbMF0pOworICAgIGlmKHNzY2FuZihjbWRzWzBdLCIlcyAlcyIsdmVyYixhcmcpIT0yKQorICAgIHsKKyAgICAgIHZlcmI9Y21kc1swXTsKKyAgICAgIGFyZz0iIjsKKyAgICB9CisgIH0KKyAgY21kcz1jbWRzWzEuLl07CisgIFRLKCJQYXJzZUxpbmU6IHZlcmI6ICIrdmVyYik7CisgIGlmICghdmVyYnx8IXNpemVvZih2ZXJiKXx8IUdldEZ1bmModmVyYixUUlVFKSkKKyAgICBTYWZlUmV0dXJuKEZBTFNFKTsKKyAgVEsoIlBhcnNlTGluZSgxKTogYXJnOiAiK2FyZysiIGNtZHM6ICIrc3ByaW50ZigiJU8iLGNtZHMpKTsKKyAgc3dpdGNoKHNpemVvZihjbWRzKSkKKyAgeworICAgIGNhc2UgMDoKKyAgICByZXQ9Q2FsbEZ1bmModmVyYixzdHJpcF9zdHJpbmcoVW5xdW90ZUxpbmUoYXJnKSkpOworICAgIFNhZmVSZXR1cm4ocmV0KTsKKyAgICBicmVhazsKKyAgICAKKyAgICBjYXNlIDE6CisgICAgV0RMTigiTWlzc2luZyByaHMgb2YgY29tbWFuZCBwaXBlIik7CisgICAgU2FmZVJldHVybihUUlVFKTsKKyAgICBicmVhazsKKyAgICAKKyAgICBkZWZhdWx0OgorICAgIHBpcGVfb3V0PVRSVUU7CisgICAgc3dpdGNoKGNtZHNbMF0pCisgICAgeworICAgICAgY2FzZSAifCI6CisgICAgICBwaXBlX29mPVBJUEVfRklMRTsKKyAgICAgIHBpcGVfb3ZyPVRSVUU7CisgICAgICBjbWRzPWNtZHNbMS4uXTsKKyAgICAgIGJyZWFrOworICAgICAgCisgICAgICBjYXNlICI+IjoKKyAgICAgIHBpcGVfb3ZyPVRSVUU7CisgICAgICBpZihzaXplb2YoY21kcykhPTIpCisgICAgICB7CisJV0RMTigiSWxsZWdhbCBJTyByZWRpcmVjdGlvbiIpOworCVNhZmVSZXR1cm4oVFJVRSk7CisgICAgICB9CisgICAgICBwaXBlX29mPWNtZHNbMV07CisgICAgICBjbWRzPSh7fSk7CisgICAgICBicmVhazsKKyAgICAgIAorICAgICAgY2FzZSAiPj4iOgorICAgICAgcGlwZV9vdnI9RkFMU0U7CisgICAgICBpZihzaXplb2YoY21kcykhPTIpCisgICAgICB7CisJV0RMTigiSWxsZWdhbCBJTyByZWRpcmVjdGlvbiIpOworCVNhZmVSZXR1cm4oVFJVRSk7CisgICAgICB9CisgICAgICBwaXBlX29mPWNtZHNbMV07CisgICAgICBjbWRzPSh7fSk7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgVEsoIlBhcnNlTGluZSgyKTogYXJnOiAiK2FyZysiIGNtZHM6ICIrc3ByaW50ZigiJU8iLGNtZHMpKTsKKyAgaWYoIUNhbGxGdW5jKHZlcmIsc3RyaXBfc3RyaW5nKGFyZykpKQorICAgIFNhZmVSZXR1cm4oRkFMU0UpOworICBwaXBlX2luPXBpcGVfb3V0OworICBwaXBlX2lmPXBpcGVfb2Y7CisgIHBpcGVfb3ZyPUZBTFNFOworICBwaXBlX291dD1GQUxTRTsKKyAgcGlwZV9vZj1OVUxMOworICBpZihzaXplb2YoY21kcykpCisgICAgY2FsbF9vdXQoIlBhcnNlTGluZSIsMCk7CisgIGVsc2UKKyAgICBTYWZlUmV0dXJuKFRSVUUpOworICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBDYWxsRnVuYyhzdHJpbmcgdmVyYiwgc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIGZ1bjsKKworICBmdW49R2V0RnVuYyh2ZXJiLEZBTFNFKTsKKyNpZmRlZiBYREJHCisgIFRLKCJDYWxsRnVuYzogdmVyYjogIit2ZXJiKyIgc3RyOiAiK3N0cik7CisgIFRLKCJDYWxsRnVuYzogcmVzb2x2ZWQgZnVuY3Rpb246ICIrKGZ1bj9mdW46Iih1bnJlc29sdmVkKSIpKTsKKyNlbmRpZgorICBpZihzdHI9PSIiKQorICAgIHN0cj1OVUxMOworICByZXR1cm4gZnVuPyhpbnQpY2FsbF9vdGhlcihNRSxmdW4sc3RyKTpGQUxTRTsKK30KKworc3RhdGljIHN0cmluZyBHZXRGdW5jKHN0cmluZyB2ZXJiLCBpbnQgdGVzdCkKK3sKKyAgc3RyaW5nIGZ1biwqa2V5cyxrZXk7CisgIGludCBpLGxlbjsKKworICBUSygiR2V0RnVuYzogdmVyYjogIit2ZXJiKTsKKworICBpZih2ZXJiWzAuLjBdIT0ieCIpIC8vIEFzc3VtZSBhbGwgY29tbWFuZHMgc3RhcnQgd2l0aCAieCIKKyAgICByZXR1cm4gMDsKKworICBpZiAoIShmdW49KHN0cmluZylBQ1RJT05TW3ZlcmIsMF0pKSB7IC8vIFRyeSBleGFjdCBoaXQgZmlyc3QKKyAgICBrZXk9IiI7CisgICAgbGVuPXNpemVvZih2ZXJiKTsKKyAgICBmb3IgKGk9c2l6ZW9mKGtleXM9bV9pbmRpY2VzKEFDVElPTlMpKS0xO2k+PTA7aS0tKSB7CisgICAgICBUSygiICB0cnlpbmc6ICIra2V5c1tpXSk7CisgICAgICBpZihzaXplb2Yoa2V5c1tpXSk+PWxlbiYma2V5c1tpXVswLi5sZW4tMV09PXZlcmIpIHsKKwlpZihzaXplb2Yoa2V5KSkgeworCSAgV0xOKCJEYXMgaXN0IG5pY2h0IGVpbmRldXRpZyAuLi4iKTsKKwkgIHJldHVybiAwOworCX0KKwlmdW49QUNUSU9OU1trZXlzW2ldLDBdOworCWtleT1rZXlzW2ldOworCS8vYnJlYWs7CisgICAgICB9CisgICAgfQorICB9IGVsc2UKKyAgICBrZXk9dmVyYjsKKworICBpZih0ZXN0KQorICAgIHJldHVybiBmdW47CisgIAorICBpZiAoa2V5KSB7CisjaWZkZWYgWERCRworICAgIFRLKCJHZXRGdW5jOiBmdW46ICIrZnVuKyIgKGtleTogIitrZXkrIilcbiIrCisgICAgICAgInBpcGVfaW46ICIrKHBpcGVfaW4/IlRSVUUgICI6IkZBTFNFICIpKyhwaXBlX2lmP3BpcGVfaWY6IihOVUxMKSIpKyJcbiIrCisgICAgICAgInBpcGVfb3V0OiAiKyhwaXBlX291dD8iVFJVRSAgIjoiRkFMU0UgIikrKHBpcGVfb2Y/cGlwZV9vZjoiKE5VTEwpIikrIlxuIisKKyAgICAgICAicGlwZV9vdnI6ICIrKHBpcGVfb3ZyPyJUUlVFIjoiRkFMU0UiKSk7CisjZW5kaWYKKyAgICBpZiAocGlwZV9pbiYmIUFDVElPTlNba2V5LFBJUEVfSU5dKQorICAgIHsKKyAgICAgIC8vIHRoaXMgY29tbWFuZCBkb2VzIG5vdCByZWFkIHBpcGVzCisjaWZkZWYgWERCRworICAgICAgVEsoIklsbGVnYWwgcmhzIG9mIGNvbW1hbmQgcGlwZSBcIiIrZnVuKyJcIlxuIik7CisjZW5kaWYKKyAgICAgIG5vdGlmeV9mYWlsKCJJbGxlZ2FsIHJocyBvZiBjb21tYW5kIHBpcGUgXCIiK2Z1bisiXCJcbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGVsc2UgaWYgKHBpcGVfb3V0JiYhQUNUSU9OU1trZXksUElQRV9PVVRdKQorICAgIHsKKyAgICAgIC8vIHRoaXMgY29tbWFuZCBkb2VzIG5vdCBmZWVkIHBpcGVzCisjaWZkZWYgWERCRworICAgICAgVEsoIklsbGVnYWwgbGhzIG9mIGNvbW1hbmQgcGlwZSBcIiIrZnVuKyJcIlxuIik7CisjZW5kaWYKKyAgICAgIG5vdGlmeV9mYWlsKCJJbGxlZ2FsIGxocyBvZiBjb21tYW5kIHBpcGUgXCIiK2Z1bisiXCJcbiIpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIHJldHVybiBmdW47Cit9CisKK3ZvaWQgYWN0aW9ucygpCit7CisgIGlmICghY2xvbmVyfHwhUlRQfHxjbG9uZXI9PVJUUHx8cXVlcnlfd2l6X2xldmVsKGNsb25lcik8PXF1ZXJ5X3dpel9sZXZlbChSVFApKQorICAgIGFkZF9hY3Rpb24oIlBhcnNlTGluZSIsIiIsMSk7CisgIGFkZF9hY3Rpb24oIkNvbW1hbmRTY2FuIiwgIiIsIDEpOworfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqICB0aGUgY2hlY2tpbmcgc3R1ZmYKKyAqLworCit2b2lkIEluc2VydE5vdGlmeShvYmplY3Qgb2JqKQoreworICBpZighY2xvbmVyKQorICAgIHJldHVybjsKKyAgaWYoTU9ERShNT0RFX0ZJUlNUKSAmJiBmaW5kX2NhbGxfb3V0KCJtb3ZlIik9PS0xKQorICAgIGNhbGxfb3V0KCJtb3ZlIiwwLGNsb25lcik7CisgIGlmKE1PREUoTU9ERV9JTlZDSEVDSykpCisgICAgd3JpdGVfbmV3aW52b2JqKG9iaik7Cit9CisKK3N0YXRpYyB2b2lkIFZhckNoZWNrKGludCBzaG93KQoreworICBpbnQgaSwgczsKKyAgZm9yZWFjaChzdHJpbmcgaywgbWl4ZWQgdiA6IHZhcmlhYmxlKQorICB7CisgICAgaWYgKHYpIGNvbnRpbnVlOworICAgIGlmKHNob3cpIFdETE4oIioqKiBWYXJpYWJsZSAkIitrKyIgaGFzIGJlZW4gZGVzdHJ1Y3RlZCIpOworICAgIG1fZGVsZXRlKHZhcmlhYmxlLCBrKTsKKyAgfQorfQorCisKK2ludCB3cml0ZV9uZXdpbnZvYmoob2JqZWN0IG9iaikKK3sKKyAgaWYob2JqKSBXRExOKCIqKiogTmV3IG9iamVjdCBpbiBpbnZlbnRvcnkgIitPYmpGaWxlKG9iaikpOworICByZXR1cm4oMSk7Cit9CisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogIGNhdGNoIGFsbCBjb21tYW5kcywgYWJzb3JiIGZvcmNlcyBhbmQgY2hlY2sgaGlzdG9yeQorICovCisKK2ludCBDb21tYW5kU2NhbihzdHJpbmcgYXJnKQoreworICBzdHJpbmcgdmVyYiwgY21kOworICBvYmplY3QgcnRwOworICBydHA9UlRQOworCisgIGlmKCFjbG9uZXImJiEoY2xvbmVyPXJ0cCkpIGRlc3RydWN0KE1FKTsKKworICBpZigoIU1PREUoTU9ERV9QUk9URUNUKSl8fHNlY3VyaXR5KCl8fAorICAgICBxdWVyeV93aXpfbGV2ZWwoY2xvbmVyKTxxdWVyeV93aXpfbGV2ZWwocnRwKSkKKyAgeworICAgIHZlcmI9cXVlcnlfdmVyYigpOworICAgIGlmKHZlcmImJkRvSGlzdG9yeSh2ZXJiKyhhcmcgPyAiICIrYXJnIDogIiIpKSkKKyAgICAgIHJldHVybiBUUlVFOworICAgIG5vc3RvcmU9RkFMU0U7CisgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGVsc2UKKyAgeworICAgIGlmKHJ0cCkKKyAgICB7CisgICAgICBXRExOKCJZb3VyICIrVE9PTF9USVRMRSsiIHByb3RlY3RzIHlvdSBmcm9tIGEgZm9yY2UgYnkgIitjcm5hbWUocnRwKSsKKwkgICAiIFsiK3F1ZXJ5X3ZlcmIoKSsoYXJnID8gIiAiK2FyZysiXSIgOiAiXSIpKTsKKyAgICAgIHRlbGxfb2JqZWN0KHJ0cCwgY3JuYW1lKGNsb25lcikrIidzICIrVE9PTF9USVRMRSsKKwkJICAiIGFic29yYmVzIHlvdXIgZm9yY2UuXG4iKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIFdETE4oIllvdXIgIitUT09MX1RJVExFKyIgcHJvdGVjdHMgeW91IGZyb20gYSBmb3JjZSBbIisKKwkgICBxdWVyeV92ZXJiKCkrKGFyZyA/ICIgIithcmcrIl0iIDogIl0iKSk7CisgICAgfQorICAgIHJldHVybiBUUlVFOworICB9Cit9CisKK2ludCBEb0hpc3Rvcnkoc3RyaW5nIGxpbmUpCit7CisgIGludCBpOworICBzdHJpbmcgY21kLCAqc3RyczsKKyAgCisgIFNFQ1VSRTIoRkFMU0UpOworICBpZighc3RyaW5ncChsaW5lKSB8fCAhc2l6ZW9mKGxpbmUpKQorICAgIHJldHVybiBUUlVFOworICBlbHNlIGlmKGxpbmU9PSIlISIpCisgIHsKKyAgICBXTE4oIkN1cnJlbnQgY29tbWFuZCBoaXN0b3J5OiIpOworICAgIGZvcihpPU1BWF9ISVNUT1JZOyBpOyAtLWkpCisgICAgICBpZihoaXN0b3J5W2ktMV0pCisgICAgICB7CisJVygiICIrQVJJR0hUKCIiK2ksIDIsICIgIikrIjogIik7CisJaWYoc2l6ZW9mKGhpc3RvcnlbaS0xXSk+NzApCisJICBXTE4oQUxFRlQoaGlzdG9yeVtpLTFdLCA3MCwgIiAiKSk7CisJZWxzZQorCSAgV0xOKGhpc3RvcnlbaS0xXSk7CisgICAgICB9CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgZWxzZSBpZihsaW5lWzAuLjFdPT0iJSUiICYmIChjbWQ9aGlzdG9yeVswXStsaW5lWzIuLjwxXSkpCisgIHsKKyAgICBDb21tYW5kKGNtZCk7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgZWxzZSBpZihsaW5lWzBdPT0nXicmJihzdHJzPXN0cmlwX2V4cGxvZGUobGluZSwgIl4iKSkpCisgIHsKKyAgICBpZihzaXplb2Yoc3RycykmJnN0cnNbMF0mJihjbWQ9aGlzdG9yeVswXSkpCisgICAgeworICAgICAgaWYoc2l6ZW9mKHN0cnMpPT0yKQorCWNtZD1zdHJpbmdfcmVwbGFjZShjbWQsIHN0cnNbMF0sIHN0cnNbMV0pOworICAgICAgZWxzZQorCWNtZD1zdHJpbmdfcmVwbGFjZShjbWQsIHN0cnNbMF0sICIiKTsKKyAgICAgIG5vc3RvcmUtLTsKKyAgICAgIENvbW1hbmQoY21kKTsKKyAgICAgIG5vc3RvcmUrKzsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICBlbHNlIGlmKGxpbmVbMF09PSclJyAmJiAoc3NjYW5mKGxpbmVbMS4uPDFdLCAiJWQiLCBpKSkpCisgIHsKKyAgICBpPSBpPjAgPyBpIDogMTsKKyAgICBpPSBpPD1NQVhfSElTVE9SWSA/IGkgOiBNQVhfSElTVE9SWTsKKyAgICBpZihjbWQ9aGlzdG9yeVtpLTFdKQorICAgICAgQ29tbWFuZChjbWQpOworICAgIHJldHVybiBUUlVFOworICB9CisgIGVsc2UgaWYobGluZVswXT09JyUnKQorICB7CisgICAgZm9yKGk9MDsgaTxNQVhfSElTVE9SWTsgaSsrKQorICAgIHsKKyAgICAgIGlmKGhpc3RvcnlbaV0mJgorCSBoaXN0b3J5W2ldWzAuLnNpemVvZihsaW5lKS0yXT09bGluZVsxLi4gPDFdKQorICAgICAgeworCUNvbW1hbmQoaGlzdG9yeVtpXSk7CisJcmV0dXJuIFRSVUU7CisgICAgICB9CisgICAgfQorICB9CisgIGVsc2UgaWYobm9zdG9yZTwxKQorICAgIGhpc3Rvcnk9KHtsaW5lfSkraGlzdG9yeVswLi5NQVhfSElTVE9SWS0yXTsKKyAgcmV0dXJuIEZBTFNFOworfQorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hjYWxsIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94Y2FsbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2UyMWVhCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94Y2FsbApAQCAtMCwwICsxLDIxIEBACitTWU5PUFNJUworICAgICAgeGNhbGwgPG9iamVjdD4tPjxmdW5jdGlvbj4oPGV4cHJlc3Npb24+KQorCitERVNDUklQVElPTgorICAgICAgQ2FsbHMgdGhlIGxmdW4gPGZ1bmN0aW9uPiBvZiB0aGUgPG9iamVjdD4gd2l0aCA8ZXhwcmVzc2lvbj4gYXMKKyAgICAgIGFyZ3VtZW50LiBUaGUgPHByb3BlcnRpZXMuaD4gYXJlIGluY2x1ZGVkLiBUaHJlZSBvYmplY3RzIGFyZSBhbGxyZWFkeQorICAgICAgZGVmaW5lZCBvbiBpbnZva2F0aW9uLiAibWUiIHJlcHJlc2VudHMgdGhlIG9ud2VyIG9mIHRoZSBYdG9vbC4gImhlcmUiCisgICAgICBpcyB0aGUgY3VycmVudCByb29tIGFuZCAib2JqIiBpcyB0aGUgb2JqZWN0IHdoaWNoIGxmdW4gaXMgY2FsbGVkLgorICAgICAgVG8gdXNlIHRoZSBvYmplY3QgYWNjZXNzIHN5bnRheCBkZXNjcmliZWQgYWJvdmUsIGEgZnVuY3Rpb24gY2FsbGVkCisgICAgICAiZ2V0KHN0cmluZykiIGNhbiBiZSB1c2VkLiBJZiB0aGUgY2FsbCByZXR1cm5lZCBhbiBvYmplY3QsIHRoZSB2YXJpYWJsZQorICAgICAgIiRyZXN1bHQiIHdpbGwgYmUgc2V0IHRvIHRoaXMgb2JqZWN0LgorICAgICAgeGNhbGwgaW5jbHVkZXMgYSBwcml2YXRlIH4vLnh0b29sLmgsIGlmIGl0IGV4aXN0cywgdG8gc3VwcG9ydCB1c2VyCisgICAgICBkZWZpbmVkIG1hY3Jvcy4KKworRVhBTVBMRVMKKyAgICAgIHhjYWxsICRtZS0+UXVlcnlQcm9wKFBfTE9ORykKKyAgICAgIHhjYWxsIC9zdGQvdGhpbmcjMTQ1LT5TZXRQcm9wKFBfU0hPUlQsImEgc21hbGwgdGhpbmciKQorICAgICAgeGNhbGwgL3NlY3VyZS9tYXN0ZXItPmFkZF9kb21haW5fd2l6KCJoZWxsIiwgImh5cCIpCisgICAgICB4Y2FsbCAkbWUtPm1vdmUoZ2V0KCJeZGVlcHRob3VnaHQiKSwiZ28iKQorICAgICAgKHRoZSBsYXN0IG9uZSB1c2VzIHRoZSBmdW5jdGlvbiBnZXQoKSB0byBmaW5kIHRoZSByb29tIHdoZXJlIG91ciBnb2QgaXMpCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveGNhbGxvdXRzIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94Y2FsbG91dHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlhZGZhNgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGNhbGxvdXRzCkBAIC0wLDAgKzEsMTYgQEAKK1NZTk9QU0lTCisgICAgICB4Y2FsbG91dHMgW3NlYXJjaCBwYXR0ZXJuXQorCSAgb3IKKwkgIHhjYWxsb3V0cyAgICAod2hlbiB3cml0aW5nIHRvIGEgcGlwZSkKKworREVTQ1JJUFRJT04KKyAgICAgIFdpdGggbm8gYXJndW1lbnQgaXQgc2hvd3MgYWxsIHlvdXIgY2FsbG91dHMuIFdpdGggYSByZWdleHAgYXMgYXJndW1lbnQsCisgICAgICBhbGwgbWF0Y2hpbmcgY2FsbG91dHMgd2lsbCBiZSBwcmludGVkLiBXaGVuIHdyaXRpbmcgdG8gYSBwaXBlLCBhbGwKKwkgIGNhbGxfb3V0cyB3aWxsIGJlIHByaW50ZWQgYW5kIHRoZSBzZWFyY2ggcGF0dGVybiBpcyBub3QgYWxsb3dlZC4KKworRVhBTVBMRVMKKyAgICAgIHhjYWxsb3V0cyBvYmogICBTaG93IGFsbCBjYWxsb3V0cyB3aXRoIHRoZSBzdHJpbmcgIm9iaiIgaW4gaXQuCisgICAgICB4Y2FsbG91dHMgLiAgICAgU2hvdyBhbGwgY2FsbG91dHMuIFBsZWFzZSBuZXZlciBkbyB0aGlzIGlmIGl0IGlzbid0CisgICAgICAgICAgICAgICAgICAgICAgcmVhbGx5IG5lY2Nlc3NhcnkuIEl0IGp1c3QgY29zdHMgdGltZSAtIGFuZCB3aGF0IGRvIHlvdQorICAgICAgICAgICAgICAgICAgICAgIHdhbnQgdG8gZG8gd2l0aCB0aGlzIG1hc3Mgb2YgaW5mb3JtYXRpb24/CisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveGNsZWFuIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94Y2xlYW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNjNDg4ZQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGNsZWFuCkBAIC0wLDAgKzEsMTIgQEAKK1NZTk9QU0lTCisgICAgICB4Y2xlYW4gW29iamVjdF0KKworREVTQ1JJUFRJT04KKyAgICAgIENsZWFuIHRoZSBpbnZlbnRvcnkgb2YgdGhlIG9iamVjdCwgYnV0IGRvbid0IGRlc3RydWN0IGFueSBsaXZpbmcuCisgICAgICBXaXRoIG5vIGFyZ3VtZW50IHRoZSBjdXJyZW50IHJvb20gd2lsbCBiZSBjbGVhbmVkLiBUaGUgb2JqZWN0cworICAgICAgYXJlIHJlbW92ZWQgd2l0aCB0aGUgbGZ1biByZW1vdmUoKS4KKworRVhBTVBMRQorICAgICAgeGNsZWFuICRtZS5iYWcKKyAgICAgIENsZWFuIG15IGJhZy4KKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94Y2xvbmUgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hjbG9uZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGMxYjdhCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94Y2xvbmUKQEAgLTAsMCArMSwxMyBAQAorU1lOT1BTSVMKKyAgICAgIHhjbG9uZSA8ZmlsZW5hbWU+CisKK0RFU0NSSVBUSU9OCisgICAgICBDbG9uZXMgYW4gb2JqZWN0LiBPbiBlcnJvciwgdGhlIGVycm9yIGxvZyBmaWxlIHdpbGwgYmUgcHJpbnRlZC4KKyAgICAgIE1vdmVzIHRoZSBvYmplY3QgKGlmIHBvc3NpYmxlKSBpbnRvIHlvdXIgaW52ZW50b3J5LiBJZiB0aGUgb2JqZWN0CisgICAgICBoYXMgYmVlbiBjbG9uZWQgc3VjY2Vzc2Z1bGx5LCB0aGUgdmFyaWFibGUgIiRjbG9uZSIgd2lsbCBiZSBzZXQsCisgICAgICB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgbG9zZSB0aGUgb2JqZWN0IG91dCBvZiBzaWdodCA6KQorCitFWEFNUExFCisgICAgICB4Y2xvbmUgL3N0ZC90aGluZworICAgICAgeGNhbGwgJGNsb25lLT5TZXRTaG9ydCgiYSBCSUcgdGhpbmchIik7CisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveGRiZyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGRiZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjA5ZjJmCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94ZGJnCkBAIC0wLDAgKzEsMTQgQEAKK1NZTk9QU0lTCisgICAgICB4ZGJnIDxvYmplY3Q+CisKK0RFU0NSSVBUSU9OCisgICAgICBQcmludHMgb3V0IGRlYnVnIGluZm9ybWF0aW9uIGJ1eSB1c2luZyB0aGUgZWZ1biBkZWJ1Z19pbmZvKCkuCisgICAgICBOb3QgYWxsIG9mIHRoZXNlIGluZm9ybWF0aW9uIGlzIHVzZWZ1bCBidXQgaXQgZ2l2ZXMgeW91IGluZm9ybWF0aW9uCisgICAgICBvZiBob3cgbWFueSB2YXJpYWJsZXMsIGZ1bmN0aW9ucywgaW5oZXJpdGVkIG9iamV0Y3MgYW5kIHNvIG9uIGEgb2JqZWN0CisgICAgICBoYXMuIEl0IGFsc28gc2hvd3MgaWYgYW4gb2JqZWN0IGlzIGxpdmluZywgaWYgaXRzIGhlYXJ0IGJlYXQgaXMgdHVybmVkCisgICAgICBvbiwgd2hlbiB0aGUgbmV4dCBjYWxsIG9mIHJlc2V0KCkgd2lsbCBiZSAoYnV0IGRvbid0IHRha2UgdGhpcyB2YWx1ZQorICAgICAgbm90IHRvbyBzZXJpb3VzbHkpIGV0Yy4KKworRVhBTVBMRQorICAgICAgeGRiZyAkbWUKKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94ZGNsZWFuIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94ZGNsZWFuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5ZjkwOTMKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hkY2xlYW4KQEAgLTAsMCArMSw2IEBACitTWU5PUFNJUworICAgICAgeGRjbGVhbiA8b2JqZWN0PgorCitERVNDUklQVElPTgorICAgICAgU2FtZSBhcyB4Y2xlYW4sIGJ1dCBtYWtlcyBhIGRlZXAgY2xlYW4uCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveGRkZXMgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hkZGVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyMzU2NDUKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hkZGVzCkBAIC0wLDAgKzEsNiBAQAorU1lOT1BTSVMKKyAgICAgIHhkZGVzIDxvYmplY3Q+CisKK0RFU0NSSVBUSU9OCisgICAgICBTYW1lIGFzIHhkZXMsIGJ1dCBtYWtlcyBhIGRlZXAgZGVzdHJ1Y3QuCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveGRlcyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGRlcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2JmOTg0Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94ZGVzCkBAIC0wLDAgKzEsOCBAQAorU1lOT1BTSVMKKyAgICAgIHhkZXMgPG9iamVjdD4KKworREVTQ1JJUFRJT04KKyAgICAgIERlc3RydWN0IGFuIG9iamVjdCB1c2luZyBieSBmaXJzdCBjYWxsaW5nIHRoZSBsZnVuIHJlbW92ZSgpIG9mIHRoZQorICAgICAgb2JqZWN0IGFuZCBpZiBpdHMgc3RpbGwgImFsaXZlIiB0aGVuIGRlc3RydWN0IGl0IHdpdGggdGhlIGVmdW4KKyAgICAgIGRlc3RydWN0KCkuCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveGRsb29rIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94ZGxvb2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY3NzcyZgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGRsb29rCkBAIC0wLDAgKzEsNiBAQAorU1lOT1BTSVMKKyAgICAgIHhkbG9vayA8b2JqZWN0PgorCitERVNDUklQVElPTgorICAgICAgU2FtZSBhcyBsb29rLCBidXQgdGFrZXMgYSBkZWVwIGxvb2sgYXQgdGhlIG9iamVjdC4KKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94ZG8gYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hkbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWZhNWYxCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94ZG8KQEAgLTAsMCArMSwxNCBAQAorU1lOT1BTSVMKKyAgICAgIHhkbyBbPG51bWJlcjE+I108Y29tbWFuZDE+WztbPG51bWJlcjI+I108Y29tbWFuZDI+XSAuLi4KKworREVTQ1JJUFRJT04KKyAgICAgIFBlcmZvcm0gbXVsdGlwbGUgY29tbWFuZCBleGVjdXRpb24uCisKKyAgICAgIEV4YW1wbGVzOgorICAgICAgeGRvIDUjc21pbGUgICAoc21pbGUgNSB0aW1lcykKKworICAgICAgeGRvIGw7aSAgICAgICAobG9vayBhcm91bmQgaW4gdGhlIHJvb20gYW5kIHRoZW4gaW4geW91ciBpbnZlbnRvcnkpCisKKyAgICAgIHhkbyBzOzkjdzszI247a2lsbCBzaGFtYW47Z2V0IHN3b3JkIGZyb20gY29ycHNlOzMjczs5I2U7bjsuLi4KKyAgICAgICAgICAgICAgICAgICAgKHlvdSBrbm93IHRoaXMgb25lIDopCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveGR1cGRhdGUgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hkdXBkYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzNzUyYjkKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hkdXBkYXRlCkBAIC0wLDAgKzEsOCBAQAorU1lOT1BTSVMKKyAgICAgIHhkdXBkYXRlIDxmaWxlbmFtZT4KKworREVTQ1JJUFRJT04KKyAgICAgVXBkYXRlIGFuIG9iamVjdCBpbmNsdWRpbmcgYWxsIGl0cyBpbmhlcml0ZWQgb2JqZWN0cy4KKworRVhBTVBMRQorICAgICB4ZHVwZGF0ZSAvc3RkL3BsYXllci5jCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hldmFsIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94ZXZhbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTMyYmRmCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94ZXZhbApAQCAtMCwwICsxLDE4IEBACitTWU5PUFNJUworICAgICAgeGV2YWwgPGV4cHJlc3Npb24+CisKK0RFU0NSSVBUSU9OCisgICAgICBFeGVjdXRlIGFuIExQQyBleHByZXNzaW9uLiBJbnNpZGUgdGhlIDxleHByZXNzaW9uPiwgIm1lIiBhbmQgImhlcmUiIGFyZQorICAgICAgcHJlZGVmaW5lZCBvYmplY3RzIChndWVzcyBmb3Igd2hhdCA6KS4gSGVyZSB3ZSBjYW4gYWxzbyB1c2UgdGhlIGZ1bmN0aW9uCisgICAgICAiZ2V0KCkiIHRvIGZpbmQgYW4gb2JqZWN0IHVzaW5nIHRoZSBvYmplY3QgYWNjZXNzIHN5bnRheC4gSWYgdGhlCisgICAgICBFeHByZXNzaW9uIHJldHVybnMgYW4gb2JqZWN0IHRoZSB2YXJpYWJsZSAiJHJlc3VsdCIgd2lsbCBiZSBzZXQgdG8gdGhpcy4KKyAgICAgIHhldmFsIGluY2x1ZGVzIGEgcHJpdmF0ZSB+Ly54dG9vbC5oLCBpZiBpdCBleGlzdHMsIHRvIHN1cHBvcnQgdXNlciAgICAgICAgCisgICAgICBkZWZpbmVkIG1hY3Jvcy4KKworCitFWEFNUExFUworICAgICAgSnVzdCBkbyBpdCEKKyAgICAgIHhldmFsIHVzZXJzKCkKKyAgICAgIHhldmFsIGdldHVpZChtZSkKKyAgICAgIHhldmFsIGdldCgiJG1lLnh0b29sIikKKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94Zm9yYWxsIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94Zm9yYWxsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NTU4ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hmb3JhbGwKQEAgLTAsMCArMSwyOSBAQAorU1lOT1BTSVMKKyAgICAgIHhmb3JhbGwgPGZpbGVwYXR0ZXJuPiA8Y29tbWFuZD4KKworREVTQ1JJUFRJT04KKyAgICAgIEV4ZWN1dGUgPGNvbW1hbmQ+IGZvciBhbGwgbWF0Y2hpbmcgZmlsZXMuIFRoZSA8Y29tbWFuZD4gc3RyaW5nIGNhbgorICAgICAgY29udGFpbiByZXBsYWNtZW50IG1hcmtzLiBDdXJyZW50bHkgdGhlcmUgYXJlIGZpdmUgb2YgdGhlc2UgbWFya3M6CisgICAgICAtICIhISIgdGhpcyBtYXJrIHN0YW5kcyBmb3IgdGhlIGZ1bGwgZmlsZSBuYW1lLgorICAgICAgLSAiIWUiIHN0YW5kcyBmb3IgdGhlIGV4dGVuc2lvbiBvZiB0aGUgZmlsZSBuYW1lLgorICAgICAgLSAiIWYiIHN0YW5kcyBmb3IgdGhlIGZpbGUgbmFtZSB3aXRob3V0IGV4dGVuc2lvbiBhbmQgZGlyZWN0b3J5IG5hbWUuCisgICAgICAtICIhaCIgc3RhbmRzIGZvciB0aGUgZnVsbCBkaXJlY3RvcnkgbmFtZSBvZiB0aGUgZmlsZXMuCisgICAgICAtICIhciIgc3RhbmRzIGZvciB0aGUgZnVsbCBmaWxlIG5hbWUgd2l0aG91dCBmaWxlIGV4dGVuc2lvbi4KKyAgICAgIC0gIiF0IiBzdGFuZHMgZm9yIHRoZSBmaWxlIG5hbWUgd2l0aG91dCB0aGUgZGlyZWN0b3J5IG5hbWUuCisKKyAgICAgIElmIHRoZSBmdWxsIGZpbGUgbmFtZSB3b3VsZCBiZSAiL2RpcmVjdG9yeS9maWxlLmV4dCIgdGhlbgorICAgICAgIiEhIiBlcXVhbHMgIi9kaXJlY3RvcnkvZmlsZS5leHQiCisgICAgICAiIWUiIGVxdWFscyAiZXh0IgorICAgICAgIiFmIiBlcXVhbHMgImZpbGUiCisgICAgICAiIWgiIGVxdWFscyAiL2RpcmVjdG9yeSIKKyAgICAgICIhciIgZXF1YWxzICIvZGlyZWN0b3J5L2ZpbGUiCisgICAgICAiIXQiIGVxdWFscyAiZmlsZS5leHQiCisKK0VYQU1QTEVTCisgICAgICB4Zm9yYWxsIH4vcm9vbS8qLmMgeGNhbGwgIXItPnJlc2V0KCk7CisgICAgICBDYWxsIHRoZSByZXNldCgpIGZ1bmN0aW9uIGluIGFsbCB5b3VyIHJvb21zLgorCisgICAgICB4Zm9yYWxsIH4vb2JqLyogbXYgISEgIWgvb2xkb2JqLyFmLiFlLm9sZAorICAgICAgTW92ZSBhbGwgZmlsZXMgZnJvbSB5b3VyICJvYmoiIGRpciBpbnRvIHRoZSAib2JqL29sZG9iaiIgZGlyIGFuZCBjaGFuZ2UKKyAgICAgIHRoZSBleHRlbnNpb25zLgorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hnb3RvIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94Z290bwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjRjY2JhCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94Z290bwpAQCAtMCwwICsxLDE2IEBACitTWU5PUFNJUworICAgICAgeGdvdG8gW29iamVjdF0KKworREVTQ1JJUFRJT04KKyAgICAgIEdvIGluc2lkZSA8b2JqZWN0Pi4gV2l0aG91dCBhbiBhcmd1bWVudCB5b3Ugd2lsbCBsZWF2ZSBpbnRvIHlvdXIKKyAgICAgIHdvcmtyb29tLiBJZiA8b2JqZWN0PiBpcyBhIGxpdmluZyB0aGluZywgZ290byBpdCdzIGVudmlyb25tZW50CisgICAgICAobmV2ZXIgdGVzdGVkIHVudGlsIG5vdywgd2hlbiBnb2luZyB0byBhIGxpdmluZyB0aGluZywgaW5zaWRlCisgICAgICBhIGxpdmluZyB0aGluZyA6KQorCitFWEFNUExFUworICAgICAgeGdvdG8gL3Jvb20vc2hvcAorICAgICAgeGdvdG8gc2hvcAkgKGJvdGggYXJlIHRoZSBzYW1lLCBiZWNhdXNlIGlmIHRoZXJlIGlzIG5vIHNob3AgaW4KKwkJCSAgdGhlIGN1cnJlbnQgZGlyZWN0b3J5LCBhICIvcm9vbS8iIHdpbGwgYmUgYXBwZW5kZWQKKwkJCSAgdG8gdGhlIGFyZ3VtZW50KQorICAgICAgeGdvdG8gcHVibGljIGVuZW15IChkbyB0aGlzIG9ubHkgd2hlbiB5b3UgYXJlIHJlYWxseSBib3JlZCkKKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94Z3JlcCBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGdyZXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODkxNGZjYgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGdyZXAKQEAgLTAsMCArMSwyNSBAQAorU1lOT1BTSVMKKyAgICAgIHhncmVwIFstaXZdIDxyZWdleHA+IDxmaWxlcGF0dGVybj4KKyAgICAgICAgb3IKKyAgICAgIHhncmVwIFstaXZdIDxyZWdleHA+ICAgICh3aGVuIHJlYWRpbmcgZnJvbSBhIHBpcGUpCisKK0RFU0NSSVBUSU9OCisgICAgICBTZWFyY2ggZm9yIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gPHJlZ2V4cD4gaW4gYWxsIGZpbGVzIG1hdGNoaW5nIHRoZQorICAgICAgPGZpbGVwYXR0ZXJuPi4KKyAgICAgIFdvcmtzIHNpbXVsYXIgdG8gdGhlIFVuaXggY29tbWFuZCAiZ3JlcCIuIFRoZSByZXNsdXQgd2lsbCBiZSB3cml0dGVuCisgICAgICB0byA8U1RET1VUPiBhbmQgbWF5IGJlIHBpcGVkIGludG8gYW5vdGhlciBjb21tYW5kLgorCitPUFRJT05TCisgICAgICAtdiAgcmV2ZXJ0cyB0aGUgc2Vuc2Ugb2YgPHJlZ2V4cD4uCisKKyAgICAgIC1pICBtYXRjaGVzIGNhc2UtaW5zZW5zaXRpdmUKKworRVhBTVBMRVMKKyAgICAgIHhncmVwIERlZXB0aG91Z2h0IC9sb2cvU0hPVVRTCisgICAgICBUaGlzIHdpbGwgc2VhcmNoIHRocm91Z2h0IHRoZSBzaG91dCBsb2cgZmlsZSBmb3IgYW55IGxpbmUgd2hpY2ggaGFzCisgICAgICB0aGUgd29yZCAiRGVlcHRob3VnaHQiIGluIGl0LgorCisgICAgICB4Z3JlcCBjcmVhdGVcKFwpICouYworICAgICAgVGhpcyB3aWxsIHNlYXJjaCBmb3IgYWxsIGxpbmVzIG9mIGFsbCBscGMgY29kZSBmaWxlcyBpbiB0aGUgY3VycmVudCBkaXIKKyAgICAgIHdoaWNoIGhhdmUgdGhlIGZ1bmN0aW9uICJjcmVhdGUoKSIgZGVmaW5lZC4KKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94aGJlYXRzIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94aGJlYXRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhODk3ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hoYmVhdHMKQEAgLTAsMCArMSwxOCBAQAorU1lOT1BTSVMKKyAgICAgIHhoYmVhdHMgW3NlYXJjaCBwYXR0ZXJuXQorICAgICAgb3IKKwkgIHhoYmVhdHMgICAgICh3aGVuIHdyaXRpbmcgdG8gYSBwaXBlKQorCitERVNDUklQVElPTgorICAgICAgV2l0aCBubyBhcmd1bWVudCBpdCBzaG93cyBhbGwgeW91ciBvYmplY3RzIHdoaWNoIGhhdmUgYSBydW5uaW5nIGhlYXJ0CisgICAgICBiZWF0LiBXaXRoIGEgcmVnZXhwIGFzIGFyZ3VtZW50LCBhbGwgbWF0Y2hpbmcgb2JqZWN0cyB3aWxsIGJlIHByaW50ZWQuCisJICBXaGVuIHdyaXRpbmcgdG8gYSBwaXBlLCBhbGwgaGVhcmJlYXRzIHdpbGwgYmUgcHJpbnRlZCBhbmQgYSBzZWFyY2gKKwkgIHBhdHRlcm4gaXMgbm90IGFsbG93ZWQuCisKK0VYQU1QTEVTCisgICAgICB4aGJlYXRzIG9iaiAgIFNob3cgYWxsIG9iamVjdHMgd2hpY2ggaGF2ZSBhIHJ1bm5pbmcgaGVhcnQgYmVhdCBhdCB0aGUKKyAgICAgICAgICAgICAgICAgICAgb2JqZWN0IG5hbWVzIHdpdGggdGhlIHN0cmluZyAib2JqIiBpbiBpdC4KKyAgICAgIHhoYmVhdHMgLiAgICAgU2hvdyBhbGwgY2FsbG91dHMuIFBsZWFzZSBkb24ndCBkbyB0aGlzIGlmIGl0IGlzbid0CisgICAgICAgICAgICAgICAgICAgIHJlYWxseSBuZWNjZXNzYXJ5LiBJdCBqdXN0IGNvc3RzIHRpbWUgLSBhbmQgd2hhdCBkbyB5b3UKKyAgICAgICAgICAgICAgICAgICAgd2FudCB0byBkbyB3aXRoIHRoaXMgaW5mb3JtYXRpb24/CisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveGhlYWQgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hoZWFkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MDEwNTUKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hoZWFkCkBAIC0wLDAgKzEsMTEgQEAKK1NZTk9QU0lTCisgICAgICB4aGVhZCA8LSM+IDxmaWxlPgorCSAgb3IKKwkgIHhoZWFkIDwtIz4gICAgKHdoZW4gcmVhZGluZyBmcm9tIGEgcGlwZSkKKworREVTQ1JJUFRJT04KKyAgICAgIHhoZWFkIHByaW50cyB0aGUgZmlyc3QgcGFydCBvZiBhIGdpdmVuIGZpbGU7IEl0IHJlYWRzIGZyb20gYSBwaXBlCisJICBpZiBubyBmaWxlIGlzIGdpdmVuLgorCitFWEFNUExFUworICAgICAgeGhlYWQgLTEwIHdvcmtyb29tLmMgcHJpbnRzIHRoZSBmaXJzdCAxMCBsaW5lcyBvZiB0aGUgZmlsZSB3b3Jrcm9vbS5jLgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94aGVscCBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGhlbHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBhYTdkNAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGhlbHAKQEAgLTAsMCArMSw2IEBACitTWU5PUFNJUworICAgICAgeGhlbHAKKworREVTQ1JJUFRJT04KKyAgICAgIFNob3cgdGhlIG1haW4gaGVscCBmaWxlLgorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hpZHMgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hpZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjdlZjc2MQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGlkcwpAQCAtMCwwICsxLDYgQEAKK1NZTk9QU0lTCisgICAgICB4aWRzIDxvYmplY3Q+CisKK0RFU0NSSVBUSU9OCisgICAgICBTaG93IHRoZSB1c2VyIGlkIGFuZCB0aGUgZWZmZWN0aXZlIHVzZXIgaWQgb2YgdGhlIDxvYmplY3Q+LgorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hpbmhlcml0IGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94aW5oZXJpdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjAyZjNlCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94aW5oZXJpdApAQCAtMCwwICsxLDE2IEBACitTWU5PUFNJUworICAgICAgeGluaGVyaXQgPG9iamVjdD4gW2Z1bmN0aW9uXQorCitERVNDUklQVElPTgorICAgICAgU2hvdyB0aGUgaW5oZXJpdGFuY2UgdHJlZSBvZiBhbiBvYmplY3QgYW5kIGlmIG9wdGlvbmFsIHNwZWNpZmllZAorICAgICAgZGlzcGxheSBhbGwgb2NjdXJlbmNpZXMgb2YgdGhlIGZ1bmN0aW9uLgorICAgICAgVGhlIGluaGVyaXRhbmNlIHRyZWUgaXMgcGVyaGFwcyBub3QgdGhlIG9uZSB5b3UgZXhwZWN0IHRvIHNlZS4gSW4KKyAgICAgIGZhY3QgaXRzIHRoZSBvbmUgdGhlIGdhbWVkcml2ZXIgcmVhbGx5IHVzZXMuIFRoYXQgbWVhbnMgaWYgZm9yCisgICAgICBleGFtcGxlIHR3byBvYmplY3QgaW5oZXJpdCBlYWNoIG90aGVyIG9yIGluIGFueSBvdGhlciBjYXNlIG9mIHJlY3Vyc2lvbgorICAgICAgaXQgd2lsbCBub3QgYmUgc2hvd24uIE9yIGlmIGFuIG9iamVjdCBBIGluaGVyaXRzIG9iamVjdCBCIGFuZCBDCisgICAgICBhbmQgb2JqZWN0IEIgYWxzbyBpbmhlcml0cyBvYmplY3QgQywgdGhlIG9iamVjdCBDIHdpbGwgb25seSBkaXNwbGF5ZWQKKyAgICAgIG9uY2UgKGJlY2F1c2UgdGhlIGdhbWVkcml2ZXIgYWxzbyBpbmhlcml0cyBvYmplY3Qgb25jZSkuCisKK0VYQU1QTEUKKyAgICAgIHhpbmhlcml0ICRtZQorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hsYWcgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hsYWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQyODExNAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGxhZwpAQCAtMCwwICsxLDE2IEBACitTWU5PUFNJUworICAgICAgeGxhZworCitERVNDUklQVElPTgorICAgICAgeGxhZyBkaXNwbGF5cyB0aGUgY3VycmVudCBzeXN0ZW0gTEFHIGJ5IGNvbXBhcmluZyB0aGUgYWN0dWFsCisgICAgICBwcm9jZXNzZWQgaGVhcnRiZWF0cyB3aXRoIHRoZSBpbml0aWFsIGhlYXJ0YmVhdCByYXRlICgxLzJzKS4KKyAgICAgIFZhbHVlcyB3aWxsIHdlIGRpc3BsYXllZCBmb3IgdGhlIGxhc3QgbWludXRlLCB0aGUgbGFzdCAxNSBtaW51dGVzCisgICAgICBhbmQgdGhlIGxhc3QgaG91ci4KKworRVhBTVBMRQorICAgICAgTGV0enRlIDYwIG1pbjogIyMjIyMjIyAoNy4yJSkKKyAgICAgIExldHp0ZSAxNSBtaW46ICMjIyMjIyMjICg4LjMlKQorICAgICAgTGV0enRlIE1pbnV0ZTogIyMjIyMjIyMjICg5LjQlKSAKKworQVZBSUxBQklMSVRZCisgICAgICB4bGFnIHJlcXVpcmVzIC9wbGF5ZXJzL2tpcmsvb2JqL2xhZy1vLWRhZW1vbi5jIHRvIGJlIGxvYWRlZC4KZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveGxvYWQgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hsb2FkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwZGI4NzcKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hsb2FkCkBAIC0wLDAgKzEsMTUgQEAKK1NZTk9QU0lTCisgICAgICB4bG9hZCA8ZmlsZW5hbWU+CisKK0RFU0NSSVBUSU9OCisgICAgICBVcGRhdGUgYW5kIGxvYWQgdGhlIG9iamVjdCBzcGVjaWZpZWQgYnkgdGhlIGZpbGVuYW1lLiBJZiB5b3UgdXBkYXRlCisgICAgICB5b3VyIGN1cnJlbnQgZW52aXJvbm1lbnQsIGFsbCBwbGF5ZXJzIHdpbGwgYmUgbW92ZWQgc2lsZW50bHkgaW50bworICAgICAgIi9zdGQvdm9pZCIgYW5kIGFmdGVyIHN1Y2Nlc3NmdWwgdXBkYXRpbmcgYW5kIGxvYWRpbmcgYmFjayBpbnRvIGl0LgorCitFWEFNUExFUworICAgICAgeGxvYWQgJGhlcmUKKyAgICAgIFVwZGF0ZSBhbmQgcmVsb2FkIHRoZSBjdXJyZW50IHJvb20gKGJ1dCB3aXRob3V0IGEgdHJpcCBpbnRvIHRoZSB2b2lkIDopLgorCisgICAgICB4bG9hZCBvYmovbGl0dGxlX3RoaW5nLmMKKyAgICAgIFVwZGF0ZSBhbmQgbG9hZCBpdC4KKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94bG9vayBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGxvb2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjU5YmM5ZQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveGxvb2sKQEAgLTAsMCArMSw3IEBACitTWU5PUFNJUworICAgICAgeGxvb2sgW29iamVjdF0KKworREVTQ1JJUFRJT04KKyAgICAgIExvb2sgYXQgdGhlIG9iamVjdC4gSWYgdGhlIGFyZ3VtZW50IGlzIG9tbWl0dGVkLCBsb29rIGluc2lkZSB0aGUKKyAgICAgIGN1cnJlbnQgcm9vbS4KKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94bHBjIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94bHBjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmNDcxZWQKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hscGMKQEAgLTAsMCArMSwyMCBAQAorU1lOT1BTSVMKKyAgICAgIHhscGMgPGxwYyBjb2RlPgorCitERVNDUklQVElPTgorICAgICAgRXhlY3V0ZSBwdXJlIExQQyBjb2RlLiAibWUiIGFuZCAiaGVyZSIgYXJlIHByZWRlZmluZWQgb2JqZWN0cy4gQWxzbyB0aGUKKyAgICAgIDxwcm9wZXJ0aWVzLmg+IHdpbGwgYmUgaW5jbHVkZWQuIFRoZSBmdW5jdGlvbiAiZ2V0KHN0cmluZykiIGNhbiBiZSB1c2VkCisgICAgICBmb3IgYWNjZXNzaW5nIG9iamVjdHMuIElmIHRoZSBleGVjdXRpb24gcmV0dXJucyBhbiBvYmplY3QgdGhlIHZhcmlhYmxlCisgICAgICAiJHJlc3VsdCIgd2lsbCBzZXQgdG8gdGhpcyBvYmplY3QuCisKK0VYQU1QTEVTCisgICAgICB4bHBjIGludCBpO29iamVjdCAqbztvPXVzZXJzKCk7Zm9yKGk9MDtpPHNpemVvZihvKTtpKyspb1tpXS0+CisgICAgICAgICAgIFNldFByb3AoUF9GUk9HLDEpOworICAgICAgKExldCBhbGwgdXNlcnMgYmUgc2xpbXkgZnJvZ3MgOikKKworICAgICAgeGxwYyBpbnQgaTtvYmplY3QgKm87bz11c2VycygpO2ZvcihpPTA7aTxzaXplb2Yobyk7aSsrKQorCSAgIG9baV0tPlNldFByb3AoUF9USVRMRSxnZXQoIiRtZSIpLT5RdWVyeVByb3AoUF9USVRMRSkpOworICAgICAgKEdpdmUgYWxsIHVzZXJzIHlvdXIgcHJlZmVyZWQgdGl0bGUuIFRha2UgYSBsb29rIG9mIHRoZSB1c2Ugb2YgZ2V0KCkuKQorCisgICAgICBCb3RoIGNvbW1hbmRzIG11c3QgYmUgd3JpdHRlbiBpbiBvbmUgbGluZSBvZiBjb3Vyc2UhCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveG1hbiBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveG1hbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjU2YWQxCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94bWFuCkBAIC0wLDAgKzEsMTcgQEAKK1NZTk9QU0lTCisgICAgICB4bWFuIDx0b3BpYz4KKworREVTQ1JJUFRJT04KKyAgICAgIFNlYXJjaGVzIGluIHNvbWUgc3BlY2lhbCBkaXJlY3RvcmllcyB1bmRlciAvZG9jIGZvciB0aGUgZ2l2ZW4gdG9waWMKKyAgICAgIG9yIGNvbW1hbmQuIElmIHRoZXJlIGFyZSB0d28gZXF1YWwgdG9waWNzIGluIGRpZmZlcmVudCBkaXJlY3RvcmllcworICAgICAgdGhlIG9uZSBmb3VuZCBmaXJzdCB3aWxsIGJlIHByaW50ZWQuCisKK0VYQU1QTEVTCisgICAgICB4bWFuIHhtYW4KKyAgICAgIHhtYW4geGZvcmFsbAorICAgICAgeG1hbiBlZnVuL2Rlc3RydWN0CisgICAgICB4bWFuIHcvZGVzdHJ1Y3QKKyAgICAgIHhtYW4gbW92ZQorICAgICAgeG1hbiB0aGluZworICAgICAgeG1hbiBkb21haW5zCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveG1vcmUgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3htb3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjZDkyNTAKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3htb3JlCkBAIC0wLDAgKzEsMTIgQEAKK1NZTk9QU0lTCisgICAgICB4bW9yZSA8ZmlsZW5hbWU+IFtzdGFydF0KKworREVTQ1JJUFRJT04KKyAgICAgIFByaW50cyBvdXQgYSBmaWxlIGFuZCBpZiBhIHN0YXJ0aW5nIGxpbmUgaXMgZ2l2ZW4sIHRoZW4gdGhlIHByaW50aW5nCisgICAgICB3aWxsIHN0YXJ0IHRoZXJlLiBPbiBhbnNpIG9yIHZ0MTAwIHRlcm1pbmFscyB0aGUgc3RhdHVzIGxpbmUgd2lsbCBiZQorICAgICAgb3ZlcnN0cm9rZWQgdG8gZ2l2ZSBhIGhhcm1vbmljIHZpZXcgb2YgdGhlIGZpbGUuCisKK0VYQU1QTEVTCisgICAgICB4bW9yZSB+L3dvcmtyb29tLmMKKyAgICAgIHhtb3JlICRoZXJlICh0aGlzIHdpbGwgc2hvdyB0aGUgc291cmNlIG9mIHRoZSBjdXJyZW50IHJvb20pCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveG1vdmUgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3htb3ZlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YzBhZWMKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3htb3ZlCkBAIC0wLDAgKzEsMTMgQEAKK1NZTk9QU0lTCisgICAgICB4bW92ZSA8b2JqZWN0PiBpbnRvIDxvYmplY3Q+CisKK0RFU0NSSVBUSU9OCisgICAgICBNb3ZlcyBvbmUgb2JqZWN0IGludG8gYW5vdGhlciBvciBnaXZlIHRoZSByZWFzb24gd2h5IHRoZSBtb3ZlIGZhaWxlZC4KKworRVhBTVBMRVMKKyAgICAgIHhtb3ZlICRjbG9uZSBpbnRvICRtZQorICAgICAgSWYgeW91IGNsb25lZCBhbiBvYmplY3Qgd2l0aCB4Y2xvbmUgYnV0IHRoZSBvYmplY3QgY291bGRuJ3QgYmUgbW92ZWQKKyAgICAgIHRoZW4gdGhpcyBjYW4gYmUgdXNlZCB0byBnZXQgdGhlIHJlYXNvbiBmb3IgaXQuCisKKyAgICAgIHhtb3ZlIGh5cCBpbnRvIF53dXJ6ZWwgICh0aGlzIGlzIGEgc2lsZW50IGZvcm0gb2YgZ29pbmcgdG8gb3RoZXIgcGxheWVycykKKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94bXNnIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94bXNnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3NWI3ODAKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3htc2cKQEAgLTAsMCArMSwxMSBAQAorU1lOT1BTSVMKKyAgICAgIHhtc2cgW3RvIDxvYmplY3Q+fGFsbF0KKworREVTQ1JJUFRJT04KKyAgICAgIFNlbmQgYSBtZXNzYWdlLiBJZiBubyBhcmd1bWVudHMgYXJlIGdpdmVuIHRoZSBtZXNzYWdlIHdpbGwgYmUgc2VuZCBpbnRvCisgICAgICB0aGUgcm9vbS4gSWYgc2Vjb25kIGFyZ3VtZW50IGlzICJ0byIgdGhlbiBzZW5kIHRoZSBtZXNzYWdlIHRvIHRoZQorICAgICAgc3BlY2lmaWVkIDxvYmplY3Q+LiBJZiBzZWNvbmQgYXJndW1lbnQgaXMgImFsbCIgdGhlbiBzZW5kIHRoZSBtZXNzYWdlIHRvCisgICAgICBhbGwgcGxheWVycyBpbiB0aGUgbXVkLgorICAgICAgVGhpcyBjb21tYW5kIGNhbiBiZSB1c2VkIHRvIHNlbmQgdGV4dCB2aWEgY3V0JnBhc3RlIHRvIHNvbWVvbmUgd2l0aG91dAorICAgICAgcHV0dGluZyBhICJzYXkiLCAidGVsbCIgb3IgInNob3V0IiBpbmZyb250IG9mIGVhY2ggbGluZS4KKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94bXRwIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94bXRwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkNzRhOWMKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3htdHAKQEAgLTAsMCArMSwyNCBAQAorU1lOT1BTSVMKKyAgICAgIHhtdHAgW29wdGlvbnNdIDxkaXJlY3Rvcnk+IDxmaWxlPgorCitERVNDUklQVElPTgorICAgICAgQ3JlYXRlIGEgc2NyaXB0IGZpbGUgZm9yIHRyYW5zZmVyaW5nIGNvbXBsZXRlIGRpcmVjdG9yaWVzIHdpdGggbXRwLgorICAgICAgSWYgeW91ciBtdHAgbmVlZHMgZXh0cmEgYXJndW1lbnRzIChleGNlcHQgb2YgdGhlIC1yIG9wdGlvbiB3aGljaAorICAgICAgc3RhbmRzIGZvciByZWFkaW5nIGZpbGVzKSBmb3IgZXhhbXBsZSB0aGUgLWcgb3B0aW9uIHRoZW4geW91IGNhbiBhZGQKKyAgICAgIHRoZW4gdG8gdGhlIGNvbW1hbmQuCisgICAgICBUaGlzIGNvbW1hbmQgd29ya3MgcmVjdXJzaXZlbHkgYW5kIGNhbiBjYXVzZSBhIHRvIGRlZXAgcmVjdXJzaW9uIG9yCisgICAgICBhIHRvbyBsb25nIGV2YWx1YXRpb24gZXJyb3Igd2hlbiB0cnlpbmcgdG8gbWFrZSBhIHNjcmlwdCBmb3IgaHVnZQorICAgICAgZGlyZWN0b3JpZXMgbGlrZSAiL3BsYXllcnMiIGZvciBleGFtcGxlLgorICAgICAgSWYgdGhlIDxmaWxlPiBhbGxyZWFkeSBleGlzdHMgaXQgd2lsbCBub3QgYmUgcmVtb3ZlZCBpbnN0ZWFkIHRoZSBzY3JpcHQKKyAgICAgIHdpbGwgc2ltcGx5IGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGZpbGUuCisKK0VYQU1QTEUKKyAgICAgIHhtdHAgLWd0dWJtdWQgL2Jhc2ljIH4vYmFzaWMuY3NoCisgICAgICBDcmVhdGUgYSBzY3JpcHQgZmlsZSAiYmFzaWMuY3NoIiB0byB0cmFuc2ZlciB0aGUgd2hvbGUgY29udGVudCBvZiB0aGUKKyAgICAgICIvYmFzaWMiIGRpcmVjdG9yeS4KKworICAgICAgT24geW91ciBob3N0IHlvdSB0aGVuIGp1c3QgY3JlYXRlIGEgZGlyZWN0b3J5IChub3JtYWxseSB3aXRoIHRoZSBzYW1lCisgICAgICBuYW1lIGdpdmUgdG8gdGhlIHhtdHAgY29tbWFuZCksIGNoYW5nZSBpbnRvIHRoZSBkaXJlY3RvcnkgYW5kIHJlYWQKKyAgICAgIHRoZSBzY3JpcHQgZmlsZSB3aXRoICJtdHAgLXIgYmFzaWMuY3NoIi4gVGhlbiBqdXN0IGV4ZWN1dGUgdGhlIHNjcmlwdAorICAgICAgd2l0aCAiY3NoIiBvciAic2giLgorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hwcm9jIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94cHJvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmQwYWExCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94cHJvYwpAQCAtMCwwICsxLDEzIEBACitTWU5PUFNJUworICAgICAgeHByb2MgWy1jXSBbLWxdIFstbV0gWy11XSBbLXZdCisKK0RFU0NSSVBUSU9OCisgICAgICB4cHJvYyBwcmludHMgaW5mb3JtYXRpb24gZnJvbSB0aGUgL3Byb2MgZmlsZXN5c3RlbSB0byB0aGUgc2NyZWVuLgorICAgICAgVGhlIGZvcm1hdCBpcyB0b3RhbGx5IHVuZm9ybWF0dGVkISAoSSBjYW4ndCBoZWxwIGl0IGZvciBub3cuLi4pIAorICAgICAgV2l0aG91dCBhbnkgb3B0aW9uLCBpdCBkaXNwbGF5IHRoZSBtYWNoaW5lcyBsb2FkIGF2ZXJhZ2VzLgorCisgICAgICAtYzogY3B1IGluZm9ybWF0aW9uCisgICAgICAtbDogbG9hZCBhdmVyYWdlcworICAgICAgLW06IG1lbW9yeSB1c2FnZQorICAgICAgLXU6IG1hY2hpbmUncyB1cHRpbWUKKyAgICAgIC12OiBrZXJuZWwgdmVyc2lvbgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94cHJvcHMgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hwcm9wcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOGYwZGZlCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94cHJvcHMKQEAgLTAsMCArMSwxNSBAQAorU1lOT1BTSVMKKyAgICAgIHhwcm9wcyBbLWZ8LW1dIDxvYmplY3Q+CisKK0RFU0NSSVBUSU9OCisgICAgICBQcmludHMgb3V0IGFsbCBwcm9wZXJ0aWVzIG9mIDxvYmplY3Q+IHdoaWNoIGFyZSBjdXJyZW50bHkgZGVmaW5lZAorICAgICAgaW4gL3N5cy9wcm9wZXJ0aWVzLmguCisKK09QVElPTlMKKyAgICAgIC1mICBMaXN0IHByb3BlcnR5IGZsYWdzIHZlcmJvc2UKKworICAgICAgLW0gIExpc3QgcHJvcGVydHkgbWV0aG9kcworCitFWEFNUExFCisgICAgICB4cHJvcHMgJG1lCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveHNjYW4gYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hzY2FuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmN2I0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hzY2FuCkBAIC0wLDAgKzEsNyBAQAorU1lOT1BTSVMKKyAgICAgIHhzY2FuCisKK0RFU0NSSVBUSU9OCisgICAgICBTY2FuIGN1cnJlbnQgcm9vbSBmb3IgbmV0ZGVhZCBwbGF5ZXJzIGFuZCBjaGVjayB2YXJpYWJsZXMuCisgICAgICAoVGhlcmUgd2lsbCBmb2xsb3cgbW9yZSBjaGVja2luZyByb3V0aW5lcyBsaWtlIHNub29wLCBpbnZpcyBldGMuIDopCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveHNldCBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveHNldApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjdjNjZkCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94c2V0CkBAIC0wLDAgKzEsMTUgQEAKK1NZTk9QU0lTCisgICAgICB4c2V0IFskPG5hbWU+PTxvYmplY3Q+XQorCitERVNDUklQVElPTgorICAgICAgV2l0aG91dCBhbiBhcmd1bWVudCBhbGwgY3VycmVudCB2YXJpYWJsZSBzZXR0aW5ncyB3aWxsIGJlIHNob3duIGFuZAorICAgICAgZGVzdHJ1Y3RlZCBvYmplY3RzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdCBvZiB2YXJpYWJsZXMuCisgICAgICBXaXRoIGFyZ3VtZW50IHRoZSBzcGVjaWZpZWQgdmFyaWFibGUgd2lsbCBiZSBzZXQuCisKK0VYQU1QTEVTCisgICAgICB4c2V0ICRkZWVwPWRlZXB0aG91Z2h0CisgICAgICB4c2V0ICR4dG9vbD0kbWUueHRvb2wKKyAgICAgIHhzZXQgJGdvZD0kZGVlcAorICAgICAgeHNldCAkbGFzdF9yZXN1bHQ9JHJlc3VsdAorICAgICAgeHNldCAkMz1eJDEuMworCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hzaCBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveHNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzNzc5OTIKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hzaApAQCAtMCwwICsxLDEyIEBACitTWU5PUFNJUworICAgICAgeHNoIDxmaWxlbmFtZT4KKworREVTQ1JJUFRJT04KKyAgICAgIFJlYWQgaW4gYSBmaWxlIGFuZCBleGVjdXRlIGVhY2ggbGluZSBvZiBpdCBhcyBhIGNvbW1hbmQgZ2l2ZW4gZnJvbSB0aGUKKyAgICAgIGtleWJvYXJkLgorCitFWEFNUExFCisgICAgICB4c2ggfi9zZXR1cC54c2gKKyAgICAgIEV4ZWN1dGUgdGhlIGZpbGUgIn4vc2V0dXAueHNoIi4gVGhpcyB3YXkgeW91IGNhbiBzZXQgdXAgeW91ciBhbGlhc2VzIG9yCisgICAgICBvdGhlciBwYXJhbWV0ZXJzIGZvciBvdGhlciB0b29scyBpZiB0aGUgc2V0dGluZyBnb25lIGxvc3QuCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveHNvcnQgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hzb3J0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZWEyZGEKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3hzb3J0CkBAIC0wLDAgKzEsMTEgQEAKK1NZTk9QU0lTCisgICAgICB4c29ydCBbLXJdIDxmaWxlPgorCSAgb3IKKwkgIHhzb3J0IFstcl0gICAgKHdoZW4gcmVhZGluZyBmcm9tIGEgcGlwZSkKKworREVTQ1JJUFRJT04KKyAgICAgIHhzb3J0IHNvcnQgYWxsIGxpbmVzIG9mIGEgZ2l2ZW4gZmlsZSBpbiBpbmNyZWFzaW5nL2RlY3JlYXNpbmcgb3JkZXIuCisJICBJZiBubyBmaWxlIGlzIGdpdmVuIGl0IHJlYWRzIGZyb20gYSBwaXBlLgorCitFWEFNUExFUworICAgICAgeHNvcnQgLXIgd29ya3Jvb20uYyBzb3J0cyBhbGwgbGluZXMgb2Ygd29ya3Jvb20uYyBpbiByZXZlcnNlIG9yZGVyLgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94dGFpbCBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveHRhaWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDRjMjMwMAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveHRhaWwKQEAgLTAsMCArMSwxMiBAQAorU1lOT1BTSVMKKyAgICAgIHh0YWlsIDwtfCsjPiA8ZmlsZT4KKwkgIG9yCisJICB4dGFpbCA8LXwrIz4gICAgKHdoZW4gcmVhZGluZyBmcm9tIGEgcGlwZSkKKworREVTQ1JJUFRJT04KKyAgICAgIHh0YWlsIHByaW50cyB0aGUgbGFzdCBwYXJ0IG9mIGEgZ2l2ZW4gZmlsZTsgSXQgcmVhZHMgZnJvbSBhIHBpcGUKKwkgIGlmIG5vIGZpbGUgaXMgZ2l2ZW4uCisKK0VYQU1QTEVTCisgICAgICB4dGFpbCAtMTAgd29ya3Jvb20uYyBwcmludHMgdGhlIGxhc3QgMTAgbGluZXMgb2YgdGhlIGZpbGUgd29ya3Jvb20uYy4KKwkgIHh0YWlsICsxMCB3b3Jrcm9vbS5jIHByaW50cyBhbGwgbGluZXMgb2Ygd29ya3Jvb20uYyBiZWdpbm5pbmcgYXQgbGluZSAxMC4KZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveHRvb2wgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3h0b29sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyZDA2MTQKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3h0b29sCkBAIC0wLDAgKzEsNDUgQEAKK1NZTk9QU0lTCisgICAgICB4dG9vbCBbdXBkYXRlfGhlYXJ0PTxvbnxvZmY+fGZpcnN0PTxvbnxvZmY+fHByb3RlY3Q9PG9ufG9mZj58CisJICAgICBpbnZjaGVjaz08b258b2ZmPnxlbnZjaGVjaz08b258b2ZmPnxuZGNoZWNrPTxvbnxvZmY+fAorCSAgICAgdmFyY2hlY2s9PG9ufG9mZj58c2hvcnQ9PG9ufG9mZj58ZWNobz08b258b2ZmPnwKKwkgICAgIG1vcmU9PGFtb3VudD58a2lsbHxuZXdzfHNhdmV8bG9hZHxyZXNldF0KKworREVTQ1JJUFRJT04KKyAgICAgIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIHNldCBzb21lIHRvb2wtc3BlY2lmaWMgYmVoYXZpb3Vycy4KKyAgICAgIC0gInVwZGF0ZSIgY2xvbmVzIGEgbmV3IFh0b29sIGFuZCBkZXN0cnVjdHMgdGhlIG9sZCBvbmUuIFRoaXMgc2hvdWxkCisgICAgICAgIG9ubHkgYmUgZG9uZSB3aGVuIHdvcmtpbmcgb24gdGhlIHNvdXJjZSBvZiB0aGUgdG9vbCBhbmQgdG8gZ2V0IGEgZmFzdAorICAgICAgICB1cGRhdGUuIFNldHRpbmdzIGFuZCBhbGlhc2VzIHdpbGwgYmUgcmVhY2hlZCB0aHJvdWdoIHRoZSBuZXcgY2xvbmUuCisgICAgICAtICJoZWFydD08b258b2ZmPiIgdHVybnMgdGhlIGhlYXJ0IGJlYXQgb2YgdGhlIHRvb2wgb24gb3Igb2ZmLgorICAgICAgICBUaGUgaGVhcnQgYmVhdCBpcyBmb3IgYSBoaWdoZXIgc2VjdXJpdHkgYW5kIHRvIGtlZXAgdGhlIG90aGVyIGNoZWNrcworICAgICAgICBydW5uaW5nLiBJZiB5b3UganVzdCB3YW50IHRvIHVzZSB0aGUgWHRvb2wgYXMgYSBwYXNzaXZlIHRvb2wgd2l0aG91dAorICAgICAgICBhbnkgY2hlY2tzIHRoZW4gdHVybiB0aGUgaGVhcnQgYmVhdCBvZmYuCisgICAgICAtICJmaXJzdD08b258b2ZmPiIgdHVybnMgdGhlIGF1dG9tYXRpYyBtb3ZpbmcgaW50byB0aGUgcG9sZSBwb3NpdGlvbgorICAgICAgICBvZiB5b3VyIGludmVudG9yeSBvbiBvciBvZmYuIFR1cm5pbmcgaXQgb2ZmLCBhdm9pZHMgc3RydWdnbGUgd2l0aAorICAgICAgICBvdGhlciB0b29scyB3aGljaCBiZWhhdmUgc2FtZSwgYnV0IGFsc28gcmVkdWNlcyBzZWN1cml0eS4gVGhlIGhpc3RvcnkKKyAgICAgICAgbWVjaGFuaXNtIHdpbGwgYWxzbyBjYXB0dXJlIHRoZSBsZXNzIGNvbW1hbmRzLgorICAgICAgLSAicHJvdGVjdD08b258b2ZmPiIgdHVybnMgb24vb2ZmIHRoZSBwcm90ZWN0aW9uIG1vZGUgb2YgdGhlIFh0b29sLgorICAgICAgICBJdCB3aWxsIHByb3RlY3QgeW91IGZyb20gZm9yY2VzIG9mIG90aGVyIHdpemFyZHMgYW5kIG9mIHBsYXllciBvYmplY3RzCisgICAgICAgIHdoaWNoIHRyeSB0byBtb3ZlIGludG8geW91ciBpbnZlbnRvcnkuCisgICAgICAtICJpbnZjaGVjaz08b258b2ZmPiIgdHVybnMgdGhlIGF1dG9tYXRpYyBjaGVjayBvZiB5b3VyIGludmVudG9yeSBvbiBvcgorICAgICAgICBvZmYuIElmIHR1cm5lZCBvbiwgYWxsIG5ldyBvYmplY3RzIGluIHlvdXIgaW52ZW50b3J5IHdpbGwgYmUgcmVwb3J0ZWQuCisgICAgICAtICJlbnZjaGVjaz08b258b2ZmPiIgbGlrZSAiaW52Y2hlY2siIGJ1dCBjaGVja3MgeW91ciBlbnZpcm9ubWVudCwgdGhlCisgICAgICAgIGNvbnRlbnQgb2YgdGhlIGN1cnJlbnQgcm9vbS4KKyAgICAgIC0gIm5kY2hlY2s9PG9ufG9mZj4iIHNldHMgdGhlIG5ldGRlYWRjaGVja2luZyBtb2RlIG9mIHRoZSBYdG9vbC4KKyAgICAgIC0gInNob3J0PTxvbnxvZmY+IiB0dXJucyBkaXNwbGF5aW5nIG9mIHNob3J0IGRlc2NyaXB0aW9ucyBvbiBvciBvZmYuCisgICAgICAgIFRoaXMgaXMgdG8gYXZvaWQgdG8gZ2V0IG9uIG90aGVyIHdpemFyZHMgbmVydmVzLCB3aGVuIHRoZXkgaGF2ZSBhIHRvb2wKKyAgICAgICAgdGhhdCBub3RpZmllcyBpbnZlbnRvcnkgY2hlY2tzIChsaWtlIHRoaXMgdG9vbCBkb2VzIDopLiBCdXQgdGhlIG1haW4KKyAgICAgICAgcmVhc29uIGlzIHRvIGNvcGUgd2l0aCBiYWQgc2hvcnQgZGVzY3JpcHRpb25zIG9mIG9iamVjdHMuIEZvcgorICAgICAgICBleGFtcGxlIGlmIHlvdSB3YW50IHRvIGRlc3RydWN0IGl0IGEgYnVnIGluIHRoZSBzaG9ydCBkZXNjLiB3b3VsZAorICAgICAgICBtYWtlIGl0IG5lYXJseSBpbXBvc3NpYmxlIHRvIGRvIHNvLgorICAgICAgLSAibW9yZT08YW1vdW50PiIgc2V0cyB0aGUgYW1vdW50IG9mIGxpbmVzIHRoYXQgd2lsbCBiZSBkaXNwbGF5ZWQgYXQgb25lCisgICAgICAgIHRpbWUgd2l0aCB0aGUgeG1vcmUgY29tbWFuZC4gV2lsbCBiZSByZW1vdmVkIHNvb24gYmVjYXVzZSB0aGVyZSBpcyBhCisgICAgICAgIHBsYXllciBwcm9wZXJ0eSBjYWxsZWQgUF9QQUdFU0laRSB0byB0YWtlIGNhcmUgb2YgaXQuCisgICAgICAtICJlY2hvPTxvbnxvZmY+IiB0dXJucyB0aGUgZWNob2luZyBvZiBjb21tYW5kcyBleGVjdXRlZCB2aWEgYWxpYXMsCisgICAgICAgIGhpc3Rvcnkgb3IgbXVsdGlwbGUgY29tbWFuZCBleGVjdXRpb24gb24gb3Igb2ZmLgorICAgICAgLSAia2lsbCIgZGVzdHJ1Y3RzIHRoZSBYdG9vbCBhbmQgcmVtb3ZlcyBpdCBmcm9tIHRoZSBhdXRvbG9hZCBsaXN0LgorICAgICAgLSAibmV3cyIgc2hvdyB0aGUgbmV3cyBhbmQgY2hhbmdlcyBvZiB0aGUgWHRvb2wuCisgICAgICAtICJzYXZlIiBzYXZlcyB0aGUgc2V0dGluZ3Mgb2YgdGhlIFh0b29sIGluY2x1ZGluZyB0aGUgYWxpYXNlcyBpbnRvIGEKKyAgICAgICAgZmlsZS4KKyAgICAgIC0gImxvYWQiIHJlc3RvcmVzIHRoZSBzYXZlZCBzZXR0aW5ncyBmcm9tIHRoZSBzYXZlIGZpbGUuCisgICAgICAtICJyZXNldCIgcmVzZXRzIHRoZSBYdG9vbC4KKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94dHJhY2UgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3h0cmFjZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzA1ZTk0Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94dHJhY2UKQEAgLTAsMCArMSwxNCBAQAorU1lOT1BTSVMKKyAgICAgIHh0cmFjZSA8b2JqZWN0PgorCitERVNDUklQVElPTgorICAgICAgVHJhY2UgYWxsIGZ1bmN0aW9uIGNhbGxzIHdpdGggYXJndW1lbnRzIGFuZCB0aGVpciByZXR1cm4gdmFsdWVzIG9mCisgICAgICB0aGUgc3BlY2lmaWVkIG9iamVjdC4gV2l0aG91dCBhbnkgYXJndW1lbnQgdHVybnMgdGhlIHRyYWNpbmcgb2ZmIGFnYWluLgorCitFWEFNUExFCisgICAgICB4dHJhY2UgJG1lLmJ1Z2d5dGhpbmcKKyAgICAgIExldHMgZGVidWcgYW4gYnVnZ3kgb2JqZWN0LgorCisgICAgICB4dHJhY2UKKyAgICAgIFR1cm4gZGVidWdnaW5nIG9mZi4KKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94dHJhbnMgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3h0cmFucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzU2ZDBhCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94dHJhbnMKQEAgLTAsMCArMSw2IEBACitTWU5PUFNJUworICAgICAgeHRyYW5zIDxwbGF5ZXI+CisKK0RFU0NSSVBUSU9OCisgICAgICBUZWxlcG9ydCA8cGxheWVyPiB0byB5b3UuCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvbWFuLmQveHVjbG9uZSBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveHVjbG9uZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDFjODI1Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94dWNsb25lCkBAIC0wLDAgKzEsMTMgQEAKK1NZTk9QU0lTCisgICAgICB4dWNsb25lIDxmaWxlbmFtZT4KKworREVTQ1JJUFRJT04KKyAgICAgIFVwZGF0ZXMgJiBDbG9uZXMgYW4gb2JqZWN0LiBPbiBlcnJvciwgdGhlIGVycm9yIGxvZyBmaWxlIHdpbGwgYmUKKyAgICAgIHByaW50ZWQuIE1vdmVzIHRoZSBvYmplY3QgKGlmIHBvc3NpYmxlKSBpbnRvIHlvdXIgaW52ZW50b3J5LiBJZiB0aGUKKyAgICAgIG9iamVjdCBoYXMgYmVlbiBjbG9uZWQgc3VjY2Vzc2Z1bGx5LCB0aGUgdmFyaWFibGUgIiRjbG9uZSIgd2lsbCBiZSBzZXQsCisgICAgICB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgbG9zZSB0aGUgb2JqZWN0IG91dCBvZiBzaWdodCA6KQorCitFWEFNUExFCisgICAgICB4dWNsb25lIC9zdGQvdGhpbmcKKyAgICAgIHhjYWxsICRjbG9uZS0+U2V0U2hvcnQoImEgQklHIHRoaW5nISIpOworCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3h1cGRhdGUgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3h1cGRhdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FiNjU2NwotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveHVwZGF0ZQpAQCAtMCwwICsxLDEwIEBACitTWU5PUFNJUworICAgICAgeHVwZGF0ZSA8ZmlsZW5hbWU+CisKK0RFU0NSSVBUSU9OCisgICAgIFVwZGF0ZSBhbiBvYmplY3QgYnkgZmlyc3QgY2FsbGluZyB0aGUgbGZ1biAicmVtb3ZlKCkiIG9mIGl0IGFuZCB3aGVuCisgICAgIGl0IHN0aWxsIGV4aXN0cyBkZXN0cnVjdCBpdC4KKworRVhBTVBMRQorICAgICB4dXBkYXRlIG9iai9ibHViLmMKKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94d2MgYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3h3YwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTEzMTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9tYW4uZC94d2MKQEAgLTAsMCArMSwyMiBAQAorU1lOT1BTSVMKKyAgICAgIHh3YyBbLWNsd10gPGZpbGU+CisJICBvcgorCSAgeHdjIFstY2x3XSAgICAod2hlbiByZWFkaW5nIGZyb20gYSBwaXBlKQorCitERVNDUklQVElPTgorICAgICAgeHdjIGNvdW50cyB0aGUgbnVtYmVyIG9mIGJ5dGVzLCB3aGl0ZXNwYWNlLXNlcGFyYXRlZCB3b3JkcywgYW5kIG5ldy0KKyAgICAgIGxpbmVzIGluIGEgZ2l2ZW4gZmlsZSwgb3IgcmVhZGluZyBmcm9tIGEgcGlwZS4gSXQgcHJpbnRzIG9uZSBsaW5lCisgICAgICBvZiBjb3VudHMsIGFuZCBpZiB0aGUgZmlsZSBuYW1lIHdhcyBnaXZlbiBhcyBhbiBhcmd1bWVudCwgaXQgcHJpbnRzCisgICAgICB0aGUgZmlsZW5hbWUgZm9sbG93aW5nIHRoZSBjb3VudHMuIFRoZSBjb3VudHMgYXJlIHByaW50ZWQgaW4gdGhlCisgICAgICBvcmRlcjogbGluZXMsIHdvcmRzLCBieXRlcy4KKyAgICAgIEJ5IGRlZmF1bHQsIHdjIHByaW50cyBhbGwgdGhyZWUgY291bnRzLgorCitPUFRJT05TOgorICAgICAgLWMgcHJpbnQgY2hhcmFjdGVyIGNvdW50CisKKyAgICAgIC1sIHByaW50IGxpbmUgY291bnQKKworICAgICAgLXcgcHJpbnQgd29yZCBjb3VudAorICAgICAgCitFWEFNUExFUworCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL21hbi5kL3h3aG8gYi9vYmovdG9vbHMvTUd0b29sL21hbi5kL3h3aG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU5ZmJkNgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvbWFuLmQveHdobwpAQCAtMCwwICsxLDE3IEBACitTWU5PUFNJUworICAgICAgeHdobyBbbWFpbHxpcHxyYWNlfGd1aWxkfGRvbWFpbnxzdGF0c3xjbWRhdmddCisKK0RFU0NSSVBUSU9OCisgICAgICBXaXRob3V0IGFueSBhcmd1bWVudCB0aGlzIGNvbW1hbmQgYmVoYXZlcyBsaWtlIHRoZSBub3JtYWwgcGVvcGxlCisgICAgICBjb21tYW5kLiBXaXRoIHRoZSBhcmd1bWVudCAibWFpbCIgaXQgd2lsbCBsaXN0IGFsbCBwbGF5ZXJzIHdpdGggdGhlaXIKKyAgICAgIGVtYWlsIGFkZHJlc3MuIFdpdGggdGhlIGFyZ3VtZW50ICJpcCIgaXQgd2lsbCBsaXN0IGFsbCBwbGF5ZXJzIHdpdGgKKyAgICAgIHRoZWlyIGhvc3QgbmFtZSBhbmQgaXAgbnVtYmVyLiBJZiB0aGUgYXJndW1lbnQgaXMgInJhY2UiIG9yICJndWlsZCIKKyAgICAgIHlvdSB3aWxsIGdldCBhIGxpc3Qgb2YgYWxsIHBsYXllcnMgd2l0aCB0aGVzZSBhdHRyaWJ1dGVzLiAiZG9tYWluIgorICAgICAgd2lsbCBzaG93IHRoZSBkb21haW4ocykgb2YgdGhlIGN1cnJlbnQgcGxheWVycy4gQW5kIHdpdGggInN0YXRzIiBpdAorICAgICAgd2lsbCBwcmludCBzb21lIHN0YXRzIGluZm9ybWF0aW9uIG9mIGFsbCBwbGF5ZXJzLgorICAgICAgVGhlIGFyZ3VtZW50ICJjbWRhdmciIGxpc3QgdGhlIHZhbHVlIG9mIF9xdWVyeV9jb21tYW5kX2F2ZXJhZ2UoKQorICAgICAgZm9yIGV2ZXJ5IHVzZXIgc29ydGVkIGluIGluY3JlYXNpbmcgb3JkZXIuCisKK0VYQU1QTEVTCisgICAgICB4d2hvCisgICAgICB4d2hvIGlwCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL3Byb2MvY3B1aW5mbyBiL29iai90b29scy9NR3Rvb2wvcHJvYy9jcHVpbmZvCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjRhZTdkN2UKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL3Byb2MvY3B1aW5mbwpAQCAtMCwwICsxIEBACisvcHJvYy9jcHVpbmZvClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9wcm9jL2xvYWRhdmcgYi9vYmovdG9vbHMvTUd0b29sL3Byb2MvbG9hZGF2ZwpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5lNjk4M2Y0Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9wcm9jL2xvYWRhdmcKQEAgLTAsMCArMSBAQAorL3Byb2MvbG9hZGF2ZwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvcHJvYy9tZW1pbmZvIGIvb2JqL3Rvb2xzL01HdG9vbC9wcm9jL21lbWluZm8KbmV3IGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDAwMDAwMC4uMzM4YjU3MAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvcHJvYy9tZW1pbmZvCkBAIC0wLDAgKzEgQEAKKy9wcm9jL21lbWluZm8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL3Byb2MvdXB0aW1lIGIvb2JqL3Rvb2xzL01HdG9vbC9wcm9jL3VwdGltZQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi4yNzcyYThmCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9wcm9jL3VwdGltZQpAQCAtMCwwICsxIEBACisvcHJvYy91cHRpbWUKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL3Byb2MvdmVyc2lvbiBiL29iai90b29scy9NR3Rvb2wvcHJvYy92ZXJzaW9uCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLmIxN2FmMWUKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvTUd0b29sL3Byb2MvdmVyc2lvbgpAQCAtMCwwICsxIEBACisvcHJvYy92ZXJzaW9uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC9wcm9mLmggYi9vYmovdG9vbHMvTUd0b29sL3Byb2YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWRjZWJmCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC9wcm9mLmgKQEAgLTAsMCArMSw0MiBAQAorcHJpdmF0ZSBtaXhlZCBfX3RtX189KHswLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDB9KTsKK3ByaXZhdGUgbWl4ZWQgX194dG1fXz0oezAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH0pOworcHJpdmF0ZSBtaXhlZCAgX19lY19fPSh7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSk7Citwcml2YXRlIG1peGVkICBfX3hlY19fPSh7MCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfSk7Citwcml2YXRlIGludCBfX2xldmVsX187Citwcml2YXRlIG1hcHBpbmcgX19kYXRhX18gPSAoW10pOworX19xdWVyeV94cHJvZl9kYXRhX18oKSB7IHJldHVybiBfX2RhdGFfXzsgfQorI2RlZmluZSBVMlQocnUpICgoKHJ1KVswXSsocnUpWzFdKSoxMCkKKyNkZWZpbmUgRUMxIDQwCisjZGVmaW5lIEVDMiAyMgorI2RlZmluZSBFQzMgMTUwCisjZGVmaW5lIFRNMSAwCisjZGVmaW5lIFRNMiAwCisjZGVmaW5lIFRNMyAwCisjZGVmaW5lIEYoZnVuYyxuYW1lLGFyZ3MpIGZ1bmMgYXJncyB7IFwKKyAgbWl4ZWQgKl9fZHRfXywgKl9fcnVfXywgX19yZV9fOyBcCisgIGludCBfX3RfXzsgXAorICBpZighX19kYXRhX18pIHJldHVybiA6OiBmdW5jIGFyZ3M7IFwKKyAgX19ydV9fPXJ1c2FnZSgpOyBcCisgIF9fdG1fX1tfX2xldmVsX19dPShfX3RfXz1VMlQoX19ydV9fKSk8MD8wOl9fdF9fOyBcCisgIF9feHRtX19bX19sZXZlbF9fXT1UTTE7IF9fdG1fX1tfX2xldmVsX18rMV09MDsgXAorICBfX2VjX19bX19sZXZlbF9fXT1nZXRfZXZhbF9jb3N0KCk7IFwKKyAgX194ZWNfX1tfX2xldmVsX19dPUVDMTsgX19lY19fW19fbGV2ZWxfXysxXT0wOyBcCisgIF9fbGV2ZWxfXysrOyBfX3JlX18gPSA6OiBmdW5jIGFyZ3M7IF9fbGV2ZWxfXy0tOyBcCisgIGlmKCEoX19kdF9fPV9fZGF0YV9fW25hbWVdKSkgeyBcCisgICAgX19kdF9fPV9fZGF0YV9fW25hbWVdPSh7MCwwLDAsMCwwfSk7IFwKKyAgICBfX3h0bV9fW19fbGV2ZWxfX10rPVRNMjsgX194ZWNfX1tfX2xldmVsX19dKz1FQzI7IFwKKyAgfSBcCisgIF9fZWNfX1tfX2xldmVsX19dLT1nZXRfZXZhbF9jb3N0KCkrX194ZWNfX1tfX2xldmVsX19dOyBcCisgIF9fcnVfXz1ydXNhZ2UoKTsgXAorICBfX3RfXz0oX190X189VTJUKF9fcnVfXykpPDA/MDpfX3RfXzsgXAorICBfX3RtX19bX19sZXZlbF9fXT1fX3RfXy1fX3RtX19bX19sZXZlbF9fXS1fX3h0bV9fW19fbGV2ZWxfX107IFwKKyAgX19kdF9fWzBdKys7IFwKKyAgX19kdF9fWzFdKz1fX2VjX19bX19sZXZlbF9fXS1fX2VjX19bX19sZXZlbF9fKzFdOyBcCisgIF9fZHRfX1syXSs9X190bV9fW19fbGV2ZWxfX10tX190bV9fW19fbGV2ZWxfXysxXTsgXAorICBfX2R0X19bM10rPV9fZWNfX1tfX2xldmVsX19dOyBfX2R0X19bNF0rPV9fdG1fX1tfX2xldmVsX19dOyBcCisgIGlmKF9fbGV2ZWxfXz4wKSB7IFwKKyAgICBfX3hlY19fW19fbGV2ZWxfXy0xXSs9X194ZWNfX1tfX2xldmVsX19dK0VDMzsgXAorICAgIF9feHRtX19bX19sZXZlbF9fLTFdKz1fX3h0bV9fW19fbGV2ZWxfX10rVE0zOyBcCisgIH0gXAorICByZXR1cm4gX19yZV9fOyBcCit9CmRpZmYgLS1naXQgYS9vYmovdG9vbHMvTUd0b29sL3Rvb2wuZG9jIGIvb2JqL3Rvb2xzL01HdG9vbC90b29sLmRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjQ3N2NlCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC90b29sLmRvYwpAQCAtMCwwICsxLDEwMSBAQAorQ09NTUFORFM6CisgICAgeGNhbGwgICAgICB4ZGRlcyAgICAgIHhmb3JhbGwgICAgeGlkcyAgICAgICB4bWFuICAgICAgIHhzY2FuICAgICAgeHRyYWNlCisgICAgeGNhbGxvdXRzICB4ZGVzICAgICAgIHhnb3RvICAgICAgeGluaGVyaXQgICB4bW9yZSAgICAgIHhzZXQgICAgICAgeHRyYW5zCisgICAgeGNsZWFuICAgICB4ZGxvb2sgICAgIHhncmVwICAgICAgeGxhZyAgICAgICB4bW92ZSAgICAgIHhzaCAgICAgICAgeHVjbG9uZQorICAgIHhjbG9uZSAgICAgeGRvICAgICAgICB4aGJlYXRzICAgIHhsb2FkICAgICAgeG1zZyAgICAgICB4c29ydCAgICAgIHh1cGRhdGUKKyAgICB4ZGJnICAgICAgIHhkdXBkYXRlICAgeGhlYWQgICAgICB4bG9vayAgICAgIHhtdHAgICAgICAgeHRhaWwgICAgICB4d2MKKyAgICB4ZGNsZWFuICAgIHhldmFsICAgICAgeGhlbHAgICAgICB4bHBjICAgICAgIHhwcm9wcyAgICAgeHRvb2wgICAgICB4d2hvCisKKworR2l2ZSBhICI/IiBhcyBzaW5nbGUgYXJndW1lbnQgdG8gZ2V0IHRoZSBjb21tYW5kIHVzYWdlIG9yIGRvICJ4bWFuIDxjb21tYW5kPiIKK2ZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IGEgY29tbWFuZC4KKworUVVJQ0tUWVBFUjoKKyAgIFRoZSBNR3Rvb2wgY29udGFpbnMgYSBmdWxsIHF1aWNrdHlwaW5nIHRvb2wuIEl0IHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcKKyAgIGZlYXR1cmVzOgorCisgICAgICAtIG11bHRpcGxlIGNvbW1hbmQgZXhlY3V0aW9uIChzZWUgdGhlIHhkbyBhbmQgeGZvcmFsbCBjb21tYW5kKQorICAgICAgLSBzY3JpcHQgZmlsZXMgICAgICAgICAgICAgICAoc2VlIHRoZSB4c2ggY29tbWFuZCkKKyAgICAgIC0gY29tbWFuZCBwaXBlbGluaW5nCisgICAgICAtIGNvbW1hbmQgaGlzdG9yeQorCisgICBUaGUgY29tbWFuZCBoaXN0b3J5IHN0b3JlcyAobmVhcmx5KSBlYWNoIGNvbW1hbmQgeW91IHR5cGUgaW4gYW5kIGxldHMgeW91CisgICByZS1leGVjdXRlIGl0LgorCisgICAgICAtICUhICAgICAgICBzaG93IHRoZSBjb21tYW5kIGhpc3RvcnkKKyAgICAgIC0gJSUgICAgICAgIHJlLWV4ZWN1dGUgdGhlIGxhc3QgY29tbWFuZAorICAgICAgLSBeb2xkXm5ldyAgcmUtZXhlY3V0ZSB0aGUgbGFzdCBjb21tYW5kIGJ1dCByZXBsYWNlIGFsbCBvY2N1cmVuY2llcyBvZgorICAgICAgICAgICAgICAgICAgdGhlICJvbGQiIHN0cmluZyBvZiB0aGUgY29tbWFuZCBieSAibmV3Ii4KKyAgICAgIC0gJW51bSAgICAgIHJlLWV4ZWN1dGUgdGhlIGNvbW1hbmQgYXQgcG9zaXRpb24gbnVtIG9mIHRoZSBoaXN0b3J5CisgICAgICAtICVzdHIgICAgICByZS1leGVjdXRlIHRoZSBsYXN0IGNvbW1hbmQgYmVnaW5uaW5nIHdpdGggdGhlIHN0cmluZyAic3RyIgorCisKK0NPTU1BTkQgQVJHVU1FTlRTOgorICAgTW9zdCBjb21tYW5kcyBuZWVkIGZpbGVuYW1lcyBvciBvYmplY3RzIGFzIGFyZ3VtZW50LiBUaGUgd2F5IG9iamVjdHMgYXJlCisgICBzcGVjaWZpZWQgd2lsbCBiZSBkZXNjcmlwZWQgaW4gdGhlIGZvbGxvd2luZy4KKworICAgICAgLSBhbiBvYmplY3QgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5IGJ5IGl0cyB1bmlxdWUgb2JqZWN0IG5hbWUKKyAgICAgIC0gYSBwbGF5ZXIgY2FuIGJlIGFjY2Vzc2VkIGJ5IGl0cyBwbGF5ZXIgbmFtZQorICAgICAgLSBhIGxpdmluZyBjYW4gYmUgYWNjZXNzZWQgYnkgaXRzIGxpdmluZyBuYW1lCisgICAgICAtIGEgb2JqZWN0IGluc2lkZSB0aGUgY3VycmVudCByb29tIGJ5IGl0cyBpZAorICAgICAgLSBhIG9iamVjdCBpbnNpZGUgdGhlIGN1cnJlbnQgcm9vbSBieSBpdHMgcG9zaXRpb24KKworICAgSWYgdGhlIG9iamVjdCBjYW4gbm90IGJlIGFjY2Vzc2VkIGJ5IHRoZSBhYm92ZSBtZW50aW9uZWQgd2F5cyB5b3UgY2FuIGFsc28KKyAgIHVzZSB0aGUgZm9sbG93aW5nIG9iamVjdCBtb2RpZmllcnM6CisKKyAgICAgIF5vYmogICAgICAgICBzdGFuZHMgZm9yIHRoZSBlbnZpcm9ubWVudCBvZiBhbiBvYmplY3QKKyAgICAgIG9iajEub2JqMiAgICBzdGFuZHMgZm9yIGFuIG9iamVjdCBvYmoyIGluc2lkZSBhbm90aGVyIG9iamVjdCBvYmoxCisgICAgICAKKyAgVGhlc2UgbW9kaWZpZXJzIGNhbiBiZSBjb25jYXRlbmF0ZWQgdG9nZXRoZXIgd2hlcmUgdGhlICJeIiBoYXMgYSBoaWdoZXIKKyAgcHJpb3JpdHkgdGhhbiB0aGUgIi4iLiBUaGlzIGFsbG93cyB5b3UgdG8gYWNjZXNzIGFuIG9iamVjdCBmcm9tIGFub3RoZXIga25vdworICBvYmplY3QuCisKKyAgTm93IHNvbWUgZXhhbXBsZXMgd2hpY2ggZGVtb25zdHJhdGVzIGhvdyB0byB1c2UgdGhpcyBhY2Nlc3NpbmcgbWVjaGFuaXNtLgorICBUaGVyZWZvcmUgd2UgdXNlIHRoZSBjb21tYW5kICJ4bG9vayIgd2hpY2ggcHJpbnRzIHRoZSBzaG9ydCBhbmQgbG9uZworICBkZXNjcmlwdGlvbiBhbmQgYWxzbyB0aGUgY29udGVudCBvZiBhbiBvYmplY3Q6CisKKyAgIDEuIHhsb29rIGRlZXB0aG91Z2h0CisgICAgICBMb29rIGF0IERlZXB0aG91Z2h0LgorICAgMi4geGxvb2sgXmRlZXB0aG91Z2h0CisgICAgICBMb29rIGF0IHRoZSByb29tIERlZXB0aG91Z2h0IGlzIGluLgorICAgMy4geGxvb2sgZGVlcHRob3VnaHQuYmFnCisgICAgICBMb29rIGF0IHRoZSBiYWcgb2YgRGVlcHRob3VnaHQuCisgICA0LiB4bG9vayBkZWVwdGhvdWdodC5iYWcuYmFnCisgICAgICBMb29rIGF0IHRoZSBiYWcgaW5zaWRlIERlZXBzIGJhZy4KKyAgIDQuIHhsb29rIGRlZXB0aG91Z2h0LjUKKyAgICAgIExvb2sgYXQgdGhlIGZpZnRoIG9iamVjdCBvZiBEZWVwcyBpbnZlbnRvcnkuCisgICA1LiB4bG9vayAvc3RkL3RoaW5nIzEyMworICAgICAgTG9vayBhdCB0aGUgb2JqZWN0IHdpdGggdGhlIHVuaXF1ZSBvYmplY3QgbmFtZSAiL3N0ZC90aGluZyMxMjMiLgorICAgNi4geGxvb2sgMQorICAgICAgTG9vayBhdCB0aGUgZmlyc3Qgb2JqZWN0IGluIHRoZSBjdXJyZW50IHJvb20uCisgICA3LiB4bG9vayAxLjIuMworICAgICAgTG9vayBhdCB0aGUgdGhpcmQgb2YgdGhlIHNlY29uZCBvZiB0aGUgZmlyc3Qgb2JqZWN0IGluIHRoZSByb29tLgorCisgIElmIHRoZSBuYW1lIG9mIGFuIG9iamVjdCBjb250YWlucyBhbiBvYmplY3QgbW9kaWZpZXIgYXMgYSBjaGFyYWN0ZXIgdGhlbiBpdAorICBjYW4gYmUgZXNjYXBlZCBieSBhICJcIi4gQSAiXCIgaXMgZXNjYXBlZCBieSBpdHNlbGYuIFRoaXMgaXMgYmVjYXVzZSBmaWxlCisgIG5hbWVzIG9mdGVuIGNvbnRhaW4gdGhlICIuIiBmb3IgZmlsZSBleHRlbnNpb25zLiBTbyBpZiB5b3Ugd2FudCB0byBhY2Nlc3MKKyAgZGlyZWN0bHkgYW4gb2JqZWN0IHdpdGggZm9yIGV4YW1wbGUgc3VjaCBhIG5hbWUgImZpbGUub2xkLmJ1bGIiIHlvdSBoYXZlIHRvCisgIHdyaXRlICJmaWxlXC5vbGRcLmJsdWIiLgorICAgIAorICBJZiBhIGNvbW1hbmQgbmVlZHMgYSBmaWxlIGFzIGFyZ3VtZW50IHlvdSBjYW4gdXNlIHRoZSBmaWxlbmFtZSBvZiBhbiBvYmplY3QKKyAgZm9yIGl0IGJ5IHBsYWNpbmcgYW4gIkAiIGluZnJvbnQgb2YgdGhlIG9iamVjdC4gVGhpcyB3YXkgeW91IGNhbiBjbG9uZQorICBhbiBvYmplY3QgYnkgdXNpbmcgYW5vdGhlciBjbG9uZToKKworICAgICB4Y2xvbmUgQGhhcnJ5LmJhZy5jYW5kbGVzCisgICAgIENsb25lIHNvbWUgY2FuZGxlcyBvZiB0aGUga2luZCBIYXJyeSBpcyBjYXJyeWluZyBpbiBoaXMgYmFnLgorCisKK0FSR1VNRU5UIFZBUklBQkxFUzoKKyAgIFdoZW5ldmVyIGFuIG9iamVjdCBvciBhIGZpbGVuYW1lIGlzIG5lZWRlZCwgd2UgY2FuIHVzZSB2YXJpYWJsZXMuCisgICBBIHZhcmlhYmxlIGFsbHdheXMgc3RhcnRzIHdpdGggYSAiJCIgZm9sbG93ZWQgYnkgdGhlIG5hbWUgd2hpY2gKKyAgIGlkZW50aWZpY2F0ZXMgaXQuIFR3byB2YXJpYWJsZSBuYW1lcyBhcmUgcmVzZXJ2ZWQgZm9yIHNwZWNpYWwgcHVycG9zZS4KKyAgIFRoZSBmaXJzdCwgIiRtZSIgaXMgYWx3YXlzIHNldCB0byB0aGUgb25lIHdobyBvd25zIHRoZSBYdG9vbC4gVGhlIG90aGVyLAorICAgIiRoZXJlIiByZXByZXNlbnRzIHRoZSBjdXJyZW50IHJvb20uCisKKyAgIChJbnN0ZWFkIG9mICIkbWUiIGFuZCAiJGhlcmUiIHlvdSBjYW4gYWxzbyB1c2UgIiRtIiBhbmQgIiRoIi4pCisKKyAgIElmIGEgY29tbWFuZCBuZWVkcyBhIGZpbGUgYXMgYXJndW1lbnQgYW5kIGdldHMgYSB2YXJpYWJsZSBpdCB3aWxsIGJlCisgICBhdXRvbWF0aWNhbGx5IGNvbnZlcnRlZCBpbnRvIHRoZSBzb3VyY2UgZmlsZSBvZiB0aGUgb2JqZWN0LgorICAgKFRoaXMgaXMgZG9uZSBieSB0YWtpbmcgdGhlIHVuaXF1ZSBvYmplY3QgaWRlbnRpZmllciBhbmQgcmVwbGFjaW5nIHRoZQorICAgIiMuLi4iIGJ5IGEgIi5jIi4pCisKZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvdG9vbC5oIGIvb2JqL3Rvb2xzL01HdG9vbC90b29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVmZjIzZAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvdG9vbC5oCkBAIC0wLDAgKzEsMjQ2IEBACisjaWZuZGVmIF9fVE9PTF9IX18KKyNkZWZpbmUgX19UT09MX0hfXworCisvKgorICogTUd0b29sLTEuMworICogRmlsZTogdG9vbC5oCisgKiBNYWludGFpbmVyOiBLaXJrQE1vcmdlbkdyYXVlbgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIHRoZSBvcmlnaW5hbCBYdG9vbCBpcyBjb3B5cmlnaHRlZCBieSBIeXAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2lmbmRlZiBNQVNURVIKKyNkZWZpbmUgTUFTVEVSIF9fTUFTVEVSX09CSkVDVF9fCisjZW5kaWYKKworI2RlZmluZSBWT0lEICIvcm9vbS92b2lkIgorCisjZGVmaW5lIE5VTEwgICAgICAgICAgICAgICAoMCkKKyNkZWZpbmUgRkFMU0UgICAgICAgICAgICAgICgwKQorI2RlZmluZSBUUlVFICAgICAgICAgICAgICAgKDEpCisjZGVmaW5lIEVSUk9SICAgICAgICAgICAgICAoLTEpCisjZGVmaW5lIFBSRVYgICAgICAgICAgICAgICBwcmV2aW91c19vYmplY3QoKQorI2RlZmluZSBUUCAgICAgICAgICAgICAgICAgZWZ1bjo6dGhpc19wbGF5ZXIoKQorI2RlZmluZSBSVFAgICAgICAgICAgICAgICAgZWZ1bjo6dGhpc19pbnRlcmFjdGl2ZSgpCisjZGVmaW5lIFRPT0xfTkFNRSAgICAgICAgICAiTUd0b29sIgorI2RlZmluZSBUT09MX1ZFUlNJT04gICAgICAgIjEuMy4zIgorI2RlZmluZSBUT09MX1RJVExFICAgICAgICAgVE9PTF9OQU1FKyIgdiIrVE9PTF9WRVJTSU9OCisjZGVmaW5lIFRPT0xfSU5URVJOQUwgICAgICAiMS4zLjMtMTAuMDcuOTciCisKKyNkZWZpbmUgVE9PTF9QQVRIICAgICAgICAgICIvb2JqL3Rvb2xzL01HdG9vbCIKKworI2RlZmluZSBUT09MX01BTlBBR0UgICAgICAgVE9PTF9QQVRIKyIvdG9vbC5kb2MiCisjZGVmaW5lIFRPT0xfTkVXUyAgICAgICAgICBUT09MX1BBVEgrIi90b29sLm5ld3MiCisjZGVmaW5lIFRPT0xfTE9HICAgICAgICAgICAiL2xvZy94dG9vbCIKKyNkZWZpbmUgWFBST0ZfTUFDUk8gICAgICAgIFRPT0xfUEFUSCsiL3Byb2YuaCIKKyNkZWZpbmUgTEFHX09fREFFTU9OICAgICAgICIvcC9kYWVtb24vbGFnLW8tZGFlbW9uIgorCisjZGVmaW5lIFRPT0xfTEVWRUwgICAgICAgICAoNDApCisKKyNkZWZpbmUgTU9SRV9MSU5FUyAgICAgICAgICgyMCkKKyNkZWZpbmUgTUFYX0hJU1RPUlkgICAgICAgICgyNSkKKyNkZWZpbmUgTUFYX1JFQ1VSU0lPTiAgICAgICg2KQorI2RlZmluZSBUUkFDRV9MRVZFTCAgICAgICAgKDF8Mnw0fDgpCisjZGVmaW5lIEFVVE9MT0FEX0FSR1MgICAgICAoe1RPT0xfSU5URVJOQUwsIG1vZGksIG1vcmVsaW5lc30pCisjZGVmaW5lIEVYRUNfTElORVMgICAgICAgICAoMTApCisjZGVmaW5lIEVYRUNfVElNRSAgICAgICAgICAoMSkKKworI2RlZmluZSBJQSh4KSAgICAgICAgICAgICAgaW50ZXJhY3RpdmUoeCkKKyNkZWZpbmUgRU5WKHgpICAgICAgICAgICAgIGVudmlyb25tZW50KHgpCisjZGVmaW5lIExPV0VSKHgpICAgICAgICAgICBsb3dlcl9jYXNlKHgpCisjZGVmaW5lIE5BTUUoeCkgICAgICAgICAgICAoKHN0cmluZyl4LT5xdWVyeV9uYW1lKCkpCisjZGVmaW5lIENOQU1FKHgpICAgICAgICAgICBDQVAoKHN0cmluZylOQU1FKHgpKQorCisjZGVmaW5lIFJOQU1FKHgpICAgICAgICAgICBnZXR1aWQoeCkKKyNkZWZpbmUgQ1JOQU1FKHgpICAgICAgICAgIENBUChSTkFNRSh4KSkKKworI2RlZmluZSBMRVZFTCh4KSAgICAgICAgICAgcXVlcnlfd2l6X2xldmVsKHgpCisKKyNkZWZpbmUgRk9SQUxMKHgsIHkpICAgICAgIGZvcih4PWZpcnN0X2ludmVudG9yeSh5KTt4O3g9bmV4dF9pbnZlbnRvcnkoeCkpCisjZGVmaW5lIERFU1RSVUNUKHgpICAgICAgICBEZXN0cnVjdCh4KQorI2RlZmluZSBBTEVGVCh4LHkseikgICAgICAgc3ByaW50ZigiJS0qJyIreisiJ3MiLCB5LCAoIiIrKHgpKVswLi55LTFdKQorI2RlZmluZSBBUklHSFQoeCx5LHopICAgICAgc3ByaW50ZigiJSonIit6KyIncyIgLCB5LCAoIiIrKHgpKVswLi55LTFdKQorI2RlZmluZSBXKHgpICAgICAgICAgICAgICAgV3JpdGUoeCkKKyNkZWZpbmUgV0xOKHgpICAgICAgICAgICAgIFcoeCsiXG4iKQorI2RlZmluZSBXRExOKHgpICAgICAgICAgICAgVyh4KyIuXG4iKQorCisjZGVmaW5lIE1PREVfT04oeCkgICAgICAgICAobW9kaXw9eCkKKyNkZWZpbmUgTU9ERV9PRkYoeCkgICAgICAgIChtb2RpJj1+eCkKKyNkZWZpbmUgTU9ERSh4KSAgICAgICAgICAgIChtb2RpJngpCisjZGVmaW5lIE1PREVfSEVBUlQgICAgICAgICAoMSkKKyNkZWZpbmUgTU9ERV9GSVJTVCAgICAgICAgICgyKQorI2RlZmluZSBNT0RFX1BST1RFQ1QgICAgICAgKDQpCisjZGVmaW5lIE1PREVfSU5WQ0hFQ0sgICAgICAoOCkKKyNkZWZpbmUgTU9ERV9FTlZDSEVDSyAgICAgICgxNikKKyNkZWZpbmUgTU9ERV9ORENIRUNLICAgICAgICgzMikKKyNkZWZpbmUgTU9ERV9WQVJDSEVDSyAgICAgICg2NCkKKyNkZWZpbmUgTU9ERV9FQ0hPICAgICAgICAgICgxMjgpCisjZGVmaW5lIE1PREVfU0hPUlQgICAgICAgICAoMjU2KQorI2RlZmluZSBNT0RFX1NOT09QQ0hLICAgICAgKDUxMikKKyNkZWZpbmUgTU9ERV9JTlZJU0NISyAgICAgICgxMDI0KQorI2RlZmluZSBNT0RFX1NDQU5DSEsgICAgICAgKDIwNDgpCisKKyNkZWZpbmUgRVJSX0ZJTEUgICAgICAgICAgICIvcGxheWVycy8iK1JOQU1FKGNsb25lcikrIi8uZXJyIgorI2RlZmluZSBMUENfRklMRSAgICAgICAgICAgIi9wbGF5ZXJzLyIrUk5BTUUoY2xvbmVyKSsiLy50b29sLmxwYyIKKyNkZWZpbmUgVE1QX0ZJTEUgICAgICAgICAgICIvcGxheWVycy8iK1JOQU1FKGNsb25lcikrIi8udG9vbC50bXAiCisjZGVmaW5lIFNBVkVfRklMRSAgICAgICAgICAiL3BsYXllcnMvIitSTkFNRShjbG9uZXIpKyIvLnRvb2xyYyIKKyNkZWZpbmUgWFBST0ZfRklMRSAgICAgICAgICIvcGxheWVycy8iK1JOQU1FKGNsb25lcikrIi9wcm9mLmMiCisjZGVmaW5lIFBJUEVfRklMRSAgICAgICAgICAiL3BsYXllcnMvIitSTkFNRShjbG9uZXIpKyIvLnRvb2wucGlwZSIKKyNkZWZpbmUgUFJJVkFURV9IRUFERVIgICAgICIvcGxheWVycy8iK1JOQU1FKGNsb25lcikrIi8ueHRvb2wuaCIKKyNkZWZpbmUgUElQRV9ERUxFVEUoeCkgICAgIGlmKHBpcGVfb3V0JiZwaXBlX292ciYmZmlsZV9zaXplKHgpPj0wKSBybSh4KQorCisjZGVmaW5lIFBJUEVfSU4gICAgICAgICAgICAxCisjZGVmaW5lIFBJUEVfT1VUICAgICAgICAgICAyCisjZGVmaW5lIFBJUEVfTUFYICAgICAgICAgICAxMDAwMAorCisjZGVmaW5lIFhHUkVQX1JFVkVSVCAgICAgICAxCisjZGVmaW5lIFhHUkVQX0lDQVNFICAgICAgICAyCisKKyNkZWZpbmUgU0VDVVJFMSgpICAgIGlmKCFzZWN1cml0eSgpKSByZXR1cm47CisjZGVmaW5lIFNFQ1VSRTIoeCkgICBpZighc2VjdXJpdHkoKSkgcmV0dXJuIHg7CisjZGVmaW5lIFVTQUdFMSh4LHkpICBub3RpZnlfZmFpbCgiVXNhZ2U6ICIrKHkpKyJcbiIpO1wKKyAgICAgICAgICAgICAgICAgICAgIGlmKCh4KT09Ij8iKSByZXR1cm4gRkFMU0U7CisjZGVmaW5lIFVTQUdFMih4LHkpICBub3RpZnlfZmFpbCgiVXNhZ2U6ICIrKHkpKyJcbiIpO1wKKyAgICAgICAgICAgICAgICAgICAgIGlmKCghKHgpKXx8KCh4KT09Ij8iKSkgcmV0dXJuIEZBTFNFOworI2RlZmluZSBVU0FHRTMoeCkgICAgcmV0dXJuIFdMTigiVXNhZ2U6ICIrKHgpKQorCitzdGF0aWMgaW50IENhdEZpbGUoKTsKK3N0YXRpYyBpbnQgQ29tbWFuZChzdHJpbmcgc3RyKTsKK2ludCBDb21tYW5kU2NhbihzdHJpbmcgYXJnKTsKK2ludCBEb0FsaWFzKHN0cmluZyB2ZXJiLCBzdHJpbmcgYXJnKTsKK2ludCBEb0hpc3Rvcnkoc3RyaW5nIGxpbmUpOworc3RhdGljIGludCBNb3ZlT2JqKG9iamVjdCBvYmoxLCBvYmplY3Qgb2JqMiwgaW50IHNpbGVudCk7CitzdGF0aWMgaW50IFhHcmVwRmlsZShzdHJpbmcgcGF0LCBzdHJpbmcgZmlsZSwgaW50IHJldmVydCk7CitpbnQgWGNhbGwoc3RyaW5nIHN0cik7CitpbnQgWGNhbGxvdXRzKHN0cmluZyBzdHIpOworaW50IFhjYXQoc3RyaW5nIHN0cik7CitpbnQgWGNpbmRlbnQoc3RyaW5nIHN0cik7CitpbnQgWGNsZWFuKHN0cmluZyBzdHIpOworaW50IFhjbG9uZShzdHJpbmcgc3RyKTsKK2ludCBYdWNsb25lKHN0cmluZyBzdHIpOworaW50IFhjbWRzKHN0cmluZyBzdHIpOworaW50IFhkYXRlKHN0cmluZyBzdHIpOworaW50IFhkYmcoc3RyaW5nIHN0cik7CitpbnQgWGRjbGVhbihzdHJpbmcgc3RyKTsKK2ludCBYZGRlcyhzdHJpbmcgc3RyKTsKK2ludCBYZGVzKHN0cmluZyBzdHIpOworaW50IFhkbG9vayhzdHJpbmcgc3RyKTsKK2ludCBYZG8oc3RyaW5nIHN0cik7CitpbnQgWGR1cGRhdGUoc3RyaW5nIHN0cik7CitpbnQgWGVjaG8oc3RyaW5nIHN0cik7CitpbnQgWGV2YWwoc3RyaW5nIHN0cik7CitpbnQgWGZvcmFsbChzdHJpbmcgc3RyKTsKK2ludCBYZ290byhzdHJpbmcgc3RyKTsKK2ludCBYZ3JlcChzdHJpbmcgc3RyKTsKK2ludCBYaGJlYXRzKHN0cmluZyBzdHIpOworaW50IFhoZWFkKHN0cmluZyBzdHIpOworaW50IFhoZWxwKHN0cmluZyBzdHIpOworaW50IFhpZHMoc3RyaW5nIHN0cik7CitpbnQgWGluZm8oc3RyaW5nIHN0cik7CitpbnQgWGluaGVyaXQoc3RyaW5nIHN0cik7CitpbnQgWGludmVudG9yeShzdHJpbmcgc3RyKTsKK2ludCBYbGFnKHN0cmluZyBzdHIpOworaW50IFhsaWdodChzdHJpbmcgc3RyKTsKK2ludCBYbG9hZChzdHJpbmcgc3RyKTsKK2ludCBYbG9vayhzdHJpbmcgc3RyKTsKK2ludCBYbHBjKHN0cmluZyBzdHIpOworaW50IFhtYW4oc3RyaW5nIHN0cik7CitpbnQgWG1vcmUoc3RyaW5nIHN0cik7CitpbnQgWG1vdmUoc3RyaW5nIHN0cik7CitpbnQgWG1zZyhzdHJpbmcgc3RyKTsKK2ludCBYbXRwKHN0cmluZyBzdHIpOworaW50IFhwcm9jKHN0cmluZyBzdHIpOworaW50IFhwcm9wcyhzdHJpbmcgc3RyKTsKK2ludCBYcHJvZihzdHJpbmcgc3RyKTsKK2ludCBYcXVpdChzdHJpbmcgc3RyKTsKK2ludCBYc2NhbihzdHJpbmcgc3RyKTsKK2ludCBYc2V0KHN0cmluZyBzdHIpOworaW50IFhzaChzdHJpbmcgc3RyKTsKK2ludCBYc29ydChzdHJpbmcgc3RyKTsKK2ludCBYc3RvcChzdHJpbmcgc3RyKTsKK2ludCBYdG9vbChzdHJpbmcgc3RyKTsKK2ludCBYdHJhY2Uoc3RyaW5nIHN0cik7CitpbnQgWHRyYW5zKHN0cmluZyBzdHIpOworaW50IFh1cGRhdGUoc3RyaW5nIHN0cik7CitpbnQgWHdjKHN0cmluZyBzdHIpOworaW50IFh3aG8oc3RyaW5nIG9wdCk7CitzdGF0aWMgc3RyaW5nIGNybmFtZShvYmplY3Qgd2hvKTsKK2ludCBpZChzdHJpbmcgc3RyKTsKK2ludCBtb3ZlKG1peGVkIGRlc3QpOworc3RhdGljIGludCBzZWN1cml0eSgpOworaW50IHdyaXRlX25ld2ludm9iaihvYmplY3Qgd2hvKTsKK2ludCB3cml0ZV9uZXdlbnZvYmoob2JqZWN0IHdobyk7CitpbnQgd3JpdGVfbmV0ZGVhZChvYmplY3Qgd2hvKTsKK2ludCB3cml0ZV9hbGl2ZShvYmplY3Qgd2hvKTsKK2ludCB3cml0ZV9zbm9vcGVlKG9iamVjdCB3aG8pOworaW50IHdyaXRlX25vc25vb3Aob2JqZWN0IHdobyk7CitpbnQgd3JpdGVfaW52aXNvYmoob2JqZWN0IHdobyk7CitpbnQgd3JpdGVfaW52aXNsdmcob2JqZWN0IHdobyk7CitpbnQgd3JpdGVfaW52aXNwbHkob2JqZWN0IHdobyk7CitpbnQgd3JpdGVfdmlzaWJvYmoob2JqZWN0IHdobyk7CitpbnQgd3JpdGVfdmlzaWJsdmcob2JqZWN0IHdobyk7CitpbnQgd3JpdGVfdmlzaWJwbHkob2JqZWN0IHdobyk7CitzdGF0aWMgb2JqZWN0ICpTdWJOb2RlcyhvYmplY3Qgb2JqKTsKK3N0YXRpYyB2YXJhcmdzIG9iamVjdCBGaW5kT2JqKHN0cmluZyBzdHIsIG9iamVjdCBlbnYsIGludCBzaWxlbnQpOworc3RhdGljIG9iamVjdCBWYXJUb09iaihzdHJpbmcgc3RyKTsKK3N0YXRpYyB2YXJhcmdzIG9iamVjdCBYRmluZE9iaihzdHJpbmcgc3RyLCBpbnQgc2lsZW50KTsKK3N0YXRpYyBzdHJpbmcgT2JqRmlsZShvYmplY3Qgb2JqKTsKK3N0YXRpYyBzdHJpbmcgUGxheWVyQWdlKG9iamVjdCBvYmopOworc3RhdGljIHN0cmluZyBQbGF5ZXJEb21haW4ob2JqZWN0IG9iaiwgaW50IGZsYWcpOworc3RhdGljIHN0cmluZyBQbGF5ZXJJUChvYmplY3Qgb2JqLCBpbnQgZmxhZyk7CitzdGF0aWMgc3RyaW5nIFBsYXllcklkbGUob2JqZWN0IG9iaik7CitzdGF0aWMgc3RyaW5nIFBsYXllck1haWwob2JqZWN0IG9iaiwgaW50IGZsYWcpOworc3RhdGljIHN0cmluZyBQbGF5ZXJSYWNlKG9iamVjdCBvYmosIGludCBmbGFnKTsKK3N0YXRpYyBzdHJpbmcgUGxheWVyU25vb3Aob2JqZWN0IG9iaiwgaW50IGZsYWcpOworc3RhdGljIHN0cmluZyBQbGF5ZXJTdGF0cyhvYmplY3Qgb2JqLCBpbnQgZmxhZyk7CitzdGF0aWMgc3RyaW5nIFBsYXllcldobyhvYmplY3Qgb2JqKTsKK3N0YXRpYyBzdHJpbmcgVmFyVG9GaWxlKHN0cmluZyBzdHIpOworc3RhdGljIHN0cmluZyBWYXJUb1B1cmVGaWxlKHN0cmluZyBzdHIpOworc3RhdGljIHN0cmluZyBYRmlsZShzdHJpbmcgZmlsZSk7CitzdGF0aWMgc3RyaW5nIFhGaW5kRmlsZShzdHJpbmcgZmlsZSk7CitzdGF0aWMgdmFyYXJncyB2b2lkIERlZXBQcmludFNob3J0KG9iamVjdCBlbnYsIGludCBpbmRlbnQsIHN0cmluZyBwcmUsIHN0cmluZyBmaWxlKTsKK3N0YXRpYyB2b2lkIERlc3RydWN0KG9iamVjdCBvYmopOworc3RhdGljIHZvaWQgRHVtcFByb3BlcnRpZXMob2JqZWN0IG9iaiwgaW50IGZsYWcpOworc3RhdGljIHZvaWQgSW5oZXJpdGFuY2Uob2JqZWN0IG9iaiwgc3RyaW5nIGZ1bmMsIHN0cmluZyBwcmUpOwordm9pZCBJbnZpc0NoZWNrKCk7CitzdGF0aWMgdm9pZCBNb3JlRmlsZShzdHJpbmcgc3RyKTsKK3ZvaWQgTmV0RGVhZENoZWNrKGludCBzaG93KTsKK3N0YXRpYyB2b2lkIFByaW50T2JqKG9iamVjdCBvYmosIHN0cmluZyBmaWxlKTsKK3N0YXRpYyB2YXJhcmdzIHZvaWQgUHJpbnRTaG9ydChzdHJpbmcgcHJlLCBvYmplY3Qgb2JqLCBzdHJpbmcgZmlsZSk7Cit2b2lkIFNub29wQ2hlY2soKTsKK3N0YXRpYyB2b2lkIFZhckNoZWNrKGludCBzaG93KTsKK3N0YXRpYyBpbnQgIFdyaXRlKHN0cmluZyBzdHIpOworc3RhdGljIHZvaWQgWEV4ZWNGaWxlKGludCBsaW5lKTsKK3N0YXRpYyB2b2lkIFhNb3JlRmlsZShzdHJpbmcgZmlsZSwgaW50IGZsYWcpOworc3RhdGljIHZvaWQgWE1zZ1NheShzdHJpbmcgc3RyKTsKK3N0YXRpYyB2b2lkIFhNc2dTaG91dChzdHJpbmcgc3RyKTsKK3N0YXRpYyB2b2lkIFhNc2dUZWxsKHN0cmluZyBzdHIpOworc3RhdGljIHZvaWQgWG10cFNjcmlwdChzdHJpbmcgZGlyLCBzdHJpbmcgZmlsZSwgc3RyaW5nIG9wdCk7Cit2b2lkIGFjdGlvbnMoKTsKK3ZvaWQgaW5pdCgpOwordm9pZCB1cGRhdGVfdG9vbChtaXhlZCAqYXJncywgb2JqZWN0IG9iaik7CitzdHJpbmcgX3F1ZXJ5X2xvbmcoKTsKK3N0cmluZyBfcXVlcnlfc2hvcnQoKTsKKworc3RhdGljIGludCBDYWxsRnVuYyhzdHJpbmcgdmVyYiwgc3RyaW5nIHN0cik7CitzdGF0aWMgc3RyaW5nIEdldEZ1bmMoc3RyaW5nIHZlcmIsIGludCB0ZXN0KTsKKworc3RhdGljIHN0cmluZyBQcmVwYXJlTGluZShzdHJpbmcgc3RyKTsKK3N0YXRpYyBzdHJpbmcgUXVvdGVMaW5lKHN0cmluZyBzdHIpOworc3RhdGljIHN0cmluZyBVbnF1b3RlTGluZShzdHJpbmcgc3RyKTsKK2ludCBRdW90ZU9rKHN0cmluZyBzdHIpOworc3RhdGljIHN0cmluZyAqRXhwbG9kZUNtZHMoc3RyaW5nIHN0cik7CisKK3N0cmluZyByZWFkX2J1ZmZlcihzdHJpbmcgZmlsZW5hbWUsIGludCBzdGFydCwgaW50IG51bWJlcik7CitzdHJpbmcgbG9hZF9idWZmZXIoaW50IGxpbmUpOworaW50IHJlYWRfbGluZShpbnQgb2Zmc2V0KTsKKworLyoKKyAqIGRlYnVnIHN0dWZmCisgKi8KK3ZvaWQgVEsoc3RyaW5nIHN0cik7CitpbnQgWHRrKHN0cmluZyBzdHIpOworCisjZW5kaWYgLyogX19UT09MX0hfXyAqLwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC90b29sLm5ld3MgYi9vYmovdG9vbHMvTUd0b29sL3Rvb2wubmV3cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmFkYmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC90b29sLm5ld3MKQEAgLTAsMCArMSwxNDMgQEAKK1sxMC4wNy45N10KKworLSBmaXhlZCBtaW5vciBidWcgaW4gY29tbWFuZCBsb29rdXA6CisgICd4ZG9zb21ldGhpbmdvcnNvbWV0aGluZ2Vsc2UnIHdhcyBwcmV2aW91c2x5IGV4ZWN1dGVkIGFzICd4ZG8nCisgIFRoaXMgaXMgdHJlYXRlZCBhcyBhbiB1bmtub3duIGNvbW1hbmQgbm93LiBBbnl3YXkgY29tbWFuZHMgbWF5IGJlCisgIGFiYnJldmlhdGVkIGFzIGxvbmcgYXMgdGhleSBhcmUgbm90IGFtYmlndW91cy4KKworWzEyLjAzLjk3XQorCistIHhscGMgaW5jbHVkZXMgc29tZSBtb3JlIHN0ZC1pbmNsdWRlLWZpbGVzIGFuZCAueHRvb2wuaCAoaWYgcHJlc2VudCkKKworWzA0LjAzLjk3XQorCistIG5ldyBjb21tYW5kOiB4cHJvYworICBkaXNwbGF5IHNvbWUgaW5mb3JtYXRpb24gZnJvbSB0aGUgL3Byb2MgZmlsZXN5c3RlbSBpbiBhIHZlcnkgcmF3IGZhc2hpb24uCisKK1swOC4wNS45Nl0KKworLSBYbW9yZS9YdGFpbDogbW9kaWZpZWQgTW9yZUZpbGUvQ2F0RmlsZSB1c2luZyBuZXcgcmVhZF9idWZmZXIoKSBpbnN0ZWFkIG9mCisgIHJlYWRfZmlsZSgpIGZ1bmN0aW9uIHdoaWNoIGlzIFZFUlkgc2xvdyB3aGVuIGdpdmluZyBvZmZzZXRzIGFzIGFyZ3VtZW50LgorCitbMTMuMDIuOTZdCisKKy0gc2VlIGJlbG93IC4uLgorCitbMDMuMDEuOTZdCisKKy0gbmV3IGNvbW1hbmQgbGluZSBwYXJzZXIgdW5kZXIgZGV2ZWxvcG1lbnQgKEFMUEhBISkKKworWzIxLjExLjk1XQorCistIE1HdG9vbCB3aWxsIGJlIGRlc3RydWN0ZWQgZHVyaW5nIGNyZWF0aW9uLCB3aGVuICFJU19MRUFSTkVSKDxjbG9uZXI+KSBpcyB0cnVlCisKKy0gbmV3IG9wdGlvbiAiLXMiIHRvIHhpW252ZW50b3J5XSBwcmludHMgc2hvcnQgaW52ZW50b3J5IGxpc3QgKGZpbGVuYW1lcyBvbmx5KS4KKyAgVGhpcyBpcyB1c2VmdWwgZm9yIGFsZXJ0IG9iamVjdCAiLi4uIHNjYW5uZWQgeW91ciBpbnZlbnRvcnkiIGV0Yy4KKyAgeGkgYWNjZXB0cyA8dXNlcm5hbWU+IGFzIG9wdGlvbmFsIGFyZ3VtZW50IHRvIHJldHJpZXZlIDx1c2VybmFtZT4ncyAKKyAgaW52ZW50b3J5IGluc3RlYWQgb2YgdGhlIGNsb25lcidzIG93biBpbnZlbnRvcnkgYW5kIG1heSB3cml0ZSBpbnRvIHBpcGVzCisgIHRvIGNyZWF0ZSBjb21tYW5kIGNoYWlucyBsaWtlOiB4aSAtcyBraXJrfHhncmVwIE1HdG9vbAorCistIG5ldyBjb21tYW5kIHhsYWcgOi0pIAorCitbMDkuMTEuOTVdCisKKy0gYnVnZml4OiB4aW5oZXJpdCBub3cgY2FsbHMgeGluaGVyaXQgYW5kIE5PVCB4aW52ZW50b3J5CisKK1syMy4wOC45NV0KKworLSB4Y2FsbCBhbmQgeGV2YWwgdHJ5IHRvIGluY2x1ZGUgYSBwcml2YXRlIGhlYWRlciBmaWxlIH4vLnh0b29sLmggaWYgb25lIAorICBleGlzdHMuIFlvdSBtYXkgZGVmaW5lIG93biBtYWNyb3Mgb3Igd2hhdGV2ZXIgdG8gbWFrZSB0aGluZ3MgZWFzaWVyCisKK1syMS4wNi45NV0KKworLSBuZXcgb3B0aW9uICJjbWRhdmciIHRvIHh3aG8sIHNob3dzIGNvbW1hbmRfYXZlcmFnZSBpbiBhc2NlbmRpbmcgb3JkZXIKKworWzIwLjA2Ljk1XQorCistIHJlbW92ZWQgcmVkaXJlY3Rpbmcgb2YgeGNhbGwgYW5kIHhldmFsICh0b28gYnVnZ3kpCisKKy0gYWRkZWQgb3B0aW9ucyAtZiBhbmQgLW0gdG8geHByb3BzIChzaG93IHByb3BmbGFncyBhbmQgcHJvcG1ldGhvZHMpCisKK1swNi4wNi45NV0KKworICAqKiBJTVBPUlRBTlQgKiogKG5vdCBiYWNrd2FyZCBjb21wYXRpYmxlIGNoYW5nZSkKKy0geGNhbGwgYW5kIHhldmFsIG5vdyB3cml0ZSB0byBhIGZpbGUsIHdoZW4gcmVkaXJlY3RpbmcgdGhlaXIgb3V0cHV0CisgIHVzaW5nICc+Jy4gSXQgaXMgYWxzbyBwb3NzaWJsZSB0byBwaXBlIG91dHB1dCBpbnRvIG90aGVyIGNvbW1hbmRzCisKK1szMC4wNS45NV0KKworLSB4bG9vay94ZGxvb2sgYXJlIG5vdyBhYmxlIHRvIHdyaXRlIGludG8gcGlwZXMKKworLSB4d2hvIHNob3dzIHRoZSBuYW1lIG9mIGFueSB1c2VyIGN1cnJlbnRseSBsb2dnaW5nIGluCisgIGluc3RlYWQgb2Ygc2ltcGx5ICIgUiBPIE8gVCAiCisKK1sxMC4wNC45NV0KKworLSBhZGRlZCBvcHRpb24gLWkgdG8geGdyZXAgKGlnbm9yZSBjYXNlKQorCistIGJ1Z2ZpeCBpbiBjb21tYW5kIHBpcGVsaW5lcworCitbMjguMDMuOTVdCisKKy0geGluaGVyaXQgaXMgbm93IGFibGUgdG8gd3JpdGUgaW50byBwaXBlcworCitbMjAuMDMuOTVdCisKKy0gYWRkZWQgSU8gcmVkaXJlY3Rpb24gbGlrZTogIHh3aG8gaXAgPiB0ZXN0ZmlsZSAgb3IgIHh3aG8gPj4gdGVzdGZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGFuZDogIHhtb3JlIDwgdGVzdGZpbGUKKyAgKHRoaXMgaXMgdmVyeSBBTFBIQSEhISkKKworWzAxLjAzLjk1XQorCistIG5ldyBjb21tYW5kIHh3Yy4gQ291bnQgbGluZXMsIHdvcmRzIGFuZCBjaGFycyBpbiBmaWxlCisgIFN5bnRheCB4d2MgWy1jbHddIFtmaWxlXSAgKGlzIGFibGUgdG8gcmVhZCBmcm9tIHBpcGUpCisKK1sxNy4wMi45NV0KKworLSBjaGFuZ2VkIGZvcm1hdHRpbmcgb2YgeHByb3BzIG91dHB1dAorCitbMTUuMDIuOTVdCisKKy0gbG90cyBvZiBjb2RlIGFkZGVkLCBzb21lIHJld3JpdHRlbgorCistIHJlbW92ZWQgeGFsaWFzIGNhcGFiaWxpdHkgKHRoZSBzaGVsbCBhbGlhcyBwcm92aWRlcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5KQorCistIHJlbW92ZWQgeGNpbmRlbnQsIHhkYXRlLCB4cXVpdCAKKworLSBidWdzIGZpeGVkIGluIHhjYWxsb3V0cywgeHByb3BzLCB4bWFuICh3aGVuIHVzaW5nIHh4dG9vbCkKKworLSBhZGRlZCBjb21tYW5kIHBpcGVsaW5lcyBmb3Igc2VsZWN0ZWQgY29tbWFuZHM6CisKKyAgLT4gY21kIDogaXMgYWJsZSB0byByZWFkIGZyb20gcGlwZQorICBjbWQgLT4gOiBpcyBhYmxlIHRvIHdyaXRlIGludG8gcGlwZQorCisgIHhjYWxsb3V0cyAtPgorICAtPiB4Y2F0IC0+CisgIHhjbWRzIC0+CisgIC0+IHhncmVwIC0+CisgIHhoYmVhdHMgLT4KKyAgLT4geGhlYWQgLT4KKyAgLT4geG1vcmUKKyAgLT4geG1zZworICB4cHJvcHMgLT4KKyAgLT4geHNvcnQgLT4KKyAgLT4geHRhaWwgLT4KKyAgeHdobyAtPgorCisgIHRoZSBnZW5lcmFsIHN5bnRheCB1c2luZyBwaXBlcyBpczoKKworICAgIGNtZF9hIFthcmdfYV0gfCBjbWRfYiBbYXJnX2JdIHwgLi4uCisKKyAgb25seSB0aGUgZmlyc3Qgc3BhY2UgYmV0d2VlbiBjbWRfYSBhbmQgYXJnX2Egb3IgYmV0d2VlbiBjbWRfYSBhbmQgdGhlCisgIGZpcnN0IHBpcGUgc3ltYm9sIGlzIG5lY2Vzc2FyeS4KKworICBBbGwgZnVuY3Rpb25zIHdoaWNoIGFsbG93IGRpcmVjdCBvdXRwdXQgaW50byBhIHBpcGUgZG9uJ3QgdXNlIGEgcGFnZXIKKyAgdG8gc2hvdyBpdHMgb3V0cHV0IGV2ZW4gaWYgbm8gcGlwZSBmb2xsb3dzIHRoaXMgY29tbWFuZC4gWW91IG1heSB1c2UKKyAgY21kIFthcmddfHhtb3JlIHRvIG9idGFpbiB0aGUgb2xkIHJlc3VsdHMuCisKKy0gbmV3IGNvbW1hbmRzIHh0YWlsLCB4aGVhZCwgeGNhdCBhbmQgeHNvcnQKKworLSBjb21tYW5kIGxpbmUgb3B0aW9uIC12IGFkZGVkIHRvIHhncmVwIHRvIHByaW50IGxpbmVzIG5vdCBtYXRjaGluZyB0aGUgc2VhcmNoCisgIHBhdHRlcm4KKworLSBpL28gcmVkaXJlY3Rpb24gaXMgY29taW5nIHNvb24KZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvdG9vbGNtZC5jIGIvb2JqL3Rvb2xzL01HdG9vbC90b29sY21kLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM1MDRiNAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvdG9vbGNtZC5jCkBAIC0wLDAgKzEsMjAzMyBAQAorLyoKKyAqIE1HdG9vbC0xLjAKKyAqIEZpbGU6IHRvb2xjbWRzLmMKKyAqIE1haW50YWluZXI6IEtpcmtATW9yZ2VuR3JhdWVuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogdGhlIG9yaWdpbmFsIFh0b29sIGlzIGNvcHlyaWdodGVkIGJ5IEh5cCAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaW5jbHVkZSAidG9vbC5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGNvbW1hbmQgZnVuY3Rpb25zCisgKi8KKworaW50IFhjYWxsKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBvYmosIGNhbGxvYmo7CisgIHN0cmluZyBmaWxlLCBjYWxsc3RyLCBjYWxsZnVuLCBjYWxsZXhwciwgZXJyb3IsIGVycmxvZzsKKyAgaW50ICpydTEsICpydTIsIHh0aW1lOworICBtaXhlZCByZXM7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTIoc3RyLCAieGNhbGwgPG9iamVjdD4tPjxmdW5jdGlvbj4oPGFyZ3VtZW50cz4pIik7CisgIFRLKCJYY2FsbDogc3RyOiAiKyhzdHI/c3RyOiIoTlVMTCkiKSk7CisgIGlmKHNzY2FuZihzdHIsICIlcy0+JXMoJXMiLCBjYWxsc3RyLCBjYWxsZnVuLCBjYWxsZXhwcikhPTMpCisgICAgcmV0dXJuIEZBTFNFOworICBpZighKGNhbGxvYmo9WEZpbmRPYmooY2FsbHN0cikpKQorICAgIHJldHVybiBUUlVFOworICBlbHNlCisgIHsKKyNpZiAwCisgICAgd3JpdGVfZmlsZShUT09MX0xPRywKKwkgICAgICAgc3ByaW50ZigiJXMgKCVzKSB4Y2FsbCAlcyAoZW52OiAlcylcbiIsY3RpbWUodGltZSgpKSwKKwkJICAgICAgIGdldHVpZChjbG9uZXIpLHN0cixvYmplY3RfbmFtZShlbnZpcm9ubWVudChjbG9uZXIpKSkpOworI2VuZGlmCisgICAgZmlsZT1MUENfRklMRSsiLmMiOworICAgIGlmKGZpbGVfc2l6ZShmaWxlKT4wKQorICAgICAgcm0oZmlsZSk7CisgICAgaWYob2JqPWZpbmRfb2JqZWN0KExQQ19GSUxFKSkKKyAgICAgIERlc3RydWN0KG9iaik7CisgICAgb2JqPTA7CisgICAgd3JpdGVfZmlsZShmaWxlLAorCSAgICAgICAiI2luY2x1ZGUgPHByb3BlcnRpZXMuaD5cbiIrCisJICAgICAgICIjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPlxuIisKKwkgICAgICAgIiNpbmNsdWRlIDxkZWZpbmVzLmg+XG4iKworCSAgICAgICAiI2luY2x1ZGUgPHdpemxpc3QuaD5cbiIrCisJICAgICAgICIjaW5jbHVkZSA8bW92aW5nLmg+XG4iKworCSAgICAgICAiI2luY2x1ZGUgXCIvc2VjdXJlL3dpemxldmVscy5oXCJcbiIrCisJICAgICAgIChmaWxlX3NpemUoUFJJVkFURV9IRUFERVIpPj0wPyIjaW5jbHVkZSBcIiIrUFJJVkFURV9IRUFERVIrIlwiXG4iOiIiKSsKKwkgICAgICAgIm1peGVkIGdldChzdHJpbmcgc3RyKXtyZXR1cm4gcHJldmlvdXNfb2JqZWN0KCktPlhGaW5kT2JqKHN0cik7fVxuIisKKwkgICAgICAgIm1peGVkIGV2YWwob2JqZWN0IG9iaixtaXhlZCBtZSxtaXhlZCBoZXJlKXtyZXR1cm4gb2JqLT4iK2NhbGxmdW4rIigiK2NhbGxleHByKyI7fVxuIik7CisgICAgZXJybG9nID0gRVJSX0ZJTEU7CisgICAgaWYoZmlsZV9zaXplKGVycmxvZyk+MCkKKyAgICAgIHJtKGVycmxvZyk7CisgICAgaWYoZXJyb3I9Y2F0Y2goKExQQ19GSUxFKS0+X19uaXhnaWJ0c19fKCkpKQorICAgICAgVygiRXJyb3I6ICIrZXJyb3JbMS4uXSk7CisgICAgZWxzZQorICAgIHsKKyAgICAgIG9iaj1maW5kX29iamVjdChMUENfRklMRSk7CisgICAgICBydTE9cnVzYWdlKCk7CisgICAgICBlcnJvcj1jYXRjaChyZXM9KG1peGVkKW9iai0+ZXZhbChjYWxsb2JqLCBjbG9uZXIsIEVOVihjbG9uZXIpKSk7CisgICAgICBydTI9cnVzYWdlKCk7CisgICAgICBpZihlcnJvcikKKwlXKCJFcnJvcjogIitlcnJvclsxLi5dKTsKKyAgICAgIGVsc2UKKyAgICAgIHsKKwl4dGltZT1ydTJbMF0tcnUxWzBdK3J1MlsxXS1ydTFbMV07CisJV0RMTigiRXZhbHVhdGlvbiB0aW1lOiAiKyh4dGltZTwwID8gMCA6IHh0aW1lKSsiIG1zIik7CisJUElQRV9ERUxFVEUocGlwZV9vZik7CisJaWYocGlwZV9vdXQmJnBpcGVfb2YpCisJICB3cml0ZV9maWxlKHBpcGVfb2YsbWl4ZWRfdG9fc3RyaW5nKHJlcywgTUFYX1JFQ1VSU0lPTikrIlxuIik7CisJZWxzZQorCVdMTigiUmVzdWx0OiAiK21peGVkX3RvX3N0cmluZyhyZXMsIE1BWF9SRUNVUlNJT04pKTsKKwlpZihvYmplY3RwKHJlcykpCisgICAgbV9hZGQodmFyaWFibGUsICJyZXN1bHQiLCByZXMpOworICAgICAgfQorICAgIH0KKyAgICBybShmaWxlKTsKKyAgfQorICBpZihvYmopIERlc3RydWN0KG9iaik7CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWGNhbGxvdXRzKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBvYmo7CisgIG1peGVkIGNhbGxvdXRzLCBhcmdzOworICBzdHJpbmcgZnVuLCB0bXAsIGZpbGU7CisgIGludCBkZWxheSwgaSwgczsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFRLKCJYY2FsbG91dHM6IHN0cjogIisoc3RyP3N0cjoiKE5VTEwpIikpOworICBpZighcGlwZV9vdXQpCisgIHsKKyAgICBVU0FHRTEoc3RyLCAieGNhbGxvKHV0cykgW3NlYXJjaCBwYXR0ZXJuXSIpOworICAgIGZpbGU9VE1QX0ZJTEU7CisgICAgaWYoZmlsZV9zaXplKGZpbGUpPjApCisgICAgICBybShmaWxlKTsKKyAgICBpZighc3RyKQorICAgICAgc3RyPSJeXFxbfi8iOworICAgIGVsc2UgaWYoIXJlZ2V4cCgoeyJkdW1teSJ9KSwgc3RyKSkKKyAgICB7CisgICAgICBXRExOKCJCYWQgcmVndWxhciBleHByZXNzaW9uIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9IAorICB9CisgIGVsc2UKKyAgeworICAgIFVTQUdFMShzdHIsICJ4Y2FsbG8odXRzKSIpOworICAgIGlmKHN0ciYmc3RyIT0iIikKKyAgICB7CisgICAgICBXRExOKCJNb3JlIGFyZ3VtZW50cyB0aGFuIGV4cGVjdGVkIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgY2FsbG91dHM9Y2FsbF9vdXRfaW5mbygpOworICBzPXNpemVvZihjYWxsb3V0cyk7CisgIFBJUEVfREVMRVRFKHBpcGVfb2YpOworICBmb3IoaT0wOyBpPHM7IGkrKykKKyAgeworICAgIGlmKGNhbGxvdXRzW2ldJiZwb2ludGVycChjYWxsb3V0c1tpXSkpCisgICAgeworICAgICAgdG1wPXNwcmludGYoIiVPICVPcyAlTyAoJXMpIixjYWxsb3V0c1tpXVswXSxjYWxsb3V0c1tpXVsyXSwKKwkJICBjYWxsb3V0c1tpXVsxXSwoc2l6ZW9mKGNhbGxvdXRzW2ldKT4zPworCQkJCSAgbWl4ZWRfdG9fc3RyaW5nKGNhbGxvdXRzW2ldWzNdLAorCQkJCQkJICBNQVhfUkVDVVJTSU9OKToiMCIpKTsKKyAgICAgIGlmKHBpcGVfb3V0JiZwaXBlX29mKQorCXdyaXRlX2ZpbGUocGlwZV9vZix0bXArIlxuIik7CisgICAgICBlbHNlCisJaWYoc2l6ZW9mKHJlZ2V4cCgoe3RtcH0pLCBzdHIpKSkKKwkgIFdMTih0bXApOworICAgIH0KKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworaW50IFhjYXQoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nICp0bXAsZmlsZTsKKyAgaW50IHM7CisKKyAgU0VDVVJFMihUUlVFKTsKKyAgVEsoIlhjYXQ6IHN0cjogIitzdHIpOworICBpZighcGlwZV9pbikKKyAgeworICAgIFVTQUdFMihzdHIsICJ4Y2F0IDxmaWxlPiIpOworICAgIGlmKCEoZmlsZT1YRmluZEZpbGUoc3RyKSkpCisgICAgeworICAgICAgV0RMTigiQ2FuJ3QgZmluZCBmaWxlIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYoc3RyJiZzdHIhPSItIikKKyAgICAgIFVTQUdFMygieGNhdCAtIik7CisKKyAgICBpZiAoZmlsZV9zaXplKGZpbGU9cGlwZV9pZik8MCkKKyAgICB7CisgICAgICBXRExOKCJNaXNzaW5nIGlucHV0IHRvIHhjYXQiKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICB0bXA9b2xkX2V4cGxvZGUocmVhZF9maWxlKGZpbGUsMCxQSVBFX01BWCksIlxuIik7CisgIGlmKHBpcGVfaW4mJnBpcGVfaWY9PVBJUEVfRklMRSkKKyAgICBybShQSVBFX0ZJTEUpOworICBpZiAocGlwZV9vdXQmJnBpcGVfb2YpCisgICAgd3JpdGVfZmlsZShwaXBlX29mLGltcGxvZGUodG1wLCJcbiIpKyJcbiIpOworICBlbHNlCisgICAgV0xOKGltcGxvZGUodG1wLCJcbiIpKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYY2Qoc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IGRlc3Q7CisgIHN0cmluZyBwYXRoOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UxKHN0ciwgInhjZCBbb2JqZWN0XSIpOworICBUSygiWGNkOiBzdHI6ICIrKHN0cj9zdHI6IihOVUxMKSIpKTsKKyAgaWYoIXN0cikKKyAgeworICAgIGlmKCEocGF0aD0oc3RyaW5nKWNsb25lci0+UXVlcnlQcm9wKCJzdGFydF9ob21lIikpKQorICAgICAgcGF0aD0iLyI7CisgIH0KKyAgZWxzZSBpZigoZGVzdD1YRmluZE9iaihzdHIsMSkpKQorICAgIHBhdGg9Ii8iK2ltcGxvZGUob2xkX2V4cGxvZGUob2JqZWN0X25hbWUoZGVzdCksIi8iKVswLi48Ml0sIi8iKTsKKyAgZWxzZQorICAgIHBhdGg9IiI7CisKKyAgVEsoIlhjZDogcGF0aDogIisocGF0aD9wYXRoOiIoTlVMTCkiKSk7CisgIGlmKCFzaXplb2YocGF0aCkpCisgICAgcGF0aD1zdHI7CisgIFBMLT5fY2QocGF0aCk7CisKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYY2xlYW4oc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IGVudjsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMShzdHIsICJ4Y2xlKGFuKSBbb2JqZWN0XSIpOworICBUSygiWGNsZWFuOiBzdHI6ICIrKHN0cj9zdHI6IihOVUxMKSIpKTsKKyAgaWYoIXN0cikKKyAgICBlbnY9RU5WKGNsb25lcik7CisgIGlmKGVudnx8KGVudj1YRmluZE9iaihzdHIpKSkKKyAgeworICAgIFByaW50U2hvcnQoIkNsZWFuaW5nOiAiLCBlbnYpOworICAgIGZpbHRlcihmaWx0ZXIoYWxsX2ludmVudG9yeShlbnYpLCAjJ2lzX25vdF9wbGF5ZXIpLC8vJworCQkgIkRlc3RydWN0IiwgTUUpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWGNsb25lKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBvYmo7CisgIHN0cmluZyBmaWxlLCBlcnJsb2csIGVycm9yOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UyKHN0ciwgInhjbG8obmUpIDxmaWxlbmFtZT4iKTsKKyAgaWYoIShmaWxlPVhGaW5kRmlsZShzdHIpKSkgcmV0dXJuIFRSVUU7CisgIGVycmxvZz1FUlJfRklMRTsKKyAgaWYoZmlsZV9zaXplKGVycmxvZyk+MCkgcm0oZXJybG9nKTsKKyAgV0xOKCJDbG9uZTogIitzaG9ydF9wYXRoKGZpbGUpKTsKKyAgaWYoIShlcnJvcj1jYXRjaChvYmo9Y2xvbmVfb2JqZWN0KGZpbGUpKSkpCisgIHsgCisgICAgbV9hZGQodmFyaWFibGUsICJjbG9uZSIsIG9iaik7CisgICAgaWYoIU1vdmVPYmoob2JqLCBFTlYoY2xvbmVyKSwgVFJVRSkpCisgICAgICBXRExOKCJDYW5ub3QgbW92ZSBvYmplY3QgaW50byB0aGlzIHJvb20iKTsKKyAgICBlbHNlIGlmKCFvYmotPlF1ZXJ5Tm9HZXQoKSkKKyAgICB7CisgICAgICBpZighTW92ZU9iaihvYmosIGNsb25lciwgVFJVRSkpCisJV0RMTigiQ2Fubm90IG1vdmUgb2JqZWN0IGludG8geW91ciBpbnZlbnRvcnkiKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIFcoIkVycm9yOiAiK2Vycm9yWzEuLl0pOworICByZXR1cm4gVFJVRTsKK30KKworaW50IFh1Y2xvbmUoc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IG9iajsKKyAgc3RyaW5nIGZpbGUsIGVycmxvZywgZXJyb3I7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTIoc3RyLCAieHVjbG8obmUpIDxmaWxlbmFtZT4iKTsKKyAgaWYoIShmaWxlPVhGaW5kRmlsZShzdHIpKSkgcmV0dXJuIFRSVUU7CisgIGVycmxvZz1FUlJfRklMRTsKKyAgaWYoZmlsZV9zaXplKGVycmxvZyk+MCkgcm0oZXJybG9nKTsKKyAgaWYob2JqPWZpbmRfb2JqZWN0KGZpbGUpKSB7CisgICAgRGVzdHJ1Y3Qob2JqKTsKKyAgICBXTE4oIlVwZGF0ZSBhbmQgY2xvbmU6ICIrc2hvcnRfcGF0aChmaWxlKSk7CisgIH0KKyAgZWxzZQorICAgIFdMTigiQ2xvbmU6ICIrc2hvcnRfcGF0aChmaWxlKSk7CisgIGlmKCEoZXJyb3I9Y2F0Y2gob2JqPWNsb25lX29iamVjdChmaWxlKSkpKQorICB7CisgICAgdmFyaWFibGVbImNsb25lIl0gPSBvYmo7CisgICAgaWYoIU1vdmVPYmoob2JqLCBFTlYoY2xvbmVyKSwgVFJVRSkpCisgICAgICBXRExOKCJDYW5ub3QgbW92ZSBvYmplY3QgaW50byB0aGlzIHJvb20iKTsKKyAgICBlbHNlIGlmKCFvYmotPlF1ZXJ5Tm9HZXQoKSkKKyAgICB7CisgICAgICBpZighTW92ZU9iaihvYmosIGNsb25lciwgVFJVRSkpCisJV0RMTigiQ2Fubm90IG1vdmUgb2JqZWN0IGludG8geW91ciBpbnZlbnRvcnkiKTsKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIFcoIkVycm9yOiAiK2Vycm9yWzEuLl0pOworICByZXR1cm4gVFJVRTsKK30KKworaW50IFhjbWRzKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBvYmo7CisgIG1peGVkICpjbWRzOworICBpbnQgaSwgczsKKworICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTEoc3RyLCAieGNtKGRzKSBbb2JqZWN0XSIpOworICBUSygiWGNtZHM6IHN0cjogIisoc3RyP3N0cjoiKE5VTEwpIikpOworICBpZighc3RyKQorICAgIG9iaj1FTlYoY2xvbmVyKTsKKyAgZWxzZSBpZighKG9iaj1YRmluZE9iaihzdHIpKSkKKyAgeworICAgIFdETE4oIkNhbid0IGZpbmQgb2JqZWN0Iik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgcz1zaXplb2YoY21kcz1xdWVyeV9hY3Rpb25zKGNsb25lciwxfDJ8NHw4fDE2KSk7CisgIFBJUEVfREVMRVRFKHBpcGVfb2YpOworICBmb3IoaT0wOyBpPHM7IGkrPTUpCisgICAgaWYoY21kc1tpKzNdPT1vYmopCisgICAgICBpZihwaXBlX291dCYmcGlwZV9vZikKKwl3cml0ZV9maWxlKHBpcGVfb2YsQUxFRlQoY21kc1tpXSsiICIsIDE1LCAiLiIpKworCQkgICAoY21kc1tpKzJdID8gIiAqICIgOiAiIC4gIikrY21kc1tpKzRdKyIoKVxuIik7CisgICAgICBlbHNlCisJV0xOKEFMRUZUKGNtZHNbaV0rIiAiLCAxNSwgIi4iKSsKKwkgICAgKGNtZHNbaSsyXSA/ICIgKiAiIDogIiAuICIpK2NtZHNbaSs0XSsiKCkiKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisgIAoraW50IFhkYmcoc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IG9iajsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMihzdHIsICJ4ZGIoZykgPG9iamVjdD4iKTsKKyAgVEsoIlhkYmc6IHN0cjogIisoc3RyP3N0cjoiKE5VTEwpIikpOworICBpZigob2JqPVhGaW5kT2JqKHN0cikpKQorICB7CisgICAgZGVidWdfaW5mbygxLCBvYmopOworICAgIGRlYnVnX2luZm8oMCwgb2JqKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworaW50IFhkY2xlYW4oc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IGVudjsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMShzdHIsICJ4ZGMobGVhbikgW29iamVjdF0iKTsKKyAgVEsoIlhkY2xlYW46IHN0cjogIisoc3RyP3N0cjoiKE5VTEwpIikpOworICBpZighc3RyKQorICAgIGVudj1FTlYoY2xvbmVyKTsKKyAgaWYoZW52fHwoZW52PVhGaW5kT2JqKHN0cikpKQorICB7CisgICAgUHJpbnRTaG9ydCgiRGVlcCBjbGVhbmluZzogIiwgZW52KTsKKyAgICBmaWx0ZXIoZmlsdGVyKGFsbF9pbnZlbnRvcnkoZW52KSwgIydpc19ub3RfcGxheWVyLCBNRSksLy8nCisJCSAiRGVlcENsZWFuIiwgTUUpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWGRkZXMoc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IG9iajsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMihzdHIsICJ4ZGQoZXMpIDxvYmplY3Q+Iik7CisgIFRLKCJYZGRlczogc3RyOiAiKyhzdHI/c3RyOiIoTlVMTCkiKSk7CisgIGlmKChvYmo9WEZpbmRPYmooc3RyKSkpCisgIHsKKyAgICBQcmludFNob3J0KCJEZWVwIGRlc3RydWN0OiAiLCBvYmopOworICAgIGZpbHRlcihkZWVwX2ludmVudG9yeShvYmopLCAiRGVzdHJ1Y3QiLCBNRSk7CisgICAgRGVzdHJ1Y3Qob2JqKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworaW50IFhkZXMoc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IG9iajsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMihzdHIsICJ4ZGUocykgPG9iamVjdD4iKTsKKyAgVEsoIlhkZXM6IHN0cjogIisoc3RyP3N0cjoiKE5VTEwpIikpOworICBpZigob2JqPVhGaW5kT2JqKHN0cikpKQorICB7CisgICAgUHJpbnRTaG9ydCgiRGVzdHJ1Y3Q6ICIsb2JqKTsKKyAgICBEZXN0cnVjdChvYmopOworICB9CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWGRsb29rKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBvYmo7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTEoc3RyLCAieGRsKG9vaykgW29iamVjdF0iKTsKKyAgVEsoIlhkbG9vazogc3RyOiAiKyhzdHI/c3RyOiIoTlVMTCkiKSk7CisgIGlmKCFzdHIpCisgICAgb2JqPWNsb25lcjsKKyAgaWYob2JqfHwob2JqPVhGaW5kT2JqKHN0cikpKQorICB7CisgICAgUElQRV9ERUxFVEUocGlwZV9vZik7CisgICAgRGVlcFByaW50U2hvcnQob2JqLE5VTEwsTlVMTCwocGlwZV9vdXQmJnBpcGVfb2YpP3BpcGVfb2Y6IiIpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWGRvKHN0cmluZyBzdHIpCit7CisgIGludCBpLCBuLCBzOworICBzdHJpbmcgKnN0cnMsIGNtZDsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMihzdHIsICJ4ZG8gWzxudW1iZXIxPiNdPGNvbW1hbmQxPls7WzxudW1iZXIyPiNdPGNvbW1hbmQyPl0gLi4uIik7CisgIGlmKCFzdHJ8fHN0cj09IiJ8fCEocz1zaXplb2Yoc3Rycz1zdHJpcF9leHBsb2RlKHN0ciwgIjsiKSkpKQorICAgIHJldHVybiBGQUxTRTsKKyAgZm9yKGk9MDsgaTxzOyBpKyspCisgIHsKKyAgICBpZihzdHJzW2ldKQorICAgIHsKKyAgICAgIHN3aXRjaChzc2NhbmYoc3Ryc1tpXSwgIiVkIyVzIiwgbiwgY21kKSkKKyAgICAgIHsKKwljYXNlIDA6CisJaWYoIUNvbW1hbmQoc3Ryc1tpXSkpIHJldHVybiBUUlVFOworCWJyZWFrOworCWNhc2UgMToKKwlpZihjbWQmJighQ29tbWFuZChjbWQpKSkgcmV0dXJuIFRSVUU7CisJYnJlYWs7CisJY2FzZSAyOgorCW49IG48MSA/IDEgOiBuOworCWlmKGNtZCkKKwl7CisJICB3aGlsZShuLS0pCisJICAgIGlmKCFDb21tYW5kKGNtZCkpIHJldHVybiBUUlVFOworCX0KKwlicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYZHVwZGF0ZShzdHJpbmcgc3RyKQoreworICBpbnQgaSwgczsKKyAgb2JqZWN0IG9iajsKKyAgc3RyaW5nIGZpbGUsICpsaXN0OworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UyKHN0ciwgInhkdShwZGF0ZSkgPGZpbGVuYW1lPiIpOworICBpZighKGZpbGU9WEZpbmRGaWxlKHN0cikpKQorICAgIHJldHVybiBUUlVFOworICBpZihmaWxlWzwyLi48MV09PSIuYyIpCisgICAgZmlsZT1maWxlWzAuLjwzXTsKKyAgaWYob2JqPVhGaW5kT2JqKGZpbGUpKQorICB7CisgICAgUHJpbnRTaG9ydCgiRGVlcCB1cGRhdGluZzogIiwgb2JqKTsKKyAgICBsaXN0PWluaGVyaXRfbGlzdChvYmopOworICAgIGZvcihzPXNpemVvZihsaXN0KTsgaTxzOyBpKyspCisgICAgeworICAgICAgaWYob2JqPWZpbmRfb2JqZWN0KGxpc3RbaV0pKQorCURlc3RydWN0KG9iaik7CisgICAgfQorICB9CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWGVjaG8oc3RyaW5nIHN0cikKK3sKKyAgVEsoIlhlY2hvOiBzdHI6ICIrKHN0cj9zdHI6IihOVUxMKSIpKTsKKyAgV0xOKHN0cik7CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWGV2YWwoc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IG9iajsKKyAgc3RyaW5nIGZpbGUsIGVycm9yOworICBpbnQgKnJ1MSwgKnJ1MiwgeHRpbWU7CisgIG1peGVkIHJlczsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMihzdHIsICJ4ZXYoYWwpIDxleHByZXNzaW9uPiIpOworICBmaWxlPUxQQ19GSUxFKyIuYyI7CisgIGlmKGZpbGVfc2l6ZShmaWxlKT4wKQorICAgIHJtKGZpbGUpOworICBpZihvYmo9ZmluZF9vYmplY3QoTFBDX0ZJTEUpKQorICAgIERlc3RydWN0KG9iaik7CisjaWYgMAorICB3cml0ZV9maWxlKFRPT0xfTE9HLAorCSAgICAgc3ByaW50ZigiJXMgKCVzKSB4ZXZhbCAlc1xuIiwKKwkJICAgICBjdGltZSh0aW1lKCkpLGdldHVpZChjbG9uZXIpLHN0cikpOworI2VuZGlmCisgIHdyaXRlX2ZpbGUoZmlsZSwKKwkgICAgICIjaW5jbHVkZSA8cHJvcGVydGllcy5oPlxuIisKKwkgICAgICIjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPlxuIisKKwkgICAgICIjaW5jbHVkZSA8ZGVmaW5lcy5oPlxuIisKKyAgICAgICAgICAgICAiI2luY2x1ZGUgPHdpemxpc3QuaD5cbiIrCisJICAgICAiI2luY2x1ZGUgPG1vdmluZy5oPlxuIisKKwkgICAgICIjaW5jbHVkZSBcIi9zZWN1cmUvd2l6bGV2ZWxzLmhcIlxuIisKKwkgICAgIChmaWxlX3NpemUoUFJJVkFURV9IRUFERVIpPj0wPyIjaW5jbHVkZSBcIiIrUFJJVkFURV9IRUFERVIrIlwiXG4iOiIiKSsKKwkgICAgICJnZXQoc3RyKXtyZXR1cm4gcHJldmlvdXNfb2JqZWN0KCktPlhGaW5kT2JqKHN0cik7fVxuIisKKwkgICAgICJldmFsKG1lLGhlcmUpe3JldHVybiAiK3N0cisiO30iKTsKKyAgaWYoZXJyb3I9Y2F0Y2gob2JqPWNsb25lX29iamVjdChmaWxlKSkpCisgICAgVygiRXJyb3I6ICIrZXJyb3JbMS4uXSk7CisgIGVsc2UKKyAgeworICAgIHJ1MT1ydXNhZ2UoKTsKKyAgICBlcnJvcj1jYXRjaChyZXM9KG1peGVkKW9iai0+ZXZhbChjbG9uZXIsIEVOVihjbG9uZXIpKSk7CisgICAgcnUyPXJ1c2FnZSgpOworICAgIGlmKGVycm9yKQorICAgICAgVygiRXJyb3I6ICIrZXJyb3JbMS4uXSk7CisgICAgZWxzZQorICAgIHsKKyAgICAgIHh0aW1lPXJ1MlswXS1ydTFbMF0rcnUyWzFdLXJ1MVsxXTsKKyAgICAgIFdETE4oIkV2YWx1YXRpb24gdGltZTogIisoeHRpbWU8MCA/IDAgOiB4dGltZSkrIiBtcyIpOworICAgICAgUElQRV9ERUxFVEUocGlwZV9vZik7CisgICAgICBpZihwaXBlX291dCYmcGlwZV9vZikKKyAgICAgICAgd3JpdGVfZmlsZShwaXBlX29mLG1peGVkX3RvX3N0cmluZyhyZXMsTUFYX1JFQ1VSU0lPTikrIlxuIik7CisgICAgICBlbHNlCisgICAgICAgIFdMTigiUmVzdWx0OiAiK21peGVkX3RvX3N0cmluZyhyZXMsIE1BWF9SRUNVUlNJT04pKTsKKyAgICAgIGlmKG9iamVjdHAocmVzKSkKKyAgICAgICAgdmFyaWFibGVbInJlc3VsdCJdID0gcmVzOworICAgIH0KKyAgfQorICBybShmaWxlKTsKKyAgaWYob2JqKQorICAgIERlc3RydWN0KG9iaik7CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWGZvcmFsbChzdHJpbmcgc3RyKQoreworICBpbnQgaSwgcywgdCwgdTsKKyAgc3RyaW5nIHBhdCwgY21kLCBhcmcsICpzdHJzLCAqZmlsZXMsIGZoLCBmciwgZmUsIGZ0LCBmZjsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMihzdHIsICJ4Zm8ocmFsbCkgPGZpbGVwYXR0ZXJuPiA8Y29tbWFuZD4iKTsKKyAgaWYoc3NjYW5mKHN0ciwgIiVzICVzIiwgcGF0LCBhcmcpIT0yKQorICAgIHJldHVybiBGQUxTRTsKKyAgZmlsZXM9bG9uZ19nZXRfZGlyKHBhdCwgRkFMU0UpOworICBpZighKHM9c2l6ZW9mKGZpbGVzKSkpCisgIHsKKyAgICBXRExOKCJObyBtYXRjaGluZyBmaWxlcyBmb3VuZCIpOworICAgIHJldHVybiBUUlVFOworICB9CisgIHN0cnM9b2xkX2V4cGxvZGUoZmlsZXNbMF0sICIvIik7CisgIGZoPSIvIjsKKyAgaWYodD1zaXplb2Yoc3RycyktMSkKKyAgICBmaCs9aW1wbG9kZShzdHJzWzAuLnQtMV0sICIvIik7CisgIGZvcihpPTA7IGk8czsgaSsrKQorICB7CisgICAgZnQ9b2xkX2V4cGxvZGUoZmlsZXNbaV0sICIvIilbdF07CisgICAgaWYoKHU9c2l6ZW9mKHN0cnM9b2xkX2V4cGxvZGUoZnQsICIuIikpKSYmLS11KQorICAgIHsKKyAgICAgIGZmPWltcGxvZGUoc3Ryc1swLi51LTFdLCAiLiIpOworICAgICAgZnI9ZmgrIi8iK2ZmOworICAgICAgZmU9c3Ryc1t1XTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIGZlPSIiOworICAgICAgZmY9ZnQ7CisgICAgICBmcj1maWxlc1tpXTsKKyAgICB9CisgICAgY21kPXN0cmluZ19yZXBsYWNlKGFyZywgIiEhIiwgZmlsZXNbaV0pOworICAgIGNtZD1zdHJpbmdfcmVwbGFjZShjbWQsICIhZSIsIGZlKTsKKyAgICBjbWQ9c3RyaW5nX3JlcGxhY2UoY21kLCAiIWYiLCBmZik7CisgICAgY21kPXN0cmluZ19yZXBsYWNlKGNtZCwgIiFoIiwgZmgpOworICAgIGNtZD1zdHJpbmdfcmVwbGFjZShjbWQsICIhciIsIGZyKTsKKyAgICBjbWQ9c3RyaW5nX3JlcGxhY2UoY21kLCAiIXQiLCBmdCk7CisgICAgaWYoIShDb21tYW5kKGNtZCkpKQorICAgICAgYnJlYWs7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYZ290byhzdHJpbmcgc3RyKQoreworICBvYmplY3Qgb2JqLCB0bXA7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTEoc3RyLCAieGdvKHRvKSBbb2JqZWN0XSIpOworICBpZighc3RyKSBzdHI9In4vd29ya3Jvb20iOworICBpZighKG9iaj1YRmluZE9iaihzdHIpKSkKKyAgeworICAgIGlmKCEoc3RyPVhGaW5kRmlsZShzdHIpKSkKKyAgICAgIHJldHVybiBUUlVFOworICAgIGlmKGNhdGNoKGNhbGxfb3RoZXIoc3RyLCAiPz8/IikpKQorICAgICAgcmV0dXJuIFRSVUU7CisgICAgb2JqPWZpbmRfb2JqZWN0KHN0cik7CisgIH0KKyAgdG1wPW9iajsKKyAgd2hpbGUob2JqJiZsaXZpbmcob2JqKSkKKyAgICBvYmo9RU5WKG9iaik7CisgIGNsb25lci0+bW92ZShvYmogPyBvYmogOiB0bXAsIE1fVFBPUlQpOworICByZXR1cm4gVFJVRTsKK30KKworaW50IFhncmVwKHN0cmluZyBzdHIpCit7CisgIGludCBpLCBzLCB0LCBtb2RlOworICBzdHJpbmcgKmZpbGVzLCAqdHM7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBUSygiWGdyZXA6IHN0cjogIisoc3RyP3N0cjoiKE5VTEwpIikpOworICBtb2RlPTA7CisgIGlmKCFwaXBlX2luKQorICB7CisgICAgVVNBR0UyKHN0ciwgInhncihlcCkgWy1pXSBbLXZdIDxyZWdleHA+IDxmaWxlcGF0dGVybj4iKTsKKyAgICBpZighKHRzPW9sZF9leHBsb2RlKHN0ciwgIiAiKSl8fCEocz1zaXplb2YodHMpKSkKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB3aGlsZSh0c1swXVswXT09Jy0nKQorICAgIHsKKyAgICAgIGlmKHM8MykKKyAgICAgIHsKKwlXRExOKCJUb28gZmV3IGFyZ3VtZW50cyB0byB4Z3JlcCIpOworCXJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCh0c1swXSkKKyAgICAgIHsKKwljYXNlICItdiI6CisJICBtb2RlfD1YR1JFUF9SRVZFUlQ7CisJICB0cz10c1sxLi5dOworCSAgcy0tOworCSAgYnJlYWs7CisJY2FzZSAiLWkiOgorCSAgbW9kZXw9WEdSRVBfSUNBU0U7CisJICB0cz10c1sxLi5dOworCSAgcy0tOworCSAgYnJlYWs7CisJY2FzZSAiLXZpIjoKKwljYXNlICItaXYiOgorCSAgbW9kZXw9WEdSRVBfUkVWRVJUOworCSAgbW9kZXw9WEdSRVBfSUNBU0U7CisJICB0cz10c1sxLi5dOworCSAgcy0tOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIFdETE4oIlVua25vd24gb3B0aW9uICIrdHNbMF0rIiBnaXZlbiB0byB4Z3JlcCIpOworCSAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgIH0KKyAgICBzdHI9aW1wbG9kZSh0c1swLi5zLTJdLCAiICIpOworICB9CisgIGVsc2UKKyAgeworICAgIGlmKCEoKHRzPW9sZF9leHBsb2RlKHN0ciwgIiAiKSkmJihzPXNpemVvZih0cykpKSkKKyAgICAgIFVTQUdFMygieGdyKGVwKSBbLWldIFstdl0gPHJlZ2V4cD4iKTsKKyAgICB3aGlsZSh0c1swXVswXT09Jy0nKQorICAgIHsKKyAgICAgIGlmKHM8MikKKyAgICAgIHsKKwlXRExOKCJUb28gZmV3IGFyZ3VtZW50cyB0byB4Z3JlcCIpOworCXJldHVybiBGQUxTRTsKKyAgICAgIH0KKyAgICAgIHN3aXRjaCh0c1swXSkKKyAgICAgIHsKKwljYXNlICItdiI6CisJICBtb2RlfD1YR1JFUF9SRVZFUlQ7CisJICB0cz10c1sxLi5dOworCSAgcy0tOworCSAgYnJlYWs7CisJY2FzZSAiLWkiOgorCSAgbW9kZXw9WEdSRVBfSUNBU0U7CisJICB0cz10c1sxLi5dOworCSAgcy0tOworCSAgYnJlYWs7CisJY2FzZSAiLWl2IjoKKwljYXNlICItdmkiOgorCSAgbW9kZXw9WEdSRVBfUkVWRVJUOworCSAgbW9kZXw9WEdSRVBfSUNBU0U7CisJICB0cz10c1sxLi5dOworCSAgcy0tOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIFdETE4oIlVua25vd24gb3B0aW9uICIrdHNbMF0rIiBnaXZlbiB0byB4Z3JlcCIpOworCSAgcmV0dXJuIEZBTFNFOworICAgICAgfQorICAgIH0KKyAgICBzdHI9aW1wbG9kZSh0c1swLi5zLTFdLCAiICIpOworICB9CisgIAorICBpZihtb2RlJlhHUkVQX0lDQVNFKQorICAgIHN0cj1sb3dlcl9jYXNlKHN0cik7CisgIGlmKCEocmVnZXhwKCh7ImR1bW15In0pLCBzdHIpKSkKKyAgeworICAgIFdETE4oIkJhZCByZWd1bGFyIGV4cHJlc3Npb24iKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZighcGlwZV9pbikKKyAgeworICAgIGlmKGZpbGVfc2l6ZShUTVBfRklMRSk+MCkKKyAgICAgIHJtKFRNUF9GSUxFKTsKKyAgICBpZigodD1zaXplb2YoZmlsZXM9bG9uZ19nZXRfZGlyKFhGaWxlKHRzW3MtMV0pLCBGQUxTRSkpKSYmCisgICAgICAgKGZpbGVfc2l6ZShmaWxlc1swXSk+PTApKQorICAgIHsKKyAgICAgIGZvcihpPTA7IGk8dDsgaSsrKQorCVhHcmVwRmlsZShzdHIsIGZpbGVzW2ldLCBtb2RlKTsKKyAgICAgIGlmKHBpcGVfb3V0JiZwaXBlX29mKQorICAgICAgeworCVBJUEVfREVMRVRFKHBpcGVfb2YpOworCWlmKCFwaXBlX292cikKKwl7CisJICB3cml0ZV9maWxlKHBpcGVfb2YscmVhZF9maWxlKFRNUF9GSUxFLDAsUElQRV9NQVgpKTsKKwkgIHJtKFRNUF9GSUxFKTsKKwl9CisJZWxzZQorCSAgcmVuYW1lKFRNUF9GSUxFLHBpcGVfb2YpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworCVcocmVhZF9maWxlKFRNUF9GSUxFLDAsUElQRV9NQVgpKTsKKwlybShUTVBfRklMRSk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgIFdETE4oIkNhbm5vdCByZWFkIGZpbGUocykiKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBzdHJpbmcgKnRtcDsKKyAgICBpZihmaWxlX3NpemUocGlwZV9pZik8MCkKKyAgICB7CisgICAgICBXRExOKCJNaXNzaW5nIGlucHV0IHRvIHhncmVwIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgVEsoIlhncmVwOiBzdHI6ICIrc3RyKyIgbW9kZTogIittb2RlKTsKKyAgICBzPXNpemVvZih0bXA9b2xkX2V4cGxvZGUocmVhZF9maWxlKHBpcGVfaWYsMCxQSVBFX01BWCksIlxuIikpOworICAgIFBJUEVfREVMRVRFKHBpcGVfb2YpOworICAgIGZvcihpPTA7aTxzO2krKykKKyAgICB7CisgICAgICAvLyBUSyh0bXBbaV0rIjwtPiIrc3RyKTsKKyAgICAgIGlmKHNpemVvZihyZWdleHAoKHsobW9kZSZYR1JFUF9JQ0FTRT9sb3dlcl9jYXNlKHRtcFtpXSk6dG1wW2ldKX0pLHN0cikpKQorICAgICAgeworCS8vIFRLKCJYZ3JlcDogbWF0Y2hlZCEiKTsKKwlpZighKG1vZGUmWEdSRVBfUkVWRVJUKSkKKwkgIGlmKHBpcGVfb3V0JiZwaXBlX29mKQorCSAgICB3cml0ZV9maWxlKHBpcGVfb2YsdG1wW2ldKyJcbiIpOworCSAgZWxzZQorCSAgICBXTE4odG1wW2ldKTsKKyAgICAgIH0KKyAgICAgIGVsc2UKKwlpZihtb2RlJlhHUkVQX1JFVkVSVCkKKwkgIGlmKHBpcGVfb3V0JiZwaXBlX29mKQorCSAgICB3cml0ZV9maWxlKHBpcGVfb2YsdG1wW2ldKyJcbiIpOworCSAgZWxzZQorCSAgICBXTE4odG1wW2ldKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYaGJlYXRzKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBvYmo7CisgIG9iamVjdCAqaGJlYXRpbmZvOworICBzdHJpbmcgdG1wLCBmaWxlOworICBpbnQgaSwgczsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFRLKCJYaGJlYXRzOiBzdHI6ICIrKHN0cj9zdHI6IihOVUxMKSIpKTsKKyAgaWYoIXBpcGVfb3V0KQorICB7CisgICAgVVNBR0UxKHN0ciwgInhoYihlYXRzKSBbc2VhcmNoIHBhdHRlcm5dIik7CisgICAgaWYoIXN0cikKKyAgICAgIHN0cj1STkFNRShjbG9uZXIpOworICAgIGVsc2UgaWYoIXJlZ2V4cCgoeyJkdW1teSJ9KSwgc3RyKSkKKyAgICB7CisgICAgICBXRExOKCJCYWQgcmVndWxhciBleHByZXNzaW9uIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKyAgZWxzZQorICB7CisgICAgVVNBR0UxKHN0ciwieGhiKGVhdHMpIik7CisgICAgaWYoc3RyJiZzdHIhPSIiKQorICAgIHsKKyAgICAgIFdETE4oIk1vcmUgYXJndW1lbnRzIHRoYW4gZXhwZWN0ZWQiKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICBzPXNpemVvZihoYmVhdGluZm89aGVhcnRfYmVhdF9pbmZvKCkpOworICBQSVBFX0RFTEVURShwaXBlX29mKTsKKyAgZm9yKGk9MDsgaTxzOyBpKyspCisgICAgaWYoaGJlYXRpbmZvW2ldJiZvYmplY3RwKGhiZWF0aW5mb1tpXSkpCisgICAgeworICAgICAgdG1wPU9iakZpbGUoaGJlYXRpbmZvW2ldKTsKKyAgICAgIGlmKHNpemVvZihyZWdleHAoKHt0bXB9KSwgc3RyKSkpCisJaWYocGlwZV9vdXQmJnBpcGVfb2YpCisJICB3cml0ZV9maWxlKHBpcGVfb2YsIHRtcCsiXG4iKTsKKwllbHNlCisJICBXTE4odG1wKTsKKyAgICB9CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWGhlYWQoc3RyaW5nIHN0cikKK3sKKyAgaW50IGxpbmVzOworICBzdHJpbmcgKnRtcCwgZmlsZTsKKworICBTRUNVUkUyKFRSVUUpOworICBUSygiWGhlYWQ6IHN0cjogIisoc3RyP3N0cjoiKE5VTEwpIikpOworICBpZighcGlwZV9pbikKKyAgeworICAgIFVTQUdFMihzdHIsICJ4aGVhZCA8LSM+IDxmaWxlPiIpOworICAgIGlmKHNzY2FuZihzdHIsIi0lZCAlcyIsbGluZXMsZmlsZSkhPTIpCisJcmV0dXJuIEZBTFNFOworICAgIGlmKCEoZmlsZT1YRmluZEZpbGUoZmlsZSkpKQorICAgICAgcmV0dXJuIEZBTFNFOworICB9CisgIGVsc2UKKyAgeworICAgIFVTQUdFMihzdHIsICJ4aGVhZCA8LSM+Iik7CisgICAgaWYoc3NjYW5mKHN0ciwiLSVkIixsaW5lcykhPTEpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYgKGZpbGVfc2l6ZShmaWxlPXBpcGVfaWYpPDApCisgICAgeworICAgICAgV0RMTigiTWlzc2luZyBpbnB1dCB0byB4aGVhZCIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIHRtcD1vbGRfZXhwbG9kZShyZWFkX2ZpbGUoZmlsZSwwLFBJUEVfTUFYKSwiXG4iKVswLi5saW5lcy0xXTsKKyAgaWYocGlwZV9pbiYmcGlwZV9pZj09UElQRV9GSUxFKQorICAgIHJtKFBJUEVfRklMRSk7CisgIGlmIChwaXBlX291dCYmcGlwZV9vZikKKyAgeworICAgIFBJUEVfREVMRVRFKHBpcGVfb2YpOworICAgIHdyaXRlX2ZpbGUocGlwZV9vZixpbXBsb2RlKHRtcCwiXG4iKSsiXG4iKTsKKyAgfQorICBlbHNlCisgICAgV0RMTihpbXBsb2RlKHRtcCwiXG4iKSk7CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWGhlbHAoc3RyaW5nIHN0cikKK3sKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UxKHN0ciwgInhoZShscCkiKTsKKyAgWE1vcmVGaWxlKFRPT0xfTUFOUEFHRSwgRkFMU0UpOworICByZXR1cm4gVFJVRTsKK30KKworaW50IFhpZHMoc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IG9iajsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMihzdHIsICJ4aWQocykgPG9iamVjdD4iKTsKKyAgVEsoIlhpZHM6IHN0cjogIisoc3RyP3N0cjoiKE5VTEwpIikpOworICBpZigob2JqPVhGaW5kT2JqKHN0cikpKQorICAgIFdMTigiVUlEPVwiIitnZXR1aWQob2JqKSsiXCIgLyBFVUlEPVwiIitnZXRldWlkKG9iaikrIlwiIik7CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWGluZm8oc3RyaW5nIHN0cikKK3sKKyAgb2JqZWN0IG9iajsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMihzdHIsICJ4aW5mKG8pIDxvYmplY3Q+Iik7CisgIFRLKCJYaW5mbzogc3RyOiAiKyhzdHI/c3RyOiIoTlVMTCkiKSk7CisgIGlmKChvYmo9WEZpbmRPYmooc3RyKSkpCisgIHsKKyAgICBpZihpc19wbGF5ZXIob2JqKSkKKyAgICB7CisgICAgICBXTE4oUGxheWVyV2hvKG9iaikpOworICAgICAgV0xOKFBsYXllck1haWwob2JqLCBGQUxTRSkpOworICAgICAgV0xOKFBsYXllcklQKG9iaiwgRkFMU0UpKTsKKyAgICAgIFdMTihQbGF5ZXJSYWNlKG9iaiwgRkFMU0UpKTsKKyAgICAgIFdMTihQbGF5ZXJEb21haW4ob2JqLCBGQUxTRSkpOworICAgICAgV0xOKFBsYXllclN0YXRzKG9iaiwgRkFMU0UpKTsKKyAgICAgIFdMTihQbGF5ZXJTbm9vcChvYmosIEZBTFNFKSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgIFdETE4oIlNvcnJ5LCB0aGlzIGlzIG5vdCBhIHBsYXllciIpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWGluaGVyaXQoc3RyaW5nIHN0cikKK3sKKyAgaW50IHM7CisgIG9iamVjdCBvYmo7CisgIHN0cmluZyAqc3RycywgKmlubGlzdDsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMihzdHIsICJ4aW5oKGVyaXQpIDxvYmplY3Q+IFtmdW5jdGlvbl0iKTsKKyAgVEsoIlhpbmhlcml0OiBzdHI6ICIrc3RyKTsKKyAgaWYoIShzdHJzPXN0cmlwX2V4cGxvZGUoc3RyLCAiICIpKSkKKyAgICByZXR1cm4gRkFMU0U7CisgIGlmKG9iaj1YRmluZE9iaihzdHJzWzBdKSkKKyAgeworICAgIGlubGlzdD1pbmhlcml0X2xpc3Qob2JqKTsKKyAgICBzPXNpemVvZihpbmxpc3QpOworICAgIHdoaWxlKHMtLSkKKyAgICB7CisgICAgICBpZihjYXRjaChjYWxsX290aGVyKGlubGlzdFtzXSwgIj8/PyIpKSkKKyAgICAgIHsKKwlXRExOKCJGYWlsZWQgdG8gbG9hZCBhbGwgaW5oZXJpdGFuY2Ugb2JqZWN0cyIpOworCXJldHVybiBUUlVFOworICAgICAgfQorICAgIH0KKyAgICBvYmo9ZmluZF9vYmplY3QoaW5saXN0WzBdKTsKKyAgICBQSVBFX0RFTEVURShwaXBlX29mKTsKKyAgICBpZihzaXplb2Yoc3Rycyk9PTEpCisgICAgICBJbmhlcml0YW5jZShvYmogLDAgLCIiKTsKKyAgICBlbHNlCisgICAgICBJbmhlcml0YW5jZShvYmosIHN0cnNbMV0sICIiKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworaW50IFhpbnZlbnRvcnkoc3RyaW5nIHN0cikKK3sKKyAgaW50IGksIHNob3J0OworICBvYmplY3QgaXRlbTsKKyAgbWl4ZWQgd2hvOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UxKHN0ciwgInhpIFstc10gW3BsYXllcl0iKTsKKyAgVEsoIlhpbnZlbnRvcnk6IHN0cjogIitzdHIpOworICBzaG9ydD0wOworICB3aG89Y2xvbmVyOworICBpZihzdHImJnN0ciE9IiIpCisgIHsKKyAgICBpZihzdHI9PSItcyIpCisgICAgeworICAgICAgc2hvcnQ9MTsKKyAgICAgIHdobz1jbG9uZXI7CisgICAgfQorICAgIGVsc2UgaWYoc3NjYW5mKHN0ciwiLXMgJXMiLHdobykpCisgICAgeworICAgICAgc2hvcnQ9MTsKKyAgICAgIHdobz1YRmluZE9iaih3aG8pOworICAgIH0KKyAgICBlbHNlIGlmKHNzY2FuZihzdHIsIiVzIix3aG8pKQorICAgIHsKKyAgICAgIHNob3J0PTA7CisgICAgICB3aG89WEZpbmRPYmood2hvKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgd2hvPWNsb25lcjsKKyAgfQorICBpZighd2hvKQorICAgIHJldHVybiBGQUxTRTsKKyAgUElQRV9ERUxFVEUocGlwZV9vZik7CisgIGlmKCEocGlwZV9vdXQmJnBpcGVfb2YpKQorICAgIFdMTih3aG8tPm5hbWUoV0VTU0VOKSsiIEludmVudG9yeToiKyhzaG9ydD8iIChzaG9ydCkiOiIiKSk7CisgIGlmKCFzaG9ydCkKKyAgICBpZihwaXBlX291dCYmcGlwZV9vZikKKyAgICAgIEZPUkFMTChpdGVtLCB3aG8pIFByaW50U2hvcnQoQVJJR0hUKCsraSsiLiAiLCA0LCAiICIpLCBpdGVtLCBwaXBlX29mKTsKKyAgICBlbHNlCisgICAgICBGT1JBTEwoaXRlbSwgd2hvKSBQcmludFNob3J0KEFSSUdIVCgrK2krIi4gIiwgNCwgIiAiKSwgaXRlbSk7CisgIGVsc2UKKyAgICBpZihwaXBlX291dCYmcGlwZV9vZikKKyAgICAgIEZPUkFMTChpdGVtLCB3aG8pIHdyaXRlX2ZpbGUocGlwZV9vZiwrK2krIi4gWyIrb2JqZWN0X25hbWUoaXRlbSkrIl1cbiIpOworICAgIGVsc2UKKyAgICAgIEZPUkFMTChpdGVtLCB3aG8pIFdMTigrK2krIi4gWyIrb2JqZWN0X25hbWUoaXRlbSkrIl0iKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYbGFnKHN0cmluZyBzdHIpCit7CisgIGludCBpOworICBmbG9hdCAqbGFnOworICBvYmplY3QgZGFlbW9uOworICBzdHJpbmcgbGFnczsKKworICBpZihmaWxlX3NpemUoTEFHX09fREFFTU9OKyIuYyIpPD0wKQorICB7CisgICAgV0xOKCJTb3JyeSwgbGFnLW8tZGFlbW9uIGlzIG1pc3NpbmchIik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgCisgIExBR19PX0RBRU1PTi0+TWFjaEhpbigpOworICBpZighKGRhZW1vbj1maW5kX29iamVjdChMQUdfT19EQUVNT04pKSkKKyAgICBsYWc9KHstMS4wLC0xLjAsLTEuMH0pOworICBlbHNlCisgICAgbGFnPShmbG9hdCAqKWRhZW1vbi0+cmVhZF9sYWdfZGF0YSgpOworICBsYWdzPSJMZXR6dGUgNjAgbWluOiAiOworICBpZihsYWdbMF0+PTAuMCkKKyAgeworICAgIGZvcihpPXJvdW5kKGxhZ1swXSktMTtpPj0wO2ktLSkKKyAgICAgIGxhZ3MrPSIjIjsKKyAgICBsYWdzKz0iICgiK3NwcmludGYoIiUuMWYiLGxhZ1swXSkrIiUpIjsKKyAgfQorICBlbHNlCisgICAgbGFncys9Ik4vQSI7CisgIGxhZ3MrPSJcbkxldHp0ZSAxNSBtaW46ICI7CisgIGlmKGxhZ1sxXT49MC4wKQorICB7CisgICAgZm9yKGk9cm91bmQobGFnWzFdKS0xO2k+PTA7aS0tKQorICAgICAgbGFncys9IiMiOworICAgIGxhZ3MrPSIgKCIrc3ByaW50ZigiJS4xZiIsbGFnWzFdKSsiJSkiOworICB9CisgIGVsc2UKKyAgICBsYWdzKz0iTi9BIjsKKyAgbGFncys9IlxuTGV0enRlIE1pbnV0ZTogIjsKKyAgaWYobGFnWzJdPj0wLjApCisgIHsKKyAgICBmb3IoaT1yb3VuZChsYWdbMl0pLTE7aT49MDtpLS0pCisgICAgICBsYWdzKz0iIyI7CisgICAgbGFncys9IiAoIitzcHJpbnRmKCIlLjFmIixsYWdbMl0pKyIlKSI7CisgIH0KKyAgZWxzZQorICAgIGxhZ3MrPSJOL0EiOworICBXTE4obGFncyk7CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWGxpZ2h0KHN0cmluZyBzdHIpCit7CisgIGludCBzLCBhZGRsaWdodDsKKworICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTEoc3RyLCAieGxpKGdodCkgW2xpZ2h0XSIpOworICBpZihzdHIpCisgIHsKKyAgICBpZighc3NjYW5mKHN0ciwgIiVkIiwgYWRkbGlnaHQpKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIHhsaWdodCs9YWRkbGlnaHQ7CisgICAgY2xvbmVyLT5BZGRJbnRMaWdodChhZGRsaWdodCk7CisgIH0KKyAgV0RMTigiQ3VycmVudCBsaWdodCBsZXZlbHM6ICIrVE9PTF9OQU1FKyI9Iit4bGlnaHQrIiwgcm9vbT0iKworICAgICAgIEVOVihjbG9uZXIpLT5RdWVyeUludExpZ2h0KCkpOworICByZXR1cm4gVFJVRTsKK30KKworaW50IFhsb2FkKHN0cmluZyBzdHIpCit7CisgIGludCBpLCBmOworICBvYmplY3Qgb2JqLCAqaW52LCB2cm9vbTsKKyAgc3RyaW5nIGZpbGUsIGVycmxvZywgZXJyb3IsICpzdHJzOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UyKHN0ciwgInhsb2EoZCkgPGZpbGVuYW1lPiIpOworICBpZighKGZpbGU9WEZpbmRGaWxlKHN0cikpKQorICAgIHJldHVybiBUUlVFOworICBlcnJsb2c9RVJSX0ZJTEU7CisgIGlmKGZpbGVfc2l6ZShlcnJsb2cpPjApCisgICAgcm0oZXJybG9nKTsKKyAgaWYob2JqPWZpbmRfb2JqZWN0KGZpbGUpKQorICB7CisgICAgaWYoY2F0Y2goY2FsbF9vdGhlcihWT0lELCAiPz8/IikpKQorICAgIHsKKyAgICAgIFdETE4oIkVycm9yOiBjYW5ub3QgZmluZCAiK1ZPSUQrIiB0byByZXNjdWUgcGxheWVycyIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGVsc2UKKyAgICAgIHZyb29tID0gZmluZF9vYmplY3QoVk9JRCk7CisgICAgaWYoaW52PWZpbHRlcihhbGxfaW52ZW50b3J5KG9iaiksICMnaXNfcGxheWVyLCBNRSkpLy8nCisgICAgICBmb3IoaT0wOyBpPHNpemVvZihpbnYpOyBpKyspCisJTW92ZU9iaihpbnZbaV0sIHZyb29tLCBUUlVFKTsKKyAgICBEZXN0cnVjdChvYmopOworICAgIFdMTigiVXBkYXRlIGFuZCBsb2FkOiAiK2ZpbGUpOworICB9CisgIGVsc2UKKyAgICBXTE4oIkxvYWQ6ICIrZmlsZSk7CisgIGlmKGVycm9yPWNhdGNoKGNhbGxfb3RoZXIoZmlsZSwgIj8/PyIpKSkKKyAgeworICAgIFcoIkVycm9yOiAiK2Vycm9yWzEuLl0pOworICAgIGlmKHZyb29tKQorICAgICAgdGVsbF9vYmplY3QodnJvb20sICIqKiogRmFpbGVkIHRvIGxvYWQgcm9vbS4gWW91IGFyZSBpbiB0aGUgdm9pZCFcbiIpOworICB9CisgIGVsc2UgaWYoaW52KQorICB7CisgICAgb2JqPWZpbmRfb2JqZWN0KGZpbGUpOworICAgIGZvcihpPTA7IGk8c2l6ZW9mKGludik7IGkrKykKKyAgICAgIGlmKGludltpXSkKKwlNb3ZlT2JqKGludltpXSwgb2JqLCBUUlVFKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworaW50IFhsb29rKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBvYmo7CisgIHN0cmluZyBzdDsKKyAgc3RyaW5nIGZpbGU7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTEoc3RyLCAieGxvbyhrKSBbb2JqZWN0XSIpOworICBUSygiWGxvb2s6IHN0cjogIitzdHIpOworICBQSVBFX0RFTEVURShwaXBlX29mKTsKKyAgZmlsZSA9IHBpcGVfb3V0JiZwaXBlX29mID8gcGlwZV9vZiA6ICIiOworICBpZihzdHImJnN0ciE9IiIpCisgIHsKKyAgICBpZigob2JqPVhGaW5kT2JqKHN0cikpKQorICAgICAgUHJpbnRPYmoob2JqLGZpbGUpOworICB9CisgIGVsc2UKKyAgeworICAgIG9iaj1FTlYoY2xvbmVyKTsKKyAgICBQcmludE9iaihvYmosZmlsZSk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYbHBjKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBvYmo7CisgIHN0cmluZyBmaWxlLCBlcnJvcjsKKyAgaW50ICpydTEsICpydTIsIHRpbWU7CisgIG1peGVkIHJlczsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMihzdHIsICJ4bHAoYykgPGxwYyBjb2RlPiIpOworICBmaWxlPUxQQ19GSUxFKyIuYyI7CisgIGlmKGZpbGVfc2l6ZShmaWxlKT4wKQorICAgIHJtKGZpbGUpOworICBpZihvYmo9ZmluZF9vYmplY3QoTFBDX0ZJTEUpKQorICAgIERlc3RydWN0KG9iaik7CisgIHdyaXRlX2ZpbGUoZmlsZSwKKyAgICAgICIjcHJhZ21hIG5vX3dhcm5fbWlzc2luZ19yZXR1cm4sc3Ryb25nX3R5cGVzLHdhcm5fZGVwcmVjYXRlZCxydHRfY2hlY2tzXG4iCisgICAgICAiI2luY2x1ZGUgPHByb3BlcnRpZXMuaD5cbiIKKyAgICAgICIjaW5jbHVkZSA8dGhpbmcvcHJvcGVydGllcy5oPlxuIgorICAgICAgIiNpbmNsdWRlIDxkZWZpbmVzLmg+XG4iCisgICAgICAiI2luY2x1ZGUgPHdpemxpc3QuaD5cbiIKKyAgICAgICIjaW5jbHVkZSA8bW92aW5nLmg+XG4iCisgICAgICAiI2luY2x1ZGUgXCIvc2VjdXJlL3dpemxldmVscy5oXCJcbiIKKyAgICAgICsoZmlsZV9zaXplKFBSSVZBVEVfSEVBREVSKT49MD8iI2luY2x1ZGUgXCIiK1BSSVZBVEVfSEVBREVSKyJcIlxuIjoiIikrCisgICAgICAib2JqZWN0IGdldChzdHJpbmcgc3RyKXtyZXR1cm4gcHJldmlvdXNfb2JqZWN0KCktPlhGaW5kT2JqKHN0cik7fVxuIisKKyAgICAgICJtaXhlZCBldmFsKG1peGVkIG1lLCBtaXhlZCBoZXJlKXsiK3N0cisifSIpOworICBpZihlcnJvcj1jYXRjaChvYmo9Y2xvbmVfb2JqZWN0KGZpbGUpKSkKKyAgICBXKCJFcnJvcjogIitlcnJvclsxLi4wXSk7CisgIGVsc2UKKyAgeworICAgIHJ1MT1ydXNhZ2UoKTsKKyAgICBlcnJvcj1jYXRjaChyZXM9KG1peGVkKW9iai0+ZXZhbChjbG9uZXIsIEVOVihjbG9uZXIpKSk7CisgICAgcnUyPXJ1c2FnZSgpOworICAgIGlmKGVycm9yKQorICAgICAgVygiRXJyb3I6ICIrZXJyb3JbMS4uXSk7CisgICAgZWxzZQorICAgIHsKKyAgICAgIHRpbWU9cnUyWzBdLXJ1MVswXStydTJbMV0tcnUxWzFdOworICAgICAgV0RMTigiRXZhbHVhdGlvbiB0aW1lOiAiKyh0aW1lPDAgPyAwIDogdGltZSkrIiBtcyIpOworICAgICAgV0xOKCJSZXN1bHQ6ICIrbWl4ZWRfdG9fc3RyaW5nKHJlcywgTUFYX1JFQ1VSU0lPTikpOworICAgICAgaWYob2JqZWN0cChyZXMpKQorICAgICAgICB2YXJpYWJsZVsicmVzdWx0Il0gPSByZXM7CisgICAgfQorICB9CisgIHJtKGZpbGUpOworICBpZihvYmopCisgICAgRGVzdHJ1Y3Qob2JqKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYbWFuKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyBtYW5wYWdlOworICBpbnQgaSwgZm91bmQ7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTIoc3RyLCAieG1hKG4pIDxtYW5wYWdlPiIpOworICBXKCJNYW46ICIpOworICBmb3IoaT0wLCBmb3VuZD0wOyBpPHNpemVvZihtYW5wYXRoKTsgaSsrKQorICB7CisgICAgbWFucGFnZT1tYW5wYXRoW2ldK3N0cjsKKyAgICBpZihmaWxlX3NpemUobWFucGFnZSk+PTApCisgICAgeworICAgICAgV0xOKG1hbnBhZ2UpOworICAgICAgWE1vcmVGaWxlKG1hbnBhZ2UsIEZBTFNFKTsKKyAgICAgIGZvdW5kPTE7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgaWYoIWZvdW5kKQorICAgIFdMTigiLSBubyBoZWxwIGF2YWlsYWJsZSAtIik7CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWG1vcmUoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nICphcmdzLCBmaWxlOworICBpbnQgbGluZTsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFRLKCJYbW9yZTogc3RyOiAiK3N0cik7CisgIGlmICghcGlwZV9pbikKKyAgeworICAgIFVTQUdFMihzdHIsICJ4bW9yKGUpIDxmaWxlbmFtZT4gW3N0YXJ0XSIpOworICAgIHN3aXRjaChzaXplb2YoYXJncz1zdHJpcF9leHBsb2RlKHN0ciwgIiAiKSkpCisgICAgeworICAgICAgY2FzZSAxOgorICAgICAgbW9yZW9mZnNldD0xOworICAgICAgYnJlYWs7CisgICAgICBjYXNlIDI6CisgICAgICBzc2NhbmYoYXJnc1sxXSwgIiVkIiwgbGluZSk7CisgICAgICBtb3Jlb2Zmc2V0PSBsaW5lPjAgPyBsaW5lIDogMTsKKyAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgaWYoZmlsZT1YRmluZEZpbGUoYXJnc1swXSkpCisgICAgICBYTW9yZUZpbGUoZmlsZSwgVFJVRSk7CisgIH0KKyAgZWxzZQorICB7CisgICAgaWYoZmlsZV9zaXplKHBpcGVfaWYpPDApCisgICAgeworICAgICAgV0RMTigiTWlzc2luZyBpbnB1dCB0byB4bW9yZSIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIGlmICghc3RyfHxzdHI9PSIiKQorICAgICAgbGluZT0xOworICAgIGVsc2UgaWYgKHNzY2FuZihzdHIsICIlZCIsIGxpbmUpIT0xKQorICAgICAgVVNBR0UzKCJ4bW9yKGUpIFtzdGFydF0iKTsKKyAgICBtb3Jlb2Zmc2V0PSBsaW5lPjAgPyBsaW5lIDogMTsKKyAgICBYTW9yZUZpbGUocGlwZV9pZiwgVFJVRSk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYbW92ZShzdHJpbmcgc3RyKQoreworICBvYmplY3Qgb2JqMSwgb2JqMjsKKyAgc3RyaW5nIHdoYXQsIGludG87CisgIAorICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTIoc3RyLCAieG1vdihlKSA8b2JqZWN0PiBpbnRvIDxvYmplY3Q+Iik7CisgIGlmKChzc2NhbmYoc3RyLCAiJXMgaW50byAlcyIsIHdoYXQsIGludG8pPT0yKSYmCisgICAgIChvYmoxPVhGaW5kT2JqKHdoYXQpKSYmKG9iajI9WEZpbmRPYmooaW50bykpKQorICAgIE1vdmVPYmoob2JqMSwgb2JqMiwgRkFMU0UpOworICByZXR1cm4gVFJVRTsKK30KKworaW50IFhtc2coc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIHRtcDsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFRLKCJYbXNnOiBzdHI6ICIrc3RyKTsKKyAgVVNBR0UxKHN0ciwgInhtcyhnKSBbdG8gPG9iamVjdD58YWxsXSIpOworICBpZighc3RyfHxzdHI9PSIiKQorICB7CisgICAgV0RMTigiU2VuZCBtZXNzYWdlIGludG8gcm9vbSIpOworICAgIHNheSgiTWVzc2FnZSBmcm9tICIrQ1JOQU1FKGNsb25lcikrIjpcbiIpOworICAgIGlmKHBpcGVfaW4mJnBpcGVfaWYpCisgICAgICBzYXkocmVhZF9maWxlKHBpcGVfaWYsMCxQSVBFX01BWCkpOworICAgIGVsc2UKKyAgICB7CisgICAgICBXRExOKCJFbmQgbWVzc2FnZSB3aXRoIFwiLlwiIG9yIFwiKipcIiIpOworICAgICAgaW5wdXRfdG8oIlhNc2dTYXkiKTsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgZWxzZSBpZihzc2NhbmYoc3RyLCAidG8gJXMiLCB0bXApKQorICB7CisgICAgaWYobXNndG89WEZpbmRPYmoodG1wKSkKKyAgICB7CisgICAgICBQcmludFNob3J0KCJTZW5kIG1lc3NhZ2UgdG86ICIsIG1zZ3RvKTsKKyAgICAgIHRlbGxfb2JqZWN0KG1zZ3RvLCAiTWVzc2FnZSBmcm9tICIrQ1JOQU1FKGNsb25lcikrIiB0byB5b3U6XG4iKTsKKyAgICAgIGlmKHBpcGVfaW4mJnBpcGVfaWYpCisJdGVsbF9vYmplY3QobXNndG8scmVhZF9maWxlKHBpcGVfaWYsMCxQSVBFX01BWCkpOworICAgICAgZWxzZQorICAgICAgeworCVdETE4oIkVuZCBtZXNzYWdlIHdpdGggXCIuXCIgb3IgXCIqKlwiIik7CisJaW5wdXRfdG8oIlhNc2dUZWxsIik7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBUUlVFOworICB9CisgIGVsc2UgaWYoc3RyPT0iYWxsIikKKyAgeworICAgIFdETE4oIlNlbmQgbWVzc2FnZSB0byBhbGwgcGxheWVycyIpOworICAgIHNob3V0KCJNZXNzYWdlIGZyb20gIitDUk5BTUUoY2xvbmVyKSsiIHRvIGFsbDpcbiIpOworICAgIGlmKHBpcGVfaW4mJnBpcGVfaWYpCisgICAgICBzaG91dChyZWFkX2ZpbGUocGlwZV9pZiwwLFBJUEVfTUFYKSk7CisgICAgZWxzZQorICAgIHsKKyAgICAgIFdETE4oIkVuZCBtZXNzYWdlIHdpdGggXCIuXCIgb3IgXCIqKlwiIik7CisgICAgICBpbnB1dF90bygiWE1zZ1Nob3V0Iik7CisgICAgfQorICAgIHJldHVybiBUUlVFOworICB9CisgIHJldHVybiBGQUxTRTsKK30KKworaW50IFhtdHAoc3RyaW5nIHN0cikKK3sKKyAgaW50IHM7CisgIHN0cmluZyAqc3Rycywgb3B0LCBkaXIsIGZpbGU7CisKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UyKHN0ciwgInhtdChwKSBbb3B0aW9uc10gPGRpcmVjdG9yeT4gPGZpbGVuYW1lPiIpOworICBzPXNpemVvZihzdHJzPW9sZF9leHBsb2RlKHN0ciwgIiAiKSk7CisgIGlmKHM8MikKKyAgICByZXR1cm4gRkFMU0U7CisgIGVsc2UgaWYocz09MikKKyAgICBvcHQ9IiI7CisgIGVsc2UKKyAgICBvcHQ9aW1wbG9kZShzdHJzWzAuLnMtM10sICIgIik7CisgIGlmKCEoZGlyPSIvIisoc3RyaW5nKU1BU1RFUi0+dmFsaWRfcmVhZChzdHJzW3MtMl0sIGdldGV1aWQoKSwKKwkJCQkJICAiZ2V0X2RpciIsIE1FKSkpIHsKKyAgICBXRExOKCJObyBwZXJtaXNzaW9uIHRvIG9wZW4gZGlyZWN0b3J5IGZvciByZWFkaW5nIik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgaWYoIShmaWxlPSIvIisoc3RyaW5nKU1BU1RFUi0+dmFsaWRfd3JpdGUoc3Ryc1tzLTFdLCBnZXRldWlkKCksCisJCQkJCSAgICAid3JpdGVfZmlsZSIsIE1FKSkpIHsKKyAgICBXRExOKCJObyBwZXJtaXNzaW9uIHRvIG9wZW4gc2NyaXB0IGZpbGUgZm9yIHdyaXRpbmciKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBpZihmaWxlX3NpemUoZGlyKSE9LTIgfHwgZmlsZV9zaXplKGZpbGUpPT0tMikKKyAgICByZXR1cm4gRkFMU0U7CisgIFhtdHBTY3JpcHQoZGlyLCBmaWxlLCBvcHQpOworICBXRExOKCJEb25lIik7CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWHByb2Moc3RyaW5nIHN0cikKK3sKKyAgaW50IHM7CisgIHN0cmluZyAqc3RyczsKKworICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTEoc3RyLCAieHByb2MgWy1jXSBbLWxdIFstbV0gWy11XSBbLXZdIik7CisKKyAgaWYoZmlsZV9zaXplKFRPT0xfUEFUSCsiL3Byb2MiKSE9LTIpCisgIHsKKyAgICBXTE4oIlNvcnJ5LCBubyAvcHJvYyBpbmZvcm1hdGlvbiBhdmFpbGFibGUhIik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgCisgIGlmKCFzdHJ8fHN0cj09IiJ8fCEocz1zaXplb2Yoc3Rycz1vbGRfZXhwbG9kZShzdHIsICIgIikpKSkKKyAgeworICAgIFdMTigiTG9hZCBhdmVyYWdlczoiKTsKKyAgICBjYXQoVE9PTF9QQVRIKyIvcHJvYy9sb2FkYXZnIik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKyAgCisgIHdoaWxlKHM9c2l6ZW9mKHN0cnMpKQorICB7CisgICAgc3dpdGNoKHN0cnNbMF0pCisgICAgeworICAgICAgY2FzZSAiLWMiOgorICAgICAgV0xOKCJDUFUgaW5mbzoiKTsKKyAgICAgIGNhdChUT09MX1BBVEgrIi9wcm9jL2NwdWluZm8iKTsKKyAgICAgIGJyZWFrOworICAgICAgY2FzZSAiLWwiOgorICAgICAgV0xOKCJMb2FkIGF2ZXJhZ2VzOiIpOworICAgICAgY2F0KFRPT0xfUEFUSCsiL3Byb2MvbG9hZGF2ZyIpOworICAgICAgYnJlYWs7CisgICAgICBjYXNlICItbSI6CisgICAgICBXTE4oIk1lbW9yeSB1c2FnZToiKTsKKyAgICAgIGNhdChUT09MX1BBVEgrIi9wcm9jL21lbWluZm8iKTsKKyAgICAgIGJyZWFrOworICAgICAgY2FzZSAiLXUiOgorICAgICAgV0xOKCJVcHRpbWU6Iik7CisgICAgICBjYXQoVE9PTF9QQVRIKyIvcHJvYy91cHRpbWUiKTsKKyAgICAgIGJyZWFrOworICAgICAgY2FzZSAiLXYiOgorICAgICAgV0xOKCJWZXJzaW9uOiIpOworICAgICAgY2F0KFRPT0xfUEFUSCsiL3Byb2MvdmVyc2lvbiIpOworICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgV0xOKCJVbmtub3duIG9wdGlvbjogIitzdHJzWzBdKTsKKyAgICB9CisgICAgc3Rycz1zdHJzWzEuLl07CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYcHJvZihzdHJpbmcgc3RyKQoreworICBzdHJpbmcgKmZ1bmNzLCBpbmgsIHRtcDsKKyAgbWl4ZWQgKmRhdGEsICpkOworICBtYXBwaW5nIHhwcjsKKyAgb2JqZWN0IG9iajsKKyAgaW50IGksIHJuOworCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMihzdHIsICJ4cHJvZiA8PC1jPnw8LUM+IDxmaWxlPj58PG9iamVjdD4iKTsKKyAgaWYoc3RyWzAuLjJdPT0iLWMgInx8c3RyWzAuLjJdPT0iLUMgIikKKyAgeworICAgIHJuPShzdHJbMV09PSdDJyk7CisgICAgaWYoc3RyPVhGaW5kRmlsZShzdHJbMy4uXSkpCisgICAgeworICAgICAgaW5oPXN0cj1zdHJbMC4uPDNdOworICAgICAgaWYob2JqPWZpbmRfb2JqZWN0KGluaCkpCisJRGVzdHJ1Y3Qob2JqKTsKKyAgICAgIGlmKGNhdGNoKGNhbGxfb3RoZXIoaW5oLCI/Pz8iKSkpCisJcmV0dXJuIFRSVUU7CisgICAgICBvYmo9ZmluZF9vYmplY3QoaW5oKTsKKyAgICAgIGlmKHJuKQorICAgICAgeworCWluaCs9Ii54cHJvZi5jIjsKKwlybShpbmgpOworCXN0cis9Ii5jIjsKKwlyZW5hbWUoc3RyLCBpbmgpOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworCXN0cj1YUFJPRl9GSUxFOworCXJtKHN0cik7CisgICAgICB9CisgICAgICB0bXA9ImluaGVyaXQgXCIiK2luaCsiXCI7XG4jaW5jbHVkZSBcIiIrWFBST0ZfTUFDUk8rIlwiXG4iOworICAgICAgZnVuY3M9bV9pbmRpY2VzKG1rbWFwcGluZyhmdW5jdGlvbmxpc3Qob2JqLCAweDA4MDAwMDAxKSkpLSh7Il9fSU5JVCJ9KTsKKyAgICAgIGZvcihpPXNpemVvZihmdW5jcyk7IGktLTspCisJdG1wKz0iRigiK2Z1bmNzW2ldKyIsXCIiK2Z1bmNzW2ldKyJcIiwiKworCSAgIihBMCxBMSxBMixBMyxBNCxBNSxBNixBNyxBOCxBOSkpXG4iOworICAgICAgd3JpdGVfZmlsZShzdHIsIHRtcCk7CisgICAgICBXRExOKCJEb25lIik7CisgICAgfQorICB9CisgIGVsc2UgaWYob2JqPVhGaW5kT2JqKHN0cikpCisgIHsKKyAgICBpZih4cHI9KG1hcHBpbmcpb2JqLT5fX3F1ZXJ5X3hwcm9mX2RhdGFfXygpKQorICAgIHsKKyAgICAgIGZ1bmNzPW1faW5kaWNlcyh4cHIpOworICAgICAgZGF0YT1tX3ZhbHVlcyh4cHIpOworICAgICAgcm0oVE1QX0ZJTEUpOworICAgICAgc3RyPSJFdmFsdWF0aW9uIGNvc3QgcGVyIGZ1bmN0aW9uOlxuTkFNRQkJCSAgICIrCisJIiBDQUxMUyB8ICBUT1QuRVhDTC4gIFRPVC5JTkNMLiB8IFJFTC5FWENMLiBSRUwuSU5DTC5cbiI7CisgICAgICBmb3IoaT1zaXplb2YoZnVuY3MpOyBpLS07KQorICAgICAgeworCWlmKGQ9ZGF0YVtpXSkgeworCSAgZnVuY3NbaV09QUxFRlQoIiIrZnVuY3NbaV0rIiAiLDI1LCIuIikrQVJJR0hUKCIgIitkWzBdLCA2LCIuIikrIiB8ICIrCisJICAgIEFSSUdIVCgiICIrZFsxXSwxMCwiLiIpCSsiICIrQVJJR0hUKCIgIitkWzNdLDEwLCIuIikrIiB8ICIrCisJICAgIEFSSUdIVCgiICIrZFsxXS9kWzBdLDksIi4iKSArIiAiK0FSSUdIVCgiICIrZFszXS9kWzBdLDksIi4iKTsKKwl9CisgICAgICB9CisgICAgICBzdHIrPWltcGxvZGUoc29ydF9hcnJheShmdW5jcywgInN0cmluZ19jb21wYXJlIiwgTUUpLCJcbiIpKyJcbiI7CisgICAgICB3cml0ZV9maWxlKFRNUF9GSUxFLHN0cik7CisgICAgICBzdHI9IlxuRWxhcHNlZCB0aW1lIHBlciBmdW5jdGlvbjpcbk5BTUUJCQkgICIrCisJIiBDQUxMUyB8ICBUT1QuRVhDTC4gIFRPVC5JTkNMLiB8IFJFTC5FWENMLiBSRUwuSU5DTC5cbiI7CisgICAgICBmdW5jcz1tX2luZGljZXMoeHByKTsKKyAgICAgIGZvcihpPXNpemVvZihmdW5jcyk7IGktLTspCisgICAgICB7CisJaWYoZD1kYXRhW2ldKQorCXsKKwkgIGZ1bmNzW2ldPUFMRUZUKCIiK2Z1bmNzW2ldKyIgIiwyNSwiLiIpK0FSSUdIVCgiICIrZFswXSwgNiwiLiIpKyIgfCAiKworCSAgICBBUklHSFQoIiAiKyhkWzJdKzUpLzEwKyJtcyIsMTAsIi4iKSsiICIrCisJICAgIEFSSUdIVCgiICIrKGRbNF0rNSkvMTArIm1zIiwxMCwiLiIpKyIgfCAiKworCSAgICBBUklHSFQoIiAiK2RbMl0vZFswXSsidXMiLDksIi4iKSsiICIrCisJICAgIEFSSUdIVCgiICIrZFs0XS9kWzBdKyJ1cyIsOSwiLiIpOworCX0KKyAgICAgIH0KKyAgICAgIHN0cis9aW1wbG9kZShzb3J0X2FycmF5KGZ1bmNzLCAic3RyaW5nX2NvbXBhcmUiLCBNRSksIlxuIikrIlxuIjsKKyAgICAgIHdyaXRlX2ZpbGUoVE1QX0ZJTEUsc3RyKTsKKyAgICAgIFhNb3JlRmlsZShUTVBfRklMRSwgRkFMU0UpOworICAgIH0KKyAgICBlbHNlCisgICAgICBXRExOKCJObyBwcm9maWxpbmcgaW5mb3JtYXRpb24gYXZhaWxhYmxlIik7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYcHJvcHMoc3RyaW5nIHN0cikKK3sKKyAgaW50IGksIHMsIGZsYWc7CisgIG9iamVjdCBvYmo7CisgIHN0cmluZyAqdG1wOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UyKHN0ciwgInhwcm9wKHMpIFstZnwtbV0gPG9iamVjdD4iKTsKKyAgVEsoIlhwcm9wczogc3RyOiAiK3N0cik7CisgIHRtcD1vbGRfZXhwbG9kZShzdHIsIiAiKTsKKyAgc3dpdGNoKHRtcFswXSkKKyAgeworICAgIGNhc2UgIi1mIjoKKyAgICB7CisgICAgICBmbGFnID0gMTsKKyAgICAgIHRtcD10bXBbMS4uXTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlICItbSI6CisgICAgeworICAgICAgZmxhZyA9IDI7CisgICAgICB0bXA9dG1wWzEuLl07CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgc3RyPWltcGxvZGUodG1wLCIgIik7CisgIGlmKChvYmo9WEZpbmRPYmooc3RyKSkpCisgICAgRHVtcFByb3BlcnRpZXMob2JqLGZsYWcpOworICByZXR1cm4gVFJVRTsKK30KKworaW50IFhxdWl0KHN0cmluZyBzdHIpCit7CisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMShzdHIsICJ4cXUoaXQpIik7CisgIHN0cj1vYmplY3RfbmFtZShFTlYoY2xvbmVyKSk7CisgIGlmKG1lbWJlcihzdHIsICcjJyk8MCkKKyAgICBjbG9uZXItPnNldF9ob21lKHN0cik7CisgIGNsb25lci0+cXVpdCgpOworICByZXR1cm4gVFJVRTsKK30KKworaW50IFhzY2FuKHN0cmluZyBzdHIpCit7ICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UxKHN0ciwgInhzYyhhbikiKTsKKyAgVygiRGVzdHJ1Y3RlZCB2YXJpYWJsZShzKTogIik7CisgIHN0cmluZyogb2xkdmFycz1tX2luZGljZXModmFyaWFibGUpOworICBWYXJDaGVjayhGQUxTRSk7CisgIHN0cmluZyogZGVzdmFycz1vbGR2YXJzLW1faW5kaWNlcyh2YXJpYWJsZSk7CisgIGRlc3ZhcnMgPSBtYXAoZGVzdmFycywgZnVuY3Rpb24gc3RyaW5nIChzdHJpbmcgaykKKyAgICAgIHtyZXR1cm4gIiQiK2s7fSApOworICBXKENvdW50VXAoZGVzdmFycykpOworICBXTE4oIiIpOworICByZXR1cm4gVFJVRTsKK30KKworaW50IFhzZXQoc3RyaW5nIHN0cikKK3sKKyAgaW50IGk7CisgIG1peGVkIG9iajsKKyAgc3RyaW5nIG5hbWUsIHRtcDsKKyAgCisgIFNFQ1VSRTIoVFJVRSk7CisgIFVTQUdFMShzdHIsICJ4c2UodCkgWyQ8bmFtZT49PG9iamVjdD5dIik7CisgIGlmKHN0cikgeworICAgIGlmKG1lbWJlcigoeyIkbWUiLCIkbSIsIiRoZXJlIiwiJGgifSksc3RyKSE9LTEpCisgICAgICBXRExOKCJTb3JyeSwgdGhpcyBpcyBhIHJlc2VydmVkIHZhcmlhYmxlIFsiK3N0cisiXSIpOworICAgIGVsc2UgaWYoc3NjYW5mKHN0ciwgIiQlcz0lcyIsIG5hbWUsIHRtcCkpCisgICAgeworICAgICAgaWYob2JqPVhGaW5kT2JqKHRtcCkpCisgICAgICB7CisgICAgICAgIHZhcmlhYmxlW25hbWVdID0gb2JqOworICAgICAgICBXTE4oIiAkIituYW1lKyI9IitPYmpGaWxlKG9iaikpOworICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICByZXR1cm4gRkFMU0U7CisgIH0KKyAgZWxzZQorICB7CisgICAgVmFyQ2hlY2soRkFMU0UpOworICAgIFdMTigiQ3VycmVudCBzZXR0aW5nczoiKTsKKyAgICBmb3JlYWNoKHN0cmluZyBrZXksIG1peGVkIHZhbCA6IHZhcmlhYmxlKQorICAgIHsKKyAgICAgIGlmICh2YWwpCisgICAgICAgIFdMTigiICQiK2tleSsiPSIrT2JqRmlsZSh2YWwpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgbV9kZWxldGUodmFyaWFibGUsIGtleSk7CisgICAgfQorICAgIFdMTigiICRtZT0iK09iakZpbGUoY2xvbmVyKSk7CisgICAgV0xOKCIgJGhlcmU9IitPYmpGaWxlKEVOVihjbG9uZXIpKSk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYc2goc3RyaW5nIHN0cikKK3sKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UxKHN0ciwgInhzaCA8ZmlsZW5hbWU+Iik7CisgIGlmKHNjcmlwdGxpbmUpCisgIHsKKyAgICBXRExOKCJDYW5ub3QgZXhlY3V0ZSBhbm90aGVyIHNjcmlwdCBmaWxlIHVudGlsIGxhc3QgZXhlY3V0aW9uIGhhcyBlbmRlZCIpOworICAgIHJldHVybiBUUlVFOworICB9CisgIGlmKCEoc3RyPVhGaW5kRmlsZShzdHIpKSkKKyAgICByZXR1cm4gVFJVRTsKKyAgc3RyPXJlYWRfZmlsZShzdHIsIDEsIDEwMDApOworICBpZighKHNjcmlwdGxpbmU9b2xkX2V4cGxvZGUoc3RyLCAiXG4iKSkpCisgIHsKKyAgICBXRExOKCJCYWQgc2NyaXB0IGZpbGUiKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorICBzY3JpcHRzaXplPXNpemVvZihzY3JpcHRsaW5lKTsKKyAgWEV4ZWNGaWxlKE5VTEwpOworICByZXR1cm4gVFJVRTsKK30KKworaW50IFhzb3J0KHN0cmluZyBzdHIpCit7CisgIHN0cmluZyAqdG1wLGZpbGU7CisgIGludCBzLHJldmVyc2U7CisKKyAgU0VDVVJFMihUUlVFKTsKKyAgVEsoIlhzb3J0OiBzdHI6ICIrc3RyKTsKKyAgaWYoIXBpcGVfaW4pCisgIHsKKyAgICBVU0FHRTIoc3RyLCAieHNvKHJ0KSBbLXJdIFtmaWxlXSIpOworICAgIGlmKCEodG1wPW9sZF9leHBsb2RlKHN0ciwgIiAiKSl8fChzPXNpemVvZih0bXApKT4yKQorICAgICAgcmV0dXJuIEZBTFNFOworICAgIGlmKHRtcFswXT09Ii1yIikKKyAgICAgIGlmKHM9PTEpCisJcmV0dXJuIEZBTFNFOworICAgICAgZWxzZQorICAgICAgeworCXJldmVyc2U9VFJVRTsKKwl0bXA9dG1wWzEuLl07CisgICAgICB9CisgICAgZWxzZSBpZihzPjEpCisgICAgICByZXR1cm4gRkFMU0U7CisgICAgaWYoIShmaWxlPVhGaW5kRmlsZSh0bXBbMF0pKSkKKyAgICB7CisgICAgICBXRExOKCJDYW4ndCBmaW5kIGZpbGUiKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBpZihzdHImJnN0ciE9IiIpCisgICAgICBpZihzdHI9PSItciIpCisJcmV2ZXJzZT1UUlVFOworICAgICAgZWxzZQorCVVTQUdFMygieHNvKHJ0KSBbLXJdIik7CisgICAgaWYgKGZpbGVfc2l6ZShmaWxlPXBpcGVfaWYpPDApCisgICAgeworICAgICAgV0RMTigiTWlzc2luZyBpbnB1dCB0byB4c29ydCIpOworICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICB9CisgIHRtcD1vbGRfZXhwbG9kZShyZWFkX2ZpbGUoZmlsZSwwLFBJUEVfTUFYKSwiXG4iKTsKKyAgaWYocGlwZV9pbiYmcGlwZV9pZj09UElQRV9GSUxFKQorICAgIHJtKFBJUEVfRklMRSk7CisgIHRtcD1zb3J0X2FycmF5KHRtcCxyZXZlcnNlPyMnPDojJz4pOworICAgIGlmIChwaXBlX291dCYmcGlwZV9vZikKKyAgICAgIHdyaXRlX2ZpbGUocGlwZV9vZixpbXBsb2RlKHRtcCwiXG4iKSsiXG4iKTsKKyAgICBlbHNlCisgICAgICBXRExOKGltcGxvZGUodG1wLCJcbiIpKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYdGFpbChzdHJpbmcgc3RyKQoreworICBzdHJpbmcgKnRtcCxmaWxlLHNpZ247CisgIGludCBsaW5lczsKKworICBpZiAoIXN0cikgeworICAgIFdETE4oIk1pc3NpbmcgaW5wdXQgdG8geHRhaWwiKTsKKyAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIHNpZ249Ii0iOworICBsaW5lcz0xMDsKKyAgU0VDVVJFMihUUlVFKTsKKyAgVEsoIlh0YWlsOiBzdHI6ICIrc3RyKTsKKyAgaWYoIXBpcGVfaW4pCisgIHsKKyAgICBpZihzc2NhbmYoc3RyLCItJWQgJXMiLGxpbmVzLGZpbGUpPT0yKQorICAgICAgc2lnbj0iLSI7CisgICAgZWxzZSBpZihzc2NhbmYoc3RyLCIrJWQgJXMiLGxpbmVzLGZpbGUpPT0yKQorICAgICAgc2lnbj0iKyI7CisgICAgZWxzZQorICAgICAgZmlsZT1zdHI7CisKKyAgICBpZighKGZpbGU9WEZpbmRGaWxlKGZpbGUpKSkKKyAgICB7CisgICAgICBXRExOKCJDYW4ndCBmaW5kIGZpbGUiKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBpZihzc2NhbmYoc3RyLCItJWQiLGxpbmVzKT09MSkKKyAgICAgIHNpZ249Ii0iOworICAgIGVsc2UgaWYoc3NjYW5mKHN0ciwiKyVkIixsaW5lcyk9PTEpCisgICAgICBzaWduPSIrIjsKKyAgICBpZiAoZmlsZV9zaXplKGZpbGU9cGlwZV9pZik8MCkKKyAgICB7CisgICAgICBXRExOKCJNaXNzaW5nIGlucHV0IHRvIHh0YWlsIik7CisgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgIH0KKworICBpZihzaWduPT0iLSIpCisgIHsKKyAgICBpZighbGluZXMpCisgICAgICByZXR1cm4gVFJVRTsKKyAgfQorCisgIGlmKGZpbGVfc2l6ZShmaWxlKT41MDAwMCkKKyAgeworICAgIFdETE4oIkZpbGUgdG9vIGxhcmdlIik7CisgICAgcmV0dXJuIFRSVUU7CisgIH0KKworICBpZihzaWduPT0iKyIpCisgICAgdG1wPW9sZF9leHBsb2RlKHJlYWRfZmlsZShmaWxlLDAsUElQRV9NQVgpLCJcbiIpW2xpbmVzLi5dOworICBlbHNlCisgICAgdG1wPW9sZF9leHBsb2RlKHJlYWRfZmlsZShmaWxlLDAsUElQRV9NQVgpLCJcbiIpWzxsaW5lcy4uXTsKKyAgaWYocGlwZV9pbiYmcGlwZV9pZj09UElQRV9GSUxFKQorICAgIHJtKFBJUEVfRklMRSk7CisgIGlmIChwaXBlX291dCYmcGlwZV9vZikKKyAgICB3cml0ZV9maWxlKHBpcGVfb2YsaW1wbG9kZSh0bXAsIlxuIikrIlxuIik7CisgIGVsc2UKKyAgICBXTE4oaW1wbG9kZSh0bXAsIlxuIikpOworICByZXR1cm4gVFJVRTsKK30KKworaW50IFh0b29sKHN0cmluZyBzdHIpCit7CisgIGludCBtOworICBzdHJpbmcgdG1wOworICBvYmplY3Qgb2JqOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVEsoIlh0b29sOiBzdHI6ICIrc3RyKTsKKyAgVVNBR0UxKHN0ciwgInh0byhvbCkgW3VwZGF0ZXxmaXJzdD08b258b2ZmPnxwcm90ZWN0PTxvbnxvZmY+fCIrCisJICJpbnZjaGVjaz08b258b2ZmPnxcbiIrCisJICJcdFx0dmFyY2hlY2s9PG9ufG9mZj58c2NhbmNoaz08b258b2ZmPnxzaG9ydD08b258b2ZmPnxcbiIrCisJICJcdFx0ZWNobz08b258b2ZmPnxtb3JlPTxhbW91bnQ+fGtpbGx8bmV3c3xzYXZlfGxvYWR8cmVzZXRdIik7CisgIGlmKHN0ciYmc3RyIT0iIikKKyAgeworICAgIGlmKHNzY2FuZihzdHIsICJtb3JlPSVkIiwgbSkpCisgICAgeworICAgICAgaWYobTw1KQorCVdETE4oIlNvcnJ5LCBhbW91bnQgb2YgbGluZXMgc2hvdWxkIGJlIG1vcmUgdGhlbiA1Iik7CisgICAgICBlbHNlCisgICAgICB7CisJV0RMTigiU2V0dGluZyBhbW91bnQgb2YgZGlzcGxheWVkIGxpbmVzIHRvICIrbSk7CisJbW9yZWxpbmVzPW07CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgIHN3aXRjaChzdHIpCisgICAgICB7CisJY2FzZSAidXBkYXRlIjoKKwlpZihvYmo9ZmluZF9vYmplY3QoVE9PTF9QQVRIKSkKKwkgIERlc3RydWN0KG9iaik7CisJaWYoY2F0Y2gob2JqPWNsb25lX29iamVjdChUT09MX1BBVEgpKSkKKwkgIFdMTigiVXBkYXRpbmcgIitUT09MX1RJVExFKyIgZmFpbGVkISIpOworCWVsc2UKKwkgIG9iai0+dXBkYXRlX3Rvb2woQVVUT0xPQURfQVJHUywgY2xvbmVyKTsKKwlyZXR1cm4gVFJVRTsKKwlicmVhazsKKwljYXNlICJmaXJzdD1vbiI6CisJTU9ERV9PTihNT0RFX0ZJUlNUKTsKKwltb3ZlKGNsb25lcik7CisJV0RMTigiQXV0b21hdGljIG1vdmluZyBpbnRvIHBvbGUgcG9zaXRpb24gb2YgaW52ZW50b3J5IHR1cm5lZCBvbiIpOworCWJyZWFrOworCWNhc2UgImZpcnN0PW9mZiI6CisJTU9ERV9PRkYoTU9ERV9GSVJTVCk7CisJV0RMTigiQXV0b21hdGljIG1vdmluZyBpbnRvIHBvbGUgcG9zaXRpb24gb2YgaW52ZW50b3J5IHR1cm5lZCBvZmYiKTsKKwlicmVhazsKKwljYXNlICJwcm90ZWN0PW9uIjoKKwlNT0RFX09OKE1PREVfUFJPVEVDVCk7CisJV0RMTigiUHJvdGVjdGlvbiBmcm9tIGZvcmNlcyBhbmQgaWxsZWdhbCBtb3ZlcyB0dXJuZWQgb24iKTsKKwlicmVhazsKKwljYXNlICJwcm90ZWN0PW9mZiI6CisJTU9ERV9PRkYoTU9ERV9QUk9URUNUKTsKKwlXRExOKCJQcm90ZWN0aW9uIGZyb20gZm9yY2VzIGFuZCBpbGxlZ2FsIG1vdmVzIHR1cm5lZCBvZmYiKTsKKwlicmVhazsKKwljYXNlICJpbnZjaGVjaz1vbiI6CisJTU9ERV9PTihNT0RFX0lOVkNIRUNLKTsKKwlXRExOKCJBdXRvbWF0aWMgY2hlY2tpbmcgZm9yIG5ldyBvYmplY3RzIGluIGludmVudG9yeSB0dXJuZWQgb24iKTsKKwlicmVhazsKKwljYXNlICJpbnZjaGVjaz1vZmYiOgorCU1PREVfT0ZGKE1PREVfSU5WQ0hFQ0spOworCVdETE4oIkF1dG9tYXRpYyBjaGVja2luZyBmb3IgbmV3IG9iamVjdHMgaW4gaW52ZW50b3J5IHR1cm5lZCBvZmYiKTsKKwlicmVhazsKKwljYXNlICJ2YXJjaGVjaz1vbiI6CisJTU9ERV9PTihNT0RFX1ZBUkNIRUNLKTsKKwlWYXJDaGVjayhUUlVFKTsKKwlXRExOKCJBdXRvbWF0aWMgdmFyaWFibGUgY2hlY2tpbmcgdHVybmVkIG9uIik7CisJYnJlYWs7CisJY2FzZSAidmFyY2hlY2s9b2ZmIjoKKwlNT0RFX09GRihNT0RFX1ZBUkNIRUNLKTsKKwlXRExOKCJBdXRvbWF0aWMgdmFyaWFibGUgY2hlY2tpbmcgdHVybmVkIG9mZiIpOworCWJyZWFrOworCWNhc2UgInNjYW5jaGs9b24iOgorCU1PREVfT04oTU9ERV9TQ0FOQ0hLKTsKKwlXRExOKCJTY2FuIGNoZWNrIHR1cm5lZCBvbiIpOworCWJyZWFrOworCWNhc2UgInNjYW5jaGs9b2ZmIjoKKwlNT0RFX09GRihNT0RFX1NDQU5DSEspOworCVdETE4oIlNjYW4gY2hlY2sgdHVybmVkIG9mZiIpOworCWJyZWFrOworCWNhc2UgImVjaG89b24iOgorCU1PREVfT04oTU9ERV9FQ0hPKTsKKwlXRExOKCJFY2hvaW5nIG9mIG11bHRpcGxlIGNvbW1hbmQgZXhlY3V0aW9uIHR1cm5lZCBvbiIpOworCWJyZWFrOworCWNhc2UgImVjaG89b2ZmIjoKKwlNT0RFX09GRihNT0RFX0VDSE8pOworCVdETE4oIkVjaG9pbmcgb2YgbXVsdGlwbGUgY29tbWFuZCBleGVjdXRpb24gdHVybmVkIG9mZiIpOworCWJyZWFrOworCWNhc2UgInNob3J0PW9uIjoKKwlNT0RFX09OKE1PREVfU0hPUlQpOworCVdETE4oIlVzZSBvZiBzaG9ydCBkZXNjcmlwdGlvbnMgdHVybmVkIG9uIik7CisJYnJlYWs7CisJY2FzZSAic2hvcnQ9b2ZmIjoKKwlNT0RFX09GRihNT0RFX1NIT1JUKTsKKwlXRExOKCJVc2Ugb2Ygc2hvcnQgZGVzY3JpcHRpb25zIHR1cm5lZCBvZmYiKTsKKwlicmVhazsKKwljYXNlICJraWxsIjoKKwlXRExOKFRPT0xfTkFNRSsiIHNlbGZkZXN0cnVjdHMiKTsKKwlkZXN0cnVjdChNRSk7CisJYnJlYWs7CisJY2FzZSAibmV3cyI6CisJWE1vcmVGaWxlKFRPT0xfTkVXUywgRkFMU0UpOworCWJyZWFrOworCWNhc2UgInJlc2V0IjoKKwlXRExOKCJSZXNldHRpbmcgIitUT09MX1RJVExFKTsKKwlNRS0+X19JTklUKCk7CisJYnJlYWs7CisJY2FzZSAibG9hZCI6CisJaWYoZmlsZV9zaXplKFNBVkVfRklMRSsiLm8iKT4wKQorCXsKKwkgIFdETE4oIkxvYWRpbmcgIitUT09MX1RJVExFKyIgc2V0dGluZ3MiKTsKKwkgIHJlc3RvcmVfb2JqZWN0KFNBVkVfRklMRSk7CisJfQorCWVsc2UKKwkgIFdETE4oIlNvcnJ5LCBjYW5ub3QgZmluZCBmaWxlIHRvIGxvYWQgc2V0dGluZ3MiKTsKKwlicmVhazsKKwljYXNlICJzYXZlIjoKKwlXRExOKCJTYXZpbmcgIitUT09MX1RJVExFKyIgc2V0dGluZ3MiKTsKKwlzYXZlX29iamVjdChTQVZFX0ZJTEUpOworCWJyZWFrOworCWRlZmF1bHQ6CisJcmV0dXJuIEZBTFNFOworICAgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIFdMTihUT09MX1RJVExFKyIgc2V0dGluZ3M6Iik7CisgICAgdG1wPSAoIiBmaXJzdCAuLi4uID0gIisoTU9ERShNT0RFX0ZJUlNUKSA/ICJvblxuIiA6ICJvZmZcbiIpKTsKKyAgICB0bXArPSgiIHByb3RlY3QgLi4gPSAiKyhNT0RFKE1PREVfUFJPVEVDVCkgPyAib25cbiIgOiAib2ZmXG4iKSk7CisgICAgdG1wKz0oIiBpbnZjaGVjayAuID0gIisoTU9ERShNT0RFX0lOVkNIRUNLKSA/ICJvblxuIiA6ICJvZmZcbiIpKTsKKyAgICB0bXArPSgiIHZhcmNoZWNrIC4gPSAiKyhNT0RFKE1PREVfVkFSQ0hFQ0spID8gIm9uXG4iIDogIm9mZlxuIikpOworICAgIHRtcCs9KCIgc2NhbmNoayAuLiA9ICIrKE1PREUoTU9ERV9TQ0FOQ0hLKSA/ICJvblxuIiA6ICJvZmZcbiIpKTsKKyAgICB0bXArPSgiIGVjaG8gLi4uLi4gPSAiKyhNT0RFKE1PREVfRUNITykgPyAib25cbiIgOiAib2ZmXG4iKSk7CisgICAgdG1wKz0oIiBzaG9ydCAuLi4uID0gIisoTU9ERShNT0RFX1NIT1JUKSA/ICJvblxuIiA6ICJvZmZcbiIpKTsKKyAgICB0bXArPSgiIG1vcmUgLi4uLi4gPSAiK21vcmVsaW5lcyk7CisgICAgV0xOKHNwcmludGYoIiUtODAjcyIsIHRtcCkpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWHRyYWNlKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyBmaWxlOworICBvYmplY3Qgb2JqOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UxKHN0ciwgInh0cmFjKGUpIDxvYmplY3Q+Iik7CisgIGlmKCFzdHJ8fHN0cj09IiIpCisgIHsKKyAgICB0cmFjZSgwKTsKKyAgICBXRExOKCJFbmRpbmcgdHJhY2UgWyIrc2hvcnRfcGF0aCgiLyIrdHJhY2VwcmVmaXgoMCkpKyJdIik7CisgIH0KKyAgZWxzZSBpZihvYmo9WEZpbmRPYmooc3RyKSkKKyAgeworICAgIFByaW50U2hvcnQoIlRyYWNpbmc6ICIsIG9iaik7CisgICAgZmlsZT1vYmplY3RfbmFtZShvYmopOworICAgIGZpbGU9ZmlsZVsxLi48MV07CisgICAgdHJhY2VwcmVmaXgoZmlsZSk7CisgICAgdHJhY2UoVFJBQ0VfTEVWRUwpOworICB9CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWHRyYW5zKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBvYmo7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBVU0FHRTIoc3RyLCAieHRyYW4ocykgPG9iamVjdD4iKTsKKyAgaWYoKG9iaj1YRmluZE9iaihzdHIpKSYmRU5WKG9iaikpCisgIHsKKyAgICB0ZWxsX3Jvb20oRU5WKG9iaiksIENSTkFNRShvYmopKyIgdmFuaXNoZXMuXG4iKTsKKyAgICB0ZWxsX3Jvb20oRU5WKGNsb25lciksIENSTkFNRShvYmopKworCSAgICAgICIgaXMgdGVsZXBvcnRlZCBpbnRvIHRoaXMgcm9vbSBieSAiK0NSTkFNRShjbG9uZXIpKyIuXG4iKTsKKyAgICBNb3ZlT2JqKG9iaiwgRU5WKGNsb25lciksIFRSVUUpOworICAgIHRlbGxfb2JqZWN0KG9iaiwgIllvdSd2ZSBiZWVuIHRlbGVwb3J0ZWQgdG8gIitDUk5BTUUoY2xvbmVyKSsiLlxuIik7CisgIH0KKyAgZWxzZQorICAgIFdETE4oIkZhaWxlZCB0byB0ZWxlcG9ydCBvYmplY3QiKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYdXBkYXRlKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBvYmo7CisgIHN0cmluZyBmaWxlOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVVNBR0UyKHN0ciwgInh1cChkYXRlKSA8ZmlsZW5hbWU+Iik7CisgIGlmKCEoZmlsZT1YRmluZEZpbGUoc3RyKSkpCisgICAgcmV0dXJuIFRSVUU7CisgIGlmKGZpbGVbPDIuLiA8MV09PSIuYyIpCisgICAgZmlsZT1maWxlWzAuLiA8M107CisgIGlmKChvYmo9WEZpbmRPYmooZmlsZSkpJiYob2JqPWZpbmRfb2JqZWN0KHB1cmVfZmlsZV9uYW1lKG9iaikpKSkKKyAgeworICAgIFByaW50U2hvcnQoIlVwZGF0aW5nOiAiLCBvYmopOworICAgIERlc3RydWN0KG9iaik7CisgIH0KKyAgZWxzZQorICAgIFdETE4oIk9iamVjdCBub3QgZm91bmQiKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBYdXB0aW1lKHN0cmluZyBzdHIpCit7CisgIHJldHVybiBUUlVFOworfQorCitpbnQgWHdjKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyBmaWxlOworICBzdHJpbmcgdG1wLCAqdG1wMjsKKyAgaW50IGksIGNoYXJzLCB3b3JkcywgbGluZXMsIG5jaGFycywgbndvcmRzLCBubGluZXM7CisgIAorICBTRUNVUkUyKFRSVUUpOworICBUSygiWHdjOiBzdHI6ICIrc3RyKTsKKyAgY2hhcnM9d29yZHM9bGluZXM9RkFMU0U7CisgIGlmKCFwaXBlX2luKQorICB7CisgICAgVVNBR0UyKHN0ciwgInh3YyBbLWN3bF0gPGZpbGU+Iik7CisgICAgaWYoc3RyWzBdPT0nLScpCisgICAgeworICAgICAgd2hpbGUoKHN0cj1zdHJbMS4uXSlbMF0hPScgJyYmc2l6ZW9mKHN0cikpCisJc3dpdGNoKHN0clswXSkKKwl7CisJICBjYXNlICdjJzoKKwkgIGNoYXJzPVRSVUU7CisJICBicmVhazsKKwkgIGNhc2UgJ3cnOgorCSAgd29yZHM9VFJVRTsKKwkgIGJyZWFrOworCSAgY2FzZSAnbCc6CisJICBsaW5lcz1UUlVFOworCSAgYnJlYWs7CisJICBkZWZhdWx0OgorCSAgcmV0dXJuIEZBTFNFOworCX0KKyAgICAgIHN0cj1zdHJbMS4uXTsKKyAgICB9CisgICAgaWYoIShmaWxlPVhGaW5kRmlsZShzdHIpKSkKKyAgICB7CisgICAgICBXRExOKCJDYW4ndCBmaW5kIGZpbGUiKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICBlbHNlCisgIHsKKyAgICBVU0FHRTEoc3RyLCJ4d2MgWy1jd2xdIik7CisgICAgaWYoc3RyKQorICAgICAgaWYoc3RyWzBdPT0nLScpCisgICAgICB7CisJd2hpbGUoKHN0cj1zdHJbMS4uXSlbMF0hPScgJyYmc2l6ZW9mKHN0cikpCisJICBzd2l0Y2goc3RyWzBdKQorCSAgeworCSAgICBjYXNlICdjJzoKKwkgICAgY2hhcnM9VFJVRTsKKwkgICAgYnJlYWs7CisJICAgIGNhc2UgJ3cnOgorCSAgICB3b3Jkcz1UUlVFOworCSAgICBicmVhazsKKwkgICAgY2FzZSAnbCc6CisJICAgIGxpbmVzPVRSVUU7CisJICAgIGJyZWFrOworCSAgICBkZWZhdWx0OgorCSAgICByZXR1cm4gRkFMU0U7CisJICB9CisgICAgICB9CisgICAgICBlbHNlCisJcmV0dXJuIEZBTFNFOworICAgIGlmKGZpbGVfc2l6ZShmaWxlPXBpcGVfaWYpPDApCisgICAgeworICAgICAgV0RMTigiTWlzc2luZyBpbnB1dCB0byB4d2MiKTsKKyAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgfQorICBpZighKGNoYXJzfHdvcmRzfGxpbmVzKSkKKyAgICBjaGFycz13b3Jkcz1saW5lcz1UUlVFOworICBubGluZXM9bndvcmRzPW5jaGFycz0wOworICB0bXA9cmVhZF9maWxlKGZpbGUsMCxQSVBFX01BWCk7CisgIHRtcDI9ZXhwbG9kZSh0bXAsIlxuIik7CisgIGlmKGxpbmVzKQorICB7CisgICAgbmxpbmVzPXNpemVvZih0bXAyKTsKKyAgICBpZih0bXAyWzwxXT09IiImJm5saW5lcz4xKQorICAgICAgbmxpbmVzLS07CisgIH0KKyAgaWYod29yZHMpCisgICAgZm9yKGk9c2l6ZW9mKHRtcDIpLTE7aT49MDtpLS0pCisgICAgeworICAgICAgVEsoc3ByaW50ZigiJU8iLHRtcDJbaV0pKTsKKyAgICAgIGlmKHRtcDJbaV0hPSIiKQorCW53b3Jkcys9c2l6ZW9mKHJlZ2V4cGxvZGUodG1wMltpXSwiWwldIiktKHsiIiwiICIsIgkifSkpOworICAgICAgVEsoc3ByaW50ZigiJU8iLHJlZ2V4cGxvZGUodG1wMltpXSwiWwldIiktKHsiIiwiICIsIgkifSkpKTsKKyAgICAgIFRLKCJud29yZHM6ICIrbndvcmRzKTsKKyAgICB9CisgIGlmKGNoYXJzKQorICAgIGZvcihpPXNpemVvZih0bXAyKS0xO2k+PTA7aS0tKQorICAgICAgbmNoYXJzKz1zaXplb2YodG1wMltpXSkrMTsKKyAgdG1wMj0wOworICB0bXA9IiI7CisgIGlmKGxpbmVzKQorICAgIHRtcCs9c3ByaW50ZigiJTdkIixubGluZXMpKyIgIjsKKyAgaWYod29yZHMpCisgICAgdG1wKz1zcHJpbnRmKCIlN2QiLG53b3JkcykrIiAiOworICBpZihjaGFycykKKyAgICB0bXArPXNwcmludGYoIiU3ZCIsbmNoYXJzKSsiICI7CisgIGlmKGZpbGUhPXBpcGVfaWYpCisgICAgdG1wKz1maWxlOworICBXTE4odG1wKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK2ludCBjbWRhdmdfY29tcGFyZShzdHJpbmcgYSwgc3RyaW5nIGIpCit7CisgIGludCB4LHk7CisgIHN0cmluZyBkdW07CisgIHNzY2FuZihhLCIlcyBjbWRhdmc6ICVkIixkdW0seCk7CisgIHNzY2FuZihiLCIlcyBjbWRhdmc6ICVkIixkdW0seSk7CisgIHJldHVybiB4PT15PzA6KHg+eT8xOi0xKTsKK30KKworaW50IFh3aG8oc3RyaW5nIG9wdCkKK3sKKyAgc3RyaW5nICpzdHJzLHN0cixmdW5jOworICAKKyAgU0VDVVJFMihUUlVFKTsKKyAgVEsoIlh3aG86IG9wdDogXCIiK29wdCsiXCIiKTsKKyAgVVNBR0UxKG9wdCwgInh3aChvKSBbbWFpbHxpcHxyYWNlfGd1aWxkfGRvbWFpbnxzdGF0c3xzbm9vcF0iKTsKKyAgZnVuYz0ic3RyaW5nX2NvbXBhcmUiOworICBpZighb3B0fHxvcHQ9PSIiKQorICAgIHN0cnM9bWFwKHVzZXJzKCksICJQbGF5ZXJXaG8iLCBNRSk7CisgIGVsc2UKKyAgICBzd2l0Y2gob3B0KQorICAgIHsKKyAgICAgIGNhc2UgIm1haWwiOgorICAgICAgc3Rycz1tYXAodXNlcnMoKSwgIlBsYXllck1haWwiLCBNRSwgVFJVRSk7CisgICAgICBicmVhazsKKyAgICAgIGNhc2UgImlwIjoKKyAgICAgIHN0cnM9bWFwKHVzZXJzKCksICJQbGF5ZXJJUCIsIE1FLCBUUlVFKTsKKyAgICAgIGJyZWFrOworICAgICAgY2FzZSAicmFjZSI6CisgICAgICBjYXNlICJndWlsZCI6CisgICAgICBzdHJzPW1hcCh1c2VycygpLCAiUGxheWVyUmFjZSIsIE1FLCBUUlVFKTsKKyAgICAgIGJyZWFrOworICAgICAgY2FzZSAiZG9tYWluIjoKKyAgICAgIHN0cnM9bWFwKHVzZXJzKCksICJQbGF5ZXJEb21haW4iLCBNRSwgVFJVRSk7CisgICAgICBicmVhazsKKyAgICAgIGNhc2UgInN0YXQiOgorICAgICAgY2FzZSAic3RhdHMiOgorICAgICAgc3Rycz1tYXAodXNlcnMoKSwgIlBsYXllclN0YXRzIiwgTUUsIFRSVUUpOworICAgICAgYnJlYWs7CisgICAgICBjYXNlICJzbm9vcCI6CisgICAgICBzdHJzPW1hcCh1c2VycygpLCAiUGxheWVyU25vb3AiLCBNRSwgVFJVRSk7CisgICAgICBicmVhazsKKyAgICAgIGNhc2UgImNtZGF2ZyI6CisgICAgICBzdHJzPW1hcCh1c2VycygpLCAiUGxheWVyQ21kQXZnIiwgTUUsIFRSVUUpOworICAgICAgZnVuYz0iY21kYXZnX2NvbXBhcmUiOworICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgc3Rycz1zb3J0X2FycmF5KHN0cnMsIGZ1bmMsIE1FKTsKKyAgaWYocGlwZV9vdXQmJnBpcGVfb2YpCisgICAgd3JpdGVfZmlsZShwaXBlX29mLGltcGxvZGUoc3RycywiXG4iKSsiXG4iKTsKKyAgZWxzZQorICAgIFdMTihpbXBsb2RlKHN0cnMsIlxuIikpOworICByZXR1cm4gVFJVRTsKK30KZGlmZiAtLWdpdCBhL29iai90b29scy9NR3Rvb2wvdG9vbGxpYi5jIGIvb2JqL3Rvb2xzL01HdG9vbC90b29sbGliLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ2NDAwNAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9NR3Rvb2wvdG9vbGxpYi5jCkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogTUd0b29sLTEuMAorICogRmlsZTogdG9vbGxpYi5jCisgKiBNYWludGFpbmVyOiBLaXJrQE1vcmdlbkdyYXVlbgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIHRoZSBvcmlnaW5hbCBYdG9vbCBpcyBjb3B5cmlnaHRlZCBieSBIeXAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2luY2x1ZGUgInRvb2xsaWIuaCIKKyNpbmNsdWRlIDxscGN0eXBlcy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKy8qCitzdHJpbmcgKm9sZF9leHBsb2RlKHN0cmluZyBzdHIsIHN0cmluZyBkZWwpCit7CisgIGludCBzLCB0OworICBzdHJpbmcgKnN0cnM7CisgIAorICBpZihkZWwgPT0gIiIpCisgICAgcmV0dXJuICh7c3RyfSk7CisgIHN0cnM9ZXhwbG9kZShzdHIsIGRlbCk7CisgIHM9MDsKKyAgdD1zaXplb2Yoc3RycyktMTsKKyAgd2hpbGUoczw9dCAmJiBzdHJzW3MrK10gPT0gIiIpCisgICAgOworICBzLS07CisgIHdoaWxlKHQ+PTAgJiYgc3Ryc1t0LS1dID09ICIiKQorICAgIDsKKyAgdCsrOworICBpZihzPD10KQorICAgIHJldHVybiBzdHJzW3MuLnRdOworICByZXR1cm4gMDsKK30KKworc3RyaW5nICpleHBsb2RlKHN0cmluZyBzdHIsIHN0cmluZyBkZWwpCit7CisgIHJldHVybiBleHBsb2RlKHN0ciwgZGVsKTsKK30KKyovCitzdHJpbmcgKnN0cmlwX2V4cGxvZGUoc3RyaW5nIHN0ciwgc3RyaW5nIGRlbCkKK3sKKyAgcmV0dXJuIGV4cGxvZGUoc3RyLCBkZWwpLSh7IiJ9KTsKK30KKworc3RyaW5nIHN0cmlwX3N0cmluZyhzdHJpbmcgc3RyKQoreworICByZXR1cm4gaW1wbG9kZShzdHJpcF9leHBsb2RlKHN0ciwiICIpLCIgIik7Cit9CisKK2ludCBzdHJpbmdfY29tcGFyZShzdHJpbmcgYSwgc3RyaW5nIGIpCit7CisgIHJldHVybiBhPT1iPzA6KGE+Yj8xOi0xKTsKK30KKworc3RyaW5nIGNhcF9zdHJpbmcoc3RyaW5nIHN0cikKK3sKKyAgcmV0dXJuIGNhcGl0YWxpemUoc3RyKTsKK30KKworc3RyaW5nIHNob3J0X3BhdGgoc3RyaW5nIGZpbGUpCit7CisgIGludCBzOworICBzdHJpbmcgdG1wOworICAKKyAgaWYoIWZpbGUpCisgICAgcmV0dXJuIDA7CisgIGlmKFBMKQorICB7CisgICAgaWYoZmlsZVswLi4gOF09PSIvcGxheWVycy8iKQorICAgIHsKKyAgICAgIHM9c2l6ZW9mKGdldHVpZChQTCkpKzg7CisgICAgICByZXR1cm4gIn4iKyhmaWxlWzkuLiBzXT09Z2V0dWlkKFBMKSA/CisJCSAgZmlsZVtzKzEuLiA8MV0gOiBmaWxlWzkuLiA8MV0pOworICAgIH0KKyAgfQorICBpZihmaWxlWzAuLiAyXT09Ii9kLyIpCisgICAgcmV0dXJuICIrIitmaWxlWzMuLiA8MV07CisgIGVsc2UKKyAgICByZXR1cm4gZmlsZTsgIAorfQorCitzdHJpbmcgbG9uZ19wYXRoKHN0cmluZyBmaWxlKQoreworICByZXR1cm4gKHN0cmluZylNQVNURVItPm1ha2VfcGF0aF9hYnNvbHV0ZShmaWxlKTsKK30KKworc3RyaW5nICpsb25nX2dldF9kaXIoc3RyaW5nIHBhdCwgaW50IGFsbCkKK3sKKyAgaW50IGksIHM7CisgIHN0cmluZyBzdHIsIGRpciwgKmZpbGUsICp0bXA7CisgIAorICBpZighcGF0KQorICAgIHJldHVybiAoe30pOworICBwYXQ9bG9uZ19wYXRoKHBhdCk7CisgIGlmKHRtcD1vbGRfZXhwbG9kZShwYXQsICIvIikpCisgICAgZGlyPSIvIitpbXBsb2RlKHRtcFswLi5zaXplb2YodG1wKS0yXSwgIi8iKSsiLyI7CisgIGVsc2UKKyAgICBkaXI9Ii8iOworICBzPXNpemVvZih0bXA9Z2V0X2RpcihwYXQpKTsKKyAgZmlsZT0oe30pOworICBmb3IoaT0wO2k8cztpKyspCisgIHsKKyAgICBzdHI9ZGlyK3RtcFtpXTsKKyAgICBpZihhbGx8fGZpbGVfc2l6ZShzdHIpPj0wKQorICAgICAgZmlsZSs9KHtzdHJ9KTsKKyAgfQorICByZXR1cm4gZmlsZTsKK30KKworc3RyaW5nIGxpdF9zdHJpbmcoc3RyaW5nIHN0cikKK3sKKyAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwgIlxcIiwgIlxcXFwiKTsKKyAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwgIlxiIiwgIlxcYiIpOworICBzdHI9c3RyaW5nX3JlcGxhY2Uoc3RyLCAiXG4iLCAiXFxuIik7CisgIHN0cj1zdHJpbmdfcmVwbGFjZShzdHIsICJcciIsICJcXHIiKTsKKyAgc3RyPXN0cmluZ19yZXBsYWNlKHN0ciwgIlx0IiwgIlxcdCIpOworICByZXR1cm4gc3RyaW5nX3JlcGxhY2Uoc3RyLCAiXCIiLCAiXFxcIiIpOworfQorCitzdHJpbmcgbWl4ZWRfdG9fc3RyaW5nKG1peGVkIG1peCwgaW50IGx2bCkKK3sKKyAgaW50IGksIGosIHMsIHQ7CisgIHN0cmluZyBzdHI7CisgIG1peGVkICprZXlzOworCisgIGlmKGx2bCkKKyAgeworICAgIHN3aXRjaCh0eXBlb2YobWl4KSkKKyAgICB7CisgICAgICBkZWZhdWx0OgorICAgICAgY2FzZSBUX0lOVkFMSUQ6CisgICAgICByZXR1cm4gIjxpbnZhbGlkPiI7CisgICAgICBjYXNlIFRfU1RSVUNUOgorICAgICAgcmV0dXJuIHRvX3N0cmluZyhtaXgpOworICAgICAgY2FzZSBUX0xWQUxVRToKKyAgICAgIHJldHVybiAiJiIrbWl4ZWRfdG9fc3RyaW5nKG1peCwgbHZsLTEpOworICAgICAgY2FzZSBUX05VTUJFUjoKKyAgICAgIGNhc2UgVF9GTE9BVDoKKyAgICAgIHJldHVybiB0b19zdHJpbmcobWl4KTsKKyAgICAgIGNhc2UgVF9TVFJJTkc6CisgICAgICByZXR1cm4gIlwiIitsaXRfc3RyaW5nKG1peCkrIlwiIjsKKyAgICAgIGNhc2UgVF9QT0lOVEVSOgorICAgICAgcmV0dXJuICIoeyIraW1wbG9kZShtYXAobWl4LCJtaXhlZF90b19zdHJpbmciLE1FLGx2bC0xKSwiLCIpKyJ9KSI7CisgICAgICBjYXNlIFRfT0JKRUNUOgorICAgICAgcmV0dXJuICJbIitzaG9ydF9wYXRoKG9iamVjdF9uYW1lKChvYmplY3QpbWl4KSkrIl0iOworICAgICAgY2FzZSBUX01BUFBJTkc6CisgICAgICBzPXNpemVvZihrZXlzPW1faW5kaWNlcyhtaXgpKTsKKyAgICAgIHQ9Z2V0X3R5cGVfaW5mbyhtaXgsIDEpOworICAgICAgc3RyPSIoWyI7CisgICAgICBmb3IoaT0wO2k8cztpKyspCisgICAgICB7CisJc3RyKz1taXhlZF90b19zdHJpbmcoa2V5c1tpXSwgbHZsLTEpOworCWlmKHQpCisJeworCSAgc3RyKz0iOiIrbWl4ZWRfdG9fc3RyaW5nKG1peFtrZXlzW2ldLDBdLCBsdmwtMSk7CisJICBmb3Ioaj0xO2o8dDtqKyspCisJICAgIHN0cis9IjsiK21peGVkX3RvX3N0cmluZyhtaXhba2V5c1tpXSxqXSwgbHZsLTEpOworCX0KKwlpZihpPHMtMSkgc3RyKz0iLCI7CisgICAgICB9CisgICAgICByZXR1cm4gc3RyKyJdKSI7CisgICAgICBjYXNlIFRfQ0xPU1VSRToKKyAgICAgIGNhc2UgVF9TWU1CT0w6CisgICAgICByZXR1cm4gc3ByaW50ZigiJU8iLCBtaXgpOworICAgICAgY2FzZSBUX1FVT1RFRF9BUlJBWToKKyAgICAgIHJldHVybiAiJyIrbWl4ZWRfdG9fc3RyaW5nKGZ1bmNhbGwobGFtYmRhKDAsIG1peCkpLCBsdmwtMSk7CisgICAgfQorICB9CisgIHJldHVybiAiLi4uIjsKK30KKworaW50IGlzX3BsYXllcihvYmplY3Qgb2JqKQoreworICByZXR1cm4gaXNfb2JqKG9iaikmJnF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2JqKTsKK30KKworaW50IGlzX25vdF9wbGF5ZXIob2JqZWN0IG9iaikKK3sKKyAgcmV0dXJuIGlzX29iaihvYmopJiYhaXNfcGxheWVyKG9iaik7Cit9CisKK2ludCByb3VuZChmbG9hdCB2YWwpCit7CisgIGludCB0bXA7CisKKyAgdG1wPShpbnQpdmFsOworICAvLyBvbmx5IHBvc2l0aXZlIHZhbAorICBpZiggdmFsIC0gdG1wID49IDAuNSApCisgICAgcmV0dXJuIHRtcCsxOworICByZXR1cm4gdG1wOworfQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL01HdG9vbC90b29sbGliLmggYi9vYmovdG9vbHMvTUd0b29sL3Rvb2xsaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWU4MjY0Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL01HdG9vbC90b29sbGliLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIE1HdG9vbC0xLjAKKyAqIEZpbGU6IHRvb2xsaWIuaAorICogTWFpbnRhaW5lcjogS2lya0BNb3JnZW5HcmF1ZW4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiB0aGUgb3JpZ2luYWwgWHRvb2wgaXMgY29weXJpZ2h0ZWQgYnkgSHlwICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNpZm5kZWYgX19UT09MTElCX0hfXworI2RlZmluZSBfX1RPT0xMSUJfSF9fIDEKKworI2lmbmRlZiBNQVNURVIKKyNkZWZpbmUgTUFTVEVSIF9fTUFTVEVSX09CSkVDVF9fCisjZW5kaWYKKworI2RlZmluZSBpc19vYmooeCkgICAgICAgICAoKHgpJiZvYmplY3RwKHgpKQorCisjZGVmaW5lIGlzX2xpdmluZyh4KSAgICAgIChpc19vYmooeCkmJmxpdmluZyh4KSkKKyNkZWZpbmUgaXNfbm90X2xpdmluZyh4KSAgKGlzX29iaih4KSYmIWlzX2xpdmluZyh4KSkKKyNkZWZpbmUgaXNfbmV0ZGVhZCh4KSAgICAgKGlzX29iaih4KSYmaXNfcGxheWVyKHgpJiYhaW50ZXJhY3RpdmUoeCkpCisjZGVmaW5lIGlzX2FsaXZlKHgpICAgICAgIChpc19vYmooeCkmJmlzX3BsYXllcih4KSYmaW50ZXJhY3RpdmUoeCkpCisjZGVmaW5lIGlzX3Nub29wZWQoeCkgICAgIChpc19vYmooeCkmJm9iamVjdHAocXVlcnlfc25vb3AoeCkpKQorI2RlZmluZSBpc19ub3Rfc25vb3BlZCh4KSAoaXNfb2JqKHgpJiYhaXNfc25vb3BlZCh4KSkKKyNkZWZpbmUgaXNfaW52aXMoeCkgICAgICAgKGlzX29iaih4KSYmKCh4KS0+UXVlcnlQcm9wKFBfSU5WSVMpfHwhKHgpLT5RdWVyeVByb3AoUF9TSE9SVCkpKSkKKyNkZWZpbmUgaXNfbm90X2ludmlzKHgpICAgKGlzX29iaih4KSYmIWlzX2ludmlzKHgpKQorCisjZGVmaW5lIHB1cmVfZmlsZV9uYW1lKHgpICAgICAoaXNfb2JqKHgpP29sZF9leHBsb2RlKG9iamVjdF9uYW1lKHgpLCIjIilbMF06MCkKKyNkZWZpbmUgc291cmNlX2ZpbGVfbmFtZSh4KSAgIChpc19vYmooeCk/cHVyZV9maWxlX25hbWUoKHgpKSsiLmMiOjApCisjZGVmaW5lIHN0cmluZ19yZXBsYWNlKHgseSx6KSBpbXBsb2RlKGV4cGxvZGUoKHgpLCh5KSksKHopKQorCitpbnQgc3RyaW5nX2NvbXBhcmUoc3RyaW5nIGEsIHN0cmluZyBiKTsKK3N0cmluZyBjYXBfc3RyaW5nKHN0cmluZyBzdHIpOyAgCitzdHJpbmcgc2hvcnRfcGF0aChzdHJpbmcgZmlsZSk7CitzdHJpbmcgbG9uZ19wYXRoKHN0cmluZyBmaWxlKTsKKy8vc3RyaW5nICpvbGRfZXhwbG9kZShzdHJpbmcgc3RyLCBzdHJpbmcgZGVsKTsKKy8vc3RyaW5nICpleHBsb2RlKHN0cmluZyBzdHIsIHN0cmluZyBkZWwpOworc3RyaW5nICpzdHJpcF9leHBsb2RlKHN0cmluZyBzdHIsIHN0cmluZyBkZWwpOworc3RyaW5nIHN0cmlwX3N0cmluZyhzdHJpbmcgc3RyKTsKK3N0cmluZyAqbG9uZ19nZXRfZGlyKHN0cmluZyBwYXQsIGludCBhbGwpOworc3RyaW5nIGxpdF9zdHJpbmcoc3RyaW5nIHN0cik7CitzdHJpbmcgbWl4ZWRfdG9fc3RyaW5nKG1peGVkIG1peCwgaW50IGxldmVsKTsKK2ludCBpc19wbGF5ZXIob2JqZWN0IG9iaik7CitpbnQgaXNfbm90X3BsYXllcihvYmplY3Qgb2JqKTsKK2ludCByb3VuZChmbG9hdCB2YWwpOworCisjZW5kaWYgLyogX19UT09MTElCX0hfXyAqLwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL1JFQURNRSBiL29iai90b29scy9SRUFETUUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQwY2UxMAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9SRUFETUUKQEAgLTAsMCArMSBAQAorVGhlIGZpbGVzIGNvbnRhaW5lZCBpbiB0aGlzIHN1YnRyZWUgYXJlIHVuc3VwcG9ydGVkLgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL2J0b29sLmMgYi9vYmovdG9vbHMvYnRvb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDYzZTg4Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL2J0b29sLmMKQEAgLTAsMCArMSwxMjEgQEAKKyNwcmFnbWEgbm9fc2hhZG93LCBub19pbmhlcml0CisjcHJhZ21hIHN0cm9uZ190eXBlcyxzYXZlX3R5cGVzLHJ0dF9jaGVja3MKKyNwcmFnbWEgcGVkYW50aWMscmFuZ2VfY2hlY2ssd2Fybl9kZXByZWNhdGVkCisjcHJhZ21hIHdhcm5fZW1wdHlfY2FzdHMsd2Fybl9taXNzaW5nX3JldHVybix3YXJuX2Z1bmN0aW9uX2luY29uc2lzdGVudAorCitpbmhlcml0ICIvc3RkL3RoaW5nIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisKKyNkZWZpbmUgQkFSQ0hJViAiL2QvZXJ6bWFnaWVyL2JvaW5nL2JhbGFuY2UvYmFyY2hpdmVzIgorCisjZGVmaW5lIEJTKHgpIGJyZWFrX3N0cmluZyh4LDc4LDAsQlNfTEVBVkVfTVlfTEZTKQorCitwcml2YXRlIHZhcmFyZ3Mgdm9pZCBwcmludF9tYXAobWFwcGluZyB0bXAsaW50IHNob3J0KTsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX05BTUUsIkJhbGFuY2UtVG9vbCIpOworICBBZGRJZCgoeyJidG9vbCIsImJhbGFuY2V0b29sIiwiYmFsYW5jZS10b29sIn0pKTsKKyAgU2V0UHJvcChQX1NIT1JULCJFaW4gQmFsYW5jZS1Ub29sIGxpZ2h0Iik7CisgIFNldFByb3AoUF9MT05HLAorICAgIEJTKCJEaWVzIGlzdCBkYXMgQmFsYW5jZS1Ub29sIGxpZ2h0LiBFcyB2ZXJzdGVodCBmb2xnZW5kZSBCZWZlaGxlOlxuIgorICAgICItIGJ0b3AgPG4+OiBaZWlndCBkZW4gbGV0enRlbiBnZW5laG1pZ3RlbiBBbnRyYWcgenUgVG9wIG4uXG4iCisgICAgIi0gYnN1Y2ggWy1zXSA8c3RyPjogU3VjaHQgY2FzZS1zZW5zaXRpdiBuYWNoIHN0ciwgLXMgYnJpY2h0IGplZGVuICIKKyAgICAiRWludHJhZyBuYWNoIDc4IFplaWNoZW4gYWIuXG4iCisgICAgIi0gYmluaGFsdCBbLXNdOiBaZWlndCBkZW4gZ2VzYW10ZW4gSW5oYWx0IGRlcyBCYWxhbmNlYXJjaGl2ZXMsIC1zICIKKyAgICAiYnJpY2h0IGplZGVuIEVpbnRyYWcgbmFjaCA3OCBaZWljaGVuIGFiLlxuXG4iCisgICAgIkVzIGthbm4gdm9ya29tbWVuLCBkYXNzIEVpbnRyYWVnZSBkZXIgZmFsc2NoZW4gVUlEIHp1Z2VvcmRuZXQgc2luZCwgIgorICAgICJvZGVyIGRhc3MgZGllIEdlbmVobWlndW5nIG5pY2h0IHNlaHIgYXVzc2FnZWtyYWVmdGlnIGlzdCwgaW4gZGllc2VtICIKKyAgICAiRmFsbCBiaXR0ZSBlaW5lIE1haWwgYW4gZGFzIEJhbGFuY2V0ZWFtIHNjaHJlaWJlbi4iKSk7CisgIEFkZENtZCgiYnRvcCIsCisgICAgZnVuY3Rpb24gaW50KHN0cmluZyBzdHIpCisgICAgeworICAgICAgaW50IG47CisgICAgICBpZighc3RyIHx8IHNzY2FuZihzdHIsIiVkIixuKSE9MSkKKyAgICAgIHsKKyAgICAgICAgbm90aWZ5X2ZhaWwoCisgICAgICAgICAgQlMoIlN5bnRheDogYnRvcCA8bj4iKSk7CisgICAgICAgIHJldHVybiAwOworICAgICAgfQorICAgICAgdGhpc19pbnRlcmFjdGl2ZSgpLT5SZWNlaXZlTXNnKAorICAgICAgICBCQVJDSElWLT5HZXRMaWdodEFubm91bmNlKG4pLAorICAgICAgICBNVF9OT1RJRklDQVRJT058TVNHX0JTX0xFQVZFX0xGUyk7CisgICAgICByZXR1cm4gMTsKKyAgICB9KTsKKyAgQWRkQ21kKCJic3VjaCIsCisgICAgZnVuY3Rpb24gaW50KCkKKyAgICB7CisgICAgICBzdHJpbmcgc3RyPXRoaXNfaW50ZXJhY3RpdmUoKS0+X3VucGFyc2VkX2FyZ3MoKTsKKyAgICAgIGlmKCFzdHIgfHwgIXNpemVvZihzdHIpKQorICAgICAgeworICAgICAgICBub3RpZnlfZmFpbCgKKyAgICAgICAgICBCUygiU3ludGF4OiBic3VjaCA8c3RyPiIpKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICB9CisgICAgICBpbnQgc2hvcnQ7CisgICAgICBzdHJpbmcqIGFycj1vbGRfZXhwbG9kZShzdHIsIiAiKTsKKyAgICAgIAorICAgICAgaWYoYXJyWzBdPT0iLXMiKQorICAgICAgeworICAgICAgICBzaG9ydD0xOworICAgICAgICBzdHI9aW1wbG9kZShhcnJbMS4uXSwiICIpOworICAgICAgfQorICAgICAgbWFwcGluZyB0bXA9QkFSQ0hJVi0+U2VhcmNoSW5kZXgoc3RyKTsKKyAgICAgIGlmKCFzaXplb2YodG1wKSkKKyAgICAgIHsKKyAgICAgICAgdGhpc19pbnRlcmFjdGl2ZSgpLT5SZWNlaXZlTXNnKAorICAgICAgICAgICJLZWluZSBFaW50cmFlZ2UgZ2VmdW5kZW4uIiwKKyAgICAgICAgICBNVF9OT1RJRklDQVRJT04pOworICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICBwcmludF9tYXAodG1wLHNob3J0KTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAxOworICAgIH0pOworICBBZGRDbWQoImJpbmhhbHQiLAorICAgIGZ1bmN0aW9uIGludChzdHJpbmcgc3RyKQorICAgIHsKKyAgICAgIGludCBzaG9ydDsKKyAgICAgIGlmKHNpemVvZihzdHIpKQorICAgICAgeworICAgICAgICBzdHJpbmcqIGFycj1vbGRfZXhwbG9kZShzdHIsIiAiKTsKKyAgICAgIAorICAgICAgICBpZihhcnJbMF09PSItcyIpCisgICAgICAgIHsKKyAgICAgICAgICBzaG9ydD0xOworICAgICAgICB9CisgICAgICB9CisgICAgCisgICAgICBwcmludF9tYXAoQkFSQ0hJVi0+R2V0SW5kZXhGb3JXaXphcmRzKCksc2hvcnQpOworICAgICAgcmV0dXJuIDE7CisgICAgfSk7Cit9CisKK3ByaXZhdGUgdmFyYXJncyB2b2lkIHByaW50X21hcChtYXBwaW5nIHRtcCxpbnQgc2hvcnQpCit7CisJaWYgKCFtYXBwaW5ncCh0bXApKQorCXsKKwkJdGhpc19pbnRlcmFjdGl2ZSgpLT5SZWNlaXZlTXNnKCJLZWluZSBEYXRlbiB2b3JoYW5kZW4uXG4iKTsKKwkJcmV0dXJuOworCX0KKyAgaW50KiBzb3J0PXNvcnRfYXJyYXkobV9pbmRpY2VzKHRtcCksIyc+KTsKKyAgc3RyaW5nIHJldD0iIjsKKyAgZm9yZWFjaChpbnQgaSA6IHNvcnQpCisgIHsKKyAgICBzdHJpbmcgc3RyPXNwcmludGYoIiAlNGQ6ICAlcyB7JXN9ICglcykiLGksdG1wW2ksMF0sdG1wW2ksMl0sCisgICAgICBzdHJmdGltZSgiJWQuJW0uJXkiLHRtcFtpLDFdKSk7CisgICAgaWYoc2hvcnQpCisgICAgeworICAgICAgcmV0Kz1CUyhzdHJbMC4uNzddKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHJldCs9QlMoc3RyKTsKKyAgICB9CisgIH0KKyAgdGhpc19pbnRlcmFjdGl2ZSgpLT5Nb3JlKHJldCk7Cit9CmRpZmYgLS1naXQgYS9vYmovdG9vbHMvZGFuY2V0b29sLmMgYi9vYmovdG9vbHMvZGFuY2V0b29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNmM2I5YQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9kYW5jZXRvb2wuYwpAQCAtMCwwICsxLDMyMSBAQAorLy8gREFOQ0VUT09MLkMgICBTdGFuZDogMTAuMTIuOTQgRGFuY2VyIAorLy8KKy8vIEtsZWluZXMgVG9vbCB6dW0gU2NocmVpYmVuIHVuZCBOYWNoc2VoZW4gdm9uIERldGFpbHMuCisvLworLy8KKyAKK2luaGVyaXQgInN0ZC90aGluZyI7CisgCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyAKKyNkZWZpbmUgYnMoIHggKSBicmVha19zdHJpbmcoIHgsIDc4ICkKKyAKK3ByaXZhdGUgaW50IGksIGNvdW50ZXIsIGZpcnN0X2RldGFpbF9saW5lLCBzdGFydGxpbmUsIGVuZGxpbmU7IAorcHJpdmF0ZSBzdHJpbmcgKmRldGFpbF9zaG9ydHMsICpuZXdzdHJpbmcsICpmaWxlX2xpbmVzLCAqbmV3X2xpbmVzOworcHJpdmF0ZSBzdHJpbmcgZGV0YWlsX2xvbmcsIHNhdmVfc3RyaW5nLCBvbGRfZmlsZSwgbmV3X2ZpbGUsIGFjdHVhbF9maWxlLAorICAgICAgICAgICAgICAgZGV0YWlsX3RleHQ7CisgICAgICAgCit2b2lkIGNyZWF0ZSgpCit7CisgICA6OmNyZWF0ZSgpOworICAgU2V0UHJvcCggUF9BVVRPTE9BRE9CSiwxICk7CisgICBTZXRQcm9wKCBQX05BTUUsICJEYW5jZXJzIFNhbmR0aWdlcmtyYWxsZSIgKTsKKyAgIFNldFByb3AoIFBfR0VOREVSLCBGRU1BTEUgKTsKKyAgIFNldFByb3AoIFBfU0hPUlQsICJEYW5jZXJzIFNhbmR0aWdlcmtyYWxsZSIgKTsKKyAgIFNldFByb3AoIFBfTE9ORywgYnMoICJEaWUgU2FuZHRpZ2Vya3JhbGxlIHZvbiBEYW5jZXIgaXN0ICIrCisgICAgICAgICAgICAgICJlaW4ga2xlaW5lcyBUb29sLCBtaXQgZGVtIER1IGdld29laG5saWNoZSBEZXRhaWxzICIrCisgICAgICAgICAgICAgICJpbiBhbGxlbiBSYWV1bWVuIG5hY2hzY2hhdWVuIHVuZCBpbiBEZWluZW4gZWlnZW5lbiAiKworICAgICAgICAgICAgICAiaGluenVmdWVnZW4ga2FubnN0LiBXZWl0ZXJlIEluZm9ybWF0aW9uZW4ga2FubnN0IER1ICIrCisgICAgICAgICAgICAgICJtaXQgZGVtIEJlZmVobCA8ZGFuY2V0b29sPiBiZWtvbW1lbi4iICkgKTsKKyAgIFNldFByb3AoIFBfQVJUSUNMRSwgMiApOworICAgU2V0UHJvcCggUF9XRUlHSFQsIDUwMCApOworICAgU2V0UHJvcCggUF9WQUxVRSwgMTAwMDAgKTsKKyAgIFNldFByb3AoIFBfTk9CVVksIDEgKTsKKyAgIFNldFByb3AoIFBfTk9EUk9QLCAxICk7CisgICBBZGRJZCggImtyYWxsZSIgKTsKKyAgIEFkZElkKCAic2FuZHRpZ2Vya3JhbGxlIiApOworICAgQWRkSWQoICJ0aWdlcmtyYWxsZSIgKTsKKyAgIEFkZElkKCAiZGFuY2V0b29sIiApOworICAgQWRkSWQoICJkYW5jZXJ0b29sIiApOworICAgc2V0ZXVpZChnZXR1aWQodGhpc19vYmplY3QoKSkpOworfQorIAorIAordm9pZCBpbml0KCkKK3sKKyAgaWYgKCFJU19MRUFSTkVSKHRoaXNfcGxheWVyKCkpKSByZXR1cm47CisgIDo6aW5pdCgpOworICBhZGRfYWN0aW9uKCJxdWVyeV9hZGRfZGV0YWlscyIsICJzaG93X2RldGFpbCIgKTsKKyAgYWRkX2FjdGlvbigicXVlcnlfYWRkX2RldGFpbHMiLCAic2hvd19kZXRhaWxzIiApOworICBhZGRfYWN0aW9uKCJxdWVyeV9hZGRfZGV0YWlscyIsICJzZCIgKTsKKyAgYWRkX2FjdGlvbigic2V0X2FkZF9kZXRhaWwiLCAiYWRkX2RldGFpbCIgKTsKKyAgYWRkX2FjdGlvbigic2V0X2FkZF9kZXRhaWwiLCAiYWRkX2RldGFpbHMiICk7CisgIGFkZF9hY3Rpb24oInNldF9hZGRfZGV0YWlsIiwgImFkIiApOworICBhZGRfYWN0aW9uKCJnaXZlX2luZm8iLCAiZGFuY2V0b29sIiApOworfQorIAorIAoraW50IGdpdmVfaW5mbygpCit7CisgICB3cml0ZSggIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICk7CisgICB3cml0ZSggIkRpZSBTYW5kdGlnZXJrcmFsbGUgZXJtb2VnbGljaHQgZm9sZ2VuZGUgQmVmZWhsZTpcbiIgKTsKKyAgIHdyaXRlKCAiXG5hZGRfZGV0YWlsLCBhZGRfZGV0YWlscyBvZGVyIGFkOlxuIiApOworICAgd3JpdGUoIGJzKCAiUnVmdCBlaW5lbiBrbGVpbmVuIEFkZERldGFpbC1FZGl0b3IgYXVmLCBtaXQgZGVtIER1ICIrCisgICAgICAiRGV0YWlscyBpbiBEZWluZSBlaWdlbmVuIFJhZXVtZSBlaW5mdWVnZW4ga2FubnN0LiBBbHMgQXJndW1lbnQgIisKKyAgICAgICJrYW5uIGhpbnRlciBkZW4gQmVmZWhsIGRlciBGaWxlbmFtZSBlaW5lcyBSYXVtZXMgZWluZ2VnZWJlbiAiKworICAgICAgIndlcmRlbi4gV2lyZCBrZWluIEFyZ3VtZW50IGVpbmdlZ2ViZW4sIHNvIHdpcmQgZGVyIFJhdW0gIisKKyAgICAgICJnZW5vbW1lbiwgaW4gZGVtIER1IGdlcmFkZSBzdGVoc3QuIEFjaHR1bmc6IEVzIGtvZW5uZW4gIisKKyAgICAgICJudXIgRGV0YWlscyBpbiBSYWV1bWUgZWluZ2VmdWVndCBoYWJlbiwgZGllIGJlcmVpdHMgZWluICIrCisgICAgICAiQWRkRGV0YWlsIGluIGlocmVtIGNyZWF0ZSgpIGhhYmVuLiBEdSBtdXNzdCBkaWUgTHVwZSBoYWJlbiwgIisKKyAgICAgICJkYSBkZXIgUmF1bSBuYWNoIGRlbSBFaW5mdWVnZW4gZGVzIERldGFpbHMgYXV0b21hdGlzY2ggIisKKyAgICAgICJuZXUgZ2VsYWRlbiB3aXJkLiIgKSApOworICAgd3JpdGUoICJcbnNob3dfZGV0YWlsLCBzaG93X2RldGFpbHMgb2RlciBzZDpcbiIgKTsKKyAgIHdyaXRlKCBicyggIlplaWd0IERpciBhbGxlIFplaWxlbiBkZXMgYW5nZXNwcm9jaGVuZW4gUmF1bWVzIGJ6dy4gIisKKyAgICAgICJkZXMgUmF1bWVzIGluIGRlbSBEdSBzdGVoc3QsIGRpZSBlaW4gQWRkRGV0YWlsICIrCisgICAgICAiYmVpbmhhbHRlbi4gU28ga2FubnN0IER1IGtvbnRyb2xsaWVyZW4sIHdlbGNoZSBEZXRhaWxzICIrCisgICAgICAiRHUgc2Nob24gZWluZ2ViYXV0IGhhc3QuIiApICk7CisgICB3cml0ZSggIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICk7CisgICByZXR1cm4gMTsKK30KKyAKKyAKK2ludCByZW5ld192YXJpYWJsZXMoKQoreworICAgaSA9IGNvdW50ZXIgPSBmaXJzdF9kZXRhaWxfbGluZSA9IHN0YXJ0bGluZSA9IGVuZGxpbmUgPSAwOyAKKyAgIGRldGFpbF9zaG9ydHMgPSBuZXdzdHJpbmcgPSBmaWxlX2xpbmVzID0gbmV3X2xpbmVzID0gKHt9KTsKKyAgIGRldGFpbF9sb25nID0gc2F2ZV9zdHJpbmcgPSBvbGRfZmlsZSA9IG5ld19maWxlID0gYWN0dWFsX2ZpbGUgPSBkZXRhaWxfdGV4dCA9IDA7CisgICByZXR1cm4gMTsKK30gCisgCisgCisgCitpbnQgcXVlcnlfYWRkX2RldGFpbHMoIHN0cmluZyBzdHIgKQoreworICAgc3RyaW5nIG9sZF9maWxlLCAqZmlsZV9saW5lcywgbmV3X2ZpbGUsICpuZXdfbGluZXMsIGFjdHVhbF9maWxlOyAgICAgICAgCisgICBpbnQgaSwgY291bnRlciwgZmlyc3RfZGV0YWlsX2xpbmUsIHN0YXJ0bGluZSwgZW5kbGluZTsgICAgICAKKyAKKyAgIGFjdHVhbF9maWxlID0gIiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICBpZiAoICFzdHIgKSBhY3R1YWxfZmlsZSA9IG9iamVjdF9uYW1lKCBlbnZpcm9ubWVudCggdGhpc19wbGF5ZXIoKSApICkrIi5jIjsKKyAgIGVsc2UgICAgICAgCisgICB7CisgICAgICBpZiAoIHN0clswLi4wXSA9PSAiLyIgKQorICAgICAgeworICAgICAgICAgaWYgKCBzdHJbPDIuLl0gIT0gIi5jIiApCisgICAgICAgICAgICAgYWN0dWFsX2ZpbGUgPSBzdHIrIi5jIjsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICBhY3R1YWxfZmlsZSA9IHN0cjsKKyAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgIHsKKyAgICAgICAgIGlmICggc3RyWzwyLi5dICE9ICIuYyIgKQorICAgICAgICAgICAgIGFjdHVhbF9maWxlID0gdGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKCBQX0NVUlJFTlRESVIgKSsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIvIitzdHIrIi5jIjsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICBhY3R1YWxfZmlsZSA9IHRoaXNfcGxheWVyKCktPlF1ZXJ5UHJvcCggUF9DVVJSRU5URElSICkrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiLyIrc3RyOworICAgICAgfQorICAgfQorICAgaWYgKCBmaWxlX3NpemUoIGFjdHVhbF9maWxlICk9PS0xICkKKyAgIHsKKyAgICAgd3JpdGUoICJGaWxlOiAiK2FjdHVhbF9maWxlKyIgbmljaHQgZ2VmdW5kZW4hXG4iICk7CisgICAgIHJldHVybiAxOworICAgfQorICAgY2FsbF9vdGhlciggYWN0dWFsX2ZpbGUsICI/Pz8iICk7CisgICB3cml0ZSggIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgKTsKKyAgIHdyaXRlKCAiQWt0dWVsbGVzIEZpbGU6ICAgIithY3R1YWxfZmlsZSsiXG4iICk7CisgICB3cml0ZSggIkZpbGVncm9lc3NlOiAgICAgICIrZmlsZV9zaXplKCBhY3R1YWxfZmlsZSApKyJcbiIgKTsKKyAgIHdyaXRlKCAiVXNlcmlkIGRlcyBGaWxlczogIitnZXR1aWQoIGZpbmRfb2JqZWN0KCBhY3R1YWxfZmlsZSApICkrIlxuIiApOworICAgbmV3X2ZpbGUgPSAiIjsKKyAgIGNvdW50ZXIgPSAwOworICAgZmlyc3RfZGV0YWlsX2xpbmUgPSAwOworICAgb2xkX2ZpbGUgPSByZWFkX2ZpbGUoIGFjdHVhbF9maWxlICk7CisgICBmaWxlX2xpbmVzID0gKHsgImR1bW15IiB9KSArIG9sZF9leHBsb2RlKCBvbGRfZmlsZSwgIlxuIiApOyAgICAgICAgICAKKyAgIHN0YXJ0bGluZSA9IDE7CisgICBlbmRsaW5lID0gc2l6ZW9mKCBmaWxlX2xpbmVzICktMTsgICAgICAgIAorICAgZm9yKCBpID0gc3RhcnRsaW5lOyBpIDw9IGVuZGxpbmU7IGkrKyApCisgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgIG5ld19maWxlID0gbmV3X2ZpbGUrZmlsZV9saW5lc1sgaSBdKyJcbiI7CisgICAgICBpZiAoIHN0cnN0ciggZmlsZV9saW5lc1tpXSwgIkFkZERldGFpbCIgKSAhPSAtMSApCisgICAgICB7CisgICAgICAgICB3cml0ZSggZmlsZV9saW5lc1tpXSsiXG4iICk7CisgICAgICAgICBpZiAoICFmaXJzdF9kZXRhaWxfbGluZSApIGZpcnN0X2RldGFpbF9saW5lID0gaTsKKyAgICAgICAgICBjb3VudGVyID0gY291bnRlciArIDE7CisgICAgICB9CisgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIHdyaXRlKCAiRGV0YWlscyBmb3VuZDogIitjb3VudGVyKyIuXG4iICk7IAorICAgd3JpdGUoICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApOworICAgcmV0dXJuIDE7Cit9ICAgIAorIAorIAoraW50IHNldF9hZGRfZGV0YWlsKCBzdHJpbmcgc3RyICkKK3sKKyAKKyAgIHJlbmV3X3ZhcmlhYmxlcygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgaWYgKCAhc3RyICkgYWN0dWFsX2ZpbGUgPSBvYmplY3RfbmFtZSggZW52aXJvbm1lbnQoIHRoaXNfcGxheWVyKCkgKSApKyIuYyI7CisgICBlbHNlICAgICAgIAorICAgeworICAgICAgaWYgKCBzdHJbMC4uMF0gPT0gIi8iICkKKyAgICAgIHsKKyAgICAgICAgIGlmICggc3RyWzwyLi5dICE9ICIuYyIgKQorICAgICAgICAgICAgIGFjdHVhbF9maWxlID0gc3RyKyIuYyI7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICAgYWN0dWFsX2ZpbGUgPSBzdHI7CisgICAgICB9CisgICAgICBlbHNlCisgICAgICB7CisgICAgICAgICBpZiAoIHN0cls8Mi4uXSAhPSAiLmMiICkKKyAgICAgICAgICAgICBhY3R1YWxfZmlsZSA9IHRoaXNfcGxheWVyKCktPlF1ZXJ5UHJvcCggUF9DVVJSRU5URElSICkrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiLyIrc3RyKyIuYyI7CisgICAgICAgICBlbHNlCisgICAgICAgICAgICAgYWN0dWFsX2ZpbGUgPSB0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoIFBfQ1VSUkVOVERJUiApKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIi8iK3N0cjsKKyAgICAgIH0KKyAgIH0KKyAgIGlmICggZmlsZV9zaXplKCBhY3R1YWxfZmlsZSApPT0tMSApCisgICB7CisgICAgIHdyaXRlKCAiRmlsZTogIithY3R1YWxfZmlsZSsiIG5pY2h0IGdlZnVuZGVuIVxuIiApOworICAgICByZXR1cm4gMTsKKyAgIH0KKyAgIGNhbGxfb3RoZXIoIGFjdHVhbF9maWxlLCAiPz8/IiApOworICAgd3JpdGUoICJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICk7CisgICB3cml0ZSggIkFrdHVlbGxlcyBGaWxlOiAgICIrYWN0dWFsX2ZpbGUrIlxuIiApOworICAgd3JpdGUoICJGaWxlZ3JvZXNzZTogICAgICAiK2ZpbGVfc2l6ZSggYWN0dWFsX2ZpbGUgKSsiXG4iICk7CisgICB3cml0ZSggIlVzZXJpZCBkZXMgRmlsZXM6ICIrZ2V0dWlkKCBmaW5kX29iamVjdCggYWN0dWFsX2ZpbGUgKSApKyJcbiIgKTsKKyAgIG5ld19maWxlID0gIiI7CisgICBuZXdfbGluZXMgPSAoeyAiZHVtbXkiIH0pOworICAgY291bnRlciA9IDA7CisgICBmaXJzdF9kZXRhaWxfbGluZSA9IDA7CisgICBvbGRfZmlsZSA9IHJlYWRfZmlsZSggYWN0dWFsX2ZpbGUgKTsKKyAgIGZpbGVfbGluZXMgPSAoeyAiZHVtbXkiIH0pICsgb2xkX2V4cGxvZGUoIG9sZF9maWxlLCAiXG4iICk7ICAgICAgICAgIAorICAgc3RhcnRsaW5lID0gMTsKKyAgIGVuZGxpbmUgPSBzaXplb2YoIGZpbGVfbGluZXMgKS0xOyAgICAgICAgCisgICBmb3IoIGkgPSBzdGFydGxpbmU7IGkgPD0gZW5kbGluZTsgaSsrICkKKyAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgbmV3X2ZpbGUgPSBuZXdfZmlsZStmaWxlX2xpbmVzWyBpIF0rIlxuIjsKKyAgICAgIGlmICggc3Ryc3RyKCBmaWxlX2xpbmVzW2ldLCAiQWRkRGV0YWlsIiApICE9IC0xICkKKyAgICAgIHsKKyAgICAgICAgaWYgKCAhZmlyc3RfZGV0YWlsX2xpbmUgKSBmaXJzdF9kZXRhaWxfbGluZSA9IGk7CisgICAgICAgIGNvdW50ZXIgPSBjb3VudGVyICsgMTsKKyAgICAgIH0KKyAgIH0KKyAgIGlmICggIWZpcnN0X2RldGFpbF9saW5lICkKKyAgIHsKKyAgICAgIHdyaXRlKCBicyggIkVzIHd1cmRlbiBpbSBGaWxlICIrYWN0dWFsX2ZpbGUrIiBrZWluZSAiKworICAgICAgICAgIkRldGFpbHMgZ2VmdW5kZW4hIFVtIERldGFpbHMgaGluenVmdWVnZW4genUga29lbm5lbiwgIisKKyAgICAgICAgICJtdXNzIG1pbmRlc3RlbnMgZWluIEFkZERldGFpbCBiZXJlaXRzIHZvcmhhbmRlbiBzZWluISIgKSApOworICAgICAgd3JpdGUoICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApOworICAgICAgcmV0dXJuIDE7CisgICB9CisgICB3cml0ZSggIkRldGFpbHMgZm91bmQ6ICAgICIrY291bnRlcisiLlxuIiApOworICAgd3JpdGUoICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApOyAKKyAgIHdyaXRlKCAiQml0dGUgZGllIERldGFpbC1LdWVyemVsIGVpbmdlYmVuOlxuKEJlbWVya3VuZzogIisKKyAgICAgICAgICAiZGllIEt1ZXJ6ZWwgbXVlc3NlbiBtaXQgTGVlcnplaWNoZW4gZ2V0cmVubnQgc2VpbiwgIisKKyAgICAgICAgICAiQWJicnVjaCBtaXQgJ3EnLilcbi0+IiApOworICAgaW5wdXRfdG8oICJnZXRfZGV0YWlsX3Nob3J0IiApOworICAgcmV0dXJuIDE7Cit9ICAgIAorIAorIAoraW50IGdldF9kZXRhaWxfc2hvcnQoIHN0cmluZyBzdHIgKQoreworICAgc3RyaW5nIGR1bW15OworICAgaWYgKCBzdHIgPT0gInEiICkKKyAgIHsKKyAgICAgdGVsbF9vYmplY3QoIHRoaXNfcGxheWVyKCksICJBYmdlYnJvY2hlbiFcbiIgKTsKKyAgICAgcmV0dXJuIDE7CisgICB9CisgICBkZXRhaWxfc2hvcnRzID0gbWFwKCBvbGRfZXhwbG9kZSggc3RyLCAiICIgKSwjJ2xvd2VyX2Nhc2UpOworICAgZHVtbXkgPSBicmVha19zdHJpbmcoaW1wbG9kZShzb3J0X2FycmF5KG1hcChkZXRhaWxfc2hvcnRzLCMnbG93ZXJfY2FzZSksIyc+KSwiLCAiKSsiOiIsNzgpOworICAgd3JpdGUoICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApOworICAgd3JpdGUoIGJzICggIkJpdHRlIEJlc2NocmVpYnVuZyBlaW5nZWJlbiBmdWVyIGRhcyBEZXRhaWwgbWl0IGRlbiBOYW1lbiBcbiIgKSApOworICAgd3JpdGUoIGR1bW15KyIoIEFiYnJ1Y2ggbWl0ICdxJy4pXG4tPiIgKTsKKyAgIGlucHV0X3RvKCAiZ2V0X2RldGFpbF9sb25nIiApOworICAgcmV0dXJuIDE7Cit9CisgCisgCitpbnQgZ2V0X2RldGFpbF9sb25nKCBzdHJpbmcgc3RyICkKK3sKKyAgIGlmICggc3RyID09ICJxIiApCisgICB7CisgICAgIHdyaXRlKCAiQWJnZWJyb2NoZW4hXG4iICk7CisgICAgIHdyaXRlKCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgKTsKKyAgICAgcmV0dXJuIDE7CisgICB9CisgICBkZXRhaWxfbG9uZyA9IGJyZWFrX3N0cmluZyggImJyZWFrX3N0cmluZyggXCIiK3N0ciwgNjAgKTsgCisgICBzYXZlX3N0cmluZyA9ICIgIEFkZERldGFpbCggKHsgIjsgICAgICAgIAorICAgZm9yKCBpID0gMDsgaSA8IHNpemVvZiggZGV0YWlsX3Nob3J0cyApOyBpICsrICkKKyAgIHsKKyAgICAgIGlmICggIShpJTMpICYmIGkgKQorICAgICAgICBzYXZlX3N0cmluZyA9IHNhdmVfc3RyaW5nICsgIlxuICAgICAgICAgICAgICAgICI7CisgICAgICBpZiAoIGkgPCBzaXplb2YoIGRldGFpbF9zaG9ydHMgKSAtIDEgKSAKKyAgICAgICAgIGRldGFpbF9zaG9ydHNbIGkgXSA9ICJcIiIrZGV0YWlsX3Nob3J0c1sgaSBdKyJcIiwgIjsKKyAgICAgIGVsc2UKKyAgICAgICAgIGRldGFpbF9zaG9ydHNbIGkgXSA9ICJcIiIrZGV0YWlsX3Nob3J0c1sgaSBdKyJcIiAiOworICAgICAgc2F2ZV9zdHJpbmcgPSBzYXZlX3N0cmluZyArIGRldGFpbF9zaG9ydHNbIGkgXTsgICAgICAKKyAgICAgIHdyaXRlKCBkZXRhaWxfc2hvcnRzWyBpIF0rIlxuIiApOworICAgfQorICAgc2F2ZV9zdHJpbmcgPSBzYXZlX3N0cmluZyArICJ9KSwgXG4iOworICAgbmV3c3RyaW5nID0gb2xkX2V4cGxvZGUoIGRldGFpbF9sb25nLCJcbiIpOworICAgaSA9IDA7IAorICAgZm9yKCBpID0gMDsgaTxzaXplb2YobmV3c3RyaW5nKTsgaSsrKSAKKyAgIHsKKyAgICAgIGlmICggaSA8IHNpemVvZihuZXdzdHJpbmcpLTEgKQorICAgICAgeworICAgICAgICAgaWYgKCBpPT0wfHwhaSApCisgICAgICAgICAgc2F2ZV9zdHJpbmcgPSBzYXZlX3N0cmluZyArIiAgICAgICAgICAgICAgICAiK25ld3N0cmluZ1tpXSsiIFwiK1xuIjsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICBzYXZlX3N0cmluZyA9IHNhdmVfc3RyaW5nICsiICAgICAgICAgICAgICAgIFwiIisgbmV3c3RyaW5nW2ldKyIgXCIrXG4iOworIAorICAgICAgfQorICAgICAgZWxzZQorICAgICAgeworICAgICAgICAgaWYgKCBpPT0wfHwhaSApCisgICAgICAgICAgc2F2ZV9zdHJpbmcgPSBzYXZlX3N0cmluZyArIiAgICAgICAgICAgICAgICAiKyBuZXdzdHJpbmdbaV0rIlwiLCA3OCApICk7IjsKKyAgICAgICAgIGVsc2UKKyAgICAgICAgICBzYXZlX3N0cmluZyA9IHNhdmVfc3RyaW5nICsiICAgICAgICAgICAgICAgIFwiIisgbmV3c3RyaW5nW2ldKyJcIiwgNzggKSApOyI7CisgICAgICB9CisgICB9CisgICBuZXdfbGluZXMgKz0gKHsgImR1bW15IiB9KTsKKyAgIGZvciAoIGkgPSAxOyBpIDwgZmlyc3RfZGV0YWlsX2xpbmU7IGkrKyApCisgICB7CisgICAgIG5ld19saW5lcyArPSAoeyBmaWxlX2xpbmVzW2ldIH0pOworICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgIG5ld19saW5lcyArPSAoeyBzYXZlX3N0cmluZyB9KTsKKyAgIGZvciAoIGkgPSBmaXJzdF9kZXRhaWxfbGluZSArIDE7IGkgPD0gZW5kbGluZSsxOyBpKysgKQorICAgICBuZXdfbGluZXMgKz0gKHsgZmlsZV9saW5lc1sgaSAtIDEgXSB9KTsKKyAgIHdyaXRlKCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgKTsKKyAgIHdyaXRlKCBicyggIkZvbGdlbmRlIFplaWxlbiB3ZXJkZW4gaW4gZGllIERhdGVpICIrYWN0dWFsX2ZpbGUrIiBnZXNjaHJpZWJlbiwgZmFsbHMgYGpgIGVpbmdlZ2ViZW4gd2lyZDpcbiIgKSApOworICAgd3JpdGUoIHNhdmVfc3RyaW5nKyJcbiIgKTsKKyAgIHdyaXRlKCAiXG5EZXRhaWwgc3BlaWNoZXJuPyAoai9uKVxuLT4iICk7CisgICBpbnB1dF90byggInNhdmVfZGV0YWlsIiApOworICAgcmV0dXJuIDE7Cit9CisgCisgCitpbnQgc2F2ZV9kZXRhaWwoIHN0cmluZyBzdHIgKQoreyAgCisgICBpZiAoIHN0ciAhPSAiaiIgJiYgc3RyICE9ICJqYSIgJiYgc3RyICE9ICJKYSIgJiYgc3RyICE9ICJKIiApCisgICB7CisgICAgIHdyaXRlKCAiQWJnZWJyb2NoZW4hXG4iICk7CisgICAgIHdyaXRlKCAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgKTsKKyAgICAgcmV0dXJuIDE7CisgICB9ICAgCisgICBpZiAoICFybSggYWN0dWFsX2ZpbGUgKSApCisgICB7CisgICAgICB3cml0ZSggIkZpbGU6ICIrYWN0dWFsX2ZpbGUrIiB3dXJkZSBuaWNodCBnZWZ1bmRlbiFcbiIgKTsKKyAgICAgIHJldHVybiAxOworICAgfSAgICAgICAgICAgICAgICAgICAKKyAgIGZvciAoIGkgPSAyOyBpIDw9IGVuZGxpbmUrMjsgaSsrICkKKyAgICAgd3JpdGVfZmlsZSggYWN0dWFsX2ZpbGUsIG5ld19saW5lc1tpXSsiXG4iICk7IAorICAgICAvL3dyaXRlKCBuZXdfbGluZXNbaV0rIlxuIiApOyAKKyAgIHdyaXRlKCAiRGFzIERldGFpbCB3dXJkZSBpbiBkaWUgRGF0ZWkgZ2VzY2hyaWViZW4uXG4iICk7CisgICB0aGlzX3BsYXllcigpLT5jb21tYW5kX21lKCAiaGVyZSBtYWtlIiApOworICAgd3JpdGUoICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApOyAgCisgICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL29iai90b29scy9leHBsb3Jlci5jIGIvb2JqL3Rvb2xzL2V4cGxvcmVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJkYThhYwotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9leHBsb3Jlci5jCkBAIC0wLDAgKzEsNDQ1IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gZXhwbG9yZXIuYyAtLSBUb29sIHp1ciBGUC1WZXJ3YWx0dW5nCisvLworLy8gJElkOiBleHBsb3Jlci5jIDgzNTcgMjAxMy0wMi0wOSAxMToxNjoxNFogWmVzc3RyYSAkCisKK2luaGVyaXQgIi9zdGQvc2VjdXJlX3RoaW5nIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxleHBsb3JhdGlvbi5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorCitjcmVhdGUoKQoreworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfU0hPUlQsICJEZXIgRXJmb3JzY2hlciIpOworICBTZXRQcm9wKFBfTkFNRSwgIkVyZm9yc2NoZXIiKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgTUFMRSk7CisgIFNldFByb3AoUF9MT05HLCAiRGllcyBpc3QgZGVyIGJlcnVlaG10ZSBFcmZvcnNjaGVyIGRlcyBNb3JnZW5HcmF1ZW5zLiBFclxuIgorCSAgKyJzdGVsbHQgZm9sZ2VuZGUgQmVmZWhsZSB6dXIgVmVyZnVlZ3VuZzpcbiIKKwkgICsiICBlcGFkZCA8d2FzPjogPGJvbnVzPiA8dHlwPiA8a2V5cz5cbiIKKwkgICsiICBlcGNoYW5nZSA8d2FzPjogPHdpZT4gPG5ldT5cbiIKKwkgICsiICBlcGRlbCA8d2FzPlxuIgorCSAgKyIgIGVwaW5mbyA8d2FzPlxuIgorCSAgKyIgIGVwY291bnQgPHNwaWVsZXJuYW1lPiAgICAgICAgICAgICAgICAgICAtIEFuemFobCBkZXIgRVBzIGRlcyBTcGllbGVyc1xuIgorCSAgKyIgIGVwc2NhbiA8c3BpZWxlcm5hbWU+IFtmaWxlbmFtZW5wYXR0ZXJuXSAtIFplaWdlIGRlc3NlbiBFUHMgZ2VmaWx0ZXJ0IGFuXG4iCisJICArIiAgZXBwbGFkZCA8c3BpZWxlcm5hbWU+IDxlcC1hbnphaGw+ICAgICAgIC0gR2liIGlobSBlcC1hbnphaGwgRVBzICh6dWZhZWxsaWcpXG4iCisJICArIiAgZXBwbGRlbCA8c3BpZWxlcm5hbWU+IDxlcC1hbnphaGw+ICAgICAgIC0gTG9lc2NoZSBpaG0gZXAtYW56YWhsIEVQcyAoenVmYWVsLilcbiIKKwkgICsiICBlcHBsc2V0IDxzcGllbGVybmFtZT4gPGVwLW51bW1lcj4gICAgICAgLSBTZXR6ZSBpaG0gRVAgZXAtbnVtbWVyXG4iCisJICArIiAgZXBwbGNsciA8c3BpZWxlcm5hbWU+IDxlcC1udW1tZXI+ICAgICAgIC0gTG9lc2NoZSBpaG0gRVAgZXAtbnVtbWVyXG4iCisJICArIkRhYmVpIGJlZGV1dGV0OlxuIgorCSAgKyI8d2FzPiAgIC0gRGFzIE9iamVrdCAoZWluZSBJRCBiZWkgT2JqZWt0ZW4gaW4gZGVyIE5hZWhlLCBoaWVyIG9kZXJcbiIKKwkgICsiICAgICAgICAgIGhlcmUgZnVlciBkZW4gYWt0dWVsbGVuIFJhdW0sIG9kZXIgZWluIERhdGVpbmFtZSlcbiIKKwkgICsiPGJvbnVzPiAtIG4gZnVlciBub3JtYWxlIEVQcywgYiBmdWVyIEJvbnVzLUVQcyAoei5CLiBQYXJhLUVQcylcbiIKKwkgICsiPHR5cD4gICAtIGRldGFpbCwgcmRldGFpbCwgZXhpdC9hdXNnYW5nLCBjbWQvYmVmZWhsL2tvbW1hbmRvLCBpbmZvLCBwdWIsIG1pc2MsXG4iCisJICArIiAgICAgICAgICBzbWVsbC9nZXJ1Y2gsIHNvdW5kL25vaXNlLCB0YXN0ZS90b3VjaFxuIgorCSAgKyI8a2V5PiAgIC0gTGlzdGUgZGVyIFNjaGx1ZXNzZWx3b2VydGVyLCBtaXQgS29tbWF0YSBnZXRyZW5udFxuIgorCSAgKyI8d2llPiAgIC0gb2JqLCBrZXksIGJvbnVzIG9kZXIgdHlwIDFcbiIKKwkgICsiPG5ldT4gICAtIEplIG5hY2ggPHdpZT47IHNpZWhlIDx3YXM+LCA8a2V5PiwgPHR5cD5cbiIKKwkgICk7CisgIFNldFByb3AoUF9OT0RST1AsIDEpOworICBTZXRQcm9wKFBfTkVWRVJEUk9QLCAxKTsKKyAgU2V0UHJvcChQX0FVVE9MT0FET0JKLDEpOworICBBZGRJZCgoeyJleHBsb3JlciIsImVyZm9yc2NoZXIifSkpOworCisgIEFkZENtZCgoeyJlcGFkZCJ9KSwgImFkZCIpOworICBBZGRDbWQoKHsiZXBjaGFuZ2UifSksICJjaGFuZ2UiKTsKKyAgQWRkQ21kKCh7ImVwZGVsIn0pLCAiZGVsIik7CisgIEFkZENtZCgoeyJlcGluZm8ifSksICJpbmZvIik7CisgIEFkZENtZCgoeyJlcGNvdW50In0pLCAiZXBjb3VudCIpOworICBBZGRDbWQoKHsiZXBzY2FuIn0pLCAiZXBzY2FuIik7CisgIEFkZENtZCgoeyJlcHBsYWRkIn0pLCAiZXBwbGFkZCIpOworICBBZGRDbWQoKHsiZXBwbGRlbCJ9KSwgImVwcGxkZWwiKTsKKyAgQWRkQ21kKCh7ImVwcGxzZXQifSksICJlcHBsc2V0Iik7CisgIEFkZENtZCgoeyJlcHBsY2xyIn0pLCAiZXBwbGNsciIpOworfQorCitzdGF0aWMgc3RyaW5nIHN0ckFycihzdHJpbmcgKnMpCit7CisgIHN0cmluZyByZXQ7CisgIGludCBpOworCisgIHJldCA9ICgiXCIiICsgc1s8MV0gKyAiXCIiKTsKKyAgZm9yIChpPXNpemVvZihzKS0yOyBpPj0wOyBpLS0pCisgICAgcmV0ICs9ICgiLCBcIiIrc1tpXSsiXCIiKTsKKworICByZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IGdldFR5cGUoc3RyaW5nIHMpCit7CisgIHN3aXRjaChzWzAuLjJdKSB7CisgIGNhc2UgImRldCI6CisgICAgcmV0dXJuIEVQX0RFVEFJTDsKKyAgY2FzZSAicmRlIjoKKyAgICByZXR1cm4gRVBfUkRFVDsKKyAgY2FzZSAiYXVzIjoKKyAgY2FzZSAiZXhpIjoKKyAgICByZXR1cm4gRVBfRVhJVDsKKyAgY2FzZSAiY21kIjoKKyAgY2FzZSAiYmVmIjoKKyAgY2FzZSAia29tIjoKKyAgICByZXR1cm4gRVBfQ01EOworICBjYXNlICJpbmYiOgorICAgIHJldHVybiBFUF9JTkZPOworICBjYXNlICJwdWIiOgorICAgIHJldHVybiBFUF9QVUI7CisgIGNhc2UgIm1pcyI6CisgIGNhc2UgInZlciI6CisgICAgcmV0dXJuIEVQX01JU0M7CisgIGNhc2UgInNtZSI6CisgIGNhc2UgImdlciI6CisgICAgcmV0dXJuIEVQX1NNRUxMOworICBjYXNlICJzb3UiOgorICBjYXNlICJub2kiOgorICAgIHJldHVybiBFUF9TT1VORDsKKyAgY2FzZSAidGFzIjoKKyAgY2FzZSAidG91IjoKKyAgICByZXR1cm4gRVBfVE9VQ0g7CisgIH0KKyAgcmV0dXJuIC0xOworfQorCitzdGF0aWMgb2JqZWN0IGdldE9iKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBvYjsKKworICBpZiAoc3RyID09ICJoaWVyIiB8fCBzdHIgPT0gImhlcmUiICkKKyAgICByZXR1cm4gZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSk7CisKKyAgb2IgPSBwcmVzZW50KHN0ciwgZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkpOworICBpZiAoIW9iKQorICAgIG9iID0gcHJlc2VudChzdHIsIHRoaXNfcGxheWVyKCkpOworCisgIGlmICghb2IpIHsKKyAgICBzdHIgPSAiL3NlY3VyZS9tYXN0ZXIiLT5fZ2V0X3BhdGgoc3RyLCBnZXR1aWQodGhpc19wbGF5ZXIoKSkpOworICAgIGNhdGNoKGNhbGxfb3RoZXIoc3RyLCAiPz8/IikpOworICAgIG9iID0gZmluZF9vYmplY3Qoc3RyKTsKKyAgfQorICByZXR1cm4gb2I7Cit9CisKK3N0YXRpYyBzdHJpbmcgKmdldEtleXMoc3RyaW5nIHN0cikKK3sKKyAgaW50IGk7CisgIHN0cmluZyAqdDEsICp0MjsKKworICB0MSA9IHJlZ2V4cGxvZGUoc3RyLCAiLCAqIik7CisgIGZvciAodDIgPSAoe30pLCBpPXNpemVvZih0MSktMTsgaT49MDsgaS09MikKKyAgICB0MiA9ICh7IHQxW2ldIH0pICsgdDI7CisgIHJldHVybiB0MjsKK30KKworc3RhdGljIHN0cmluZyBlcnJNc2coaW50IGNvZGUpCit7CisgIGlmIChjb2RlID49IDAgfHwgY29kZSA8IEVQRVJSX0lOVkFMSURfQVJHKQorICAgIHJldHVybiAiVW5iZWthbm50ZXIgRmVobGVyIjsKKworICBjb2RlID0gLShjb2RlKzEpOworICByZXR1cm4gKHsgIkR1IGJpc3Qga2VpbiBFcnptYWdpZXIiLCAiVW5ndWVsdGlnZXMgT2JqZWt0IiwKKwkgICAgIk9iamVrdCBzdGVodCBuaWNodCBpbiBkZXIgTGlzdGUiLCAiVW5ndWVsdGlnZXMgQXJndW1lbnQifSlbY29kZV07Cit9CisKK3N0YXRpYyBpbnQgYWRkKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyB3YXMsIHQsIGssICprZXlzLCBiOworICBpbnQgdHlwZSwgYm9udXM7CisgIG9iamVjdCBvYjsKKworICBpZiggIUFSQ0hfU0VDVVJJVFkgKSB7CisgICAgbm90aWZ5X2ZhaWwoIkR1IGJpc3Qga2VpbiBFcnptYWdpZXIhXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBub3RpZnlfZmFpbCgiU3ludGF4OiBlcGFkZCA8d2FzPjogPHR5cD5cbiIpOworICBpZiAoIShzdHIgPSB0aGlzX3BsYXllcigpLT5fdW5wYXJzZWRfYXJncygpKSkKKyAgICByZXR1cm4gMDsKKworICBpZiAoc3NjYW5mKHN0ciwgIiVzOiAlcyAlcyAlcyIsIHdhcywgYiwgdCwgaykgIT00KQorICAgIHJldHVybiAwOworCisgIGlmICghKG9iID0gZ2V0T2Iod2FzKSkpIHsKKyAgICBwcmludGYoIkthbm4gJyVzJyBuaWNodCBmaW5kZW4hXG4iLCB3YXMpOworICAgIHJldHVybiAxOworICB9CisgIGlmICgodHlwZSA9IGdldFR5cGUodCkpIDwgMCkgeworICAgIHdyaXRlKCJVbmd1ZWx0aWdlciBUeXAhXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoYj09Im4iKSBib251cz0wOyBlbHNlIGlmIChiPT0iYiIpIGJvbnVzPTE7CisgIGVsc2UgeworICAgIHdyaXRlKCJVbmd1ZWx0aWdlIEJvbnVzYXJ0IVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAga2V5cyA9IGdldEtleXMoayk7CisKKyAgdHlwZSA9IEVQTUFTVEVSLT5BZGRFUE9iamVjdChvYiwga2V5cywgdHlwZSwgYm9udXMpOworICBpZiAodHlwZSA8IDApCisgICAgcHJpbnRmKCJGZWhsZXI6ICVzXG4iLCBlcnJNc2codHlwZSkpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBjaGFuZ2Uoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIHdhcywgd2llLCBuZXU7CisgIG9iamVjdCBvYjsKKyAgaW50IHR5cGU7CisgIG1peGVkIG5ldzsKKworICBpZiggIUFSQ0hfU0VDVVJJVFkgKSB7CisgICAgbm90aWZ5X2ZhaWwoIkR1IGJpc3Qga2VpbiBFcnptYWdpZXIhXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIG5vdGlmeV9mYWlsKCJTeW50YXg6IGVwY2hhbmdlIDx3YXM+OiA8d2llPiA8bmV1PlxuIik7CisgIGlmICghKHN0ciA9IHRoaXNfcGxheWVyKCktPl91bnBhcnNlZF9hcmdzKCkpKQorICAgIHJldHVybiAwOworCisgIGlmIChzc2NhbmYoc3RyLCAiJXM6ICVzICVzIiwgd2FzLCB3aWUsIG5ldSkgIT0gMykKKyAgICByZXR1cm4gMDsKKworICBpZiAoIShvYiA9IGdldE9iKHdhcykpKSB7CisgICAgcHJpbnRmKCAiS2FubiAnJXMnIG5pY2h0IGZpbmRlbiFcbiIsIHdhcyk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgc3dpdGNoKHdpZVswLi4yXSkgeworICBjYXNlICJvYmoiOgorICAgIHR5cGUgPSBDSEFOR0VfT0I7CisgICAgbmV3ID0gZ2V0T2IobmV1KTsKKyAgICBpZiAoIW5ldykgeworICAgICAgcHJpbnRmKCAiS2FubiAnJXMnIG5pY2h0IGZpbmRlbiFcbiIsIG5ldSk7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgImtleSI6CisgICAgdHlwZSA9IENIQU5HRV9LRVk7CisgICAgbmV3ID0gZ2V0S2V5cyhuZXUpOworICAgIGJyZWFrOworICBjYXNlICJ0eXAiOgorICAgIHR5cGUgPSBDSEFOR0VfVFlQRTsKKyAgICBpZiAoKG5ldyA9IGdldFR5cGUobmV1KSkgPCAwKSB7CisgICAgICB3cml0ZSgiVW5ndWVsdGlnZXIgVHlwIVxuIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgYnJlYWs7CisgIGNhc2UgImJvbiI6CisgICAgdHlwZSA9IENIQU5HRV9CT05VUzsKKyAgICBpZiAobmV1PT0ibiIpIG5ldz0wOyBlbHNlIGlmIChuZXU9PSJiIikgbmV3PTE7CisgICAgZWxzZSB7CisgICAgICB3cml0ZSgiVW5ndWVsdGlnZSBCb251c2FydCFcbiIpOworICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGJyZWFrOworICBkZWZhdWx0OgorICAgIHdyaXRlKCJEYXMgbGFlc3N0IHNpY2ggbmljaHQgYWVuZGVybi4uLlxuIik7CisgICAgcmV0dXJuIDE7CisgICAgYnJlYWs7CisgIH0KKyAgdHlwZSA9IEVQTUFTVEVSLT5DaGFuZ2VFUE9iamVjdCggb2IsIHR5cGUsIG5ldyApOworICBpZiAodHlwZSA8IDApCisgICAgcHJpbnRmKCJGZWhsZXI6ICVzXG4iLGVyck1zZyh0eXBlKSk7CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBpbnQgZGVsKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBvYjsKKyAgaW50IHJldDsKKworICBpZiggIUFSQ0hfU0VDVVJJVFkgKSB7CisgICAgbm90aWZ5X2ZhaWwoIkR1IGJpc3Qga2VpbiBFcnptYWdpZXIhXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIXN0cikgeworICAgIG5vdGlmeV9mYWlsKCJTeW50YXg6IGVwZGVsIDx3YXM+XG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBpZiAoIShvYiA9IGdldE9iKHN0cikpKSB7CisgICAgd3JpdGUoIkthbm4gZGFzIE9iamVrdCBuaWNodCBmaW5kZW4hXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXQgPSBFUE1BU1RFUi0+UmVtb3ZlRVBPYmplY3Qob2IpOworICBpZiAocmV0IDwgMCkKKyAgICBwcmludGYoIkZlaGxlcjogJXNcbiIsIGVyck1zZyhyZXQpKTsKKworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBpbmZvKHN0cmluZyBzdHIpCit7CisgIG9iamVjdCBvYjsKKyAgbWl4ZWQgaW5mbzsKKworICBpZiggIUFSQ0hfU0VDVVJJVFkgKSB7CisgICAgbm90aWZ5X2ZhaWwoIkR1IGJpc3Qga2VpbiBFcnptYWdpZXIhXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmICghc3RyKSB7CisgICAgbm90aWZ5X2ZhaWwoIlN5bnRheDogZXBpbmZvIDx3YXM+XG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmICghKG9iID0gZ2V0T2Ioc3RyKSkpIHsKKyAgICB3cml0ZSgiRGFzIGZpbmRlIGljaCBsZWlkZXIgbmljaHQuLi5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmICghKGluZm8gPSBFUE1BU1RFUi0+UXVlcnlFUE9iamVjdChvYikpKQorICAgIHdyaXRlICgiRGFzIE9iamVrdCBpc3QgbmljaHQgZWluZ2V0cmFnZW4hXG4iKTsKKyAgZWxzZQorICAgIHByaW50ZigiTnVtbWVyOiAlZFxuQm9udXM6ICVkXG5UeXA6ICVzXG5TY2hsdWVzc2VsOiAlc1xuIiwKKwkgICBpbmZvW01QT1NfTlVNXSwKKwkgICBpbmZvW01QT1NfVFlQRSsxXSwKKwkgICAoeyAiRGV0YWlsIiwgIkF1c2dhbmciLCAiS29tbWFuZG8iLCAiSW5mbyIsICJNaXNjIiwgIlJlYWREZXRhaWwiLAorICAgICAgICAgIktuZWlwZSIsICJHZXJ1Y2giLCAiR2VyYWV1c2NoIiwgIlRhc3RkZXRhaWwifSlbaW5mb1tNUE9TX1RZUEVdXSwKKwkgICBzdHJBcnIoaW5mb1tNUE9TX0tFWV0gKSk7CisKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBvYmplY3QgZmluZF9wbGF5ZXJvYiggc3RyaW5nIG5hbWUgKSB7CisgIHJldHVybiBmaW5kX3BsYXllcihuYW1lKXx8ZmluZF9uZXRkZWFkKG5hbWUpOworfQorCitzdGF0aWMgaW50IGVwY291bnQoIHN0cmluZyBzdHIgKSB7CisgIG9iamVjdCBwbCxlcG07CisgIAorICBpZiggIUFSQ0hfU0VDVVJJVFkgKSB7CisgICAgbm90aWZ5X2ZhaWwoIkR1IGJpc3Qga2VpbiBFcnptYWdpZXIhXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICAKKyAgaWYgKCFzdHIgfHwgc3RyPT0iIikgeworICAgIG5vdGlmeV9mYWlsKCJTeW50YXg6IGVwY291bnQgPHNwaWVsZXJuYW1lPlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBwcmludGYoICIlcyBoYXQgJWQgdm9uICVkIEZQcy4gKER1cmNoc2Nobml0dCA9ICVkKVxuIiwKKwkgIGNhcGl0YWxpemUoc3RyKSwKKwkgIEVQTUFTVEVSLT5RdWVyeUV4cGxvcmF0aW9uUG9pbnRzKHN0ciksCisJICBFUE1BU1RFUi0+UXVlcnlNYXhFUCgpLAorCSAgRVBNQVNURVItPlF1ZXJ5QXZlcmFnZSgpCisJICApOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCBlcHNjYW4oIHN0cmluZyBzdHIgKSB7CisgIG9iamVjdCBwbDsKKyAgaW50IGVyZzsKKyAgc3RyaW5nICphc3RyOworCisgIGlmKCAhQVJDSF9TRUNVUklUWSApIHsKKyAgICBub3RpZnlfZmFpbCgiRHUgYmlzdCBrZWluIEVyem1hZ2llciFcbiIpOworICAgIHJldHVybiAwOworICB9CisgIAorICBpZiAoIXN0ciB8fCBzdHI9PSIiKSB7CisgICAgbm90aWZ5X2ZhaWwoIlN5bnRheDogZXBzY2FuIDxzcGllbGVybmFtZT4gW1RlaWwgZGVzIEZpbGVuYW1lbnNdXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGFzdHI9b2xkX2V4cGxvZGUodGhpc19wbGF5ZXIoKS0+X3VucGFyc2VkX2FyZ3MoKSwiICIpOworICAKKyAgaWYgKHNpemVvZihhc3RyKTwyKQorICAgIGVyZyA9IEVQTUFTVEVSLT5TaG93UGxheWVyRVBzKGFzdHJbMF0pOworICBlbHNlCisgICAgZXJnID0gRVBNQVNURVItPlNob3dQbGF5ZXJFUHMoYXN0clswXSxhc3RyWzFdKTsKKyAgaWYgKGVyZyA8IDApCisgICAgcHJpbnRmKCJGZWhsZXI6ICVzXG4iLGVyck1zZyhlcmcpKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBlcHBsZGVsKCBzdHJpbmcgc3RyICkgeworCXN0cmluZyBwbGF5ZXIsIHJlc3Q7CisJaW50IGVwbnVtOworCW9iamVjdCB0bXA7CisKKwlpZiggIUFSQ0hfU0VDVVJJVFkgKSB7CisJICBub3RpZnlfZmFpbCgiRHUgYmlzdCBrZWluIEVyem1hZ2llciFcbiIpOworCSAgcmV0dXJuIDA7CisJfQorCisJbm90aWZ5X2ZhaWwoICJlcHBsZGVsIDxzcGllbGVyPiA8YW56YWhsX2Vwcz4gPGdydW5kPlxuIiApOworCWlmKCAhc3RyIHx8IHNzY2FuZiggc3RyLCAiJXMgJWQgJXMiLCBwbGF5ZXIsIGVwbnVtLCByZXN0ICk8MiApCisJCXJldHVybiAwOworCisJaWYoIGVwbnVtIDw9IDAgKSB7CisJCXdyaXRlKCAiQW56YWhsIGRlciBGUHMgPD0gMCA/XG4iICk7CisJCXJldHVybiAxOworCX0KKwlpZiggIXJlc3QgfHwgcmVzdD09IiIgKSB7CisJCXdyaXRlKCAiQml0dGUgR3J1bmQgYW5nZWJlbiFcbiIgKTsKKwkJcmV0dXJuIDE7CisJfQorCisJcHJpbnRmKCAiJU8gJU8gJU9cbiIsIGVwbnVtLCBwbGF5ZXIsIHNlY3VyZV9sZXZlbCgpICk7CisJZXBudW0gPQkiL3NlY3VyZS9leHBsb3JhdGlvbm1hc3RlciItPlJlbW92ZUZQKCBlcG51bSwgcGxheWVyLCByZXN0ICk7CisJcHJpbnRmKCAiRXJnZWJuaXMgKGFiZ2V6b2dlbmUgRVBzKSA9ICVPXG4iLCBlcG51bSApOworCXJldHVybiAxOworCit9CisKK3N0YXRpYyBlcHBsYWRkKCBzdHJpbmcgc3RyICkgeworCXN0cmluZyBwbGF5ZXIsIHJlc3Q7CisJaW50IGVwbnVtOworCW9iamVjdCBwbCx0bXA7CisKKwlpZiggIUFSQ0hfU0VDVVJJVFkgKSB7CisJICBub3RpZnlfZmFpbCgiRHUgYmlzdCBrZWluIEVyem1hZ2llciFcbiIpOworCSAgcmV0dXJuIDA7CisJfQorCisJbm90aWZ5X2ZhaWwoICJlcHBsYWRkIDxzcGllbGVyPiA8YW56YWhsX2Vwcz5cbiIgKTsKKwlpZiggIXN0ciB8fCBzc2NhbmYoIHN0ciwgIiVzICVkIiwgcGxheWVyLCBlcG51bSApPDIgKQorCQlyZXR1cm4gMDsKKworCWlmKCBlcG51bSA8PSAwICkgeworCQl3cml0ZSggIkFuemFobCBkZXIgRlBzIDw9IDAgP1xuIiApOworCQlyZXR1cm4gMTsKKwl9CisKKwllcG51bSA9CSIvc2VjdXJlL2V4cGxvcmF0aW9ubWFzdGVyIi0+QWRkRlAoIGVwbnVtLCBwbGF5ZXIgKTsKKwlwcmludGYoICJFcmdlYm5pcyAoaGluenVnZWZ1ZWd0ZSBGUHMpID0gJU9cbiIsIGVwbnVtICk7CisJcmV0dXJuIDE7CisKK30KKworc3RhdGljIGVwcGxzZXQoIHN0cmluZyBzdHIgKSB7CisgIHN0cmluZyBwbGF5ZXIsIHJlc3Q7CisgIGludCBlcG51bTsKKyAgb2JqZWN0IHBsLHRtcDsKKyAgCisgIGlmKCAhQVJDSF9TRUNVUklUWSApIHsKKyAgICBub3RpZnlfZmFpbCgiRHUgYmlzdCBrZWluIEVyem1hZ2llciFcbiIpOworICAgIHJldHVybiAwOworICB9CisgIAorICBub3RpZnlfZmFpbCggImVwcGxzZXQgPHNwaWVsZXI+IDxlcC1udW1tZXI+XG4iICk7CisgIGlmKCAhc3RyIHx8IHNzY2FuZiggc3RyLCAiJXMgJWQiLCBwbGF5ZXIsIGVwbnVtICk8MiApCisgICAgcmV0dXJuIDA7CisgIAorICBlcG51bSA9ICIvc2VjdXJlL2V4cGxvcmF0aW9ubWFzdGVyIi0+U2V0RlAoIGVwbnVtLCBwbGF5ZXIgKTsKKyAgcHJpbnRmKCAiRXJnZWJuaXMgKGdlc2V0enRlciBGUCkgPSAlT1xuIiwgZXBudW0gKTsKKyAgcmV0dXJuIDE7Cit9CisKK3N0YXRpYyBlcHBsY2xyKCBzdHJpbmcgc3RyICkgeworICBzdHJpbmcgcGxheWVyLCByZXN0OworICBpbnQgZXBudW07CisgIG9iamVjdCBwbCx0bXA7CisgIAorICBpZiggIUFSQ0hfU0VDVVJJVFkgKSB7CisgICAgbm90aWZ5X2ZhaWwoIkR1IGJpc3Qga2VpbiBFcnptYWdpZXIhXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICAKKyAgbm90aWZ5X2ZhaWwoICJlcHBsY2xyIDxzcGllbGVyPiA8ZXAtbnVtbWVyPlxuIiApOworICBpZiggIXN0ciB8fCBzc2NhbmYoIHN0ciwgIiVzICVkIiwgcGxheWVyLCBlcG51bSApPDIgKQorICAgIHJldHVybiAwOworICAKKyAgZXBudW0gPSAiL3NlY3VyZS9leHBsb3JhdGlvbm1hc3RlciItPkNsZWFyRlAoIGVwbnVtLCBwbGF5ZXIgKTsKKyAgcHJpbnRmKCAiRXJnZWJuaXMgKGdlbG9lc2NodGVyIEZQKSA9ICVPXG4iLCBlcG51bSApOworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL29iai90b29scy9mZWhsZXJ0ZXVmZWwuYyBiL29iai90b29scy9mZWhsZXJ0ZXVmZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzVmZWMxCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL2ZlaGxlcnRldWZlbC5jCkBAIC0wLDAgKzEsOTkzIEBACisvKiAvb2JqL3Rvb3N0ZWxzL2ZlaGxlcnRldWZlbC5jCisgICBGZWhsZXJ0ZXVmZWwgLSBNYWdpZXJ0b29sIHp1ciBBYmZyYWdlIGRlcyBGZWhsZXItRGFlbW9ucyBkZXIgTXVkbGliCisgICBBdXRvcjogWmVzc3RyYQorICAgQ2hhbmdlbG9nOgorKi8KKworI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgcGVkYW50aWMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgbm9fc2hhZG93CisjcHJhZ21hIG5vX2luaGVyaXQKKworaW5oZXJpdCAiL3N0ZC9zZWN1cmVfdGhpbmciOworaW5oZXJpdCAiL3NlY3VyZS9lcnJvcmQtc3RydWN0cyI7CisKKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPGVycm9yZC5oPgorI2luY2x1ZGUgPGNvbmZpZy5oPgorI2luY2x1ZGUgPGRlYnVnX2luZm8uaD4KKyNpbmNsdWRlIDxpbnB1dF90by5oPgorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKworI2RlZmluZSBUSSB0aGlzX2ludGVyYWN0aXZlKCkKKworI2RlZmluZSBERUJVRyh4KSAgaWYgKGZ1bmNhbGwoc3ltYm9sX2Z1bmN0aW9uKCdmaW5kX3BsYXllciksInplc3N0cmEiKSlcCisgICAgICAgIHRlbGxfb2JqZWN0KGZ1bmNhbGwoc3ltYm9sX2Z1bmN0aW9uKCdmaW5kX3BsYXllciksInplc3N0cmEiKSxcCisgICAgICAgICJFREJHOiAiK3grIlxuIikKKworLy8gdmFyaWFibGVzCitwcml2YXRlIHN0cmluZyBvd25lcjsgIC8vIFVJRCB2b20gRWlnZW50dWVtZXIKK3ByaXZhdGUgc3RyaW5nICp1aWRzPSh7fSk7IC8vIFVJRHMsIGF1ZiBkaWUgbWFuIHNjaHJlaWJyZWNodGUgaGF0Citwcml2YXRlIHN0cmluZyAqZmlsdGVydWlkcz0oe30pOyAvLyB3ZW5uIG5pY2h0LWxlZXIsIG51ciBkaWVzZSBVSURzIHplaWdlbgorcHJpdmF0ZSBzdHJpbmcgKm1vbml0b3J1aWRzPSh7fSk7IC8vIGRpZXNlIFVJRHMgaW4gZGllIExpc3RlIGVpbnNjaGxpZXNzZW4KK3ByaXZhdGUgaW50IGZpbHRlcnN0YXR1cz0wOyAgICAgICAvLyBGaWx0ZXIgYW4gb2RlciBhdXM/Citwcml2YXRlIG1hcHBpbmcgaXNzdWVsaXN0ID0gKFtdKTsKKy8qIChbIHR5cGUxOiAoW3VpZDE6IDxpc3N1ZWxpc3Q+LCB1aWQyOiA8aXNzdWVsaXN0PiBdKSwKKyAgICAgIHR5cGUyOiAuLi4gXSkKKyAgIDxpc3N1ZWxpc3Q+IGlzdCBlaW4gPCA8aW50fHN0cmluZz4qID4qIHZvbSBFcnJvckQgKi8KKworLy9XZWxjaGUgQXJ0IHZvbiBGZWhsZXIgYW56ZWlnZW4/Citwcml2YXRlIGludCBtb2R1cz1UX1JURVJST1IgfCBUX1JUV0FSTiB8IFRfUkVQT1JURURfRVJSOworcHJpdmF0ZSBzdHJpbmcgKnhtb25pdG9ydWlkcyA9ICh7fSk7IC8vIGV4cGFuZGVkIE1vbml0b3ItVUlEcworcHJpdmF0ZSBpbnQgbGZlaGxlcjsgICAgICAgICAgICAgIC8vIGxldHp0ZXIgJ2JlbnV0enRlcicgRmVobGVyLgorcHJpdmF0ZSBpbnQgZmVobGVyemFobDsgICAgICAgLy8gZmVobGVyemFobCBpbSBsZXR6dGVuIFJlc2V0LgorcHJpdmF0ZSBtYXBwaW5nIGZlaW5nYWJlOyAgICAgICAgIC8vIGdlcmFkZSBlaW5nZWdlYmVuZXIgRmVobGVyCisKKy8vICoqKioqKioqKioqKioqIHByaXZhdGUgZnVuY3Rpb25zICAqKioqKioqKioqKioqKgorcHJpdmF0ZSB2YXJhcmdzIGludCBnZXRfaXNzdWVsaXN0KGludCBsbW9kdXMpOworcHJpdmF0ZSB2b2lkIGdldF91aWRzKCk7CisKKy8vIGlyZ2VuZGVpbmVuIEZlaGxlciBvZGVyIFdhcm51bmcgYW56ZWlnZW4uCitwcml2YXRlIGludCBzaG93X2VudHJ5KHN0cnVjdCBmdWxsaXNzdWVfcyBpc3N1ZSkKK3sKKyAgaWYgKCFpc3N1ZSkgcmV0dXJuIDA7CisKKyAgc3RyaW5nIHR4dD1FUlJPUkQtPmZvcm1hdF9lcnJvcihpc3N1ZSwgMCk7CisKKyAgaWYgKCFzdHJpbmdwKHR4dCkgfHwgIXNpemVvZih0eHQpKQorICAgICAgcmV0dXJuIDA7CisKKyAgdGVsbF9vYmplY3QoUEwsdHh0KyJcbiIpOworICByZXR1cm4gMTsKK30KKworcHJvdGVjdGVkIGludCBfZmVpbmdhYmVfZmVydGlnKHN0cmluZyBhcmcpIHsKKworICBpZiAoYXJnID09ICJqIikKKyAgeworICAgIGlmICghZmVpbmdhYmVbRl9NU0ddKQorICAgIHsKKyAgICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgICAiQWxzbywgZWluZSBGZWhsZXJiZXNjaHJlaWJ1bmcgc29sbHRlc3QgRHUgc2Nob24gZWluZ2ViZW4hIEFiZ2Vicm9jaGVuLlxuIik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICBzdHJpbmcgaGFzaGtleSA9IChzdHJpbmcpRVJST1JELT5Mb2dSZXBvcnRlZEVycm9yKGZlaW5nYWJlKTsKKyAgICAgIHRlbGxfb2JqZWN0KFBMLCBzcHJpbnRmKAorICAgICAgICAgIlZpZWxlbiBEYW5rISBEaWUgSUQgZGVzIGVpbmdlZ2ViZW5lbiBGZWhsZXJzIGxhdXRldDogJXNcbiIsCisgICAgICAgICBoYXNoa2V5IHx8ICJOL0EiKSk7CisgICAgfQorICB9CisgIGVsc2UKKyAgeworICAgIHRlbGxfb2JqZWN0KFBMLCAiRmVobGVyZWluZ2FiZSBhYmdlYnJvY2hlbi5cbiIpOworICB9CisKKyAgZmVpbmdhYmUgPSAwOworCisgIHJldHVybiAxOworfQorCitwdWJsaWMgaW50IENtZEZlaGxlckVpbmdhYmUoc3RyaW5nIGFyZykgeworICBvYmplY3QgdGFyZ2V0OworCisgIGlmIChmZWluZ2FiZSkKKyAgeworICAgIHRlbGxfb2JqZWN0KFBMLCAiRHUgZ2lidHMgZG9jaCBiZXJlaXRzIGVpbmVuIEZlaGxlciBlaW4hXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBmZWluZ2FiZSA9IChbXSk7CisKKyAgaWYgKGFyZykKKyAgeworICAgIHRhcmdldCA9IHByZXNlbnQoYXJnKTsKKyAgICBpZiAoIXRhcmdldCkKKyAgICAgIHRhcmdldCA9IGZpbmRfb2JqZWN0KGFyZyk7IC8vIHZpZWxsZWljaHQgZGlyZWt0IGFuZ2VnZWJlbj8KKyAgfQorICAvLyB3ZW5uIG5peCBnZWZ1bmRlbiwgRW52aXJvbm1lbnQgZGVzIE1hZ2llcnMgbmVobWVuLgorICBpZiAoIXRhcmdldCkKKyAgICB0YXJnZXQgPSBlbnZpcm9ubWVudChlbnZpcm9ubWVudCgpKTsKKworICBmZWluZ2FiZVtGX09CSl0gPSB0YXJnZXQ7CisKKyAgdGVsbF9vYmplY3QoUEwsIGJyZWFrX3N0cmluZyhzcHJpbnRmKAorICAgICAgICAgICJEdSBiZWdpbm5zdCBlaW5lbiBGZWhsZXJlaW50cmFnIGZ1ZXIgZGFzIE9iamVrdDogJU9cbiIsIHRhcmdldCksNzgpKTsKKworICBpbnB1dF90byhmdW5jdGlvbiB2b2lkIChzdHJpbmcgc3RyKQorICAgICAgeworICAgICAgICBpZiAoc2l6ZW9mKHN0cikpIGZlaW5nYWJlW0ZfTVNHXSA9IHN0cjsKKyAgICAgIH0sIElOUFVUX1BST01QVCwgIkZlaGxlcmJlc2NocmVpYnVuZyBlaW5nZWJlbjpcbiIpOworCisgIGlucHV0X3RvKGZ1bmN0aW9uIHZvaWQgKHN0cmluZyBzdHIpCisgICAgICB7CisgICAgICAgIGlmIChzaXplb2Yoc3RyKSkgZmVpbmdhYmVbRl9QUk9HXSA9IHN0cjsKKyAgICAgICAgZWxzZSBmZWluZ2FiZVtGX1BST0ddID0gInVuYmVrYW5udCI7CisgICAgICB9LCBJTlBVVF9QUk9NUFR8SU5QVVRfQVBQRU5ELCAKKyAgICAgIlByb2dyYW1tIGVpbmdlYmVuLCBpbiBkZW0gZGVyIEZlaGxlciBhdWZ0cml0dCAoZmFsbHMgYmVrYW5udCk6XG4iKTsKKworICBpbnB1dF90byhmdW5jdGlvbiB2b2lkIChzdHJpbmcgc3RyKQorICAgICAgeworICAgICAgICBpZiAoc2l6ZW9mKHN0cikpIGZlaW5nYWJlW0ZfTElORV0gPSB0b19pbnQoc3RyKTsKKyAgICAgICAgdGVsbF9vYmplY3QoUEwsYnJlYWtfc3RyaW5nKHNwcmludGYoCisgICAgICAgICAgIkR1IGhhc3QgZGllIGZvbGdlbmRlbiBEYXRlbiBlaW5nZWdlYmVuOlxuIgorICAgICAgICAgICJPYmpla3Q6ICVPXG4iCisgICAgICAgICAgIkZlaGxlcmJlc2NocmVpYnVuZzogJXNcbiIKKyAgICAgICAgICAiUHJvZ3JhbW06ICVzXG4iCisgICAgICAgICAgIlplaWxlbm5yLjogJWRcbiIsCisgICAgICAgICAgZmVpbmdhYmVbRl9PQkpdLCBmZWluZ2FiZVtGX01TR10gfHwgIiIsIGZlaW5nYWJlW0ZfUFJPR10sCisgICAgICAgICAgZmVpbmdhYmVbRl9MSU5FXSksIDc4LCAiIiwgQlNfTEVBVkVfTVlfTEZTKSk7CisgICAgICB9LCBJTlBVVF9QUk9NUFR8SU5QVVRfQVBQRU5ELAorICAgICAgIlplaWxlbm5yLiBlaW5nZWJlbiwgaW4gZGVyIGRlciBGZWhsZXIgYXVmdHJpdHQgKGZhbGxzIGJla2FubnQpOlxuIik7CisKKyAgaW5wdXRfdG8oIydfZmVpbmdhYmVfZmVydGlnLAorICAgICAgSU5QVVRfUFJPTVBUfElOUFVUX0FQUEVORCwgIkVpbmdhYmVuIGtvcnJla3Q/IChqL24pXG4iKTsKKworICByZXR1cm4gMTsKK30KKworcHVibGljIGludCBDbWRGZWhsZXJaZWlnZW4oc3RyaW5nIGFyZykKK3sKKyAgaW50IGlzc3VlaWQ7CisKKyAgaWYgKHN0cmluZ3AoYXJnKSAmJiBzaXplb2YoYXJnKSkKKyAgeworICAgICAgYXJnID0gdHJpbShhcmcsIFRSSU1fQk9USCk7CisgICAgICBpc3N1ZWlkID0gdG9faW50KGFyZyk7CisgIH0KKyAgZWxzZQorICB7CisgICAgICBpc3N1ZWlkID0gbGZlaGxlcjsKKyAgICAgIGFyZyA9IHRvX3N0cmluZyhpc3N1ZWlkKTsKKyAgfQorICBub3RpZnlfZmFpbCgiRWluZW4gRWludHJhZyBtaXQgZGllc2VyIElEIGdpYnQgZXMgbmljaHQhXG4iKTsKKworICAvLyBNaXQgZWluZW0gLyBhbSBBbmZhbmcgaXN0IGFyZyB3b2hsIGVpbiBGaWxlbmFtZSwgd2VubiB0b19zdHJpbmcoaXNzdWVpZCkKKyAgLy8gPT0gYXJnIHdpcmQgZGllIElzc3VlaWQgdm9uIG9iZW4gZ2Vub21tZW4uCisgIHN0cnVjdCBmdWxsaXNzdWVfcyBpc3N1ZTsKKyAgc3RydWN0IGZ1bGxpc3N1ZV9zICppc3N1ZXM7CisgIGlmIChhcmdbMF0gPT0gJy8nKQorICB7CisgICAgaXNzdWVzPSh7fSk7CisgICAgZm9yZWFjaChpbnQgbTogQUxMX0VSUl9UWVBFUykKKyAgICB7CisgICAgICBpZiAoIShtICYgbW9kdXMpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIHN0cnVjdCBmdWxsaXNzdWVfcyAqdG1wID0gCisgICAgICAgICAgICAgICAgICAgICAgIChzdHJ1Y3QgZnVsbGlzc3VlX3MgKilFUlJPUkQtPlF1ZXJ5SXNzdWVzQnlGaWxlKGFyZywgbSk7CisgICAgICBpZiAodG1wKQorICAgICAgICBpc3N1ZXMrPXRtcDsKKyAgICB9CisgICAgaWYgKCFzaXplb2YoaXNzdWVzKSkKKyAgICAgIGlzc3Vlcz0wOworICB9CisgIGVsc2UgaWYgKHRvX3N0cmluZyhpc3N1ZWlkKSA9PSBhcmcpCisgICAgaXNzdWUgPSAoc3RydWN0IGZ1bGxpc3N1ZV9zKUVSUk9SRC0+UXVlcnlJc3N1ZUJ5SUQoaXNzdWVpZCk7CisgIGVsc2UKKyAgICBpc3N1ZSA9IChzdHJ1Y3QgZnVsbGlzc3VlX3MpRVJST1JELT5RdWVyeUlzc3VlQnlIYXNoKGFyZyk7CisKKyAgaWYgKHN0cnVjdHAoaXNzdWUpKQorICB7CisgICAgc2hvd19lbnRyeShpc3N1ZSk7CisgICAgLy8gbGV0enRlbiBGZWhsZXIgbWVya2VuLgorICAgIGxmZWhsZXIgPSBpc3N1ZWlkOworICAgIHJldHVybiAxOworICB9CisgIC8vIFdlbm4gZGFzIG5pY2h0IGVyZm9sZ3JlaWNoIGlzdCwgaXN0IGRhcyBBcmd1bWVudCBldnRsLiBlaW4gT2JqZWt0LSwKKyAgLy8gUHJvZ3JhbW0tIG9kZXIgTGFkZW5hbWUuIEluIGRlbSBGYWxsIGFsbGUgdm9uIGRlbmVuIGFuemVpZ2VuLCBkaWUgcGFzc2VuCisgIC8vIGhpZXJiZWkgd2lyZCBkZXIgVHlwIE5JQ0hUIGJlcnVlY2tzaWNodGlndC4KKyAgZWxzZSBpZiAocG9pbnRlcnAoaXNzdWVzKSkKKyAgeworICAgIGZvcmVhY2goaXNzdWUgOiBpc3N1ZXMpCisgICAgeworICAgICAgc2hvd19lbnRyeShpc3N1ZSk7CisgICAgfQorICAgIHJldHVybiAxOworICB9CisKKyAgbm90aWZ5X2ZhaWwoIktlaW5lIEVpbnRyYWVnZSBmdWVyIGRpZXNlbiBEYXRlaW5hbWVuL2RpZXNlIElEIGdlZnVuZGVuLlxuIik7CisgIHJldHVybiAwOworfQorCisvLyBMb2VzY2h0IGFsbGUgRmVobGVyIHVuZCBXYXJudW5nZW4gZWluZXMgT2JqZWt0cyAoc293ZWl0IHBlciBtb2R1cworLy8gYXVzZ2V3YWVobHQpLiBFbnRzY2hlaWRlbmQgaXN0IGRlciBfTG9hZG5hbWVfIQorcHJpdmF0ZSBpbnQgRGVsZXRlRXJyb3JzRm9yTG9hZG5hbWUoc3RyaW5nIGxvYWRuYW1lKQoreworICBpbnQgc3VtX2RlbGV0ZWQ7CisgIC8vIEJlaSA9PSAwIHdpcmQgc29uc3QgYWxsZXMgZ2Vsb2VzY2h0LiA7LSkKKyAgaWYgKCFsb2FkbmFtZSkKKyAgICByZXR1cm4gMDsKKworICBmb3JlYWNoKGludCBtOiBBTExfRVJSX1RZUEVTKQorICB7CisgICAgaWYgKCEobSAmIG1vZHVzKSkKKyAgICAgIGNvbnRpbnVlOworICAgIDwgPGludHxzdHJpbmc+KiA+KiBsaXN0ID0gRVJST1JELT5RdWVyeUlzc3VlTGlzdEJ5TG9hZG5hbWUobG9hZG5hbWUsbSk7CisgICAgaWYgKHBvaW50ZXJwKGxpc3QpKQorICAgIHsKKyAgICAgIGZvcmVhY2goPGludHxzdHJpbmc+KiByb3cgOiBsaXN0KQorICAgICAgeworICAgICAgICAgIGlmICgoaW50KUVSUk9SRC0+VG9nZ2xlRGVsZXRlRXJyb3Iocm93WzBdKSA9PSAxKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgICAgICAgICAgIHJvd1swXSArICIgYWxzIGdlbG9lc2NodCBtYXJraWVydC5cbiIpOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHN1bV9kZWxldGVkKz1zaXplb2YobGlzdCk7CisgICAgfQorICB9CisgIHJldHVybiBzdW1fZGVsZXRlZDsKK30KKworcHVibGljIGludCBDbWRGZWhsZXJMb2VzY2hlbihzdHJpbmcgYXJnKQoreworICBpbnQgaXNzdWVpZDsKKyAgYXJnID0gKHN0cmluZyl0aGlzX3BsYXllcigpLT5fdW5wYXJzZWRfYXJncygwKTsKKworICBpZiAoc3RyaW5ncChhcmcpICYmIHNpemVvZihhcmcpKQorICAgICAgaXNzdWVpZCA9IHRvX2ludChhcmcpOworICBlbHNlCisgICAgICBpc3N1ZWlkID0gbGZlaGxlcjsKKworICBub3RpZnlfZmFpbCgiRWluZW4gRWludHJhZyBtaXQgZGllc2VyIElEL2RpZXNlbSBMb2FkbmFtZSBnaWJ0IGVzIG5pY2h0IVxuIik7CisKKyAgaW50IHJlcyA9IChpbnQpRVJST1JELT5Ub2dnbGVEZWxldGVFcnJvcihpc3N1ZWlkKTsKKyAgaWYgKHJlcyA9PSAxKQorICB7CisgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICAiRmVobGVyL1dhcm51bmcgd3VyZGUgenVtIExvZXNjaGVuIG1hcmtpZXJ0IHVuZCB3aXJkIGluIEt1ZXJ6ZSAiCisgICAgICAiZ2Vsb2VzY2h0LlxuIik7CisgICAgbGZlaGxlciA9IGlzc3VlaWQ7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZWxzZSBpZiAocmVzPT0wKQorICB7CisgICAgdGVsbF9vYmplY3QoUEwsIkxvZXNjaG1hcmtpZXJ1bmcgd3VyZGUgZW50ZmVybnQuXG4iKTsKKyAgICBsZmVobGVyID0gaXNzdWVpZDsKKyAgICByZXR1cm4gMTsKKyAgfQorICBlbHNlIGlmIChyZXMgPCAtMSkKKyAgeworICAgIHRlbGxfb2JqZWN0KFBMLCAiSXJnZW5kd2FzIGlzdCBiZWltIExvZXNjaGVuIHNjaGllZmdlZ2FuZ2VuLiAiCisgICAgICAgICAgICAgICAgICAgICJLZWluZSBTY2hyZWlicmVjaHRlP1xuIik7CisgICAgbGZlaGxlciA9IGlzc3VlaWQ7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgLy8gcmVzIHdhciA9PSAtMSAtPiBGZWhsZXIgbmljaHQgZ2VmdW5kZW4uIFZpZWxsZWljaHQgaXN0IGVzIG5lbiBMb2FkbmFtZQorICByZXR1cm4gRGVsZXRlRXJyb3JzRm9yTG9hZG5hbWUoYXJnKTsKK30KKworcHVibGljIGludCBDbWRSZWZyZXNoKHN0cmluZyBhcmcpIHsKKyAgICByZXNldCgpOworICAgIHRlbGxfb2JqZWN0KFBMLCJGZWhsZXJkYXRlbiB3dXJkZW4gbmV1IGVpbmdlbGVzZW4uXG4iKTsKKyAgICByZXR1cm4gMTsKK30KKworcHJpdmF0ZSBpbnQgc2VsZWN0X21vZHVzKHN0cmluZyBhcmcpIHsKKyAgICBpbnQgbG1vZHVzOworICAgIHN3aXRjaChhcmcpIHsKKyAgICBjYXNlICJhbGxlcyI6CisgICAgY2FzZSAiYWxsZSI6CisgICAgICBsbW9kdXMgPSBUX1JURVJST1IgfCBUX1JUV0FSTiB8IFRfQ1RFUlJPUiB8IFRfQ1RXQVJOIHwgVF9SRVBPUlRFRF9FUlIKKyAgICAgICAgICAgICAgIHwgVF9SRVBPUlRFRF9JREVBIHwgVF9SRVBPUlRFRF9UWVBPIHwgVF9SRVBPUlRFRF9NRDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgImZlaGxlciI6CisgICAgY2FzZSAiZXJyb3IiOgorICAgIGNhc2UgImVycm9ycyI6CisgICAgICBsbW9kdXM9VF9SVEVSUk9SIHwgVF9DVEVSUk9SIHwgVF9SRVBPUlRFRF9FUlI7CisgICAgICBicmVhazsKKyAgICBjYXNlICJ3YXJudW5nZW4iOgorICAgIGNhc2UgIndhcm51bmciOgorICAgIGNhc2UgIndhcm5pbmciOgorICAgIGNhc2UgIndhcm5pbmdzIjoKKyAgICAgIGxtb2R1cz1UX1JUV0FSTiB8IFRfQ1RXQVJOOworICAgICAgYnJlYWs7CisgICAgY2FzZSAibGF1ZnplaXRmZWhsZXIiOgorICAgICAgbG1vZHVzPVRfUlRFUlJPUjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgImxhZGV6ZWl0ZmVobGVyIjoKKyAgICAgIGxtb2R1cz1UX0NURVJST1I7CisgICAgICBicmVhazsKKyAgICBjYXNlICJmZWhsZXJoaW53ZWlzIjoKKyAgICBjYXNlICJmZWhsZXJoaW53ZWlzZSI6CisgICAgY2FzZSAiaGlud2Vpc2UiOgorICAgICAgbG1vZHVzPVRfUkVQT1JURURfRVJSOworICAgICAgYnJlYWs7CisgICAgY2FzZSAiaWRlZW4iOgorICAgIGNhc2UgImlkZWUiOgorICAgICAgbG1vZHVzPVRfUkVQT1JURURfSURFQTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgIm1kIjoKKyAgICAgIGxtb2R1cz1UX1JFUE9SVEVEX01EOworICAgICAgYnJlYWs7CisgICAgY2FzZSAidHlwbyI6CisgICAgY2FzZSAidHlwb3MiOgorICAgICAgbG1vZHVzPVRfUkVQT1JURURfVFlQTzsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgImxhdWZ6ZWl0d2FybnVuZ2VuIjoKKyAgICBjYXNlICJydW50aW1ld2FybmluZ3MiOgorICAgICAgbG1vZHVzPVRfUlRXQVJOOworICAgICAgYnJlYWs7CisgICAgY2FzZSAibGFkZXplaXR3YXJudW5nZW4iOgorICAgIGNhc2UgImNvbXBpbGV0aW1ld2FybmluZ3MiOgorICAgICAgbG1vZHVzPVRfQ1RXQVJOOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGxtb2R1cz1tb2R1czsKKyAgICB9CisgICAgcmV0dXJuIGxtb2R1czsKK30KKworcHJpdmF0ZSBzdHJpbmcgICogZXJyb3JsYWJlbChpbnQgdCkKK3sKKyAgc3dpdGNoKHQpIHsKKyAgICBjYXNlIFRfUlRFUlJPUjoKKyAgICAgIHJldHVybiAoeyJMYXVmemVpdGZlaGxlciIsIkxhdWZ6ZWl0ZmVobGVyIiwiRGllc2VyIExhdWZ6ZWl0ZmVobGVyIn0pOworICAgIGNhc2UgVF9SRVBPUlRFRF9FUlI6CisgICAgICByZXR1cm4gKHsiRmVobGVyaGlud2VpcyIsIkZlaGxlcmhpbndlaXNlIiwiRGllc2VyIEZlaGxlcmhpbndlaXMifSk7CisgICAgY2FzZSBUX1JFUE9SVEVEX0lERUE6CisgICAgICByZXR1cm4gKHsiSWRlZSIsIklkZWVuIiwiRGllc2UgSWRlZSJ9KTsKKyAgICBjYXNlIFRfUkVQT1JURURfTUQ6CisgICAgICByZXR1cm4gKHsiZmVobGVuZGUgRGV0YWlsIiwiZmVobGVuZGUgRGV0YWlscyIsIkRpZXNlcyBmZWhsZW5kZSBEZXRhaWwifSk7CisgICAgY2FzZSBUX1JFUE9SVEVEX1RZUE86CisgICAgICByZXR1cm4gKHsiVHlwbyIsIlR5cG9zIiwiRGllc2VyIFR5cG8ifSk7CisgICAgY2FzZSBUX1JUV0FSTjoKKyAgICAgIHJldHVybiAoeyJMYXVmemVpdHdhcm51bmciLCJMYXVmemVpdHdhcm51bmdlbiIsIkRpZXNlIExhdWZ6ZWl0d2FybnVuZyJ9KTsKKyAgICBjYXNlIFRfQ1RXQVJOOgorICAgICAgcmV0dXJuICh7IkxhZGV6ZWl0d2FybnVuZyIsICJMYWRlemVpdHdhcm51bmdlbiIsIkRpZXNlIExhZGV6ZWl0d2FybnVuZyJ9KTsKKyAgICBjYXNlIFRfQ1RFUlJPUjoKKyAgICAgIHJldHVybiAoeyJMYWRlemVpdGZlaGxlciIsIkxhZGV6ZWl0ZmVobGVyIiwiRGllc2VyIExhZGV6ZWl0ZmVobGVyIn0pOworICB9CisgIHJhaXNlX2Vycm9yKCJVbmthbm50ZXIgRmVobGVydHlwOiAiK3QrIlxuIik7CisgIHJldHVybiAwOworfQorCitwdWJsaWMgaW50IENtZEZlaGxlckxpc3RlKHN0cmluZyBhcmcpIHsKKyAgc3RyaW5nIHR4dDsKKyAgLy9zdHJpbmcgKmx1aWRzOworICBpbnQgbG1vZHVzOyAvLyBtb2R1cyBmdWVyIGRpZXNlIExpc3RlCisgIG1hcHBpbmcgZmVobGVyYmFja3VwOworCisgIGlmIChzdHJpbmdwKGFyZykgJiYgc2l6ZW9mKGFyZykpCisgIHsKKyAgICBsbW9kdXM9c2VsZWN0X21vZHVzKGFyZyk7CisgICAgaWYgKGxtb2R1cyAhPSBtb2R1cykKKyAgICB7CisgICAgICBmZWhsZXJiYWNrdXA9aXNzdWVsaXN0OyAvLyBGZWhsZXJsaXN0ZSB2b24gJ21vZHVzJyBhdWZoZWJlbgorICAgICAgZ2V0X2lzc3VlbGlzdChsbW9kdXMpOyAgLy8gbmV1ZSBGZWhsZXJsaXN0ZSBob2xlbgorICAgIH0KKyAgfQorICBlbHNlCisgICAgbG1vZHVzPW1vZHVzOworLyoKKyAgaWYgKCFmZWhsZXJ6YWhsKQorICB7CisgICAgdHh0PSJGdWVyIERlaW5lIFVJRHMgc2luZCBrZWluZSBGZWhsZXIvV2FybnVuZ2VuIGJla2FubnQuIDotKVxuIjsKKyAgICB0ZWxsX29iamVjdChQTCx0eHQpOworICAgIHJldHVybiAxOworICB9CisqLworICBmb3JlYWNoKGludCB0eXAsIG1hcHBpbmcgdHlwZW1hcCA6IGlzc3VlbGlzdCkKKyAgeworICAgIGlmICghKHR5cCAmIGxtb2R1cykpCisgICAgICBjb250aW51ZTsgLy8gVHlwZSBuaWNodCBnZXdhZWhsdC4KKyAgICB0eHQ9IiI7CisgICAgaWYgKCFzaXplb2YodHlwZW1hcCkpIHsKKyAgICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgICAiRXMgc2luZCBrZWluZSAiICsgZXJyb3JsYWJlbCh0eXApWzFdICsgIkRlaW5lciBVSURzIGJla2FubnQuIDotKSIpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIGZvcmVhY2goc3RyaW5nIHVpZCwgPCA8aW50fHN0cmluZz4qID4qIGxpc3QgOiB0eXBlbWFwKQorICAgIHsKKyAgICAgIGlmICghc2l6ZW9mKGxpc3QpKSBjb250aW51ZTsKKyAgICAgIGlmIChmaWx0ZXJzdGF0dXMgJiYgbWVtYmVyKGZpbHRlcnVpZHMsIHVpZCkgPiAtMSkgY29udGludWU7CisgICAgICAvL3R4dCs9c3ByaW50ZigiJXM6XG4iLCB1aWQpOworICAgICAgZm9yZWFjaCg8aW50fHN0cmluZz4qIHJvdyA6IGxpc3QpCisgICAgICB7CisgICAgICAgIHR4dCs9c3ByaW50ZigiJTo2ZCB8ICU6NDAtcyB8ICU6MjYtc1xuIiwKKyAgICAgICAgICAgICAgcm93WzBdLCByb3dbMV0sIHJvd1syXSk7CisgICAgICB9CisgICAgfQorICAgIGlmICh0eHQgJiYgc2l6ZW9mKHR4dCkpCisgICAgeworICAgICAgdHh0ID0gc3ByaW50ZigiXG5GdWVyIERlaW5lIFVJRHMgc2luZCBmb2xnZW5kZSAlcyBiZWthbm50IChGaWx0ZXI6ICVzKTpcbiIKKyAgICAgICAgICAgICAgICAgICAgIiU6NnxzIHwgJTo0MHxzIHwgICAlc1xuIiwKKyAgICAgICAgICAgICAgICAgZXJyb3JsYWJlbCh0eXApWzFdLCAoZmlsdGVyc3RhdHVzID8gImFuIiA6ICJhdXMiKSwKKyAgICAgICAgICAgICAgICAgIklEIiwgIkxvYWRuYW1lIiwgIlVJRCIpCisgICAgICAgICAgKyB0eHQ7CisgICAgICB0ZWxsX29iamVjdChQTCwgdHh0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHRlbGxfb2JqZWN0KFBMLCBzcHJpbnRmKAorICAgICAgICAgICAgIlxuRnVlciBEZWluZSBVSURzIHNpbmQga2VpbmUgJXMgYmVrYW5udCAoRmlsdGVyOiAlcyk6XG4iLAorICAgICAgICAgICAgZXJyb3JsYWJlbCh0eXApWzFdLCAoZmlsdGVyc3RhdHVzID8gImFuIiA6ICJhdXMiKSkpOworICAgIH0KKyAgfQorCisgIGlmIChtYXBwaW5ncChmZWhsZXJiYWNrdXApICYmIG1vZHVzIT1sbW9kdXMpCisgICAgaXNzdWVsaXN0PWZlaGxlcmJhY2t1cDsgLy8gZmVobGVybGlzdGUgZnVlciAnbW9kdXMnIHJlc3RhdXJpZXJlbgorICByZXR1cm4gMTsKK30KKworcHVibGljIGludCBDbWRGaWx0ZXIoc3RyaW5nIGFyZykgeworCisgIGFyZz0oc3RyaW5nKVBMLT5fdW5wYXJzZWRfYXJncygwKTsgIAorCisgIGlmICghc3RyaW5ncChhcmcpIHx8ICFzaXplb2YoYXJnKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLGJyZWFrX3N0cmluZygKKyAgICAgICAgICAiTW9tZW50YW4gaW50ZXJlc3NpZXJlbiBEaWNoIGZvbGdlbmRlIFVJRHMgbmljaHQiCisgICAgICAgICAgKyhmaWx0ZXJzdGF0dXMgPyAiIChGaWx0ZXIgYW4pOlxuIiA6ICIgKEZpbHRlciBhdXMpOlxuIikKKyAgICAgICAgICArQ291bnRVcChmaWx0ZXJ1aWRzKSsiXG4iLCA3OCwiIixCU19MRUFWRV9NWV9MRlMpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmIChhcmc9PSJrZWluZSIpIHsKKyAgICBmaWx0ZXJ1aWRzPSh7fSk7CisgICAgZmlsdGVyc3RhdHVzPTE7CisgICAgdGVsbF9vYmplY3QoUEwsYnJlYWtfc3RyaW5nKAorICAgICAgICAiRGVpbiBGZWhsZXJ0ZXVmZWwgd2lyZCBEaXIgbnVuIG51ciBub2NoIGF1c2dld2FlaGx0ZSAiCisgICAgICAgICJGZWhsZXIgYmVyaWNodGVuLiBNb21lbnRhbiBoYXN0IER1IGtlaW5lIFVJRHMgYXVzZ2VibGVuZGV0LiAiCisgICAgICAgICIoRmlsdGVyIGFuKSIsNzgpKTsKKyAgfQorICBlbHNlIGlmIChhcmc9PSJhbGxlIikgeworICAgIGZpbHRlcnN0YXR1cz0xOworICAgIGZpbHRlcnVpZHM9dWlkczsKKyAgICB0ZWxsX29iamVjdChQTCxicmVha19zdHJpbmcoCisgICAgICAgICJEZWluIEZlaGxlcnRldWZlbCB3aXJkIERpciBudW4gbnVyIG5vY2ggYXVzZ2V3YWVobHRlICIKKyAgICAgICAgIkZlaGxlciBiZXJpY2h0ZW4uIER1IGJsZW5kZXN0IG1vbWVudGFuIGFsbGUgVUlEcyBhdXMuICIKKyAgICAgICAgIihGaWx0ZXIgYW4pIiw3OCkpOworICB9CisgIGVsc2UgaWYgKGFyZz09ImF1cyIpIHsKKyAgICBmaWx0ZXJzdGF0dXM9MDsKKyAgICB0ZWxsX29iamVjdChQTCxicmVha19zdHJpbmcoCisgICAgICAgICJEZWluIEZlaGxlcnRldWZlbCB3aXJkIERpciBudW4gd2llZGVyIGFsbGUgRmVobGVyIGJlcmljaHRlbi4gIiwKKyAgICAgICAgNzgpKTsKKyAgfQorICBlbHNlIGlmIChhcmc9PSJhbiIgfHwgYXJnPT0iZWluIikgeworICAgIGZpbHRlcnN0YXR1cz0xOworICAgIHRlbGxfb2JqZWN0KFBMLGJyZWFrX3N0cmluZygKKyAgICAgICAgIkRlaW4gRmVobGVydGV1ZmVsIHdpcmQgRGlyIG51biBudXIgbm9jaCBhdXNnZXdhZWhsdGUgIgorICAgICAgICAiRmVobGVyIGJlcmljaHRlbi4iLDc4KSk7CisgIH0KKyAgZWxzZSB7CisgICAgZm9yZWFjaChzdHJpbmcgdWlkOiBleHBsb2RlKGFyZywiICIpLSh7IiJ9KSkgeworICAgICAgaWYgKHNpemVvZih1aWQpPjEgJiYgdWlkWzBdPT0nKycpIHsKKyAgICAgICAgaWYgKG1lbWJlcihmaWx0ZXJ1aWRzLHVpZFsxLi5dKT09LTEpCisgICAgICAgICAgZmlsdGVydWlkcys9KHt1aWRbMS4uXX0pOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc2l6ZW9mKHVpZCk+MSAmJiB1aWRbMF09PSctJykgeworICAgICAgICAgIGZpbHRlcnVpZHMtPSh7dWlkWzEuLl19KTsKKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBpZiAobWVtYmVyKGZpbHRlcnVpZHMsdWlkKT09LTEpCisgICAgICAgICAgZmlsdGVydWlkcys9KHt1aWR9KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIGZpbHRlcnVpZHMtPSh7dWlkfSk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgdGVsbF9vYmplY3QoUEwsYnJlYWtfc3RyaW5nKAorICAgICAgICAgICJNb21lbnRhbiBpbnRlcmVzc2llcmVuIERpY2ggZm9sZ2VuZGUgVUlEcyBuaWNodCIKKyAgICAgICAgICArKGZpbHRlcnN0YXR1cyA/ICIgKEZpbHRlciBhbik6XG4iIDogIiAoRmlsdGVyIGF1cyk6XG4iKQorICAgICAgICAgICtDb3VudFVwKGZpbHRlcnVpZHMpKyJcbiIsIDc4LCIiLEJTX0xFQVZFX01ZX0xGUykpOworCisgIHJldHVybiAxOworfQorCitwdWJsaWMgaW50IENtZE1vbml0b3Ioc3RyaW5nIGFyZykgeworCisgIGFyZz0oc3RyaW5nKVBMLT5fdW5wYXJzZWRfYXJncygwKTsgIAorCisgIGlmICghc3RyaW5ncChhcmcpIHx8ICFzaXplb2YoYXJnKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLGJyZWFrX3N0cmluZygKKyAgICAgICAgICAiTW9tZW50YW4gaW50ZXJlc3NpZXJlbiBEaWNoIGZvbGdlbmRlIFVJRHMgenVzYWV0emxpY2ggenUgRGVpbmVuOiBcbiIKKyAgICAgICAgICArKHNpemVvZihtb25pdG9ydWlkcykgPyBDb3VudFVwKG1vbml0b3J1aWRzKSA6ICIiKQorICAgICAgICAgICsiXG4iLCA3OCwiIixCU19MRUFWRV9NWV9MRlMpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIGlmIChhcmc9PSJrZWluZSIpIHsKKyAgICBtb25pdG9ydWlkcz0oe30pOworICAgIHhtb25pdG9ydWlkcz0oe30pOworICAgIHRlbGxfb2JqZWN0KFBMLGJyZWFrX3N0cmluZygKKyAgICAgICAgIkRlaW4gRmVobGVydGV1ZmVsIHdpcmQgRGlyIG51biBudXIgbm9jaCAiCisgICAgICAgICJGZWhsZXIgRGVpbmVyIGVpZ2VuZW4gVUlEcyBiZXJpY2h0ZW4uIiw3OCkpOworICAgIHJldHVybiAxOworICB9CisgIGVsc2UgeworICAgIGZvcmVhY2goc3RyaW5nIHVpZDogZXhwbG9kZShhcmcsIiAiKS0oeyIifSkpIHsKKyAgICAgIGlmIChzaXplb2YodWlkKT4xICYmIHVpZFswXT09JysnKSB7CisgICAgICAgIGlmIChtZW1iZXIobW9uaXRvcnVpZHMsdWlkWzEuLl0pPT0tMSkKKyAgICAgICAgICBtb25pdG9ydWlkcys9KHt1aWRbMS4uXX0pOworICAgICAgfQorICAgICAgZWxzZSBpZiAoc2l6ZW9mKHVpZCk+MSAmJiB1aWRbMF09PSctJykgeworICAgICAgICAgIG1vbml0b3J1aWRzLT0oe3VpZFsxLi5dfSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKG1lbWJlcihtb25pdG9ydWlkcyx1aWQpPT0tMSkKKyAgICAgICAgICBtb25pdG9ydWlkcys9KHt1aWR9KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIG1vbml0b3J1aWRzLT0oe3VpZH0pOworICAgICAgfQorICAgIH0KKyAgfQorICBnZXRfdWlkcygpOworICB0ZWxsX29iamVjdChQTCxicmVha19zdHJpbmcoCisgICAgICAgICJNb21lbnRhbiBpbnRlcmVzc2llcmVuIERpY2ggZm9sZ2VuZGUgVUlEcyB6dXNhZXR6bGljaCB6dSBEZWluZW46IFxuIgorICAgICAgICArKHNpemVvZihtb25pdG9ydWlkcykgPyBDb3VudFVwKG1vbml0b3J1aWRzKSA6ICIiKQorICAgICAgICArIlxuIiwgNzgsIiIsQlNfTEVBVkVfTVlfTEZTKSk7CisKKyAgcmV0dXJuIDE7Cit9CisKK3B1YmxpYyBpbnQgQ21kTW9kdXMoc3RyaW5nIGFyZykgeworICBzdHJpbmcgdHh0OworCisgIC8vIEFyZ3VtZW50IHZlcnd1cnN0ZW4KKyAgaWYgKHN0cmluZ3AoYXJnKSAmJiBzaXplb2YoYXJnKSkgeworICAgIG1vZHVzID0gc2VsZWN0X21vZHVzKGFyZyk7CisgICAgcmVzZXQoKTsgIC8vIG5ldWUgRmVobGVybGlzdGUgaG9sZW4KKyAgfQorICAvLyBha3R1ZWxsZSBFaW5zdGVsbHVuZyBhdXNnZWJlbi4KKyAgc3RyaW5nICptb2RzdHI9KHt9KTsKKyAgaWYgKG1vZHVzICYgVF9SVEVSUk9SKQorICAgICAgbW9kc3RyKz0oeyJGZWhsZXIgKExhdWZ6ZWl0KSJ9KTsKKyAgaWYgKG1vZHVzICYgVF9SVFdBUk4pCisgICAgICBtb2RzdHIrPSh7Ildhcm51bmdlbiAoTGF1ZnplaXQpIn0pOworICBpZiAobW9kdXMgJiBUX0NURVJST1IpCisgICAgICBtb2RzdHIrPSh7IkZlaGxlciAoTGFkZXplaXQpIn0pOworICBpZiAobW9kdXMgJiBUX0NUV0FSTikKKyAgICAgIG1vZHN0cis9KHsiV2FybnVuZ2VuIChMYWRlemVpdCkifSk7CisgIGlmIChtb2R1cyAmIFRfUkVQT1JURURfRVJSKQorICAgICAgbW9kc3RyKz0oeyJGZWhsZXJoaW53ZWlzZSJ9KTsKKyAgaWYgKG1vZHVzICYgVF9SRVBPUlRFRF9JREVBKQorICAgICAgbW9kc3RyKz0oeyJJZGVlIn0pOworICBpZiAobW9kdXMgJiBUX1JFUE9SVEVEX01EKQorICAgICAgbW9kc3RyKz0oeyJmZWhsZW5kZSBEZXRhaWxzIn0pOworICBpZiAobW9kdXMgJiBUX1JFUE9SVEVEX1RZUE8pCisgICAgICBtb2RzdHIrPSh7IlR5cG8ifSk7CisKKyAgdGVsbF9vYmplY3QoUEwsIGJyZWFrX3N0cmluZygKKyAgICAgICJEZWluIEZlaGxlcnRldWZlbCB3aXJkIERpciBudW4gdWViZXIgYXVmZ2V0cmV0ZW5lICIKKyAgICAgICtDb3VudFVwKG1vZHN0cikrIiBCZXJpY2h0IGVyc3RhdHRlbi4iLDc4KSk7CisgIHJldHVybigxKTsKK30KKworaW50IENtZEFkZE5vdGUoc3RyaW5nIHN0cikgeworICBzdHJpbmcgKmFycjsKKworICBub3RpZnlfZmFpbCgiQml0dGUgZWluZSBJRCB1bmQgZWluZW4gVGV4dCBhbmdlYmVuIVxuIik7CisgIGlmKCFvYmplY3RwKFRJKSkKKyAgICByZXR1cm4gMDsKKworICBzdHI9KHN0cmluZylQTC0+X3VucGFyc2VkX2FyZ3MoMCk7CisgIGlmICghc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSkKKyAgICByZXR1cm4gMDsKKworICBhcnI9ZXhwbG9kZShzdHIsIiAiKS0oeyIifSk7CisgIGlmIChzaXplb2YoYXJyKTwyKQorICAgIHJldHVybiAwOworICBpbnQgaXNzdWVpZCA9IHRvX2ludChhcnJbMF0pOworCisgIHN0cj1pbXBsb2RlKGFyclsxLi5dLCIgIik7ICAvL3RleHQgd2llZGVyaGVyc3RlbGxlbiwgYWJlciBvaG5lIElECisKKyAgc3dpdGNoKChpbnQpRVJST1JELT5BZGROb3RlKGlzc3VlaWQsc3RyKSkKKyAgeworICAgIGNhc2UgLTE6CisgICAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgICAgICBzcHJpbnRmKCJFcyBnaWJ0IGtlaW5lbiBGZWhsZXIgbWl0IGRlciBJRDogJWRcbiIsaXNzdWVpZCkpOworICAgICAgcmV0dXJuIDE7CisgICAgY2FzZSAtMzoKKyAgICAgIHJldHVybiAwOyAvL29mZmVuYmFyIGtlaW5lIE5vdGl6IGFuZ2VnZWJlbi4KKyAgfQorICAvLyBsZXR6dGVuIEZlaGxlciBtZXJrZW4uCisgIGxmZWhsZXIgPSBpc3N1ZWlkOworCisgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgc3ByaW50ZigiRGVpbmUgTm90aXogd3VyZGUgenUgJWQgaGluenVnZWZ1ZWd0LlxuIiwKKyAgICAgICAgaXNzdWVpZCkpOworICByZXR1cm4gMTsKK30KKworaW50IENtZEZpeChzdHJpbmcgc3RyKQoreworICBzdHJpbmcgKmFycjsKKyAgaW50IGZpeGluZywgcmVzOworCisgIG5vdGlmeV9mYWlsKCJCaXR0ZSBlaW5lIElEIHVuZCBvcHRpb25hbCBlaW5lIE5vdGl6IGFuZ2ViZW4hXG4iKTsKKyAgaWYoIW9iamVjdHAoVEkpKQorICAgIHJldHVybiAwOworCisgIHN0cj0oc3RyaW5nKVBMLT5fdW5wYXJzZWRfYXJncygwKTsKKyAgaWYgKCFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpKQorICAgIHJldHVybiAwOworCisgIGFycj1leHBsb2RlKHN0ciwiICIpLSh7IiJ9KTsKKyAgaWYgKCFzaXplb2YoYXJyKSkKKyAgICByZXR1cm4gMDsKKworICBpbnQgaXNzdWVpZD10b19pbnQoYXJyWzBdKTsKKyAgaWYgKHNpemVvZihhcnIpPjEpCisgICAgc3RyPWltcGxvZGUoYXJyWzEuLl0sIiAiKTsgIC8vdGV4dCB3aWVkZXJoZXJzdGVsbGVuLCBhYmVyIG9obmUgS2V5CisgIGVsc2Ugc3RyPTA7CisKKyAgaWYgKHF1ZXJ5X3ZlcmIoKT09ImZmaXgiIHx8IHF1ZXJ5X3ZlcmIoKT09ImZlaGxlcmZpeCIpCisgIHsKKyAgICAgIGZpeGluZz0xOworICAgICAgcmVzID0gKGludClFUlJPUkQtPlJlc29sdmVJc3N1ZShpc3N1ZWlkLCBzdHIpOworICB9CisgIGVsc2UKKyAgeworICAgICAgcmVzID0gKGludClFUlJPUkQtPlJlT3Blbklzc3VlKGlzc3VlaWQsIHN0cik7CisgIH0KKworICBpZiAocmVzPT0tMSkKKyAgeworICAgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICAgICAgc3ByaW50ZigiRXMgZ2lidCBrZWluZW4gRmVobGVyIG1pdCBkZXIgSUQ6ICVkXG4iLGlzc3VlaWQpKTsKKyAgfQorICBlbHNlIGlmIChyZXM9PS0xMCkKKyAgeworICAgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICAgICJEdSBoYXN0IGxlaWRlciBrZWluZW4gU2NocmVpYnp1Z3JpZmYgZGllc2VuIEZlaGxlci5cbiIKKyAgICAgICAgIkFiZXIgdmllbGxlaWNodCBtb2VjaHRlc3QgRHUgbWl0IGZub3RpeiBlaW5lIE5vdGl6IGFuaGFlbmdlbj9cbiIpOworICB9CisgIGVsc2UgaWYgKHJlcz09LTMpCisgIHsKKyAgICBpZiAoZml4aW5nKQorICAgICAgdGVsbF9vYmplY3QoUEwsIkRpZXNlciBGZWhsZXIgaXN0IGJlcmVpdHMgZ2VmaXh0LlxuIik7CisgICAgZWxzZQorICAgICAgdGVsbF9vYmplY3QoUEwsIkRpZXNlciBGZWhsZXIgaXN0IG5vY2ggbmljaHQgZ2VmaXh0LlxuIik7CisgIH0KKyAgZWxzZSBpZiAocmVzPT0xKQorICB7CisgICAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgICAgICBzcHJpbnRmKCJGZWhsZXIgJWQgYWxzIGdlZml4dCBtYXJraWVydC5cbiIsaXNzdWVpZCkpOworICB9CisgIGVsc2UgaWYgKHJlcz09MCkKKyAgeworICAgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICAgICAgc3ByaW50ZigiRmVobGVyICVkIGFscyBuaWNodCBnZWZpeHQgbWFya2llcnQuXG4iLGlzc3VlaWQpKTsKKyAgfQorICAvLyBsZXR6dGVuIEZlaGxlciBtZXJrZW4uCisgIGxmZWhsZXIgPSBpc3N1ZWlkOworCisgIHJldHVybiAxOworfQorCitpbnQgQ21kTG9jayhzdHJpbmcgc3RyKSB7CisgIHN0cmluZyAqYXJyOworICBpbnQgbG9ja2luZzsKKyAgaW50IHJlczsKKworICBub3RpZnlfZmFpbCgiQml0dGUgZWluZSBJRCB1bmQgb3B0aW9uYWwgZWluZSBOb3RpeiBhbmdlYmVuIVxuIik7CisgIGlmKCFvYmplY3RwKFRJKSkKKyAgICByZXR1cm4gMDsKKworICBzdHI9KHN0cmluZylQTC0+X3VucGFyc2VkX2FyZ3MoMCk7CisgIGlmICghc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSkKKyAgICByZXR1cm4gMDsKKworICBhcnI9ZXhwbG9kZShzdHIsIiAiKS0oeyIifSk7CisgIGlmICghc2l6ZW9mKGFycikpCisgICAgcmV0dXJuIDA7CisKKyAgaW50IGlzc3VlaWQ9dG9faW50KGFyclswXSk7CisgIGlmIChzaXplb2YoYXJyKT4xKQorICAgIHN0cj1pbXBsb2RlKGFyclsxLi5dLCIgIik7ICAvL3RleHQgd2llZGVyaGVyc3RlbGxlbiwgYWJlciBvaG5lIEtleQorICBlbHNlIHN0cj0wOworCisgIGlmIChxdWVyeV92ZXJiKCk9PSJmbG9jayIgfHwgcXVlcnlfdmVyYigpPT0iZmVobGVybG9jayIpCisgIHsKKyAgICAgIGxvY2tpbmc9MTsKKyAgICAgIHJlcz0oaW50KUVSUk9SRC0+TG9ja0lzc3VlKGlzc3VlaWQsc3RyKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICAgIHJlcz0oaW50KUVSUk9SRC0+VW5sb2NrSXNzdWUoaXNzdWVpZCxzdHIpOworICB9CisKKyAgaWYgKHJlcz09LTEpCisgIHsKKyAgICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgICAgIHNwcmludGYoIkVzIGdpYnQga2VpbmVuIEZlaGxlciBtaXQgZGVyIElEOiAlZFxuIixpc3N1ZWlkKSk7CisgIH0KKyAgZWxzZSBpZiAocmVzPT0tMTApCisgIHsKKyAgICAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgICAgICAgIkR1IGhhc3QgbGVpZGVyIGtlaW5lbiBTY2hyZWlienVncmlmZiBkaWVzZW4gRmVobGVyLlxuIik7CisgIH0KKyAgZWxzZSBpZiAocmVzPT0tMykKKyAgeworICAgICAgaWYgKGxvY2tpbmcpCisgICAgICAgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICAgICAgICAgICJEaWVzZXIgRmVobGVyIGlzdCBiZXJlaXRzIHZvciBhdXRvbS4gTG9lc2NoZW4gZ2VzY2h1ZXR6dC5cbiIpOworICAgICAgZWxzZQorICAgICAgICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgICAgICAgICAiRGllc2VyIEZlaGxlciBpc3QgYmVyZWl0cyB6dW0gYXV0b20uIExvZXNjaGVuIGZyZWlnZWdlYmVuLlxuIik7CisgIH0KKyAgZWxzZSBpZiAocmVzPT0tMikKKyAgeworICAgICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgICAgICAiRGllc2VyIEZlaGxlciBpc3QgYmVyZWl0cyBnZWZpeHQgdW5kIHdpcmQgYmFsZCBnZWxvZXNjaHQuXG4iKTsKKyAgfQorICBlbHNlIGlmIChyZXM9PTEpCisgIHsKKyAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgICAgc3ByaW50ZigiRmVobGVyICVkIHZvciBhdXRvbS4gTG9lc2NoZW4gZ2VzY2h1ZXR6dC5cbiIsaXNzdWVpZCkpOworICB9CisgIGVsc2UgaWYgKHJlcz09MCkKKyAgeworICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgICBzcHJpbnRmKCJGZWhsZXIgJWQgenVtIGF1dG9tLiBMb2VzY2hlbiBmcmVpZ2VnZWJlbi5cbiIsaXNzdWVpZCkpOworICB9CisgIC8vIGxldHp0ZW4gRmVobGVyIG1lcmtlbi4KKyAgbGZlaGxlciA9IGlzc3VlaWQ7CisKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBDbWRSZWFzc2lnbihzdHJpbmcgc3RyKSB7CisKKyAgbm90aWZ5X2ZhaWwoIkJpdHRlIGVpbmUgSUQsIGRpZSBuZXVlIFVJRCB1bmQgZ2dmLiBlaW5lIE5vdGl6IGFuZ2ViZW4hXG4iKTsKKyAgaWYoIW9iamVjdHAoVEkpKQorICAgIHJldHVybiAwOworCisgIHN0cj0oc3RyaW5nKVBMLT5fdW5wYXJzZWRfYXJncygwKTsKKyAgaWYgKCFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpKQorICAgIHJldHVybiAwOworCisgIHN0cmluZyAqYXJyPWV4cGxvZGUoc3RyLCIgIiktKHsiIn0pOworICBpZiAoc2l6ZW9mKGFycik8MikKKyAgICByZXR1cm4gMDsKKyAgaW50IGlzc3VlaWQ9dG9faW50KGFyclswXSk7CisgIHN0cmluZyBuZXd1aWQ9YXJyWzFdOworCisgIC8vdGV4dCB3aWVkZXJoZXJzdGVsbGVuLCBhYmVyIG9obmUgS2V5IHVuZCBVSUQKKyAgaWYgKHNpemVvZihhcnIpID4gMikKKyAgICBzdHIgPSBpbXBsb2RlKGFyclsyLi5dLCIgIik7CisgIGVsc2UKKyAgICBzdHIgPSAwOworCisgIHN3aXRjaCgoaW50KUVSUk9SRC0+UmVhc3NpZ25Jc3N1ZShpc3N1ZWlkLCBuZXd1aWQsIHN0cikpCisgIHsKKyAgICBjYXNlIC0xOgorICAgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICAgICAgc3ByaW50ZigiRXMgZ2lidCBrZWluZW4gRmVobGVyIG1pdCBkZXIgSUQ6ICVkXG4iLGlzc3VlaWQpKTsKKyAgICAgIHJldHVybigxKTsKKyAgICBjYXNlIC0xMDoKKyAgICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgICAgIHNwcmludGYoIkR1IGhhc3Qga2VpbmUgU2NocmVpYnJlY2h0ZSBhdWYgRmVobGVyICVkXG4iLGlzc3VlaWQpKTsKKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgLTI6CisgICAgICByZXR1cm4oMCk7IC8vb2ZmZW5iYXIga2VpbmUgbmV1ZSB1aWQgYW5nZWdlYmVuLiAoa2FubiBuaWNodCkKKyAgICBjYXNlIC0zOgorICAgICAgdGVsbF9vYmplY3QoUEwsYnJlYWtfc3RyaW5nKAorICAgICAgICAgICJBbHRlID09IE5ldWUgVUlEIGlzdCBpcmdlbmR3aWUgdW5zaW5uaWcuLi4iLDc4KSk7CisgICAgICByZXR1cm4gMTsKKyAgfQorICAvLyBsZXR6dGVuIEZlaGxlciBtZXJrZW4uCisgIGxmZWhsZXIgPSBpc3N1ZWlkOworCisgIHRlbGxfb2JqZWN0KFBMLGJyZWFrX3N0cmluZygKKyAgICAgIHNwcmludGYoIkRlciBGZWhsZXIgZGVyIElEICVkIHd1cmRlIGFuIGRpZSBVSUQgJXMgIgorICAgICAgICAidWViZXJ0cmFnZW4uXG4iLCBpc3N1ZWlkLCBuZXd1aWQpLDc4KSk7CisgIHJldHVybiAxOworfQorCisvLyAqKioqKioqKioqKioqKiBwdWJsaWMgJ2ludGVybmFsJyBmdW5jdGlvbnMgKioqKioqKioqKioqKioKK3B1YmxpYyBzdHJpbmcgUXVlcnlPd25lcigpIHtyZXR1cm4gb3duZXI7fQorcHVibGljIG1peGVkIFF1ZXJ5SXNzdWVMaXN0KCkge3JldHVybiBpc3N1ZWxpc3Q7fQorCit2b2lkIGNyZWF0ZSgpIHsKKyAgICBpZiAoIWNsb25lcChNRSkpCisgICAgICAgIHJldHVybjsKKyAgICA6OmNyZWF0ZSgpOyAKKworICAgIFNldFByb3AoUF9TSE9SVCwiRGVyIEZlaGxlcnRldWZlbCIpOworICAgIFNldFByb3AoUF9MT05HLGJyZWFrX3N0cmluZygKKyAgICAgICAgICAiRGVpbiBGZWhsZXJ0ZXVmZWwgc29sbCBEaXIgaGVsZmVuLCBJbmZvcm1hdGlvbmVuICIKKyAgICAgICAgICAidWViZXIgYXVmZ2V0cmV0ZW5lIEZlaGxlciB6dSBlcmhhbHRlbi4gSGllcnp1IGZyYWd0IGVyIGRpZSAiCisgICAgICAgICAgImluIFwiRGVpbmVuXCIgVUlEcyBhdWZnZXRyZXRlbmVuIEZlaGxlciB1bmQgZGVyZW4gRGV0YWlscyB2b20gIgorICAgICAgICAgICJGZWhsZXJzcGVpY2hlciBkZXIgTXVkbGliIGFiLiBGb2xnZW5kZSBLb21tYW5kb3Mga2VubnQgZXI6Iiw3OCkKKyAgICArImZlaGxlcmFiZnJhZ2UgPGlkPiAgLSBGcmFndCBEZXRhaWxzIHVlYmVyIEZlaGxlciBtaXQgZGVyIElEIGFiLlxuIgorICAgICJmZWhsZXJsb2VzY2hlbiA8aWQ+IC0gRmVobGVyIHp1bSBMb2VzY2hlbiBtYXJraWVyZW4uXG4iCisgICAgImZlaGxlcmxpc3RlICAgICAgICAgLSBGZWhsZXJsaXN0ZSBkZXIgZWlnZW5lbiBVSURzIGFuemVpZ2VuXG4iCisgICAgImZlaGxlcnJlZnJlc2ggICAgICAgLSBGZWhsZXJkYXRlbiB1bmQgVUlEcyBuZXUgZWlubGVzZW5cbiIKKyAgICAiZmVobGVyZmlsdGVyICAgICAgICAtIFVJRHMgZnVlciBkZW4gRmlsdGVyIGFuZ2ViZW4gKHMuIG1hbnBhZ2UhKVxuIgorICAgICJmZWhsZXJtb2R1cyAgICAgICAgIC0gRmVobGVyIG9kZXIgV2FybnVuZ2VuIGF1c2dlYmVuPyAocy4gbWFucGFnZSlcbiIKKyAgICAiZmVobGVybW9uaXRvciAgICAgICAtIHp1cy4gVUlEcyBiZW9iYWNodGVuIChzLiBtYW5wYWdlKVxuIgorICAgICJmbm90aXogPGlkPiA8bm90ZT4gIC0gZWluZSBOb3RpeiBhbmhhZW5nZW5cbiIKKyAgICAiZmxvY2sgPGlkPiAgPG5vdGU+ICAtIEZlaGxlciB2b3IgYXV0b20uIExvZXNjaGVuIHNjaHVldHplblxuIgorICAgICJmdW5sb2NrIDxpZD4gPG5vdGU+IC0gRmVobGVyIHp1bSBhdXRvbS4gTG9lc2NoZW4gZnJlaWdlYmVuXG4iCisgICAgImZmaXggPGlkPiA8bm90ZT4gICAgLSBGZWhsZXIgYWxzIGdlZml4dCBrZW5uemVpY2huZW5cbiIKKyAgICAiZnVuZml4IDxpZD4gPG5vdGU+ICAtIGdlZml4dGVuIEZlaGxlciBhbHMgbmljaHQtZ2VmaXh0IG1hcmtpZXJlblxuIgorICAgICJmdWViZXJ0cmFnZSA8aWQ+IDxuZXd1aWQ+IDxub3RlPlxuIgorICAgICIgICAgICAgICAgICAgICAgICAgIC0gRmVobGVyIGFuIGRpZSBVSUQgdWViZXJ0cmFnZW5cbiIKKyAgICApOworICAgIFNldFByb3AoUF9OQU1FLCJGZWhsZXJ0ZXVmZWwiKTsKKyAgICBTZXRQcm9wKFBfR0VOREVSLE1BTEUpOworICAgIFNldFByb3AoUF9XRUlHSFQsMCk7CisgICAgU2V0UHJvcChQX1ZBTFVFLDApOworICAgIFNldFByb3AoUF9TSVpFLDEwKTsKKyAgICBTZXRQcm9wKFBfTk9EUk9QLCJEZW4gRmVobGVydGV1ZmVsIGJlaGFlbHN0IER1IGxpZWJlciBiZWkgRGlyLlxuIik7CisgICAgU2V0UHJvcChQX05FVkVSRFJPUCwxKTsKKworICAgIEFkZElkKCAoeyJmZWhsZXJ0ZXVmZWwiLCJ0ZXVmZWwifSkgKTsKKworICAgIEFkZENtZCgoeyJmZWhsZXJhYmZyYWdlIiwiZmFiZnJhZ2UifSksICJDbWRGZWhsZXJaZWlnZW4iICk7CisgICAgQWRkQ21kKCh7ImZlaGxlcmxvZXNjaGVuIiwiZmxvZXNjaGVuIn0pLCAiQ21kRmVobGVyTG9lc2NoZW4iKTsKKyAgICBBZGRDbWQoKHsiZmVobGVybGlzdGUiLCJmbGlzdGUiLCAiZmVobGVydWViZXJzaWNodCIsImZ1ZWJlcnNpY2h0In0pLCAKKyAgICAgICAgIkNtZEZlaGxlckxpc3RlIik7CisgICAgQWRkQ21kKCh7ImZlaGxlcnJlZnJlc2giLCJmcmVmcmVzaCJ9KSwiQ21kUmVmcmVzaCIpOworICAgIEFkZENtZCgoeyJmZWhsZXJmaWx0ZXIiLCJmZmlsdGVyIn0pLCJDbWRGaWx0ZXIiKTsKKyAgICBBZGRDbWQoKHsiZmVobGVybW9kdXMiLCJmbW9kdXMifSksIkNtZE1vZHVzIik7CisgICAgQWRkQ21kKCh7ImZlaGxlcm1vbml0b3IiLCJmbW9uaXRvciJ9KSwiQ21kTW9uaXRvciIpOworICAgIEFkZENtZCgoeyJmZWhsZXJub3RpeiIsImZub3RpeiJ9KSwiQ21kQWRkTm90ZSIpOworICAgIEFkZENtZCgoeyJmZWhsZXJsb2NrIiwiZmxvY2siLCJmZWhsZXJ1bmxvY2siLCJmdW5sb2NrIn0pLAorICAgICAgICAiQ21kTG9jayIpOworICAgIEFkZENtZCgoeyJmZWhsZXJmaXgiLCJmZml4IiwiZmVobGVydW5maXgiLCJmdW5maXgifSksCisgICAgICAgICJDbWRGaXgiKTsKKyAgICBBZGRDbWQoKHsiZmVobGVydWViZXJ0cmFnZSIsImZ1ZWJlcnRyYWdlIn0pLCJDbWRSZWFzc2lnbiIpOworICAgIEFkZENtZCgoeyJmZWhsZXJlaW5nYWJlIiwgImZlaW5nYWJlIn0pLCAiQ21kRmVobGVyRWluZ2FiZSIpOworfQorCit2b2lkIGluaXQoKQoreworICAgIGlmIChmaW5kX2NhbGxfb3V0KCJyZW1vdmUiKSAhPSAtMSkgcmV0dXJuOworCisgICAgLy8gcHJ1ZWZ1bmcgYXVmIGVudiBuaWNodCBub2V0aWcsIG1vdmUgZ2VodCBudXIgaW4gZWluIGVudiB1bmQgb2huZSBlbnYKKyAgICAvLyBhdWNoIGtlaW4gaW5pdCgpLgorICAgIGlmICggIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoZW52aXJvbm1lbnQoKSkgfHwgCisgICAgICAgICFJU19MRUFSTkVSKGVudmlyb25tZW50KCkpKSB7CisgICAgICAgIC8vIGluIGludGVyYWN0aXZlLCBhYmVyIGtlaW4gbWFnaWVyIC0+IGRpcmVrdCB3ZWcuCisgICAgICAgIGNhbGxfb3V0KCJyZW1vdmUiLDAsMSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZSBpZiAoIXNpemVvZihvd25lcikpCisgICAgICAgIC8vIEVudiBpc3QgSW50ZXJhY3RpdiB1bmQgTWFnaWVyIChzb25zdCB3YWVyIG1hbiBvYmVuIHJhdXNnZWZsb2dlbikKKyAgICAgICAgb3duZXI9Z2V0dWlkKGVudmlyb25tZW50KCkpOworICAgIGVsc2UgaWYgKG93bmVyIT1nZXR1aWQoZW52aXJvbm1lbnQoKSkpIHsKKyAgICAgICAvL29rLCBuaWNodCBkZXIgRWlnZW50dWVtZXIsIGRpcmVrdCB3ZWcuCisgICAgICAgY2FsbF9vdXQoInJlbW92ZSIsMCk7CisgICAgICAgcmV0dXJuOworICAgfQorICAgU2V0UHJvcChQX0VYVFJBX0xPT0ssYnJlYWtfc3RyaW5nKAorICAgICAgICAgIkF1ZiAiK2Vudmlyb25tZW50KCktPk5hbWUoV0VTU0VOKSsiIFNjaHVsdGVyIHNpdHp0IGVpbiBrbGVpbmVyICIKKyAgICAgICAgICJGZWhsZXJ0ZXVmZWwsIGRlciAiCisgICAgICAgICArZW52aXJvbm1lbnQoKS0+UXVlcnlQcm9ub3VuKFdFTSkKKyAgICAgICAgICsiIGltbWVyIHdpZWRlciBldHdhcyBpbnMgT2hyIGZsdWVzdGVydC4iLDc4KSk7CisKKyAgIGNhbGxfb3V0KCJyZXNldCIsMSk7CisKKyAgIDo6aW5pdCgpOworfQorCitwdWJsaWMgbWl4ZWQgQ29uZmlndXJlKG1peGVkIGRhdGEpCit7CisgIGlmICghZGF0YSkKKyAgeworICAgIHJldHVybiAoWyJmaWx0ZXJ1aWRzIjpmaWx0ZXJ1aWRzLAorICAgICAgICAgICAgICJmaWx0ZXJzdGF0dXMiOmZpbHRlcnN0YXR1cywKKyAgICAgICAgICAgICAibW9kdXMiOm1vZHVzLAorICAgICAgICAgICAgICJtb25pdG9ydWlkcyI6bW9uaXRvcnVpZHMsCisgICAgICAgICAgICAgImZlaGxlcnphaGwiOiBmZWhsZXJ6YWhsXSk7CisgIH0KKyAgZWxzZSBpZiAobWFwcGluZ3AoZGF0YSkpCisgIHsKKyAgICBpZiAobWVtYmVyKGRhdGEsImZpbHRlcnVpZHMiKSAmJiBwb2ludGVycChkYXRhWyJmaWx0ZXJ1aWRzIl0pKQorICAgICAgZmlsdGVydWlkcz1kYXRhWyJmaWx0ZXJ1aWRzIl07CisgICAgaWYgKG1lbWJlcihkYXRhLCJmaWx0ZXJzdGF0dXMiKSAmJiBpbnRwKGRhdGFbImZpbHRlcnN0YXR1cyJdKSkKKyAgICAgIGZpbHRlcnN0YXR1cz1kYXRhWyJmaWx0ZXJzdGF0dXMiXTsKKyAgICBpZiAobWVtYmVyKGRhdGEsIm1vZHVzIikgJiYgaW50cChkYXRhWyJtb2R1cyJdKSkKKyAgICAgIG1vZHVzPWRhdGFbIm1vZHVzIl07CisgICAgaWYgKG1lbWJlcihkYXRhLCJtb25pdG9ydWlkcyIpICYmIHBvaW50ZXJwKGRhdGFbIm1vbml0b3J1aWRzIl0pKQorICAgICAgbW9uaXRvcnVpZHM9ZGF0YVsibW9uaXRvcnVpZHMiXTsKKyAgICBpZiAobWVtYmVyKGRhdGEsImZlaGxlcnphaGwiKSAmJiBpbnRwKGRhdGFbImZlaGxlcnphaGwiXSkpCisgICAgICBmZWhsZXJ6YWhsPWRhdGFbImZlaGxlcnphaGwiXTsKKyAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30KKworbWFwcGluZyBfcXVlcnlfYXV0b2xvYWRvYmooKQoreworICByZXR1cm4gQ29uZmlndXJlKDApOworfQorCittYXBwaW5nIF9zZXRfYXV0b2xvYWRvYmoobWl4ZWQgZGF0YSkKK3sKKyAgQ29uZmlndXJlKGRhdGEpOworICByZXR1cm4gX3F1ZXJ5X2F1dG9sb2Fkb2JqKCk7Cit9CisKKwordm9pZCByZXNldCgpCit7CisgICAgZ2V0X3VpZHMoKTsKKyAgICBpbnQgbmV1ZWZlaGxlcnphaGw9Z2V0X2lzc3VlbGlzdCgpOworCisgICAgaWYgKGZlaGxlcnphaGwgPCBuZXVlZmVobGVyemFobCkKKyAgICAgIHRlbGxfb2JqZWN0KGVudmlyb25tZW50KE1FKSwgYnJlYWtfc3RyaW5nKAorICAgICAgICAiRGVpbmUgRmVobGVybGlzdGUgaXN0IHNvZWJlbiBsYWVuZ2VyIGdld29yZGVuLiIsNzgsCisgICAgICAgICJEZWluIEZlaGxlcnRldWZlbCB0ZWlsdCBEaXIgbWl0OiAiKSk7CisgICAgZWxzZSBpZiAoZmVobGVyemFobCA+IG5ldWVmZWhsZXJ6YWhsKQorICAgICAgdGVsbF9vYmplY3QoZW52aXJvbm1lbnQoTUUpLCBicmVha19zdHJpbmcoCisgICAgICAgICJEZWluZSBGZWhsZXJsaXN0ZSBpc3Qgc29lYmVuIGt1ZXJ6ZXIgZ2V3b3JkZW4uIiw3OCwKKyAgICAgICAgIkRlaW4gRmVobGVydGV1ZmVsIHRlaWx0IERpciBtaXQ6ICIpKTsKKyAgICBmZWhsZXJ6YWhsID0gbmV1ZWZlaGxlcnphaGw7Cit9CisKKy8vICoqKioqKioqIHByaXZhdGUgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKgorcHJpdmF0ZSB2b2lkIGdldF91aWRzKCkKK3sKKyAgICB1aWRzPShzdHJpbmcgKiltYXN0ZXIoKS0+UXVlcnlVSURzRm9yV2l6YXJkKG93bmVyKTsKKyAgICB4bW9uaXRvcnVpZHM9KHt9KTsKKyAgICBpZiAoc2l6ZW9mKG1vbml0b3J1aWRzKSkKKyAgICB7CisgICAgICBjbG9zdXJlIGNsPXN5bWJvbF9mdW5jdGlvbigiUXVlcnlVSURBbGlhcyIsIG1hc3RlcigpKTsKKyAgICAgIGZvcmVhY2goc3RyaW5nIHVpZDogbW9uaXRvcnVpZHMpIHsKKyAgICAgICAgeG1vbml0b3J1aWRzICs9IChzdHJpbmcqKWZ1bmNhbGwoY2wsIHVpZCk7CisgICAgICB9CisgICAgfQorfQorCisvKiBIb2x0IHNpY2ggYXVzIGRlbSBFcnJvckQgZGllIExpc3RlIHVuZ2Vsb2VzY2h0ZXIgdW5kIHVuZ2VmaXh0ZXIgRmVobGVyIGZ1ZXIKKyAqIGZ1ZXIgZGllIFVJRHMgZGVzIE1hZ2llciBmdWVyIGFsbGUgVHlwZW4KKyAqLworcHJpdmF0ZSB2YXJhcmdzIGludCBnZXRfaXNzdWVsaXN0KGludCBsbW9kdXMpCit7CisgICAgaW50IGNvdW50OworCisgICAgaWYgKCFsbW9kdXMpCisgICAgICBsbW9kdXM9bW9kdXM7CisKKyAgICBpc3N1ZWxpc3Q9bV9hbGxvY2F0ZShzaXplb2YoQUxMX0VSUl9UWVBFUyksMSk7CisKKyAgICBmb3JlYWNoKGludCB0eXBlOiBBTExfRVJSX1RZUEVTKQorICAgIHsKKyAgICAgIGlmICh0eXBlICYgbG1vZHVzKQorICAgICAgeworICAgICAgICAgIC8vREVCVUcoc3ByaW50ZigiVHlwZTogJWRcbiIsdHlwZSkpOworICAgICAgICAgIGZvcmVhY2goc3RyaW5nIHVpZCA6IHVpZHMgKyB4bW9uaXRvcnVpZHMpCisgICAgICAgICAgeworICAgICAgICAgICAgLy9ERUJVRyhzcHJpbnRmKCJUeXBlOiAlZCwgVUlEOiAlc1xuIix0eXBlLHVpZCkpOworICAgICAgICAgICAgPCA8aW50fHN0cmluZz4qID4qIGxpc3QgPQorICAgICAgICAgICAgICAgICAgKDwgPGludHxzdHJpbmc+KiA+KilFUlJPUkQtPlF1ZXJ5SXNzdWVMaXN0KHR5cGUsdWlkKTsKKyAgICAgICAgICAgIGNvdW50ICs9IHNpemVvZihsaXN0KTsKKworICAgICAgICAgICAgaWYgKCFtZW1iZXIoaXNzdWVsaXN0LCB0eXBlKSkKKyAgICAgICAgICAgICAgaXNzdWVsaXN0ICs9IChbIHR5cGU6IChbIHVpZDogbGlzdCBdKSBdKTsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFtZW1iZXIoaXNzdWVsaXN0W3R5cGVdLCB1aWQpKQorICAgICAgICAgICAgICBpc3N1ZWxpc3RbdHlwZV0gKz0gKFt1aWQ6IGxpc3QgXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGNvdW50OworfQorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvbGlzcC9lc2NhcGUuYyBiL29iai90b29scy9saXNwL2VzY2FwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZjU2NDgKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvbGlzcC9lc2NhcGUuYwpAQCAtMCwwICsxLDM3IEBACisvLyBFU0NBUEUuQyAtLSBleHBhbmRpbmcgZXNjYXBlIGNoYXJhY3RlcnMKKy8vIChjKSAxOTk0IGJ5IEhhdGVATW9yZ2VuR3JhdWVuLCBUVUJtdWQsIE5pZ2h0RmFsbAorLy8gLS0KKy8vIENvcHksIGNoYW5nZSBhbmQgZGlzdHJpYnV0ZSB0aGlzIGJpdCBvZiBzb2Z0d2FyZSBhcyBtdWNoIGFzIHlvdSBsaWtlLAorLy8gYnV0IGtlZXAgdGhlIG5hbWUgb2YgdGhlIG9yaWdpbmFsIGF1dGhvciBpbiB0aGUgaGVhZGVyLgorCisjcHJhZ21hIHN0cm9uZ190eXBlcworCitzdHJpbmcgZXNjYXBlKHN0cmluZyBzdHIpCit7CisgIHN3aXRjaChzdHIpIAorICB7CisgICAgY2FzZSAiXGIiIDogcmV0dXJuICJcXGIiOworICAgIGNhc2UgIlxmIiA6IHJldHVybiAiXFxmIjsKKyAgICBjYXNlICJcbiIgOiByZXR1cm4gIlxcbiI7CisgICAgY2FzZSAiXHIiIDogcmV0dXJuICJcXHIiOworICAgIGNhc2UgIlx0IiA6IHJldHVybiAiXFx0IjsKKyAgICBjYXNlICJcXCIgOiByZXR1cm4gIlxcXFwiOworICB9CisgIHJldHVybiBzdHI7Cit9CisKK3N0cmluZyB1bmVzY2FwZShzdHJpbmcgc3RyKQoreworICBzd2l0Y2goc3RyKSAKKyAgeworICAgIGNhc2UgIlxcYiIgOiByZXR1cm4gIlxiIjsKKyAgICBjYXNlICJcXGYiIDogcmV0dXJuICJcZiI7CisgICAgY2FzZSAiXFxuIiA6IHJldHVybiAiXG4iOworICAgIGNhc2UgIlxcciIgOiByZXR1cm4gIlxyIjsKKyAgICBjYXNlICJcXHQiIDogcmV0dXJuICJcdCI7CisgICAgY2FzZSAiXFxcXCI6IHJldHVybiAiXFwiOworICAgIGRlZmF1bHQgICA6IGlmKHN0ciAmJiBzaXplb2Yoc3RyKT4xICYmIHN0clswXT09J1xcJykgCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0clsxLi5dOyAKKyAgfQorICByZXR1cm4gc3RyOworfQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL2xpc3Ava25ldGUuYyBiL29iai90b29scy9saXNwL2tuZXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWRjMTQzMgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9saXNwL2tuZXRlLmMKQEAgLTAsMCArMSwxOTAgQEAKKy8vIEtORVRFLkMgLS0gQ29tbWFuZExpbmUgRnJvbnRlbmQgdG8gdGhlIExpc3AyQ2xvc3VyZSBjb21waWxlcgorLy8gKGMpIDE5OTQgYnkgSGF0ZUBNb3JnZW5HcmF1ZW4sIFRVQm11ZCwgTmlnaHRGYWxsCisvLyAtLQorLy8gQ29weSwgY2hhbmdlIGFuZCBkaXN0cmlidXRlIHRoaXMgYml0IG9mIHNvZnR3YXJlIGFzIG11Y2ggYXMgeW91IGxpa2UsCisvLyBidXQga2VlcCB0aGUgbmFtZSBvZiB0aGUgb3JpZ2luYWwgYXV0aG9yIGluIHRoZSBoZWFkZXIuCisKKyNpbmNsdWRlICJ0d2Vhay5oIgorCitzdGF0aWMgaW5oZXJpdCBIT01FKCJsaXNwIik7CisKKyNpZmRlZiBBTEFUSUEKKyMgIGRlZmluZSBUVUJNVUQKKyNlbmRpZgorLy8gVFVCTVVEIGlzIGEgQ09NUEFUIG1vZGUgZ2FtZSEgKHdlbGwgc29ydCBvZiwgaXRzIGEgTkFUSVZFL0NPTVBBVCBtaXh0dXJlKQorLy8gdGhlIGZvbGxvd2luZyBkZWZpbmVzIHNob3VsZCBiZSB0aGUgb25seSBvbmVzIHRvIGNoYW5nZQorLy8gZGVmaW5lIEVOR0xJU0ggaWYgeW91IGRvbid0IHdhbnQgZ2VybWFuIG1lc3NhZ2VzIDspCisjaWYgKGRlZmluZWQoVFVCTVVEKSB8fCBkZWZpbmVkKFRBUFBNVUQpIHx8IGRlZmluZWQoVU5JdG9waWEpIHx8IFwKKyAgICAgZGVmaW5lZChBREFNQU5UKSkKKyMgaWZkZWYgQURBTUFOVAorIyAgIGluY2x1ZGUgPGNvbmZpZy5oPgorICAgIGluaGVyaXQgIi9saWIvb2JqIjsKKyMgICBkZWZpbmUgV0laTE9DQUwgIi93aXovIgorIyAgIGRlZmluZSBJRCh4KSAgICAgICAgc2V0X25hbWUoeCkKKyMgICBkZWZpbmUgU0hPUlQoeCkgICAgIHNldF9zaG9ydCh4KQorIyAgIGRlZmluZSBMT05HKHgpICAgICAgc2V0X2xvbmcoeCkKKyMgICBkZWZpbmUgSVNXSVpBUkQocGwpIChMRVZFTE1BU1RFUi0+aXNfd2l6YXJkKHBsLT5xdWVyeV9yZWFsX25hbWUoKSkpCisjIGVuZGlmCisjIGlmZGVmIFRVQk1VRAorIyAgIGluY2x1ZGUgPGtlcm5lbC5oPgorIyAgIGluY2x1ZGUgPHdpemxldmVscy5oPgorICAgIGluaGVyaXQgQUNDRVNTOworICAgIGluaGVyaXQgIi9jb21wbGV4L2l0ZW0iOworICAgIGluaGVyaXQgIi9iYXNpYy9hdXRvbG9hZCI7CisjICAgZGVmaW5lIFdJWkxPQ0FMICIvcGxheWVycy8iCisjICAgZGVmaW5lIElEKHgpICAgICAgICBhZGRfaWQoeCkKKyMgICBkZWZpbmUgSVNXSVpBUkQocGwpIChwbC0+cXVlcnlfbGV2ZWwoKSA+PSBXTF9XSVpBUkQpCisjIGVuZGlmCisjIGlmZGVmIFRBUFBNVUQKKyMgICBpbmNsdWRlIDxsZXZlbHMuaD4KKyAgICBpbmhlcml0ICIvb2JqL3RoaW5nIjsKKyMgICBkZWZpbmUgV0laTE9DQUwgIi93LyIKKyMgICBkZWZpbmUgSUQoeCkgICAgICAgIHNldF9hbGlhcyh4KQorIyAgIGRlZmluZSBJU1dJWkFSRChwbCkgKHBsLT5xdWVyeV9sZXZlbCgpID49IExWTF9XSVpBUkQpCisjIGVuZGlmCisjIGRlZmluZSBFTkdMSVNICisjIGlmZGVmIFVOSXRvcGlhCisjICAgdW5kZWYgRU5HTElTSAorIyAgIGlmZGVmIEZpbmFsRnJvbnRpZXIKKyMgICAgIGluY2x1ZGUgPGxldmVsLmg+CisjICAgZWxzZQorIyAgICAgaW5jbHVkZSA8bGV2ZWxzLmg+CisjICAgZW5kaWYKKyAgICBpbmhlcml0ICIvaS9pdGVtIjsKKyAgICBpbmhlcml0ICIvaS9pbnN0YWxsIjsKKyMgICBkZWZpbmUgV0laTE9DQUwgIi93LyIKKyMgICBkZWZpbmUgSUQoeCkgICAgICAgIGFkZF9pZCh4KQorIyAgIGRlZmluZSBJU1dJWkFSRChwbCkgd2l6cChwbCkKKyMgZW5kaWYKKyMgZGVmaW5lIFdJWkhPTUUgICAgICAgIChXSVpMT0NBTCt0aGlzX3BsYXllcigpLT5xdWVyeV9yZWFsX25hbWUoKSkKKyMgZGVmaW5lIExPTkcoeCkgICAgICAgIHNldF9sb25nKHgpCisjIGRlZmluZSBTSE9SVCh4KSAgICAgICBzZXRfc2hvcnQoeCkKKyNlbHNlCisgIGluaGVyaXQgIi9zdGQvdGhpbmciOworIyBpZmRlZiBOSUdIVEZBTEwKKyMgICBkZWZpbmUgRU5HTElTSAorIyBlbmRpZgorIyBpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjIGluY2x1ZGUgPHdpemxldmVscy5oPgorIyBkZWZpbmUgV0laSE9NRSAgICAgICAgKCIvcGxheWVycy8iK2dldHVpZCh0aGlzX29iamVjdCgpKSkKKyMgZGVmaW5lIElEKHgpICAgICAgICAgIEFkZElkKHgpOyBTZXRQcm9wKFBfTkFNRSwgeCkKKyMgZGVmaW5lIExPTkcoeCkgICAgICAgIFNldFByb3AoUF9MT05HLCB4KQorIyBkZWZpbmUgU0hPUlQoeCkgICAgICAgU2V0UHJvcChQX1NIT1JULCB4KTsKKyMgZGVmaW5lIElTV0laQVJEKHBsKSAgIElTX1dJWkFSRChwbCkKKyNlbmRpZgorCitub21hc2sgdm9pZCBjcmVhdGUoKQoreworICBpZihzaXplb2Yob2xkX2V4cGxvZGUob2JqZWN0X25hbWUodGhpc19vYmplY3QoKSksICIjIikpID09IDEpIHJldHVybjsKKyAgaWYoIWludGVyYWN0aXZlKHRoaXNfcGxheWVyKCkpKSBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKKyNpZm5kZWYgTU9SR0VOR1JBVUVOCisgIGlmKCh0aGlzX3BsYXllcigpICE9IGZpbmRfcGxheWVyKCJoYXRlIikgJiYKKyAgICAgIGludGVyYWN0aXZlKGZpbmRfcGxheWVyKCJoYXRlIikpKSAmJgorICAgICBvbGRfZXhwbG9kZShvYmplY3RfbmFtZSh0aGlzX29iamVjdCgpKSwgIiMiKVswXSA9PSBIT01FKCJrbmV0ZSIpKQorICB7CisjaWZkZWYgVFVCTVVECisgICAgaWYoY2hlY2tfcHJpdmlsZWdlKCJoYXRlIikpIHNldF9wcml2aWxlZ2UoImhhdGUiKTsKKyAgICBlbHNlIHNldF9wcml2aWxlZ2UoMCk7CisjZWxzZQorICAgIHByaW50ZigiKkVSUk9SOiBkbyBub3QgY2xvbmUgdGhpcyBmaWxlIVxuIgorICAgICAgICAgICsiICAgICAgICBjcmVhdGUgYSBmaWxlIHdpdGggdGhlIGZvbGxvd2luZyBsaW5lIGluIHlvdSBob21lOlxuIgorICAgICAgICAgICsiaW5oZXJpdCBcIiIrSE9NRSgia25ldGUiKSsiXCI7XG4iKTsKKyAgICBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKKyAgICByZXR1cm47CisjZW5kaWYKKyAgfQorI2VuZGlmCisjaWYgKGRlZmluZWQoVFVCTVVEKSB8fCBkZWZpbmVkKFVOSXRvcGlhKSkKKyAgaXRlbTo6Y3JlYXRlKCk7CisjZWxpZiAoZGVmaW5lZChBREFNQU5UKSkKKyAgb2JqOjpjcmVhdGUoKTsKKyNlbHNlCisgIHRoaW5nOjpjcmVhdGUoKTsKKyNlbmRpZgorI2lmZGVmIEVOR0xJU0gKKyAgSUQoImRvdWdoIik7CisgIElEKCJsaXNwIik7CisgIFNIT1JUKCJBIHBpZWNlIG9mIGRvdWdoXG4iKTsKKyAgTE9ORygiVGhpcyBwaWVjZSBvZiBkb3VnaCBjYW4gYmUgZm9ybWVkIHRvIHlvdXIgb3duIGNvbnZlbmllbmNlLlxuIik7CisjZWxzZQorIyBpZmRlZiBVTkl0b3BpYQorICAgIHNldF9uYW1lKCJLbmV0ZSIpOworIyBlbmRpZgorICBJRCgia25ldGUiKTsKKyAgSUQoImxpc3AiKTsKKyAgU0hPUlQoIkVpbiBTdHVlY2sgS25ldGUiKTsKKyAgTE9ORyggCisgICJEaWVzZXMgU3R1ZWNrIEtuZXRlIGthbm4gbWFuIHNlaHIgc2Nob2VuIGFuIHNlaW5lbiBwZXJzb2VubGljaGVuIEdlc2NobWFja1xuIgorICsiYW5wYXNzZW4uXG4iKTsKKyB0aGlzX29iamVjdCgpLT5TZXRQcm9wKCJhdXRvbG9hZG9iaiIsMSk7CisgdGhpc19vYmplY3QoKS0+U2V0UHJvcCgiYXV0b2xvYWQiLDEpOworI2VuZGlmCisgIGxpc3A6OmNyZWF0ZSgpOworfQorCit2YXJhcmdzIG5vbWFzayB2b2lkIGluaXQoaW50IHgpCit7CisgIGxpc3A6OmluaXQoeCk7CisjaWYgKGRlZmluZWQoVFVCTVVEKSB8fCBkZWZpbmVkKFVOSXRvcGlhKSkKKyMgaWZuZGVmIFRVQk1VRAorICAgIGl0ZW06OmluaXQoKTsKKyMgZW5kaWYKKyNlbGlmIChkZWZpbmVkKEFEQU1BTlQpKQorICBvYmo6OmluaXQoKTsKKyNlbHNlCisgIHRoaW5nOjppbml0KCk7CisjZW5kaWYKKyAgYWRkX2FjdGlvbigiY21kbGluZSIsICIiLCAxKTsKK30KKworI2lmZGVmIFRBUFBNVUQKK3F1ZXJ5X2F1dG9fbG9hZCgpIHsgcmV0dXJuICh7X19GSUxFX199KTsgfQorZHJvcCgpIHsgcmV0dXJuIDE7IH0KKyNlbmRpZgorI2lmICgoZGVmaW5lZChUVUJNVUQpKSB8fCAoZGVmaW5lZChBREFNQU5UKSkpCitkcm9wKCkgeyByZXR1cm4gMTsgfQorI2VuZGlmCisKK25vbWFzayBzdHJpbmcgbG9hZChzdHJpbmcgZmlsZSkKK3sKKyAgaWYocHJldmlvdXNfb2JqZWN0KCkgIT0gdGhpc19vYmplY3QoKSkgcmV0dXJuICIqIFByaXZpbGVnZSB2aW9sYXRpb25cbiI7CisgIHJldHVybiBsaXNwKHJlYWRfZmlsZShmaWxlKSk7Cit9CisKK25vbWFzayBpbnQgY21kbGluZShzdHJpbmcgc3RyKQoreworICBpbnQgY29zdDsKKyAgY29zdCA9IGdldF9ldmFsX2Nvc3QoKTsKKyAgaWYodGhpc19wbGF5ZXIoKSAhPSB0aGlzX2ludGVyYWN0aXZlKCkpIHJldHVybiAwOworCisjaWZuZGVmIE1PUkdFTkdSQVVFTgorIyBpZm5kZWYgVFVCTVVECisgIGlmKHRoaXNfcGxheWVyKCkgJiYgaW50ZXJhY3RpdmUodGhpc19wbGF5ZXIoKSkgJiYKKyAgICAgKCh0aGlzX3BsYXllcigpICE9IGZpbmRfcGxheWVyKCJoYXRlIikpIHx8CisgICAgICAodGhpc19wbGF5ZXIoKSAhPSBmaW5kX3BsYXllcigiZXRhaCIpKSkpCisjIGVuZGlmCisjZWxzZQorICBpZih0aGlzX3BsYXllcigpICYmIGludGVyYWN0aXZlKHRoaXNfcGxheWVyKCkpKQorI2VuZGlmCisgIHsKKyAgICBtaXhlZCByZXN1bHQ7CisgICAgaWYoIUlTV0laQVJEKHRoaXNfcGxheWVyKCkpKSByZXR1cm4gMDsKKyNpZmRlZiBUQVBQTVVECisgICAgbm90aWZ5X2ZhaWwobGFtYmRhKCh7fSksICh7IydsaXNwLyonKi8sIAorCQkJCSAgcXVlcnlfdmVyYigpKyhzdHI/KCIgIitzdHIpOiIiKSwgMX0pKSk7CisjZWxzZQorIyBpZmRlZiBNT1JHRU5HUkFVRU4KKyAgICBzdHIgPSB0aGlzX3BsYXllcigpLT5fdW5wYXJzZWRfYXJncygpOworIyBlbmRpZiAKKyAgICByZXN1bHQgPSBsaXNwKHF1ZXJ5X3ZlcmIoKSsoc3RyPygiICIrc3RyKToiIiksIDEpOworICAgIGlmKHJlc3VsdCAhPSAtMSAmJiBjb3N0ID49IDk5MDAwMCkgeworICAgICAgaWYoc3RyaW5ncChyZXN1bHQpKQorICAgICAgICBub3RpZnlfZmFpbChyZXN1bHQpOworICAgICAgZWxzZQorICAgICAgICBpZihyZXN1bHQpIG5vdGlmeV9mYWlsKHNwcmludGYoIiVPXG4iLCByZXN1bHQpKTsKKwllbHNlIHJldHVybiAxOworICAgICAgcmV0dXJuIDA7CisgICAgfQorI2VuZGlmCisgIH0KK30KZGlmZiAtLWdpdCBhL29iai90b29scy9saXNwL2tuZXRlLmwgYi9vYmovdG9vbHMvbGlzcC9rbmV0ZS5sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4ZDU0OGUKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvbGlzcC9rbmV0ZS5sCkBAIC0wLDAgKzEsMTEgQEAKKyh3cml0ZSAiTG9hZGluZyAvdy9tYXJjdXMva25ldGUubDogIikKKyhzZXRfYWxpYXMgImtuZXRlIikKKyhzZXRfYWxpYXMgInh5eiIpCisoc2V0X3Nob3J0ICJFaW4gU3R1ZWNrIEtuZXRlIikKKyhzZXRfbG9uZyAiRHUgc2llaHN0IGhpZXIgZWluIFN0dWVjayBLbmV0ZSwgZGFzIG1hbiB3dW5kZXJiYXIgdmVyZm9ybWVuLCB2ZXJncm9lc3Nlcm4gb2RlciB2ZXJrbHVtcGVuIGthbm4uIElyZ2VuZHdpZSBkZW5rc3QgZHUgYmVpIHNlaW5lbSBBbmJsaWNrIHBsb2V0emxpY2ggYW4gc2VociB2aWVsZSBLbGFtbWVybiBhdWYgdW5kIHp1IC4uLiBnYW56IHdpZSBpbiBkZW4gYWx0ZW4gTElTUCBUYWdlblxuIikKKyhkZWZpbmUgX3dhZGRyX2xpbmUgKGxhbWJkYSAob2IpIChzcHJpbnRmICIlLTE1cyAlM2QgJS0xNnMgJXMiIChjYWxsX290aGVyIG9iICJxdWVyeV92aXNfbmFtZSIpIChjYWxsX290aGVyIG9iICJxdWVyeV9sZXZlbCIpIChxdWVyeV9pcF9udW1iZXIgb2IpIChxdWVyeV9pcF9uYW1lIG9iKSkpKQorKHdyaXRlICIuIikKKyhkZWZpbmUgX3dhZGRyIChsYW1iZGEgKCkgKHdyaXRlIChpbXBsb2RlIChtYXAgKGNhbGxfb3RoZXIgKHRoaXNfcGxheWVyKSAic29ydF9ieV9sZXZlbCIgKHVzZXJzKSkgKFsgKG1lbW9yeSkgJ193YWRkcl9saW5lKSkgIlxuIikpKSkgKHdyaXRlICJfd2FkZHIuIikKKyhkZWZpbmUgcmVsb2FkIChsYW1iZGEgKCkgKCwgKG1hcCAoZXhwbG9kZSAocmVhZF9maWxlICIvdy9tYXJjdXMvLmtuZXRlLmwiKSAiXG4iKSAnbGlzcCkgIkRvbmUuXG4iKSkpICh3cml0ZSAicmVsb2FkLiIpCisoZGVmaW5lIHBraWxsIChsYW1iZGEgKHgpICgsIChtX2RlbGV0ZSAoY2FsbF9vdGhlciAiL29iai9zdGF0aWMvcHJvcGxvZyIgIlFVRVJZIikgeCkgKGNhbGxfb3RoZXIgIi9vYmovc3RhdGljL3Byb3Bsb2ciICJTQVZFIikgKG1fZGVsZXRlIChjYWxsX290aGVyICIvb2JqL3N0YXRpYy9wcm9wbWFzdGVyIiAiUVVFUlkiKSB4KSAoY2FsbF9vdGhlciAiL29iai9zdGF0aWMvcHJvcG1hc3RlciIgIlNBVkUiKSAiRGVsZXRlZC4iKSkpICh3cml0ZSAicGtpbGwuIikKKyh3cml0ZSAiLlxuIikKZGlmZiAtLWdpdCBhL29iai90b29scy9saXNwL2xleC5jIGIvb2JqL3Rvb2xzL2xpc3AvbGV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcyNWM4NgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9saXNwL2xleC5jCkBAIC0wLDAgKzEsNzMgQEAKKy8vIExFWC5DIC0tIGNyZWF0aW5nIHRvbGtlbnMgZnJvbSBpbnB1dCBzdHJpbmcKKy8vIChjKSAxOTk0IGJ5IEhhdGVATW9yZ2VuR3JhdWVuLCBUVUJtdWQsIE5pZ2h0RmFsbAorLy8gLS0KKy8vIENvcHksIGNoYW5nZSBhbmQgZGlzdHJpYnV0ZSB0aGlzIGJpdCBvZiBzb2Z0d2FyZSBhcyBtdWNoIGFzIHlvdSBsaWtlLAorLy8gYnV0IGtlZXAgdGhlIG5hbWUgb2YgdGhlIG9yaWdpbmFsIGF1dGhvciBpbiB0aGUgaGVhZGVyLgorCisjcHJhZ21hIHN0cm9uZ190eXBlcworCisjaW5jbHVkZSAidHdlYWsuaCIKKworcHJpdmF0ZSBpbmhlcml0IEhPTUUoIm1pY3JvY29kZSIpOworcHJpdmF0ZSBpbmhlcml0IEhPTUUoImVzY2FwZSIpOworCitwcml2YXRlIG5vc2F2ZSBtaXhlZCAqdG9rZW5zOworCitzdGF0aWMgdm9pZCBjcmVhdGUoKSAKK3sgCisgIG1pY3JvY29kZTo6Y3JlYXRlKCk7CisgIHRva2VucyA9ICh7fSk7Cit9CisKK25vbWFzayBwcml2YXRlIG1peGVkIG1ha2Vfc3ltYm9sKHN0cmluZyBzdHIpCit7CisgIG1peGVkIHN5bTsKKworICBpZighc3RyaW5ncChzdHIpKSByZXR1cm4gc3RyOworICBpZihzeW0gPSBnZXRfZnVuY3Rpb24oc3RyKSkJCQkJLy8gRlVOQ1RJT05TCisgICAgcmV0dXJuIHN5bTsKKyAgaWYoc3RyID09ICJsaXN0IikKKyAgICByZXR1cm4gIycoezsKKyAgaWYoc3RyWzBdID09ICciJykKKyAgICByZXR1cm4gaW1wbG9kZShtYXAocmVnZXhwbG9kZShzdHIsICJcXFxcLiIpLCAjJ3VuZXNjYXBlKSwgIiIpOworICBpZigoc3RyWzBdID49ICcwJyAmJiBzdHJbMF0gPD0gJzknKSB8fCAgICAgICAgICAgICAgICAvLyBOVU1CRVJTCisgICAgKChzdHJbMF0gPT0gJysnIHx8IHN0clswXSA9PSAnLScpICYmCisgICAgIChzdHJbMV0gPj0gJzAnICYmIHN0clsxXSA8PSAnOScpKSkKKyAgICBpZihtZW1iZXIoc3RyLCAnLicpICE9IC0xKSAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRkxPQVRTCisgICAgICByZXR1cm4gdG9fZmxvYXQoc3RyKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gdG9faW50KHN0cik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElOVEVHRVJTCisKKyAgaWYoc3RyID09ICIoIiB8fCBzdHIgPT0gIikiIHx8IHN0ciA9PSAiJyIpIAorICAgIHJldHVybiBzdHI7CisKKyAgcmV0dXJuIHF1b3RlKHN0cik7ICAgICAgICAgICAgCQkJLy8gU1lNQk9MUworfQorCitub21hc2sgcHJpdmF0ZSB2b2lkIGdldF90b2tlbnMoKQoreworICBtaXhlZCBpbnB1dCwgdG1wOworCisgIGRvIHsKKyAgICBpZighaW5wdXQgPSBnZXRfbGluZSgpKSByZXR1cm4gMDsKKyAgICAvLyBzcGxpdHRpbmcgdGhlIGlucHV0IGxpbmUgaW4gc3RyaW5nIHRva2VucyBhbmQgcmVtb3ZpbmcgY29tbWVudHMKKyAgICB0bXAgPSByZWdleHAocmVnZXhwbG9kZShpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKFwiKFxcXFwufFteXFxcXFwiXSkqXCIpfFs7XS4qfFsoKSBcdCddIiksCisgICAgICAgICAgICAgICAgICAgICJeW147XSIpCisgICAgICAgICAgIC0gKHsiIiwiICIsIlx0In0pOworICAgIHRva2VucyArPSBtYXAodG1wLCAjJ21ha2Vfc3ltYm9sKTsKKyAgfQorICB3aGlsZSghc2l6ZW9mKHRva2VucykpOworfQorCitub21hc2sgc3RhdGljIGludCBsZXgobWl4ZWQgdG9rZW4pCit7CisgIGlmKCFzaXplb2YodG9rZW5zKSkgZ2V0X3Rva2VucygpOworICBpZihzaXplb2YodG9rZW5zKSkKKyAgeworICAgIHRva2VuID0gdG9rZW5zWzBdOworICAgIHRva2Vuc1swLi4wXSA9ICh7fSk7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vYmovdG9vbHMvbGlzcC9saXNwLmMgYi9vYmovdG9vbHMvbGlzcC9saXNwLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODlhMDA4OAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9saXNwL2xpc3AuYwpAQCAtMCwwICsxLDQ2IEBACisvLyBMSVNQLkMgLS0gTGlzcDJDbG9zdXJlIGNvbXBpbGVyCisvLyAoYykgMTk5NCBieSBIYXRlQE1vcmdlbkdyYXVlbiwgVFVCbXVkLCBOaWdodEZhbGwKKy8vIC0tCisvLyBDb3B5LCBjaGFuZ2UgYW5kIGRpc3RyaWJ1dGUgdGhpcyBiaXQgb2Ygc29mdHdhcmUgYXMgbXVjaCBhcyB5b3UgbGlrZSwKKy8vIGJ1dCBrZWVwIHRoZSBuYW1lIG9mIHRoZSBvcmlnaW5hbCBhdXRob3IgaW4gdGhlIGhlYWRlci4KKworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKyAKKyNpbmNsdWRlICJ0d2Vhay5oIgorCitwcml2YXRlIGluaGVyaXQgSE9NRSgicGFyc2VyIik7CisKK3N0YXRpYyB2YXJhcmdzIG1peGVkIGxpc3Aoc3RyaW5nIGlucHV0LCBpbnQgaW50ZXJhY3RpdmUsIGludCBpbikKK3sKKyAgc3RyaW5nIG1zZywgZXJyb3I7CisgIGFkZF9pbnB1dChpbnB1dCk7CQkJCQkvLyBwdXQgbGluZXMgb24gc3RhY2sKKyAgc3dpdGNoKHBhcnNlKCZtc2csIGludGVyYWN0aXZlKSkKKyAgeyAKKyAgY2FzZSAgMDogcmV0dXJuIG1zZzsJCQkJCS8vIG9rCisgIGNhc2UgLTE6IGNsZWFyX2lucHV0KCk7IHJldHVybiAwOwkJCS8vIGVtcHR5IGxpc3QKKyAgY2FzZSAtMjogaW5pdGlhbGl6ZSgpOwkJCQkvLyBleGVjIGVycm9yCisgICAgICAgICAgIGNsZWFyX2lucHV0KCk7CisgICAgICAgICAgIHJldHVybiAoaW4gPyAocHJpbnRmKG1zZyksIDApOiAoaW50ZXJhY3RpdmUgPyBtc2cgOiAtMSkpOworICBjYXNlIC0zOiBpZihpbnRlcmFjdGl2ZSkgCQkJCS8vIG1pc3NpbmcgKQorICAgICAgICAgICB7CisgICAgICAgICAgICAgcHJpbnRmKCIlcz8gIiwgbXNnKTsKKyAgICAgICAgICAgICBpbnB1dF90bygibGlzcCIsIDAsIDEsIDEpOworICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBlbHNlIHJldHVybiAoaW4gPyAocHJpbnRmKG1zZyksIDApOiAoaW50ZXJhY3RpdmUgPyBtc2cgOiAtMSkpOworICBkZWZhdWx0OiBpZighbXNnKSBtc2cgPSIqVW5rbm93biBlcnJvciBvY2N1cmVkXG4iOwkvLyB1bmtub3duIGVycm9yCisgICAgICAgICAgIGNsZWFyX2lucHV0KCk7CisgICAgICAgICAgIHJldHVybiAoaW4gPyAocHJpbnRmKG1zZyksIDApOiAKKwkgICAgICAgICAgICAgICAgKGludGVyYWN0aXZlID8gbXNnIDogLTEpKTsKKyAgfQorICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY3JlYXRlKCkKK3sKKyAgcGFyc2VyOjpjcmVhdGUoKTsKKyAgbGlzcChyZWFkX2ZpbGUoX19GSUxFX19bMC4uPDNdKyIubCIpKTsKK30KKworc3RhdGljIHZvaWQgaW5pdChpbnQgYXJnKSB7IH0KKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL2xpc3AvbGlzcC5oZWxwIGIvb2JqL3Rvb2xzL2xpc3AvbGlzcC5oZWxwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZDFmM2UKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvbGlzcC9saXNwLmhlbHAKQEAgLTAsMCArMSw4MSBAQAorTkFNRToKKwkJKioqIEtORVRFICoqKgorCitCRVNDSFJFSUJVTkc6CisJRGllIEtuZXRlIGlzdCBlaW4gaW4gTFBDIGdlc2NocmllYmVuZXIgTGlzcC1JbnRlcnByZXRlci4gRGllc2VyIGhhdAorCWRpZSBiZXNvbmRlcmUgRWlnZW5zY2hhZnQsIGRpZSBMaXNwLVF1ZWxsZW4gZGlyZWt0IGluIGRlbiB2b20gCisJQW15bGFhciBHYW1lRHJpdmVyIGFuZ2Vib3RlbmVuIGNsb3N1cmVzIHp1IHVlYmVyc2V0emVuLiBEYWR1cmNoIGlzdAorCW1pdCBkZXIgS25ldGUgYWxsZXMgZGFzIG1vZWdsaWNoLCB3YXMgYXVjaCBtaXQgTFBDIG1vZWdsaWNoIGlzdC4KKwlFcyBpc3QgZWluIGdlbmVyaXNjaGVzLCBmcmVpIHByb2dyYW1taWVyYmFyZXMgSGlsZnNtaXR0ZWwuCisKKwlEaWUgS25ldGUgYmVmaW5kZXQgc2ljaCB1bnRlcjogIi9vYmovdG9vbHMvbGlzcCIKKworRlVOS1RJT05TQkVTQ0hSRUlCVU5HOgorCURpZSBLbmV0ZSBrYW5uIGltIFByaW56aXAgZmFzdCBhbGxlcywgd2FzIGVpbiBlaW5mYWNoZXIgTGlzcC0KKwlJbnRlcnByZXRlciBrYW5uLiBBdXNuYWhtZW4gc2luZCBUdXBlbCAoQnNwOiAoMSAuIDIpKSwgd2VsY2hlIG5pY2h0CisJaW1wbGVtZW50aWVydCBzaW5kLiBEaWUgR3J1bmRsZWdlbmRlbiBGdW5rdGlvbmVuLCB3aWUgZGVmaW5lLCBzZXRxLAorCWNvbnMsIGNkciwgY2FyIGV0YyB3ZXJkZW4gYmVpbSBMYWRlbiBkZXIgS25ldGUgYW5nZXplaWd0LiBKZSBuYWNoCisJWmVpdCwgd2VyZGVuIGV2ZW50dWVsbGUgYXVjaCB3ZWl0ZXJlIFN0YW5kYXJkZnVua3Rpb25lbiBoaW56dS0KKwlrb21tZW4sIHVtIGRpZSBLbmV0ZSBtb2VnbGljaHN0IGNvbW1vbi1saXNwIGtvbXBhdGliZWwgenUgbWFjaGVuLgorCitCRU5VVFpVTkc6CisJWnUgYWxsZXJlcnN0IHNvbGx0ZSBtYW4gd2lzc2VuLCBkYXNzIGRpZXMgaGllciBrZWluZSBFaW5mdWVocnVuZyBpbgorCUxpc3AgaXN0IG9kZXIgc2VpbiBzb2xsISBEaWUgd2ljaHRpZ3N0ZW4gTWVya21hbCBkZXIgS25ldGUgd2VyZGVuCisJYXVmZ2VmdWVocnQgYW4gZWluaWdlbiBrbGVpbmVuIEJlaXNwaWVsZW4uIFdlciBMaXNwIGtlbm5lbmxlcm5lbgorCW1vZWNodGUga2FubiBkaWVzIG1pdCBkZW4gaGFuZGVsc3VlYmxpY2hlbiBCdWVjaGVybiB0dW4uCisKKwlXZXIgZGVubm9jaCBiYXN0ZWxuIG1vZWNodGU6IExpc3AgaXN0IGVpbmUgU3ByYWNoZSBpbiBQcmVmaXhub3RhdGlvbiwKKwlkLmguIGRlciBGdW5rdGlvbnNuYW1lIHN0ZWh0IGltbWVyIGFscyBlcnN0ZXMgdW5kIGRhbm4ga29tbWVuIGRpZQorCUFyZ3VtZW50ZS4gRWluIEF1c2RydWNrIGlzdCBtaXQgZGVuIGlobiB1bWdlYmVuZGVuIEtsYW1tZXJuIGtvbXBsZXR0LgorCSAgQmVpc3BpZWw6ICgrIDEgMSkgOzs7IGVycmVjaG5ldCBkaWUgU3VtbWUgYXVzIDEgdW5kIDEKKwlTb2xjaGUgS2xhbW1lcmF1c2RydWVja2Uga29lbm5lbiBiZWxpZWJpZyBnZXNjaGFjaHRlbHQgd2VyZGVuLgorCSAgQmVpc3BpZWw6ICgrIDEgKCsgKCsgMSAxKSAxKSkKKworCUVzIHN0ZWhlbiBhbGxlIGVmdW5zLCBzb3dpZSBlaW5pZ2UgbGZ1bnMgenVyIFZlcmZ1ZWd1bmchIFp1IGRlbiBlZnVucworCWdlaG9lcmVuIGF1Y2ggKywtLCosLywlLCEsWyxbPCxbPC4uIGV0YywgYWxzbyBhbGxlIE9wZXJhdG9yZW4gdm9uIExQQy4KKworCURpZSBLbmV0ZSBoYXQgendlaSBNb2RpOgorCQlhKSBMYWRlbiB2b24gTGlzcCBhdXMgZWluZXIgRGF0ZWkKKwkJYikgVmVyYXJiZWl0ZW4gdm9uIEVpbmdhYmVuIGF1cyBkZXIgS29tbWFuZG96ZWlsZQorCisJWnUgYSkKKwkgIE1pdCBkZXIgRnVua3Rpb24gImxvYWQiIGtvZW5uZW4gRGF0ZWllbiBlaW5nZWxlc2VuIHVuZCBpbnRlcnByZXRpZXJ0CisJICB3ZXJkZW4uIERpZSBGdW5rdGlvbiBoYXQgbnVyIGVpbiBBcmd1bWVudCwgdW5kIGRhcyBpc3QgZGVyIERhdGVpbmFtZS4KKworCSAgQmVpc3BpZWw6IChsb2FkICIvcGxheWVycy9oYXRlL2xpc3AubCIpCisJCisJWnUgYikKKwkgIFdlbm4gZGllIEtuZXRlIGdlY2xvbmVkIHd1cmRlLCBrb2VubmVuIGplZGVyemVpdCBMaXNwYXVzZHJ1ZWNrZQorCSAgZWluZ2VnZWJlbiB3ZXJkZW4sIHdlbGNoZSBkYW5uIGludGVycHJldGllcnQgd2VyZGVuLiBEYWJlaSBzb2xsdGUKKwkgIGJlYWNodGV0IHdlcmRlbiwgZGFzcyBkaWUgYWV1c3NlcnN0ZSBLbGFtbWVyIG5pY2h0IG5vdHdlbmRpZyBpc3QhCisKKwkgIEJlaXNwaWVsOiAoKyAxICgrIDEgMSkpIGtvZW5udGUgbWFuIGF1Y2ggc2NocmVpYmVuIGFsczoKKwkgICAgICAgICAgICArIDEgKCsgMSAxKQorCisJICBEaWVzIGlzdCB2b3IgYWxsZW0gZGFubiBpbnRlcmVzc2FudCwgd2VubiBtYW4gZGllIE1vZWdsaWNoa2VpdGVuCisJICBkZXIgS25ldGUgYWxzIGFsaWFzLVdlcmt6ZXVnIGluIGJldHJhY2h0IHppZWh0LiBTb21pdCBpc3QgZXMKKwkgIG1vZWdsaWNoLCBlaW5lIEZ1bmt0aW9uIHp1IHNjaHJlaWJlbiB1bmQgZGllc2UgZGFubiB3aWUgZWluIGFsaWFzCisJICB6dSBiZW51dHplbi4KKworCSAgQmVpc3BpZWw6IChkZWZ1biB3aG8gKCkgKHVzZXJzKSkgOzs7IGdpYnQgZGFzIHVzZXJzIGFycmF5IGF1cworCSAgICAgICAgICAgICBKZXR6dCBtdXNzIG51ciBub2NoIHdobyBlaW5nZWdlYmVuIHdlcmRlbiB1bmQgZGFzCisJCSAgICAgYXJyYXkgd2lyZCBhdXNnZWdlYmVuLgorCisJICBEYSBMaXNwIHdlc2VudGxpY2gga29tcGxleGVyZSBBdXNkcnVlY2tlIGVybW9lZ2xpY2h0LCBhbHMgZGVyCisJICBub3JtYWxlIGFsaWFzLUludGVycHJldGVyLCBsaWVnZW4gZGllIFZvcnRlaWxlIGF1ZiBkZXIgSGFuZC4KKworS09ORklHVVJBVElPTjoKKwlEaWUgS25ldGUgbGFlc3N0IHNpY2ggZnVlciBqZWRlbiBOdXR6ZXIga29uZmlndXJpZXJlbiwgaW5kZW0gc2llIGVpbmUKKwlEYXRlaSAiL3BsYXllcnMvPG5hbWU+L2xpc3AubCIgYXVzIGRlc3NlbiBIZWltYXR2ZXJ6ZWljaG5pcyBsYWVkdC4KKworCUVpbiBCZWlzcGllbCwgd2FzIG1hbiBkYW1pdCBtYWNoZW4ga2FubiBiZWZpbmRldCBzaWNoIHVudGVyOgorCSAgIi9wbGF5ZXJzL2hhdGUvbGlzcC5sIgorCURpZSBNVUQgU3BlemlmaXNjaGVuIFRlaWxlIHVuZCBBYmZyYWdlbiBrb2VubmVuIGlnbm9lcmllcnQgd2VyZGVuLgorCitCVUdTOgorCUVzIGdpYnQgbW9tZW50YW4gbm9jaCBlaW4gUHJvYmxlbSwgd2VubiBhdWYgZGVyIEtvbW1hbmRvemVpbGUKKwlLbGFtbWVybiBmZWhsZW4uIERhbm4ga29tbXQgZWluZSBNZWxkdW5nOiAiKk1pc3NpbmcgMiApIgorCUluIGRpZXNlbSBGYWxsIGVpbmZhY2ggendlaW1hbCBoaW50ZXJlaW5hbmRlciApIGF1ZiBqZXdlaWxzIGVpbmVyCisJZWluemVsbmVuIFplaWxlIGVpbmdlYmVuISBEaWVzZXMgUHJvYmxlbSB0cml0dCB2b3IgYWxsZW0gZGFubiBhdWYsCisJd2VubiBtYW4genVtIEJlaXNwaWVsIGVpbiA6KCBlaW5naWJ0LgorCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvbGlzcC9saXNwLmwgYi9vYmovdG9vbHMvbGlzcC9saXNwLmwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNkMzg2ZgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9saXNwL2xpc3AubApAQCAtMCwwICsxLDk5IEBACisod3JpdGUgIkxQQyBjbG9zdXJlIHBhcnNlciByZWFkeS4uLlxuIikKKyh3cml0ZSAiTExpc3AgVmVyc2lvbiAwLjYgWyIpCis7OzsKKzs7OyBhdXRvbWFnaWMgcXVvdGluZyBvZiBoYXJkY29kZWQgZnVuY3Rpb25zOgorOzs7IGVhY2ggZnVuY3Rpb24gaGFzIDIgZW50cmllcyBpbiAnbWVtb3J5JworOzs7IDAgLS0gdGhlIGZ1bmN0aW9uIG5hbWUgb3IgZXF1aXZhbGVudAorOzs7IDEgLS0gYml0cyByZWdhcmRpbmcgYXV0b3F1b3RpbmcKKzs7OyAgICAgIGVhY2ggYXJndW1lbnQgZm9yIHRoZSBmdW5jdGlvbiBoYXMgdHdvIGJpdHMgCis7OzsgICAgICAwIC0tIG5vcm1hbCBxdW90aW5nCis7OzsgICAgICAxIC0tIHByb2dyYW0gY29kZSBxdW90aW5nIChsYW1kYSByZXF1aXJlcyBpdCkKKzs7OyAgICAgIG9ubHkgYml0IDAgb3IgYml0IDEgbXVzdCBiZSBzZXQsIG5ldmVyIGJvdGggKG5vIHF1b3RpbmcgYXQgYWxsKQorOzs7IGxhbWJkYSBuZWVkcyBub3JtYWwgcXVvdGUgZm9yIHRoZSBmaXJzdCBhcmd1bWVudCBhbmQgc3BlY2lhbCBxdW90ZSBmb3IgMm5kCis7OzsgMSAwIDAgMQorOzs7IHwxfCB8MnwgLT4gOSAoaWYgaSBoYXZlIGNhbGN1bGF0ZWQgaXQgcmlnaHQpCis7OzsKKzs7OyB0aGUgZnVuY3Rpb24gbGFtYmRhIGhhcyBhdXRvcXVvdGUsIEAgaXMgYSBub24tYXV0b3F1b3RlIHZlcnNpb24KKyg9IChbIChtZW1vcnkpICdAKSBsYW1iZGEpCisoPSAoWyAobWVtb3J5KSBsYW1iZGEgMSkgOSkgCis7OzsKKzs7OyBleHBsaWNpdCBxdW90ZSBvZiBhIHN5bWJvbCB3aXRoIHF1b3RlCisoPSAoWyAobWVtb3J5KSBxdW90ZSAxKSAxKSAKKzs7OworOzs7IG9uZSBvZiB0aGUgbW9zdCBpbXBvcnRhbnQgZnVuY3Rpb25zIG5lZWRlZCAobWljcm9jb2RlZCk6Cis7Ozsgbm93IHdlIGRlZmluZSBhIHNldAorKD0gKFsgKG1lbW9yeSkgJ3NldCkgKGxhbWJkYSAobiB2KSAoLCAoPSAoWyAobWVtb3J5KSBuKSB2KSBuKSkpIAorOzs7IGFuZCBhIGF1dG9xdW90ZSB2ZXJzaW9uIG9mIHNldCAoc2V0cSkKKyhzZXQgJ3NldHEgc2V0KSAoPSAoWyAobWVtb3J5KSAnc2V0cSAxKSAxKQorOzs7Cis7Ozsgc29tZSBwZW9wbGUgcHJlZmVyIGRlZmluZSwgaXQgcXVvdG9tYXRpY2FsbHkgcXVvdGVzIGl0cyBmaXJzdCBhcmd1bWVudAorKHNldHEgZGVmaW5lIChsYW1iZGEgKG4gdiBmKSAoLCAoPSAoWyAobWVtb3J5KSBuIDEpIGYpIChzZXQgbiB2KSBuKSkpCisoPSAoWyAobWVtb3J5KSAnZGVmaW5lIDEpIDEpCis7OzsKKzs7OyBkZWZ1biBmb3IgZWFzaWVyIGRlZmluaXRpb24gb2YgZnVuY3Rpb25zCisoZGVmaW5lIGRlZnVuIChsYW1iZGEgKG4gYSBiIGYpICgsICg9IChbIChtZW1vcnkpIG4gMSkgZikgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzZXQgbiAoQCBhIGIpKSBuKSkgMzcpCis7OzsKKzs7OyBpZiB3ZSBsaWtlIHRvIGRlc3Ryb3kgYSB2YWx1ZSB1c2UgdW5kZWYKKyhkZWZ1biB1bmRlZiAoZnVuKSAoLCAoPSBtZW1vcnkgKG1fZGVsZXRlIChtZW1vcnkpIGZ1bikpIGZ1bikgMSkKKzs7OworOzs7IGFuIGVycm9yIGZ1bmN0aW9uIChpbnRlcm5hbCB1c2UpLCBub3RpZnkgZGVjbGFyZXMgdGhlIGZ1bmN0aW9uIHRvIHVzZQorOzs7IHdoZW4gYW4gZXJyb3IgbWVzc2FnZSBoYXMgdG8gYmUgcHJpbnRlZAorKHNldHEgZXJyb3IgcmFpc2VfZXJyb3IpCis7OzsKKzs7OyBvdGhlciBpbXBvcnRhbnQgZnVuY3Rpb25zIGFuZCBmdW5jdGlvbiBhbGlhc2VzCis7Ozsgc3RhbmRhcmQgbGlzcCBmdW5jdGlvbmFsaXR5IChjYXIsIGNkciwgY29ucykKKyhkZWZ1biBjYXIgKGwpICg/IChwb2ludGVycCBsKSAKKwkJICAoPyAoc2l6ZW9mIGwpIChbIGwgMCkgCisJCSAgICAgKGVycm9yICJjYXI6IGVtcHR5IGxpc3RcbiIpKSAKKwkJICAoZXJyb3IgImNhcjogbm90IGEgbGlzdFxuIikpKQorKGRlZnVuIGNkciAobCkgKD8gKHBvaW50ZXJwIGwpIChbLi4gbCAxKSAKKwkJICAoZXJyb3IgImNkcjogbm90IGEgbGlzdFxuIikpKQorKGRlZnVuIGNvbnMgKF9jYXIgX2NkcikgKCsgKGxpc3QgX2NhcikgX2NkcikpCis7OzsKKzs7OyBzb21lIHNwZWNpYWwgZnVuY3Rpb25hbGl0eQorKGRlZnVuIGFkZGhpc3RvcnkgKGZpbGUpICh3cml0ZV9maWxlIGZpbGUgKGltcGxvZGUgKGhpc3RvcnkpICJcbiIpKSkKKyhkZWZ1biBzYXZlaGlzdG9yeSAoZmlsZSkgKCwgKHJtIGZpbGUpIChhZGRoaXN0b3J5IGZpbGUpKSkKKyhkZWZ1biBzaG93aGlzdG9yeSAoKSAoLCAocHJpbnRmICIlc1xuIiAoaW1wbG9kZSAoaGlzdG9yeSkgIlxuIikpCisJCQkgIi0tIEVORCBPRiBISVNUT1JZIC0tIikpCis7OzsKKyhkZWZ1biBzaG93ZnVuYyAoKSAobV9pbmRpY2VzIChtZW1vcnkpKSkKKzs7OworOzs7IFRyeSB0byBhdXRvZGV0ZWN0IG11ZHR5cGUKKzs7OworKHNldCAnbXVkdHlwZSAiIikKKyhkZWZ1biBhZGQgKHZhciB2YWwpICgrPSAoWyAobWVtb3J5KSB2YXIpIHZhbCkpCisoYWRkICdtdWR0eXBlICg/IChzeW1ib2xfZnVuY3Rpb24gImdldHVpZCIpICJOQVRJVkUiICJDT01QQVQiKSkKKyhhZGQgJ211ZHR5cGUgKD8gKGZ1bmN0aW9uX2V4aXN0cyAiU2V0UHJvcCIpCisgICAgICAgICAgICAgICAgICAgKD8gKD09IChmdW5jdGlvbl9leGlzdHMgIlNldCIpICIvc3RkL3RoaW5nL3Byb3BlcnRpZXMiKSAifE1HIgorICAgICAgICAgICAgICAgICAgICAifE5GIikKKyAgICAgICAgICAgICAgICAgKCYmICg9PSAoZmlsZV9zaXplICIvYmFzaWMiKSAtMikgCisJCSAgICAgKD09IChmaWxlX3NpemUgIi9jb21wbGV4IikgLTIpKQorICAgICAgICAgICAgICAgICAgICg/ICg9PSAoZmlsZV9zaXplICIva2VybmVsIikgLTIpICJ8VFVCTkVXIiAifFRVQiIpCisgICAgICAgICAgICAgICAgICg9PSAoZnVuY3Rpb25fZXhpc3RzICJxdWVyeV9hbGxfdl9pdGVtcyIpICIvaS9pdGVtL3ZpcnR1YWwiKQorICAgICAgICAgICAgICAgICAgICg/IChmdW5jdGlvbl9leGlzdHMgInF1ZXJ5X2JvZHlsb2NhdGlvbl9waWMiCisJCSAgICAgICAgICAgICAgICAgICAgICAgKCwgKGNhbGxfb3RoZXIgIi9vYmovcGxheWVyIiAiPyIpCisJCQkJICAgICAgICAgIChmaW5kX29iamVjdCAiL29iai9wbGF5ZXIiKSkpCisJCQkJICAgICAgICJ8VU5JL0FWQUxPTiIgInxVTkkiKQorCSAgICAgICAgKD8gKGZ1bmN0aW9uX2V4aXN0cyAiUkNTSWQiIChmaW5kX29iamVjdCAiL29iai9zaW11bF9lZnVuIikpKQorCQkgInxUQVBQIgorICAgICAgICAgICAgICAgICAifFVOS05PV04vMi40LjUiCisgICAgICAgICAgICAgICApKQorKHNldHEgbXVkdHlwZSAoZXhwbG9kZSBtdWR0eXBlICJ8IikpCisoZGVmdW4gbXVkPyAoc3RyKSAoc2l6ZW9mIChyZWdleHAgKFsgKG1lbW9yeSkgJ211ZHR5cGUpIHN0cikpKQorKHByaW50ZiAiJXMsJXMiIChbIChbIChtZW1vcnkpICdtdWR0eXBlKSAwKSAoWyAoWyAobWVtb3J5KSAnbXVkdHlwZSkgMSkpCisod3JpdGUgIl1cbiIpCis7OzsgCis7OzsgbG9hZCBsb2NhbCB1c2VyIGluaXQKKzs7OworKD8gKG11ZD8gIk5GfE1HIikKKyAgIChzZXRxIG93bmVyIChnZXR1aWQgKHRoaXNfcGxheWVyKSkpCisgICAoc2V0cSBvd25lciAoY2FsbF9vdGhlciAodGhpc19wbGF5ZXIpICJxdWVyeV9yZWFsX25hbWUiKSkpCisoPyAobXVkPyAiTUd8TkZ8VFVCIikKKyAgIChkZWZpbmUgbG9jYWxpbml0ICgrICgrICIvcGxheWVycy8iIG93bmVyKSAiL2xpc3AubCIpKQorICAgKGRlZmluZSBsb2NhbGluaXQgKCsgKCsgIi93LyIgb3duZXIpICIvbGlzcC5sIikpKQorKD8gKD4gKGZpbGVfc2l6ZSBsb2NhbGluaXQpIDApCisgICAoPyAobXVkPyAiVFVCfFVOSXxVTktOT1dOIikgCisgICAgICAoY2FsbF9vdXQgbG9hZCAwIGxvY2FsaW5pdCkKKyAgICAgIChsb2FkIGxvY2FsaW5pdCkpKQorKHByaW50ZiAiV2VsY29tZSAlcywgdG9kYXkgaXMgJXMhXG4iIChjYXBpdGFsaXplIG93bmVyKSAoY3RpbWUgKHRpbWUpKSkKZGlmZiAtLWdpdCBhL29iai90b29scy9saXNwL21pY3JvY29kZS5jIGIvb2JqL3Rvb2xzL2xpc3AvbWljcm9jb2RlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZhZGQ0NgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9saXNwL21pY3JvY29kZS5jCkBAIC0wLDAgKzEsMTI5IEBACisvLyBNSUNST0NPREUuQyAtLSBsaXNwIG1pY3JvY29kZQorLy8gKGMpIDE5OTQgYnkgSGF0ZUBNb3JnZW5HcmF1ZW4sIFRVQm11ZCwgTmlnaHRGYWxsCisvLyAtLQorLy8gQ29weSwgY2hhbmdlIGFuZCBkaXN0cmlidXRlIHRoaXMgYml0IG9mIHNvZnR3YXJlIGFzIG11Y2ggYXMgeW91IGxpa2UsCisvLyBidXQga2VlcCB0aGUgbmFtZSBvZiB0aGUgb3JpZ2luYWwgYXV0aG9yIGluIHRoZSBoZWFkZXIuCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisgCisjaW5jbHVkZSAidHdlYWsuaCIKKyNpbmNsdWRlICJ0eXBlcy5oIgorCitwcml2YXRlIG5vc2F2ZSBtYXBwaW5nIG1lbW9yeTsJLy8gY29udGFpbnMgZnVuY3Rpb24gaW5mb3JtYXRpb24KK3ByaXZhdGUgbm9zYXZlIHN0cmluZyAqR19pbnB1dDsJLy8gZ2xvYmFsIGlucHV0IHN0YWNrCitwcml2YXRlIG5vc2F2ZSBzdHJpbmcgKmhpc3Rvcnk7CS8vIGlucHV0IGhpc3RvcnkKKworbm9tYXNrIHN0YXRpYyBwdWJsaWMgc3RyaW5nIG91dHB1dChtaXhlZCByZXMpOworCisjZGVmaW5lIENPREUJMAorI2RlZmluZSBRVU9URQkxCisKK3N0YXRpYyB2b2lkIGNyZWF0ZSgpCit7CisgIG1lbW9yeSA9IG1fYWxsb2NhdGUoMCwgMik7CisgIEdfaW5wdXQgPSAoe30pOworfQorCitub21hc2sgc3RhdGljIGNsb3N1cmUgZ2V0X2Z1bmN0aW9uKHN0cmluZyBzdHIpCit7CisgIGNsb3N1cmUgc3ltOworICBpZigoc3ltID0gc3ltYm9sX2Z1bmN0aW9uKHN0ciwgdGhpc19vYmplY3QoKSkpIHx8ICAgICAvLyBGVU5DVElPTlMKKyAgICAgKHN5bSA9IHN5bWJvbF9mdW5jdGlvbihzdHIpKSB8fAorICAgICAoc3ltID0gc3ltYm9sX3ZhcmlhYmxlKHN0cikpKQorICAgIHJldHVybiBzeW07CisjaWYgZGVmaW5lZChzeW1ib2xfdmFyaWFibGUpCisgIGlmKHN0ciA9PSAibWVtb3J5IikgcmV0dXJuICMnbWVtb3J5OworI2VuZGlmCisgIHJldHVybiAwOworfQorCisvLyBwcmVfcGFyc2UoKSAtLSBwYXJzZSBjb2RlIGJlZm9yZSBleGFtaW5hdGlvbiBieSBhIGNvZGUgZ2VuZXJhdG9yCitub21hc2sgc3RhdGljIHB1YmxpYyBpbnQgcHJlX3BhcnNlKG1peGVkIGNvZGUpCit7CisgIGlmKHBvaW50ZXJwKGNvZGUpICYmIHNpemVvZihjb2RlKSAmJgorICAgICAoY2xvc3VyZXAoY29kZVswXSkgfHwgc3ltYm9scChjb2RlWzBdKSkpCisgIHsKKyAgICBtaXhlZCBpZHgsIHRtcDsKKyAgICBpZihzaXplb2YodG1wID0gb2xkX2V4cGxvZGUoc3ByaW50ZigiJU8iLCBjb2RlWzBdKSwgIi0+IikpID4gMSkKKyAgICAgIGlkeCA9IHRtcFsxXTsKKyAgICBlbHNlIGlkeCA9IGNvZGVbMF07CisgICAgLy8gd2FybmluZyBvbmx5IHRoZSBzZXR0aW5nIG9mIGJpdCAwIG9yIDEgaXMgYWxsb3dlZCwgbm90IDAgYW5kIDEKKyAgICAvLyB0aHVzIDAxIGxlYWRzIHRvIG5vcm1hbCBxdW90ZSwgMTAgZm9yIHNwZWNpYWwsIDExIG5vdCBxdW90ZSBhdCBhbGwKKyAgICByZXR1cm4gKG1lbW9yeVtpZHgsIFFVT1RFXSAmICgzPDwyKihzaXplb2YoY29kZSktMSkpKT4+Miooc2l6ZW9mKGNvZGUpLTEpOworICB9Cit9CisKKy8vIHByb2dfcGFyc2UoKSAtLSBleGFtaW5lIGEgdG9rZW4gYW5kIHRha2UgYWN0aW9ucworLy8KK25vbWFzayB2YXJhcmdzIHN0YXRpYyBwdWJsaWMgbWl4ZWQgcHJvZ19wYXJzZShtaXhlZCB0b2tlbiwgaW50IGZ1bmMpCit7CisgIGlmKHN5bWJvbHAodG9rZW4pKQorICAgICAgaWYoIW1lbWJlcihtZW1vcnksIHRva2VuKSkKKyAgICAgICAgdG9rZW4gPSAoeyMnPywgKHsjJ21lbWJlciwgKHsjJ21lbW9yeX0pLCBxdW90ZSh0b2tlbil9KSwKKyAgICAgICAgICAgICAgICAgICAgICh7IydbLCAoeyMnbWVtb3J5fSksIHF1b3RlKHRva2VuKX0pLAorICAgICAgICAgICAgICAgICAgICAgKHsjJ3JhaXNlX2Vycm9yLAorCQkgICAgICAgc3ByaW50ZigiU3ltYm9sICVPJyBub3QgYm91bmRcbiIsIHRva2VuKSB9KSB9KTsKKyAgICAgIGVsc2UgdG9rZW4gPSBmdW5jID8gdG9rZW4gOiBtZW1vcnlbdG9rZW5dOworICByZXR1cm4gdG9rZW47Cit9CisKKy8vIGV2YWx1YXRlIGNvbXBpbGVkIGNvZGUKK25vbWFzayBzdGF0aWMgcHVibGljIG1peGVkIGV2YWwobWl4ZWQgY29kZSkKK3sKKyAgbWFwcGluZyBzeW07CisgIHN5bSA9IGZpbHRlcl9pbmRpY2VzKG1lbW9yeSwgIydzeW1ib2xwKTsKKyAgcmV0dXJuIGFwcGx5KGxhbWJkYShtX2luZGljZXMoc3ltKSwgY29kZSksIG1fdmFsdWVzKHN5bSkpOworfQorCisvLyBhZGQgbmV3IGxpbmVzIHRvIGlucHV0IHN0YWNrCitub21hc2sgc3RhdGljIHB1YmxpYyB2b2lkIGFkZF9pbnB1dChzdHJpbmcgaW5wdXQpIAoreyAKKyAgaWYoIXN0cmluZ3AoaW5wdXQpKSByZXR1cm47CisgIEdfaW5wdXQgKz0gb2xkX2V4cGxvZGUoaW5wdXQsICJcbiIpOyAKK30KKworLy8gY2xlYXIgdGhlIGlucHV0IHN0YWNrCitub21hc2sgc3RhdGljIHB1YmxpYyB2b2lkIGNsZWFyX2lucHV0KCkKK3sKKyAgR19pbnB1dCA9ICh7fSk7Cit9CisKKy8vIGdldCBhIGxpbmUgZnJvbSBpbnB1dCBzdGFjaworLy8gYW5kIHNhdmUgaXQgaW50byB0aGUgaGlzdG9yeQorbm9tYXNrIHZhcmFyZ3Mgc3RyaW5nIGdldF9saW5lKCkKK3sKKyAgaWYoc2l6ZW9mKEdfaW5wdXQpKQorICB7CisgICAgaWYoIXBvaW50ZXJwKGhpc3RvcnkpKSBoaXN0b3J5ID0gKHt9KTsKKyAgICBoaXN0b3J5ICs9ICh7IEdfaW5wdXRbMF0gfSk7CisgICAgR19pbnB1dFswLi4wXSA9ICh7fSk7CisgICAgcmV0dXJuIGhpc3RvcnlbPDFdOworICB9CisgIHJldHVybiAwOyAgCit9CisKKy8vIHRyYW5zZm9ybSgpIC0tIHRyYW5zZm9ybXMgc29tZSBvZiB0aGUgb3V0cHV0IHN0cmluZ3MKK25vbWFzayBwcml2YXRlIHN0cmluZyB0cmFuc2Zvcm0oc3RyaW5nIGUpCit7CisgIHN3aXRjaChlKQorICB7CisgIGNhc2UgIih7IjogcmV0dXJuICIoIjsKKyAgY2FzZSAifSkiOiByZXR1cm4gIikiOworICBjYXNlICIoWyI6IHJldHVybiAiWyI7CisgIGNhc2UgIl0pIjogcmV0dXJuICJdIjsKKyAgfQorICBpZihzdHJzdHIoZSwgIiAvKiBzaXplb2YoKSA9PSAiKSAhPSAtMSkgcmV0dXJuICIiOworICBpZihzdHJzdHIoZSwgIlxuIikgIT0gLTEpIGlmKGVbMF0gPT0gJywnKSByZXR1cm4gIiAiOyBlbHNlIHJldHVybiAiIjsKKyAgcmV0dXJuIGU7Cit9CisKKy8vIG91dHB1dCgpIC0tIHByaW50cyBnaXZlbiBkYXRhIGluIGEgY2xlYW4gd2F5Citub21hc2sgc3RhdGljIHB1YmxpYyBzdHJpbmcgb3V0cHV0KG1peGVkIHJlcykKK3sKKyAgcmVzID0gcmVnZXhwbG9kZShzcHJpbnRmKCIlTyIsIHJlcyksCisgICAgICAgICAgICAgICAgICAgIlxuWyBdKnxbLF1cblsgXSp8WyhdW3tcW118W1xdfV1bKV18WyNdWyddfCIKKyAgICAgICAgICAgICAgICAgICsiIFsvXVsqXSBzaXplb2ZbKF1bKV0gPT0gWzAtOV1bMC05XSogWypdWy9dIikKKyAgICAgIC0gKHsiXG4iLCAiLFxuIiwgIiMnIn0pOworICByZXMgPSBtYXAocmVzLCAjJ3RyYW5zZm9ybSk7CisgIHJldHVybiBzcHJpbnRmKCIlc1xuIiwgaW1wbG9kZShyZXMsICIiKSk7Cit9CmRpZmYgLS1naXQgYS9vYmovdG9vbHMvbGlzcC9wYXJzZXIuYyBiL29iai90b29scy9saXNwL3BhcnNlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNDdkNjUKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvbGlzcC9wYXJzZXIuYwpAQCAtMCwwICsxLDEwOSBAQAorLy8gUEFSU0VSLkMgLS0gcGFyc2VyIGZvciBwYXJlbnRoZXNpcyBleHByZXNzaW9ucworLy8gKGMpIDE5OTQgYnkgSGF0ZUBNb3JnZW5HcmF1ZW4sIFRVQm11ZCwgTmlnaHRGYWxsCisvLyAtLQorLy8gQ29weSwgY2hhbmdlIGFuZCBkaXN0cmlidXRlIHRoaXMgYml0IG9mIHNvZnR3YXJlIGFzIG11Y2ggYXMgeW91IGxpa2UsCisvLyBidXQga2VlcCB0aGUgbmFtZSBvZiB0aGUgb3JpZ2luYWwgYXV0aG9yIGluIHRoZSBoZWFkZXIuCisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisKKyNpbmNsdWRlICJ0d2Vhay5oIiAKKworcHJpdmF0ZSBpbmhlcml0IEhPTUUoImxleCIpOworCisjaW5jbHVkZSAic3RhY2suaCIKKyNpbmNsdWRlICJ0eXBlcy5oIgorCitwcml2YXRlIG5vc2F2ZSBtaXhlZCBjb2RlOworcHJpdmF0ZSBub3NhdmUgbWl4ZWQgc3RhY2s7Citwcml2YXRlIG5vc2F2ZSBpbnQgcXVvdCwgYXNzdW1lOworCitub21hc2sgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZSgpCit7CisgIElOSVRTVEFDSyhzdGFjayk7CisgIGNvZGUgPSAoe30pOworICBxdW90ID0gMDsKK30KKworc3RhdGljIHZvaWQgY3JlYXRlKCkKK3sKKyAgbGV4OjpjcmVhdGUoKTsKKyAgaW5pdGlhbGl6ZSgpOworfQorCitub21hc2sgcHJpdmF0ZSBtaXhlZCBDb2RlR2VuKG1peGVkIHRva2VuKQoreworICBzd2l0Y2gocHJlX3BhcnNlKCZjb2RlKSkgCisgIHsKKyAgY2FzZSAxOiBQVVNIKHN0YWNrLCAiJyIpOyAgICAgICAgICAvLyBzdGFuZGFyZCBhdXRvcXVvdGUKKwkgIHF1b3QrKzsKKwkgIGJyZWFrOworICBjYXNlIDI6IFBVU0goc3RhY2ssICInQ09ERSIpOyAgICAgICAgICAvLyBzcGVjaWFsIFFVT1RFIGZvciBjb2RlIGdlbmVyYXRpb24KKyAgICAgICAgICBicmVhazsJCisgIH0KKyAgaWYoc3RyaW5ncCh0b2tlbikpCisgICAgc3dpdGNoKHRva2VuKQorICAgIHsKKyAgICAgIGNhc2UgIiciOiBQVVNIKHN0YWNrLCB0b2tlbik7IHF1b3QrKzsgcmV0dXJuOworICAgICAgY2FzZSAiKCI6IFBVU0goc3RhY2ssIGNvZGUpOyBjb2RlID0gKHt9KTsgYnJlYWs7CisgICAgICBjYXNlICIpIjoKKyAgICAgIHsKKyAgICAgICAgbWl4ZWQgdG1wOworCWlmKFNQKHN0YWNrKSAmJiBwb2ludGVycChUT1Aoc3RhY2spKSkgUE9QKHN0YWNrLCB0bXApOworICAgICAgICBlbHNlIHRtcCA9ICh7fSk7CisgICAgICAgIGlmKFNQKHN0YWNrKSAmJiBUT1Aoc3RhY2spID09ICInIikKKwkgIC8qIGRvIG5vdGhpbmcgKi8gOworICAgICAgICBlbHNlCisgICAgICAgICAgaWYoc2l6ZW9mKGNvZGUpKQorCSAgeworCSAgICBjb2RlWzBdID0gcHJvZ19wYXJzZShjb2RlWzBdKTsKKwkgICAgaWYoQ0xfTEFNQkRBKGNvZGVbMF0pIHx8IHN5bWJvbHAoY29kZVswXSkgfHwgcG9pbnRlcnAoY29kZVswXSkpCisJICAgICAgY29kZSA9ICh7IydmdW5jYWxsfSkgKyBjb2RlOworCSAgfQorICAgICAgICBjb2RlID0gdG1wICsgKHsgY29kZSB9KTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZWZhdWx0IDogY29kZSArPSAoeyB0b2tlblsxLi48Ml0gfSk7IGJyZWFrOworICAgIH0KKyAgZWxzZQorICAgIGNvZGUgKz0gKHsgcXVvdCA/IHRva2VuIDogcHJvZ19wYXJzZSh0b2tlbiwgIXNpemVvZihjb2RlKSkgfSk7CisKKyAgd2hpbGUoU1Aoc3RhY2spICYmIChUT1Aoc3RhY2spID09ICInIiAgfHwgVE9QKHN0YWNrKSA9PSAiJ0NPREUiKSAmJiAKKyAgICAgICAgc2l6ZW9mKGNvZGUpKSAKKyAgeyAKKyAgICBpbnQgcTsKKyAgICBpZihzdHJpbmdwKGNvZGVbPDFdKSB8fCBzeW1ib2xwKGNvZGVbPDFdKSB8fCBwb2ludGVycChjb2RlWzwxXSkgfHwgCisgICAgICAgZ2V0X3R5cGVfaW5mbyhjb2RlWzwxXSlbMF0gPT0gMTApIC8vIHF1b3RlZCBhcnJheQorICAgICAgICBjb2RlWzwxXSA9IHF1b3RlKGNvZGVbPDFdKTsgCisgICAgUE9QWChzdGFjayk7IAorICB9Cit9CisKKy8vIHBhcnNlKCkgLS0gbm9uLXRocmVhZGVkIHBhcnNpbmcgKGNvbnRpbnVlIG9uIGlucHV0KQorbm9tYXNrIHN0YXRpYyBpbnQgcGFyc2UobWl4ZWQgbXNnLCBpbnQgaW50ZXJhY3RpdmUpCit7CisgIG1peGVkIHRva2VuLCByZXM7CisgIGludCBsZXhpbmcsIG1pc3NpbmdfcGFyOworICBkbyB7CisgICAgaWYobGV4aW5nID0gbGV4KCZ0b2tlbikpCQorICAgIHsJCQkJCS8vIHRyeSB0byBhc3N1bWUgb3V0ZXIgIigiCisgICAgICBpZighU1Aoc3RhY2spICYmIHRva2VuICE9ICIoIikgeyBDb2RlR2VuKCIoIik7IGFzc3VtZSA9IDE7IH0KKyAgICAgIENvZGVHZW4odG9rZW4pOworICAgIH0KKyAgICBlbHNlIAkJCQkvLyBhZGQgIikiIGlmICIoIiBpcyBhc3N1bWVkCisgICAgICBpZihzaXplb2Yoc3RhY2spID09IDEgJiYgYXNzdW1lKSB7IENvZGVHZW4oIikiKTsgYXNzdW1lID0gMDsgbGV4aW5nID0gMTsgfQorICAgIGlmKGxleGluZyAmJiAhU1Aoc3RhY2spKQkJLy8gY29tcGxldGUgZXhwcmVzc2lvbiBmb3VuZAorICAgIHsKKyAgICAgIG1peGVkIGV4ZWNfY29kZTsgZXhlY19jb2RlID0gY29kZTsgaW5pdGlhbGl6ZSgpOworICAgICAgaWYoc2l6ZW9mKGV4ZWNfY29kZSkgJiYgcG9pbnRlcnAoZXhlY19jb2RlWzBdKSkgCisgICAgICAgIGV4ZWNfY29kZSA9ICh7IycsfSkgKyBleGVjX2NvZGU7Ly8gbW9yZSB0aGFuIG9uZSBleHByIG9uIG9uZSBsaW5lCisgICAgICBpZihtc2cgPSBjYXRjaChyZXMgPSBldmFsKGV4ZWNfY29kZSkpKSAKKyAgICAgICAgcmV0dXJuIC0yOwkJCS8vIGV4ZWN1dGlvbiBlcnJvcgorICAgICAgaWYoaW50ZXJhY3RpdmUpIHByaW50ZihvdXRwdXQocmVzKSk7CisgICAgICBlbHNlIG1zZyA9IHJlczsKKyAgICB9CisgIH0KKyAgd2hpbGUobGV4aW5nKTsKKyAgaWYobWlzc2luZ19wYXIgPSBTUChzdGFjaykpIAorICAgIHJldHVybiAobXNnID0gc3ByaW50ZigiKk1pc3NpbmcgJWQgKVxuIiwgbWlzc2luZ19wYXIpLCAtMyk7IAorICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29iai90b29scy9saXNwL3N0YWNrLmggYi9vYmovdG9vbHMvbGlzcC9zdGFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNTc4ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvbGlzcC9zdGFjay5oCkBAIC0wLDAgKzEsOCBAQAorLy8gU1RBQ0suSCAtLSBzdGFjayBtYWNyb3MKKworI2RlZmluZSBJTklUU1RBQ0socykJKHMgPSAoe30pKQorI2RlZmluZSBQVVNIKHMseCkJKHMgKz0gKHsgKHgpIH0pKQorI2RlZmluZSBQT1Aocyx4KQkoeCA9IHNbPDFdLCBzID0gc1swLi48Ml0pCisjZGVmaW5lIFBPUFgocykJCShzID0gc1swLi48Ml0pCisjZGVmaW5lIFRPUChzKQkJKChzKVs8MV0pCisjZGVmaW5lIFNQKHMpCQkoc2l6ZW9mKHMpKQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL2xpc3AvdHdlYWsuaCBiL29iai90b29scy9saXNwL3R3ZWFrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUxOGI2MAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9saXNwL3R3ZWFrLmgKQEAgLTAsMCArMSwzNCBAQAorLy8gVFdFQUsuSCAtLSBzeXN0ZW0gZGVwZW5kZW5kIG1hY3JvcworCisjZGVmaW5lIE1PUkdFTkdSQVVFTgorCisjaWYgKGRlZmluZWQoQVZBTE9OKSB8fCBkZWZpbmVkKEZpbmFsRnJvbnRpZXIpKQorIyAgZGVmaW5lIFVOSXRvcGlhCisjZW5kaWYKKworLy8gVGhlIGhvbWUgZGlyZWN0b3J5IG9mIHRoZSBsaXNwIGNvbXBpbGVycyBmaWxlcworI2lmIChkZWZpbmVkKFRBUFBNVUQpIHx8IGRlZmluZWQoVU5JdG9waWEpKQorIyAgZGVmaW5lIEhPTUUoZmlsZSkJIi93L2hhdGUvbGlzcC8iK2ZpbGUKKyNlbGlmIChkZWZpbmVkKEFEQU1BTlQpKQorIyAgZGVmaW5lIEhPTUUoZmlsZSkJIi93aXovaGF0ZS9saXNwLyIrZmlsZQorI2Vsc2UKKyMgaWZkZWYgTU9SR0VOR1JBVUVOCisjICAgZGVmaW5lIEhPTUUoZmlsZSkJIi9vYmovdG9vbHMvbGlzcC8iK2ZpbGUKKyMgZWxzZQorIyAgIGRlZmluZSBIT01FKGZpbGUpCSIvcGxheWVycy9oYXRlL2xpc3AvIitmaWxlCisjIGVuZGlmCisjZW5kaWYKKworLy8gc3ltYm9sX3ZhcmlhYmxlKCkgaXMgbm90IGF2YWlsYWJsZSBvbiBkcml2ZXJzIGJlbG93IDMuMi4xQDEKKy8vI2RlZmluZSBzeW1ib2xfdmFyaWFibGUoc3RyKQkwCisKKy8vIERFQlVHIG1vZGUKKyNpZmRlZiBNT1JHRU5HUkFVRU4KKyMgIGRlZmluZSBVU0VSICJldGFoIgorI2Vsc2UKKyMgIGRlZmluZSBVU0VSICJoYXRlIgorI2VuZGlmCisjZGVmaW5lIERFQlVHKHgpCWlmKGZpbmRfcGxheWVyKFVTRVIpKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKFVTRVIpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIlslT10gJU9cbiIsIHRoaXNfb2JqZWN0KCksICh4KSkpCisKZGlmZiAtLWdpdCBhL29iai90b29scy9saXNwL3R5cGVzLmggYi9vYmovdG9vbHMvbGlzcC90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZWY1ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvbGlzcC90eXBlcy5oCkBAIC0wLDAgKzEsNCBAQAorI2RlZmluZSBDTF9MQU1CREEoeCkgIChnZXRfdHlwZV9pbmZvKHgpWzBdPT04ICYmIGdldF90eXBlX2luZm8oeClbMV09PTUpCisjZGVmaW5lIENMX0xGVU4oeCkgICAgKGdldF90eXBlX2luZm8oeClbMF09PTggJiYgZ2V0X3R5cGVfaW5mbyh4KVsxXT09MCkKKyNkZWZpbmUgQ0xfRUZVTih4KSAgICAoZ2V0X3R5cGVfaW5mbyh4KVswXT09OCAmJiBnZXRfdHlwZV9pbmZvKHgpWzFdPCAwKQorI2RlZmluZSBDTF9WQVIoeCkgICAgIChnZXRfdHlwZV9pbmZvKHgpWzBdPT04ICYmIGdldF90eXBlX2luZm8oeClbMV09PTEpCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvbG9ndG9vbC5jIGIvb2JqL3Rvb2xzL2xvZ3Rvb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDkzYjc1Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL2xvZ3Rvb2wuYwpAQCAtMCwwICsxLDE1NiBAQAorLy8gKGMpIGJ5IFBhZHJlaWMgKFBhZHJlaWNAbWcubXVkLmRlKQorCitpbmhlcml0ICJzdGQvc2VjdXJlX3RoaW5nIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisKKyNkZWZpbmUgU0FWRUZJTEUgICIvcGxheWVycy8iK2dldGV1aWQoKSsiLy5sb2d0b29sIgorCisvLyBkZWZpbmllcmVuIHZvbiAiaW5saW5lIiBGdW5rdGlvbmVuOgorI2RlZmluZSBhbGxvd2VkKCkgICAoIXByb2Nlc3NfY2FsbCgpICYmIFBMPT1SUEwgJiYgZ2V0ZXVpZCgpPT1nZXR1aWQoUlBMKSkKKworbWFwcGluZyBsb2dzOworCitzdGF0aWMgdm9pZCBjaGVja19sb2dzKCkKK3sKKyAgZmlsdGVyKHNvcnRfYXJyYXkobV9pbmRpY2VzKGxvZ3MpLCAjJz4pLCBsYW1iZGEoICh7ICd4IH0pLCAoeyMnPywgCisgICAgKHsjJyE9LCAoeyMnWywgbG9ncywgJ3gsIDJ9KSwgKHsjJ2ZpbGVfdGltZSwgKHsjJ1ssIGxvZ3MsICd4LCAwfSkgfSkgfSksCisgICAgICAgKHsjJ3RlbGxfb2JqZWN0LCAoeyMnZW52aXJvbm1lbnQgfSksICh7IydzcHJpbnRmLAorICAgICAgICJOZXVlIEVpbnRyYWVnZSBpbiA8JXM+LlxuIiwgJ3ggfSkgfSksIDB9KSkpOworfQorCit2b2lkIGNyZWF0ZSgpCit7CisgIGlmICghY2xvbmVwKE1FKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBpZiAoIXJlc3RvcmVfb2JqZWN0KFNBVkVGSUxFKSkgeworICAgIGxvZ3M9KFsgInJlcGZpbGUiOiBzcHJpbnRmKCIvbG9nL3JlcG9ydC8lcy5yZXAiLCBnZXRldWlkKCkpOyAwOyAwIF0pOworICAgIGlmIChJU19BUkNIKGdldGV1aWQoKSkpCisgICAgICBsb2dzKz0oWyJzbm9vcGxvZyI6ICIvbG9nL1NOT09QIjsgMDsgMCwgImtpbGxlciI6ICIvbG9nL0tJTExFUiI7IDA7IDBdKTsKKyAgfQorICBTZXRQcm9wKFBfU0hPUlQsIHRoaXNfcGxheWVyKCktPk5hbWUoV0VTU0VOKSsiIExvZ3Rvb2wiKTsKKyAgU2V0UHJvcChQX05BTUUsIFF1ZXJ5UHJvcChQX1NIT1JUKSk7CisgIFNldFByb3AoUF9OT0RST1AsIDApOworICBTZXRQcm9wKFBfTkVWRVJEUk9QLCAwKTsKKyAgU2V0UHJvcChQX0FVVE9MT0FET0JKLCAxKTsKKyAgQWRkSWQoImxvZ3Rvb2wiKTsKKyAgQWRkQ21kKCJtYXJrIiwgImFrdHVhbGlzaWVyZW4iKTsKKyAgQWRkQ21kKG1faW5kaWNlcyhsb2dzKSwgInJlYWRfbG9nIik7CisgIEFkZENtZCgiQWRkTG9nIiwgImFkZF9sb2ciKTsKKyAgQWRkQ21kKCJEZWxMb2ciLCAiZGVsX2xvZyIpOworfQorCit2b2lkIHJlc2V0KCkKK3sKKyAgOjpyZXNldCgpOworICBpZiAoIWNsb25lcChNRSkgfHwgIWVudmlyb25tZW50KCkpIHJldHVybjsKKyAgY2FsbF9vdXQoImNoZWNrX2xvZ3MiLCAwKTsKKyAgc2V0X25leHRfcmVzZXQoMipfX1JFU0VUX1RJTUVfXyk7IC8vIGtlaW4gWnVmYWxsLCBtYXguIExhZW5nZQorfQorCit2YXJhcmdzIGludCBtb3ZlKG1peGVkIGRlc3QsIGludCBtZXRob2QpCit7CisgIGludCBpOworICBpZiAoIW9iamVjdHAoZGVzdCkpIGRlc3Q9ZmluZF9vYmplY3QoZGVzdCk7CisgIGlmICghZGVzdCB8fCAhaW50ZXJhY3RpdmUoZGVzdCkgfHwgZ2V0dWlkKGRlc3QpIT1nZXRldWlkKCkpIAorICAgIHJldHVybiBNRV9DQU5UX0JFX1RBS0VOOworICBpPTo6bW92ZShkZXN0LCBtZXRob2QpOworICBpZiAoaSE9MSkgcmV0dXJuIGk7CisgIGlmIChlbnZpcm9ubWVudCgpKSBjYWxsX291dCgiY2hlY2tfbG9ncyIsIDApOworICByZXR1cm4gMTsKK30KKwordmFyYXJncyBzdHJpbmcgbG9uZygpIAoreworICAgcmV0dXJuICJGb2xnZW5kZSBMb2dmaWxlcyB3ZXJkZW4gZGVyemVpdCB2b24gRGVpbmVtIExvZ3Rvb2wgdmVyd2FsdGV0OlxuXG4iCisgICAgICAgICAraW1wbG9kZShtYXAoc29ydF9hcnJheShtX2luZGljZXMobG9ncyksICMnPiksCisgICAgICAgICAgbGFtYmRhKCAoeyAneCB9KSwgKHsjJ3NwcmludGYsICIgJTFzICUtMTRzIC0gJXMiLCAoeyMnPywgKHsjJyE9LAorICAgICAgICAgICh7IydbLGxvZ3MsJ3gsIDJ9KSwgKHsjJ2ZpbGVfdGltZSwoeyMnWyxsb2dzLCd4LCAwfSl9KX0pLCIqIiwiIn0pLAorICAgICAgICAgICh7IydzcHJpbnRmLCAiPCVzPiIsICd4fSksICh7IydbLCBsb2dzLCAneCwgMH0pfSkgKSApLCAiXG4iKQorICAgICAgICAgKyJcblxuTWl0IDxtYXJrPiBrb2VubmVuIGFsbGUgRWludHJhZWdlIGFscyBnZWxlc2VuIG1hcmtpZXJ0IHVuZCAiCisgICAgICAgICArIm1pdCBBZGQtIHVuZFxuRGVsTG9nIExvZ2ZpbGVzIGluIGRpZSBMaXN0ZSBhdWZnZW5vbW1lbiBiencuIGF1cyAiCisgICAgICAgICArImRlciBMaXN0ZSBlbnRmZXJudCB3ZXJkZW4uXG4iOworfQorCitzdGF0aWMgaW50IGFrdHVhbGlzaWVyZW4oc3RyaW5nIHN0cikKK3sKKyAgaWYgKCFhbGxvd2VkKCkpIHJldHVybiAwOworICBpZiAoc3RyICYmIHN0ciE9IiIpIHsKKyAgICBpZiAoIWxvZ3Nbc3RyXSkgeworICAgICAgbm90aWZ5X2ZhaWwoIkVpbiBzb2xjaGVzIExvZ2ZpbGUgaXN0IG5pY2h0IGluIGRlciBMaXN0ZSBlbnRoYWx0ZW4uXG4iKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBsb2dzW3N0ciwgMV09ZmlsZV9zaXplKGxvZ3Nbc3RyLCAwXSk7CisgICAgbG9nc1tzdHIsIDJdPWZpbGVfdGltZShsb2dzW3N0ciwgMF0pOworICB9CisgIGVsc2UgZmlsdGVyKG1faW5kaWNlcyhsb2dzKSwgbGFtYmRhKCAoeyAneCB9KSwoeyMnLCAsCisgICAoeyMnPSwgKHsjJ1ssIGxvZ3MsICd4LCAxfSksICh7IydmaWxlX3NpemUsICh7IydbLCBsb2dzLCAneCwgMH0pIH0pIH0pLAorICAgKHsjJz0sICh7IydbLCBsb2dzLCAneCwgMn0pLCAoeyMnZmlsZV90aW1lLCAoeyMnWywgbG9ncywgJ3gsIDB9KSB9KX0pfSkpKTsKKyAgd3JpdGUoIkRvbmUhXG4iKTsKKyAgc2F2ZV9vYmplY3QoU0FWRUZJTEUpOworICByZXR1cm4gMTsKK30KKworc3RhdGljIGludCByZWFkX2xvZyhzdHJpbmcgc3RyKQoreworICBpbnQgc2k7CisgIGlmICghYWxsb3dlZCgpKSByZXR1cm4gMDsKKyAgc2k9ZmlsZV9zaXplKGxvZ3NbcXVlcnlfdmVyYigpLDBdKTsKKyAgaWYgKHN0cikKKyAgICBQTC0+bW9yZShsb2dzW3F1ZXJ5X3ZlcmIoKSwwXSk7CisgIGVsc2UgeworICAgIGlmIChzaTwwIHx8IGZpbGVfdGltZShsb2dzW3F1ZXJ5X3ZlcmIoKSwgMF0pPT1sb2dzW3F1ZXJ5X3ZlcmIoKSwgMl0pCisgICAgICB3cml0ZSgiS2VpbmUgbmV1ZW4gRWludHJhZWdlIGluIDwiK3F1ZXJ5X3ZlcmIoKSsiPi5cbiIpOworICAgIGVsc2UgeworICAgICAgd3JpdGUoIkZvbGdlbmRlcyBpc3QgbmV1IGluIDwiK3F1ZXJ5X3ZlcmIoKSsiPi5cbiIpOworICAgICAgaWYgKHNpPGxvZ3NbcXVlcnlfdmVyYigpLDFdKQorICAgICAgICBQTC0+bW9yZShsb2dzW3F1ZXJ5X3ZlcmIoKSwwXSk7CisgICAgICBlbHNlIFBMLT5Nb3JlKHJlYWRfYnl0ZXMobG9nc1txdWVyeV92ZXJiKCksMF0sCisJICAgIGxvZ3NbcXVlcnlfdmVyYigpLDFdLHNpLWxvZ3NbcXVlcnlfdmVyYigpLDFdKSk7CisgICAgfQorICB9CisgIGxvZ3NbcXVlcnlfdmVyYigpLCAxXT1zaTsKKyAgbG9nc1txdWVyeV92ZXJiKCksIDJdPWZpbGVfdGltZShsb2dzW3F1ZXJ5X3ZlcmIoKSwgMF0pOworICBzYXZlX29iamVjdChTQVZFRklMRSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGFkZF9sb2coKQoreworICBzdHJpbmcga2V5LCBwYXRoLCBzdHI7CisgIHN0cj1QTC0+X3VucGFyc2VkX2FyZ3MoKTsgIAorICBpZiAoIWFsbG93ZWQoKSB8fCAhc3RyIHx8IHNzY2FuZihzdHIsICIlcyAlcyIsIGtleSwgcGF0aCkhPTIpIHsKKyAgICBub3RpZnlfZmFpbCgiU3ludGF4OiBBZGRMb2cgPGtleT4gPHBhdGg+XG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBrZXk9bG93ZXJfY2FzZShrZXkpOworICBpZiAobG9nc1trZXldKSB7CisgICAgbm90aWZ5X2ZhaWwoIkVzIGdpYnQgc2Nob24gZWluIExvZ2ZpbGUgbWl0IGRpZXNlbSBLZXkgaW4gZGVyIExpc3RlLlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgbG9ncys9KFsga2V5OiBwYXRoOyAwOyAwIF0pOworICBBZGRDbWQoa2V5LCAicmVhZF9sb2ciKTsKKyAgc2F2ZV9vYmplY3QoU0FWRUZJTEUpOworICB3cml0ZSgiTG9nZmlsZSA8IitrZXkrIj4gaW4gZGllIExpc3RlIGF1Zmdlbm9tbWVuLlxuIik7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGRlbF9sb2coc3RyaW5nIHN0cikKK3sKKyAgaWYgKCFhbGxvd2VkKCkgfHwgIXN0cikgeworICAgIG5vdGlmeV9mYWlsKCJXRUxDSEVTIExvZ2ZpbGUgc29sbCBhdXMgZGVyIExpc3RlIGVudGZlcm50IHdlcmRlbj9cbiIpOworICAgIHJldHVybiAwOworICB9CisgIGlmICghbG9nc1tzdHJdKSB7CisgICAgbm90aWZ5X2ZhaWwoIkxvZ2ZpbGUgbmljaHQgaW4gTGlzdGUgZW50aGFsdGVuLlxuIik7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgbG9ncz1tX2NvcHlfZGVsZXRlKGxvZ3Msc3RyKTsKKyAgUmVtb3ZlQ21kKHN0cik7CisgIHNhdmVfb2JqZWN0KFNBVkVGSUxFKTsKKyAgd3JpdGUoIkxvZ2ZpbGUgPCIrc3RyKyI+IGF1cyBMaXN0ZSBlbnRmZXJudC5cbiIpOworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL29iai90b29scy9sdXBlLmMgYi9vYmovdG9vbHMvbHVwZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNmYxMDkKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvbHVwZS5jCkBAIC0wLDAgKzEsMTg4OCBAQAorLy8gVGhpcyB0b29sIHdhcyBvcmlnaW5hbGx5IHdyaXR0ZW4gYnkgTWFjYmV0aEBUVUJtdWQKKy8vCisvLyBTb21lIGNoYW5nZXMvZXh0ZW5zaW9ucyBieSBKb2ZATW9yZ2VuR3JhdWVuCisKK2luaGVyaXQgIi9zdGQvdGhpbmciOworCisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPHF1ZXN0bWFzdGVyLmg+CisjaW5jbHVkZSA8dXNlcmluZm8uaD4KKworI2RlZmluZSBhZGQocykgY29tbWFuZHMrPSh7c30pO2Z1bmN0aW9ucys9KHtzfSk7bmNtZHMrKworI2RlZmluZSBhZGQyKHMsZikgY29tbWFuZHMrPSh7c30pO2Z1bmN0aW9ucys9KHtmfSk7bmNtZHMrKworI2RlZmluZSBNQVhTVEFDSyAxMAorI2RlZmluZSBNQVhWQVJTIDEwCisjZGVmaW5lIE1BWERFUFRIIDUKKyNkZWZpbmUgTUFYTElORVMgNDAKKyNkZWZpbmUgTUFYTElORUxFTiA3OQorCittaXhlZCAqc3RhY2ssICp2YXJhcmVhLCBlcnI7CisKK3N0cmluZyAqY29tbWFuZHMsICpmdW5jdGlvbnMsIHVzZXIsICpxdWVyeV9saXN0LCAqYXJndjsKK2ludCBtYXh2ZXJiLG5jbWRzLGFyZ2MscmVjdXJzaXZlLGhpZGVfc2hvcnQsbGluZXMsZmlyc3RsaW5lLGxhc3RsaW5lOworc3RhdGljIGludCB0ZWxsKHN0cmluZyBzdHIpOworaW50IGV2YWxjbWQoc3RyaW5nIHN0cik7CitpbnQgZXZhbChzdHJpbmcgc3RyKTsKK3N0cmluZyBzdGsoc3RyaW5nIGFyZyk7CitzdHJpbmcgZGVzYyhvYmplY3Qgb2IpOwordm9pZCBjbGVhbihvYmplY3Qgb2IpOwordm9pZCBjbGVhbm9mKHN0cmluZyBzdHIsb2JqZWN0IG9iKTsKKworCit2b2lkIGNyZWF0ZSgpCit7CisgIG9iamVjdCBvd25lcjsKKyAgc3RyaW5nIHN0cjsKKyAgCisgIGlmICghY2xvbmVwKE1FKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBvd25lcj1lbnZpcm9ubWVudCgpfHx0aGlzX3BsYXllcigpOworICBpZiAob3duZXIpCisgICAgc3RyPWNhcGl0YWxpemUoKChzdHI9Z2V0ZXVpZChvd25lcikpWzwxXT09J3MnfHxzdHJbPDFdPT0neCd8fHN0cls8MV0gPT0neicpP3N0cis9IiciOnN0cis9InMiKTsgCisgIGVsc2UKKyAgICBzdHI9IkVpbmUiOworICBTZXRQcm9wKCBQX1NIT1JULHN0cisiIEx1cGUiICk7CisgIFNldFByb3AoIFBfTkFNRSwgc3RyKyIgTHVwZSIgKTsKKyAgU2V0UHJvcCggUF9MT05HLCAiTWl0IGRpZXNlciBMdXBlIGthbm4gbWFuIGRpZSBGZWluaGVpdGVuIGRlcyBMUEMgYmVzc2VyIGVya2VubmVuLlxuIiApOworICBTZXRQcm9wKCBQX05FVkVSRFJPUCwgMSApOworICBTZXRQcm9wKCBQX05PRFJPUCwgIkR1IGthbm5zdCBEZWluZSBMdXBlIG5pY2h0IHdlZ3dlcmZlbi4gRGF6dSBpc3Qgc2llIHp1IHdlcnR2b2xsLlxuIik7CisgIFNldFByb3AoIFBfTk9CVVksIDEgKTsKKyAgU2V0UHJvcCggUF9HRU5ERVIsIEZFTUFMRSApOworICBTZXRQcm9wKCBQX1dFSUdIVCwgMCApOworICBTZXRQcm9wKCBQX0FSVElDTEUsMCk7CisgIFNldFByb3AoIFBfR0VOREVSLDApOworICBBZGRJZCggImx1cGUiICk7CisgIHVzZXI9IioiOworICBzdGFjaz0oe30pOworICBjb21tYW5kcz0oe30pOworICBmdW5jdGlvbnM9KHt9KTsKKyAgbmNtZHM9MDsKKyAgYWRkKCJEZXN0Iik7CisgIGFkZCgiX2dvdG8iKTsKKyAgYWRkKCJjbG5vZiIpOworICBhZGQoImNsbiIpOworICBhZGQoImNsciIpOworICBhZGQoImNvcHlfbGRmaWVkIik7CisgIGFkZCgiY3JlYXQiKTsKKyAgYWRkKCJkZXN0Iik7CisgIGFkZCgiZGluZm8iKTsKKyAgYWRkKCJkaXNjbyIpOworICBhZGQoImR1bXBfbGlzdHMiKTsKKyAgYWRkKCJkdXAiKTsKKyAgYWRkKCJlbnYiKTsKKyAgYWRkKCJoZXJlIik7CisgIGFkZCgiaW5mbyIpOworICBhZGQoImludiIpOworICBhZGQoImx2Iik7CisgIGFkZCgibWFrZSIpOworICBhZGQoIm1lIik7CisgIGFkZCgibWluZm8iKTsKKyAgYWRkKCJuZXciKTsKKyAgYWRkKCJub3JlYyIpOworICBhZGQoIm9iIik7CisgIGFkZCgib3ZlciIpOworICBhZGQoInBsIik7CisgIGFkZCgicmVjIik7CisgIGFkZCgicmVzdWx0Iik7CisgIC8vIGFkZCgicnVzYWdlIik7CisgIGFkZCgic2NhbiIpOworICBhZGQoInN0YXQiKTsKKyAgYWRkKCJzdGsiKTsKKyAgYWRkKCJzd2FwIik7CisgIGFkZCgic3dobyIpOworICBhZGQoInZhcnMiKTsKKyAgYWRkMigiIyIsImxvY2siKTsKKyAgYWRkMigiLiIsInNlbCIpOworICBhZGQyKCIvIiwiZmlsZSIpOworICBhZGQyKCI8IiwicmVhZHZhciIpOworICBhZGQyKCI9IiwiZHVtcCIpOworICBhZGQyKCI+Iiwid3JpdGV2YXIiKTsKKyAgYWRkMigiQCIsInBpY2siKTsKKyAgYWRkMigiWyIsImNhbGwiKTsKKyAgYWRkMigiX21vIiwiX212Iik7CisgIGFkZDIoIl9tb3YiLCJfbXYiKTsKKyAgYWRkMigiX21vdmUiLCJfbXYiKTsKKyAgYWRkMigiX212IiwiX212Iik7CisgIGFkZDIoImNhbGxfb3V0IiwiY2FsbG91dCIpOworICBhZGQyKCJkZWJ1Z19pbmZvIiwgImRiX2luZm8iKTsKKyAgYWRkMigiZGVzYyIsInRvZ2dsZV9zaG9ydCIpOworICBhZGQyKCJkdW1wIiwiZHVtcGxpc3RzIik7CisgIGFkZDIoImhlYXJ0X2JlYXQiLCJoZWFydGJlYXQiKTsKKyAgYWRkMigiaWRsZSIsImlkbGUiKTsKKyAgYWRkMigiaW5oZXJpdF9saXN0IiwiaW5oZXJpdGxpc3QiKTsKKyAgYWRkMigibW92ZSIsIm12Iik7CisgIGFkZDIoIm1vdiIsIm12Iik7CisgIGFkZDIoIm1vIiwibXYiKTsKKyAgYWRkMigicG9wIiwieHBvcCIpOworICBhZGQyKCJwdXNoIiwieHB1c2giKTsKKyAgYWRkMigicmVuZXciLCJyZW5ld19wbGF5ZXIiKTsKKyAgYWRkMigic2MiLCJzY2FuIik7CisgIGFkZDIoIn4iLCJmaWxlMiIpOworICBtYXh2ZXJiPW5jbWRzOworICB2YXJhcmVhPWFsbG9jYXRlKE1BWFZBUlMpOworICBxdWVyeV9saXN0ID0KKyAgICAoeworICAgICAgIlZBTFVFIiwiLXZhbHVlIiwiTEVWRUwiLCItbGV2ZWwiLCJJRFMiLCItaWRzIiwKKyAgICAgICJXRUFQT04gQ0xBU1MiLCItd2MiLCJBUk1PVVIgQ0xBU1MiLCItYWMiLAorICAgICAgIldFSUdIVCIsIi13ZWlnaHQiLCJUWVBFIiwicXVlcnlfdHlwZSIsCisgICAgICAiVUlEIiwiLXVpZCIsIkVVSUQiLCItZXVpZCIKKyAgICB9KTsKK30KKworaW50IF9xdWVyeV9hdXRvbG9hZG9iaigpCit7CisgIHJldHVybiAxOworfQorCit2b2lkIF9zZXRfYXV0b2xvYWRvYmooKQoreworICBjYWxsX291dCgiX2xvYWRfcHJvZmlsZSIsMCk7Cit9CisKK3ZvaWQgX2xvYWRfcHJvZmlsZSgpCit7CisgIG9iamVjdCBwcm9maWxlOworICBzdHJpbmcgcGZpbGU7CisgIAorICBpZiAoZ2V0ZXVpZCgpICYmIGVudmlyb25tZW50KCkgJiYgZ2V0ZXVpZChlbnZpcm9ubWVudCgpKT09Z2V0ZXVpZCgpICYmCisgICAgICBpbnRlcmFjdGl2ZShlbnZpcm9ubWVudCgpKSkKKyAgICBpZiAoZmlsZV9zaXplKHBmaWxlPSIvcGxheWVycy8iK2dldGV1aWQoKSsiLy5wcm9maWxlLmMiKT4wKQorICAgICAgaWYgKHBmaWxlPWNhdGNoKGNhbGxfb3RoZXIocGZpbGUsInNldHVwIixlbnZpcm9ubWVudCgpKSkpCisJcHJpbnRmKCJFcnJvciB3aGVuIGxvYWRpbmcgcHJvZmlsZTogJU9cbiIscGZpbGUpOworfQorCit2b2lkIGluaXQoKQoreworICBpbnQgaSxjaDsKKyAgCisgIDo6aW5pdCgpOworICBpZiAoZW52aXJvbm1lbnQoKSE9dGhpc19wbGF5ZXIoKSkgcmV0dXJuOworLy8gIGlmICghSVNfTEVBUk5FUih0aGlzX3BsYXllcigpKSkgcmV0dXJuOworICBpZiAoIUlTX0xFQVJORVIodGhpc19wbGF5ZXIoKSkpIHJldHVybiBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKKyAgCisgIGFkZF9hY3Rpb24oImNtZGxpbmUiLCIiLDEpOworfQorCitpbnQgY21kbGluZShzdHJpbmcgc3RyKQoreworICBzdHJpbmcgdmVyYjsKKyAgaW50IGkscmV0OworICAKKyAgdmVyYj1xdWVyeV92ZXJiKCk7CisgIGlmICghdmVyYikgcmV0dXJuIDA7CisgIHN3aXRjaCAodmVyYikKKyAgeworICAgIGNhc2UgImVyemFlaGwiOiByZXR1cm4gdGVsbChzdHIpOworICB9CisgIHN0cj1QTC0+X3VucGFyc2VkX2FyZ3MoKTsKKyAgZm9yIChpPTA7aTxtYXh2ZXJiO2krKykKKyAgICBpZiAoY29tbWFuZHNbaV09PXZlcmJbMC4uc2l6ZW9mKGNvbW1hbmRzW2ldKS0xXSkKKyAgICAgIGlmIChyZXQ9ZXZhbGNtZChzdHIpKQorCXJldHVybiByZXQ7CisgIHJldHVybigwKTsgLy8gbm9uLXZvaWQgZnVuY3Rpb24sIFplc3N0cmEKK30KKworc3RhdGljIGludCB0ZWxsKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyAqdG1wOworICBvYmplY3Qgd2hvLHNuOworICBpbnQgcmV0OworCisgIGlmICghSVNfQVJDSCh0aGlzX2ludGVyYWN0aXZlKCkpKSByZXR1cm4gMDsKKyAgaWYgKCEoc3RyPXRoaXNfaW50ZXJhY3RpdmUoKS0+X3VucGFyc2VkX2FyZ3MoKSkpIHJldHVybiAwOworICBpZiAoc2l6ZW9mKHRtcD1vbGRfZXhwbG9kZShzdHIsIiAiKSk8MikgcmV0dXJuIDA7CisgIGlmICghKHdobz1maW5kX3BsYXllcih0bXBbMF0pKSkgcmV0dXJuIDA7CisgIGlmICghKHNuPXF1ZXJ5X3Nub29wKHdobykpKSByZXR1cm4gMDsKKyAgaWYgKHF1ZXJ5X3dpel9ncnAodGhpc19pbnRlcmFjdGl2ZSgpKTw9cXVlcnlfd2l6X2dycChzbikgfHwKKyAgICAgIHF1ZXJ5X3dpel9ncnAodGhpc19pbnRlcmFjdGl2ZSgpKTw9cXVlcnlfd2l6X2dycCh3aG8pKSByZXR1cm4gMDsKKyAgc25vb3Aoc24sMCk7CisgIHJldD10aGlzX2ludGVyYWN0aXZlKCktPl9lcnphZWhsZShzdHIpOworICBzbm9vcChzbix3aG8pOworICByZXR1cm4gcmV0OworfQorCitpbnQgc2V0X3VzZXIoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIHdobzsKKyAgaWYgKCFzdHIpIHJldHVybiAwOworICBpZiAoc3RyPT0ibm8gYWNjZXNzIikKKyAgeworICAgIHVzZXI9IioiOworICAgIG1vdmVfb2JqZWN0KHRoaXNfb2JqZWN0KCksZW52aXJvbm1lbnQoKSk7CisgICAgd3JpdGUoIk9rLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKHNzY2FuZihzdHIsImFjY2VzcyB0byAlcyIsd2hvKT09MSkKKyAgeworICAgIG9iamVjdCBwbDsKKyAgICBwbD1maW5kX3BsYXllcih3aG8pOworICAgIGlmICghcGwpCisgICAgICB3cml0ZSgiTm8gc3VjaCBwbGF5ZXIuXG4iKTsKKyAgICBlbHNlCisgICAgeworICAgICAgdXNlciA9IHdobzsKKyAgICAgIHdyaXRlKCJPay5cbiIpOworICAgICAgbW92ZV9vYmplY3QodGhpc19vYmplY3QoKSxwbCk7CisgICAgICB0ZWxsX29iamVjdChwbCwiRHUgZGFyZnN0IG51biBkdXJjaCBkaWUgbWFnaXNjaGUgTHVwZSBzY2hhdWVuLlxuIik7CisgICAgfQorICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQorCitzdHJpbmcgc3RyaXAoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIHRlbXA7CisgIGlmKCFzdHIpIHJldHVybiAiIjsKKyAgd2hpbGUgKHNzY2FuZihzdHIsIiAlcyIsdGVtcCk9PTEpIHN0cj10ZW1wOworICByZXR1cm4gc3RyOworfQorCitpbnQgYXJnbGVuOworCitzdHJpbmcgZ2V0YXJnKHN0cmluZyBhcmdzKQoreworICBzdHJpbmcgYXJnOworICBzdHJpbmcgcmVzdDsKKyAgaWYgKHNzY2FuZihhcmdzLCJcIiVzXCIlcyIsYXJnLHJlc3QpPT0yIHx8CisgICAgICBzc2NhbmYoYXJncywiXCclc1wnJXMiLGFyZyxyZXN0KT09MiB8fAorICAgICAgc3NjYW5mKGFyZ3MsInwlc3wlcyIsYXJnLHJlc3QpPT0yKQorICB7CisgICAgaWYgKGFyZz09IiIpCisgICAgICBhcmdsZW49MjsKKyAgICBlbHNlCisgICAgICBhcmdsZW49c2l6ZW9mKGFyZykrMjsKKyAgICByZXR1cm4gYXJnOworICB9CisgIGlmIChzc2NhbmYoYXJncywiJXMgJXMiLGFyZyxyZXN0KT09MikKKyAgICBhcmdzPWFyZzsKKyAgaWYgKHNzY2FuZihhcmdzLCIlcy4lcyIsYXJnLHJlc3QpPT0yKQorICAgIGFyZ3M9YXJnOworICBpZiAoc3NjYW5mKGFyZ3MsIiVzWyVzIixhcmcscmVzdCk9PTIpCisgICAgYXJncz1hcmc7CisgIGlmIChzc2NhbmYoYXJncywiJXNdJXMiLGFyZyxyZXN0KT09MikKKyAgICBhcmdzPWFyZzsKKyAgaWYgKGFyZ3M9PSIiKQorICAgIGFyZ2xlbj0wOworICBlbHNlCisgICAgYXJnbGVuPXNpemVvZihhcmdzKTsKKyAgcmV0dXJuIGFyZ3M7Cit9CisKK3N0cmluZyBnZXRyZXN0KHN0cmluZyBzdHIpCit7CisgIGlmIChhcmdsZW49PTApCisgICAgcmV0dXJuIHN0cjsKKyAgaWYgKGFyZ2xlbj09c2l6ZW9mKHN0cikpCisgICAgcmV0dXJuICIiOworICByZXR1cm4gc3RyaXAoc3RyW2FyZ2xlbi4uc2l6ZW9mKHN0ciktMV0pOworfQorCitpbnQgaW50ZXJhY3RpdmVNb2RlKHN0cmluZyBzdHIpCit7CisgIGlmIChzdHIpCisgICAgcmV0dXJuIGV2YWwoc3RyKTsKKyAgc3RrKCIiKTsKKyAgd3JpdGUoIicuJyB0byBleGl0LlxuIik7CisgIHdyaXRlKCI/ICIpOworICBpbnB1dF90bygibW9yZSIpOworICByZXR1cm4gMTsKK30KKwordm9pZCBtb3JlKHN0cmluZyBzdHIpCit7CisgIHN0cmluZyBjbWQ7CisgIGlmIChzdHI9PSIuIikgcmV0dXJuOworICBpZiAoc3NjYW5mKHN0ciwiISVzIixjbWQpPT0xKQorICAgIGNvbW1hbmQoY21kLHRoaXNfcGxheWVyKCkpOworICBlbHNlCisgIHsKKyAgICBldmFsKHN0cik7CisgICAgc3RrKCIiKTsKKyAgfQorICB3cml0ZSgiPyAiKTsKKyAgaW5wdXRfdG8oIm1vcmUiKTsKK30KKworaW50IGV2YWxjbWQoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIHZlcmI7CisgIGlmICghSVNfTEVBUk5JTkcodGhpc19wbGF5ZXIoKSkpIHJldHVybiAwOworICB2ZXJiPXF1ZXJ5X3ZlcmIoKTsKKyAgaWYgKHZlcmI9PSI/IikKKyAgICB2ZXJiPSIiOworICBpZiAoc3RyKQorICAgIHN0cj12ZXJiKyIgIitzdHI7CisgIGVsc2UKKyAgICBzdHI9dmVyYjsKKyAgcmV0dXJuIGV2YWwoc3RyKTsKK30KKworaW50IGV2YWwoc3RyaW5nIHN0cikKK3sKKyAgaW50IGksZmxhZyxvbGRfc3AsZmlyc3Q7CisgIG1peGVkICpvbGRfc3RhY2s7CisgIHN0cmluZyBhcmcsdG1wOworICBlcnI9MDsKKyAgZmlyc3Q9MTsKKyAgd2hpbGUgKHN0ciE9IiIpCisgIHsKKyAgICBmbGFnPTA7CisgICAgc3RyPXN0cmlwKHN0cik7CisgICAgaWYgKHNzY2FuZihzdHIsIiMlcyIsYXJnKT09MSkKKyAgICB7CisgICAgICBvbGRfc3RhY2s9c3RhY2tbMC4uPDFdOworICAgICAgc3RyPWFyZzsKKyAgICB9CisgICAgZWxzZQorICAgICAgb2xkX3N0YWNrPTA7CisgICAgc3RyPXN0cmlwKHN0cik7CisgICAgaWYgKHN0cj09IiIpCisgICAgICBicmVhazsKKyAgICBmb3IgKGk9MDtpPG5jbWRzO2krKykKKyAgICB7CisgICAgICBpZiAoc3NjYW5mKHN0cixjb21tYW5kc1tpXSsiJXMiLGFyZyk9PTEpCisgICAgICB7CisJaWYgKGFyZyE9IiIgJiYgc3RyWzBdPj0nYScgJiYgc3RyWzBdPD0neicgJiYKKwkgICAgYXJnWzBdPj0nYScgJiYgYXJnWzBdPD0neicpCisJeworCSAgaWYgKGZpcnN0KQorCSAgICByZXR1cm4gMDsKKwkgIGVsc2UKKwkgIHsKKwkgICAgcHJpbnRmKCJDb3VsZG4ndCBwYXJzZTogJU8uXG4iLHN0cik7CisJICAgIHJldHVybiAxOworCSAgfQorCX0KKwlhcmc9c3RyaXAoYXJnKTsKKwlzdHI9Y2FsbF9vdGhlcih0aGlzX29iamVjdCgpLGZ1bmN0aW9uc1tpXSxhcmcpOworCWZpcnN0PTA7CisJaWYgKG9sZF9zdGFjaykKKwl7CisJICBzdGFjaz1vbGRfc3RhY2s7CisJICBvbGRfc3RhY2s9MDsKKwl9CisJaWYgKHN0cmluZ3AoZXJyKSkKKwl7CisJICBpZiAoc3NjYW5mKGVyciwiJXNcbiIsdG1wKT09MSkKKwkgICAgZXJyID0gdG1wOworCSAgbm90aWZ5X2ZhaWwoc3ByaW50ZigiRVJST1I6ICVPLlxuIixlcnIpKTsKKwkgIHJldHVybiAwOworCX0KKwlmbGFnPTE7CisJYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmICghZmxhZykKKyAgICB7CisgICAgICBub3RpZnlfZmFpbChzcHJpbnRmKCJDb3VsZG4ndCBwYXJzZTogJU8uXG4iLHN0cikpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisgIHJldHVybiAxOworfQorCitpbnQgcHVzaChvYmplY3Qgb2IpCit7CisgIHN0YWNrKz0oe29ifSk7CisgIGlmIChzaXplb2Yoc3RhY2spPk1BWFNUQUNLKQorICAgIHN0YWNrPXN0YWNrWzEuLk1BWFNUQUNLXTsKKyAgcmV0dXJuIDE7Cit9CisKK21peGVkIHBvcCgpCit7CisgIG9iamVjdCB0bXA7CisgIGlmICghc2l6ZW9mKHN0YWNrKSkKKyAgeworICAgIGVycj0ic3RhY2sgdW5kZXJmbG93IjsKKyAgICB0bXA9dGhpc19vYmplY3QoKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICB0bXA9c3RhY2tbc2l6ZW9mKHN0YWNrKS0xXTsKKyAgc3RhY2s9c3RhY2tbMC4uPDJdOworICBpZiAoIXRtcCkKKyAgICBlcnI9Im9wZXJhdGluZyBvbiBkZXN0cnVjdGVkIG9iamVjdCI7CisgIHJldHVybiB0bXA7Cit9CisKK21peGVkIHhwb3Aoc3RyaW5nIGFyZykKK3sKKyAgaWYgKCFwb3AoKSkKKyAgICBlcnI9MDsKKyAgcmV0dXJuIGFyZzsKK30KKworbWl4ZWQgdG9nZ2xlX3Nob3J0KHN0cmluZyBhcmcpCit7CisgIGhpZGVfc2hvcnQgPSAhaGlkZV9zaG9ydDsKKyAgaWYgKGhpZGVfc2hvcnQpCisgICAgd3JpdGUoIlNob3J0IGRlc2NyaXB0aW9ucyBvZmYuXG4iKTsKKyAgZWxzZQorICAgIHdyaXRlKCJTaG9ydCBkZXNjcmlwdGlvbnMgb24uXG4iKTsKKyAgcmV0dXJuIGFyZzsKK30KKworbWl4ZWQgcGwoc3RyaW5nIGFyZykKK3sKKyAgc3RyaW5nIHdobyxyZXN0OworICBvYmplY3QgcDsKKyAgd2hvPWdldGFyZyhhcmcpOworICByZXN0PWdldHJlc3QoYXJnKTsKKyAgaWYgKGVycikgcmV0dXJuIDA7CisgIHA9bWF0Y2hfbGl2aW5nKHdobywxKTsKKyAgaWYgKCFzdHJpbmdwKHApKQorICB7CisgICAgaWYgKCFwPWZpbmRfbmV0ZGVhZCh3aG8pKQorICAgICAgZXJyPSJwbGF5ZXIgIit3aG8rIiBub3QgZm91bmQiOworICAgIGVsc2UgCisgICAgICBwdXNoKHApOworICB9CisgIGVsc2UKKyAgICBwdXNoKGZpbmRfcGxheWVyKHApKTsKKyAgcmV0dXJuIHJlc3Q7Cit9CisKK21peGVkIGx2KHN0cmluZyBhcmcpCit7CisgIHN0cmluZyB3aG8scmVzdDsKKyAgb2JqZWN0IHA7CisgIHdobz1nZXRhcmcoYXJnKTsKKyAgcmVzdD1nZXRyZXN0KGFyZyk7CisgIGlmIChlcnIpIHJldHVybiAwOworICBwPWZpbmRfbGl2aW5nKHdobyk7CisgIGlmICghcCkKKyAgICBlcnI9ImxpdmluZyBvYmplY3QgIit3aG8rIiBub3QgZm91bmQiOworICBlbHNlCisgICAgcHVzaChwKTsKKyAgcmV0dXJuIHJlc3Q7Cit9CisKK3N0cmluZyBtZShzdHJpbmcgYXJnKQoreworICBwdXNoKHRoaXNfcGxheWVyKCkpOworICByZXR1cm4gYXJnOworfQorCitzdHJpbmcgbWFrZV9wYXRoKHN0cmluZyBwYXRoKQoreworICByZXR1cm4gInNlY3VyZS9tYXN0ZXIiLT5fZ2V0X3BhdGgoIHBhdGgsIGdldGV1aWQoIHRoaXNfcGxheWVyKCkgKSApOworfQorCitzdHJpbmcgbmV3KHN0cmluZyBhcmcpCit7CisgIHN0cmluZyB3aGF0LHJlc3QsZmlsZTsKKyAgb2JqZWN0IG9iOworICB3aGF0PWdldGFyZyhhcmcpOworICByZXN0PWdldHJlc3QoYXJnKTsKKyAgZmlsZT1tYWtlX3BhdGgod2hhdCk7CisgIGVycj1jYXRjaChvYj1jbG9uZV9vYmplY3QoZmlsZSkpOworICBpZiAoIWVycikKKyAgeworICAgIHB1c2gob2IpOworICAgIG9iLT5tb3ZlKHRoaXNfcGxheWVyKCksTV9OT0NIRUNLKTsKKyAgICB3cml0ZSgiQ3JlYXRlZCAiK2Rlc2Mob2IpKyIuXG4iKTsKKyAgfQorICBlbHNlCisgICAgZXJyID0gInVuYWJsZSB0byBjcmVhdGUgb2JqZWN0LCBjYXVzZSA6ICIrZXJyOworICByZXR1cm4gcmVzdDsKK30KKworc3RhdGljIHN0cmluZyBjcmVhdChzdHJpbmcgYXJnKQoreworICBzdHJpbmcgd2hhdCxyZXN0LGZpbGU7CisgIG9iamVjdCBvYjsKKyAgd2hhdD1nZXRhcmcoYXJnKTsKKyAgcmVzdD1nZXRyZXN0KGFyZyk7CisgIGZpbGU9bWFrZV9wYXRoKHdoYXQpOworICBlcnI9Y2F0Y2gob2I9Y2xvbmVfb2JqZWN0KGZpbGUpKTsKKyAgaWYgKCFlcnIpCisgIHsKKyAgICBwdXNoKG9iKTsKKyAgICB3cml0ZSgiQ3JlYXRlZCAiK2Rlc2Mob2IpKyIuXG4iKTsKKyAgfQorICBlbHNlCisgICAgZXJyID0gInVuYWJsZSB0byBjcmVhdGUgb2JqZWN0LCBjYXVzZSA6ICIrZXJyOworICByZXR1cm4gcmVzdDsKK30KKworc3RyaW5nIHhwdXNoKHN0cmluZyBhcmcpCit7CisgIHN0cmluZyByZXN0LHdoYXQ7CisgIG9iamVjdCBvYjsKKworICB3aGF0PWdldGFyZyhhcmcpOworICByZXN0PWdldHJlc3QoYXJnKTsKKyAgb2IgPSBmaW5kX29iamVjdCh3aGF0KTsKKyAgaWYgKCFvYikKKyAgICBlcnI9Ik9iamVjdCAiK3doYXQrIiBub3QgZm91bmQhXG4iOworICBlbHNlCisgICAgcHVzaChvYik7CisgIHJldHVybiByZXN0OworfQorCitzdGF0aWMgc3RyaW5nIG9iKHN0cmluZyBhcmcpCit7CisgIHN0cmluZyB3aGF0LHJlc3QsZmlsZSx0bXA7CisgIG9iamVjdCBvYjsKKyAgd2hhdD1nZXRhcmcoYXJnKTsKKyAgcmVzdD1nZXRyZXN0KGFyZyk7CisgIGZpbGU9bWFrZV9wYXRoKHdoYXQpOworeworICBvYj1maW5kX29iamVjdChmaWxlKTsKKyAgaWYgKCFvYikKKyAgeworICAgIHRtcCA9IGNhdGNoKGNhbGxfb3RoZXIoZmlsZSwiPz8iKSk7CisgICAgaWYgKCFlcnIpCisgICAgICBvYiA9IGZpbmRfb2JqZWN0KGZpbGUpOworICB9Cit9CitpZiAoIW9iKQoreworICBlcnI9Im9iamVjdCAiK2ZpbGUrIiBub3QgZm91bmQiOworICBpZiAodG1wKQorICAgIGVyciArPSAiKCIrdG1wKyIpIjsKK30KK2Vsc2UKK3B1c2gob2IpOworcmV0dXJuIHJlc3Q7Cit9CisKK3N0cmluZyBmaWxlKHN0cmluZyBhcmcpCit7CisgIHJldHVybiBvYigiLyIrYXJnKTsKK30KKworc3RyaW5nIGZpbGUyKHN0cmluZyBhcmcpCit7CisgIHJldHVybiBvYigifiIrYXJnKTsKK30KKworc3RyaW5nIHNlbChzdHJpbmcgYXJnKQoreworICBzdHJpbmcgcmVzdDttaXhlZCB3aGF0OworICBvYmplY3Qgb2IscDsKKyAgb2I9cG9wKCk7CisgIGlmIChlcnIpIHJldHVybiBhcmc7CisgIGlmIChzc2NhbmYoYXJnLCIlZCVzIix3aGF0LHJlc3QpPT0yKQorICB7CisgICAgaWYgKHdoYXQ8PTApCisgICAgeworICAgICAgZXJyPSJuZWdhdGl2ZSBpbmRleCI7CisgICAgICBwdXNoKG9iKTsKKyAgICAgIHJldHVybiBhcmc7CisgICAgfQorICAgIHdoYXQtLTsKKyAgICBwPWZpcnN0X2ludmVudG9yeShvYik7CisgICAgd2hpbGUgKHAgJiYgd2hhdCkKKyAgICB7CisgICAgICBwPW5leHRfaW52ZW50b3J5KHApOworICAgICAgd2hhdC0tOworICAgIH0KKyAgICBpZiAoIXApCisgICAgeworICAgICAgZXJyPSJpbmRleCB0byBsYXJnZSI7CisgICAgICBwdXNoKG9iKTsKKyAgICAgIHJldHVybiBhcmc7CisgICAgfQorICAgIHB1c2gocCk7CisgICAgcmV0dXJuIHJlc3Q7CisgIH0KKyAgd2hhdD1nZXRhcmcoYXJnKTsKKyAgcmVzdD1nZXRyZXN0KGFyZyk7CisgIHA9cHJlc2VudCh3aGF0LG9iKTsKKyAgaWYgKHApCisgICAgcHVzaChwKTsKKyAgZWxzZQorICB7CisgICAgcHVzaChvYik7CisgICAgZXJyPXdoYXQrIiBub3QgcHJlc2VudCBpbiAiK2Rlc2Mob2IpOworICB9CisgIHJldHVybiByZXN0OworfQorCitzdHJpbmcgaGVyZShzdHJpbmcgYXJnKQoreworICBwdXNoKGVudmlyb25tZW50KHRoaXNfcGxheWVyKCkpKTsKKyAgcmV0dXJuIGFyZzsKK30KKworc3RyaW5nIGVudihzdHJpbmcgYXJnKQoreworICBvYmplY3Qgb2I7CisgIG9iPXBvcCgpOworICBpZiAoIWVycikKKyAgeworICAgIGlmICghZW52aXJvbm1lbnQob2IpKQorICAgICAgZXJyPWRlc2Mob2IpKyIgaGFzIG5vIGVudmlyb25tZW50IjsKKyAgICBlbHNlCisgICAgICBwdXNoKGVudmlyb25tZW50KG9iKSk7CisgIH0KKyAgcmV0dXJuIGFyZzsKK30KKworc3RyaW5nIGR1cChzdHJpbmcgYXJnKQoreworICBvYmplY3QgdG9zOworICB0b3M9cG9wKCk7CisgIGlmICghZXJyKQorICB7CisgICAgcHVzaCh0b3MpOworICAgIHB1c2godG9zKTsKKyAgfQorICByZXR1cm4gYXJnOworfQorCitzdHJpbmcgc3dhcChzdHJpbmcgYXJnKQoreworICBvYmplY3QgdG9zOworICBpbnQgc3RzOworCisgIGlmICgoc3RzPXNpemVvZihzdGFjaykpPDIpCisgIHsKKyAgICBlcnI9InN0YWNrIHVuZGVyZmxvdyI7CisgICAgcmV0dXJuIGFyZzsKKyAgfQorICB0b3M9c3RhY2tbc3RzLTFdOworICBzdGFja1tzdHMtMV09c3RhY2tbc3RzLTJdOworICBzdGFja1tzdHMtMl09dG9zOworICByZXR1cm4gYXJnOworfQorCitzdHJpbmcgb3ZlcihzdHJpbmcgYXJnKQoreworICBvYmplY3Qgb2I7CisgIGlmIChzaXplb2Yoc3RhY2spPDIpCisgIHsKKyAgICBlcnI9InN0YWNrIHVuZGVyZmxvdyI7CisgICAgcmV0dXJuIGFyZzsKKyAgfQorICBwdXNoKHN0YWNrW3NpemVvZihzdGFjayktMl0pOworICByZXR1cm4gYXJnOworfQorCitzdHJpbmcgcGljayhzdHJpbmcgYXJnKQoreworICBzdHJpbmcgcmVzdDsKKyAgaW50IG5vOworICBpZiAoc3NjYW5mKGFyZywiJWQlcyIsbm8scmVzdCkhPTIgfHwgbm88MCB8fCBubz49c2l6ZW9mKHN0YWNrKSkKKyAgeworICAgIGVycj0ic3RhY2sgc2l6ZSBleGNlZWRlZCI7CisgICAgcmV0dXJuIGFyZzsKKyAgfQorICBlbHNlCisgICAgcHVzaChzdGFja1tzaXplb2Yoc3RhY2spLW5vLTFdKTsKKyAgcmV0dXJuIHJlc3Q7Cit9CisKK3N0cmluZyBzdHJpbmdfZGVzYyhzdHJpbmcgc3RyKQoreworICBzdHJpbmcgb3V0OworICBvdXQgPSBpbXBsb2RlKG9sZF9leHBsb2RlKHN0ciwiXFwiKSwiXFxcXCIpOworICBvdXQgPSBpbXBsb2RlKG9sZF9leHBsb2RlKG91dCwiXG4iKSwiXFxuIik7CisgIG91dCA9IGltcGxvZGUob2xkX2V4cGxvZGUob3V0LCJcIiIpLCJcXFwiIik7CisgIHJldHVybiAiXCIiK291dCsiXCIiOworfQorCittaXhlZCByZWNfZGVzYyhtaXhlZCBvYikKK3sKKyAgaWYgKGludHAob2IpKQorICAgIHJldHVybiAiIitvYjsKKyAgaWYgKHN0cmluZ3Aob2IpKQorICAgIHJldHVybiBzdHJpbmdfZGVzYygoc3RyaW5nKW9iKTsKKyAgaWYgKG9iamVjdHAob2IpKQorICAgIHJldHVybiAiT0JKKCIrb2JqZWN0X25hbWUob2IpKyIpIjsKKyAgaWYgKCFwb2ludGVycChvYikpCisgICAgcmV0dXJuIHNwcmludGYoIiVPIixvYik7CisgIHJldHVybiAiKHsgIitpbXBsb2RlKG1hcChvYiwicmVjX2Rlc2MiLHRoaXNfb2JqZWN0KCkpLCIsICIpKyIgfSkiOworfQorCitzdHJpbmcgYXJyYXlfZGVzYyhtaXhlZCBhcnIpCit7CisgIHN0cmluZyBzdHIsbGluZSxyZXM7CisgIG1peGVkIHRtcDsKKyAgaW50IGksajsKKyAgc3RyPXJlY19kZXNjKGFycik7CisgIGlmIChzaXplb2Yoc3RyKTw9TUFYTElORUxFTi00KQorICAgIHJldHVybiAiLS0+ICIrc3RyKyJcbiI7CisgIHRtcD1vbGRfZXhwbG9kZShzdHIsIiAiKTsKKyAgcmVzPSIiOworICBsaW5lcz0wOworICBpPTE7CisgIGxpbmU9Ii0tPiAiK3RtcFswXSsiICI7CisgIGZvciAoOzspCisgIHsKKyAgICB3aGlsZSAoaTxzaXplb2YodG1wKSAmJiBzaXplb2YobGluZSkrc2l6ZW9mKHRtcFtpXSsxKTw9TUFYTElORUxFTi0xKQorICAgIHsKKyAgICAgIGxpbmUrPXRtcFtpXSsiICI7CisgICAgICBpKys7CisgICAgfQorICAgIGlmIChzaXplb2YobGluZSk9PTApCisgICAgeworICAgICAgbGluZT10bXBbaV0rIiAiOworICAgICAgaSsrOworICAgIH0KKyAgICBpZiAoaTxzaXplb2YodG1wKSkKKyAgICAgIGxpbmUrPSJ8XG4iOworICAgIGVsc2UKKyAgICAgIGxpbmUrPSJcbiI7CisgICAgcmVzKz1saW5lOworICAgIGxpbmVzKys7CisgICAgaWYgKGxpbmVzPj1NQVhMSU5FUykKKyAgICAgIHJldHVybiByZXMrIioqKiBUUlVOQ0FURUQgKioqXG4iOworICAgIGlmIChpPj1zaXplb2YodG1wKSkKKyAgICAgIHJldHVybiByZXM7CisgICAgbGluZT0iIjsKKyAgfQorICByZXR1cm4oMCk7IC8vIG5vbi12b2lkLCBaZXNzdHJhIChuZXZlciByZWFjaGVkKQorfQorCitzdHJpbmcgZGVzYyhvYmplY3Qgb2IpCit7CisgIGlmICghb2IpCisgICAgcmV0dXJuICI8ZGVzdHJ1Y3RlZCBvYmplY3Q+IjsKKyAgaWYgKCFvYmplY3RwKG9iKSkKKyAgICByZXR1cm4gIjxjb3JydXB0ZWQgc3RhY2sgZW50cnk+IjsKKyAgaWYgKHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2IpKQorICAgIHJldHVybiBvYmplY3RfbmFtZShvYikrIiAiK2NhcGl0YWxpemUoZ2V0ZXVpZChvYikpOworICBpZiAoIWhpZGVfc2hvcnQgJiYgb2ItPnNob3J0KCkpCisgICAgcmV0dXJuIG9iamVjdF9uYW1lKG9iKSsiICIrb2ItPm5hbWUoKTsKKyAgZWxzZQorICAgIHJldHVybiBvYmplY3RfbmFtZShvYik7Cit9CisKK3N0cmluZyBzdGsoc3RyaW5nIGFyZykKK3sKKyAgaW50IGksc3RzOworICBpZiAoIShzdHM9c2l6ZW9mKHN0YWNrKSkpCisgICAgd3JpdGUgKCI8ZW1wdHkgc3RhY2s+XG4iKTsKKyAgZWxzZQorICAgIGZvciAoaT0xO2k8PXN0cztpKyspCisgICAgeworICAgICAgd3JpdGUoIkAiKyhpLTEpKyI6ICIrZGVzYyhzdGFja1tzdHMtaV0pKyJcbiIpOworICAgIH0KKyAgcmV0dXJuIGFyZzsKK30KKworc3RyaW5nIGNscihzdHJpbmcgYXJnKQoreworICBzdGFjaz0oe30pOworICByZXR1cm4gYXJnOworfQorCitzdHJpbmcgZHVtcChzdHJpbmcgYXJnKQoreworICBvYmplY3Qgb2I7CisgIHN0cmluZyBzOworICBvYj1wb3AoKTsKKyAgaWYgKGVycikgcmV0dXJuIGFyZzsKKyAgcHVzaChvYik7CisgIHdyaXRlKCJGSUxFTkFNRTogIitvYmplY3RfbmFtZShvYikrIiAiKTsKKyAgaWYgKCFoaWRlX3Nob3J0ICYmIChzPW9iLT5zaG9ydCgpKSkKKyAgICB3cml0ZSgiIFNIT1JUOiAiK29iLT5uYW1lKCkpOworICB3cml0ZSgiXG4iKTsKKyAgcmV0dXJuIGFyZzsKK30KKworc3RyaW5nIGluZm8oc3RyaW5nIGFyZykKK3sKKyAgb2JqZWN0IG9iOworICBtaXhlZCBzOworICBpbnQgaTsKKyAgb2I9cG9wKCk7CisgIGlmIChlcnIpIHJldHVybiBhcmc7CisgIHdyaXRlKCJGSUxFTkFNRTogIitvYmplY3RfbmFtZShvYikrIiAiKTsKKyAgaWYgKHM9b2ItPnNob3J0KCkpCisgICAgd3JpdGUoIiBTSE9SVDogIitvYi0+bmFtZSgpKTsKKyAgd3JpdGUoIlxuIik7CisgIGlmIChnZXR1aWQob2IpKQorICAgIHdyaXRlKCJDUkVBVE9SOiAiK2dldHVpZChvYikrIlxuIik7CisgIGlmIChzPXF1ZXJ5X2lwX251bWJlcihvYikpCisgIHsKKyAgICB3cml0ZSgiSVAtTlVNQkVSOiAiK3MrIiBJUC1OQU1FOiAiK3F1ZXJ5X2lwX25hbWUob2IpKyIgSURMRTogIgorCSAgKyBxdWVyeV9pZGxlKG9iKSsiXG4iKTsKKyAgfQorICBpZiAocz1xdWVyeV9zbm9vcChvYikpCisgICAgd3JpdGUoIlNOT09QRUQgQlk6ICIrcy0+cXVlcnlfcmVhbF9uYW1lKCkrIlxuIik7CisgIHM9IiI7CisgIGlmIChsaXZpbmcob2IpKQorICAgIHMgKz0ibGl2aW5nICI7CisgIGlmIChvYi0+cXVlcnlfbnBjKCkpCisgICAgcys9Im5wYyAiOworICBpZiAob2ItPnF1ZXJ5X2dlbmRlcl9zdHJpbmcoKSkKKyAgICBzKz1vYi0+cXVlcnlfZ2VuZGVyX3N0cmluZygpOworICBpZiAocyE9IiIpCisgICAgd3JpdGUoIkZMQUdTOiAiK3MrIlxuIik7CisgIC8vICB3cml0ZSgiTE9ORzpcbiIpOworICAvLyAgaWYgKHN0cmluZ3Aocz1vYi0+bG9uZygpKSkKKyAgLy8gICAgd3JpdGUocyk7CisgIC8vICB3cml0ZSgiXG4iKTsKKyAgZm9yIChpPTA7aTxzaXplb2YocXVlcnlfbGlzdCk7aSs9MikKKyAgeworICAgIGlmIChxdWVyeV9saXN0W2krMV1bMF09PSctJykKKyAgICAgIHM9b2ItPlF1ZXJ5UHJvcChxdWVyeV9saXN0W2krMV1bMS4uXSk7CisgICAgZWxzZQorICAgICAgcz1jYWxsX290aGVyKG9iLHF1ZXJ5X2xpc3RbaSsxXSk7CisgICAgaWYgKHMpCisgICAgeworICAgICAgcHJpbnRmKCIlczogJU9cbiIscXVlcnlfbGlzdFtpXSxzKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGFyZzsKK30KKworc3RyaW5nIGZpbGxlcihpbnQgbikKK3sKKyAgc3RyaW5nIHM7CisgIGlmICghcmVjdXJzaXZlKSByZXR1cm4gIjogIjsKKyAgcz0iOiAiOworICB3aGlsZSAoKytuPE1BWERFUFRIKQorICAgIHM9IiAgIitzOworICByZXR1cm4gczsKK30KKwordm9pZCBsaXN0aW52KG9iamVjdCBvYixpbnQgZGVwdGgsc3RyaW5nIHByZWZpeCkKK3sKKyAgaW50IGk7CisgIG9iamVjdCBwOworICBpZiAoZGVwdGg8TUFYREVQVEgpCisgIHsKKyAgICBwPWZpcnN0X2ludmVudG9yeShvYik7CisgICAgaT0xOworICAgIGlmIChwKQorICAgIHsKKyAgICAgIHdoaWxlIChwKQorICAgICAgeworCWlmIChsaW5lcz5sYXN0bGluZSkgcmV0dXJuOworCWlmIChsaW5lcz49Zmlyc3RsaW5lKQorCSAgd3JpdGUocHJlZml4KyIuIitpK2ZpbGxlcihkZXB0aCkrZGVzYyhwKSsiXG4iKTsKKwlsaW5lcysrOworCWlmIChsaW5lcz09bGFzdGxpbmUrMSAmJiBuZXh0X2ludmVudG9yeShwKSkKKwkgIHdyaXRlKCIqKiogVFJVTkNBVEVEICoqKlxuIik7CisJaWYgKHJlY3Vyc2l2ZSkKKwkgIGxpc3RpbnYocCxkZXB0aCsxLHByZWZpeCsiLiIraSk7CisJaSsrOworCXA9bmV4dF9pbnZlbnRvcnkocCk7CisgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgIGlmICghZGVwdGgpCisJd3JpdGUoIjxlbXB0eSBpbnZlbnRvcnk+XG4iKTsKKyAgfQorfQorCitzdHJpbmcgaW52KHN0cmluZyBhcmcpCit7CisgIG9iamVjdCBvYjsKKyAgc3RyaW5nIHJlc3Q7CisgIGludCB0bXA7CisgIG9iPXBvcCgpOworICBsaW5lcz0xOworICBmaXJzdGxpbmU9MTsKKyAgbGFzdGxpbmU9TUFYTElORVM7CisgIGlmICghZXJyKQorICB7CisgICAgaWYgKHNzY2FuZihhcmcsIjolZCVzIix0bXAscmVzdCk9PTIpCisgICAgeworICAgICAgZmlyc3RsaW5lPXRtcDsKKyAgICAgIGxhc3RsaW5lPXRtcCtNQVhMSU5FUy0xOworICAgICAgYXJnID0gcmVzdDsKKyAgICAgIGlmIChzc2NhbmYoYXJnLCI6JWQlcyIsdG1wLHJlc3QpPT0yKQorICAgICAgeworCWxhc3RsaW5lPXRtcDsKKwlpZiAobGFzdGxpbmU8Zmlyc3RsaW5lKQorCSAgZXJyID0gImZpcnN0IGxpbmUgPiBsYXN0IGxpbmUiOworCWFyZz1yZXN0OworICAgICAgfQorICAgIH0KKyAgICBwdXNoKG9iKTsKKyAgICBsaXN0aW52KG9iLDAsIiIpOworICB9CisgIHJlY3Vyc2l2ZT0wOworICByZXR1cm4gYXJnOworfQorCitvYmplY3QgY2FsbF9yZXN1bHQ7CisKK3N0cmluZyBjYWxsKHN0cmluZyBhcmcpCit7CisgIHN0cmluZyBmdW5jLGFyZ3M7CisgIGludCB0ZW1wLGk7CisgIHN0cmluZyByZXN0LHRtcDsKKworICBvYmplY3Qgb2I7CisgIG9iPXBvcCgpOworICBpZiAoZXJyKSByZXR1cm4gYXJnOworICBwdXNoKG9iKTsKKyAgZnVuYz1nZXRhcmcoYXJnKTsKKyAgYXJncz1nZXRyZXN0KGFyZyk7CisgIGlmIChlcnIpIHJldHVybiBhcmdzOworICBhcmd2PSh7fSk7CisgIGk9MDsKKyAgd2hpbGUgKDEpCisgIHsKKyAgICBhcmdzPXN0cmlwKGFyZ3MpOworICAgIGlmIChzc2NhbmYoYXJncywiXSVzIixyZXN0KSkKKyAgICAgIGJyZWFrOworICAgIGlmIChzc2NhbmYoYXJncywiJWQlcyIsdG1wLHJlc3QpPT0yKQorICAgIHsKKyAgICAgIGFyZ3M9cmVzdDsKKyAgICAgIGFyZ3YrPSh7dG1wfSk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgaWYgKHNzY2FuZihhcmdzLCJcIiVzXCIlcyIsdG1wLHJlc3QpPT0yIHx8CisJc3NjYW5mKGFyZ3MsIlwnJXNcJyVzIix0bXAscmVzdCk9PTIgfHwKKwlzc2NhbmYoYXJncywifCVzfCVzIix0bXAscmVzdCk9PTIpCisgICAgeworICAgICAgYXJncz1yZXN0OworICAgICAgYXJndis9KHt0bXB9KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyAgICBpZiAoc3NjYW5mKGFyZ3MsIkAlZCVzIix0ZW1wLHJlc3QpPT0yKQorICAgIHsKKyAgICAgIGlmICh0ZW1wPDAgfHwgdGVtcD49c2l6ZW9mKHN0YWNrKSkKKyAgICAgIHsKKwllcnI9InN0YWNraW5kZXggb3V0IG9mIHJhbmdlIjsKKwlyZXR1cm4gYXJnczsKKyAgICAgIH0KKyAgICAgIGFyZ3YrPSh7c3RhY2tbc2l6ZW9mKHN0YWNrKS10ZW1wLTFdfSk7CisgICAgICBhcmdzPXJlc3Q7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgdG1wPWdldGFyZyhhcmdzKTsKKyAgICByZXN0PWdldHJlc3QoYXJncyk7CisgICAgYXJndis9KHt0bXB9KTsKKyAgICBpZiAodG1wIT0iIikKKyAgICB7CisgICAgICBhcmdzPXJlc3Q7CisgICAgICBjb250aW51ZTsKKyAgICB9CisgICAgZXJyPSJiYWQgYXJndW1lbnQgdG8gW10iOworICAgIHJldHVybiBhcmdzOworICB9CisgIGlmIChzc2NhbmYoYXJncywiXSVzIixyZXN0KSE9MSkKKyAgeworICAgIGVycj0idG9vIG1hbnkgb3IgdW50ZXJtaW5hdGVkIGFyZ3VtZW50KHMpIjsKKyAgICByZXR1cm4gYXJnczsKKyAgfQorICBjYWxsX3Jlc3VsdD1hcHBseSgjJ2NhbGxfb3RoZXIsb2IsZnVuYyxhcmd2KTsKKyAgLy8nCisgIC8vICBpZiAob2JqZWN0cChjYWxsX3Jlc3VsdCkpCisgIC8vICAgIHdyaXRlKCItLT4gIitkZXNjKGNhbGxfcmVzdWx0KSsiXG4iKTsKKyAgLy8gIGVsc2UgaWYgKHBvaW50ZXJwKGNhbGxfcmVzdWx0KSkKKyAgLy8gICAgd3JpdGUoYXJyYXlfZGVzYyhjYWxsX3Jlc3VsdCkpOworICAvLyAgZWxzZQorICAvLyAgICB3cml0ZSgiLS0+ICIrY2FsbF9yZXN1bHQrIlxuIik7CisgIHByaW50ZigiLS0+ICVPXG4iLGNhbGxfcmVzdWx0KTsKKyAgcG9wKCk7CisgIGFyZ3Y9KHt9KTsKKyAgcmV0dXJuIHJlc3Q7Cit9CisKK3N0cmluZyByZXN1bHQoc3RyaW5nIGFyZykKK3sKKyAgaWYgKG9iamVjdHAoY2FsbF9yZXN1bHQpKQorICAgIHB1c2goY2FsbF9yZXN1bHQpOworICBlbHNlCisgICAgZXJyPSJjYWxsIHJldHVybmVkIG5vIG9iamVjdCI7CisgIHJldHVybiBhcmc7Cit9CisKK2ludCBkZXN0cm95YWJsZShvYmplY3Qgb2IpCit7CisgIGlmICghb2IpCisgICAgcmV0dXJuIDA7CisgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKG9iPT10aGlzX29iamVjdCgpKQorICAgIHJldHVybiAwOworICByZXR1cm4gMTsKK30KKworc3RyaW5nIGNsbihzdHJpbmcgYXJnKQoreworICBvYmplY3Qgb2I7CisgIG9iPXBvcCgpOworICBpZiAoIWVycikKKyAgeworICAgIGNsZWFuKG9iKTsKKyAgICB3cml0ZShkZXNjKG9iKSsiIGNsZWFuZWQgdXAuXG4iKTsKKyAgfQorICByZWN1cnNpdmU9MDsKKyAgcmV0dXJuIGFyZzsKK30KKworc3RyaW5nIGNsbm9mKHN0cmluZyBhcmcpCit7CisgIG9iamVjdCBvYjsKKyAgaW50IHJlY3NhdmU7CisgIHN0cmluZyBuYW1lLHJlc3Q7CisKKyAgd3JpdGUoIkNsbk9mIik7CisgIHJlY3NhdmU9cmVjdXJzaXZlOworICByZWN1cnNpdmU9MDsKKyAgb2I9cG9wKCk7CisgIGlmIChlcnIpIHJldHVybiBhcmc7CisgIG5hbWU9Z2V0YXJnKGFyZyk7CisgIHJlc3Q9Z2V0cmVzdChhcmcpOworICBpZiAoZXJyKSByZXR1cm4gYXJnOworICByZWN1cnNpdmU9cmVjc2F2ZTsKKyAgY2xlYW5vZihuYW1lLG9iKTsKKyAgcmVjdXJzaXZlPTA7CisgIHJldHVybiByZXN0OworfQorCit2b2lkIFJlbW92ZShvYmplY3Qgb2IsaW50IGEpCit7CisgIGlmICghb2JqZWN0cChvYikpIHJldHVybjsKKyAgaWYgKCFhKQorICB7CisgICAgcHJpbnRmKCJSZW1vdmluZyAlTyIsb2IpOworICAgIGlmICghaGlkZV9zaG9ydCkgcHJpbnRmKCIgJU8iLG9iLT5uYW1lKCkpOworICB9CisgIGNhdGNoKG9iLT5yZW1vdmUoKSk7CisgIGlmIChvYikKKyAgeworICAgIGlmICghYSkgcHJpbnRmKCIgSEFSRCIpOworICAgIGRlc3RydWN0KG9iKTsKKyAgfQorICB3cml0ZSgiXG4iKTsKK30KKwordm9pZCBjbGVhbihvYmplY3Qgb2IpCit7CisgIG9iamVjdCBwLHAyOworICBwPWZpcnN0X2ludmVudG9yeShvYik7CisgIHdoaWxlIChkZXN0cm95YWJsZShwKSkKKyAgeworICAgIGlmIChyZWN1cnNpdmUpIGNsZWFuKHApOworICAgIFJlbW92ZShwLDApOworICAgIHA9Zmlyc3RfaW52ZW50b3J5KG9iKTsKKyAgfQorICB3aGlsZSAocCkKKyAgeworICAgIHAyPW5leHRfaW52ZW50b3J5KHApOworICAgIGlmIChkZXN0cm95YWJsZShwMikpCisgICAgeworICAgICAgaWYgKHJlY3Vyc2l2ZSkgY2xlYW4ocDIpOworICAgICAgUmVtb3ZlKHAyLDApOworICAgIH0KKyAgICBlbHNlCisgICAgICBwPXAyOworICB9Cit9CisKKyB2b2lkIGNsZWFub2Yoc3RyaW5nIHN0cixvYmplY3Qgb2IpCit7CisgIG9iamVjdCBwLHAyOworICBwPWZpcnN0X2ludmVudG9yeShvYik7CisgIHdoaWxlIChwICYmIHAtPmlkKHN0cikgJiYgZGVzdHJveWFibGUocCkpCisgIHsKKyAgICBpZiAocmVjdXJzaXZlKSBjbGVhbihwKTsKKyAgICBSZW1vdmUocCwwKTsKKyAgICBwPWZpcnN0X2ludmVudG9yeShvYik7CisgIH0KKyAgd2hpbGUgKHApCisgIHsKKyAgICBwMj1uZXh0X2ludmVudG9yeShwKTsKKyAgICBpZiAocDIgJiYgcDItPmlkKHN0cikgJiYgZGVzdHJveWFibGUocDIpKQorICAgIHsKKyAgICAgIGlmIChyZWN1cnNpdmUpIGNsZWFuKHAyKTsKKyAgICAgIFJlbW92ZShwMiwwKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgcD1wMjsKKyAgfQorfQorCitzdHJpbmcgZGVzdChzdHJpbmcgYXJnKQoreworICBvYmplY3Qgb2I7CisgIG9iPXBvcCgpOworICBpZiAoZXJyKSByZXR1cm4gYXJnOworICBpZiAoIWRlc3Ryb3lhYmxlKG9iKSkKKyAgeworICAgIGVycj1kZXNjKG9iKSsiIG11c3Qgbm90IGJlIGRlc3Ryb3llZCI7CisgICAgcmV0dXJuIGFyZzsKKyAgfQorICBSZW1vdmUob2IsMCk7CisgIHJldHVybiBhcmc7Cit9CisKK21peGVkIGRpc2NvKHN0cmluZyBhcmcpCit7CisgIG9iamVjdCBvYjsKKworICBvYj1wb3AoKTsKKyAgaWYgKGVycikgcmV0dXJuIGFyZzsKKyAgaWYgKCFpbnRlcmFjdGl2ZShvYikpCisgIHsKKyAgICBlcnI9ZGVzYyhvYikrIiBpcyBub3QgaW50ZXJhY3RpdmUiOworICAgIHJldHVybiAxOworICB9CisgIHJlbW92ZV9pbnRlcmFjdGl2ZShvYik7CisgIHJldHVybiBhcmc7Cit9CisKK3N0cmluZyBEZXN0KHN0cmluZyBhcmcpCit7CisgIG9iamVjdCBvYjsKKyAgb2I9cG9wKCk7CisgIGlmIChlcnIpIHJldHVybiBhcmc7CisgIGlmICghZGVzdHJveWFibGUob2IpKQorICB7CisgICAgZXJyPWRlc2Mob2IpKyIgbXVzdCBub3QgYmUgZGVzdHJveWVkIjsKKyAgICByZXR1cm4gYXJnOworICB9CisgIGRlc3RydWN0KCBvYiApOworICByZXR1cm4gYXJnOworfQorCitzdHJpbmcgbXYoc3RyaW5nIGFyZykKK3sKKyAgb2JqZWN0IGZyb20sdG87CisgIHRvPXBvcCgpOworICBpZiAoZXJyKSByZXR1cm4gYXJnOworICBmcm9tPXBvcCgpOworICBpZiAoZXJyKSByZXR1cm4gYXJnOworICBmcm9tLT5tb3ZlKHRvLE1fTk9DSEVDSyk7CisgIHdyaXRlKCJCZXdlZ2UgIitkZXNjKGZyb20pKyIgbmFjaCAiK2Rlc2ModG8pKyIuXG4iKTsKKyAgcmV0dXJuIGFyZzsKK30KKworc3RyaW5nIF9tdihzdHJpbmcgYXJnKQoreworICBvYmplY3QgZnJvbSx0bzsKKyAgdG89cG9wKCk7CisgIGlmIChlcnIpIHJldHVybiBhcmc7CisgIGZyb209cG9wKCk7CisgIGlmIChlcnIpIHJldHVybiBhcmc7CisgIF9fc2V0X2Vudmlyb25tZW50KGZyb20sdG8pOworICB3cml0ZSgiQmV3ZWdlICIrZGVzYyhmcm9tKSsiIG5hY2ggIitkZXNjKHRvKSsiLlxuIik7CisgIHJldHVybiBhcmc7Cit9CisKK3N0cmluZyBkYl9pbmZvKHN0cmluZyBhcmcpCit7CisgIG9iamVjdCBvYjsKKworICBvYj1wb3AoKTsKKyAgaWYgKGVycikgcmV0dXJuIGFyZzsKKyAgZGVidWdfaW5mbygwLG9iKTsKKyAgZGVidWdfaW5mbygxLG9iKTsKKyAgcmV0dXJuIGFyZzsKK30KKworc3RyaW5nIGluaGVyaXRsaXN0KHN0cmluZyBhcmcpCit7CisgIG9iamVjdCBvYjsKKyAgaW50IGk7CisgIHN0cmluZyAqaW5oZXJpdGVkOworCisgIG9iPXBvcCgpOworICBpZiAoZXJyKSByZXR1cm4gYXJnOworICBpbmhlcml0ZWQ9aW5oZXJpdF9saXN0KG9iKTsKKyAgd3JpdGUob2IpO3dyaXRlKCIgaW5oZXJpdHM6XG4iKTsKKyAgZm9yIChpPTA7aTxzaXplb2YoaW5oZXJpdGVkKTtpKyspCisgICAgd3JpdGUoaW5oZXJpdGVkW2ldKyJcbiIpOworICByZXR1cm4gYXJnOworfQorCittaXhlZCBnZXRfY2FsbG91dCgpCit7CisgIG1peGVkICpjYWxscyxyZXQ7CisgIHN0cmluZyB0bXA7CisgIGludCBpLGo7CisKKyAgY2FsbHM9Y2FsbF9vdXRfaW5mbygpOworICByZXQ9KHt9KTsKKyAgaWYgKCFwb2ludGVycChjYWxscykgfHwgIXNpemVvZihjYWxscykpIAorICAgIHJldHVybiAwOworICBmb3IgKGk9MDtpPHNpemVvZihjYWxscyk7aSsrKQorICB7CisgICAgaWYgKHBvaW50ZXJwKGNhbGxzW2ldKSkKKyAgICB7CisgICAgICB0bXA9IiI7CisJCQlpZiAoc2l6ZW9mKGNhbGxzW2ldKT4zKQorCSAgICAgIHRtcCs9c3ByaW50ZigiJS01ME8gJS0xNk8iLGNhbGxzW2ldWzBdLGNhbGxzW2ldWzFdKStzcHJpbnRmKCIgJS02TyAlLTNPXG4iLGNhbGxzW2ldWzJdLGNhbGxzW2ldWzNdKTsKKwkJCWVsc2UgCisJCQkJdG1wKz1zcHJpbnRmKCIgKioqICVPXG4iLGNhbGxzW2ldKTsKKyAgICB9CisgICAgcmV0Kz0oe3RtcH0pOworICB9CisgIHJldHVybiByZXQ7Cit9CisKK21peGVkIGdldF9oZWFydGJlYXQoKQoreworICBtaXhlZCAqb2JqOworICBzdHJpbmcgKnJldDsKKyAgaW50IGk7CisKKyAgb2JqPWhlYXJ0X2JlYXRfaW5mbygpOworICByZXQ9KHt9KTsKKyAgaWYgKCFwb2ludGVycChvYmopIHx8IHNpemVvZihvYmopPT0wKSByZXR1cm4gMDsKKyAgZm9yIChpPTA7aTxzaXplb2Yob2JqKTtpKyspCisgICAgcmV0Kz0oe3NwcmludGYoIiVPIGluICVPXG4iLG9ialtpXSxlbnZpcm9ubWVudChvYmpbaV0pKX0pOworICByZXR1cm4gcmV0OworfQorCitzdHJpbmcgbWFrZShzdHJpbmcgYXJnKQoreworICBvYmplY3QgKmxpc3QsIG9iLCBlbnY7CisgIHN0cmluZyBmaWxlLHRlbXAsZHVtbXk7CisgIGludCBpLGNsb25lZDsKKyAKKyAgb2I9cG9wKCk7CisgIGlmIChlcnIpIHJldHVybiBhcmc7CisgIGlmICghZGVzdHJveWFibGUob2IpKQorICB7CisgICAgZXJyPSJjYW4ndCB1cGRhdGUgIitkZXNjKG9iKTsKKyAgICByZXR1cm4gYXJnOworICB9CisgIGVudj1lbnZpcm9ubWVudChvYik7CisgIGZpbGU9b2JqZWN0X25hbWUob2IpOworICB3cml0ZSgiVXBkYXRpbmcgIitvYmplY3RfbmFtZShvYikrIi4uLlxuIik7CisgIGlmIChzc2NhbmYoZmlsZSwiJXMjJXMiLHRlbXAsZHVtbXkpPT0yKQorICB7CisgICAgZmlsZT10ZW1wOworICAgIGNsb25lZD0xOworICB9CisgIGVsc2UKKyAgICBjbG9uZWQ9MDsKKyAgbGlzdD1hbGxfaW52ZW50b3J5KG9iKTsKKyAgZm9yIChpPXNpemVvZihsaXN0KS0xO2k+PTA7aS0tKQorICAgIGlmIChsaXN0W2ldICYmIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUobGlzdFtpXSkpCisgICAgeworICAgICAgbGlzdFtpXS0+bW92ZSgicm9vbS92b2lkIixNX1RQT1JUIHwgTV9TSUxFTlQgfCBNX05PX1NIT1cgfCBNX05PQ0hFQ0spOworICAgIH0gZWxzZQorICAgICAgbGlzdFtpXT0wOworICBsaXN0LT0oezB9KTsKKyAgCisgIGlmIChvYikKKyAgeworICAgIFJlbW92ZShvYiwxKTsKKyAgfQorICBpZiAoY2xvbmVkKQorICB7CisgICAgaWYgKG9iPWZpbmRfb2JqZWN0KGZpbGUpKQorICAgIHsKKyAgICAgIFJlbW92ZShvYiwxKTsKKyAgICB9CisgICAgZXJyPWNhdGNoKG9iPWNsb25lX29iamVjdChmaWxlKSk7CisgICAgaWYgKCFlcnIpCisgICAgICBvYi0+bW92ZShlbnYsTV9UUE9SVCB8IE1fU0lMRU5UIHwgTV9OT19TSE9XIHwgTV9OT0NIRUNLKTsKKyAgfQorICBlbHNlCisgIHsKKyAgICBlcnI9Y2F0Y2goY2FsbF9vdGhlcihmaWxlLCI/Pz8iKSk7CisgICAgaWYgKCFlcnIpCisgICAgICBvYj1maW5kX29iamVjdChmaWxlKTsKKyAgICBlbHNlCisgICAgICBvYj0wOworICB9CisgIGlmICghb2IpCisgIHsKKyAgICB3cml0ZSgiRXJyb3IgaW4gbG9hZGVkIG9iamVjdC4gU3RheWluZyBpbiB2b2lkIC4uLlxuIik7CisgICAgcmV0dXJuIGFyZzsKKyAgfQorICBmb3IgKGk9c2l6ZW9mKGxpc3QpLTE7aT49MDtpLS0pCisgICAgaWYgKGxpc3RbaV0pCisgICAgICBsaXN0W2ldLT5tb3ZlKG9iLE1fVFBPUlQgfCBNX1NJTEVOVCB8IE1fTk9fU0hPVyB8IE1fTk9DSEVDSyk7CisgIHJldHVybiBhcmc7Cit9CisKK3N0cmluZyByZWMoc3RyaW5nIGFyZykKK3sKKyAgcmVjdXJzaXZlPTE7CisgIHJldHVybiBhcmc7Cit9CisKK3N0cmluZyBub3JlYyhzdHJpbmcgYXJnKQoreworICByZWN1cnNpdmU9MDsKKyAgcmV0dXJuIGFyZzsKK30KKworc3RyaW5nIHJlYWR2YXIoc3RyaW5nIGFyZykKK3sKKyAgc3RyaW5nIHJlc3Q7CisgIGludCBubzsKKyAgaWYgKHNzY2FuZihhcmcsIiVkJXMiLG5vLHJlc3QpIT0yIHx8IG5vPDAgfHwgbm8+PU1BWFZBUlMpCisgIHsKKyAgICBlcnI9ImlsbGVnYWwgdmFyIG51bWJlciI7CisgICAgcmV0dXJuIGFyZzsKKyAgfQorICBpZiAodmFyYXJlYVtub10pCisgICAgcHVzaCh2YXJhcmVhW25vXSk7CisgIGVsc2UKKyAgICBlcnI9InZhciAjIitubysiIGlzIGVtcHR5IjsKKyAgcmV0dXJuIHJlc3Q7Cit9CisKK3N0cmluZyB3cml0ZXZhcihzdHJpbmcgYXJnKQoreworICBzdHJpbmcgcmVzdDsKKyAgaW50IG5vOworICBvYmplY3Qgb2I7CisgIGlmIChzc2NhbmYoYXJnLCIlZCVzIixubyxyZXN0KSE9MiB8fCBubzwwIHx8IG5vPj1NQVhWQVJTKQorICB7CisgICAgZXJyPSJpbGxlZ2FsIHZhciBudW1iZXIiOworICAgIHJldHVybiBhcmc7CisgIH0KKyAgb2I9cG9wKCk7CisgIGlmIChlcnIpIHJldHVybiByZXN0OworICB2YXJhcmVhW25vXT1vYjsKKyAgcmV0dXJuIHJlc3Q7Cit9CisKK3N0cmluZyB2YXJzKHN0cmluZyBhcmcpCit7CisgIGludCBpOworICBmb3IgKGk9MDtpPE1BWFZBUlM7aSsrKQorICB7CisgICAgaWYgKHZhcmFyZWFbaV0pCisgICAgICB3cml0ZSgiPCIraSsiOiAiK2Rlc2ModmFyYXJlYVtpXSkrIlxuIik7CisgIH0KKyAgcmV0dXJuIGFyZzsKK30KKwordm9pZCB2YW5pc2goKQoreworIC8vIFJlbW92ZUF1dG9sb2FkKCk7CisgIGRlc3RydWN0KCB0aGlzX29iamVjdCgpICk7Cit9CisKK21peGVkIHJ1c2FnZShzdHJpbmcgYXJnKQoreworICBtaXhlZCAqcmVzdXNhZ2U7CisgIGludCBpLGo7CisvKgorICByZXN1c2FnZT0oe21peGVkICp9KWVmdW46OnJ1c2FnZSgpOworICBmb3IgKGk9MDtpPDE4O2krKyl7CisgICAgd3JpdGUoYWxpZ24oKHsiVXNlciB0aW1lIiwiU3lzdGVtIHRpbWUiLCJNYXggcmVzIHNldCBzaXplIiwKKwkJICAiUGFnZSByZWNsYWltcyIsIlBhZ2UgZmF1bHRzIiwKKwkJICAiVW5zaGFyZWQgc3RhY2sgc2l6ZSIsCisJCSAgIlNoYXJlZCB0ZXh0IHNpemUiLCJVbnNoYXJlZCBkYXRhIHNpemUiLAorCQkgICJTeXN0ZW0gc3dhcHMiLAorCQkgICJCbG9jayBpbnB1dCBvcGVyYXRpb25zIiwiQmxvY2sgb3V0cHV0IG9wZXJhdGlvbnMiLAorCQkgICJNZXNzYWdlcyBzZW50IiwiTWVzc2FnZXMgcmVjZWl2ZWQiLCJTaWduYWxzIHJlY2VpdmVkIiwKKwkJICAiVm9sdW50YXJ5IGNvbnRleHQgc3dpdGNoZXMiLCJJbnZvbHVudGFyeSBjb250ZXh0IHN3aXRjaGVzIiwKKwkJICAiVG90YWwgaW50ZXJuZXQgcGFja2V0cyIsIlRvdGFsIGludGVybmV0IGJ5dGVzIn0pW2ldLAorCQk0MCkrIjogIityZXN1c2FnZVtpXSsiXG4iKTsKKyAgfQorICByZXR1cm4gYXJnOworICAqLworICByZXR1cm4gKHt9KTsKK30KKworc3RyaW5nIGFsaWduKHN0cmluZyBzLGludCB4KXsKKyAgcmV0dXJuIChzKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKVswLi54LTFdOworfQorCitzdGF0aWMgc3RyaW5nIHN3aG8oc3RyaW5nIGFyZykKK3sKKyAgb2JqZWN0ICp1c2VybGlzdCwgc25vb3BlciwgZm91bmQ7bWl4ZWQgYWN0aXZlOworICBpbnQgaSxqLGRvbmU7CisKKyAgaWYgKGdldGV1aWQodGhpc19pbnRlcmFjdGl2ZSgpKSE9Z2V0ZXVpZCgpKSByZXR1cm4gYXJnOworICB1c2VybGlzdD11c2VycygpOworICBhY3RpdmU9KHt9KTsKKyAgZm9yIChpPXNpemVvZih1c2VybGlzdCktMTtpPj0wO2ktLSkKKyAgICBpZiAoc25vb3Blcj1xdWVyeV9zbm9vcCh1c2VybGlzdFtpXSkpCisgICAgeworICAgICAgaWYgKG1lbWJlcihhY3RpdmUsc25vb3Blcik9PS0xKQorCWFjdGl2ZSs9KHtzbm9vcGVyfSk7CisgICAgICBpZiAobWVtYmVyKGFjdGl2ZSx1c2VybGlzdFtpXSk9PS0xKQorCWFjdGl2ZSs9KHt1c2VybGlzdFtpXX0pOworICAgIH0KKyAgaWYgKCFzaXplb2YoYWN0aXZlKSkKKyAgeworICAgIHByaW50ZigiS2VpbmUgYWt0aXZlbiBTbm9vcHMuXG4iKTsKKyAgICByZXR1cm4gYXJnOworICB9CisgIGZvciAoaT1zaXplb2YoYWN0aXZlKS0xO2k+PTA7aS0tKQorICAgIGFjdGl2ZVtpXT0oe2FjdGl2ZVtpXX0pOworICBmb3IgKGk9c2l6ZW9mKGFjdGl2ZSktMTtpPj0wO2ktLSkKKyAgICBpZiAocG9pbnRlcnAoYWN0aXZlW2ldKSYmc25vb3Blcj1xdWVyeV9zbm9vcChhY3RpdmVbaV1bMF0pKQorICAgIHsKKyAgICAgIGRvbmU9MDsKKyAgICAgIGZvciAoaj1zaXplb2YoYWN0aXZlKS0xO2o+PTAgJiYgIWRvbmU7ai0tKQorCWlmIChwb2ludGVycChhY3RpdmVbal0pICYmIGFjdGl2ZVtqXVtzaXplb2YoYWN0aXZlW2pdKS0xXT09c25vb3BlcikKKwl7CisJICBhY3RpdmVbal0rPWFjdGl2ZVtpXTsKKwkgIGFjdGl2ZVtpXT0wOworCSAgZG9uZT0xOworCX0KKyAgICB9CisgIGFjdGl2ZS09KHswfSk7CisgIGZvciAoaT0wO2k8c2l6ZW9mKGFjdGl2ZSk7aSsrKQorICB7CisgICAgZm9yIChqPTA7ajxzaXplb2YoYWN0aXZlW2ldKTtqKyspCisgICAgICBwcmludGYoIiVzJXMiLChqPT0wPyIiOiIgLT4gIiksY2FwaXRhbGl6ZShnZXR1aWQoYWN0aXZlW2ldW2pdKSkpOworICAgIHByaW50ZigiXG4iKTsKKyAgfQorICByZXR1cm4gYXJnOworfQorCitzdHJpbmcgdGltZWYoaW50IHNlYykKK3sKKyAgc3RyaW5nIHM7CisKKyAgcz0iIjsKKyAgaWYgKHNlYz49ODY0MDApCisgICAgcys9c3ByaW50ZigiJWQgZCwgIixzZWMvODY0MDApOworICBpZiAoc2VjPjM2MDApCisgICAgcys9c3ByaW50ZigiJWQgaCwgIiwoc2VjLzM2MDApJTI0KTsKKyAgaWYgKHNlYz42MCkKKyAgICBzKz1zcHJpbnRmKCIlZCBtLCAiLChzZWMvNjApJTYwKTsKKyAgcmV0dXJuIHMrc3ByaW50ZigiJWQgcyIsc2VjJTYwKTsKK30KKworc3RyaW5nIGlkbGUoc3RyaW5nIGFyZykKK3sKKyAgb2JqZWN0IG9iOworICBpbnQgaTsKKworICBvYj1wb3AoKTsKKyAgaWYgKGVycikgcmV0dXJuIGFyZzsKKyAgd3JpdGUoY2FwaXRhbGl6ZShvYi0+bmFtZShXRVIpKSsiICIpOworICBpZiAoIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUob2IpKQorICB7CisgICAgd3JpdGUoImlzdCBrZWluIGVjaHRlciBTcGllbGVyLlxuIik7CisgICAgcmV0dXJuIGFyZzsKKyAgfQorICBpZiAoIXF1ZXJ5X2lwX251bWJlcihvYikpCisgIHsKKyAgICB3cml0ZSgiaXN0IG5ldHp0b3QuXG4iKTsKKyAgICByZXR1cm4gYXJnOworICB9CisgIHByaW50ZigiaXN0IGlkbGUgc2VpdCAlZCBTZWt1bmRlbiIsaT1xdWVyeV9pZGxlKG9iKSk7CisgIGlmIChpPjYwKQorICAgIHByaW50ZigiICglcylcbiIsdGltZWYoaSkpOworICBlbHNlCisgICAgd3JpdGUoIlxuIik7CisgIHJldHVybiBhcmc7Cit9CisKK3N0cmluZyBzdGF0KHN0cmluZyBhcmcpCit7CisgIG9iamVjdCBvYjsKKyAgbWFwcGluZyBxdWVzdHM7CisgIG1peGVkIHN0YXRzLCAqYXJyLCB0bXAsdG1wMiwgbGlzdDsKKyAgc3RyaW5nIHRpdGVsLCBsZXZlbCwgc3RhdF9zdHIsd2VhcG9uLGFybW91cjsKKyAgaW50IHBsOworICBpbnQgaTsKKyAgCisgIG9iPXBvcCgpOworICBpZiAoZXJyKQorICAgIHJldHVybiBhcmc7CisgIAorICB0aXRlbD1vYi0+UXVlcnlQcm9wKFBfVElUTEUpOworICBpZiAoIShwbD1xdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSkpCisgICAgbGV2ZWw9Ik1vbnN0ZXI9IitvbGRfZXhwbG9kZShvYmplY3RfbmFtZShvYiksIiMiKVswXTsKKyAgZWxzZQorICAgIGlmIChJU19HT0Qob2IpKQorICAgICAgbGV2ZWw9Ik11ZC1Hb3R0IjsKKyAgICBlbHNlIGlmIChJU19BUkNIKG9iKSkKKyAgICAgIGxldmVsPSJFcnptYWdpZXIiOworICAgIGVsc2UgaWYgKElTX0VMREVSKG9iKSkKKyAgICAgIGxldmVsPSJXZWlzZXIiOworICAgIGVsc2UgaWYgKElTX0xPUkQob2IpKQorICAgICAgbGV2ZWw9IlJlZ2lvbnNtYWdpZXIiOworICAgIGVsc2UgaWYgKElTX0RPTUFJTk1FTUJFUihvYikpCisgICAgICBsZXZlbD0iUmVnaW9uc21pdGdsaWVkIjsKKyAgICBlbHNlIGlmIChJU19XSVpBUkQob2IpKQorICAgICAgbGV2ZWw9Ik1hZ2llciI7CisgICAgZWxzZSBpZiAoSVNfTEVBUk5FUihvYikpCisgICAgICBsZXZlbD0iTGVocmxpbmciOworICAgIGVsc2UgaWYgKElTX1NFRVIob2IpKQorICAgICAgbGV2ZWw9IlNlaGVyIjsKKyAgICBlbHNlIGxldmVsPSJTcGllbGVyIjsKKyAgaWYgKElTX0RPTUFJTk1FTUJFUihvYikpCisgICAgZm9yICh0bXA9InNlY3VyZS9tYXN0ZXIiLT5nZXRfZG9tYWluX2hvbWVzKGdldGV1aWQob2IpKTsKKwkgc2l6ZW9mKHRtcCk7dG1wPXRtcFsxLi5dKQorICAgICAgbGV2ZWwrPSItIitjYXBpdGFsaXplKHRtcFswXSk7CisgIGlmIChwbCkKKyAgeworICAgIGlmICghaW50ZXJhY3RpdmUob2IpKQorICAgICAgbGV2ZWwrPSIsIG5ldHp0b3QiOworICAgIGVsc2UKKyAgICAgIGlmIChxdWVyeV9pZGxlKG9iKT42MDApCisJbGV2ZWwrPSIsIGlkbGUiOworICAgIGlmIChvYi0+UXVlcnlQcm9wKFBfR0hPU1QpKQorICAgICAgbGV2ZWwrPSIsIHRvdCI7CisgICAgaWYgKG9iLT5RdWVyeVByb3AoUF9JTlZJUykpCisgICAgICBsZXZlbCs9IiwgdW5zaWNodGJhciI7CisgICAgaWYgKG9iLT5RdWVyeVByb3AoUF9GUk9HKSkKKyAgICAgIGxldmVsKz0iLCBncnVlbiB1bmQgZ2xpdHNjaGlnIjsKKyAgICBpZiAob2ItPlF1ZXJ5UHJvcChQX1RFU1RQTEFZRVIpKQorICAgICAgbGV2ZWwrPSIsIFRlc3RzcGllbGVyIjsKKyAgfQorICB0bXA9b2ItPlF1ZXJ5UHJvcChQX1BSRVNBWSk7CisgIGlmICh0bXAgJiYgdG1wIT0iIikKKyAgICB0bXA9dG1wKyIgIjsKKyAgZWxzZQorICAgIHRtcD0iIjsKKyAgdG1wMj1vYi0+UXVlcnlQcm9wKFBfUkFDRSk7CisgIGlmKCF0bXAyKQorICAgIHRtcDI9IkRpbmdzZGEiOworICBhcnI9b2ItPlF1ZXJ5UHJvcChQX05BTUUpOworICBpZiAocG9pbnRlcnAoYXJyKSkgYXJyPWFyclswXTsKKyAgcHJpbnRmKCIlcyVzICVzICglcylbJXNdLlxuXG4iLHRtcHx8IiIsYXJyfHwiIix0aXRlbHx8IiIsCisJIHRtcDJ8fCI/PyIsbGV2ZWx8fCI/PyIpOworICBpZiAocGwpCisgICAgcHJpbnRmKCIgICAgICAgIEFsdGVyIDogJXMuJXNcbiIsCisJICAgdGltZWYoMipvYi0+UXVlcnlQcm9wKFBfQUdFKSksCisJICAgKHRtcD1vYi0+UXVlcnlQcm9wKFBfTUFSUklFRCkpPworCSAgICgiVmVyaGVpcmF0ZXQgbWl0ICIrY2FwaXRhbGl6ZSh0bXApKyIuIik6IiIpOworICBlbHNlCisgICAgcHJpbnRmKCIgICAgQWdncmVzc2l2IDogJTRzICAgICAgICAgIEdlc3ByYWVjaGlnIDogJWQlJVxuIiwKKwkgICBvYi0+UXVlcnlQcm9wKFBfQUdHUkVTU0lWRSk/ICJKYSIgOiAiTmVpbiIsIAorCSAgIG9iLT5RdWVyeVByb3AoUF9DSEFUX0NIQU5DRSkpIDsKKyAgcHJpbnRmKCIgTGViZW5zcHVua3RlIDogWyU0ZC8lNGRdICAgTWFnaWVwdW5rdGUgOiBbJTRkLyU0ZF0gICAiICsKKwkgIkVyZmFocnVuZyA6ICVkXG4iLAorCSBvYi0+UXVlcnlQcm9wKFBfSFApLCBvYi0+UXVlcnlQcm9wKFBfTUFYX0hQKSwgCisJIG9iLT5RdWVyeVByb3AoUF9TUCksIG9iLT5RdWVyeVByb3AoUF9NQVhfU1ApLCAKKwkgb2ItPlF1ZXJ5UHJvcChQX1hQKSk7CisgIHByaW50ZigiICAgICAgTmFocnVuZyA6IFslM2QvJWRdICAgIEZsdWVzc2lna2VpdCA6IFslM2QvJWRdICAgICAgICIgKworCSAiQWxrb2hvbCA6IFslM2QvJWRdXG4iLAorCSBvYi0+UXVlcnlQcm9wKFBfRk9PRCksIG9iLT5RdWVyeVByb3AoUF9NQVhfRk9PRCksCisJIG9iLT5RdWVyeVByb3AoUF9EUklOSyksIG9iLT5RdWVyeVByb3AoUF9NQVhfRFJJTkspLAorCSBvYi0+UXVlcnlQcm9wKFBfQUxDT0hPTCksIG9iLT5RdWVyeVByb3AoUF9NQVhfQUxDT0hPTCkpIDsKKyAgc3dpdGNoKG9iLT5RdWVyeVByb3AoUF9HRU5ERVIpKSAgeworICAgIGNhc2UgRkVNQUxFIDogdG1wMiA9ICJ3ZWlibGljaCAiIDsgYnJlYWsgOworICAgIGNhc2UgTUFMRSAgIDogdG1wMiA9ICJtYWVubmxpY2giIDsgYnJlYWsgOworICAgIGRlZmF1bHQgICAgIDogdG1wMiA9ICJib2luZ2lzY2giIDsgYnJlYWsgOworICB9CisgIHByaW50ZigiICAgR2VzY2hsZWNodCA6ICVzICAgICAgIENoYXJha3RlciA6ICUtNWQgICAgICAgICAgICAgU3R1ZmUgOiAlLTNkXG4iLAorCSB0bXAyLCBvYi0+UXVlcnlQcm9wKFBfQUxJR04pLCBvYi0+UXVlcnlQcm9wKFBfTEVWRUwpKSA7CisgIHN0YXRzID0gb2ItPlF1ZXJ5UHJvcChQX0FUVFJJQlVURVMpIDsKKwlpZiAoIW1hcHBpbmdwKHN0YXRzKSkgc3RhdHM9KFtdKTsKKyAgdG1wICA9IG1faW5kaWNlcyhzdGF0cyk7IHRtcDIgPSBtX3ZhbHVlcyhzdGF0cyk7IHN0YXRfc3RyID0gIiIgOworICBmb3IoOyBzaXplb2YodG1wKTsgdG1wPXRtcFsxLi5dLHRtcDI9dG1wMlsxLi5dKQorICAgIHN0YXRfc3RyICs9ICh0bXBbIDAgXSArICJbIiArIHRtcDJbIDAgXSArICJdICIpIDsKKyAgCisgIGlmKHN0YXRfc3RyID09ICIiKQorICAgIHN0YXRfc3RyID0gIktlaW5lIiA7CisgIGVsc2UKKyAgICBzdGF0X3N0ciA9IHN0YXRfc3RyWzAuLjwyXTsKKyAgCisgIHByaW50ZigiICAgICAgICAgR2VsZCA6ICUtOWQgICAgICAgICAgIFN0YXRpIDogJXNcblxuIiwgb2ItPlF1ZXJ5TW9uZXkoKSwKKwkgc3RhdF9zdHIpIDsKKyAgCisgIHdlYXBvbiA9ICJLZWluZSIgOyBhcm1vdXIgPSAiIiA7CisgIGZvcih0bXA9YWxsX2ludmVudG9yeShvYik7IHNpemVvZih0bXApOyB0bXA9dG1wWzEuLl0pCisgIHsKKyAgICBpZih0bXBbIDAgXS0+UXVlcnlQcm9wKFBfV0lFTERFRCkpIC8vIGdlenVlY2t0ZSBXYWZmZQorICAgICAgd2VhcG9uID0gKHRtcFsgMCBdLT5uYW1lKFdFUikpICsgIiAoIiArCisgICAgICAgICBvbGRfZXhwbG9kZShvYmplY3RfbmFtZSh0bXBbIDAgXSksIiMiKVswXSArICIpWyIgKworICAgICAgICAgdG1wWyAwIF0tPlF1ZXJ5UHJvcChQX1dDKSArICJdIiA7CisKKyAgICBpZih0bXBbIDAgXS0+UXVlcnlQcm9wKFBfV09STikpICAgLy8gZ2V0cmFnZW5lIFJ1ZXN0dW5nCisgICAgICBhcm1vdXIgKz0gKHRtcFsgMCBdLT5uYW1lKFdFUikpICsgIlsiICsKKyAgICAgICAgICB0bXBbIDAgXS0+UXVlcnlQcm9wKFBfQUMpICsgIl0iICsKKyAgICAiLCAiIDsKKyAgfQorCisgIGlmKGFybW91ciA9PSAiIikKKyAgICBhcm1vdXIgPSAiS2VpbmUiIDsKKyAgZWxzZQorICB7CisgICAgdG1wID0gb2xkX2V4cGxvZGUoYnJlYWtfc3RyaW5nKGFybW91clswLi5zaXplb2YoYXJtb3VyKSAtIDNdLAorCQkJICAgICAgIDYzKSwgIlxuIikgOworICAgIGFybW91ciA9IHRtcFsgMCBdIDsKKyAgICB0bXA9dG1wWzEuLl07CisgICAgZm9yICg7c2l6ZW9mKHRtcCk7IHRtcD10bXBbMS4uXSkKKyAgICAgIGFybW91ciArPSAiXG4gICAgICAgICAgICAgICAgIiArIHRtcFsgMCBdIDsKKyAgfQorICAKKyAgcHJpbnRmKCIgICBXYWZmZSglM2QpIDogJXNcblJ1ZXN0dW5nKCUzZCkgOiAlc1xuIiwKKwkgb2ItPlF1ZXJ5UHJvcChQX1RPVEFMX1dDKSwgd2VhcG9uLAorCSBvYi0+UXVlcnlQcm9wKFBfVE9UQUxfQUMpLCBhcm1vdXIpIDsKKyAgCisgIGxpc3QgPSBvYi0+UXVlcnlFbmVtaWVzKCk7CisgIGlmIChwb2ludGVycChsaXN0KSkgCisgIHsKKyAgICBsaXN0PWxpc3RbMF07CisgICAgdG1wMiA9ICIiIDsKKyAgICBmb3IoaT1zaXplb2YobGlzdCktMSA7IGk+PTA7aS0tKQorICAgICAgaWYgKG9iamVjdHAobGlzdFtpXSkpCisgICAgICAgIHRtcDIgKz0gKGxpc3RbIGkgXS0+bmFtZShXRVIpICsgIiwgIikgOworICAgIGlmKHRtcDIgIT0gIiIpCisgICAgICBwcmludGYoIiAgICAgICBGZWluZGUgOiAlcy5cbiIsIHRtcDJbMC4uPDNdKTsKKyAgfQorICAKKyAgLy8gOC5aZWlsZSA6IEdlbG9lc3RlIEF1ZmdhYmVuCisgIGlmKHBsKQorICB7CisgICAgcHJpbnRmKCBicmVha19zdHJpbmcoIAorICAgICAgICAgICAgICBDb3VudFVwKG1faW5kaWNlcyhvYi0+UXVlcnlQcm9wKFBfUVVFU1RTKSkpLCAKKyAgICAgICAgICAgICAgNzUsCisgICAgICAgICAgICAgICIgICAgIEF1ZmdhYmVuIDogIiwKKyAgICAgICAgICAgICAgQlNfSU5ERU5UX09OQ0UpKTsKKyAgICBpZigoKHRtcDIgPSBvYi0+UXVlcnlQcm9wKFBfTUFJTEFERFIpKSAhPSAibm9uZSIpICYmIHRtcDIgJiYKKyAgICAgICAodG1wMiAhPSAiIikpCisgICAgICB0bXAyID0gIiAoIiArIHRtcDIgKyAiKSIgOworICAgIGVsc2UKKyAgICAgIHRtcDIgPSAiIiA7CisgIH0KKyAgZWxzZQorICAgIHRtcDIgPSAiIiA7CisKKyAgaWYoZW52aXJvbm1lbnQob2IpKQorICAgIHByaW50ZigiICAgQXVmZW50aGFsdCA6ICVzJXMuXG4iLAorCSAgIG9sZF9leHBsb2RlKG9iamVjdF9uYW1lKGVudmlyb25tZW50KG9iKSksIiMiKVswXSwgdG1wMikgOworCisgIHJldHVybiBhcmc7Cit9CisKK3N0cmluZyBzY2FuKHN0cmluZyBhcmcpCit7CisgIG9iamVjdCBvYjsKKyAgbWl4ZWQgdG1wLHRtcDIsdG1wMzsKKyAgaW50IGk7CisKKyAgb2I9cG9wKCk7CisgIGlmIChlcnIpIHJldHVybiBhcmc7CisgIGlmIChxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSkKKyAgICBwcmludGYoIlNwaWVsZXI6ICVzLCBMZXZlbDogJWQsIFdpemxldmVsOiAlZFxuIiwKKwkgICBjYXBpdGFsaXplKGdldHVpZChvYikpLCBvYi0+UXVlcnlQcm9wKFBfTEVWRUwpLAorCSAgIHF1ZXJ5X3dpel9sZXZlbChvYikpOworICBlbHNlCisgICAgcHJpbnRmKCJNb25zdGVyLCBVSUQ6ICVzLCBFVUlEOiAlcywgTGV2ZWw6ICVkXG4iLAorCSAgIGdldHVpZChvYiksIChnZXRldWlkKG9iKT9nZXRldWlkKG9iKToiMCIpLCBvYi0+UXVlcnlQcm9wKFBfTEVWRUwpKTsKKyAgdG1wPW9iLT5zaG9ydCgpOworICBpZiAoIXN0cmluZ3AodG1wKXx8IXNpemVvZih0bXApKQorICAgIHRtcD1zcHJpbnRmKCIoJXMgJXMgJXMgJXMpIixvYi0+UXVlcnlQcm9wKFBfUFJFU0FZKSsiIiwKKwkJb2ItPlF1ZXJ5UHJvcChQX05BTUUpKyIiLG9iLT5RdWVyeVByb3AoUF9USVRMRSkrIiIsCisJCShpbnRlcmFjdGl2ZShvYik/IiI6IihuZXR6dG90IikpOworICBlbHNlCisgICAgdG1wPXRtcFswLi48M107CisgIHByaW50ZigiJXMsIFJhc3NlOiAlc1xuIix0bXAsICIiK29iLT5RdWVyeVByb3AoUF9SQUNFKSk7CisgIHByaW50ZigiU3RhdHM6ICAgICIpOworICB0bXA9b2ItPlF1ZXJ5UHJvcChQX0FUVFJJQlVURVMpOworICB0bXAzPW9iLT5RdWVyeVByb3AoUF9BVFRSSUJVVEVTX09GRlNFVFMpOworICBpZiAoIXRtcCkKKyAgICBwcmludGYoImtlaW5lXG4iKTsKKyAgZWxzZQorICB7CisgICAgdG1wMj1tX2luZGljZXModG1wKTsKKyAgICBmb3IgKGk9MDtpPHNpemVvZih0bXAyKTtpKyspCisJeworICAgICAgcHJpbnRmKCIlcyVzOiAlZCIsKGk+MD8iLCAiOiIiKSx0bXAyW2ldLHRtcFt0bXAyW2ldXSk7CisJICBpZiAodG1wM1t0bXAyW2ldXSkKKwkgICAgcHJpbnRmKCIlK2QiLHRtcDNbdG1wMltpXV0pOworICAgIH0KKyAgICBwcmludGYoIlxuIik7CisgIH0KKyAgcHJpbnRmKCJSdWVzdHVuZzogJS02ZCAgICBXYWZmZW46ICUtNmQgICAgICBWb3JzaWNodDogJS02ZCAgIEdlc2NobGVjaHQ6ICIsCisJIG9iLT5RdWVyeVByb3AoUF9UT1RBTF9BQyksb2ItPlF1ZXJ5UHJvcChQX1RPVEFMX1dDKSwKKwkgb2ItPlF1ZXJ5UHJvcChQX1dJTVBZKSk7CisgIGlmICghKHRtcD1vYi0+UXVlcnlQcm9wKFBfR0VOREVSKSkpCisgICAgcHJpbnRmKCJOXG4iKTsKKyAgZWxzZQorICB7CisgICAgaWYgKHRtcD09MikKKyAgICAgIHByaW50ZigiRlxuIik7CisgICAgZWxzZQorICAgICAgcHJpbnRmKCJNXG4iKTsKKyAgfQorICBpZiAodG1wPW9iLT5RdWVyeVByb3AoUF9NQVJSSUVEKSkKKyAgICBwcmludGYoIlZlcmhlaXJhdGV0IG1pdCAlcy5cbiIsY2FwaXRhbGl6ZSh0bXApKTsKKyAgcHJpbnRmKCJMZWJlbnNwdW5rdGU6ICU0ZCBbJTRkXSwgTWFnaWVwdW5rdGU6ICU0ZCBbJTRkXSwgRXJmOiAlLThkXG4iLAorCSBvYi0+UXVlcnlQcm9wKFBfSFApLCBvYi0+UXVlcnlQcm9wKFBfTUFYX0hQKSwgCisJIG9iLT5RdWVyeVByb3AoUF9TUCksIG9iLT5RdWVyeVByb3AoUF9NQVhfU1ApLAorCSBvYi0+UXVlcnlQcm9wKFBfWFApKTsKKyAgaWYgKGxpdmluZyhvYikpCisgIHsKKyAgICB0bXA9cHJlc2VudCgiZ2VsZCIsb2IpOworICAgIGlmICh0bXApCisgICAgICB0bXA9dG1wLT5RdWVyeVByb3AoUF9BTU9VTlQpOworICAgIHByaW50ZigiVHJhZWd0ICU2ZCAoJTZkKSBnLiBFaWdlbmdld2ljaHQgJTZkIGcuICU2ZCBNdWVuemVuLlxuIiwKKwkgICBvYi0+cXVlcnlfd2VpZ2h0X2NvbnRlbnRzKCksb2ItPlF1ZXJ5UHJvcChQX01BWF9XRUlHSFQpLAorCSAgIG9iLT5RdWVyeVByb3AoUF9XRUlHSFQpLHRtcCk7CisgICAgaWYgKHRtcD1vYi0+U2VsZWN0RW5lbXkoKSkKKyAgICAgIHByaW50ZigiS2FlbXBmdCBnZWdlbiAlcyBbJU9dXG4iLHRtcC0+bmFtZShXRU4pLHRtcCk7CisgIH0KKyAgcHJpbnRmKCJFTlY6ICVzIiwKKwkgKCh0bXA9ZW52aXJvbm1lbnQob2IpKT9vYmplY3RfbmFtZSh0bXApOiItIGZhYnJpYyBvZiBzcGFjZSAtIikpOworICBpZihxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSkKKyAgeworICAgIHByaW50ZigiLCBFTWFpbDogJXNcbiIsIG9iLT5RdWVyeVByb3AoUF9NQUlMQUREUikrIiIpOworICAgIHRtcD0iL3NlY3VyZS9tYXN0ZXIiLT5maW5kX3VzZXJpbmZvKGdldHVpZChvYikpOworICAgIGlmIChwb2ludGVycCh0bXApICYmIHNpemVvZih0bXApPlVTRVJfRE9NQUlOKQorICAgIHsKKyAgICAgIHRtcD10bXBbVVNFUl9ET01BSU5dOworICAgICAgaWYgKHBvaW50ZXJwKHRtcCkgJiYgc2l6ZW9mKHRtcCkpCisgICAgICB7CisJcHJpbnRmKCJMb3JkIGluOiAiKTsKKwlmb3IgKHRtcDI9MDt0bXAyPHNpemVvZih0bXApO3RtcDIrKykKKwkgIHByaW50ZigiJXMlcyIsKHRtcDI+MD8iLCAiOiIiKSwiIit0bXBbdG1wMl0pOworCXByaW50ZigiLlxuIik7CisgICAgICB9CisgICAgfQorICAgIHRtcD0iL3NlY3VyZS9tYXN0ZXIiLT5nZXRfZG9tYWluX2hvbWVzKGdldHVpZChvYikpOworICAgIGlmIChwb2ludGVycCh0bXApJiZzaXplb2YodG1wKT4wKQorICAgIHsKKyAgICAgIHByaW50ZigiTWl0Z2xpZWQgaW46ICIpOworICAgICAgZm9yICh0bXAyPTA7dG1wMjxzaXplb2YodG1wKTt0bXAyKyspCisgICAgIAlwcmludGYoIiVzJXMiLCh0bXAyPjA/IiwgIjoiIiksIiIrdG1wW3RtcDJdKTsKKyAgICAgIHByaW50ZigiLlxuIik7CisgICAgfQorICAgIHByaW50ZigiUXVlc3RzOiAiKTsKKyAgICB0bXA9b2ItPlF1ZXJ5UHJvcChQX1FVRVNUUyk7CisgICAgaWYgKHRtcD09KHt9KXx8IXBvaW50ZXJwKHRtcCkpCisgICAgICBwcmludGYoIktlaW5lLlxuIik7CisgICAgZWxzZQorICAgIHsKKyAgICAgIHRtcDI9IiI7CisgICAgICB0bXAtPSh7KHt9KSwwfSk7CisgICAgICBmb3IgKGk9MDsgaTxzaXplb2YodG1wKTsgaSsrKQorCXRtcDIrPXNwcmludGYoIiVzJXMiLChpPyIsICI6IiIpLHRtcFtpXVswXSk7CisgICAgICB0bXA9YnJlYWtfc3RyaW5nKHRtcDIsNzksOCk7CisgICAgICB0bXA9dG1wWzguLl07CisgICAgICBwcmludGYoIiVzIix0bXApOworICAgIH0KKyAgICBwcmludGYoIlBLaWxsczogJWQgIixvYi0+UXVlcnlQcm9wKFBfS0lMTFMpKTsKKyAgICBwcmludGYoIiwgUXVlc3RQb2ludHM6ICVkICglZC8lZCksIEFsdGVyOiAlc1xuIixvYi0+UXVlcnlQcm9wKFBfUVApLG9iLT5RdWVyeVByb3AoUF9ORUVERURfUVApLFFNLT5RdWVyeU1heFFQKCksdGltZWYoMipvYi0+UXVlcnlQcm9wKFBfQUdFKSkpOworICAgIGlmIChpbnRlcmFjdGl2ZShvYikpCisgICAgeworICAgICAgcHJpbnRmKCJGcm9tOiAlcyAoJXMpIFslc11cbiIscXVlcnlfaXBfbmFtZShvYikscXVlcnlfaXBfbnVtYmVyKG9iKSxjb3VudHJ5KHF1ZXJ5X2lwX25hbWUob2IpKSk7CisgICAgICB0bXA9cXVlcnlfaWRsZShvYik7CisgICAgICBwcmludGYoIklkbGUgc2VpdCAlZCBTZWt1bmRlbiIsdG1wKTsKKyAgICAgIGlmICh0bXA+NjApCisgIAlwcmludGYoIiAoJXMpIix0aW1lZih0bXApKTsKKwkJCXByaW50ZigiLCBjbWQgYXZnOiAlZCIsb2ItPlF1ZXJ5UHJvcCgiY29tbWFuZF9hdmVyYWdlIikpOworICAgICAgcHJpbnRmKCIsIG5vY2ggJWQgWlQgenUgZmluZGVuLlxuR2Vzbm9vcGVkIHZvbjogJXNcbiIsCisJICAgICAoKHRtcD1vYi0+UXVlcnlQcm9wKFBfUE9USU9OUk9PTVMpKT9zaXplb2YodG1wKTowKSwKKwkgICAgICgodG1wPXF1ZXJ5X3Nub29wKG9iKSk/Y2FwaXRhbGl6ZShnZXR1aWQodG1wKSk6Ik5pZW1hbmRlbSIpKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgIHRtcD1nZXR1aWQob2IpOworICAgICAgdG1wPWZpbGVfdGltZSgic2F2ZS8iK3RtcFswLi4wXSsiLyIrdG1wKyIubyIpOworICAgICAgdG1wPXRpbWUoKS10bXA7CisgICAgICBwcmludGYoIkthbSB2b246ICVzLCB2b3I6ICVkIHMoJXMpXG4iLAorCSAgICAgb2ItPlF1ZXJ5UHJvcChQX0NBTExFRF9GUk9NX0lQKSx0bXAsdGltZWYodG1wKSk7ICAKKyAgICB9CisgIH0KKyAgZWxzZQorICAgIHByaW50ZigiXG4iKTsKKyAgcmV0dXJuIGFyZzsKK30KKworbWl4ZWQgZGluZm8oc3RyaW5nIGFyZykKK3sKKyAgb2JqZWN0IG9iOworCisgIG9iPXBvcCgpOworICBpZiAoIW9iKQorICAgIHJldHVybiAxOworICBkZWJ1Z19pbmZvKDAsb2IpOworICByZXR1cm4gYXJnOworfQorCittaXhlZCBtaW5mbyhzdHJpbmcgYXJnKQoreworICBvYmplY3Qgb2I7CisKKyAgb2I9cG9wKCk7CisgIGlmICghb2IpCisgICAgcmV0dXJuIDE7CisgIGRlYnVnX2luZm8oMSxvYik7CisgIHJldHVybiBhcmc7Cit9CisKK3ZvaWQgZHVtcF9saXN0KG1peGVkIHdoYXQpCit7CisgIGludCBpLHM7CisKKyAgaWYgKCFwb2ludGVycCh3aGF0KXx8IShzPXNpemVvZih3aGF0KSkpCisgICAgcmV0dXJuOworICBmb3IgKGk9MDtpPHM7aSsrKQorICAgIHdyaXRlKHdoYXRbaV0pOworfQorCitzdHJpbmcgY2FsbG91dChzdHJpbmcgYXJncykKK3sKKyAgZHVtcF9saXN0KGdldF9jYWxsb3V0KCkpOworICByZXR1cm4gYXJnczsKK30KKworc3RyaW5nIGhlYXJ0YmVhdChzdHJpbmcgYXJncykKK3sKKyAgZHVtcF9saXN0KGdldF9oZWFydGJlYXQoKSk7CisgIHJldHVybiBhcmdzOworfQorCitzdHJpbmcgZHVtcGxpc3RzKHN0cmluZyBhcmdzKQoreworICBzdHJpbmcgZmlsZW47CisgIHN0cmluZyAqbGlzdDsKKyAgaW50IGksczsKKworICBpZiAoIWdldGV1aWQodGhpc19vYmplY3QoKSkpCisgICAgcmV0dXJuIGFyZ3M7CisgIGZpbGVuPSIvcGxheWVycy8iK2dldGV1aWQodGhpc19vYmplY3QoKSkrIi9MSVNUUy5MVVBFIjsKKyAgd3JpdGUoIkR1bXBpbmcgdG8gIitmaWxlbisiIC4uLiAiKTsKKyAgaWYgKGZpbGVfc2l6ZShmaWxlbik+PTApCisgICAgcm0oZmlsZW4pOworICB3cml0ZV9maWxlKGZpbGVuLCJPQkpFQ1QgV0lUSCBBQ1RJVkUgSEVBUlRfQkVBVDpcbiIpOworICBsaXN0PWdldF9oZWFydGJlYXQoKTsKKyAgaWYgKCFsaXN0IHx8ICEocz1zaXplb2YobGlzdCkpKQorICAgIHdyaXRlX2ZpbGUoZmlsZW4sIk5PTkVcbiIpOworICBmb3IgKGk9MDtpPHM7aSsrKQorICAgIHdyaXRlX2ZpbGUoZmlsZW4sbGlzdFtpXSk7CisgIHdyaXRlX2ZpbGUoZmlsZW4sIlxuXG5SVU5OSU5HIENBTExfT1VUUzpcbiIpOworICBsaXN0PWdldF9jYWxsb3V0KCk7CisgIGlmICghbGlzdCB8fCAhKHM9c2l6ZW9mKGxpc3QpKSkKKyAgICB3cml0ZV9maWxlKGZpbGVuLCJOT05FXG4iKTsKKyAgZm9yIChpPTA7aTxzO2krKykKKyAgICB3cml0ZV9maWxlKGZpbGVuLGxpc3RbaV0pOworICB3cml0ZSgiZG9uZS5cbiIpOworICByZXR1cm4gYXJnczsKK30KKworbWl4ZWQgcmVuZXdfcGxheWVyKHN0cmluZyBhcmcpCit7CisgIG9iamVjdCBvYjsKKworICBvYj1wb3AoKTsKKyAgaWYgKCFvYikKKyAgICByZXR1cm4gMTsKKyAgaWYgKCFvYmplY3RwKG9iKSYmIWludGVyYWN0aXZlKG9iKSkKKyAgeworICAgIGVycj1kZXNjKG9iKSsiIGlzIG5vdCBhbiBpbnRlcmFjdGl2ZSBwbGF5ZXIiOworICAgIHJldHVybiBhcmc7CisgIH0KKyAgaWYgKChlcnI9Ii9zZWN1cmUvbWFzdGVyIi0+cmVuZXdfcGxheWVyX29iamVjdChvYikpPDApCisgICAgZXJyPSJlcnJvciAiK2VycisiIHdoZW4gcmVuZXdpbmcgIitkZXNjKG9iKTsKKyAgcmV0dXJuIGFyZzsKK30KKworbWl4ZWQgY29weV9sZGZpZWQoc3RyaW5nIGFyZykKK3sKKyAgb2JqZWN0IG9iLCBuZXc7CisgIG1hcHBpbmcgcHJvcHM7CisKKyAgb2I9cG9wKCk7CisgIGlmICghb2IpCisgICAgcmV0dXJuIDE7CisgIGlmICghb2JqZWN0cChvYikpCisgIHsKKyAgICBlcnI9ZGVzYyhvYikrIiBpcyBub3QgYW4gdmFsaWQgb2JqZWN0IjsKKyAgICByZXR1cm4gYXJnOworICB9CisgIG5ldz1jbG9uZV9vYmplY3Qob2xkX2V4cGxvZGUob2JqZWN0X25hbWUob2IpLCIjIilbMF0pOworICBwcm9wcz1vYi0+UXVlcnlQcm9wZXJ0aWVzKCk7CisgIG5ldy0+U2V0UHJvcGVydGllcyhvYi0+UXVlcnlQcm9wZXJ0aWVzKCkpOworICBwdXNoKG5ldyk7CisgIG5ldy0+bW92ZSh0aGlzX3BsYXllcigpLE1fTk9DSEVDSyk7CisgIHJldHVybiBhcmc7Cit9CisKZGlmZiAtLWdpdCBhL29iai90b29scy9sdXBlLmRvYyBiL29iai90b29scy9sdXBlLmRvYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjM5NDZmCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL2x1cGUuZG9jCkBAIC0wLDAgKzEsMTQwIEBACitUaGUgbGVucyBvYmplY3QgdXNlcyBhIHN0YWNrIHRvIG1hbmlwdWxhdGUgb2JqZWN0cy4gU29tZSBjb21tYW5kcyBwdXNoIG9iamVjdHMKK29uIHRoZSBzdGFjaywgc29tZSBwb3AgdGhlbSBhZ2FpbiBvZmYgdGhlIHN0YWNrIGFuZCB1c2UgdGhlbSBmb3IgdmFyaW91cworcHVycG9zZXMuIFRoZXJlIG1heSBiZSBtdWx0aXBsZSBjb21tYW5kcyBvbiBhIHNpbmdsZSBsaW5lLCBzZXBhcmF0ZWQgYnkKK3NwYWNlcy4gVGhlIG51bWJlciBvZiBzcGFjZXMgYmV0d2VlbiBjb21tYW5kcyBvciBiZXR3ZWVuIGNvbW1hbmRzIGFuZAorYXJndW1lbnRzIGlzIG5vdCBjcml0aWNhbCwgaS5lLiB0aGVyZSBtYXkgYWxzbyBiZSB0d28gb3IgbW9yZSBzcGFjZXMuCisKK05vdGF0aW9uOgorCTxhcmc+CTogYSBzZXF1ZW5jZSBvZiBjaGFyYWN0ZXJzIHdoaWNoIGRvZXNuJ3QgY29udGFpbiBzcGFjZXMgb3IKKwkJICBkb3RzLiBJZiBpdCBkb2VzLCB1c2UgIi4uLiIsICcuLi4nIG9yIHwuLi58IHRvIGVuY2xvc2UKKwkJICBpdC4KKwk8bnVtYmVyPjogYW4gaW50ZWdlciwgcG9zaXRpdmUgb3IgbmVnYXRpdmUuCisJPGZpbGVuYW1lPjogc2FtZSBhcyA8YXJnPiAodXNlIHF1b3RlcyBpZiBpdCBjb250YWlucyBkb3RzKS4gTWF5IGJlCisJCSAgYWJzb2x1dGUgKHN0YXJ0aW5nIHdpdGggLykgcmVsYXRpdmUgdG8geW91ciBob21lIGRpcmVjdG9yeQorCQkgIChzdGFydGluZyB3aXRoIH4vKSBvciByZWxhdGl2ZSB0byBzb21lYm9keSBlbHNlJ3MgaG9tZQorCQkgIGRpcmVjdG9yeSAoc3RhcnRpbmcgd2l0aCB+bmFtZS8pLgorCTxmdW5jdGlvbj46IE5hbWUgb2YgYW4gTFBDLWZ1bmN0aW9uLgorCitDb21tYW5kczoKKwlwbCA8YXJnPgk6IHB1c2ggcGxheWVyIG9iamVjdCB3aXRoIG5hbWUgPGFyZz4uCisJbHYgPGFyZz4JOiBwdXNoIGxpdmluZyBvYmplY3Qgd2l0aCBuYW1lIDxhcmc+LgorCW1lCQk6IHB1c2ggeW91cnNlbGYuCisJaGVyZQkJOiBwdXNoIHRoZSBsb2NhdGlvbiB5b3UgYXJlIGluLgorCW9iIDxmaWxlbmFtZT4JOiBsb2FkICYgcHVzaCB0aGUgb2JqZWN0IGRlbm90ZWQgYnkgPGZpbGVuYW1lPi4KKwk8ZmlsZW5hbWU+CTogc2FtZSBhcyBvYiA8ZmlsZW5hbWU+IGlmIGl0IGJlZ2lucyB3aXRoIC8gb3Igfi4KKwluZXcgPGZpbGVuYW1lPgk6IGNsb25lICYgcHVzaCB0aGUgb2JqZWN0IGRlbm90ZWQgYnkgPGZpbGVuYW1lPi4KKwkJCSAgVGhlcmVhZnRlciBtb3ZlIGl0IGluIHlvdXIgaW52ZW50b3J5LgorICAgICAgICBjcmVhdCA8ZmlsZW5hbWU+OiBzYW1lIGFzIG5ldywgYnV0IGRvbid0IG1vdmUgaXQgaW50byB5b3VyIGludmVudG9yeS4KKwllbnYJCTogcHVzaCB0aGUgZW52aXJvbm1lbnQgb2YgdGhlIFRPUy4KKwkuPG51bWJlcj4JOiBwdXNoIHRoZSBudGggb2JqZWN0IGluIHRoZSBpbnZlbnRvcnkgb2YgdGhlIFRPUy4KKwkuPGFyZz4JCTogcHVzaCB0aGUgb2JqZWN0IHdpdGggaWQgPGFyZz4gaW4gdGhlIGludmVudG9yeQorCQkJICBvZiB0aGUgVE9TLgorCT0JCTogZGlzcGxheSB0aGUgVE9TLgorCWluZm8JCTogc2hvdyBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgVE9TLgorCXN0awkJOiBzaG93IHRoZSBlbnRpcmUgc3RhY2suCisJY2xyCQk6IGNsZWFyIHRoZSBlbnRpcmUgc3RhY2suCisJZHVwCQk6IGR1cGxpY2F0ZSB0aGUgdG9wbW9zdCBzdGFjayBlbnRyeS4KKwlwb3AJCTogZGlzY2FyZCB0aGUgdG9wbW9zdCBzdGFjayBlbnRyeS4KKwlzd2FwCQk6IGV4Y2hhbmdlIHRoZSB0d28gdG9wbW9zdCBzdGFjayBlbnRyaWVzLgorCW92ZXIJCTogcHVzaCB0aGUgZW50cnkgc2Vjb25kIGZyb20gdG9wLgorCUA8bnVtYmVyPgk6IHB1c2ggdGhlIHN0YWNrIGVudHJ5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIG51bWJlci4KKwkJCSAgVGhlIHRvcG1vc3Qgb25lIGhhcyBudW1iZXIgMC4KKwlpbnYJCTogc2hvdyB0aGUgaW52ZW50b3J5IG9mIHRoZSBUT1MuCisJY2xuCQk6IGNsZWFuIHRoZSBpbnZlbnRvcnkgb2YgdGhlIFRPUy4gUGxheWVycyBhcmUgbm90CisJCQkgIGRlc3RydWN0ZWQuCisJY2xub2YgPGFyZz4JOiBjbGVhbiB0aGUgaW52ZW50b3J5IG9mIHRoZSBUT1Mgb2YgYWxsIG9iamVjdHMgd2l0aAorCQkJICBpZCA8YXJnPi4KKwlyZWMJCTogcGVyZm9ybSB0aGUgbmV4dCBpbnYsIGNsbiBvciBjbG5vZiByZWN1cnNpdmVseS4KKwlub3JlYwkJOiB1c2UgdGhpcyB0byB0dXJuIG9mIHJlYyBhZ2FpbiBpZiB5b3UgYXJlIG5vdCBnb2luZworCQkJICB0byB1c2Ugb25lIG9mIGludiwgY2xuIG9yIGNsbm9mLiBpbnYsIGNsbiBhbmQgY2xub2YKKwkJCSAgdHVybiBvZmYgcmVjIGF1dG9tYXRpY2FsbHkgYWZ0ZXIgYmVpbmcgdXNlZC4KKwlkZXN0CQk6IGRlc3RydWN0IHRoZSBUT1MuCisJbWFrZQkJOiBkZXN0cnVjdCB0aGUgVE9TLCB0aGVuIHJlYnVpbGQgaXQgZnJvbSB0aGUgZmlsZS4KKwkJCSAgVmVyeSB1c2VmdWwgd2hlbiBkZXZlbG9waW5nIHJvb21zLgorCW1vdgkJOiBtb3ZlIHRoZSBvYmplY3QgZGVub3RlZCBieSB0aGUgc3RhY2sgZW50cnkgdGhhdCBpcworCQkJICBzZWNvbmQgZnJvbSB0b3AgaW50byB0aGUgVE9TLgorCVs8ZnVuY3Rpb24+XQk6IGNhbGwgPGZ1bmN0aW9uPiBpbiB0aGUgVE9TLgorCVs8ZnVuY3Rpb24+IDxhcmcxPiAuLi4gPGFyZ24+XQorCQkJOiBjYWxsIDxmdW5jdGlvbj4gaW4gdGhlIFRPUy4gYXJndW1lbnRzIGFyZSBzZXBhcmF0ZWQKKwkJCSAgYnkgc3BhY2VzLiBJZiB0aGUgYXJndW1lbnRzIHRoZW1zZWx2ZXMgY29udGFpbgorCQkJICBzcGFjZXMsIGVuY2xvc2UgdGhlbSBieSAiLi4uIiwgJy4uLicgb3IgfC4uLnwuCisJCQkgIFVzZSBAPG51bWJlcj4gdG8gc3VwcGx5IG9iamVjdHMgb24gdGhlIHN0YWNrCisJCQkgIGFzIGFyZ3VtZW50cy4KKwlyZXN1bHQJCTogcHVzaCB0aGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBjYWxsIGlmIGl0IGlzCisJCQkgIGFuIG9iamVjdC4KKwlkZXNjCQk6IHRvZ2dsZSB3aGV0aGVyIHNob3J0IGRlc2NyaXB0aW9ucyBhcmUgc2hvd24gd2hlbgorCQkJICBkaXNwbGF5aW5nIG9iamVjdHMuCisJIwkJOiB0aGUgY29udGVudHMgb2YgdGhlIHN0YWNrIHdpbGwgYmUgcmVzdG9yZWQgYWZ0ZXIKKwkJCSAgcGVyZm9ybWluZyB0aGUgbmV4dCBjb21tYW5kIG9uIHRoZSBzYW1lIGxpbmUuCisJCQkgIFNpbmNlIGFsbCBjb21tYW5kcyB3aGljaCBtYW5pcHVsYXRlIHN0YWNrIG9iamVjdHMKKwkJCSAgZXhjZXB0IGludiBhbmQgPSBwb3AgdGhlbSwgdGhpcyBtaWdodCBjb21lIGluIGhhbmR5LgorCTw8bnVtYmVyPgk6IHVzZWQgdG8gcHVzaCB2YXJpYWJsZSA8bnVtYmVyPi4gTWF5IHJhbmdlIGZyb20KKwkJCSAgMCB0byA5LgorCT48bnVtYmVyPgk6IHN0b3JlIHRoZSBUT1MgaW4gdmFyaWFibGUgPG51bWJlcj4uCisJdmFycwkJOiBkaXNwbGF5IGFsbCB2YXJpYWJsZXMuCisKK1RoZSBmb2xsb3dpbmcgdHdvIGNvbW1hbmRzIGNhbiBvbmx5IGJlIHVzZWQgYXMgdGhlIGZpcnN0IGNvbW1hbmQgb24gYSBsaW5lLgorCisJPwkJOiB0aGVyZSBhcmUgdHdvIHVzYWdlcyBmb3IgdGhlID8tY29tbWFuZC4gRm9sbG93ZWQKKwkJCSAgYnkgdGV4dCBpdCB3aWxsIGV4ZWN1dGUgdGhlIGNvbW1hbmRzIGluIGl0LgorCQkJICBTaW1wbHkgaGl0dGluZyA/PENSPiB3aWxsIHB1dCB5b3UgaW4gaW50ZXJhY3RpdmUKKwkJCSAgbW9kZS4gTGVhdmUgdGhpcyBtb2RlIGJ5IHR5cGluZyAuPENSPi4gTGluZXMKKwkJCSAgdHlwZWQgaW4gd2lsbCBiZSBleGVjdXRlZCBieSB0aGUgbGVucyBhbmQgdGhlCisJCQkgIHN0YWNrIHNob3duIGFmdGVyd2FyZHMuCisKKwlncmFudAkJOiBUd28gZm9ybXMgYXJlIHBvc3NpYmxlOgorCQkJICAnZ3JhbnQgYWNjZXNzIHRvIDxuYW1lPicgYWxsb3dzIHRoZSBwbGF5ZXIgd2l0aAorCQkJICBuYW1lIDxuYW1lPiB0byB1c2UgdGhlIGxlbnMuCisJCQkgICdncmFudCBubyBhY2Nlc3MnIGRlbmllcyB0aGUgYWNjZXNzIHRvIGFsbCBwbGF5ZXJzCisJCQkgIGJlbG93IGxldmVsIDIxLgorCitFeGFtcGxlczoKKwltZSAvcm9vbS9jaHVyY2ggbW8KKwkJOiBnbyB0byB0aGUgY2h1cmNoLgorCXBsIGRlbW9zIG9iIH5kZW1vcy93b3Jrcm9vbSBtbworCQk6IG1vdmUgdGhlIHBsYXllciBkZW1vcyB0byBoaXMgd29ya3Jvb20uCisJaGVyZSBtYWtlCisJCTogdXBkYXRlIGFuZCBsb2FkIHRoZSByb29tIHlvdSBhcmUgaW4sIGtlZXBpbmcgdGhlIGludmVudG9yeQorCQkgIHVudG91Y2hlZC4KKwloZXJlIGR1cCByZWMgY2xuIG1ha2UKKwkJOiBzYW1lLCB0aGlzIHRpbWUgY2xlYW5pbmcgdXAgYmVmb3JlLgorCW1lLmJhZyBpbnYKKwkJOiBzaG93IHRoZSBjb250ZW50cyBvZiB0aGUgYmFnIHlvdSBoYXZlLgorCW1lLiJiYWcgMiIgaW52CisJCTogc2FtZSBmb3IgdGhlIHNlY29uZCBiYWcuCisJbWUgW3Nob3J0XQorCQk6IHNob3dzIHlvdXIgc2hvcnQgZGVzY3JpcHRpb24uCisJbWUgW3F1ZXJ5X2F0dGFja10gcmVzdWx0IFtzdG9wX2ZpZ2h0XQorCQk6IHBhY2lmeSB5b3VyIG9wcG9uZW50LgorCXBsIGRlbW9zIFthdHRhY2tlZF9ieSBAMF0KKwkJOiBtYWtlIERlbW9zIGF0dGFjayBoaW1zZWxmLgorCWx2IHRyb2xsIHBsIGRlbW9zIFthdHRhY2tlZF9ieSBAMV0KKwkJOiBkZW1vcyBpcyBhdHRhY2tlZCBieSBhIHRyb2xsLgorCWhlcmUudHJvbGwgaGVyZS5kZW1vcyBbYXR0YWNrZWRfYnkgQDFdCisJCTogc2FtZSBlZmZlY3QgaWYgdGhleSdyZSBib3RoIGhlcmUuCisJbmV3IC9vYmovbGV2ZWxfbGlzdAorCQk6IGdldCB5b3Vyc2VsZiBhIGNvcHkgb2YgdGhlIHRvcCB0ZW4gbGlzdC4KKwlwbCBlcmVib3JuIGNsbm9mIGZsZWEKKwkJOiBoZWxwIHBvb3IgZXJlYm9ybiB0byBnZXQgcmlkIG9mIHRob3NlIGZsZWFzLgorCXBsIGRlbW9zIGVudiBbbG9uZ10KKwkJOiBzaG93IHRoZSByb29tIHdoZXJlIGRlbW9zIGlzLgorCWhlcmUgcmVjIGludiBwb3AKKwkJOiBzaG93IHRoZSBpbnZlbnRvcnkgb2YgeW91ciBjdXJyZW50IGxvY2F0aW9uIGFuZCBjbGVhbgorCQkgIHVwIHRoZSBzdGFjayBhZnRlcndhcmRzLgorCW1lICNbc2V0X3N0ciAyMF0gI1tzZXRfZGV4IDIwXSAjW3NldF9pbnQgMjBdICNbc2V0X2NvbiAyMF0KKwkJOiBzZXQgYWxsIHlvdXIgc3RhdHMgdG8gdGhlIG1heGltdW0gcG9zc2libGUgdmFsdWUuCisJbWUgW3NldF90aXRsZSAidGhlIG5ldyB3aXphcmQiXQorCQk6IGNoYW5nZXMgeW91ciB0aXRsZSBhY2NvcmRpbmdseS4KKwlwbCBkZW1vcyBlbnYgPjQKKwkJOiBzdG9yZSB0aGUgcm9vbSBEZW1vcyBpcyBpbiBpbiB2YXJpYWJsZSA0LgorCTw0IFtxdWVyeV9kZXN0X2Rpcl0KKwkJOiBnZXQgaXQgYWdhaW4gYW5kIGxpc3QgdGhlIHBvc3NpYmxlIGV4aXRzLgorCW1lIHJlYyBpbnYgLjQgaW52CisJCTogZ2V0IGEgcmVjdXJzaXZlIGxpc3Rpbmcgb2YgeW91cnNlbGYsIHRoZW4gYSBub24tcmVjdXJzaXZlCisJCSAgb25lIG9mIHRoZSA0dGggaXRlbSBpbiB5b3VyIGludmVudG9yeQorCW1lLjQuMSBpbmZvCisJCTogc2hvdyBzb21lIGluZm9ybWF0aW9uIG9mIHRoZSBmaXJzdCBpdGVtIHdpdGhpbiB0aGUgZm91cnRoCisJCSAgaXRlbSBpbiB5b3VyIGludmVudG9yeS4KKwkJICBQbGVhc2Ugbm90ZSB0aGF0IHdoZW4gZG9pbmcgYSByZWMgaW52IGFsbCB0aGUgbmVjZXNzYXJ5CisJCSAgaW5mb3JtYXRpb24gdG8gZmluZCBhbnkgb2JqZWN0IGlzIGRpc3BsYXllZCBpbiBmcm9udAorCQkgIG9mIGl0LgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL2x1cGUuZG9rIGIvb2JqL3Rvb2xzL2x1cGUuZG9rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4ZTIzZmUKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvbHVwZS5kb2sKQEAgLTAsMCArMSwyMDkgQEAKK0FMTEdFTUVJTkVTOgorCURpZSBMdXBlIGJlbnV0enQgZWluZW4gU3RhcGVsIChTdGFjayksIHVtIE9iamVrdGUgenUgYmVhcmJlaXRlbi4KKwlFaW5pZ2UgQmVmZWhsZSBzY2hpZWJlbiBPYmpla3RlIGF1ZiBkZW4gU3RhcGVsLCBhbmRlcmUgd2llZGVydW0KKwlob2xlbiBzaWUgd2llZGVyIHZvbSBTdGFwZWwgaGVydW50ZXIgdW5kIGJlbnV0emVuIHNpZSBmdWVyIGRpZQorCXZlcnNjaGllZGVuc3RlbiBad2Vja2UuCisJTWFuIGthbm4gaW4gZWluZXIgWmVpbGUgbWVocmVyZSBLb21tYW5kb3MgZ2xlaWNoemVpdGlnIGFuZ2ViZW4KKwkoZHVyY2ggTGVlcnplaWNoZW4gZ2V0cmVubnQpLgorCUVpbmUgWmVpbGUgd2lyZCBpbW1lciB2b24gbGlua3MgbmFjaCByZWNodHMgYWJnZWFyYmVpdGV0LgorCitTQ0hSRUlCV0VJU0VOOgorCTxhcmc+CS0gRWluZSBSZWloZSB2b24gWmVpY2hlbiwgZGllIHdlZGVyIExlZXJ6ZWljaGVuIG5vY2ggUHVua3RlCisJCSAgKC4pIGVudGhhZWx0LiBGYWxscyBkb2NoIExlZXJ6ZWljaGVuIG9kZXIgUHVua3RlIGluIDxhcmc+CisJCSAgYXVmdGF1Y2hlbiwgbXVzcyBtYW4gZGllIFplaWNoZW5rZXR0ZSB6d2lzY2hlbiAiLi4uIiwKKwkJICAnLi4uJyBvZGVyIHwuLi58IGVpbnNjaGxpZXNzZW4uCisJPG5yPgktIEVpbmUgKHBvc2l0aXZlIG9kZXIgbmVnYXRpdmUpIGdhbnplIFphaGwuCisJPGZpbGVuYW1lPiAtIEVpbiBEYXRlaW5hbWUuIEZ1ZXIgaWhuIGdpbHQgZGFzIEdsZWljaGUgd2llIGZ1ZXIgPGFyZz46CisJCSAgV2VubiBlciBQdW5rdGUgZW50aGFlbHQsIG11c3MgbWFuIGlobiB6d2lzY2hlbiAiLi4uIiwKKwkJICAnLi4uJyBvZGVyIHwuLi58IGVpbnNjaGxpZXNzZW4uCisJCSAgRXMgc2luZCBhbGxlIFZhcmlhdGlvbmVuIG1vZWdsaWNoLCBkaWUgbWFuIGF1Y2ggYXVzIGRlcgorCQkgIE1hZ2llcnNoZWxsIGtlbm50OiBhYnNvbHV0ZSBEYXRlaW5hbWVuIChiZWdpbm5lbiBtaXQgIi8iKSwKKwkJICBEYXRlaW5hbWVuIHJlbGF0aXYgenVtIGVpZ2VuZW4gSG9tZXZlcnplaWNobmlzICgifi8iKQorCQkgIG9kZXIgenVtIEhvbWV2ZXJ6ZWljaG5pcyBlaW5lcyBhbmRlcmVuIE1hZ2llcnMgKCJ+bmFtZS8iKSwKKwkJICBEYXRlaW5hbWVuIGluIGVpbmVyIFJlZ2lvbiAoIityZWdpb24vIikgdW5kIERhdGVpbmFtZW4KKwkJICByZWxhdGl2IHp1bSBha3R1ZWxsZW4gVmVyemVpY2huaXMgKGFsbGVzIGFuZGVyZSA7KS4KKwk8ZnVuYz4JLSBOYW1lIGVpbmVyIExQQy1GdW5rdGlvbi4KKwlUT1MJLSBEYXMgT2JqZWt0IGdhbnogb2JlbiBhdWYgZGVtIFN0YXBlbCAoVG9wIE9mIFN0YWNrKS4KKworREVSIFNUQVBFTDoKKwlCZWkgZGVtIFN0YXBlbCBoYW5kZWx0IGVzIHNpY2ggdW0gZWluZW4gTElGTy1TdGFwZWwgKExhc3QgSW4gLSBGaXJzdAorCU91dCksIGQuaC4gZGFzIE9iamVrdCwgZGFzIHp1bGV0enQgYXVmIGRlbiBTdGFwZWwgZ2VzY2hvYmVuIHd1cmRlLAorCXdpcmQgYWxzIGVyc3RlcyBiZWFyYmVpdGV0LgorCUJlaSBkZXIgQmVhcmJlaXR1bmcgd2lyZCBkZXIgVE9TIGluIGRlciBSZWdlbCB2b20gU3RhcGVsIGVudGZlcm50CisJKEF1c25haG1lbjogPSwgc3RrIHVuZCAjKSwgZGVyIFN0YXBlbCB3aXJkIGFsc28gaW0gTGF1ZmUgZGVyIFplaXQKKwl3aWVkZXIga2xlaW5lci4KKwlEZXIgU3RhcGVsIGthbm4gbWF4aW1hbCB6ZWhuIEVsZW1lbnRlIGF1Zm5laG1lbi4gRGllc2VzIExpbWl0IHdpcmQKKwltYW4gYmVpICJub3JtYWxlbSBCZXRyaWViIiBhbGxlcmRpbmdzIHNlbHRlbiBlcnJlaWNoZW4uCisJU29sbHRlIGVzIHRyb3R6ZGVtIGVpbm1hbCBlbmcgd2VyZGVuLCBzdGVoZW4gZWluZW0gbm9jaCB6ZWhuCisJVmFyaWFibGVuIHp1ciBWZXJmdWVndW5nLCBpbiBkZW5lbiBtYW4genVzYWV0emxpY2ggT2JqZWt0ZSAodm9tCisJU3RhcGVsKSBhYmxlZ2VuIGthbm4uCisKK0JFRkVITEU6CisJRXMgZ2lidCBkcmVpIHVudGVyc2NoaWVkbGljaGUgQmVmZWhsc2dydXBwZW46CisJYSkgQmVmZWhsZSwgZGllIGVpbiBPYmpla3QgYXVmIGRlbiBTdGFwZWwgc2NoaWViZW47CisJYikgQmVmZWhsZSwgZGllIG1pdCBPYmpla3RlbiBhdWYgZGVtIFN0YXBlbCBhcmJlaXRlbjsKKwljKSBCZWZlaGxlLCBkaWUgb2huZSBkZW4gU3RhcGVsIGF1c2tvbW1lbi4KKwlFaW5pZ2UgQmVmZWhsZSBzZXR6ZW4gdm9yYXVzLCBkYXMgZGVyIFRPUyBlaW4gTGViZXdlc2VuIG9kZXIgZ2FyIGVpbgorCVNwaWVsZXJvYmpla3QgaXN0OyBhbmRlcmUgQmVmZWhsZSBzaW5kIGVyc3QgYWIgZWluZW0gYmVzdGltbXRlbgorCU1hZ2llcmxldmVsIHp1Z2FlbmdsaWNoLiBEaWVzIGlzdCBiZWkgZGVuIGVudHNwcmVjaGVuZGVuIEJlZmVobGVuCisJamV3ZWlscyB2ZXJtZXJrdC4KKworICAgIERpZXNlIEJlZmVobGUgc2NoaWViZW4gZWluIG5ldWVzIE9iamVrdCBhdWYgZGVuIFN0YXBlbDoKKwljcmVhdCA8ZmlsZW5hbWU+IE1hY2h0IGRhcyBHbGVpY2hlIHdpZSAnbmV3JywgZGFzIE9iamVrdCB3aXJkIGFsbGVyLQorCQkJZGluZ3MgbmljaHQgaW4gRGVpbiBJbnZlbnRvcnkgZ2VzdGVja3QuCisJaGVyZQkJRGFzIE9iamVrdCwgaW4gZGVtIG1hbiBnZXJhZGUgc3RlaHQsIGF1ZiBkZW4gU3RhcGVsCisJCQlzY2hpZWJlbi4KKwlsdiA8YXJnPglTY2hpZWJ0IGRhcyBMZWJld2VzZW4gbWl0IGRlbSBsaXZpbmdfbmFtZSA8YXJnPiBhdWYKKwkJCWRlbiBTdGFwZWwuIEFDSFRVTkchIERhcyBtdXNzIGRhbm4gbmljaHQgdW5iZWRpbmd0CisJCQlkYXMgTGViZXdlc2VuIHNlaW4sIGRhcyBtYW4gZG9ydCBlaWdlbnRsaWNoIGhhYmVuCisJCQl3aWxsISBFcyB3aXJkIGVpbmZhY2ggZGFzIGVyc3RlIE9iamVrdCBnZW5vbW1lbiwKKwkJCWRlc3NlbiBsaXZpbmdfbmFtZSBwYXNzdCEgV2VubiBtYW4gZXR3YXMgbWl0IGVpbmVtCisJCQlOUEMgdm9yaGF0LCBkZXIgaW0gZ2xlaWNoZW4gUmF1bSBzdGVodCwgc3ByaWNodCBtYW4KKwkJCWlobiBiZXNzZXIgbWl0IGhlcmUubmFtZSBhbi4KKwltZQkJU2ljaCBzZWxic3QgYXVmIGRlbiBTdGFwZWwgc2NoaWViZW4uCisJbmV3IDxmaWxlbmFtZT4JQ2xvbmVkIGRhcyBtaXQgPGZpbGVuYW1lPiBhbmdlZ2ViZW5lIE9iamVrdCB1bmQKKwkJCXNjaGllYnQgZXMgYXVmIGRlbiBTdGFwZWwuIEFuc2NobGllc3NlbmQgYmVmaW5kZXQgZXMKKwkJCXNpY2ggaW4gRGVpbmVtIEludmVudG9yeS4KKwlvYiA8ZmlsZW5hbWU+CUxhZWR0IGRhcyBPYmpla3QsIGRhcyBtaXQgPGZpbGVuYW1lPiBhbmdlZ2ViZW4gaXN0LAorCQkJdW5kIHNjaGllYnQgZXMgYXVmIGRlbiBTdGFwZWwuCisJcGwgPGFyZz4JU2NoaWVidCBkYXMgU3BpZWxlcm9iamVrdCBtaXQgZGVtIE5hbWVuIDxhcmc+IGF1ZiBkZW4KKwkJCVN0YXBlbC4KKwkJCUVzIHdlcmRlbiBhdWNoIG5ldHp0b3RlIFNwaWVsZXIgYmVydWNrc2ljaHRpZ3QuCisJcHVzaCA8ZmlsZW5hbWU+IFNjaGllYnQgZGFzIE9iamVrdCwgZGFzIG1pdCA8ZmlsZW5hbWU+IGFuZ2VnZWJlbiBpc3QsCisJCQlhdWYgZGVuIFN0YXBlbC4KKwk8ZmlsZW5hbWU+CU1hY2h0IGRhcyBnbGVpY2hlIHdpZSAnb2InLCBmYWxscyA8ZmlsZW5hbWU+IG1pdCAiLyIKKwkJCW9kZXIgIn4iIGJlZ2lubnQuCisKKyAgICBEaWUgbmFlY2hzdGVuIEJlZmVobGUgc2NoYWx0ZW4gT3B0aW9uZW4gZGVyIEx1cGUgYW4vYXVzL3VtOgorCWRlc2MJCURpZSB6dXNhZXR6bGljaGUgQW5nYWJlIGRlciBLdXJ6YmVzY2hyZWlidW5nIGRlcworCQkJYWt0dWVsbGVuIE9iamVrdGVzIHdpcmQgdW50ZXJkcnVlY2t0LgorCXJlYwkJU2NoYWx0ZXQgaW4gZGVuICJyZWt1cnNpdiItTW9kdXMgdW0uIERpZXNlciBNb2R1cworCQkJd2lyZCB2b24gZm9sZ2VuZGVuIEJlZmVobGVuIGdlbnV0enQ6CisJCQknaW52JywgJ2NsbicgdW5kICdjbG5vZicKKwkJCU5hY2ggQXVzZnVlaHJ1bmcgZWluZXMgZGllc2VyIEJlZmVobGUgd2lyZCBkZXIKKwkJCSJyZWt1cnNpdiItTW9kdXMgYXV0b21hdGlzY2ggd2llZGVyIGFiZ2VzdGVsbHQuCisJbm9yZWMJCVN0ZWxsdCBkZW4gInJla3Vyc2l2Ii1Nb2R1cyAidm9uIEhhbmQiIGFiLgorCisgICAgRGllc2UgQmVmZWhsZSBzY2hpZWJlbiBlYmVuZmFsbHMgZWluIG5ldWVzIE9iamVrdCBhdWYgZGVuIFN0YXBlbC4gU2llCisgICAgYXJiZWl0ZW4gZGFiZWkgYWxsZXJkaW5ncyByZWxhdGl2IHp1bSBUT1MuIE1hbiBtdXNzIGFsc28gc2Nob24gbWluZGVzdGVucworICAgIGVpbiBPYmpla3QgYXVmIGRlbiBTdGFwZWwgZ2VzY2hvYmVuIGhhYmVuLiBEZXIgYWx0ZSBUT1Mgd2lyZCBkYWJlaSBpbiBkZXIKKyAgICBSZWdlbCBlbnRmZXJudC4KKwkuPG5yPgkJU2NoaWVidCBkYXMgPG5yPnRlIE9iamVrdCBpbSBJbnZlbnRvcnkgZGVzIFRPUyBhdWYgZGVuCisJCQlTdGFwZWwuCisJLjxhcmc+CQlTY2hpZWJ0IGRhcyBPYmpla3QgbWl0IGRlciBJRCA8YXJnPiBpbSBJbnZlbnRvcnkgZGVzCisJCQlUT1MgYXVmIGRlbiBTdGFwZWwuCisJPDxucj4JCVNjaGllYnQgZGllIFZhcmlhYmxlIDxucj4gYXVmIGRlbiBTdGFwZWwuIEFscyA8bnI+CisJCQlzaW5kIFdlcnRlIHp3aXNjaGVuIDAgdW5kIDkgbW9lZ2xpY2guCisJQDxucj4JCVNjaGllYnQgZGFzIDxucj50ZSBPYmpla3Qgdm9uIG9iZW4gbm9jaCBlaW5tYWwgYXVmIGRlbgorCQkJU3RhcGVsLiBEZXIgYWx0ZSBUT1MgaGF0IGRpZSBOdW1tZXIgMC4gV2VkZXIgZGVyIGFsdGUKKwkJCVRPUyBub2NoIGRhcyB2ZXJzY2hvYmVuZSBPYmpla3Qgd2VyZGVuIHZvbSBTdGFwZWwgZW50LQorCQkJZmVybnQuCisJCQlAMSBpc3QgYW5hbG9nIHp1ICdvdmVyJy4KKwljb3B5CQlMZWd0IGVpbmUgS29waWUgZGVzIFRPUyBhbiAoaW5rbC4gYWxsZXIgUHJvcGVydHl3ZXJ0ZSkKKwkJCXVuZCBzY2hpZWJ0IGRpZXNlIEtvcGllIGF1ZiBkZW4gU3RhcGVsLiBEaWUgS29waWUKKwkJCWJlZmluZGV0IHNpY2ggZGFuYWNoIGluIERlaW5lbSBJbnZlbnRvcnkuCisJZHVwCQlTY2hpZWJ0IGRlbiBUT1MgZG9wcGVsdCBhdWYgZGVuIFN0YXBlbC4KKwllbnYJCVNjaGllYnQgZGFzIE9iamVrdCwgaW4gZGVtIHNpY2ggZGVyIFRPUyBiZWZpbmRldCwgYXVmCisJCQlkZW4gU3RhcGVsLgorCW92ZXIJCVNjaGllYnQgZGFzIE9iamVrdCwgZGFzIHNpY2ggdW50ZXIgZGVtIFRPUyBiZWZpbmRldCwKKwkJCW5vY2htYWwgYXVmIGRlbiBTdGFwZWwuIERhYmVpIHdlcmRlbiB3ZWRlciBkZXIgYWx0ZQorCQkJVE9TIG5vY2ggZGFzIE9iamVrdCB1bnRlciBpaG0gZW50ZmVybnQuCisJcmVzdWx0CQlXZW5uIGluIGVpbmVtIE9iamVrdCBlaW5lIEZ1bmt0aW9uIGF1ZmdlcnVmZW4gd3VyZGUsCisJCQl1bmQgZGllc2UgRnVua3Rpb24gd2llZGVyIGVpbiBPYmpla3QgenVydWVja2dlZ2ViZW4KKwkJCWhhdCwgc28gd2lyZCBkaWVzZXMgT2JqZWt0IGF1ZiBkZW4gU3RhcGVsIGdlc2Nob2Jlbi4KKwlzd2FwCQlUYXVzY2h0IFRPUyB1bmQgZGFzIGRhcnVudGVyIGxpZWdlbmRlIEVsZW1lbnQgZ2VnZW4tCisJCQllaW5hbmRlciBhdXMuCisKKyAgICBEaWUgbmFlY2hzdGVuIEJlZmVobGUgYXJiZWl0ZW4gbWl0IGRlbiBhdWYgZGVtIFN0YXBlbCBsaWVnZW5kZW4gT2JqZWt0ZW4uCisgICAgRGFiZWkgd2VyZGVuIGRpZSBiZWFyYmVpdGV0ZW4gT2JqZWt0ZSBpbiBkZXIgUmVnZWwgdm9tIFN0YXBlbCBlbnRmZXJudC4KKwk+PG5yPgkJU3BlaWNoZXJ0IGRlbiBUT1MgaW4gZGVyIFZhcmlhYmxlbiA8bnI+LiBBbHMgPG5yPgorCQkJc2luZCBXZXJ0ZSB6d2lzY2hlbiAwIHVuZCA5IG1vZWdsaWNoLgorCT0JCVplaWd0IGRlbiBUT1MuIERpZXNlciBibGVpYnQgZGFiZWkgdW52ZXJhZW5kZXJ0LgorCSMJCURlciBTdGFjayBibGVpYnQgdWViZXIgZGFzIG5hZWNoc3RlIEtvbW1hbmRvIGhpbmF1cworCQkJZXJoYWx0ZW4uCisJaW52CQlaZWlndCBkYXMgSW52ZW50b3J5IGRlcyBUT1MuIERlciBUT1MgYmxlaWJ0IGRhYmVpCisJCQl1bnZlcmFlbmRlcnQuCisJY2xuCQlFbnRmZXJudCBhbGxlIE9iamVrdGUgYXVzIGRlbSBJbnZlbnRvcnkgZGVzIFRPUy4gRXMKKwkJCXdlcmRlbiBhbGxlcmRpbmdzIGtlaW5lIFNwaWVsZXIgZW50ZmVybnQuCisJY2xub2YgPGFyZz4JRW50ZmVybnQgYWxsZSBPYmpla3RlLCBkaWUgYXVmIGRpZSBJRCA8YXJnPiBhbnNwcmUtCisJCQljaGVuLCBhdXMgZGVtIEludmVudGFyIGRlcyBUT1MuCisJY2xyCQlMb2VzY2h0IGRlbiBnZXNhbXRlbiBTdGFjay4KKwlEZXN0CQlEZXIgVE9TIHdpcmQgemVyc3RvZXJ0LiBEYXMgZ2VodCBhbGxlcmRpbmdzIE5JQ0hULAorCQkJd2VubiBkZXIgVE9TIGVpbiBTcGllbGVyb2JqZWt0IG9kZXIgZGllIEx1cGUgc2VsYnN0CisJCQlpc3QuCisJZGVzdAkJV2llIERlc3QsIGFsbGVyZGluZ3Mgd2lyZCB6dWVyc3QgVE9TLT5yZW1vdmUoKSBhdWYtCisJCQlnZXJ1ZmVuLCB1bSBkZW0gVE9TIGRpZSBNb2VnbGljaGtlaXQgenUgZ2ViZW4sIG5vY2gKKwkJCWhpbnRlciBzaWNoIGF1Znp1cmFldW1lbi4KKwlkaW5mbwkJR2lidCBlaW5pZ2UgR2FtZURyaXZlci1pbnRlcm5lIEluZm9ybWF0aW9uZW4gd2llIHpCLgorCQkJZGllIFplaXQgZGVzIG5hZWNoc3RlbiByZXNldCgpLUF1ZnJ1ZnMgb2RlciBkaWUgYW4tCisJCQlnZXNhbW1lbHRlIGV2YWxjb3N0IGRlcyBUT1MgYXVzLgorCWRpc2NvCQlVbnRlcmJyaWNodCBkaWUgVmVyYmluZHVnIGRlcyBUT1MgKG11c3MgZWluIGFrdGl2ZXIKKwkJCVNwaWVsZXIgc2VpbikgenVtIE1HIChkaXNjb25uZWN0KS4KKwlobAkJWmVpZ3QgZGllIEhpc3RvcnlsaXN0ZSBkZXMgVE9TIGFuIChoaWVyYmVpIG11c3MgZXMKKwkJCXNpY2ggdW0gZWluZW4gU3BpZWxlciBoYW5kZWxuKS4KKwkJCURpZXNlciBCZWZlaGwgc3RlaHQgYWIgRUxERVJfTFZMICg1MCkgenVyIFZlcmZ1ZWd1bmcuCisJCQkhISFGdWVyIGRpZSBCZW51dHp1bmcgZ2lsdCBkYXMgR2xlaWNoZSB3aWUgZnVlciBkYXMKKwkJCVNub29wZW4hISEKKwlpZGxlCQlHaWJ0IGFuLCB3aWUgbGFuZ2UgZGVyIFRPUyBzY2hvbiBpZGxldC4gKERlciBUT1MKKwkJCXNvbGx0ZSBkYWJlaSBuYXR1ZXJsaWNoIGVpbiBTcGllbGVyIHNlaW4pLgorCWluZm8JCUdpYnQgZWluaWdlIEluZm9ybWF0aW9uZW4gdWViZXIgZGVuIFRPUyBhdXMuCisJaW5oZXJpdF9saXN0CUdpYnQgZGVuIFZlcmVyYnVuZ3NiYXVtIGRlcyBUT1MgYXVzIChhbGxlcmRpbmdzIG5pY2h0CisJCQlzZWhyIGJhdW1mb2VybWlnIDspCisJaW52CQlaZWlndCBkYXMgSW52ZW50b3J5IGRlcyBUT1MgYW4uCisKKwltYWtlCQlGdWVocnQgZWluIFVwZGF0ZSBkZXMgVE9TIGR1cmNoLiBHZWh0IG5pY2h0IGJlaQorCQkJU3BpZWxlcm4hIERhZnVlciBnaWJ0IGVzIHJlbmV3LgorCW1pbmZvCQlHaWJ0IGVpbmlnZSBJbmZvcm1hdGlvbmVuIHVlYmVyIGRlbiBTcGVpY2hlcnZlcmJyYXVjaAorCQkJZGVzIFRPUyBhdXMuCisJbW92ZSwgbW92LCBtbwlEYXMgT2JqZWt0LCBkYXMgdW50ZXIgZGVtIFRPUyBzdGVodCwgd2lyZCBpbiBkZW4gVE9TCisJCQlnZW1vdmVkLiBCZWlkZSBPYmpla3RlIHdlcmRlbiBkYWJlaSB2b20gU3RhcGVsIGVudC0KKwkJCWZlcm50LgorCV9tb3ZlLCBfbW92LCBfbW8sIF9tdgorCQkJRGFzIE9iamVrdCwgZGFzIHVudGVyIGRlbSBUT1Mgc3RlaHQsIHdpcmQgaW4gZGVuIFRPUworCQkJZ2Vtb3ZlZCwgb2huZSBkYXNzIGRvcnQgaW5pdCgpIGF1ZmdlcnVmZW4gd2lyZC4gQmVpZGUKKwkJCU9iamVrdGUgd2VyZGVuIGRhYmVpIHZvbSBTdGFwZWwgZW50ZmVybnQuCisJCQlEaWVzZXIgQmVmZWhsIHN0ZWh0IGFiIEFSQ0hfTFZMICg2MCkgenVyIFZlcmZ1ZWd1bmcuCisJcG9wCQlFbnRmZXJudCBkZW4gVE9TLgorCXJlbmV3CQlBZWhubGljaCB3aWUgJ21ha2UnLCBkZXIgVE9TIG11c3MgYWxsZXJkaW5ncyBlaW4KKwkJCVNwaWVsZXIgc2Vpbi4gQUNIVFVORyEgTWFuIHNvbGx0ZSBuaWNodCAiZWluZmFjaCBzbyIKKwkJCVNwaWVsZXIgJ3JlbmV3J2VuLCBzb25kZXJuIG51ciBkYW5uLCB3ZW5uIGVzIHdpcmtsaWNoCisJCQlnZXJlY2h0ZmVydGlndCBpc3QhCisJc2Nhbiwgc2MJS29tYmluaWVydCAnc3RhdCcgdW5kIGZpbmdlci4gRGVyIFRPUyBtdXNzIGVpbiBMZWJlLQorCQkJd2VzZW4gc2Vpbi4KKwlzdGF0CQlHaWJ0IEluZm9ybWF0aW9uZW4gdWViZXIgWnVzdGFuZCwgQXVzcnVlc3R1bmcsIGdlLQorCQkJbG9lc3RlIFF1ZXN0cyBldGMuIGRlcyBUT1MgYXVzLiBEZXIgVE9TIG11c3MgZGFiZWkKKwkJCWVpbiBMZWJld2VzZW4gc2Vpbi4KKwlzdGsJCVplaWd0IGRlbiBnZXNhbXRlbiBTdGFjay4gRGllc2VyIGJsZWlidCBkYWJlaSB1bnZlci0KKwkJCWFlbmRlcnQuCisJWzxmdW5jPl0JUnVmdCBpbSBUT1MgZGllIEZ1bmt0aW9uIDxmdW5jPiBvaG5lIFBhcmFtZXRlciBhdWYuCisJCQlGYWxscyBkaWVzZSBGdW5rdGlvbiBlaW4gT2JqZWt0IHp1cnVlY2tnaWJ0LCBrYW5uIG1hbgorCQkJZGllc2VzIGFuc2NobGllc3NlbmQgbWl0IHJlc3VsdCBhdWYgZGVuIFN0YXBlbAorCQkJc2NoaWViZW4uCisJWzxmdW5jPiA8YXJnMT4gLi4uIDxhcmduPl0KKwkJCVJ1ZnQgaW0gVE9TIGRpZSBGdW5rdGlvbiA8ZnVuYz4gbWl0IGRlbiBQYXJhbWV0ZXJuCisJCQk8YXJnMT4gYmlzIDxhcmduPiBhdWYuIERpZSBQYXJhbWV0ZXIgc2luZCBtaXQgTGVlci0KKwkJCXplaWNoZW4genUgdHJlbm5lbi4gRW50aGFsdGVuIGRpZSBQYXJhbWV0ZXIgc2VsYnN0CisJCQlMZWVyemVpY2hlbiwgc28gc2luZCBzaWUgaW4gIi4uLiIsICcuLi4nIG9kZXIgfC4uLnwKKwkJCWVpbnp1c2NobGllc3Nlbi4KKwkJCU1pdHRlbHMgQDxucj4ga2FubiBtYW4gYXVjaCBPYmpla3RlLCBkaWUgc2ljaCBhdWYgZGVtCisJCQlTdGFwZWwgYmVmaW5kZW4sIGFscyBBcmd1bWVudGUgYW5nZWJlbi4KKworICAgIERpZSBmb2xnZW5kZW4gQmVmZWhsZSBrb21tZW4gb2huZSBPYmpla3RlIGF1ZiBkZW0gU3RhY2sgYXVzOgorCWNhbGxfb3V0CUdpYnQgZWluZSBMaXN0ZSBhbGxlciBPYmpla3RlIG1pdCBlaW5lbSBsYXVmZW5kZW4KKwkJCWNhbGxfb3V0IGF1cy4KKwlkdW1wCQlTY2hyZWlidCBkaWUgTGlzdGVuIGFsbGVyIE9iamVrdGUgbWl0IGFrdGl2ZW0KKwkJCWhlYXJ0X2JlYXQgdW5kIGFsbGVyIE9iamVrdGUgbWl0IGxhdWZlbmRlbSBjYWxsX291dAorCQkJaW4gZGllIERhdGFpIExJU1RTLkxVUEUgaW4gRGVpbiBIb21ldmVyemVpY2huaXMuCisJZHVtcGhpc3RzCVNjaHJlaWJ0IGRpZSBCZWZlaGxzaGlzdG9yeSBhbGxlciBtb21lbnRhbiBlaW5nZS0KKwkJCWxvZ2d0ZW4gU3BpZWxlciBuYWNoIC9sb2cvQVJDSC9IRC4KKwkJCURpZXNlciBCZWZlaGwgc3RlaHQgZXJzdCBhYiBBUkNIX0xWTCAoNjApIHp1cgorCQkJVmVyZnVlZ3VuZy4KKwloZWFydF9iZWF0CUdpYnQgZWluZSBMaXN0ZSBhbGxlciBPYmpla3RlIG1pdCBha3RpdmVtIGhlYXJ0X2JlYXQKKwkJCWF1cy4KKwlydXNhZ2UJCVplaWd0IGVpbmlnZSBJbmZvcyB1ZWJlciBkZW4gUmVzc291cmNlbmdlLS8tdmVyYnJhdWNoCisJCQlkZXMgTXVkcyBhbi4KKwlzd2hvCQlaZWlndCAoc28gZ3V0IHdpZSkgYWxsZSBha3RpdmVuIFNub29wcy4KKwl2YXJzCQlaZWlndCBkaWUgYmVsZWd0ZW4gVmFyaWFibGVuIGFuLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMYXN0IG1vZGlmaWVkOiBXZWQgSnVuIDI2IDE0OjQ5OjAyIDE5OTYgYnkgV2FyZ29uClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL21lcmt6ZXR0ZWwvbWVya3pldHRlbC5jIGIvb2JqL3Rvb2xzL21lcmt6ZXR0ZWwvbWVya3pldHRlbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNDQ3YWIKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvbWVya3pldHRlbC9tZXJremV0dGVsLmMKQEAgLTAsMCArMSwxMTMwIEBACisvKiAgL29iai90b29scy9tZXJremV0dGVsLmMKKyAgICBNZXJremV0dGVsIGZ1ZXIgTWFnaWVyCisgICAgQXV0b3I6IFplc3N0cmEKKyAgICBnZ2YuIENoYW5nZWxvZzoKKyovCisjcHJhZ21hIHN0cmljdF90eXBlcworI3ByYWdtYSBub19zaGFkb3cKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKyNwcmFnbWEgcGVkYW50aWMKKworaW5oZXJpdCAiL3N0ZC9zZWN1cmVfdGhpbmciOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorCisjZGVmaW5lIE5FRURfUFJPVE9UWVBFUworI2luY2x1ZGUgIm1lcmt6ZXR0ZWwuaCIKKyN1bmRlZiBORUVEX1BST1RPVFlQRVMKKworLy9WYXJpYWJsZW4KK21hcHBpbmcgbm90aXplbjsKKy8vbWFwcGluZyBub3RpemVuX2luYWt0aXY7CitpbnQgbWF4dXNlZElEOworc3RhdGljIHN0cmluZyBvd25lcjsgLy9VSUQgZGVzIEJlc2l0emVycywgd2lyZCBpbiBQX0FVVE9MT0FEIGdlc3BlaWNoZXJ0CisvL3N0YXRpYyBpbnQgKmNhY2hlOyAvL25hY2ggUHJpb3JpdGFldCBzb3J0aWVydGVzIEFycmF5IGRlciBJRHMKKwordm9pZCBjcmVhdGUoKSB7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9OQU1FLCAiTWVya3pldHRlbCIpOworICBTZXRQcm9wKFBfU0hPUlQsICJFaW4gTWVya3pldHRlbCIpOworICBBZGRJZCgoeyJtZXJremV0dGVsIiwiemV0dGVsIn0pKTsKKyAgLy9BYnNpY2h0LCBkYW1pdCBkaWUgQmx1ZXByaW50IGVpbmUgSUQsIFBfTkFNRSB1bmQgUF9TSE9SVCBoYXQuCisgIGlmKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgCisgIFNldFByb3AoUF9MT05HLAorICAiV2FzIHdvbGx0ZXN0IER1IGdsZWljaCBub2NobWFsIHNjaG9lbmVzIHByb2dnZW4/IDstKVxuIgorICAiQmVmZWhsc2xpc3RlOlxuIgorICAiem1lcmtlL3pub3RpeiA8c3RyaW5nPiAgOiBFdHdhcyBhdWYgZGVuIE1lcmt6ZXR0ZWwgc2NocmVpYmVuXG4iCisgICJ6bGlzdGUgICAgICAgICAgICAgICAgICA6IDIwIHdpY2h0aWdzdGVuIE5vdGl6ZW4gYW56ZWlnZW5cbiIKKyAgInpsaXN0ZSA8aW50PiAgICAgICAgICAgIDogPGludD4gd2ljaHRpZ3N0ZSBOb3RpemVuIGFuemVpZ2VuXG4iCisgICIgICAgICAgICAgICAgICAgICAgICAgICAgICh1bndpY2h0aWdzdGUsIHdlbm4gPGludD4gbmVnYXRpdilcbiIKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgQW5nYWJlIHZvbiAwIG9kZXIgJ2FsbGUnIGdpYnQgYWxsZSBhdXNcbiIKKyAgInpsaXN0ZSA8aW50PiA8ZmlsdGVyPiAgIDogPGludD4gd2ljaHRpZ3N0ZSBOb3RpemVuIGFuemVpZ2VuXG4iCisgICIgICAgICAgICAgICAgICAgICAgICAgICAgIChGaWx0ZXI6ICdha3RpdicsICd3YXJ0ZW5kJ1xuIgorICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2luYWt0aXYnLCAnYWJnZWhha3QnLCAnYWxsZSd8JzAnKVxuIgorICAiICAgICAgICAgICAgICAgICAgICAgICAgICBPaG5lIEFuZ2FiZSBlaW5lcyBGaWx0ZXIgZ2lsdCAnYWt0aXYnXG4iCisgICJ6c3RhdHVzIDxpbnQ+ICAgICAgICAgICA6IFN0YXR1cyB2b24gTm90aXogbWl0IElEIHVtc2NoYWx0ZW5cbiIKKyAgInpzdGF0dXMgPGludD4gPGludDI+ICAgIDogU3RhdHVzIHZvbiBOb3RpeiBtaXQgSUQgYXVmIDxpbnQ+IHNldHplbiBcbiIKKyAgInpsb2VzY2hlL3pybSA8aW50PiAgICAgIDogTm90aXogbWl0IElEIDxpbnQ+IGxvZXNjaGVuXG4iCisgICJ6bGllcy96bGVzZSA8aW50PiAgICAgICA6IE5vdGl6IG1pdCBJRCA8aW50PiBhbnplaWdlblxuIgorICAiemRlcGxpZXMgPGludD4gPGludDI+ICAgOiBBYmhhZW5naWdrZWl0ZW4gdm9uIDxpbnQ+IGxlc2VuLCBcbiIKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgIDogcmVrdXJzaXYsIHdlbm4gPGludDI+ICE9IDBcbiIKKyAgInpmZXJ0aWcvemhha2UgPGludD4gICAgIDogTm90aXogbWl0IElEIDxpbnQ+IGFiaGFrZW4gKGZlcnRpZylcbiIKKyAgInpwcmlvIDxpbnQxPiA8aW50Mj4gICAgIDogTm90aXogbWl0IElEIDxpbnQ+IG1pdCBQcmlvcml0YWV0IDxpbnQyPlxuIgorICAiICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJzZWhlbi5cbiIKKyAgInpkZXAgPGludDE+IDxpbnQyPiAgICAgIDogTm90aXogbWl0IElEIDxpbnQ+IHNvbGwgdm9uIE5vdGl6IG1pdCBJRFxuIgorICAiICAgICAgICAgICAgICAgICAgICAgICAgICA8aW50Mj4gYWJoYWVuZ2VuLlxuIgorICAiemhlbGZlciA8aW50MT4gPG5hbWVuPiAgOiBOb3RpeiBtaXQgSUQgPGludD4gd2lyZCAobWl0KWJlYXJiZWl0ZXRcbiIKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgdm9uIGRlbiBhbmdlZ2ViZW5lbiBQZXJzb25lblxuIgorICAiemVyZ2FlbnplIDxpbnQ+IDx0ZXh0PiAgOiBoYWVuZ3QgPHRleHQ+IGFuIE5vdGl6IDxpbnQ+IGFuXG4iCisgICJ6ZXJzZXR6ZSA8aW50PiA8dGV4dD4gICA6IGVyc2V0enQgVGV4dCB2b24gTm90aXogPGludD4gZHVyY2ggPHRleHQ+XG4iCisgICJ6ZXhwaXJlIDxpbnQ+ICAgICAgICAgICA6IGFsbGUgYWJnZWhha3RlbiBOb3RpemVuIGFyY2hpdmllcmVuIHVuZCBsb2VzY2hlbixcbiIKKyAgIiAgICAgICAgICAgICAgICAgICAgICAgIDogZGllIGFlbHRlciBhbHMgPGludD4gVGFnZSBzaW5kLlxuIgorICAienplaWdlIDxuYW1lPiAgICAgICAgICAgOyB6ZWlnZSA8bmFtZT4sIHdpZSBmdXJjaHRiYXIgdmllbCBEdSB6dSB0dW4gaGFzdFxuIgorICAiendlZGVsIDxuYW1lPgkgICA6IDxuYW1lPiBhdXMgZGVyIEZlcm5lIHZvciBkZXIgTmFzZSBydW13ZWRlbG4uXG4iCisgICk7CisgIFNldFByb3AoUF9JTkZPLGJyZWFrX3N0cmluZygiRWluIE1lcmt6ZXR0ZWwgZnVlciBNYWdpZXIuIDstKS4iKSk7CisgIFNldFByb3AoUF9HRU5ERVIsIE1BTEUpOworICBTZXRQcm9wKFBfQVJUSUNMRSwgMSk7CisgIFNldFByb3AoUF9XRUlHSFQsIDApOworICBTZXRQcm9wKFBfVkFMVUUsIDApOworICBTZXQoUF9BVVRPTE9BRE9CSiwjJ3F1ZXJ5X2F1dG9sb2Fkb2JqLEZfUVVFUllfTUVUSE9EKTsKKyAgU2V0KFBfQVVUT0xPQURPQkosIydzZXRfYXV0b2xvYWRvYmosRl9TRVRfTUVUSE9EKTsKKyAgU2V0KFBfQVVUT0xPQURPQkosUFJPVEVDVEVELEZfTU9ERV9BUyk7CisgIFNldFByb3AoUF9ORVZFUkRST1AsMSk7CisgIFNldFByb3AoUF9OT0RST1AsMSk7CisgIEFkZENtZCgoeyJ6bWVya2UiLCJ6bm90aXoifSksIkFkZE5vdGl6Iik7CisgIEFkZENtZCgoeyJ6bGlzdGUiLCJ6dG9kbyJ9KSwiTGlzdE5vdGl6ZW4iKTsKKyAgQWRkQ21kKCh7Inpsb2VzY2hlIiwienJtIn0pLCJSZW1vdmVOb3RpeiIpOworICBBZGRDbWQoKHsiemZlcnRpZyIsInpoYWtlIn0pLCJGaW5pc2hOb3RpeiIpOworICBBZGRDbWQoKHsiemxpZXMiLCJ6bGVzZSJ9KSwiTGllc05vdGl6Iik7CisgIEFkZENtZCgoeyJ6cHJpbyJ9KSwiQ2hhbmdlUHJpbyIpOworICBBZGRDbWQoKHsiemRlcCJ9KSwiQ2hhbmdlRGVwIik7CisgIEFkZENtZCgoeyJ6c3RhdHVzIn0pLCJDaGFuZ2VTdGF0dXMiKTsKKyAgQWRkQ21kKCh7InplcnNldHplIn0pLCJFcnNldHplVGV4dCIpOworICBBZGRDbWQoKHsiemVyZ2FlbnplIn0pLCJFcmdhZW56ZVRleHQiKTsKKyAgQWRkQ21kKCh7InpoZWxmZXIiLCJ6ZGVsZWdpZXJlIn0pLCJDaGFuZ2VIZWxwZXIiKTsKKyAgQWRkQ21kKCh7Inp6ZWlnZSJ9KSwiWmVpZ2VaZXR0ZWwiKTsKKyAgQWRkQ21kKCh7Inp3ZWRlbCJ9KSwiV2VkZWxaZXR0ZWwiKTsKKyAgQWRkQ21kKCh7InpkZXBsaWVzIn0pLCJMaWVzRGVwcyIpOworICBBZGRDbWQoKHsiemV4cGlyZSJ9KSwiRXhwaXJlIik7CisgIC8vY2FjaGU9KHt9KTsKKyAgCit9CisKKy8vKioqKioqKioqKioqKioqKioqIEFkZENtZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoraW50IEFkZE5vdGl6KHN0cmluZyBzdHIpIHsKKyAgCisgIGlmKCFvYmplY3RwKFRJKSkgcmV0dXJuKDApOworICBpZighY2hlY2tfYWxsb3dlZCgpKSB7CisgICAgaWYob2JqZWN0cCh0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgICAgdGVsbF9vYmplY3QodGhpc19pbnRlcmFjdGl2ZSgpLAorICAgICAgICBCUygiRGllc2VyIFp1Z3JpZmYgYXVmIGRlbiBNZXJremV0dGVsIHd1cmRlIG5pY2h0IGVybGF1YnQuIikpOworICAgIHJldHVybigwKTsKKyAgfQorICAvL2dnZi4gbnVyIEVpbmxlc2VuLCBDYWNoZSBtdXNzIGhpZXIgbmljaHQgYWt0dWFsaXNpZXJ0IHdlcmRlbiA7LSkKKyAgY2hlY2tTdGF0dXMoMSk7CisgIHN0cj0oc3RyaW5nKVBMLT5fdW5wYXJzZWRfYXJncygwKTsgIC8va2VpbiBwYXJzaW5nCisgIGlmICghc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgIldhcyBtb2VjaHRlc3QgRHUgRGlyIGRlbm4gbm90aWVyZW4/XG4iKTsKKyAgICByZXR1cm4oMSk7CisgIH0KKyAgaWYgKHNpemVvZihzdHIpPk1BWF9OT1RFX0xFTkdUSCkgeworICAgIHRlbGxfb2JqZWN0KFBMLEJTKAorICAgICAgc3ByaW50ZigiRGVpbmUgTm90aXogaXN0IG1pdCAlZCBaZWljaGVuIHp1IGxhbmchIExlaWRlciBwYXNzZW4gYXVmICIKKyAgICAgICAgICAgICAiRGVpbmVuIE1lcmt6ZXR0ZWwgbnVyICUgWmVpY2hlbiBkcmF1Zi4iLAorICAgICAgICBzaXplb2Yoc3RyKSxNQVhfTk9URV9MRU5HVEgpKSk7CisgICAgcmV0dXJuKDEpOworICB9CisgIAorICAvL21fYWxsb2NhdGUgZ2lsdCBudXIgYmlzIEZ1bmt0aW9uc2VuZGUsIGRhaGVyIGhpbGZ0IGRhcyBpbgorICAvL2NoZWNrU3RhdHVzIGxlaWRlciBuaWNodC4KKyAgaWYgKCFtYXBwaW5ncChub3RpemVuKSB8fCAhc2l6ZW9mKG5vdGl6ZW4pKQorICAgIG5vdGl6ZW49bV9hbGxvY2F0ZSgwLDcpOworICAKKyAgLy9mcmVpZSBJRCBmaW5kZW4gKG1heHVzZWRJRCsxIHNvbGx0ZSBkaWUgbmFlY2hzdGUgZnJlaSBzZWluLCBhYmVyIGZhbGxzCisgIC8vZGEgbWFsIHdhcyBrYXB1dHRnZWdhbmdlbiBpc3Q6IFBydWVmZW4gOy0pICkKKyAgd2hpbGUobWVtYmVyKG5vdGl6ZW4sbWF4dXNlZElEKSkge21heHVzZWRJRCsrO30KKyAgLy9SZWloZW5mb2xnZTogcy4gbWVya3pldHRlbC5oCisgIG5vdGl6ZW4rPShbbWF4dXNlZElEOnN0cjswO3RpbWUoKTsoe30pOyh7fSk7Tk9URV9BQ1RJVkU7MF0pOworLyogIG5vdGl6ZW4rPShbbWF4dXNlZElEXSk7CisgIG5vdGl6ZW5bbWF4dXNlZElELE5PVEVfVEVYVF09c3RyOworICBub3RpemVuW21heHVzZWRJRCxOT1RFX1BSSU9dPTA7CisgIG5vdGl6ZW5bbWF4dXNlZElELE5PVEVfU1RBUlRUSU1FXT10aW1lKCk7CisgIG5vdGl6ZW5bbWF4dXNlZElELE5PVEVfREVQU109KHt9KTsKKyovCisgIAorICAvL2NhY2hlPSh7fSk7IC8vY2FjaGUgaW52YWxpZGllcmVuCisgIC8vaW4gS3VlcnplIHNwZWljaGVybiwgYWJlciBuaWNodCBmdWVyIGplZGUgQWVuZGVydW5nIHNwZWljaGVybgorICBzYXZlX21lKDYwKTsKKyAgdGVsbF9vYmplY3QoUEwsQlMoCisgICAgICBzcHJpbnRmKCJEdSBzY2hyZWlic3Qgc29yZ2ZhZWx0aWcgRGVpbmUgTm90aXogYXVmIERlaW5lbiBNZXJremV0dGVsLiAiCisgICAgICAgICAgIkVzIGlzdCBudW4gZGllICVkLiBOb3Rpei4iLG1heHVzZWRJRCkpKTsKKyAgdGVsbF9yb29tKGVudmlyb25tZW50KFRJKSwKKyAgICBCUyhzcHJpbnRmKCIlcyBub3RpZXJ0IHNpY2ggZXR3YXMgYXVmICVzIE1lcmt6ZXR0ZWwuXG4iLAorICAgICAgICBjYXBpdGFsaXplKChzdHJpbmcpVEktPm5hbWUoV0VSKSksCisgICAgICAgICgoKGludClUSS0+UXVlcnlQcm9wKFBfR0VOREVSKSk9PUZFTUFMRSA/ICJpaHJlbSIgOiAic2VpbmVtIikgCisgICAgICAgICAgICAgICkpLCh7VEl9KSk7CisgIHJldHVybigxKTsKK30KKworaW50IExpZXNOb3RpeihzdHJpbmcgc3RyKSB7CisgIGludCBpZDsKKyAgCisgIGlmKCFvYmplY3RwKFRJKSkgcmV0dXJuKDApOworICBpZighY2hlY2tfYWxsb3dlZCgpKSB7CisgICAgaWYob2JqZWN0cCh0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgICAgdGVsbF9vYmplY3QodGhpc19pbnRlcmFjdGl2ZSgpLAorICAgICAgICBCUygiRGllc2VyIFp1Z3JpZmYgYXVmIGRlbiBNZXJremV0dGVsIHd1cmRlIG5pY2h0IGVybGF1YnQuIikpOworICAgIHJldHVybigwKTsKKyAgfQorICBpZiAoIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikgfHwgIWlkPXRvX2ludChzdHIpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICAiV2VsY2hlIE5vdGl6IG1vZWNodGVzdCBEdSBsZXNlbj8gQml0dGUgZWluZSBJRCBhbmdlYmVuIVxuIik7CisgICAgcmV0dXJuKDEpOworICB9CisgIGlmICghY2hlY2tTdGF0dXMoKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgIkVzIGdpYnQga2VpbmUgTm90aXosIGRpZSBEdSBsZXNlbiBrb2VubnRlc3QhXG4iKTsKKyAgICByZXR1cm4oMSk7CisgIH0KKyAgaWYgKCFtZW1iZXIobm90aXplbixpZCkpIHsKKyAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgIHNwcmludGYoIkVzIGdpYnQga2VpbmUgTm90aXogbWl0IGRlciBJRDogJWRcbiIsaWQpKTsKKyAgICByZXR1cm4oMSk7CisgIH0KKyAgLy9BdXNnYWJldGV4dCBob2xlbiB1bmQgYXVzZ2ViZW4KKyAgdGVsbF9vYmplY3QoUEwsc3ByaW50ZigiXG5EdSB2ZXJ0aWVmc3QgRGljaCBpbiBEZWluZW4gTWVya3pldHRlbCB1bmQgbGllc3Q6XG4lc1xuIixfTGllc05vdGl6KGlkKSkpOworICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoVEkpLAorICAgIEJTKHNwcmludGYoIiVzIGxpZXN0IGV0d2FzIGF1ZiAlcyBNZXJremV0dGVsLlxuIiwKKyAgICAgICAgY2FwaXRhbGl6ZSgoc3RyaW5nKVRJLT5uYW1lKFdFUikpLAorICAgICAgICAoKChpbnQpVEktPlF1ZXJ5UHJvcChQX0dFTkRFUikpPT1GRU1BTEUgPyAiaWhyZW0iIDogInNlaW5lbSIpIAorICAgICAgICAgICAgICApKSwoe1RJfSkpOworICByZXR1cm4oMSk7Cit9CisKK2ludCBSZW1vdmVOb3RpeihzdHJpbmcgc3RyKSB7CisgIGludCBpZDsKKyAgCisgIGlmKCFvYmplY3RwKFRJKSkgcmV0dXJuKDApOworICBpZighY2hlY2tfYWxsb3dlZCgpKSB7CisgICAgaWYob2JqZWN0cCh0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgICAgdGVsbF9vYmplY3QodGhpc19pbnRlcmFjdGl2ZSgpLAorICAgICAgICBCUygiRGllc2VyIFp1Z3JpZmYgYXVmIGRlbiBNZXJremV0dGVsIHd1cmRlIG5pY2h0IGVybGF1YnQuIikpOworICAgIHJldHVybigwKTsKKyAgfQorICBpZiAoIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikgfHwgIWlkPXRvX2ludChzdHIpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICAiV2VsY2hlIE5vdGl6IG1vZWNodGVzdCBEdSBhdXNyYWRpZXJlbj8gQml0dGUgZWluZSBJRCBhbmdlYmVuIVxuIik7CisgICAgcmV0dXJuKDEpOworICB9CisgIGlmICghY2hlY2tTdGF0dXMoKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgIkVzIGdpYnQga2VpbmUgTm90aXosIGRpZSBEdSBhdXNyYWRpZXJlbiBrb2VubnRlc3QhXG4iKTsKKyAgICByZXR1cm4oMSk7CisgIH0KKyAgaWYgKCFtZW1iZXIobm90aXplbixpZCkpIHsKKyAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgIHNwcmludGYoIkVzIGdpYnQga2VpbmUgTm90aXogbWl0IGRlciBJRDogJWRcbiIsaWQpKTsKKyAgICByZXR1cm4oMSk7CisgIH0KKyAgLy9kaXJla3QgTG9lc2NoZW4sIGtlaW5lIEtvcGllLCBkYWhlciBtX2RlbGV0ZSgpCisgIG1fZGVsZXRlKG5vdGl6ZW4saWQpOworICAvL2luIEt1ZXJ6ZSBzcGVpY2hlcm4sIGFiZXIgbmljaHQgZnVlciBqZWRlIEFlbmRlcnVuZyBzcGVpY2hlcm4KKyAgc2F2ZV9tZSg2MCk7CisgIC8vY2FjaGUgaW52YWxpZGllcmVuCisgIC8vY2FjaGU9KHt9KTsKKyAgdGVsbF9vYmplY3QoUEwsCisgICAgc3ByaW50ZigiU29yZ2ZhZWx0aWcgcmFkaWVyc3QgRHUgTm90aXogJWQgdm9uIERlaW5lbSBNZXJremV0dGVsLlxuIiwKKyAgICAgICAgICAgaWQpKTsKKyAgdGVsbF9yb29tKGVudmlyb25tZW50KFRJKSwKKyAgICBCUyhzcHJpbnRmKCIlcyByYWRpZXJ0IHNvcmdmYWVsdGlnIGV0d2FzIHZvbiAlcyBNZXJremV0dGVsLlxuIiwKKyAgICAgICAgY2FwaXRhbGl6ZSgoc3RyaW5nKVRJLT5uYW1lKFdFUikpLAorICAgICAgICAoKChpbnQpVEktPlF1ZXJ5UHJvcChQX0dFTkRFUikpPT1GRU1BTEUgPyAiaWhyZW0iIDogInNlaW5lbSIpIAorICAgICAgICAgICAgICApKSwoe1RJfSkpOworICByZXR1cm4oMSk7Cit9CisKK2ludCBGaW5pc2hOb3RpeihzdHJpbmcgc3RyKSB7CisgIGludCBpZDsKKyAgbWl4ZWQgbGlzdGU7CisgIGlmKCFvYmplY3RwKFRJKSkgcmV0dXJuKDApOworICBpZighY2hlY2tfYWxsb3dlZCgpKSB7CisgICAgaWYob2JqZWN0cCh0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgICAgdGVsbF9vYmplY3QodGhpc19pbnRlcmFjdGl2ZSgpLAorICAgICAgICBCUygiRGllc2VyIFp1Z3JpZmYgYXVmIGRlbiBNZXJremV0dGVsIHd1cmRlIG5pY2h0IGVybGF1YnQuIikpOworICAgIHJldHVybigwKTsKKyAgfQorICBpZiAoIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikgfHwgIWlkPXRvX2ludChzdHIpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICAiV2VsY2hlIE5vdGl6IG1vZWNodGVzdCBEdSBhYmhha2VuPyBCaXR0ZSBlaW5lIElEIGFuZ2ViZW4hXG4iKTsKKyAgICByZXR1cm4oMSk7CisgIH0KKyAgaWYgKCFjaGVja1N0YXR1cygpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICAiRXMgZ2lidCBrZWluZSBOb3RpeiwgZGllIER1IGFiaGFrZW4ga29lbm50ZXN0IVxuIik7CisgICAgcmV0dXJuKDEpOworICB9CisgIGlmICghbWVtYmVyKG5vdGl6ZW4saWQpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICBzcHJpbnRmKCJFcyBnaWJ0IGtlaW5lIE5vdGl6IG1pdCBkZXIgSUQ6ICVkXG4iLGlkKSk7CisgICAgcmV0dXJuKDEpOworICB9CisgIGlmKG5vdGl6ZW5baWQsTk9URV9TVEFUVVNdPT1OT1RFX0ZJTklTSEVEKSB7CisgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICBzcHJpbnRmKCJOb3RpeiAlZCBpc3Qgc2Nob24gYWJnZWhha3QhXG4iLGlkKSk7CisgICAgcmV0dXJuKDEpOworICB9CisgIGxpc3RlPWdldFVucmVzb2x2ZWREZXBzKGlkKTsgIC8vbGlzdGUgaXN0IEFycmF5IHZvbiBpbnRzCisgIGlmIChzaXplb2YobGlzdGUpKSB7CisgICAgbGlzdGU9bWFwKGxpc3RlLCMndG9fc3RyaW5nKTsgIC8vbGlzdGUgaXN0IEFycmF5IHZvbiBzdHJpbmdzCisgICAgdGVsbF9vYmplY3QoUEwsQlMoc3ByaW50ZigiRHUga2FubnN0IE5vdGl6ICVkIG5pY2h0IGFiaGFrZW4sIGRhIG5vY2ggIgorICAgICAgICAibmljaHQgZXJsZWRpZ3RlIEFiaGFlbmdpZ2tlaXRlbiBleGlzdGllcmVuLiBJRHM6ICVzLiIsCisgICAgICAgIGlkLENvdW50VXAobGlzdGUpKSkpOworICAgIHJldHVybigxKTsgCisgIH0KKyAgbm90aXplbltpZCxOT1RFX1NUQVRVU109Tk9URV9GSU5JU0hFRDsKKyAgbm90aXplbltpZCxOT1RFX0NMT1NFVElNRV09dGltZSgpOworICB0ZWxsX29iamVjdChQTCxCUygKKyAgICBzcHJpbnRmKCJEdSBtYWxzdCB6dWZyaWVkZW4gZWluZW4gc2Nob2VuZW4gZ3Jvc3NlbiBIYWtlbiBoaW50ZXIgIgorICAgICAgICAiZGllIE5vdGl6IE5yLiAlZC4gSGFjaCAtIHdhcyBiaXN0IER1IG51biB6dWZyaWVkZW4hIDotKVxuIixpZCkpKTsKKyAgdGVsbF9yb29tKGVudmlyb25tZW50KFRJKSwKKyAgICBCUyhzcHJpbnRmKCIlcyBoYWt0IGVyZnJldXQgZXR3YXMgYXVmICVzIE1lcmt6ZXR0ZWwgYWIuXG4iLAorICAgICAgICBjYXBpdGFsaXplKChzdHJpbmcpVEktPm5hbWUoV0VSKSksCisgICAgICAgICgoKGludClUSS0+UXVlcnlQcm9wKFBfR0VOREVSKSk9PUZFTUFMRSA/ICJpaHJlbSIgOiAic2VpbmVtIikgCisgICAgICAgICAgICAgICkpLCh7VEl9KSk7CisgIHJldHVybigxKTsKK30KKworaW50IExpc3ROb3RpemVuKHN0cmluZyBzdHIpIHsKKyAgaW50IHphaGwsbm90aXp6YWhsLGksaWQsZmlsdGVyc3RhdGU7CisgIHN0cmluZyB0eHQ7CisgIHN0cmluZyAqYXJyOworICBzdGF0dXMgaW52ZXJzOworICAKKyAgaWYoIW9iamVjdHAoVEkpKSByZXR1cm4oMCk7CisgIHN0cj0oc3RyaW5nKVBMLT5fdW5wYXJzZWRfYXJncygwKTsKKyAgaWYoIWNoZWNrX2FsbG93ZWQoKSkgeworICAgIGlmKG9iamVjdHAodGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICAgIHRlbGxfb2JqZWN0KHRoaXNfaW50ZXJhY3RpdmUoKSwKKyAgICAgICAgQlMoIkRpZXNlciBadWdyaWZmIGF1ZiBkZW4gTWVya3pldHRlbCB3dXJkZSBuaWNodCBlcmxhdWJ0LiIpKTsKKyAgICByZXR1cm4oMCk7CisgIH0KKyAgaWYgKCFub3RpenphaGw9Y2hlY2tTdGF0dXMoKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLEJTKAorICAgICAgIkRlaW4gTWVya3pldHRlbCBpc3QgYmx1ZXRlbndlaXNzIHVuZCBsZWVyISBXaWUga29tbXQgZGFzIGRlbm4/PyAiCisgICAgICAiSGFzdCBEdSBuaXggenUgdHVuPyIpKTsKKyAgICByZXR1cm4oMSk7CisgIH0KKyAgLy9Bcmd1bWVudGUgcGFyc2VuCisgIGlmKHN0cmluZ3Aoc3RyKSAmJiBzaXplb2Yoc3RyKSkKKyAgICBhcnI9ZXhwbG9kZShzdHIsIiAiKTsKKyAgaWYgKHBvaW50ZXJwKGFycikpIGFyci09KHsiIn0pOyAvL2RvcHBlbHRlIGxlZXJ6ZWljaGVuIGltIFN0cmluZworICBpZiAocG9pbnRlcnAoYXJyKSAmJiBzaXplb2YoYXJyKT49MikgeworICAgIHphaGw9dG9faW50KGFyclswXSk7CisgICAgc3dpdGNoKGFyclsxXSkgeworICAgICAgY2FzZSAiYWt0aXYiOgorICAgICAgICBmaWx0ZXJzdGF0ZT1OT1RFX0FDVElWRTsgYnJlYWs7CisgICAgICBjYXNlICJpbmFrdGl2IjoKKyAgICAgICAgZmlsdGVyc3RhdGU9Tk9URV9JTkFDVElWRTsgYnJlYWs7CisgICAgICBjYXNlICJ3YXJ0ZW5kIjoKKyAgICAgIGNhc2UgInBlbmRpbmciOgorICAgICAgICBmaWx0ZXJzdGF0ZT1OT1RFX1BFTkRJTkc7IGJyZWFrOworICAgICAgY2FzZSAiYWJnZWhha3QiOgorICAgICAgY2FzZSAiZmVydGlnIjoKKyAgICAgIGNhc2UgImFiZ2VzY2hsb3NzZW4iOgorICAgICAgICBmaWx0ZXJzdGF0ZT1OT1RFX0ZJTklTSEVEOyBicmVhazsKKyAgICAgIGNhc2UgImFsbGUiOgorICAgICAgICBmaWx0ZXJzdGF0ZT0wOyBicmVhazsKKyAgICAgIGRlZmF1bHQ6IAorICAgICAgICBmaWx0ZXJzdGF0ZT10b19pbnQoYXJyWzFdKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGVsc2UgaWYgKHBvaW50ZXJwKGFycikgJiYgc2l6ZW9mKGFycik9PTEpIHsKKyAgICB6YWhsPXRvX2ludChhcnJbMF0pOworICAgIGZpbHRlcnN0YXRlPU5PVEVfQUNUSVZFOworICB9CisgIGVsc2UgeworICAgIC8vVm9yZWluc3RlbGx1bmdlbgorICAgIHphaGw9MjA7CisgICAgZmlsdGVyc3RhdGU9Tk9URV9BQ1RJVkU7CisgIH0KKyAgLy8xLiBBcmd1bWVudCAiYWxsIiBvZGVyICJhbGxlIiBpc3Q6IGFsbGUgYW56ZWlnZW4KKyAgaWYgKHBvaW50ZXJwKGFycikgJiYgc2l6ZW9mKGFycikgJiYgc3RyaW5ncChhcnJbMF0pICYmCisgICAgICBzaXplb2YoYXJyWzBdKSAmJiBhcnJbMF09PSJhbGxlIikKKyAgICB6YWhsPW5vdGl6emFobDsgIC8vYWxsZSBhbnplaWdlbgorICAKKyAgLy93ZW5uIGRpZSBnZXd1ZW5zY2h0ZSBaYWhsIGRpZSBBbnphaGwgZ2VzcGVpY2hlcnRlcgorICAvL05vdGl6ZW4gdWViZXJzY2hyZWl0ZXQgKG9kZXIgMCBpc3QpCisgIGlmKCF6YWhsIHx8IHphaGw+bm90aXp6YWhsKSB6YWhsPW5vdGl6emFobDsKKyAgCisgIC8vd2VubiAxLiBBcmd1bWVudCBuZWdhdGl2OiBMaXN0ZSBpbiB1bWdla2VocnRlciBSZWloZW5mb2xnZQorICBpZiAoemFobDwwKSB7CisgICAgaW52ZXJzPTE7CisgICAgemFobD16YWhsKi0xOworICB9CisgIHR4dD1zcHJpbnRmKCJcbnwlOjl8c3wlOjU2fHN8JTo3fHN8XG4iLCJJRCIsIk5vdGl6dGV4dCIsIlByaW8uIik7CisgIHR4dCs9c3ByaW50ZigiJTo3OCctJ3NcbiIsIi0iKTsKKyAgLy9hbGxlIHBhc3NlbmRlbiBOb3RpemVuIGVybWl0dGVsbgorICBhcnI9ZmlsdGVyKG1faW5kaWNlcyhub3RpemVuKSwjJ25vdGVfZmlsdGVyLGZpbHRlcnN0YXRlKTsKKyAgLy9zb3J0aWVyZW4KKyAgYXJyPXNvcnRfYXJyYXkoYXJyLCMnc29ydF9wcmlvKTsKKyAgaWYgKHphaGw+c2l6ZW9mKGFycikpIHphaGw9c2l6ZW9mKGFycik7CisgIC8vYXVzZ2ViZW4KKyAgZm9yKGk9MDtpPHphaGw7aSsrKSB7CisgICAgaWYgKCFpbnZlcnMpCisgICAgICBpZD10b19pbnQoYXJyW2ldKTsKKyAgICBlbHNlCisgICAgICAvL3ZvbiBoaW50ZW4KKyAgICAgIGlkPXRvX2ludChhcnJbPGkrMV0pOyAvLyBpKzEgaXN0IHdpcmtsaWNoIEFic2ljaHQuIDstKQorICAgIHR4dCs9c3ByaW50ZigifCAlOjd8ZCB8ICU6NTQtcyB8ICU6NXxkIHxcbiIsCisgICAgICAgICAgICBpZCwKKwkgICAgLy9udXIgYmlzIHp1bSBlcnN0ZW4gXG4gYW56ZWlnZW4KKwkgICAgZXhwbG9kZShub3RpemVuW2lkLE5PVEVfVEVYVF0sIlxuIilbMF0sCisgICAgICAgICAgICBub3RpemVuW2lkLE5PVEVfUFJJT10pOworICB9CisgIHR4dCs9c3ByaW50ZigiJTo3OCctJ3NcblxuIiwiLSIpOworICB0ZWxsX29iamVjdChQTCx0eHQpOworICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoVEkpLAorICAgIEJTKHNwcmludGYoIiVzIHdpcmZ0IGVpbmVuIEJsaWNrIGF1ZiAlcyBNZXJremV0dGVsLlxuIiwKKyAgICAgICAgY2FwaXRhbGl6ZSgoc3RyaW5nKVRJLT5uYW1lKFdFUikpLAorICAgICAgICAoKChpbnQpVEktPlF1ZXJ5UHJvcChQX0dFTkRFUikpPT1GRU1BTEUgPyAiaWhyZW4iIDogInNlaW5lbiIpIAorICAgICAgICAgICAgICApKSwoe1RJfSkpOworICByZXR1cm4oMSk7Cit9CisKK2ludCBDaGFuZ2VEZXAoc3RyaW5nIHN0cikgeworICBpbnQgaWQ7CisgIHN0cmluZyAqYXJyOworICBpbnQgKmRlcHM7CisgIAorICBub3RpZnlfZmFpbCgiQml0dGUgZWluZSBJRCB1bmQgZWluZSBtaW4uIGVpbmUgQWJoYWVuZ2lna2VpdCBhbmdlYmVuIVxuIik7CisgIGlmKCFvYmplY3RwKFRJKSkgcmV0dXJuKDApOworICBpZighY2hlY2tfYWxsb3dlZCgpKSB7CisgICAgaWYob2JqZWN0cCh0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgICAgdGVsbF9vYmplY3QodGhpc19pbnRlcmFjdGl2ZSgpLAorICAgICAgICBCUygiRGllc2VyIFp1Z3JpZmYgYXVmIGRlbiBNZXJremV0dGVsIHd1cmRlIG5pY2h0IGVybGF1YnQuIikpOworICAgIHJldHVybigwKTsKKyAgfQorICBzdHI9KHN0cmluZylQTC0+X3VucGFyc2VkX2FyZ3MoMCk7CisgIGlmICghc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSkKKyAgICByZXR1cm4oMCk7CisgIAorICBpZiAoIWNoZWNrU3RhdHVzKCkpIHsKKyAgICB0ZWxsX29iamVjdChQTCxCUygKKyAgICAgICJEZWluIE1lcmt6ZXR0ZWwgaXN0IGJsdWV0ZW53ZWlzcyB1bmQgbGVlciEgV2llIGtvbW10IGRhcyBkZW5uPz8gIgorICAgICAgIkhhc3QgRHUgbml4IHp1IHR1bj8iKSk7CisgICAgcmV0dXJuKDEpOworICB9CisgIGFycj1leHBsb2RlKHN0ciwiICIpOworICBhcnItPSh7IiJ9KTsgIC8vICIiIGVudGZlcm5lbiwgd2ljaHRpZy4gOy0pCisgIGlmIChzaXplb2YoYXJyKTwyKQorICAgIHJldHVybigwKTsKKyAgaWQ9dG9faW50KGFyclswXSk7CisgIGFyci09KHthcnJbMF19KTsgIC8vZWlnZW5lIElEIGxvZXNjaGVuCisgIGlmIChzaXplb2YoYXJyKTwxKQorICAgIHJldHVybigwKTsgIC8vbWVocmZhY2ggZGllIGVpZ2VuZSBJRCBnaWx0IG5pY2h0LjstKQorICBpZiAoIW1lbWJlcihub3RpemVuLGlkKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgc3ByaW50ZigiRXMgZ2lidCBrZWluZSBOb3RpeiBtaXQgZGVyIElEOiAlZFxuIixpZCkpOworICAgIHJldHVybigxKTsKKyAgfQorICAvL2RpZXMgdXBkYXRlZCBkaXJla3QgZGllIEFiaGFlbmdpZ2tlaXRlbiBpbiAnbm90aXplbichCisgIG1hcChhcnIsIyd1cGRhdGVfZGVwcyxpZCk7CisgIHNhdmVfbWUoNjApOworICB0ZWxsX29iamVjdChQTCxCUygKKyAgICAgIHNwcmludGYoIkR1IGFlbmRlcnN0IGRpZSBBYmhhZW5naWdrZWl0ZW4gdm9uIE5vdGl6ICVkLlxuIiwKKyAgICAgICAgICAgICAgaWQpKSk7CisgIHRlbGxfcm9vbShlbnZpcm9ubWVudChUSSksCisgICAgQlMoc3ByaW50ZigiJXMga3JpdHplbHQgYXVmICVzIE1lcmt6ZXR0ZWwgaGVydW0uXG4iLAorICAgICAgICBjYXBpdGFsaXplKChzdHJpbmcpVEktPm5hbWUoV0VSKSksCisgICAgICAgICgoKGludClUSS0+UXVlcnlQcm9wKFBfR0VOREVSKSk9PUZFTUFMRSA/ICJpaHJlbSIgOiAic2VpbmVtIikgCisgICAgICAgICAgICAgICkpLCh7VEl9KSk7CisgIHJldHVybigxKTsKK30KKworaW50IENoYW5nZVByaW8oc3RyaW5nIHN0cikgeworICBpbnQgaWQsIHByaW87CisgIHN0cmluZyogYXJyOworICAKKyAgbm90aWZ5X2ZhaWwoIkJpdHRlIGVpbmUgSUQgdW5kIGVpbmUgbmV1ZSBQcmlvcml0YWV0IGFuZ2ViZW4hXG4iKTsKKyAgaWYoIW9iamVjdHAoVEkpKSByZXR1cm4oMCk7CisgIGlmKCFjaGVja19hbGxvd2VkKCkpIHsKKyAgICBpZihvYmplY3RwKHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgICAgICB0ZWxsX29iamVjdCh0aGlzX2ludGVyYWN0aXZlKCksCisgICAgICAgIEJTKCJEaWVzZXIgWnVncmlmZiBhdWYgZGVuIE1lcmt6ZXR0ZWwgd3VyZGUgbmljaHQgZXJsYXVidC4iKSk7CisgICAgcmV0dXJuKDApOworICB9CisgIHN0cj0oc3RyaW5nKVBMLT5fdW5wYXJzZWRfYXJncygwKTsKKyAgaWYgKCFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpKQorICAgIHJldHVybigwKTsKKyAgCisgIGlmICghY2hlY2tTdGF0dXMoKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLEJTKAorICAgICAgIkRlaW4gTWVya3pldHRlbCBpc3QgYmx1ZXRlbndlaXNzIHVuZCBsZWVyISBXaWUga29tbXQgZGFzIGRlbm4/PyAiCisgICAgICAiSGFzdCBEdSBuaXggenUgdHVuPyIpKTsKKyAgICByZXR1cm4oMSk7CisgIH0KKyAgYXJyPWV4cGxvZGUoc3RyLCIgIik7CisgIGlmIChzaXplb2YoYXJyKT4yKSB7CisgICAgbm90aWZ5X2ZhaWwoIkJpdHRlIG51ciBlaW5lIElEIHVuZCBlaW5lIG5ldWUgUHJpb3JpdGFldCBhbmdlYmVuISIpOworICAgIHJldHVybigwKTsKKyAgfQorICBlbHNlIGlmKHNpemVvZihhcnIpPT0yKSB7CisgICAgaWQ9dG9faW50KGFyclswXSk7CisgICAgcHJpbz10b19pbnQoYXJyWzFdKTsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuKDApOworCisgIGlmICghbWVtYmVyKG5vdGl6ZW4saWQpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICBzcHJpbnRmKCJFcyBnaWJ0IGtlaW5lIE5vdGl6IG1pdCBkZXIgSUQ6ICVkXG4iLGlkKSk7CisgICAgcmV0dXJuKDEpOworICB9CisgIG5vdGl6ZW5baWQsTk9URV9QUklPXT1wcmlvOworICAvL2NhY2hlPSh7fSk7IC8vY2FjaGUgaW52YWxpZGllcmVuCisgIHNhdmVfbWUoNjApOworICB0ZWxsX29iamVjdChQTCxCUygKKyAgICAgIHNwcmludGYoIkR1IGFlbmRlcnN0IGRpZSBQcmlvcml0YWV0IHZvbiBOb3RpeiAlZCBhdWYgJWQuIiwKKyAgICAgICAgICAgICAgaWQsbm90aXplbltpZCxOT1RFX1BSSU9dKSkpOworICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoVEkpLAorICAgIEJTKHNwcmludGYoIiVzIGtyaXR6ZWx0IGF1ZiAlcyBNZXJremV0dGVsIGhlcnVtLlxuIiwKKyAgICAgICAgY2FwaXRhbGl6ZSgoc3RyaW5nKVRJLT5uYW1lKFdFUikpLAorICAgICAgICAoKChpbnQpVEktPlF1ZXJ5UHJvcChQX0dFTkRFUikpPT1GRU1BTEUgPyAiaWhyZW0iIDogInNlaW5lbSIpIAorICAgICAgICAgICAgICApKSwoe1RJfSkpOworICByZXR1cm4oMSk7Cit9CisKK2ludCBDaGFuZ2VIZWxwZXIoc3RyaW5nIHN0cikgeworICBpbnQgaWQ7CisgIHN0cmluZyAqYXJyOworICAKKyAgbm90aWZ5X2ZhaWwoIkJpdHRlIGVpbmUgSUQgdW5kIGVpbmUgbWluLiBlaW5lbiBOYW1lbiBhbmdlYmVuIVxuIik7CisgIGlmKCFvYmplY3RwKFRJKSkgcmV0dXJuKDApOworICBpZighY2hlY2tfYWxsb3dlZCgpKSB7CisgICAgaWYob2JqZWN0cCh0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgICAgdGVsbF9vYmplY3QodGhpc19pbnRlcmFjdGl2ZSgpLAorICAgICAgICBCUygiRGllc2VyIFp1Z3JpZmYgYXVmIGRlbiBNZXJremV0dGVsIHd1cmRlIG5pY2h0IGVybGF1YnQuIikpOworICAgIHJldHVybigwKTsKKyAgfQorICBzdHI9KHN0cmluZylQTC0+X3VucGFyc2VkX2FyZ3MoMCk7CisgIGlmICghc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSkKKyAgICByZXR1cm4oMCk7CisgIAorICBpZiAoIWNoZWNrU3RhdHVzKCkpIHsKKyAgICB0ZWxsX29iamVjdChQTCxCUygKKyAgICAgICJEZWluIE1lcmt6ZXR0ZWwgaXN0IGJsdWV0ZW53ZWlzcyB1bmQgbGVlciEgV2llIGtvbW10IGRhcyBkZW5uPz8gIgorICAgICAgIkhhc3QgRHUgbml4IHp1IHR1bj8iKSk7CisgICAgcmV0dXJuKDEpOworICB9CisgIGFycj1leHBsb2RlKHN0ciwiICIpOworICBhcnItPSh7IiJ9KTsgIC8vICIiIGVudGZlcm5lbiwgd2ljaHRpZy4gOy0pCisgIGlmIChzaXplb2YoYXJyKTwyKQorICAgIHJldHVybigwKTsKKyAgaWQ9dG9faW50KGFyclswXSk7CisgIGFyci09KHthcnJbMF19KTsgIC8vZWlnZW5lIElEIGxvZXNjaGVuCisgIGlmIChzaXplb2YoYXJyKTwxKQorICAgIHJldHVybigwKTsgIC8vbWVocmZhY2ggZGllIGVpZ2VuZSBJRCBnaWx0IG5pY2h0LjstKQorICBpZiAoIW1lbWJlcihub3RpemVuLGlkKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgc3ByaW50ZigiRXMgZ2lidCBrZWluZSBOb3RpeiBtaXQgZGVyIElEOiAlZFxuIixpZCkpOworICAgIHJldHVybigxKTsKKyAgfQorICBub3RpemVuW2lkLE5PVEVfSEVMUEVSXT1hcnI7CisgIHNhdmVfbWUoNjApOworICB0ZWxsX29iamVjdChQTCxCUygKKyAgICAgIHNwcmludGYoIk1pdGFyYmVpdGVyIHZvbiBOb3RpeiAlZCBnZWFlbmRlcnQuIixpZCkpKTsKKyAgdGVsbF9yb29tKGVudmlyb25tZW50KFRJKSwKKyAgICBCUyhzcHJpbnRmKCIlcyBrcml0emVsdCBhdWYgJXMgTWVya3pldHRlbCBoZXJ1bS5cbiIsCisgICAgICAgIGNhcGl0YWxpemUoKHN0cmluZylUSS0+bmFtZShXRVIpKSwKKyAgICAgICAgKCgoaW50KVRJLT5RdWVyeVByb3AoUF9HRU5ERVIpKT09RkVNQUxFID8gImlocmVtIiA6ICJzZWluZW0iKSAKKyAgICAgICAgICAgICAgKSksKHtUSX0pKTsKKyAgcmV0dXJuKDEpOworfQorCitpbnQgQ2hhbmdlU3RhdHVzKHN0cmluZyBzdHIpIHsKKyAgaW50IGlkLCBzdGF0ZTsKKyAgc3RyaW5nICphcnI7CisgIAorICBub3RpZnlfZmFpbChCUygKKyAgICAgICJCaXR0ZSBtaW4uIGVpbmUgSUQgYW5nZWJlbiwgdW0gZGVuIFN0YXR1cyB1bXp1c2NoYWx0ZW4gb2RlciAiCisgICAgICAiZWluZSBJRCB1bmQgZGVuIG5ldWVuIFN0YXR1cyAoMT09QWt0aXYsIDI9PVdhcnRlbmQsICIKKyAgICAgICItMT09SW5ha3Rpdi9QYXVzZSkiKSk7CisgIGlmKCFvYmplY3RwKFRJKSkgcmV0dXJuKDApOworICBpZighY2hlY2tfYWxsb3dlZCgpKSB7CisgICAgaWYob2JqZWN0cCh0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgICAgdGVsbF9vYmplY3QodGhpc19pbnRlcmFjdGl2ZSgpLAorICAgICAgICBCUygiRGllc2VyIFp1Z3JpZmYgYXVmIGRlbiBNZXJremV0dGVsIHd1cmRlIG5pY2h0IGVybGF1YnQuIikpOworICAgIHJldHVybigwKTsKKyAgfQorICBzdHI9KHN0cmluZylQTC0+X3VucGFyc2VkX2FyZ3MoMCk7CisgIGlmICghc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSkKKyAgICByZXR1cm4oMCk7CisgIGlmICghY2hlY2tTdGF0dXMoKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLEJTKAorICAgICAgIkRlaW4gTWVya3pldHRlbCBpc3QgYmx1ZXRlbndlaXNzIHVuZCBsZWVyISBXaWUga29tbXQgZGFzIGRlbm4/PyAiCisgICAgICAiSGFzdCBEdSBuaXggenUgdHVuPyIpKTsKKyAgICByZXR1cm4oMSk7CisgIH0KKyAgYXJyPWV4cGxvZGUoc3RyLCIgIik7CisgIGlmIChzaXplb2YoYXJyKT4yKSB7CisgICAgbm90aWZ5X2ZhaWwoIkJpdHRlIG51ciBlaW5lIElEIHVuZCBlaW5lbiBuZXVlbiBTdGF0dXMgYW5nZWJlbiEiKTsKKyAgICByZXR1cm4oMCk7CisgIH0KKyAgZWxzZSBpZihzaXplb2YoYXJyKT09MikgeworICAgIGlkPXRvX2ludChhcnJbMF0pOworICAgIHN0YXRlPXRvX2ludChhcnJbMV0pOworICB9CisgIGVsc2UgaWYoc2l6ZW9mKGFycik9PTEpIHsKKyAgICBpZD10b19pbnQoYXJyWzBdKTsKKyAgfQorICBlbHNlCisgICAgcmV0dXJuKDApOworICAKKyAgaWYgKCFtZW1iZXIobm90aXplbixpZCkpIHsKKyAgICB0ZWxsX29iamVjdChQTCwKKyAgICAgIHNwcmludGYoIkVzIGdpYnQga2VpbmUgTm90aXogbWl0IGRlciBJRDogJWRcbiIsaWQpKTsKKyAgICByZXR1cm4oMSk7CisgIH0KKyAgaWYobWVtYmVyKE5PVEVfU1RBVEVTLHN0YXRlKT09LTEpIHsKKyAgICBpZiAobm90aXplbltpZCxOT1RFX1NUQVRVU109PU5PVEVfQUNUSVZFKSB7CisgICAgICB0ZWxsX29iamVjdChQTCxCUygKKyAgICAgICAgICBzcHJpbnRmKCIlZCBpc3QgZWluIHVuYmVrYW5udGVyIFN0YXR1cywgc2V0enQgTm90aXogJWQgYXVmICIKKyAgICAgICAgICAgICAgIidJbmFrdGl2Jy4iLHN0YXRlLGlkKSkpOworICAgICAgc3RhdGU9Tk9URV9JTkFDVElWRTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICB0ZWxsX29iamVjdChQTCxCUygKKyAgICAgICAgICBzcHJpbnRmKCIlZCBpc3QgZWluIHVuYmVrYW5udGVyIFN0YXR1cywgc2V0enQgTm90aXogJWQgYXVmICIKKyAgICAgICAgICAgICAgIidBa3RpdicuIixzdGF0ZSxpZCkpKTsKKyAgICAgIHN0YXRlPU5PVEVfQUNUSVZFOworICAgIH0KKyAgfQorICBub3RpemVuW2lkLE5PVEVfU1RBVFVTXT1zdGF0ZTsKKyAgc2F2ZV9tZSg2MCk7CisgIHRlbGxfb2JqZWN0KFBMLEJTKAorICAgICAgc3ByaW50ZigiU3RhdHVzIHZvbiBOb3RpeiAlZCBnZWFlbmRlcnQuIixpZCkpKTsKKyAgdGVsbF9yb29tKGVudmlyb25tZW50KFRJKSwKKyAgICBCUyhzcHJpbnRmKCIlcyBrcml0emVsdCBhdWYgJXMgTm90aXp6ZXR0ZWwgaGVydW0uXG4iLAorICAgICAgICBjYXBpdGFsaXplKChzdHJpbmcpVEktPm5hbWUoV0VSKSksCisgICAgICAgICgoKGludClUSS0+UXVlcnlQcm9wKFBfR0VOREVSKSk9PUZFTUFMRSA/ICJpaHJlbSIgOiAic2VpbmVtIikgCisgICAgICAgICAgICAgICkpLCh7VEl9KSk7CisgIHJldHVybigxKTsKK30KKworaW50IEVyc2V0emVUZXh0KHN0cmluZyBzdHIpIHsKKyAgc3RyaW5nICphcnI7CisgIGludCBpZDsKKyAgCisgIG5vdGlmeV9mYWlsKCJCaXR0ZSBlaW5lIElEIHVuZCBlaW5lbiBuZXVlbiBUZXh0IGFuZ2ViZW4hXG4iKTsKKyAgaWYoIW9iamVjdHAoVEkpKSByZXR1cm4oMCk7CisgIAorICBpZighY2hlY2tfYWxsb3dlZCgpKSB7CisgICAgaWYob2JqZWN0cCh0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgICAgdGVsbF9vYmplY3QodGhpc19pbnRlcmFjdGl2ZSgpLAorICAgICAgICBCUygiRGllc2VyIFp1Z3JpZmYgYXVmIGRlbiBNZXJremV0dGVsIHd1cmRlIG5pY2h0IGVybGF1YnQuIikpOworICAgIHJldHVybigwKTsKKyAgfQorICBzdHI9KHN0cmluZylQTC0+X3VucGFyc2VkX2FyZ3MoMCk7CisgIGlmICghc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSkKKyAgICByZXR1cm4oMCk7CisgIAorICBpZiAoIWNoZWNrU3RhdHVzKCkpIHsKKyAgICB0ZWxsX29iamVjdChQTCxCUygKKyAgICAgICJEZWluIE1lcmt6ZXR0ZWwgaXN0IGJsdWV0ZW53ZWlzcyB1bmQgbGVlciEgV2llIGtvbW10IGRhcyBkZW5uPz8gIgorICAgICAgIkhhc3QgRHUgbml4IHp1IHR1bj8iKSk7CisgICAgcmV0dXJuKDEpOworICB9CisgIGFycj1leHBsb2RlKHN0ciwiICIpOworICBhcnItPSh7IiJ9KTsgIC8vICIiIGVudGZlcm5lbgorICBpZiAoc2l6ZW9mKGFycik8MikKKyAgICByZXR1cm4oMCk7CisgIGlkPXRvX2ludChhcnJbMF0pOworICBzdHI9aW1wbG9kZShhcnJbMS4uXSwiICIpOyAgLy90ZXh0IHdpZWRlcmhlcnN0ZWxsZW4sIG9obmUgZXJzdGVzIEVsZW1lbnQKKyAgaWYgKCFzaXplb2Yoc3RyKSkgcmV0dXJuKDApOworICBpZiAoIW1lbWJlcihub3RpemVuLGlkKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgc3ByaW50ZigiRXMgZ2lidCBrZWluZSBOb3RpeiBtaXQgZGVyIElEOiAlZFxuIixpZCkpOworICAgIHJldHVybigxKTsKKyAgfQorICBub3RpemVuW2lkLE5PVEVfVEVYVF09c3RyOworICBzYXZlX21lKDYwKTsKKyAgdGVsbF9vYmplY3QoUEwsQlMoCisgICAgICBzcHJpbnRmKCJUZXh0IHZvbiBOb3RpeiAlZCBlcnNldHp0LiIsaWQpKSk7CisgIHRlbGxfcm9vbShlbnZpcm9ubWVudChUSSksCisgICAgQlMoc3ByaW50ZigiJXMgcmFkaWVydCB6dWVyc3QgZXR3YXMgYXVmICVzIE5vdGl6emV0dGVsIGhlcnVtIHVuZCAiCisgICAgICAgICJzY2hyZWlidCBhbnNjaGxpZXNzZW5kIHNvcmdmYWVsdGlnIGV0d2FzIG5ldWVzIGF1Zi5cbiIsCisgICAgICAgIGNhcGl0YWxpemUoKHN0cmluZylUSS0+bmFtZShXRVIpKSwKKyAgICAgICAgKCgoaW50KVRJLT5RdWVyeVByb3AoUF9HRU5ERVIpKT09RkVNQUxFID8gImlocmVtIiA6ICJzZWluZW0iKSAKKyAgICAgICAgICAgICAgKSksKHtUSX0pKTsKKyAgcmV0dXJuKDEpOworfQorCitpbnQgRXJnYWVuemVUZXh0KHN0cmluZyBzdHIpIHsKKyAgc3RyaW5nICphcnI7CisgIGludCBpZDsKKyAgCisgIG5vdGlmeV9mYWlsKCJCaXR0ZSBlaW5lIElEIHVuZCBlaW5lbiBUZXh0IGFuZ2ViZW4hXG4iKTsKKyAgaWYoIW9iamVjdHAoVEkpKSByZXR1cm4oMCk7CisgIGlmKCFjaGVja19hbGxvd2VkKCkpIHsKKyAgICBpZihvYmplY3RwKHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgICAgICB0ZWxsX29iamVjdCh0aGlzX2ludGVyYWN0aXZlKCksCisgICAgICAgIEJTKCJEaWVzZXIgWnVncmlmZiBhdWYgZGVuIE1lcmt6ZXR0ZWwgd3VyZGUgbmljaHQgZXJsYXVidC4iKSk7CisgICAgcmV0dXJuKDApOworICB9CisgIHN0cj0oc3RyaW5nKVBMLT5fdW5wYXJzZWRfYXJncygwKTsKKyAgaWYgKCFzdHJpbmdwKHN0cikgfHwgIXNpemVvZihzdHIpKQorICAgIHJldHVybigwKTsKKyAgCisgIGlmICghY2hlY2tTdGF0dXMoKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLEJTKAorICAgICAgIkRlaW4gTWVya3pldHRlbCBpc3QgYmx1ZXRlbndlaXNzIHVuZCBsZWVyISBXaWUga29tbXQgZGFzIGRlbm4/PyAiCisgICAgICAiSGFzdCBEdSBuaXggenUgdHVuPyIpKTsKKyAgICByZXR1cm4oMSk7CisgIH0KKyAgYXJyPWV4cGxvZGUoc3RyLCIgIik7CisgIGFyci09KHsiIn0pOyAgLy8gIiIgZW50ZmVybmVuCisgIGlmIChzaXplb2YoYXJyKTwyKQorICAgIHJldHVybigwKTsKKyAgaWQ9dG9faW50KGFyclswXSk7CisgIHN0cj0iXG4iOworICBzdHIrPWltcGxvZGUoYXJyWzEuLl0sIiAiKTsgIC8vdGV4dCB3aWVkZXJoZXJzdGVsbGVuCisgIGlmICghbWVtYmVyKG5vdGl6ZW4saWQpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsCisgICAgICBzcHJpbnRmKCJFcyBnaWJ0IGtlaW5lIE5vdGl6IG1pdCBkZXIgSUQ6ICVkXG4iLGlkKSk7CisgICAgcmV0dXJuKDEpOworICB9CisgIG5vdGl6ZW5baWQsTk9URV9URVhUXSs9c3RyOworICBzYXZlX21lKDYwKTsKKyAgdGVsbF9vYmplY3QoUEwsQlMoCisgICAgICBzcHJpbnRmKCJUZXh0IHZvbiBOb3RpeiAlZCBlcmdhZW56dC4iLGlkKSkpOworICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoVEkpLAorICAgIEJTKHNwcmludGYoIiVzIGVyZ2Flbnp0IGV0d2FzIGF1ZiAlcyBOb3RpenpldHRlbC5cbiIsCisgICAgICAgIGNhcGl0YWxpemUoKHN0cmluZylUSS0+bmFtZShXRVIpKSwKKyAgICAgICAgKCgoaW50KVRJLT5RdWVyeVByb3AoUF9HRU5ERVIpKT09RkVNQUxFID8gImlocmVtIiA6ICJzZWluZW0iKSAKKyAgICAgICAgICAgICAgKSksKHtUSX0pKTsKKyAgcmV0dXJuKDEpOworfQorCitpbnQgWmVpZ2VaZXR0ZWwoc3RyaW5nIHN0cikgeworICAgIC8vYW5kZXJlbiB6ZWlnZW4sIHdpZSBmdXJjaHRiYXIgdmllbCBtYW4genUgdHVuIGhhdC4KKyAgb2JqZWN0IHBsOworICBpbnQgY291bnQ7CisgIGludCAqaWRzOworICAKKyAgbm90aWZ5X2ZhaWwoIldlbSB3aWxsc3QgRHUgRGVpbmVuIE1lcmt6ZXR0ZWwgemVpZ2VuP1xuIik7CisgIGlmICghb2JqZWN0cChUSSkpIHJldHVybigwKTsKKyAgaWYgKCFlbnZpcm9ubWVudCgpIHx8ICFlbnZpcm9ubWVudChlbnZpcm9ubWVudCgpKSkKKyAgICAgcmV0dXJuKDApOworICBpZiAoIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikpIHJldHVybigwKTsKKyAgaWYoIWNoZWNrX2FsbG93ZWQoKSkgeworICAgIGlmKG9iamVjdHAodGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICAgIHRlbGxfb2JqZWN0KHRoaXNfaW50ZXJhY3RpdmUoKSwKKyAgICAgICAgQlMoIkRpZXNlciBadWdyaWZmIGF1ZiBkZW4gTWVya3pldHRlbCB3dXJkZSBuaWNodCBlcmxhdWJ0LiIpKTsKKyAgICByZXR1cm4oMCk7CisgIH0KKyBpZiAoIWNoZWNrU3RhdHVzKCkpIHsKKyAgICB0ZWxsX29iamVjdChQTCxCUygKKyAgICAgICJEZWluIE1lcmt6ZXR0ZWwgaXN0IGJsdWV0ZW53ZWlzcyB1bmQgbGVlciEgV2llIGtvbW10IGRhcyBkZW5uPz8gIgorICAgICAgIkhhc3QgRHUgbml4IHp1IHR1bj8gRHUgd2lsbHN0IGFuZGVyZW4gTGV1dGVuIGRvY2ggYmVzdGltbXQgbmljaHQgIgorICAgICAgInplaWdlbiwgZGFzcyBEdSBuaXggenUgdHVuIGhhc3QsIG9kZXI/IikpOworICAgIHJldHVybigxKTsKKyAgfQorIGlmKCFvYmplY3RwKHBsPXByZXNlbnQoc3RyLGVudmlyb25tZW50KGVudmlyb25tZW50KCkpKSkpCisgICAgIHJldHVybigwKTsKKyBpZiAoIWxpdmluZyhwbCkpCisgICAgIHJldHVybigwKTsKKworIGlkcz1maWx0ZXIobV9pbmRpY2VzKG5vdGl6ZW4pLCMnbm90ZV9maWx0ZXIsTk9URV9BQ1RJVkUpOworIHRlbGxfb2JqZWN0KFRJLEJTKCJEdSB6ZWlnc3QgIitwbC0+TmFtZShXRU0pKyIgdm9sbGVyIFN0b2x6IGRlaW5lbiB2b2xsZW4gIgorICAgICAgICJNZXJremV0dGVsLiIpKTsKKyB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoZW52aXJvbm1lbnQoKSksQlMoc3ByaW50ZigKKwkgIiVzIHplaWd0ICVzICVzIE1lcmt6ZXR0ZWwuIiwKKyAgICAgICBUSS0+TmFtZShXRVIpLHBsLT5OYW1lKFdFTSksVEktPlF1ZXJ5UG9zc1Byb25vdW4oTUFMRSxXRU4sU0lOR1VMQVIpKSksCisgICAgICh7VEkscGx9KSk7Cisgc3dpdGNoKHNpemVvZihpZHMpKSB7CisgICAgIGNhc2UgMC4uMTA6CisgICAgICAgdGVsbF9vYmplY3QocGwsQlMoc3ByaW50ZigiJXMgemVpZ3QgRGlyIHZvbGxlciBTdG9seiAlcyBNZXJremV0dGVsLiBEdSAiCisJICAgICAgICJ3aXJmc3QgZWluZW4gc2NobmVsbGVuIEJsaWNrIGRhcnVlYmVyIHVuZCB6YWVobHN0ICVkICIKKwkgICAgICAgIk5vdGl6ZW4uIE5hLCBzb3ZpZWwgaXN0IGRhcyBqYSB6dW0gR2x1ZWNrIG5vY2ggbmljaHQuIiwKKwkgICAgICAgVEktPk5hbWUoV0VSKSxUSS0+UXVlcnlQb3NzUHJvbm91bihNQUxFLFdFTixTSU5HVUxBUiksCisJICAgICAgIHNpemVvZihpZHMpKSkpOworICAgICAgIGJyZWFrOworICAgIGNhc2UgMTEuLjIwOgorICAgICAgICB0ZWxsX29iamVjdChwbCxCUyhzcHJpbnRmKCIlcyB6ZWlndCBEaXIgdm9sbGVyIFN0b2x6ICVzIE1lcmt6ZXR0ZWwuIER1ICIKKwkgICAgICAgIndpcmZzdCBlaW5lbiBzY2huZWxsZW4gQmxpY2sgZGFydWViZXIgdW5kIHphZWhsc3QgJWQgIgorCSAgICAgICAiTm90aXplbi4gT2gsIGRhcyBpc3QgamEgc2Nob24gc28gZWluaWdlcyEiLAorCSAgICAgICBUSS0+TmFtZShXRVIpLFRJLT5RdWVyeVBvc3NQcm9ub3VuKE1BTEUsV0VOLFNJTkdVTEFSKSwKKwkgICAgICAgc2l6ZW9mKGlkcykpKSk7CisgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgdGVsbF9vYmplY3QocGwsQlMoc3ByaW50ZigiJXMgemVpZ3QgRGlyIHZvbGxlciBTdG9seiAlcyBNZXJremV0dGVsLiBEdSAiCisJICAgICAgICJ3aXJmc3QgZWluZW4gc2NobmVsbGVuIEJsaWNrIGRhcnVlYmVyIHVuZCB6YWVobHN0ICVkICIKKwkgICAgICAgIk5vdGl6ZW4uIFB1dXVoLiAlcyBoYXQgZ2FueiBzY2hvZW4gdmllbCB6dSB0dW4hIEluICIKKwkgICAgICAgIkRpciByZWd0IHNpY2ggbGVpc2VzIE1pdGxlaWQuIiwKKwkgICAgICAgVEktPk5hbWUoV0VSKSxUSS0+UXVlcnlQb3NzUHJvbm91bihNQUxFLFdFTixTSU5HVUxBUiksCisJICAgICAgIHNpemVvZihpZHMpLFRJLT5OYW1lKFdFUikgKSkpOworICAgICAgIGJyZWFrOworIH0KKyByZXR1cm4oMSk7CisgfQorCitpbnQgV2VkZWxaZXR0ZWwoc3RyaW5nIHN0cikgeworICAgIG9iamVjdCBwbDsKKyAgICBzdHJpbmcgcndlZGVsOworICAvL3dlZGVsdCBhbmRlcmVuIG1pdCBkZW0gWmV0dGVsIHZvciBkZXIgTmFzZSBoZXJ1bS4KKyAgbm90aWZ5X2ZhaWwoIldlbSB3aWxsc3QgRHUgRGVpbmVuIE1lcmt6ZXR0ZWwgemVpZ2VuP1xuIik7CisgIGlmICghb2JqZWN0cChUSSkpIHJldHVybigwKTsKKyAgaWYgKCFlbnZpcm9ubWVudCgpIHx8ICFlbnZpcm9ubWVudChlbnZpcm9ubWVudCgpKSkKKyAgICAgcmV0dXJuKDApOworICBpZiAoIXN0cmluZ3Aoc3RyKSB8fCAhc2l6ZW9mKHN0cikpIHJldHVybigwKTsKKyAgaWYoIWNoZWNrX2FsbG93ZWQoKSkgeworICAgIGlmKG9iamVjdHAodGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICAgIHRlbGxfb2JqZWN0KHRoaXNfaW50ZXJhY3RpdmUoKSwKKyAgICAgICAgQlMoIkRpZXNlciBadWdyaWZmIGF1ZiBkZW4gTWVya3pldHRlbCB3dXJkZSBuaWNodCBlcmxhdWJ0LiIpKTsKKyAgICByZXR1cm4oMCk7CisgIH0KKyAgaWYgKCFvYmplY3RwKHBsPWZpbmRfcGxheWVyKHN0cikpKSByZXR1cm4oMCk7CisgIGlmICghcHJlc2VudChwbCxlbnZpcm9ubWVudChlbnZpcm9ubWVudCgpKSkpCisgICAgcndlZGVsPSJhdXMgZGVyIEZlcm5lIjsKKyAgICAgIAorICB0ZWxsX29iamVjdChQTCxCUygiRHUgd2VkZWxzdCAiK3BsLT5OYW1lKFdFTSkgCisJKyAocndlZGVsPyIgIityd2VkZWw6IiIpIAorCSsiIGhlZnRpZyBtaXQgRGVpbmVtIE1lcmt6ZXR0ZWwgdm9yIGRlciBOYXNlIGhlcnVtLiIpKTsKKyAgdGVsbF9vYmplY3QocGwsQlMoUEwtPk5hbWUoV0VSKSsgIiB3ZWRlbHQgRGlyICIgCisJKyAocndlZGVsP3J3ZWRlbCsiICI6IiIpICsiaGVmdGlnIG1pdCAiCisJK1BMLT5RdWVyeVBvc3NQcm9ub3VuKE1BTEUsV0VNLFNJTkdVTEFSKQorCSsiIE1lcmt6ZXR0ZWwgdm9yIGRlciBOYXNlIGhlcnVtLiIpKTsKKyAgdGVsbF9yb29tKGVudmlyb25tZW50KHBsKSxCUyhQTC0+TmFtZShXRVIpICsgIiB3ZWRlbHQgIgorCStwbC0+TmFtZShXRU0pICsgKHJ3ZWRlbD8iICIrcndlZGVsOiIiKSArICIgaGVmdGlnIG1pdCAiCisgICAgICAgK1BMLT5RdWVyeVBvc3NQcm9ub3VuKE1BTEUsV0VNLFNJTkdVTEFSKQorICAgICAgICsiIE1lcmt6ZXR0ZWwgdm9yIGRlciBOYXNlIGhlcnVtLiIpLCh7UEwscGx9KSk7CisgIHJldHVybigxKTsKK30KKworaW50IExpZXNEZXBzKHN0cmluZyBzdHIpIHsKKyAgLy9lcnN0bWFsIChyZWt1cnNpdikgYWxsZSBBYmhhZW5naWdrZWl0ZW4gZWluZXIgTm90aXogZXJtaXR0ZWxuCisgIHN0cmluZyAqYXJyOworICBpbnQgaWQsIHJlYywgaTsKKyAgaW50ICpsaXN0ZTsKKyAgCisgIG5vdGlmeV9mYWlsKCJCaXR0ZSBlaW5lIElEIHVuZCBnZ2YuICcxJyBmdWVyIHJla3Vyc2l2ZSBTdWNoZSBhbmdlYmVuIVxuIik7CisgIGlmKCFvYmplY3RwKFRJKSkgcmV0dXJuKDApOworICBpZighY2hlY2tfYWxsb3dlZCgpKSB7CisgICAgaWYob2JqZWN0cCh0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgICAgdGVsbF9vYmplY3QodGhpc19pbnRlcmFjdGl2ZSgpLAorICAgICAgICBCUygiRGllc2VyIFp1Z3JpZmYgYXVmIGRlbiBNZXJremV0dGVsIHd1cmRlIG5pY2h0IGVybGF1YnQuIikpOworICAgIHJldHVybigwKTsKKyAgfQorICBzdHI9KHN0cmluZylQTC0+X3VucGFyc2VkX2FyZ3MoMCk7CisgIGlmICghc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSkKKyAgICByZXR1cm4oMCk7CisgIAorICBpZiAoIWNoZWNrU3RhdHVzKCkpIHsKKyAgICB0ZWxsX29iamVjdChQTCxCUygKKyAgICAgICJEZWluIE1lcmt6ZXR0ZWwgaXN0IGJsdWV0ZW53ZWlzcyB1bmQgbGVlciEgV2llIGtvbW10IGRhcyBkZW5uPz8gIgorICAgICAgIkhhc3QgRHUgbml4IHp1IHR1bj8iKSk7CisgICAgcmV0dXJuKDEpOworICB9CisgIGFycj1leHBsb2RlKHN0ciwiICIpOworICBhcnItPSh7IiJ9KTsgIC8vICIiIGVudGZlcm5lbgorICBpZiAoc2l6ZW9mKGFycik9PTEpIHsKKyAgICBpZD10b19pbnQoYXJyWzBdKTsKKyAgICByZWM9MDsgIC8vU3RhbmRhcmQ6IGtlaW5lIFJla3Vyc2lvbgorICB9CisgIGVsc2UgaWYgKHNpemVvZihhcnIpPj0yKSB7CisgICAgaWQ9dG9faW50KGFyclswXSk7CisgICAgcmVjPXRvX2ludChhcnJbMV0pOworICB9CisgIGVsc2UgeworICAgIHJldHVybigwKTsKKyAgfQorICBpZiAoIW1lbWJlcihub3RpemVuLGlkKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLAorICAgICAgc3ByaW50ZigiRXMgZ2lidCBrZWluZSBOb3RpeiBtaXQgZGVyIElEOiAlZFxuIixpZCkpOworICAgIHJldHVybigxKTsKKyAgfQorICAvL05vdGl6ZW4sIHZvbiBkZW5lbiBpZCBhYmhhZW5ndCwgaG9sZW4KKyAgLy91bmQgbnVyIGFrdGl2ZSBOb3RpemVuIGJlaGFsdGVuCisgIGxpc3RlPWZpbHRlcihnZXREZXBzKGlkLHJlYyksIydub3RlX2ZpbHRlcixOT1RFX0FDVElWRSk7CisgIC8vbmFjaCBQcmlvcml0YWV0IHNvcnRpZXJlbgorICBsaXN0ZT1zb3J0X2FycmF5KGxpc3RlLCMnc29ydF9wcmlvKTsKKyAgLy9kYW5uIG1hbCBhdXNnZWJlbi4KKyAgaT1zaXplb2YobGlzdGUpOworICB0ZWxsX29iamVjdChQTCxCUyhzcHJpbnRmKCJEdSB2ZXJ0aWVmc3QgRGljaCBpbiBkaWUgQWJoYWVuaGlna2VpdGVuIHZvbiBOb3RpejogJWRcbiIsaWQpKSk7CisgIHdoaWxlKGktLSkgeworICAgIHRlbGxfb2JqZWN0KFBMLF9MaWVzTm90aXoobGlzdGVbaV0pKyJcbiIpOworICB9CisgIHRlbGxfcm9vbShlbnZpcm9ubWVudChUSSksCisgICAgQlMoc3ByaW50ZigiJXMgbGllc3QgZXR3YXMgYXVmICVzIE1lcmt6ZXR0ZWwuXG4iLAorICAgICAgICBjYXBpdGFsaXplKChzdHJpbmcpVEktPm5hbWUoV0VSKSksCisgICAgICAgICgoKGludClUSS0+UXVlcnlQcm9wKFBfR0VOREVSKSk9PUZFTUFMRSA/ICJpaHJlbSIgOiAic2VpbmVtIikgCisgICAgICAgICAgICAgICkpLCh7VEl9KSk7CisgIHJldHVybigxKTsgICAgCit9CisKK2ludCBFeHBpcmUoc3RyaW5nIHN0cikgeworICBmbG9hdCBhZ2U7CisgIGludCBzZWt1bmRlbiwgaTsKKyAgaW50ICpsaXN0ZTsKKyAgc3RyaW5nIHJlczsKKyAgCisgIG5vdGlmeV9mYWlsKCJCaXR0ZSBhbmdlYmVuLCB3aWUgYWx0IHp1IGxvZXNjaGVuZGUgTm90aXplbiBzZWluIHNvbGxlbiAoaW4gVGFnZW4pIVxuIik7CisgIGlmKCFvYmplY3RwKFRJKSkgcmV0dXJuKDApOworICBpZighY2hlY2tfYWxsb3dlZCgpKSB7CisgICAgaWYob2JqZWN0cCh0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgICAgdGVsbF9vYmplY3QodGhpc19pbnRlcmFjdGl2ZSgpLAorICAgICAgICBCUygiRGllc2VyIFp1Z3JpZmYgYXVmIGRlbiBNZXJremV0dGVsIHd1cmRlIG5pY2h0IGVybGF1YnQuIikpOworICAgIHJldHVybigwKTsKKyAgfQorICBzdHI9KHN0cmluZylQTC0+X3VucGFyc2VkX2FyZ3MoMCk7CisgIGlmICghc3RyaW5ncChzdHIpIHx8ICFzaXplb2Yoc3RyKSkKKyAgICByZXR1cm4oMCk7CisgIGFnZT10b19mbG9hdChzdHIpOworICBpZiAoYWdlPD0wKSByZXR1cm4oMCk7CisgIHNla3VuZGVuPXRpbWUoKSAtIChpbnQpKGFnZSo4NjQwMCk7CisgIGlmICghY2hlY2tTdGF0dXMoKSkgeworICAgIHRlbGxfb2JqZWN0KFBMLEJTKAorICAgICAgIkRlaW4gTWVya3pldHRlbCBpc3QgYmx1ZXRlbndlaXNzIHVuZCBsZWVyISBXaWUga29tbXQgZGFzIGRlbm4/PyAiCisgICAgICAiSGFzdCBEdSBuaXggenUgdHVuPyIpKTsKKyAgICByZXR1cm4oMSk7CisgIH0KKyAgLy9hYmdlaGFrdGUgTm90aXplbiBlcm1pdHRlbG4KKyAgbGlzdGU9ZmlsdGVyKG1faW5kaWNlcyhub3RpemVuKSwjJ25vdGVfZmlsdGVyLE5PVEVfRklOSVNIRUQpOworICAvL05vdGl6ZW4gZXJtaXR0ZWxuLCBkaWUgbGFuZyBnZW51ZyBhYmdlaGFrdCBzaW5kLgorICBsaXN0ZT1maWx0ZXIobGlzdGUsIydhZWx0ZXJfYWxzLHNla3VuZGVuKTsKKyAgaWYgKCFzaXplb2YobGlzdGUpKSB7CisgICAgdGVsbF9vYmplY3QoUEwsQlMoIktlaW5lIE5vdGl6ZW4gZ2VmdW5kZW4sIGRpZSBsYW5nIGdlbnVnIGFiZ2VoYWt0IHNpbmQuIikpOworICAgIHJldHVybigxKTsKKyAgfQorICByZXM9c3ByaW50ZigiQXJjaGl2aWVydGUgTm90aXplbiB2b20gJXNcblxuIixkdGltZSh0aW1lKCkpKTsKKyAgZm9yIChpPXNpemVvZihsaXN0ZSk7aS0tOykgeworICAgIC8vSW5mb3Mgbm9jaCBlaW5tYWwgYXVzZ2ViZW4gdW5kIGxvZXNjaGVuCisgICAgcmVzKz1fTGllc05vdGl6KGxpc3RlW2ldKSsiXG4iOworICAgIG1fZGVsZXRlKG5vdGl6ZW4sbGlzdGVbaV0pOworICB9CisgIHJlcys9IlxuIjsKKyAgd3JpdGVfZmlsZShBUkNISVZFKG93bmVyKSxyZXMpOworICB0ZWxsX29iamVjdChQTCxCUyhzcHJpbnRmKAorICAgICIlZCBhbHRlIE5vdGl6ZW4gd3VyZGVuIG5hY2ggJXMgYXJjaGl2aWVydCB1bmQgZ2Vsb2VzY2h0LiIsCisgICAgICAgc2l6ZW9mKGxpc3RlKSxBUkNISVZFKG93bmVyKSkpKTsKKyAgcmV0dXJuKDEpOworfQorCisvLworc3RhdGljIHN0cmluZyBfTGllc05vdGl6KGludCBpZCkgeworICAvL0Z1bmt0aW9uIHZlcmxhZXNzdCBzaWNoIGRyYXVmLCBkYXNzIGlkIGV4aXN0aWVydC4gOy0pCisgIHN0cmluZyByZXMsdHh0OworICByZXM9QlNMKHNwcmludGYoIiUtMTFzOiAlZCIsIk5vdGl6LU5yLiIsaWQpKTsKKyAgcmVzKz1icmVha19zdHJpbmcobm90aXplbltpZCxOT1RFX1RFWFRdLDc4LCJOb3RpenRleHQgIDogIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlNfSU5ERU5UX09OQ0V8QlNfTEVBVkVfTVlfTEZTKTsKKyAgcmVzKz1zcHJpbnRmKCIlLTExczogJWRcbiIsIlByaW9yaXRhZXQiLG5vdGl6ZW5baWQsTk9URV9QUklPXSk7CisgIC8vd2VubiBuaWNodCBha3RpdjogU3RhdHVzIGFuemVpZ2VuCisgIGlmIChub3RpemVuW2lkLE5PVEVfU1RBVFVTXSE9Tk9URV9BQ1RJVkUpIHsKKyAgICBzd2l0Y2gobm90aXplbltpZCxOT1RFX1NUQVRVU10pIHsKKyAgICAgIGNhc2UgTk9URV9JTkFDVElWRToKKyAgICAgICAgICB0eHQ9IkluYWt0aXYvUGF1c2UiOworICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBOT1RFX0ZJTklTSEVEOgorICAgICAgICAgIHR4dD0iQWJnZXNjaGxvc3NlbiI7IAorICAgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBOT1RFX1BFTkRJTkc6CisgICAgICAgICAgdHh0PSJXYXJ0ZSBhdWYgUnVlY2ttZWxkdW5nIjsgCisgICAgICAgICAgYnJlYWs7CisgICAgICBkZWZhdWx0OiB0eHQ9c3ByaW50ZigiJWQiLG5vdGl6ZW5baWQsTk9URV9TVEFUVVNdKTsgYnJlYWs7CisgICAgfQorICAgIHJlcys9c3ByaW50ZigiJS0xMXM6ICVzXG4iLCJTdGF0dXMiLHR4dCk7CisgICAgLy93ZW5uIGFiZ2VzY2hsb3NzZW46IEVuZGV6ZWl0IGFuemVpZ2VuCisgICAgaWYgKG5vdGl6ZW5baWQsTk9URV9TVEFUVVNdPT1OT1RFX0ZJTklTSEVEKQorICAgICAgcmVzKz1zcHJpbnRmKCIlLTExczogJXNcbiIsIkVuZGV6ZWl0IiwKKyAgICAgICAgICAgICAgICAgIGR0aW1lKG5vdGl6ZW5baWQsTk9URV9DTE9TRVRJTUVdKSk7CisgIH0KKyAgcmVzKz1zcHJpbnRmKCIlLTExczogJXNcbiIsIk1lcmt6ZWl0IixkdGltZShub3RpemVuW2lkLE5PVEVfU1RBUlRUSU1FXSkpOworICAvL251ciB3ZW5uIEFiaGFlbmdpZ2tlaXRlbjogYW5lemVpZ2VuCisgIGlmIChwb2ludGVycChub3RpemVuW2lkLE5PVEVfREVQU10pICYmIHNpemVvZihub3RpemVuW2lkLE5PVEVfREVQU10pKSB7CisgICAgdHh0PWltcGxvZGUobWFwKG5vdGl6ZW5baWQsTk9URV9ERVBTXSwjJ3RvX3N0cmluZyksIiAiKTsKKyAgICByZXMrPXNwcmludGYoIiUtMTFzOiAlc1xuIiwiYWJoLiB2b24iLHR4dCk7CisgIH0KKyAgLy9udXIgd2VubiBIZWxmZXI6IGFuZXplaWdlbgorICBpZiAocG9pbnRlcnAobm90aXplbltpZCxOT1RFX0hFTFBFUl0pICYmIHNpemVvZihub3RpemVuW2lkLE5PVEVfSEVMUEVSXSkpCisgICAgcmVzKz1zcHJpbnRmKCIlLTExczogJXNcbiIsIkhlbGZlciIsCisgICAgICAgICAgICAgICAgaW1wbG9kZShub3RpemVuW2lkLE5PVEVfSEVMUEVSXSwiICIpKTsKKyAgcmV0dXJuKHJlcyk7Cit9CisKKy8vaW50LiBIZWxmZXIKK3N0YXRpYyBpbnQgbm90ZV9maWx0ZXIoaW50IGlkLGludCBmaWx0ZXJzdGF0ZSkgeworICAgIC8va2VpbiBmaWx0ZXIgLT4gcGFzc3QgaW1tZXIKKyAgICBpZiAoIWZpbHRlcnN0YXRlKSByZXR1cm4oMSk7CisgICAgaWYgKG1lbWJlcihub3RpemVuLGlkKSAmJgorICAgIG5vdGl6ZW5baWQsTk9URV9TVEFUVVNdPT1maWx0ZXJzdGF0ZSkKKyAgICByZXR1cm4oMSk7CisgICAgcmV0dXJuKDApOworfQorCitzdGF0aWMgaW50IGFlbHRlcl9hbHMoaW50IGlkLGludCB6ZWl0KSB7CisgIC8vbGllZmVydCAxIHp1cnVlY2ssIHdlbm4gU2NobGllc3N6ZWl0IGRlciBOb3RpeiBsYWVuZ2VyIGFscyAnc2VrdW5kZW4nIGhlciBpc3QsIHNvbnN0IDAuCisgIGlmIChub3RpemVuW2lkLE5PVEVfQ0xPU0VUSU1FXTx6ZWl0KSByZXR1cm4oMSk7CisgIHJldHVybigwKTsKK30KKworc3RhdGljIHN0cmluZyB1cGRhdGVfZGVwcyhzdHJpbmcgc3RyLGludCBpZCkgeworICAvL3dhbmRlbHQgc3RyIG5hY2ggaW50IHVtCisgIC8vc2NoYXV0LCBvYiBkZXAgcG9zaXRpdiB1bmQgbm9jaCBuaWNodCBiZWthbm50IGlzdCwgd2VubiBqYTogCisgIC8venUgZGVwcyBoaW56dWZ1ZWdlbgorICAvL3dlbm4gZGVwIDwgMCB1bmQgYmVrYW5udCBpc3Q6IGF1cyBkZXBzIGVudGZlcm5lbgorICAvL1J1ZWNrZ2FiZXdlcnQgaXN0IGVnYWwuIDstKQorICBpbnQgZGVwOworICBkZXA9dG9faW50KHN0cik7CisgIGlmIChkZXA+MCAmJiBtZW1iZXIobm90aXplbltpZCxOT1RFX0RFUFNdLGRlcCk9PS0xKQorICAgIG5vdGl6ZW5baWQsTk9URV9ERVBTXSs9KHtkZXB9KTsKKyAgZWxzZSBpZiAoZGVwPDAgJiYgbWVtYmVyKG5vdGl6ZW5baWQsTk9URV9ERVBTXSxkZXAqLTEpIT0tMSkKKyAgICBub3RpemVuW2lkLE5PVEVfREVQU10tPSh7ZGVwKi0xfSk7CisgIHJldHVybigiIik7Cit9CisKK3N0YXRpYyBpbnQgKmdldERlcHMoaW50IGlkLCBpbnQgcmVjKSB7CisgIC8vZXJtaXR0ZWx0IChnZ2YuIHJla3Vyc2l2IGJlaSByZWMhPTApIGRpZSBBYmhhZW5naWdrZWl0ZW4gZWluZXIgTm90aXoKKyAgaW50IGksICpsaXN0ZTsKKyAgbGlzdGU9bm90aXplbltpZCxOT1RFX0RFUFNdOworICAvL2pldHp0IGdnZi4gbm9jaCByZWt1cnNpdiB3ZWl0ZXJob2xlbgorICBpZiAocmVjKSAgeworICAgIGk9MDsKKyAgICB3aGlsZShpPHNpemVvZihsaXN0ZSkpIHsKKyAgICAgICAgLy9uaWNodCBzY2hyZWllbi4gOy0pCisgICAgICAgIGlmIChnZXRfZXZhbF9jb3N0KCk8MTAwMDAwKSB7CisgICAgICAgICAgICB0ZWxsX29iamVjdChQTCwiRmVobGVyOiBadSBsYW5nZSBSZWt1cnNpb24gYmVpICIKKwkJIkVybWl0dGVsbiBkZXIgQWJoYWVuZ2lna2VpdGVuLCBBYmJydWNoXG4iKTsKKyAgICAgICAgICAgIHJldHVybihsaXN0ZSk7CisgICAgICAgIH0KKyAgICAgICAgLy9BYmhhZW5naWdrZWl0ZW4gZGVyIGFuZGVyZW4gQWJoYWVuZ2lna2VpdGVuIGhpbnRlbiBhbmhhZW5nZW4uCisgICAgICAgIGxpc3RlKz1ub3RpemVuW2xpc3RlW2ldLE5PVEVfREVQU107CisgICAgICAgIGkrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuKGxpc3RlKTsKK30KKworc3RhdGljIGludCAqZ2V0VW5yZXNvbHZlZERlcHMoaW50IGlkKSB7CisgIC8vbGllZmVydCBkaWUgQW56YWhsIGRlciBuaWNodCBhYmdlaGFrdGVuIE5vdGl6ZW4sIHZvbiBkZW5lbiBlaW5lIAorICAvL05vdGl6IGFiaGFlbmdpZyBpc3QgKHJla3Vyc2l2KQorICBpbnQgKmxpc3RlOworICAvL0FiaGFlbmdpZ2tlaXRlbiByZWt1cnNpdiBob2xlbgorICBsaXN0ZT1nZXREZXBzKGlkLDEpOworICAvL25pY2h0IGFiZ2VoYWt0ZSB6dXJ1ZWNrZ2ViZW4KKyAgcmV0dXJuKGxpc3RlLWZpbHRlcihsaXN0ZSwjJ25vdGVfZmlsdGVyLE5PVEVfRklOSVNIRUQpKTsKK30KKwordm9pZCBpbml0KCkgeworICA6OmluaXQoKTsKKyAgLy93ZW5uIGtlaW4gRW52LCBFbnYga2VpbiBtYWdpZXIgb2RlciBuaWNodCBkZXIgRWlnZW50dWVtZXIgaXN0OiB3ZWcKKyAgaWYgKCFvYmplY3RwKGVudmlyb25tZW50KCkpIHx8ICFJU19MRUFSTkVSKGVudmlyb25tZW50KCkpCisgICAgIHx8IChzdHJpbmdwKG93bmVyKSAmJiBnZXR1aWQoZW52aXJvbm1lbnQoKSkhPW93bmVyKSApIHsKKyAgICBpZiAoZmluZF9jYWxsX291dCgicmVtb3ZlIikgPT0gLTEpCisgICAgICBjYWxsX291dCgicmVtb3ZlIiwxLDEpOworICAgIHJldHVybjsKKyAgfQorICAvL2JlaW0gZXJzdG1hbGlnZW4gQmV3ZWdlbiBpbiBlaW5lbiBNYWdpZXIgd2lyZCBkZXIgYWxzIEVpZ2VudHVlbWVyCisgIC8vcmVnaXN0cmllcnQuIERhbmFjaCBrb21tdCBkaWVzZSBJbmZvIGF1cyBQX0FVVE9MT0FECisgIGlmICghc3RyaW5ncChvd25lcikpCisgICAgb3duZXI9Z2V0dWlkKGVudmlyb25tZW50KCkpOworfQorCitzdGF0aWMgbm9tYXNrIHN0YXR1cyBjaGVja19hbGxvd2VkKCkgeworICAvL1p1Z3JpZmYgYXVmIGRpZSBEYXRlbiBmdWVyIGRlbiBFaWdlbnR1ZW1lcgorICBpZihvYmplY3RwKHRoaXNfaW50ZXJhY3RpdmUoKSkgJiYKKyAgICAgZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSk9PW93bmVyCisgICAgICYmICFwcm9jZXNzX2NhbGwoKSkKKyAgICByZXR1cm4oMSk7CisgIHJldHVybigwKTsKK30KKworcHJvdGVjdGVkIGludCByZXN0b3JlX21lKCkgeworICAvL2xhZWR0IFNhdmVmaWxlIGltIEhvbWUgdm9tIE1hZ2llcgorICBpZighc3RyaW5ncChvd25lcikpIHJldHVybigwKTsKKyAgaWYoIXJlc3RvcmVfb2JqZWN0KFNBVkVGSUxFKG93bmVyKSkpIHsKKyAgICBtYXh1c2VkSUQ9MTsKKyAgICBub3RpemVuPTA7CisgICAgLy9jYWNoZT0oe30pOworICAgIHJldHVybigwKTsKKyAgfQorICByZXR1cm4oMSk7Cit9CisKK3ZhcmFyZ3MgcHJvdGVjdGVkIHZvaWQgc2F2ZV9tZShpbnQgZGVsYXkpIHsKKyAgLy9zcGVpY2hlcnQgU2F2ZWZpbGUgaW0gSG9tZSB2b20gTWFnaWVyCisgIGlmKCFzdHJpbmdwKG93bmVyKSkgcmV0dXJuOworICAvL3dlbm4gbWF4dXNlZElEPT0wIHd1cmRlIGRlciB6ZXR0ZWwgbm9jaCBuaWNodCBvcmRlbnRsaWNoIGluaXRpYWxpc2llcnQKKyAgLy9iencuIHJlc3RhdXJpZXJ0LiBJbiBkaWVzZW0gRmFsbCB3dWVyZGUgZWluIGxlZXJlcyBTYXZlZmlsZSBnZXNjaHJpZWJlbgorICBpZiAobWF4dXNlZElEPT0wKQorICAgIHJlc3RvcmVfbWUoKTsKKyAgaWYoIWRlbGF5KQorICAgIC8vZGlyZWt0IHNwZWljaGVuLiA7LSkKKyAgICBzYXZlX29iamVjdChTQVZFRklMRShvd25lcikpOworICBlbHNlIHsKKyAgICAvL3ZlcnpvZWdlcnQgc3BlaWNoZXJuLCB3ZW5uIHNjaG9uIGVpbiBjYWxsX291dCBsYWV1ZnQsIG5laG0gaWNoIGRlbgorICAgIGlmKGZpbmRfY2FsbF9vdXQoIydzYXZlX21lKT09LTEpCisgICAgICBjYWxsX291dCgjJ3NhdmVfbWUsZGVsYXkpOworICB9Cit9CisKK3ZhcmFyZ3MgaW50IHJlbW92ZShpbnQgc2lsZW50KSB7CisgIC8vZXJzdG1hbCBzcGVpY2hlcm4uIDstKQorICBzYXZlX21lKCk7CisgIHJldHVybiA6OnJlbW92ZShzaWxlbnQpOworfQorCitzdGF0aWMgc3RyaW5nIHF1ZXJ5X2F1dG9sb2Fkb2JqKCkgeworICAvL2luIFBfQVVUT0xPQUQgd2lyZCBudXIgZGVyIEVpZ2VudHVlbWVyIGdlc3BlaWNoZXJ0CisgIHJldHVybiBvd25lcjsKK30KKworc3RhdGljIHN0cmluZyBzZXRfYXV0b2xvYWRvYmoobWl4ZWQgYXJnKSAgeworICAvL0VpZ2VudHVlbWVyIGF1cyBQX0FVVE9MT0FEIHJlc3RhdXJpZXJlbgorICBpZiAoc3RyaW5ncChhcmcpKQorICAgIG93bmVyPWFyZzsKKyAgcmV0dXJuKG93bmVyKTsKK30KKworLy9TaGFkb3cgdW5lcnd1ZW5zY2h0CitpbnQgcXVlcnlfcHJldmVudF9zaGFkb3coKSB7cmV0dXJuKDEpO30KKwordmFyYXJncyBzdGF0aWMgaW50IGNoZWNrU3RhdHVzKGludCBub2NhY2hlKSB7CisgIC8vc2NoYXV0LCBvYiBOb3RpemVuIGRhLCBvYiBkZXIgQ2FjaGUgT2sgaXN0LCBldGMuCisgIC8vbGllZmVydCBBbnphaGwgZGVyIE5vdGl6ZW4gYXVmIGRlbSBNZXJremV0dGVsCisgIAorICAvL3dlbm4ga2VpbmUgTm90aXplbiBkYSBzaW5kLCBzY2hhdWVuLCBvYiBkYXMgU2F2ZWZpbGUgZWluZ2VsZXNlbiB3ZXJkZW4KKyAgLy9rYW5uCisgIGlmICghbWFwcGluZ3Aobm90aXplbikgfHwgIXNpemVvZihub3RpemVuKSkKKyAgICByZXN0b3JlX21lKCk7CisgIGlmICghbWFwcGluZ3Aobm90aXplbikpIHJldHVybigwKTsKKy8qIENhY2hlIGlzdCBlaWdlbnRsaWNoIG5pY2h0IG5vZXRpZyB1bmQgbWlyIGdlcmFkZSB6dSB1bnByYWt0aXNjaCwgcmF1cyBkYW1pdC4gIAorICAvL3dlbm4ga2VpbmUgQWt0dWFsaXNpZXJ1bmcgZGVzIENhY2hlIGVyd3VlbnNjaHQgaXN0CisgIGlmKG5vY2FjaGUpIHJldHVybigwKTsKKyAgCisgIGlmIChzaXplb2Yobm90aXplbikpIHsKKyAgICBpZighcG9pbnRlcnAoY2FjaGUpIHx8ICFzaXplb2YoY2FjaGUpKSB7CisgICAgICAvL2NhY2hlIGVybmV1ZXJuCisgICAgICBjYWNoZT1zb3J0X2FycmF5KG1faW5kaWNlcyhub3RpemVuKSwic29ydF9wcmlvIik7CisgICAgfQorICB9CisgIHJldHVybihzaXplb2YoY2FjaGUpKTsgLy9hZXF1aXZhbGVudCB6dSBzaXplb2Yobm90aXplbikKKyAgKi8KKyAgcmV0dXJuKHNpemVvZihub3RpemVuKSk7Cit9CisKK3N0YXRpYyBzdGF0dXMgc29ydF9wcmlvKGludCBrZXkxLCBpbnQga2V5MikgeworICAvLyAxLCBmYWxscyBmYWxzY2hlIFJlaWhlbmZvbGdlLAorICAvLyAwLCB3ZW5uIHJpY2h0aWdlCisgIC8vIHVuZCB6d2FyIF9hYnN0ZWlnZW5kXywgYWxzbyBob2VjaHN0ZSBQcmlvIGluIGxpc3RlWzBdICEKKyAgcmV0dXJuKG5vdGl6ZW5ba2V5MSxOT1RFX1BSSU9dPD1ub3RpemVuW2tleTIsTk9URV9QUklPXSk7Cit9CisKKworLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKy8vIERlYnVnZ2luZworbWFwcGluZyBRdWVyeU5vdGl6ZW4oKSB7CisgIAorICBpZighY2hlY2tfYWxsb3dlZCgpKSB7CisgICAgaWYob2JqZWN0cCh0aGlzX2ludGVyYWN0aXZlKCkpKQorICAgICAgdGVsbF9vYmplY3QodGhpc19pbnRlcmFjdGl2ZSgpLAorICAgICAgICBCUygiRGllc2VyIFp1Z3JpZmYgYXVmIGRlbiBNZXJremV0dGVsIHd1cmRlIG5pY2h0IGVybGF1YnQuIikpOworICAgIHJldHVybigwKTsKKyAgfQorICBjaGVja1N0YXR1cygpOworICByZXR1cm4obm90aXplbik7Cit9CisKKy8vaW50ICpRdWVyeUNhY2hlKCkge3JldHVybihjYWNoZSk7fQorCitpbnQgUXVlcnlTaXplKCkge3JldHVybihzaXplb2Yobm90aXplbikpO30KKworc3RyaW5nIFF1ZXJ5T3duZXIoKSB7cmV0dXJuKG93bmVyKTt9CmRpZmYgLS1naXQgYS9vYmovdG9vbHMvbWVya3pldHRlbC9tZXJremV0dGVsLmggYi9vYmovdG9vbHMvbWVya3pldHRlbC9tZXJremV0dGVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNhNzcyNAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9tZXJremV0dGVsL21lcmt6ZXR0ZWwuaApAQCAtMCwwICsxLDc5IEBACisjaWZuZGVmIF9fWkVTU1RSQV9NRVJLWkVUVEVMX0hfXworI2RlZmluZSBfX1pFU1NUUkFfTUVSS1pFVFRFTF9IX18KKworI2RlZmluZSBTQVZFRklMRSh4KSAoIi9wbGF5ZXJzLyIreCsiLy5tZXJremV0dGVsIikKKyNkZWZpbmUgQVJDSElWRSh4KSAoIi9wbGF5ZXJzLyIreCsiL21lcmt6ZXR0ZWwuYXJjaGl2IikKKworI2RlZmluZSBOT1RFX1RFWFQgMAorI2RlZmluZSBOT1RFX1BSSU8gMQorI2RlZmluZSBOT1RFX1NUQVJUVElNRSAyCisjZGVmaW5lIE5PVEVfREVQUyAzCisjZGVmaW5lIE5PVEVfSEVMUEVSIDQKKyNkZWZpbmUgTk9URV9TVEFUVVMgNQorI2RlZmluZSBOT1RFX0NMT1NFVElNRSA2CisKKy8vU3RhdHVzLCA+MCBzaW5kIGFrdGl2LCA8MCBpbmFrdGl2CisjZGVmaW5lIE5PVEVfQUNUSVZFIDEKKyNkZWZpbmUgTk9URV9QRU5ESU5HIDIKKyNkZWZpbmUgTk9URV9JTkFDVElWRSAtMQorI2RlZmluZSBOT1RFX0ZJTklTSEVEIC0yCisjZGVmaW5lIE5PVEVfU1RBVEVTICh7Tk9URV9BQ1RJVkUsTk9URV9QRU5ESU5HLE5PVEVfSU5BQ1RJVkUsTk9URV9GSU5JU0hFRH0pCisKKy8vU29ydGllcnJlaWhlbmZvbGdlCisjZGVmaW5lIFNPUlRfSU5WRVJTRSAxCisKKy8vd2lldmllbCB3aXJkIG1heC5hYmdlc3BlaWNoZXJ0CisjZGVmaW5lIE1BWF9OT1RFX0xFTkdUSCAxMDAwCisvL3dpZXZpZWwgd2lyZCBtYXguIGluIGRlciBMaXN0ZSBhbmdlemVpZ3QKKyNkZWZpbmUgTUFYX05PVEVfTElTVF9MRU5HVEggNTAKKworI2RlZmluZSBCUyh4KSBicmVha19zdHJpbmcoeCw3OCkKKyNkZWZpbmUgQlNJKHgseSkgYnJlYWtfc3RyaW5nKHgsNzgseSkKKyNkZWZpbmUgQlNMKHgpIGJyZWFrX3N0cmluZyh4LDc4LCIiLEJTX0xFQVZFX01ZX0xGUykKKyNkZWZpbmUgQlNJTCh4LHkpIGJyZWFrX3N0cmluZyh4LDc4LHksQlNfTEVBVkVfTVlfTEZTKQorCisjZGVmaW5lIFRJIHRoaXNfaW50ZXJhY3RpdmUoKQorCisjaWZkZWYgTkVFRF9QUk9UT1RZUEVTCisvL0FkZENtZAoraW50IEFkZE5vdGl6KHN0cmluZyBzdHIpOworaW50IEVyc2V0emVUZXh0KHN0cmluZyBzdHIpOworaW50IEVyZ2FlbnplVGV4dChzdHJpbmcgc3RyKTsKK2ludCBSZW1vdmVOb3RpeihzdHJpbmcgc3RyKTsKK2ludCBGaW5pc2hOb3RpeihzdHJpbmcgc3RyKTsKK2ludCBMaXN0Tm90aXplbihzdHJpbmcgc3RyKTsKK2ludCBMaWVzTm90aXooc3RyaW5nIHN0cik7CitpbnQgQ2hhbmdlRGVwKHN0cmluZyBzdHIpOworaW50IENoYW5nZVN0YXR1cyhzdHJpbmcgc3RyKTsKK2ludCBDaGFuZ2VQcmlvKHN0cmluZyBzdHIpOworaW50IENoYW5nZUhlbHBlcihzdHJpbmcgc3RyKTsKK2ludCBaZWlnZVpldHRlbChzdHJpbmcgc3RyKTsKK2ludCBXZWRlbFpldHRlbChzdHJpbmcgc3RyKTsKK2ludCBMaWVzRGVwcyhzdHJpbmcgc3RyKTsKK2ludCBFeHBpcmUoc3RyaW5nIHN0cik7CisKKy8vdm9uIGRlbiBBZGRDbWQtRnVucyBnZXJ1ZmVuCitzdGF0aWMgc3RyaW5nIF9MaWVzTm90aXooaW50IGlkKTsKKworLy9zb25zdC4gRnVua3Rpb25lbiwgei5CLiBmdWVyIERlYnVnendlY2tlCittYXBwaW5nIFF1ZXJ5Tm90aXplbigpOworc3RyaW5nIFF1ZXJ5T3duZXIoKTsKK3ZhcmFyZ3MgaW50IHJlbW92ZShpbnQgc2lsZW50KTsKKworLy9pbnQuIEZ1bmt0aW9uZW4KK3N0YXRpYyBzdGF0dXMgc29ydF9wcmlvKGludCBrZXkxLCBpbnQga2V5Mik7CitzdGF0aWMgbm9tYXNrIHN0YXR1cyBjaGVja19hbGxvd2VkKCk7Citwcm90ZWN0ZWQgaW50IHJlc3RvcmVfbWUoKTsKK3ZhcmFyZ3MgcHJvdGVjdGVkIHZvaWQgc2F2ZV9tZShpbnQgZGVsYXkpOworc3RhdGljIHN0cmluZyBxdWVyeV9hdXRvbG9hZG9iaigpOworc3RhdGljIHN0cmluZyBzZXRfYXV0b2xvYWRvYmoobWl4ZWQgYXJnKTsKK3ZhcmFyZ3Mgc3RhdGljIGludCBjaGVja1N0YXR1cyhpbnQgbm9jYWNoZSk7CitzdGF0aWMgc3RyaW5nIHVwZGF0ZV9kZXBzKHN0cmluZyBzdHIsaW50IGlkKTsKK3N0YXRpYyBpbnQgbm90ZV9maWx0ZXIoaW50IGlkLGludCBmaWx0ZXJzdGF0ZSk7CitzdGF0aWMgaW50IGFlbHRlcl9hbHMoaW50IGlkLGludCB6ZWl0KTsKK3N0YXRpYyBpbnQgKmdldFVucmVzb2x2ZWREZXBzKGludCBpZCk7CitzdGF0aWMgaW50ICpnZXREZXBzKGludCBpZCxpbnQgcmVjKTsKKworI2VuZGlmIC8vIE5FRURfUFJPVE9UWVBFUworCisjZW5kaWYgLy8gX19aRVNTVFJBX01FUktaRVRURUxfSF9fCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvbXVkbGluay5jIGIvb2JqL3Rvb2xzL211ZGxpbmsuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDlkNTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL211ZGxpbmsuYwpAQCAtMCwwICsxLDg0IEBACisvKgorICogbXVkbGluayB0b29sLCBvZmZlcnMgc2V2ZXJhbCBjb21tYW5kcyBhcyBhbiBpbnRlcmZhY2UgdG8gdGhlCisgKiBNVURMSU5LIHN5c3RlbS4KKyAqCisgKiBDb21tYW5kcyBvZmZlcmVkOgorICogcnBlZXJzCisgKiByd2hvIDxyZW1vdGVtdWQ+CisgKiBydGVsbCA8cGxheWVyPkA8cmVtb3RlbXVkPgorICoKKyAqIERlZXB0aG91Z2h0LCAxOS1KYW4tOTMKKyAqLworCisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCitpbmhlcml0ICIvc3RkL3RoaW5nIjsKKworY3JlYXRlKCkgeworICBzdHJpbmcgbmFtZSwgZm9vOworCisgIGlmIChzaXplb2Yob2xkX2V4cGxvZGUob2JqZWN0X25hbWUodGhpc19vYmplY3QoKSksIiMiKSkgIT0gMikgcmV0dXJuOworCisgIHRoaW5nOjpjcmVhdGUoKTsKKyAgU2V0UHJvcCAoUF9TSE9SVCwiYSBNVURMSU5LIHRvb2wiKTsKKyAgU2V0UHJvcCAoUF9MT05HLAorICJUaGlzIHRvb2wgaXMgdXNlZCBmb3IgY29tbXVuaWNhdGluZyB3aXRoIE1VRExJTksuIENvbW1hbmRzIGFyZTpcbiIKKysicnBlZXJzICAgICAgICAgICAgICAgICAgICAgICAgICBHZXQgYSBsaXN0IG9mIG11ZHMgY29ubmVjdGVkIHRvIE1VRExJTktcbiIKKysicndobyA8bXVkPiAgICAgICAgICAgICAgICAgICAgICBTaG93IGEgbGlzdCBvZiBwbGF5ZXJzIG9uIHRoZSByZW1vdGUgbXVkXG4iCisrInJ0ZWxsIDxwbGF5ZXI+QDxtdWQ+IDxtZXNzYWdlPiAgVGVsbCBzb21ldGhpbmcgdG8gYSBwbGF5ZXIgb24gYW5vdGhlciBtdWRcbiIKKyAgICAgICAgICApOworICBBZGRJZCAoInRvb2wiKTsKKyAgQWRkSWQgKCJtdWRsaW5rIik7CisgIEFkZEFkamVjdGl2ZSgibXVkbGluayIpOworICBTZXRJbmZvICgiTXVkbGluayBUb29sIFYwLjEgYnkgRGVlcHRob3VnaHQiKTsKK30KKworX3F1ZXJ5X3JlYWRfbXNnKCkgeyByZXR1cm4gMDsgfQorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyoqIEFkZCBhbmQgZGVjb2RlIG91ciBjb21tYW5kcy4KKyovCisKK2luaXQoKSB7CisgIHRoaW5nOjppbml0KCk7CisgIGFkZF9hY3Rpb24oInJwZWVycyIsInJwZWVycyIpOworICBhZGRfYWN0aW9uKCJyd2hvIiwicndobyIpOworICBhZGRfYWN0aW9uKCJydGVsbCIsInJ0ZWxsIik7Cit9CisKK3JwZWVycygpIHsKKyAgc3RyaW5nIHU7CisgIHUgPSBnZXRldWlkKHRoaXNfcGxheWVyKCkpOworICBpZiAoc3RyaW5ncCh1KSkKKyAgICB0ZWxsX29iamVjdChmaW5kX3BsYXllcigibXVkbGluayIpLCJycGVlcnMgIit1KyJcbiIpOworICByZXR1cm4gMTsKK30KKworcndobyhzdHIpIHsKKyAgc3RyaW5nIHU7CisgIGlmICghc3RyIHx8IHN0ciA9PSAiIikgeworICAgIHdyaXRlKCJVc2FnZTogcndobyA8bXVkPlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKHN0cmluZ3AodSA9IGdldGV1aWQodGhpc19wbGF5ZXIoKSkpKQorICAgIHRlbGxfb2JqZWN0KGZpbmRfcGxheWVyKCJtdWRsaW5rIiksInJ3aG8gIit1KyI9IitzdHIrIlxuIik7CisgIHJldHVybiAxOworfQorCitydGVsbChzdHIpIHsKKyAgc3RyaW5nIHU7CisgIHN0cmluZyBhLCBiLCBjLCBkOworCisgIGlmICghc3RyIHx8IHN0ciA9PSAiIikgeworICAgIHdyaXRlKCJVc2FnZTogcnRlbGwgPHBsYXllcj5APG11ZD4gPG1lc3NhZ2U+XG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoc3NjYW5mKHN0ciwgIiVzQCVzICVzIiwgYSwgYiwgYykgIT0gMykgeworICAgIHdyaXRlKCJVc2FnZTogcnRlbGwgPHBsYXllcj5APG11ZD4gPG1lc3NhZ2U+XG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoc3RyaW5ncCh1ID0gZ2V0ZXVpZCh0aGlzX3BsYXllcigpKSkpCisgICAgdGVsbF9vYmplY3QoZmluZF9wbGF5ZXIoIm11ZGxpbmsiKSwicnBhZ2UgIit1KyJAIithKyJAIitiKyI9IitjKyJcbiIpOworICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL29iai90b29scy9uZXdzdG9vbC5jIGIvb2JqL3Rvb2xzL25ld3N0b29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGU2NzE5NwotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9uZXdzdG9vbC5jCkBAIC0wLDAgKzEsMzM1IEBACitpbmhlcml0ICJzdGQvdGhpbmciOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8Y29uZmlnLmg+CisjaW5jbHVkZSA8bmV3cy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKworI2RlZmluZSBVQSBQTC0+X3VucGFyc2VkX2FyZ3MoKQorCit2b2lkIGNyZWF0ZSgpCit7CisgIHN0cmluZyBzdHI7CisgIGlmICghY2xvbmVwKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9MT05HLCJFaW4gTmV3cy1HcnVwcGVuLVRvb2wuXG5cCitCZWZlaGxlOiBhZGRnICAgICAgPGdybmFtZT4gPG93bmVybmFtZT4gICA6IEdydXBwZSBlcnpldWdlblxuXAorICAgICAgICAgcmVtb3ZlZyAgIDxncm5hbWU+ICAgICAgICAgICAgICAgOiBHcnVwcGUgbG9lc2NoZW5cblwKKyAgICAgICAgIGFkZHcgICAgICA8Z3JuYW1lPiA8dXNlcm5hbWU+ICAgIDogU2NocmVpYmJlcmVjaHRpZ3RlbiBlaW50cmFnZW5cblwKKyAgICAgICAgIHJlbW92ZXcgICA8Z3JuYW1lPiA8dXNlcm5hbWU+ICAgIDogU2NocmVpYmJlcmVjaHRpZ3RlbiBhdXN0cmFnZW5cblwKKyAgICAgICAgIGFkZGQgICAgICA8Z3JuYW1lPiA8dXNlcm5hbWU+ICAgIDogTG9lc2NoYmVyZWNodGlndGVuIGVpbnRyYWdlblxuXAorICAgICAgICAgcmVtb3ZlZCAgIDxncm5hbWU+IDx1c2VybmFtZT4gICAgOiBMb2VzY2hiZXJlY2h0aWd0ZW4gYXVzdHJhZ2VuXG5cCisgICAgICAgICBhZGRyICAgICAgPGdybmFtZT4gPHVzZXJuYW1lPiAgICA6IExlc2ViZXJlY2h0aWd0ZW4gZWludHJhZ2VuXG5cCisgICAgICAgICByZW1vdmVyICAgPGdybmFtZT4gPHVzZXJuYW1lPiAgICA6IExlc2ViZXJlY2h0aWd0ZW4gYXVzdHJhZ2VuXG5cCisgICAgICAgICBnaW5mbyAgICAgPGdybmFtZT4gICAgICAgICAgICAgICA6IEluZm8gdWViZXIgR3J1cHBlIGFiZnJhZ2VuXG5cCisgICAgICAgICBzZXRleHBpcmUgPGdybmFtZT4gPHRhZ2U+ICAgICAgICA6IEV4cGlyZXRpbWUgc2V0emVuXG5cCisgICAgICAgICBzZXRtYXhtc2cgPGdybmFtZT4gPGFuej4gICAgICAgICA6IE1heG1zZyBzZXR6ZW5cblwKKyAgICAgICAgIHNldGcgPGdybmFtZT4gPGxvZXNjaGxldj4gPHNjaHJlaWJsZXY+IDxsZXNlbGV2PiA8bWF4bXNnPiA8ZXhwaXJlPlxuIik7CisgIHN0cj1jYXBpdGFsaXplKCgoc3RyPWdldHVpZCh0aGlzX3BsYXllcigpKSlbPDFdPT0ncyd8fHN0cls8MV09PSd4J3x8CisJCSAgc3RyWzwxXT09J3onKT9zdHIrPSInIjpzdHIrPSJzIik7CisgIFNldFByb3AoUF9TSE9SVCxzdHIrIiBOZXdzVG9vbCIpOworICBTZXRQcm9wKFBfTkFNRSxzdHIrIiBOZXdzVG9vbCIpOworICBTZXRQcm9wKFBfR0VOREVSLE5FVVRFUik7CisgIFNldFByb3AoUF9BUlRJQ0xFLDApOworICBBZGRJZCgibmV3c3Rvb2wiKTsKKyAgQWRkSWQoIm5ld3NncnVwcGVudG9vbCIpOworICBBZGRJZCgibmV3cy1ncnVwcGVuLXRvb2wiKTsKKyAgU2V0UHJvcChQX0FVVE9MT0FET0JKLDEpOworICBTZXRQcm9wKFBfTk9EUk9QLDEpOworfQorCit2b2lkIGluaXQoKQoreworICBhZGRfYWN0aW9uKCJhZGRnIiwiYWRkZyIpOworICBhZGRfYWN0aW9uKCJyZW1vdmVnIiwicmVtb3ZlZyIpOworICBhZGRfYWN0aW9uKCJhZGR3IiwiYWRkdyIpOworICBhZGRfYWN0aW9uKCJyZW1vdmV3IiwicmVtb3ZldyIpOworICBhZGRfYWN0aW9uKCJhZGRkIiwiYWRkZCIpOworICBhZGRfYWN0aW9uKCJyZW1vdmVkIiwicmVtb3ZlZCIpOworICBhZGRfYWN0aW9uKCJhZGRyIiwiYWRkciIpOworICBhZGRfYWN0aW9uKCJyZW1vdmVyIiwicmVtb3ZlciIpOworICBhZGRfYWN0aW9uKCJzZXRnIiwic2V0ZyIpOworICBhZGRfYWN0aW9uKCJzZXRleHBpcmUiLCJzZXRleHBpcmUiKTsKKyAgYWRkX2FjdGlvbigiZXhwaXJlIiwiZXhwaXJlIik7CisgIGFkZF9hY3Rpb24oImdpbmZvIiwiZ2luZm8iKTsKKyAgYWRkX2FjdGlvbigic2V0bWF4bXNnIiwic2V0bWF4bXNnIik7Cit9CisKK2ludCBhZGRyKHN0cmluZyBzdHIpCit7CisgIG1peGVkICphcnI7CisgIHN0cmluZyBzdDEsIHN0MjsKKyAgCisgIGlmICgoc3RyPVVBKT09IiIgfHwgc3NjYW5mKHN0ciwiJXMgJXMiLHN0MSxzdDIpICE9Mil7CisgICAgd3JpdGUoImFkZHIgPGdyb3VwbmFtZT4gPHVzZXJuYW1lPlxuQW5zY2hsaWVzc2VuZCBkYXJmIGRlciBVc2VyIHVuYWJoYWVuZ2lnIHZvbSBXaXpsZXZlbCBkaWUgR3J1cHBlIGxlc2VuLlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgCisgIGFycj1vbGRfZXhwbG9kZShzdDIsIiAiKS0oeyIifSk7CisgIHN3aXRjaCAoIi9zZWN1cmUvbmV3cyItPkFkZEFsbG93ZWQoc3QxLCh7fSksKHt9KSxhcnIpKXsKKyAgICBjYXNlIDA6IHdyaXRlKCJQYXJhbSBlcnJcbiIpOyBicmVhazsKKyAgICBjYXNlIDE6IHdyaXRlKCJPay5cbiIpOyBicmVhazsKKyAgICBjYXNlIC0xOiB3cml0ZSgiTm8gcGVybWlzc2lvblxuIik7IGJyZWFrOworICAgIGNhc2UgLTI6IHdyaXRlKCJObyBzdWNoIGJvYXJkXG4iKTsgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCByZW1vdmVyKHN0cmluZyBzdHIpCit7CisgIG1peGVkICphcnI7CisgIHN0cmluZyBzdDEsIHN0MjsKKworICBpZiAoIShzdHI9VUEpIHx8IHNzY2FuZihzdHIsIiVzICVzIixzdDEsc3QyKSAhPTIpeworICAgIHdyaXRlKCJyZW1vdmVyIDxncnVwcGVubmFtZT4gPHVzZXJuYW1lPlxuRGFuYWNoIGRhcmYgZGVyIFVzZXIgZGllIEdydXBwZSBudXIgbm9jaCBsZXNlbiwgd2VubiBzZWluIFdpemxldmVsIGRpZXMgZXJsYXVidC5cbiIpOworICAgIHJldHVybiAxOworICB9CisKKyAgYXJyPW9sZF9leHBsb2RlKHN0MiwiICIpLSh7IiJ9KTsKKyAgc3dpdGNoICgiL3NlY3VyZS9uZXdzIi0+UmVtb3ZlQWxsb3dlZChzdDEsKHt9KSwoe30pLGFycikpeworICAgIGNhc2UgMDogd3JpdGUoIlBhcmFtIGVyclxuIik7IGJyZWFrOworICAgIGNhc2UgMTogd3JpdGUoIk9rLlxuIik7IGJyZWFrOworICAgIGNhc2UgLTE6IHdyaXRlKCJObyBwZXJtaXNzaW9uXG4iKTsgYnJlYWs7CisgICAgY2FzZSAtMjogd3JpdGUoIk5vIHN1Y2ggYm9hcmRcbiIpOyBicmVhazsKKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IGFkZGQoc3RyaW5nIHN0cikKK3sKKyAgbWl4ZWQgKmFycjsKKyAgc3RyaW5nIHN0MSwgc3QyOworCisgIGlmICghKHN0cj1VQSkgfHwgc3NjYW5mKHN0ciwiJXMgJXMiLHN0MSxzdDIpICE9Mil7CisgICAgd3JpdGUoImFkZGQgPGdydXBwZT4gPHVzZXI+XG5Vc2VyIGRhcmYgQXJ0aWtlbCBsb2VzY2hlbiAodW5hYmggdm9tIFdpemxldmVsKVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBhcnI9b2xkX2V4cGxvZGUoc3QyLCIgIiktKHsiIn0pOworICAJc3dpdGNoICgiL3NlY3VyZS9uZXdzIi0+QWRkQWxsb3dlZChzdDEsYXJyLCh7fSksKHt9KSkpeworICAgIGNhc2UgMDogd3JpdGUoIlBhcmFtIGVyclxuIik7IGJyZWFrOworICAgIGNhc2UgMTogd3JpdGUoIk9rLlxuIik7IGJyZWFrOworICAgIGNhc2UgLTE6IHdyaXRlKCJObyBwZXJtaXNzaW9uXG4iKTsgYnJlYWs7CisgICAgY2FzZSAtMjogd3JpdGUoIk5vIHN1Y2ggYm9hcmRcbiIpOyBicmVhazsKKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IHJlbW92ZWQoc3RyaW5nIHN0cikKK3sKKyAgbWl4ZWQgKmFycjsKKyAgc3RyaW5nIHN0MSwgc3QyOworCisgIGlmICghKHN0cj1VQSkgfHwgc3NjYW5mKHN0ciwiJXMgJXMiLHN0MSxzdDIpICE9Mil7CisgICAgd3JpdGUoInJlbW92ZWQgPGdydXBwZT4gPHVzZXI+XG5Vc2VyIGRhcmYgbnVyIG5vY2ggQXJ0aWtlbCBsb2VzY2hlbiwgd2VubiBzZWluIFdpemxldmVsIGRhcyBlcmxhdWJ0LlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBhcnI9b2xkX2V4cGxvZGUoc3QyLCIgIiktKHsiIn0pOworICBzd2l0Y2ggKCIvc2VjdXJlL25ld3MiLT5SZW1vdmVBbGxvd2VkKHN0MSxhcnIsKHt9KSwoe30pKSl7CisgICAgY2FzZSAwOiB3cml0ZSgiUGFyYW0gZXJyXG4iKTsgYnJlYWs7CisgICAgY2FzZSAxOiB3cml0ZSgiT2suXG4iKTsgYnJlYWs7CisgICAgY2FzZSAtMTogd3JpdGUoIk5vIHBlcm1pc3Npb25cbiIpOyBicmVhazsKKyAgICBjYXNlIC0yOiB3cml0ZSgiTm8gc3VjaCBib2FyZFxuIik7IGJyZWFrOworICB9CisgIHJldHVybiAxOworfQorCitpbnQgYWRkdyhzdHJpbmcgc3RyKQoreworICBtaXhlZCAqYXJyOworICBzdHJpbmcgc3QxLCBzdDI7CisKKyAgaWYgKCEoc3RyPVVBKSB8fCBzc2NhbmYoc3RyLCIlcyAlcyIsc3QxLHN0MikgIT0yKXsKKyAgICB3cml0ZSgiYWRkdyA8Z3J1cHBlPiA8dXNlcj5cblVzZXIgZGFyZiBBcnRpa2VsIHNjaHJlaWJlbiAodW5hYmggdm9tIFdpemxldmVsKVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBhcnI9b2xkX2V4cGxvZGUoc3QyLCIgIiktKHsiIn0pOworICBzd2l0Y2ggKCIvc2VjdXJlL25ld3MiLT5BZGRBbGxvd2VkKHN0MSwoe30pLGFyciwoe30pKSl7CisgICAgY2FzZSAwOiB3cml0ZSgiUGFyYW0gZXJyXG4iKTsgYnJlYWs7CisgICAgY2FzZSAxOiB3cml0ZSgiT2suXG4iKTsgYnJlYWs7CisgICAgY2FzZSAtMTogd3JpdGUoIk5vIHBlcm1pc3Npb25cbiIpOyBicmVhazsKKyAgICBjYXNlIC0yOiB3cml0ZSgiTm8gc3VjaCBib2FyZFxuIik7IGJyZWFrOworICB9CisgIHJldHVybiAxOworfQorCitpbnQgcmVtb3ZldyhzdHJpbmcgc3RyKQoreworICBtaXhlZCAqYXJyOworICBzdHJpbmcgc3QxLCBzdDI7CisKKyAgaWYgKCEoc3RyPVVBKSB8fCBzc2NhbmYoc3RyLCIlcyAlcyIsc3QxLHN0MikgIT0yKXsKKyAgICB3cml0ZSgicmVtb3ZldyA8Z3J1cHBlPiA8dXNlcj5cblVzZXIgZGFyZiBudXIgbm9jaCBBcnRpa2VsIHNjaHJlaWJlbiwgd2VubiBzZWluIFdpemxldmVsIGRpZXMgZXJsYXVidC5cbiIpOworICAgIHJldHVybiAxOworICB9CisKKyAgYXJyPW9sZF9leHBsb2RlKHN0MiwiICIpLSh7IiJ9KTsKKyAgc3dpdGNoICgiL3NlY3VyZS9uZXdzIi0+UmVtb3ZlQWxsb3dlZChzdDEsKHt9KSxhcnIsKHt9KSkpeworICAgIGNhc2UgMDogd3JpdGUoIlBhcmFtIGVyclxuIik7IGJyZWFrOworICAgIGNhc2UgMTogd3JpdGUoIk9rLlxuIik7IGJyZWFrOworICAgIGNhc2UgLTE6IHdyaXRlKCJObyBwZXJtaXNzaW9uXG4iKTsgYnJlYWs7CisgICAgY2FzZSAtMjogd3JpdGUoIk5vIHN1Y2ggYm9hcmRcbiIpOyBicmVhazsKKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IHNldGcoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIG5hbWU7CisgIGludCBkbGV2ZWwsIHdsZXZlbCwgcmxldmVsLCBtYXhtZXNzYWdlcywgZXhwaXJlOworCisgIGlmICghKHN0cj1VQSkgfHwKKyAgICAgIHNzY2FuZihzdHIsIiVzICVkICVkICVkICVkICVkIixuYW1lLGRsZXZlbCx3bGV2ZWwscmxldmVsLG1heG1lc3NhZ2VzLGV4cGlyZSkgIT0gNikgeworICAgIHdyaXRlKCJzZXRnIDxncnVwcGU+IDxsb2VzY2hsZXZlbD4gPHNjaHJlaWJsZXZlbD4gPGxlc2VsZXZlbD4gPG1heG1lc3NhZ2VzPiA8ZXhwaXJlPlxuR3J1cHBlbnBhcmFtZXRlciBzZXR6ZW4sIEJlZGV1dHVuZyAoRGVmYXVsdHdlcnRlIGluIEtsYW1tZXJuKTpcblwKKyAgICBuYW1lICAgICAgICAgICAgICA6IERlciBOYW1lIGRlciBOZXdzZ3JvdXBcblwKKyAgICBsb2VzY2hsZXZlbCAgKDIwKSA6IFdpemxldmVsLCBhYiBkZW0gVXNlciBBcnRpa2VsIGxvZXNjaGVuIGtvZW5uZW5cblwKKyAgICBzY2hyZWlibGV2ZWwgKCAwKSA6IFdpemxldmVsLCBhYiBkZW0gVXNlciBBcnRpa2VsIHNjaHJlaWJlbiBrb2VubmVuXG5cCisgICAgbGVzZWxldmVsICAgICggMCkgOiBXaXpsZXZlbCwgYWIgZGVtIFVzZXIgQXJ0aWtlbCBsZXNlbiBrb2VubmVuXG5cCisgICAgbWF4bWVzc2FnZXMgICg0MCkgOiBNYXhpbWFsZSBBbnphaGwgQXJ0aWtlbCBpbiBlaW5lciBOZXdzZ3J1cHBlXG5cCisgICAgZXhwaXJlICAgICAgICgtMSkgOiBFeHBpcmV0aW1lIGluIFRhZ2VuLCAtMSA9IG5pZVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZXhwaXJlPTg2NDAwKmV4cGlyZTsKKyAgc3dpdGNoKCIvc2VjdXJlL25ld3MiLT5TZXRHcm91cChuYW1lLCBkbGV2ZWwsIHdsZXZlbCwgcmxldmVsLCBtYXhtZXNzYWdlcyxleHBpcmUpKXsKKyAgICBjYXNlIDE6IHdyaXRlKCJPa1xuIik7IGJyZWFrOworICAgIGNhc2UgMDogd3JpdGUoIlBhcmFtIGVycm9yLlxuIik7IGJyZWFrOworICAgIGNhc2UgLTE6IHdyaXRlKCJObyBwZXJtaXNzaW9uXG4iKTsgYnJlYWs7CisgICAgY2FzZSAtMjogd3JpdGUoIk5vIHN1Y2ggZ3JvdXBcbiIpOyBicmVhazsKKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IHNldGV4cGlyZShzdHJpbmcgc3RyKQoreworICBzdHJpbmcgbmFtZTsKKyAgaW50IGV4cGlyZTsKKyAgbWl4ZWQgKmdyOworCisgIGlmICghKHN0cj1VQSl8fHNzY2FuZihzdHIsIiVzICVkIixuYW1lLGV4cGlyZSkhPTIpCisgIHsKKyAgICB3cml0ZSgic2V0ZXhwaXJlIDxncnVwcGU+IDx0YWdlPlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgZXhwaXJlPTg2NDAwKmV4cGlyZTsKKyAgaWYgKCFwb2ludGVycCgoZ3I9Ii9zZWN1cmUvbmV3cyItPkdldEdyb3VwKG5hbWUpKSkpCisgIHsKKyAgICB3cml0ZSgiR2V0IGdyb3VwIGVycm9yXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBzd2l0Y2goIi9zZWN1cmUvbmV3cyItPlNldEdyb3VwKG5hbWUsIGdyW0dfRExFVkVMXSwgZ3JbR19XTEVWRUxdLCBncltHX1JMRVZFTF0sIGdyW0dfTUFYX01TR10sZXhwaXJlKSl7CisgICAgY2FzZSAxOiB3cml0ZSgiT2tcbiIpOyBicmVhazsKKyAgICBjYXNlIDA6IHdyaXRlKCJQYXJhbSBlcnJvci5cbiIpOyBicmVhazsKKyAgICBjYXNlIC0xOiB3cml0ZSgiTm8gcGVybWlzc2lvblxuIik7IGJyZWFrOworICAgIGNhc2UgLTI6IHdyaXRlKCJObyBzdWNoIGdyb3VwXG4iKTsgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBzZXRtYXhtc2coc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIG5hbWU7CisgIGludCBtYXhtc2c7CisgIG1peGVkICpncjsKKyAgCisgIGlmICghKHN0cj1VQSl8fHNzY2FuZihzdHIsIiVzICVkIixuYW1lLG1heG1zZykhPTIpCisgIHsKKyAgICB3cml0ZSgic2V0ZXhwaXJlIDxncnVwcGU+IDx0YWdlPlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKCFwb2ludGVycCgoZ3I9Ii9zZWN1cmUvbmV3cyItPkdldEdyb3VwKG5hbWUpKSkpCisgIHsKKyAgICB3cml0ZSgiR2V0IGdyb3VwIGVycm9yXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBzd2l0Y2goIi9zZWN1cmUvbmV3cyItPlNldEdyb3VwKG5hbWUsIGdyW0dfRExFVkVMXSwgZ3JbR19XTEVWRUxdLCBncltHX1JMRVZFTF0sIG1heG1zZywgZ3JbR19FWFBJUkVdKSl7CisgICAgY2FzZSAxOiB3cml0ZSgiT2tcbiIpOyBicmVhazsKKyAgICBjYXNlIDA6IHdyaXRlKCJQYXJhbSBlcnJvci5cbiIpOyBicmVhazsKKyAgICBjYXNlIC0xOiB3cml0ZSgiTm8gcGVybWlzc2lvblxuIik7IGJyZWFrOworICAgIGNhc2UgLTI6IHdyaXRlKCJObyBzdWNoIGdyb3VwXG4iKTsgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBnaW5mbyhzdHJpbmcgc3RyKQoreworICBtaXhlZCAqZ3I7CisgIGludCBpOworICAKKyAgaWYgKCEoc3RyPVVBKSkKKyAgeworICAgIHdyaXRlKCJVc2FnZTogZ2luZm8gPGduYW1lPlxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKCFwb2ludGVycCgoZ3I9Ii9zZWN1cmUvbmV3cyItPkdldEdyb3VwKHN0cikpKSkKKyAgeworICAgIHdyaXRlKCJHZXQgZ3JvdXAgZXJyb3JcbiIpOworICAgIHJldHVybiAxOworICB9CisgIGlmIChnclsxMV09PS0xKQorICB7CisgICAgd3JpdGUoIkdyb3VwIFwiIitnclswXSsiXCIgZG9lcyBub3QgZXhpc3QuXG4iKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICAgICAgICAvLyAgICAgICAgIDEgICAgICAgICAyICAgICAgICAgMyAgICAgICAgIDQgICAgICAgICA1ICAgICAgICAgNiAgICAgICAgIDcgCisgICAgICAgIC8vMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4CisgIHByaW50ZigiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKKyAgCisgIHByaW50ZigiUnVicmlrICA6ICVzICglcykgU2F2ZWZpbGU6ICVzXG5cbiIsZ3JbMF0sY2FwaXRhbGl6ZShnclsxXSksZ3JbMl0pOworICBwcmludGYoIk1lc3NhZ2VzOiAlaS8laSAgICBFeHBpcmU6ICVpIFRhZ2UuXG5cbiIsCisJCSAgKHBvaW50ZXJwKGdyWzExXSk/c2l6ZW9mKGdyWzExXSk6MCksZ3JbMTBdLGdyWzNdLzg2NDAwKTsgIAorICAKKyAgcHJpbnRmKCBicmVha19zdHJpbmcoKHNpemVvZihncls2XSk/IigiKyhDb3VudFVwKG1hcChncls2XSwjJ2NhcGl0YWxpemUpKSkrIikiOiIgIiksIDc4LCAiUmVhZGVycyA6ICIrZ3JbOV0rIiAiLDE2KSk7CisgIAorICBwcmludGYoIGJyZWFrX3N0cmluZygoc2l6ZW9mKGdyWzVdKT8iKCIrKENvdW50VXAobWFwKGdyWzVdLCMnY2FwaXRhbGl6ZSkpKSsiKSI6IiAiKSwgNzgsICJXcml0ZXJzIDogIitncls4XSsiICIsMTYpKTsKKyAgCisgIHByaW50ZiggYnJlYWtfc3RyaW5nKChzaXplb2YoZ3JbNF0pPyIoIisoQ291bnRVcChtYXAoZ3JbNF0sIydjYXBpdGFsaXplKSkpKyIpIjoiICIpLCA3OCwgIkRlbGV0ZXJzOiAiK2dyWzddKyIgIiwxNikpOworICAKKyAgcHJpbnRmKCItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOworICByZXR1cm4gMTsKK30KKyAgICAKK2ludCByZW1vdmVnKHN0cmluZyBzdHIpCit7CisgIGlmICghKHN0cj1VQSkpCisgIHsKKyAgICB3cml0ZSgicmVtb3ZlZyA8Z3J1cHBlbm5hbWU+XG5HcnVwcGUgTE9FU0NIRU4uXG4iKTsKKyAgICByZXR1cm4gMDsKKyAgfQorICBzd2l0Y2goIi9zZWN1cmUvbmV3cyItPlJlbW92ZUdyb3VwKHN0cikpeworICAgIGNhc2UgMTogd3JpdGUoIk9rLiBCaXR0ZSBuaWNodCB2ZXJnZXNzZW4sIGRhcyBTYXZlZmlsZSBkZXIgTmV3c2dyb3VwIHZvbiBIYW5kIHp1IGVudGZlcm5lbiAhXG4iKTsgYnJlYWs7CisgICAgY2FzZSAwOiB3cml0ZSgiUGFyYW0gZXJyb3IuXG4iKTsgYnJlYWs7CisgICAgY2FzZSAtMTogd3JpdGUoIk5vIHBlcm1pc3Npb25cbiIpOyBicmVhazsKKyAgICBjYXNlIC0yOiB3cml0ZSgiTm8gc3VjaCBncm91cCIpOyBicmVhazsKKyAgfQorICByZXR1cm4gMTsKK30KKworaW50IGFkZGcoc3RyaW5nIHN0cikKK3sKKyAgc3RyaW5nIG5hbWUsIG93bmVyOworCisgIGlmICghKHN0cj1VQSkgfHwgc3NjYW5mKHN0ciwiJXMgJXMiLG5hbWUsb3duZXIpIT0yKQorICB7CisgICAgd3JpdGUoImFkZGcgPGdydXBwZT4gPHVzZXI+XG5HcnVwcGUgYW5sZWdlbiwgPHVzZXI+IHdpcmQgQmVzaXR6ZXIgZGVyIEdydXBwZVxuIik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgc3dpdGNoICgic2VjdXJlL25ld3MiLT5BZGRHcm91cChuYW1lLCBvd25lcikpeworICAgIGNhc2UgMTogd3JpdGUoIk9rLlxuIik7IGJyZWFrOworICAgIGNhc2UgMDogd3JpdGUoIlBhcmFtIGVycm9yLlxuIik7IGJyZWFrOworICAgIGNhc2UgLTE6IHdyaXRlKCJObyBwZXJtaXNzaW9uLlxuIik7IGJyZWFrOworICAgIGNhc2UgLTI6IHdyaXRlKCJHcm91cCBhbHJlYWR5IHRoZXJlXG4iKTsgYnJlYWs7CisgICAgY2FzZSAtMzogd3JpdGUoIk93bmVyIG5vdCBmb3VuZC5cbiIpOyBicmVhazsKKyAgICBjYXNlIC00OiB3cml0ZSgiU2F2ZWZpbGUgYWxyZWFkeSBpbiB1c2UuXG4iKTsgYnJlYWs7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisgIAoraW50IGV4cGlyZSgpCit7CisgICIvc2VjdXJlL25ld3MiLT5leHBpcmVfYWxsKCk7CisgIHdyaXRlKCJFeHBpcmluZyBzdGFydGV0LlxuIik7CisgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3BsYW50dG9vbC5jIGIvb2JqL3Rvb2xzL3BsYW50dG9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0MGNjYjkKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvcGxhbnR0b29sLmMKQEAgLTAsMCArMSw0MSBAQAoraW5oZXJpdCAiL3N0ZC9zZWN1cmVfdGhpbmciOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2RlZmluZSBQTEFOVE1BU1RFUiAiL3NlY3VyZS9rcmF1dG1hc3RlciIKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkgCit7CisgICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgCisgICAgIHJldHVybjsKKyAgIDo6Y3JlYXRlKCk7CisgICAKKyAgIFNldFByb3AoUF9TSE9SVCwgIkRhcyBLcmFldXRlcnRvb2wiKTsKKyAgIFNldChQX0xPTkcsIGZ1bmN0aW9uIHN0cmluZyAoKSB7IHJldHVybiAKKyAgICAgIkRhcyBLcmFldXRlcnRvb2wgaGF0IGZvbGdlbmRlIEJlZmVobGU6XG4iCisgICAgKyItIHNob3dwbGFudCBba2F0ZWdvcmllXSAobGlzdGV0IGFsbGUgUGZsYW56ZW4gZWluZXIgS2F0ZWdvcmllIGF1Zi4pXG4iCisgICAgKyhJU19BUkNIKHRoaXNfcGxheWVyKCkpPworICAgICJGb2xnZW5kZSBCZWZlaGxlIHNpbmQgbnVyIGZ1ZXIgRU0rIHZlcmZ1ZWdiYXI6XG4iCisgICAgKyItIHNob3dyb29tcyBbSUR8YWxsXSAoTGlzdGV0IGFsbGUgUmFldW1lIGF1ZiwgaW4gZGVuZW4gZGFzIEtyYXV0IDxJRD5cbiIKKyAgICArIiAgenUgZmluZGVuIGlzdCwgb2RlciBhbGxlIFJhZXVtZSwgaW4gZGVuZW4gZWluIEtyYXV0IHdhZWNoc3QuKVxuIgorICAgICsiLSByZWZyZXNoICh1cGRhdGV0IGFsbGUgRmlsZXMpLlxuIgorICAgICsiLSBhZGRyb29tIDxwbGFudElkPiA8bG9hZG5hbWU+ICh0cmFlZ3QgZWluZW4gbmV1ZW4gRnVuZG9ydCBlaW4pLlxuIgorICAgICsiLSBkZWxyb29tIDxsb2FkbmFtZT4gKGxvZXNjaHQgYWxsZSBLcmFldXRlciBmdWVyIGVpbmVuIEZ1bmRvcnQpLlxuIgorICAgICsiLSBjcmVhdGVmaWxlIDxwbGFudElkPiAoZXJ6ZXVndCBkYXMgS3JhdXQgYWxzIEZpbGUpLlxuIgorICAgICsiLSBjbG9uZXBsYW50IDxwbGFudElkfHBsYW50RmlsZT4gKGNsb250IGRhcyBLcmF1dCBpbnYgSW52KS5cbiI6CisgICAgIiIpO30sIEZfUVVFUllfTUVUSE9EKTsKKyAgIFNldFByb3AoUF9OQU1FLCAiUGxhbnR0b29sIik7CisgICBTZXRQcm9wKFBfR0VOREVSLCBORVVURVIpOworICAgU2V0UHJvcChQX0FVVE9MT0FET0JKLCAxKTsKKyAgIFNldFByb3AoUF9OT0RST1AsIDEpOworICAgU2V0UHJvcChQX05FVkVSRFJPUCwgMSk7CisgICBBZGRJZCgoeyJ0b29sIiwgImtyYWV1dGVydG9vbCIsICJwbGFudHRvb2wifSkpOworICAgQWRkQ21kKCh7ImNsb25lcGxhbnQiLCAic2hvd3BsYW50IiwgInNob3dyb29tcyIsICJyZWZyZXNoIiwKKyAgICAgICAgICAgICJhZGRyb29tIiwgImRlbHJvb20iLCAiY3JlYXRlZmlsZSJ9KSwgIl9wbGFudG1hc3RlciIpOworfQorCitzdGF0aWMgaW50IF9wbGFudG1hc3RlcihzdHJpbmcgc3RyKQoreworICAgbm90aWZ5X2ZhaWwoIlVua25vd24gRnVuY3Rpb24gaW4gcGxhbnRtYXN0ZXI6IF8iK3F1ZXJ5X3ZlcmIoKSsiKClcbiIpOworICAgcmV0dXJuIGNhbGxfb3RoZXIoUExBTlRNQVNURVIsICJfIitxdWVyeV92ZXJiKCksIHN0cik7Cit9CmRpZmYgLS1naXQgYS9vYmovdG9vbHMvcHJvamVrdHRvb2wuYyBiL29iai90b29scy9wcm9qZWt0dG9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2MWE5ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvcHJvamVrdHRvb2wuYwpAQCAtMCwwICsxLDIxMiBAQAorLy8KKy8vIFByb2plY3R0b29sCisvLworCisjaW5jbHVkZSAiL3Avc2VydmljZS9tYW5kcmFnb24vcHJvamVrdGJyZXR0L3Byb2plY3RtYXN0ZXIuaCIKKyNpbmNsdWRlICIvc2VjdXJlL3dpemxldmVscy5oIgorI2luY2x1ZGUgPG1vdmluZy5oPgorCitpbmhlcml0ICIvc3RkL3RoaW5nIjsKK3N0cmluZyBoaWxmZTsKK3N0YXRpYyBpbnQgY2hhbmdldGltZTsKK3N0YXRpYyBpbnQgc3VwcHJlc3NpbmZvczsKKwordm9pZCBjcmVhdGUoKQoreworCWlmICghSVNfQ0xPTkUoVE8pKSByZXR1cm47CisJOjpjcmVhdGUoKTsKKwlpZiAoIWZpbmRfb2JqZWN0KFBST0pFQ1RNQVNURVIpKSBjYWxsX290aGVyKFBST0pFQ1RNQVNURVIsIj8/PyIpOworICAgICAgICAKKwlTZXRQcm9wKFBfTkFNRSwiU2NocmVpYmZlZGVyIik7CisJU2V0UHJvcChQX05PRFJPUCwiRHUgbW9lY2h0ZXN0IERlaW5lIEZlZGVyIGRhbm4gZG9jaCBsaWViZXIgYmVoYWx0ZW4uXG4iKTsKKwlTZXRQcm9wKFBfTkVWRVJEUk9QLDEpOworCVNldFByb3AoUF9HRU5ERVIsRkVNQUxFKTsKKwlTZXRQcm9wKFBfU0hPUlQsIkVpbmUga2xlaW5lIG1hZ2lzY2hlIFNjaHJlaWJmZWRlciIpOworICAgICAgICBpZiAoIWNoYW5nZXRpbWUpIGNoYW5nZXRpbWU9MTsKKyAgICAgICAgaGlsZmU9QlMoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCisgICAgICAgICAgICAgICAgICJEaWVzZSBGZWRlciBlcm1vZWdsaWNodCBlcyBEaXIgbmljaHQgbnVyLCB2b24gdWViZXJhbGwgaGVyIGF1ZiBkaWUgIgorICAgICAgICAgICAgICAgICAiYWxsc2VpdHMgYmVsaWVidGVuIFNjaHdhcnplbiBCcmV0dGVyIGZ1ZXIgUHJvamVrdGUgenV6dWdyZWlmZW4sICIKKyAgICAgICAgICAgICAgICAgInNvbmRlcm4gZXJtb2VnbGljaHQgZXMgRGlyIGF1Y2gsIHNlbGJlciBQcm9qZWt0ZSBkb3J0IHp1ICIKKyAgICAgICAgICAgICAgICAgInZlcm9lZmZlbnRsaWNoZW4uXG4iCisgICAgICAgICAgICAgICAgICJGb2xnZW5kZSBLb21tYW5kb3Mga29lbm5lbiBEaXIgZGFiZWkgaGVsZmVuOlxuXG4iCisgICAgICAgICAgICAgICAgICJmZWRlcmhpbGZlICAgICAgICAgICAgICAtIERpZXNlIFVlYmVyc2ljaHRcbiIKKyAgICAgICAgICAgICAgICAgImZlZGVyZG9rdSAgICAgICAgICAgICAgIC0gRG9rdW1lbnRhdGlvbiBhbGxlciBCZWZlaGxlXG4iCisgICAgICAgICAgICAgICAgICJwcm9qZWt0aGlsZmUgICAgICAgICAgICAtIFVlYmVyc2ljaHQgdWViZXIgZGllIEJyZXR0YmVmZWhsZVxuIgorICAgICAgICAgICAgICAgICAiQWRkUHJvamVjdCAgICAgICAgICAgICAgLSBQcm9qZWt0IGFubGVnZW5cbiIKKyAgICAgICAgICAgICAgICAgIlJlbW92ZVByb2plY3QgPE51bW1lcj4gIC0gUHJvamVrdCBlbnRmZXJuZW5cbiIKKyAgICAgICAgICAgICAgICAgIk1vZGlmeVByb2plY3QgPE51bW1lcj4gIC0gUHJvamVrdCBhZW5kZXJuXG4iCisgICAgICAgICAgICAgICAgICJwcm9qZWt0aW5mb3MgZWlufGFufGF1cyAtIEFlbmRlcnVuZ2VuIChuaWNodCBtZWhyKSBhbnplaWdlblxuXG4iCisgICAgICAgICAgICAgICAgICJCZWkgRnJhZ2VuLCBCdWdzIHVuZC9vZGVyIFR5cG9zIHdlbmRlIERpY2ggYml0dGUgdmVydHJhdWVuc3ZvbGwgYW4gZGVuXG4iCisgICAgICAgICAgICAgICAgICJNYW5kcmFnb24gRGVpbmVyIFdhaGwuXG4iCisgICAgICAgICAgICAgICAgICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKwlTZXRQcm9wKFBfTE9ORywKKwkJQlMoIkRpZXNlIGtsZWluZSwgd2Vpc3NlLCBtYWdpc2NoIGdsYWVuemVuZGUgRmVkZXIgbGllZ3Qgc2FuZnQgIiArCisJICAgICAgICAgICAiaW4gRGVpbmVyIEhhbmQuIER1IHNwdWVyc3QgZm9lcm1saWNoLCB3aWUgc2llIGRhbmFjaCBkcmluZ3QsICIgKworCQkgICAiTmV1ZXMgenUgc2NoYWZmZW4gdW5kIGRpZSBXZWx0IHp1IHZlcmdyb2Vzc2Vybi5cblxuIikraGlsZmUpOworICAgICAgICBBZGRJZCgoeyJzY2hyZWliZmVkZXIiLCJmZWRlciIsInByb2pla3R0b29sIn0pKTsKKwlBZGRDbWQoImZlZGVyaGlsZmUiLCJoaWxmZV9mdW4iKTsKKwlBZGRDbWQoInByb2pla3RoaWxmZSIsImJvYXJkX2hlbHAiKTsKKwlBZGRDbWQoInByb2pla3RsaXN0ZSIsImJvYXJkX2xpc3QiKTsKKyAgICAgICAgQWRkQ21kKCJmZWRlcmRva3UiLCJkb2t1X2Z1biIpOworCUFkZENtZCgoeyJwcm9qZWt0ZGV0YWlsIiwicHJvamVrdGRldGFpbHMifSksImJvYXJkX2xvbmciKTsKKwlBZGRDbWQoKHsiYWRkcHJvamVjdCIsIkFkZFByb2plY3QiLCJhcCJ9KSwiYWRkcHJval9mdW4iKTsKKwlBZGRDbWQoKHsicmVtb3ZlcHJvamVjdCIsIlJlbW92ZVByb2plY3QiLCJycCJ9KSwicmVtcHJval9mdW4iKTsKKwlBZGRDbWQoKHsibW9kaWZ5cHJvamVjdCIsIk1vZGlmeVByb2plY3QiLCJtcCJ9KSwibW9kcHJval9mdW4iKTsKKyAgICAgICAgQWRkQ21kKCJwcm9qZWt0aW5mb3MiLCJ3YXRjaF9mdW4iKTsKKwlUTy0+bW92ZShUUCxNX05PQ0hFQ0spOworCXJldHVybjsKK30KKwordm9pZCBfc2V0X2F1dG9sb2Fkb2JqKG1peGVkIHZhbCkKK3sKKyAgaWYgKGludHAodmFsKSkgY2hhbmdldGltZT10aW1lKCk7CisgIGVsc2UgaWYgKHBvaW50ZXJwKHZhbCkmJnNpemVvZih2YWwpPT0yKQorICB7CisgICAgY2hhbmdldGltZT12YWxbMF07CisgICAgc3VwcHJlc3NpbmZvcz12YWxbMV07CisgIH0KKyAgcmV0dXJuOworfQorCitpbnQgKl9xdWVyeV9hdXRvbG9hZG9iaigpIHsgcmV0dXJuICh7IGNoYW5nZXRpbWUsIHN1cHByZXNzaW5mb3MgfSk7IH0KKworaW50IGRva3VfZnVuKHN0cmluZyBhcmcpCit7CisgIFRQLT5Nb3JlKFBST0pFQ1RET0tVLDEpOworICByZXR1cm4gMTsKK30KKworaW50IGJvYXJkX2hlbHAoc3RyaW5nIGFyZykKK3sKKyAgUFJPSkVDVE1BU1RFUi0+Qm9hcmRIZWxwKCk7CisgIHJldHVybiAxOworfQorCitpbnQgYm9hcmRfbGlzdChzdHJpbmcgYXJnKQoreworICBhcmc9VFAtPl91bnBhcnNlZF9hcmdzKDEpOworICBpZiAoIXNpemVvZihhcmcpKSAoUFJPSkVDVE1BU1RFUiktPlNob3dMaXN0KCk7CisgIGVsc2UgUFJPSkVDVE1BU1RFUi0+UGFyc2VBcmdzKGFyZyk7CisgIGNoYW5nZXRpbWU9dGltZSgpOworICByZXR1cm4gMTsKK30KKworaW50IGJvYXJkX2xvbmcoc3RyaW5nIGFyZykKK3sKKyAgaW50IG51bWJlcjsKKyAgYXJnPVRQLT5fdW5wYXJzZWRfYXJncygxKTsKKyAgbm90aWZ5X2ZhaWwoIlN5bnRheDogcHJvamVrdGRldGFpbCA8UFJPSkVLVE5VTU1FUj5cbiIpOworICBpZiAoIXNpemVvZihhcmcpKSByZXR1cm4gMDsKKyAgaWYgKCEobnVtYmVyPXRvX2ludChhcmcpKXx8KGFyZyE9dG9fc3RyaW5nKG51bWJlcikpKSByZXR1cm4gMDsKKyAgbm90aWZ5X2ZhaWwoIlByb2pla3RudW1tZXJuIGtvZW5uZW4gbnVyIFphaGxlbiBncm9lc3NlciBOdWxsIHNlaW4uXG4iKTsKKyAgaWYgKG51bWJlcjwxKSByZXR1cm4gMDsKKyAgUFJPSkVDVE1BU1RFUi0+U2hvd0xvbmcobnVtYmVyKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBoaWxmZV9mdW4oc3RyaW5nIGFyZykKK3sKKyAgdGVsbF9vYmplY3QoVFAsaGlsZmUpOworICByZXR1cm4gMTsKK30KKworaW50IGJvYXJkX2Z1bihzdHJpbmcgYXJnKQoreworICBQUk9KRUNUTUFTVEVSLT5QYXJzZUFyZ3MoVFAtPl91bnBhcnNlZF9hcmdzKDEpKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBhZGRwcm9qX2Z1bihzdHJpbmcgYXJnKQoreworICBpZiAoIUlTX0xFQVJORVIoVFApKQorICB7CisgICAgdGVsbF9vYmplY3QoVFAsIldpZSBiaXN0IERVIGRlbm4gYW4gZGllIEZlZGVyIGdla29tbWVuP1xuIik7CisgICAgVE8tPnJlbW92ZSgpOworICAgIHJldHVybiAxOworICB9CisgIFBST0pFQ1RNQVNURVItPkNoYW5nZURhdGEoMCk7CisgIHJldHVybiAxOworfQorCitpbnQgcmVtcHJval9mdW4oc3RyaW5nIGFyZykKK3sKKyAgaWYgKCFJU19MRUFSTkVSKFRQKSkKKyAgeworICAgIHRlbGxfb2JqZWN0KFRQLCJXaWUgYmlzdCBEVSBkZW5uIGFuIGRpZSBGZWRlciBnZWtvbW1lbj9cbiIpOworICAgIFRPLT5yZW1vdmUoKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBub3RpZnlfZmFpbCgiU3ludGF4OiByZW1vdmVwcm9qZWN0IE5VTU1FUlxuIik7CisgIGlmICghc2l6ZW9mKGFyZyl8fCFpbnRwKHRvX2ludChhcmcpKXx8KGFyZyE9dG9fc3RyaW5nKHRvX2ludChhcmcpKSkpIHJldHVybiAwOworICBQUk9KRUNUTUFTVEVSLT5EZWxldGVEYXRhKHRvX2ludChhcmcpKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBtb2Rwcm9qX2Z1bihzdHJpbmcgYXJnKQoreworICBpZiAoIUlTX0xFQVJORVIoVFApKQorICB7CisgICAgdGVsbF9vYmplY3QoVFAsIldpZSBiaXN0IERVIGRlbm4gYW4gZGllIEZlZGVyIGdla29tbWVuP1xuIik7CisgICAgVE8tPnJlbW92ZSgpOworICAgIHJldHVybiAxOworICB9CisgIG5vdGlmeV9mYWlsKCJTeW50YXg6IG1vZGlmeXByb2plY3QgTlVNTUVSXG4iKTsKKyAgaWYgKCFhcmd8fCFpbnRwKHRvX2ludChhcmcpKXx8KGFyZyE9dG9fc3RyaW5nKHRvX2ludChhcmcpKSkpIHJldHVybiAwOworICBub3RpZnlfZmFpbCgiRXMgZ2lidCBrZWluIFByb2pla3QgbWl0IGRlciBOdW1tZXIgMC5cbiIpOworICBpZiAodG9faW50KGFyZyk9PTApIHJldHVybiAwOworICBQUk9KRUNUTUFTVEVSLT5DaGFuZ2VEYXRhKHRvX2ludChhcmcpKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCB3YXRjaF9mdW4oc3RyaW5nIGFyZykKK3sKKyAgaWYgKCFJU19MRUFSTkVSKFRQKSkKKyAgeworICAgIHRlbGxfb2JqZWN0KFRQLCJXaWUgYmlzdCBEVSBkZW5uIGFuIGRpZSBGZWRlciBnZWtvbW1lbj9cbiIpOworICAgIFRPLT5yZW1vdmUoKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBpZiAoIXNpemVvZihhcmcpKQorICB7CisgICAgdGVsbF9vYmplY3QoVFAsQlMoc3ByaW50ZigiRHUgYmVrb21tc3QgZGVyemVpdCAlc0luZm9ybWF0aW9uZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVlYmVyIEFlbmRlcnVuZ2VuIGFtIFByb2pla3RicmV0dC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcHJlc3NpbmZvcz8ia2VpbmUgIjoiIikpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBub3RpZnlfZmFpbCgiU3ludGF4OiBwcm9qZWt0aW5mb3MgPGVpbnxhbnxhdXM+XG4iKTsKKyAgaWYgKGFyZyE9ImVpbiImJmFyZyE9ImFuIiYmYXJnIT0iYXVzIikgcmV0dXJuIDA7CisgIGlmIChhcmc9PSJhdXMiKQorICB7CisgICAgc3VwcHJlc3NpbmZvcz0xOworICAgIHRlbGxfb2JqZWN0KFRQLEJTKCJEdSB3aXJzdCBqZXR6dCBrZWluZSBNZWxkdW5nZW4gbWVociB1ZWJlciAiCisgICAgICAgICAgICAgICAgICAgICAgIkFlbmRlcnVuZ2VuIGFtIFByb2pla3RicmV0dCBlcmhhbHRlbi5cbiIpKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICBzdXBwcmVzc2luZm9zPTA7CisgIHRlbGxfb2JqZWN0KFRQLEJTKCJEdSBiZWtvbW1zdCBhYiBzb2ZvcnQgTWVsZHVuZ2VuIHVlYmVyIEFlbmRlcnVuZ2VuICIKKyAgICAgICAgICAgICAgICAgICAgImFtIFByb2pla3RicmV0dC5cbiIpKTsKKyAgcmV0dXJuIDE7Cit9CisKK3ZvaWQgaW5pdCgpCit7CisgIGlmICghSVNfTEVBUk5FUihUUCkpIHsKKyAgICBpZiAoZmluZF9jYWxsX291dCgicmVtb3ZlIikgPT0gLTEpCisgICAgICBjYWxsX291dCgicmVtb3ZlIiwwKTsKKyAgfQorICBlbHNlIDo6aW5pdCgpOworICByZXR1cm47Cit9CisKK3ZvaWQgcmVzZXQoKQoreworICBpZiAoIWVudmlyb25tZW50KCkpCisgIHsKKyAgICBkZXN0cnVjdChUTyk7CisgICAgcmV0dXJuOworICB9CisgIGlmICghc3VwcHJlc3NpbmZvcyYmY2hhbmdldGltZTwoUFJPSkVDVE1BU1RFUi0+Q2hhbmdlVGltZSgpKSkKKyAgICB0ZWxsX29iamVjdChlbnZpcm9ubWVudCgpLCJJbnR1aXRpdiBzcHVlcnN0IER1LCBkYXNzIHNpY2ggIgorICAgICAgICAgICAgICAgICJkaWUgQXVzaGFlbmdlIGFtIFByb2pla3RicmV0dCBnZWFlbmRlcnQgaGFiZW4uXG4iKTsKKyAgcmV0dXJuOworfQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3B0b29sLmMgYi9vYmovdG9vbHMvcHRvb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODM2Y2FlCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3B0b29sLmMKQEAgLTAsMCArMSwyOTEgQEAKKy8qCisgICBPYmpla3QgenVtIEVpbnRyYWdlbiB2b24gUmFldW1lbiBkaWUgWmF1YmVydHJhZW5rZSBlbnRoYWx0ZW4gYmVpbQorICAgcG90aW9ubWFzdGVyLiAKKyovCisKKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKworaW5oZXJpdCAic3RkL3RoaW5nIjsKKworaW50IGR1bXAoKTsKKworaW50IHNlY3VyZSgpCit7CisgIGlmICghcHJldmlvdXNfb2JqZWN0KCkpIHJldHVybiAwOworICBpZiAoZ2V0ZXVpZChwcmV2aW91c19vYmplY3QoKSk9PVJPT1RJRCkgcmV0dXJuIDE7CisgIGlmIChnZXRldWlkKHByZXZpb3VzX29iamVjdCgpKSAhPSBnZXRldWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkpIHJldHVybiAwOworICBpZiAodGhpc19pbnRlcmFjdGl2ZSgpICE9IHRoaXNfcGxheWVyKCkpIHJldHVybiAwOworICBpZiAoIUFSQ0hfU0VDVVJJVFkpIHJldHVybiAwOworICByZXR1cm4gMTsKK30KKwordm9pZCBjcmVhdGUoKQoreworICBpZiAoIWNsb25lcCh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfU0hPUlQsICJQb3Rpb24tVG9vbCIpOworICBTZXRQcm9wKFBfTE9ORywgCisgICAgICJFaW4gVG9vbCB6dW0gRWludHJhZ2VuIHZvbiBSYXVtZW4gaW4gZGVuIFBvdGlvbm1hc3Rlci5cbiIrCisgICAgICJGb2xnZW5kZSBCZWZlaGxlIGdpYnQgZXM6XG4iKworICAgICAicHRhZGQgPGxpc3RlPiAgICAgQWRkaWVydCBkZW4gWlQgaW0gUmF1bSBpbiBMaXN0ZSA8bGlzdGU+XG4iKworICAgICAiICAgICAgICAgICAgICAgICAgdW5kIGFrdGl2aWVydCBpaG4gZ2xlaWNoemVpdGlnLlxuIisKKyAgICAgInB0c2V0IDxsaXN0ZT4gICAgIEFrdGl2aWVydCBkZW4gWlQgaW0gUmF1bSB1bmQgc2V0enQgaWhuIGluXG4iKworICAgICAiICAgICAgICAgICAgICAgICAgZGllIExpc3RlIDxsaXN0ZT4uXG4iKworICAgICAicHRjaGFuZ2UgPG51bW1lcj4gRXJzZXR6dCBkZW4gWlQgPG51bW1lcj4gZHVyY2ggZGVuIFpUIGltIFJhdW0uXG4iKworICAgICAicHRhY3QgICAgICAgICAgICAgQWt0aXZpZXJ0IGVpbmVuIGRlYWt0aXZpZXJ0ZW4gWlQgaW4gc2VpbmVyXG4iKworICAgICAiICAgICAgICAgICAgICAgICAgYmlzaGVyaWdlbiBMaXN0ZS5cbiIrCisgICAgICJwdGRlYWN0ICAgICAgICAgICBEZWFrdGl2aWVydCBkZW4gWlQgaW0gUmF1bSBhdXMgZGVyIFpUTGlzdGVcbiIrCisgICAgICIgICAgICAgICAgICAgICAgICB1bmQgdmVyc2NoaWVidCBpaG4gbmFjaCAnZGVha3RpdmllcnRlIFpUcycuXG4iKworICAgICAicHRpbmZvIFtwYXJhXSAgICAga2VpbiBwYXJhOiAgIFplaWd0IEluZm9zIHVlYmVyIGRlbiBaVCBpbSBha3R1LVxuIisKKyAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGxlbiBSYXVtLlxuIisKKyAgICAgIiAgICAgICAgICAgICAgICAgIGludCBwYXJhOiAgICBaZWlndCBJbmZvcyB6dW0gWlQgcGFyYSBhbi5cbiIrCisgICAgICIgICAgICAgICAgICAgICAgICBzdHJpbmcgcGFyYTogWmVpZ3QgWlQtSW5mb3MgZGVzIFNwaWVsZXJzIHBhcmEuXG4iKworICAgICAicHRkdW1wICAgICAgICAgICAgRXJ6ZXVndCBlaW4gRHVtcCBkZXIgYWt0dWVsbGVuIFpUTGlzdGUgdW5kXG4iKworICAgICAiICAgICAgICAgICAgICAgICAgc3BlaWNoZXJ0IGRpZXNlbiBhYi5cblxuIik7CisgIFNldFByb3AoUF9OQU1FLCAiUFRvb2wiKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgTkVVVEVSKTsKKyAgQWRkSWQoKHsidG9vbCIsICJwdG9vbCJ9KSk7CisgIFNldFByb3AoUF9OT0RST1AsIDEpOworICBTZXRQcm9wKFBfQVVUT0xPQURPQkosIDEpOworICBBZGRDbWQoInB0YWRkIiwgImFkZCIpOworICBBZGRDbWQoInB0c2V0IiwgInNldGxpc3QiKTsKKyAgQWRkQ21kKCJwdGNoYW5nZSIsICJjaGFuZ2VwYXRoIik7CisgIEFkZENtZCgicHRhY3QiLCAiYWN0aXZhdGUiKTsKKyAgQWRkQ21kKCJwdGRlYWN0IiwgImRlYWN0aXZhdGUiKTsKKyAgQWRkQ21kKCJwdGluZm8iLCAiaW5mbyIpOworICBBZGRDbWQoInB0ZHVtcCIsICJkdW1wIik7Cit9CisKK2ludCBhZGQoc3RyaW5nIG51bWJlcikKK3sKKyAgaW50IG5yLCBuZXh0LCBhY3RpdmU7CisgIHN0cmluZyByb29tOworICBpZiAoIXNlY3VyZSgpKQorICB7IHByaW50ZigiRmVobGVyOiAtMVxuIik7IHJldHVybiAtMTsgfQorICBpZiAoIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoZW52aXJvbm1lbnQoKSkpCisgIHsgcHJpbnRmKCJGZWhsZXI6IC0yXG4iKTsgcmV0dXJuIC0yOyB9CisgIGlmICghbnVtYmVyKQorICB7IHByaW50ZigiRmVobGVyOiAtM1xuIik7IHJldHVybiAtMzsgfQorICBzc2NhbmYobnVtYmVyLCAiJWQiLCBucik7CisgIGlmICghaW50cChucikpCisgIHsgcHJpbnRmKCJGZWhsZXI6IC00XG4iKTsgcmV0dXJuIC00OyB9CisgIHJvb20gPSBvYmplY3RfbmFtZShlbnZpcm9ubWVudChlbnZpcm9ubWVudCh0aGlzX29iamVjdCgpKSkpOworICBuZXh0ID0gIi9zZWN1cmUvcG90aW9ubWFzdGVyIi0+QWRkUG90aW9uUm9vbShyb29tLG5yKTsKKyAgaWYgKG5leHQ+MCkKKyAgICBwcmludGYoIlJhdW0gaW4gR2VzYW10bGlzdGUgZWluZ2V0cmFnZW4sIE51bW1lcjogJWRcbiIsIG5leHQtMSk7CisgIGVsc2UKKyAgeworICAgIHByaW50ZigiUmF1bSBrb25udGUgbmljaHQgZWluZ2V0cmFnZW4gd2VyZGVuLCBFcmdlYm5pczogJWRcbiIsIG5leHQpOworICAgIHJldHVybiAxOworICB9CisgIC8vIE5pY2h0IG1laHIgbm9ldGlnLCBBcmF0aG9ybiwgMjAxMy1NYWktMzAKKyAgLy9hY3RpdmUgPSAiL3NlY3VyZS9wb3Rpb25tYXN0ZXIiLT5TZXRMaXN0TnIocm9vbSwgbnIpOworICBpZiAoYWN0aXZlPj0wKQorICB7CisgICAgcHJpbnRmKCJSYXVtIGFrdGl2aWVydCBpbiBMaXN0ZSAlZFxuIiwgbnIpOworICAgIGR1bXAoKTsKKyAgfQorICBlbHNlCisgICAgcHJpbnRmKCJGZWhsZXIgYmVpbSBBa3RpdmllcmVuLCBFcmdlYm5pczogJWRcbiIsIGFjdGl2ZSk7CisgIHJldHVybiAxOworfQorCitpbnQgY2hhbmdlcGF0aChzdHJpbmcgbnVtYmVyKQoreworICBpbnQgbnIsbmV1OworICBzdHJpbmcgcm9vbTsKKyAgbWl4ZWQgcm9vbW9sZDsKKyAgaWYgKCFzZWN1cmUoKSkKKyAgeyBwcmludGYoIkZlaGxlcjogLTFcbiIpOyByZXR1cm4gLTE7IH0KKyAgaWYgKCFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKGVudmlyb25tZW50KCkpKQorICB7IHByaW50ZigiRmVobGVyOiAtMlxuIik7IHJldHVybiAtMjsgfQorICBpZiAoIW51bWJlcikKKyAgeyBwcmludGYoIkZlaGxlcjogLTNcbiIpOyByZXR1cm4gLTM7IH0KKyAgc3NjYW5mKG51bWJlciwgIiVkIiwgbnIpOworICBpZiAoIWludHAobnIpKQorICB7IHByaW50ZigiRmVobGVyOiAtNFxuIik7IHJldHVybiAtNDsgfQorICByb29tID0gb2JqZWN0X25hbWUoZW52aXJvbm1lbnQoZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSkpKTsKKyAgcm9vbW9sZCA9ICIvc2VjdXJlL3BvdGlvbm1hc3RlciItPkdldEZpbGVuYW1lQnlOdW1iZXIobnIpOworICBpZiAocm9vbW9sZD09LTEpCisgIHsgcHJpbnRmKCJGZWhsZXI6IC01XG4iKTsgcmV0dXJuIC01OyB9CisgIG5ldSA9ICIvc2VjdXJlL3BvdGlvbm1hc3RlciItPkNoYW5nZVJvb21QYXRoKHJvb21vbGQscm9vbSk7CisgIGlmIChuZXU+MCkKKyAgICB7CisgICAgICBwcmludGYoIlpUICVkIGR1cmNoIGFrdHVlbGxlbiBSYXVtIGVyc2V0enQuXG4iLCBuZXUpOworICAgICAgZHVtcCgpOworICAgIH0KKyAgZWxzZQorICAgIHByaW50ZigiWlQgJWQga29ubnRlIG5pY2h0IGVyc2V0enQgd2VyZGVuLCBFcmdlYm5pczogJWRcbiIsIG5yLG5ldSk7CisgIHJldHVybiAxOworfQorCitpbnQgc2V0bGlzdChzdHJpbmcgbnVtYmVyKQoreworICBpbnQgbnIsIG5leHQsIGFjdGl2ZTsKKyAgc3RyaW5nIHJvb207CisgIGlmICghc2VjdXJlKCkpCisgIHsgcHJpbnRmKCJGZWhsZXI6IC0xXG4iKTsgcmV0dXJuIC0xOyB9CisgIGlmICghcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShlbnZpcm9ubWVudCgpKSkKKyAgeyBwcmludGYoIkZlaGxlcjogLTJcbiIpOyByZXR1cm4gLTI7IH0KKyAgaWYgKCFudW1iZXIpCisgIHsgcHJpbnRmKCJGZWhsZXI6IC0zXG4iKTsgcmV0dXJuIC0zOyB9CisgIHNzY2FuZihudW1iZXIsICIlZCIsIG5yKTsKKyAgaWYgKCFpbnRwKG5yKSB8fCBucjwwIHx8IG5yPjcpCisgIHsgcHJpbnRmKCJGZWhsZXI6IC00XG4iKTsgcmV0dXJuIC00OyB9CisgIHJvb20gPSBvYmplY3RfbmFtZShlbnZpcm9ubWVudChlbnZpcm9ubWVudCh0aGlzX29iamVjdCgpKSkpOworICBhY3RpdmUgPSAiL3NlY3VyZS9wb3Rpb25tYXN0ZXIiLT5TZXRMaXN0TnIocm9vbSwgbnIpOworICBpZiAoYWN0aXZlPj0wKQorICB7CisgICAgcHJpbnRmKCJSYXVtIGFrdGl2aWVydCBpbiBMaXN0ZSAlZFxuIiwgbnIpOworICAgIGR1bXAoKTsKKyAgfQorICBlbHNlCisgICAgcHJpbnRmKCJGZWhsZXIgYmVpbSBBa3RpdmllcmVuLCBFcmdlYm5pczogJWRcbiIsIGFjdGl2ZSk7CisgIHJldHVybiAxOworfQorCitpbnQgYWN0aXZhdGUoKQoreworICBpbnQgbnIsIGFjdGl2ZTsKKyAgc3RyaW5nIHJvb207CisgIAorICBpZiAoIXNlY3VyZSgpKQorICB7IHByaW50ZigiRmVobGVyOiAtMVxuIik7IHJldHVybiAtMTsgfQorICBpZiAoIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoZW52aXJvbm1lbnQoKSkpCisgIHsgcHJpbnRmKCJGZWhsZXI6IC0yXG4iKTsgcmV0dXJuIC0yOyB9CisgIHJvb20gPSBvYmplY3RfbmFtZShlbnZpcm9ubWVudChlbnZpcm9ubWVudCh0aGlzX29iamVjdCgpKSkpOworICBhY3RpdmUgPSAiL3NlY3VyZS9wb3Rpb25tYXN0ZXIiLT5BY3RpdmF0ZVJvb20ocm9vbSk7CisgIGlmIChhY3RpdmU+PTApCisgICAgeworICAgICAgcHJpbnRmKCJSYXVtIGFrdGl2aWVydCBpbiBMaXN0ZSAlZFxuIiwgYWN0aXZlKTsKKyAgICAgIGR1bXAoKTsKKyAgICB9CisgIGVsc2UKKyAgICBwcmludGYoIkZlaGxlciBiZWltIEFrdGl2aWVyZW4sIEVyZ2VibmlzOiAlZFxuIiwgYWN0aXZlKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBkZWFjdGl2YXRlKCkKK3sKKyAgaW50IGRlYWN0aXZlOworICBzdHJpbmcgcm9vbTsKKyAgCisgIGlmICghc2VjdXJlKCkpCisgIHsgcHJpbnRmKCJGZWhsZXI6IC0xXG4iKTsgcmV0dXJuIC0xOyB9CisgIGlmICghcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShlbnZpcm9ubWVudCgpKSkKKyAgeyBwcmludGYoIkZlaGxlcjogLTJcbiIpOyByZXR1cm4gLTI7IH0KKyAgcm9vbSA9IG9iamVjdF9uYW1lKGVudmlyb25tZW50KGVudmlyb25tZW50KHRoaXNfb2JqZWN0KCkpKSk7CisgIGRlYWN0aXZlID0gIi9zZWN1cmUvcG90aW9ubWFzdGVyIi0+RGVhY3RpdmF0ZVJvb20ocm9vbSk7CisgIGlmIChkZWFjdGl2ZT49MCkKKyAgICB7CisgICAgICBwcmludGYoIlJhdW0gZGVha3RpdmllcnQgaW4gTGlzdGUgJWRcbiIsZGVhY3RpdmUpOworICAgICAgZHVtcCgpOworICAgIH0KKyAgZWxzZQorICAgIHByaW50ZigiRmVobGVyIGJlaW0gRGVha3RpdmllcmVuLCBFcmdlYm5pczogJWRcbiIsIGRlYWN0aXZlKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBpbmZvKHN0cmluZyBwYXJhKQoreworICBpbnQgaW5mbyxucjsKKyAgc3RyaW5nIHM7CisgIG9iamVjdCByb29tLG87CisgIG1peGVkIG0sKnBvdGlvbnM7CisgIGlmICghc2VjdXJlKCkpCisgIHsgcHJpbnRmKCJGZWhsZXI6IC0xXG4iKTsgcmV0dXJuIC0xOyB9CisgIGlmICghcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShlbnZpcm9ubWVudCgpKSkKKyAgeyBwcmludGYoIkZlaGxlcjogLTJcbiIpOyByZXR1cm4gLTI7IH0KKyAgaWYgKCFwYXJhIHx8IHBhcmE9PSIiKQorICAgIHsKKyAgICAgIHJvb20gPSBlbnZpcm9ubWVudChlbnZpcm9ubWVudCh0aGlzX29iamVjdCgpKSk7CisgICAgICBpbmZvID0gIi9zZWN1cmUvcG90aW9ubWFzdGVyIi0+SGFzUG90aW9uKHJvb20pOworICAgICAgaWYgKGluZm8+PTApCisgICAgICAgIHsKKyAgICAgICAgICBwcmludGYoIlJhdW0gaGF0IFpUIG1pdCBOcjogICVkXG5cbiIsaW5mbyk7CisgICAgICAgICAgbnIgPSAiL3NlY3VyZS9wb3Rpb25tYXN0ZXIiLT5HZXRMaXN0QnlOdW1iZXIoaW5mbyk7CisgICAgICAgICAgaWYgKG5yPj0wKQorICAgICAgICAgICAgcHJpbnRmKCJaVCBha3RpdiBpbiBMaXN0ZTogICAlZFxuXG4iLG5yKTsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG5yID0gIi9zZWN1cmUvcG90aW9ubWFzdGVyIi0+R2V0SW5hY3RMaXN0QnlOdW1iZXIoaW5mbyk7CisgICAgICAgICAgICAgIGlmIChucj49MCkKKyAgICAgICAgICAgICAgICBwcmludGYoIlpUIElOYWt0aXYgaW4gTGlzdGU6ICVkXG5cbiIsbnIpOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgcHJpbnRmKCJaVCBJTmFrdGl2XG5cbiIpOworICAgICAgICAgICAgfQorICAgICAgICAgIGlmIChpbmZvPj0wICYmIHM9cmVhZF9maWxlKCIvc2VjdXJlL0FSQ0gvWlQvIitpbmZvKyIuenQiKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgd3JpdGUoIlRpcDpcbiIrcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIGVsc2UKKyAgICAgICAgcHJpbnRmKCJSYXVtIGhhdCBrZWluZW4gWlQgZWluZ2V0cmFnZW4uXG4iKTsKKyAgICB9CisgIGVsc2UKKyAgICBpZiAoc3NjYW5mKHBhcmEsIiVkIixpbmZvKT09MSkKKyAgICAgIHsKKyAgICAgICAgcHJpbnRmKCJaVCBtaXQgTnVtbWVyOiAlZFxuXG4iLGluZm8pOworICAgICAgICBtID0gIi9zZWN1cmUvcG90aW9ubWFzdGVyIi0+R2V0RmlsZW5hbWVCeU51bWJlcihpbmZvKTsKKyAgICAgICAgaWYgKG0hPS0xKQorICAgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlKCJGaWxlbmFtZTogIittKyJcblxuIik7CisgICAgICAgICAgICBuciA9ICIvc2VjdXJlL3BvdGlvbm1hc3RlciItPkdldExpc3RCeU51bWJlcihpbmZvKTsKKyAgICAgICAgICAgIGlmIChucj49MCkKKyAgICAgICAgICAgICAgcHJpbnRmKCJaVCBha3RpdiBpbiBMaXN0ZTogJWRcblxuIixucik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBuciA9ICIvc2VjdXJlL3BvdGlvbm1hc3RlciItPkdldEluYWN0TGlzdEJ5TnVtYmVyKGluZm8pOworICAgICAgICAgICAgICAgIGlmIChucj49MCkKKyAgICAgICAgICAgICAgICAgIHByaW50ZigiWlQgSU5ha3RpdiBpbiBMaXN0ZTogJWRcblxuIixucik7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgcHJpbnRmKCJaVCBJTmFrdGl2XG5cbiIpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaW5mbz49MCAmJiBzPXJlYWRfZmlsZSgiL3NlY3VyZS9BUkNIL1pULyIraW5mbysiLnp0IikpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3cml0ZSgiVGlwOlxuIitzKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgIHdyaXRlKCJLZWluIFpUIG1pdCBkaWVzZXIgTnVtbWVyIGJla2FubnQuXG4iKTsKKyAgICAgIH0KKyAgICBlbHNlCisgICAgICB7CisgICAgICAgIHdyaXRlKCJTcGllbGVyICIrY2FwaXRhbGl6ZShwYXJhKSsiXG5cbiIpOworICAgICAgICBpZiAobz1maW5kX3BsYXllcihwYXJhKSkKKyAgICAgICAgICB7CisgICAgICAgICAgICBwb3Rpb25zPXNvcnRfYXJyYXkoby0+UXVlcnlQcm9wKFBfUE9USU9OUk9PTVMpLCMnPik7CisgICAgICAgICAgICBpZiAoc2l6ZW9mKHBvdGlvbnMpKQorICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcz0iIjsKKyAgICAgICAgICAgICAgICBmb3IgKG5yPTA7bnI8c2l6ZW9mKHBvdGlvbnMpO25yKyspCisgICAgICAgICAgICAgICAgICBzKz1wb3Rpb25zW25yXSsiLCAiOworICAgICAgICAgICAgICAgIHdyaXRlKCJQb3Rpb25yb29tczpcbiIrYnJlYWtfc3RyaW5nKHNbMC4uPDNdLDc4KSsiXG4iKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB3cml0ZSgiU3BpZWxlciBoYXQga2VpbmUgd2VpdGVyZW4gUG90aW9ucm9vbXMuXG4iKTsKKyAgICAgICAgICAgIHBvdGlvbnM9c29ydF9hcnJheShvLT5RdWVyeVByb3AoUF9LTk9XTl9QT1RJT05ST09NUyksIyc+KTsKKyAgICAgICAgICAgIGlmIChzaXplb2YocG90aW9ucykpCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzPSIiOworICAgICAgICAgICAgICAgIGZvciAobnI9MDtucjxzaXplb2YocG90aW9ucyk7bnIrKykKKyAgICAgICAgICAgICAgICAgIHMrPXBvdGlvbnNbbnJdKyIsICI7CisgICAgICAgICAgICAgICAgd3JpdGUoIkJla2FubnRlIFBvdGlvbnJvb21zOlxuIisKKyAgICAgICAgICAgICAgICAgICAgICBicmVha19zdHJpbmcoc1swLi48M10sNzgpKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB3cml0ZSgiU3BpZWxlciBoYXQga2VpbmUgYmVrYW5udGVuIFBvdGlvbnJvb21zLlxuIik7CisgICAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgd3JpdGUoIktlaW4gU3BpZWxlciBtaXQgZGllc2VtIE5hbWVuIGFud2VzZW5kLlxuIik7CisgICAgICB9CisgIHJldHVybiAxOworfQorCitpbnQgZHVtcCgpCit7CisgICIvc2VjdXJlL3BvdGlvbm1hc3RlciItPkR1bXBMaXN0KCk7CisgIHByaW50ZigiTGlzdGUgd3VyZGUgZXJ6ZXVndC5cbiIpOworICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3B1YnRvb2wuYyBiL29iai90b29scy9wdWJ0b29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg1YWZjOQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy9wdWJ0b29sLmMKQEAgLTAsMCArMSw2MCBAQAorLyogTW9yZ2VuR3JhdWVuIE11ZExpYiA6IFB1YnRvb2wgKi8KKworI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKworaW5oZXJpdCAiL3N0ZC90aGluZyI7CisKK2NyZWF0ZSgpCit7CisgICAgaWYgKCFjbG9uZXAoTUUpKQorICAgICAgICByZXR1cm47CisgICAgOjpjcmVhdGUoKTsKKworICAgIFNldFByb3AoUF9TSE9SVCwiRWluIFB1YnRvb2wiKTsKKyAgICBTZXRQcm9wKFBfTE9ORywKKyAgICAiRGFzIFB1YnRvb2wgYmVyZWNobmV0IGRpZSBtYXhpbWFsIHp1bGFlc3NpZ2UgSGVpbHVuZyBlaW5lciBLbmVpcGUuXG4iKworICAiXG4iKworICAiU3ludGF4OiBwdWJ0ZXN0IDxQX0FMQ09IT0w+IDxQX0RSSU5LPiA8UF9GT09EPiA8UF9WQUxVRT4gPFJhdGU+IDxEZWxheT5cbiIrCisgICJcbiIrCisgICJXZXJ0ZWJlcmVpY2g6ICAgICAgPj0wICAgICAgICAgPj0wICAgICAgID49MCAgICAgID49MCAgICAxLi4yMCAgIDAuLlxuIisKKyAgIlxuIik7CisgICAgU2V0UHJvcChQX05BTUUsIlB1YnRvb2wiKTsKKyAgICBTZXRQcm9wKFBfR0VOREVSLE5FVVRFUik7CisgICAgU2V0UHJvcChQX1dFSUdIVCwwKTsKKyAgICBTZXRQcm9wKFBfVkFMVUUsMCk7IAorICAgIFNldFByb3AoUF9OT0RST1AsIkRhcyBQdWJ0b29sIGJlaGFlbHN0IER1IGxpZWJlciBiZWkgRGlyLlxuIik7CisgICAgU2V0UHJvcChQX05FVkVSRFJPUCwxKTsKKyAgICBTZXRQcm9wKFBfQVVUT0xPQURPQkosMSk7CisKKyAgICBBZGRJZCggInB1YnRvb2wiICk7CisKKyAgICBBZGRDbWQoICJwdWJ0ZXN0IiwgInB1YnRlc3QiICk7Cit9CisKK2ludCBwdWJ0ZXN0KHN0cmluZyBhcmcpCit7ICAgaW50IHYsZCxhLGYscixoLHk7CisKKyAgICBub3RpZnlfZmFpbCgKKyAgIlN5bnRheDogcHVidGVzdCA8UF9BTENPSE9MPiA8UF9EUklOSz4gPFBfRk9PRD4gPFBfVkFMVUU+IDxSYXRlPiA8RGVsYXk+XG4iKTsKKworICAgIGlmICghYXJnIHx8ICFzdHJpbmdwKGFyZykgfHwKKyAgICAgICAgc3NjYW5mKGFyZywiJWQgJWQgJWQgJWQgJWQgJWQiLGEsZCxmLHYscix5KSE9NikKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAodjwxIHx8IGQ8MCB8fCBhPDAgfHwgZjwwIHx8IHI8MSB8fCByPjIwIHx8IHk8MCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICBoPWNhbGxfb3RoZXIoIi9zZWN1cmUvcHVibWFzdGVyIiwiQ2FsY01heCIsCisgICAgICAgICAgICAgICAgIChbUF9WQUxVRTp2LFBfQUxDT0hPTDphLFBfRFJJTks6ZCxQX0ZPT0Q6ZiwKKyAgICAgICAgICAgICAgICAgImRlbGF5Ijp5LCJyYXRlIjpyXSksMCk7CisKKyAgICBwcmludGYoIkJlcmVjaG5ldGUgTWF4aW1hbGhlaWx1bmcgZnVlcjpcbiIrCisgICAgICAgICAgICJQX0FMQ09IT0wgPSAlM2QgICAgUF9EUklOSyAgID0gJTNkICAgIFBfRk9PRCAgICA9ICUzZCBcbiIrCisgICAgICAgICAgICJQX1ZBTFVFICAgPSAlM2QgICAgUmF0ZSAgICAgID0gJTNkICAgIERlbGF5ICAgICA9ICUzZCBcbiIrCisgICAgICAgICAgICJFcmdlYm5pczpcbiIrCisgICAgICAgICAgICJHZXNhbXQ6ICUzZCAoSFArU1ApLCBhdWZnZXRlaWx0IHouQi4gJTNkIEhQIHVuZCAlM2QgU1AuXG4iLAorICAgICAgICAgICBhLGQsZix2LHIseSxoLChoLzIpLChoJTI/KGgvMikrMTooaC8yKSkpOworICAgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3F1ZXN0dG9vbC5jIGIvb2JqL3Rvb2xzL3F1ZXN0dG9vbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2NGZhN2MKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvcXVlc3R0b29sLmMKQEAgLTAsMCArMSw3NTQgQEAKKy8qCisgKiAgVGhlIG5ldyB1bHRpbWF0ZSBxdWVzdCBhZG1pbmlzdHJhdGlvbiB0b29sCisgKi8KKworLyogQUVOREVSVU5HRU4KKyAqIDIwMDYtMDktMjkgOiBab29rCisgKiAgICAgICAgICAgICAgUXVlc3R0b29sIGFuIG5ldWUgRmVsZGVyICJBdHRyaWJ1dGUiIHVuZCAiS2xhc3NlIgorICogICAgICAgICAgICAgIGFuZ2VwYXNzdC4KKyAqIDIwMDAtMTEtMTggOiBab29rOgorICoJCVF1ZXN0dG9vbCB1bSBuZXVlcyBGZWxkICJXYXJ0ZW5kZXIgTWFnaWVyIiBkZXMgUXVlc3RtYXN0ZXIKKyAqCQllcndlaXRlcnQuCisgKiAyMDAwLTExLTE4IDogWm9vazoKKyAqCQlRdWVzdHRvb2wgdW0gbmV1ZXMgRmVsZCAiR3J1cHBlbmVpbm9yZG51bmciIGRlcyBRdWVzdG1hc3RlcgorICoJCWVyd2VpdGVydC4KKyAqLworCitpbmhlcml0ICJzdGQvdGhpbmciOworaW5oZXJpdCAic3RkL21vcmUiOworCisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgIi9zZWN1cmUvcXVlc3RtYXN0ZXIuaCIKKworI2RlZmluZSBVQSB0aGlzX2ludGVyYWN0aXZlKCktPl91bnBhcnNlZF9hcmdzKCkKKworI2RlZmluZSBRTkFNRQkwCisjZGVmaW5lIFFQCTEKKyNkZWZpbmUgWFAJMgorI2RlZmluZSBBTExPVwkzCisjZGVmaW5lIElORk8JNAorI2RlZmluZSBMRVZFTAk1CisjZGVmaW5lIENMQVNTCTYKKyNkZWZpbmUgQVRUUgk3CisjZGVmaW5lIFdJWgk4CisjZGVmaW5lIFNDTkRXSVogOQorI2RlZmluZSBFTkQgICAgMTAKKworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKworcHJpdmF0ZSB2b2lkIExvYWRfTnVtS2V5KCk7CitpbnQgIEFkZF9RdWVzdAkgICAgICggc3RyaW5nIHN0ciApOwordm9pZCBSZWFkTmV3UXVlc3QgICAgKCBzdHJpbmcgc3RyICk7CitpbnQgIFJlbW92ZV9RdWVzdCAgICAoIHN0cmluZyBzdHIgKTsKK2ludCAgQ2hhbmdlX1F1ZXN0ICAgICggc3RyaW5nIHN0ciApOworaW50ICBSZXN0b3JlX1F1ZXN0ICAgKCBzdHJpbmcgc3RyICk7CitpbnQgIFNldF9RdWVzdAkgICAgICggc3RyaW5nIHN0ciApOworaW50ICBSZW1vdmVfUXVlc3QgICAgKCBzdHJpbmcgc3RyICk7CitpbnQgIFF1ZXJ5X1F1ZXN0ICAgICAoIHN0cmluZyBzdHIgKTsKK2ludCAgUXVlcnlfS2V5cyAgICAgICggc3RyaW5nIHN0ciApOworaW50ICBRdWVyeV9RdWVzdHMgICAgKCBzdHJpbmcgc3RyICk7CitpbnQgIEFjdGl2YXRlUXVlc3QgICAoIHN0cmluZyBzdHIgKTsKK2ludCAgRGVhY3RpdmF0ZVF1ZXN0ICggc3RyaW5nIHN0ciApOworaW50ICBHZXRSZXR1cm4JICAgICAoIHN0cmluZyBzdHIgKTsKKworc3RyaW5nIG5hbWU7CitpbnQgICAgcXA7CitpbnQgICAgeHA7CitpbnQgICAgbGV2ZWw7CitpbnQgICAgbmVlZDsKK3N0cmluZyAqYWxsb3dlZDsKK3N0cmluZyBpbmZvOworc3RyaW5nIHdpemFyZDsKK3N0cmluZyBzY25kd2l6YXJkOworaW50ICAgIGdyb3VwOworbWFwcGluZyBudW1fa2V5OworCitvYmplY3Qgb3duZXI7CitpbnQgICAgY291bnRlcjsKK21peGVkICAqc2F2ZXF1ZXN0Oworc3RyaW5nIHNhdmVrZXk7CitpbnQgICAgZG9fY2hhbmdlOworc3RyaW5nIGNoYW5nZWtleTsKKwordm9pZCBjcmVhdGUoKQoreworICBzdHJpbmcgc3RyOworCisgIGlmKElTX0JMVUUoTUUpKSByZXR1cm47CisgIHRoaW5nOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX0dFTkRFUixORVVURVIpOworICBvd25lciA9IFBMOworICBBZGRJZCgicXVlc3R0b29sIik7CisgIEFkZElkKCJxdCIpOworICBTZXRQcm9wKFBfQVJUSUNMRSwwKTsKKyAgU2V0UHJvcChQX0dFTkRFUiwgTkVVVEVSKTsKKyAgc3RyPWNhcGl0YWxpemUoKChzdHI9b3duZXItPnF1ZXJ5X3JlYWxfbmFtZSgpKVs8MV09PSdzJ3x8c3RyWzwxXT09J3gnfHxzdHJbPDFdPT0neicpP3N0cis9IiciOnN0cis9InMiKTsKKyAgU2V0UHJvcChQX05BTUUsIHN0cisiIFF1ZXN0VG9vbCIpOworICBTZXRQcm9wKFBfU0hPUlQsIHN0cisiIFF1ZXN0VG9vbCIpOworICBTZXRQcm9wKFBfTE9ORywKKyAgICJEYXMgUXVlc3RUb29sIGRpZW50IGRlciBBZG1pbmlzdHJhdGlvbiB2b24gUXVlc3RzLiAoYnkgS2lyaywgMTAuMTEuOTQpXG4iCisgICsiaW1wbGVtZW50aWVydGUgS29tbWFuZG9zOlxuIgorICArIiAgQWRkUQkJCSAgICA6IE5ldWVuIFF1ZXN0ZWludHJhZyBlaW5mdWVnZW5cbiIKKyAgKyIgIFJlbW92ZVEJICA8cXVlc3Q+CSAgICA6IFF1ZXN0ZWludHJhZyBsb2VzY2hlblxuIgorICArIiAgQ2hhbmdlUQkgIDxxdWVzdD4JICAgIDogUXVlc3RlaW50cmFnIGFlbmRlcm5cbiIKKyAgKyIgIFJlU3RvcmVRCQkJICAgIDogWnVsZXR6dCBnZWxvZXNjaHRlbiBvZGVyIGdlYWVuZGVydGVuXG4iCisgICsiCQkJCSAgICA6IFF1ZXN0ZWludHJhZyByZXN0YXVyaWVyZW5cbiIKKyAgKyIgIFNldFEJICA8c3BpZWxlcj4gPHF1ZXN0PiA6IFF1ZXN0IGFscyAnZ2Vsb2VzdCcgbWFya2llcmVuXG4iCisgICsiICBEZWxRCSAgPHNwaWVsZXI+IDxxdWVzdD4gOiBRdWVzdCBhbHMgJ25pY2h0IGdlbG9lc3QnIG1hcmtpZXJlblxuIgorICArIiAgUXVlcnlRCSAgPHF1ZXN0PgkgICAgOiBRdWVzdGVpbnRyYWcgYW56ZWlnZW5cbiIKKyAgKyIgIFF1ZXJ5SwkJCSAgICA6IEFsbGUgS2V5cyB1bmQgSW5kaWNlcyBhbnplaWdlblxuIgorICArIiAgUXVlcnlBbGxRIAkJICAgIDogQWxsZSBFaW50cmFlZ2Ugdm9sbHN0YWVuZGlnIGFuemVpZ2VuXG4iCisgICsiICBBY3RpVmF0ZVEgICA8cXVlc3Q+CSAgICA6IFF1ZXN0IGltIFF1ZXN0bWFzdGVyIGFrdGl2aWVyZW5cbiIKKyAgKyIgIERlYWN0aVZhdGVRIDxxdWVzdD4JICAgIDogUXVlc3QgaW0gUXVlc3RtYXN0ZXIgZGVha3RpdmllcmVuXG5cbiIKKyAgKyIgIGZ1ZXIgPHF1ZXN0PiBrYW5uIGRlciBJbmRleCB2ZXJ3ZW5kZXQgd2VyZGVuLCBkZW4gUXVlcnlLIGxpZWZlcnQhXG5cbiIKKyAgKyIgIChBbGxlIEtvbW1hbmRvcyBrb2VubmVuIGFiZ2VrdWVyenQgd2VyZGVuLilcbiIKKwkrIiAgIC0+IEJlaXNwaWVsOiBEZWFjdGlWYXRlUSA9PSBEVlEgPT0gZHZxID09IGRlYWN0aXZhdGVxXG4iKTsKKworICBTZXRQcm9wKFBfTkVWRVJEUk9QLCAxKTsKKyAgU2V0UHJvcChQX05PRFJPUCwgCisgICJNaXQgSGlsZmUgZGVzIFF1ZXN0VG9vbHMga29lbm5lbiBRdWVzdHMgZWluZ2V0cmFnZW4sIG9kZXIgZ2Vsb2VzY2h0XG4iKworICAid2VyZGVuLiBEdSBicmF1Y2hzdCBlcyB2aWVsbGVpY2h0IG5vY2gsIGRlc2hhbGIgd2lyZnN0IER1IGVzIG5pY2h0IHdlZy5cbiIpOworICBTZXRQcm9wKFBfTk9CVVksIDEpOworICBBZGRDbWQoKHsgIkFkZFEiLCAiYWRkcSIsICJBUSIsICJhcSIgfSksCQkgICAiQWRkX1F1ZXN0Iik7CisgIEFkZENtZCgoeyAiUmVtb3ZlUSIsICJyZW1vdmVxIiwgIlJRIiwgInJxIiB9KSwJICAgIlJlbW92ZV9RdWVzdCIpOworICBBZGRDbWQoKHsgIkNoYW5nZVEiLCAiY2hhbmdlcSIsICJDUSIsICJjcSIgfSksCSAgICJDaGFuZ2VfUXVlc3QiKTsKKyAgQWRkQ21kKCh7ICJSZVN0b3JlUSIsICJyZXN0b3JlcSIsICJSU1EiLCAicnNxIiB9KSwJICAgIlJlc3RvcmVfUXVlc3QiKTsKKyAgQWRkQ21kKCh7ICJTZXRRIiwgInNldHEiLCAiU1EiLCAic3EiIH0pLAkJICAgIlNldF9RdWVzdCIpOworICBBZGRDbWQoKHsgIkRlbFEiLCAiZGVscSIsICJEUSIsICJkcSIgfSksCQkgICAiRGVsX1F1ZXN0Iik7CisgIEFkZENtZCgoeyAiUXVlcnlRIiwgInF1ZXJ5cSIsICJRUSIsICJxcSIgfSksCQkgICAiUXVlcnlfUXVlc3QiKTsKKyAgQWRkQ21kKCh7ICJRdWVyeUsiLCAicXVlcnlrIiwgIlFLIiwgInFrIiB9KSwJCSAgICJRdWVyeV9LZXlzIik7CisgIEFkZENtZCgoeyAiUXVlcnlBbGxRIiwgInF1ZXJ5YWxscSIsICJRQVEiLCAicWFxIiB9KSwJICAgIlF1ZXJ5X1F1ZXN0cyIpOworICBBZGRDbWQoKHsgIkFjdGlWYXRlUSIsICJhY3RpdmF0ZXEiLCAiQVZRIiwgImF2cSIgfSksCSAgICJBY3RpdmF0ZVF1ZXN0Iik7CisgIEFkZENtZCgoeyAiRGVhY3RpVmF0ZVEiLCAiZGVhY3RpdmF0ZXEiLCAiRFZRIiwgImR2cSIgfSksICJEZWFjdGl2YXRlUXVlc3QiKTsKKyAgY291bnRlciA9IFFOQU1FOworICBzYXZla2V5ID0gIiI7CisgIGRvX2NoYW5nZSA9IDA7CisgIG51bV9rZXkgPSAoW10pOworfQorCitpbnQgX3F1ZXJ5X2F1dG9sb2Fkb2JqKCkgeyByZXR1cm4gMTsgfQorCit2b2lkIGluaXQoKQoreworICBvYmplY3QgdHA7CisKKyAgaWYoISh0cCA9IFBMKSB8fCB0cCAhPSBlbnZpcm9ubWVudCgpKQorICAgIHJldHVybjsKKworICB0aGluZzo6aW5pdCgpOworCisgIGlmICggIUlTX1dJWkFSRCh0cCkgfHwgdHAgIT0gb3duZXIgKQorICAgIHJldHVybiBjYWxsX291dCgiZG9fcmVtb3ZlIiwxKTsKK30KKworc3RhdGljIHZvaWQgZG9fcmVtb3ZlKCkKK3sKKyAgd3JpdGUgKCBNRS0+UXVlcnlQcm9wKFBfU0hPUlQpKyIgemVyZmFlbGx0IHp1IFN0YXViLlxuIik7CisgIHNheSAoIE1FLT5RdWVyeVByb3AoUF9TSE9SVCkrIiB6ZXJmYWVsbHQgaW4gIitQTC0+bmFtZShXRVNTRU4pKworICAgICAgICIgdW5iZWZ1Z3RlbiBIYWVuZGVuIHp1IFN0YXViLlxuIik7CisgIGNhbGxfb3V0KCJyZW1vdmUiLDEpOworfQorCitwcml2YXRlIHZvaWQgTG9hZF9OdW1LZXkoKQoreworICBzdHJpbmcgKmtleXM7CisgIGludCBpOworCisgIGlmICggIShrZXlzID0gKHN0cmluZyopIFFNLT5RdWVyeUFsbEtleXMoKSkgKSByZXR1cm47CisgIGtleXM9c29ydF9hcnJheShrZXlzLCMnPik7Ly8nKQorICBmb3IgKCBpID0gMCwgbnVtX2tleSA9IChbXSk7IGkgPCBzaXplb2Yoa2V5cyk7IGkrKyApCisgICAgbnVtX2tleSArPSAoWyhpKzEpKyIiOmtleXNbaV1dKTsKK30KKworaW50IEFkZF9RdWVzdChzdHJpbmcgc3RyKQoreworICBjb3VudGVyID0gUU5BTUU7CisgIHdyaXRlICggIk5ldWUgUXVlc3Q6IChBYmJydWNoIG1pdCAnLicgb2RlciAnfnEnKVxuIiApOworICB3cml0ZSAoICJLZXkgOlxuIiApOyAKKyAgaW5wdXRfdG8gKCAiUmVhZE5ld1F1ZXN0IiApOworICByZXR1cm4gMTsKK30KKwordm9pZCBSZWFkTmV3UXVlc3QgKHN0cmluZyBzdHIpCit7CisgIG1peGVkICpvbGRxdWVzdDsKKyAgaW50IGVycnN0YXQ7CisgIGludCBhY3RpdmU7CisKKyAgaWYgKCBzdHIgPT0gIn5xIiB8fCBzdHIgPT0gIi4iICkKKyAgeworICAgIGNvdW50ZXIgPSBRTkFNRTsKKyAgICBpZihkb19jaGFuZ2UpCisgICAgeworICAgICAgZG9fY2hhbmdlID0gMDsKKyAgICAgIGNoYW5nZWtleSA9ICIiOworICAgICAgc2F2ZWtleSA9ICIiOworICAgICAgc2F2ZXF1ZXN0ID0gKHt9KTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgc3dpdGNoICggY291bnRlciApCisgIHsKKyAgICBjYXNlIFFOQU1FOgorICAgICAgaWYoKCFzdHJ8fCFzaXplb2Yoc3RyKSkgJiYgZG9fY2hhbmdlKQorCW5hbWUgPSBzYXZla2V5OworICAgICAgZWxzZQorCW5hbWUgPSBzdHI7CisgICAgICBjb3VudGVyKys7CisgICAgICB3cml0ZSAoIHNwcmludGYoIlB1bmt0ZSAoPjApIFslZF06XG4iLAorCQkgICAgICAoZG9fY2hhbmdlPyhpbnQpc2F2ZXF1ZXN0WzBdOjEwKSkgKTsgCisgICAgICBpbnB1dF90byAoICJSZWFkTmV3UXVlc3QiICk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFFQOgorICAgICAgaWYoKCFzdHJ8fCFzaXplb2Yoc3RyKSkpCisJaWYoZG9fY2hhbmdlKQorCSAgcXAgPSAoaW50KSBzYXZlcXVlc3RbUV9RUF07CisJZWxzZQorCSAgcXAgPSAxMDsKKyAgICAgIGVsc2UKKwlzc2NhbmYgKCBzdHIsICIlZCIsIHFwICk7CisgICAgICBjb3VudGVyKys7CisgICAgICB3cml0ZSAoIHNwcmludGYoIkVyZmFocnVuZyAoPj0wKSBbJWRdOlxuIiwKKwkJICAgICAgKGRvX2NoYW5nZT8oaW50KXNhdmVxdWVzdFsxXTpxcCoxMDAwKSkpOworICAgICAgaW5wdXRfdG8gKCAiUmVhZE5ld1F1ZXN0IiApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBYUDogCisgICAgICBpZigoIXN0cnx8IXNpemVvZihzdHIpKSkKKwlpZihkb19jaGFuZ2UpCisJICB4cCA9IChpbnQpIHNhdmVxdWVzdFtRX1hQXTsKKwllbHNlCisJICB4cCA9IHFwICogMTAwMDsKKyAgICAgIGVsc2UKKwlzc2NhbmYgKCBzdHIsICIlZCIsIHhwICk7CisgICAgICBjb3VudGVyKys7CisgICAgICB3cml0ZSAoIHNwcmludGYoIkZpbGVuYW1lbiBmaWxlMVssZmlsZTIsLi4uXSkgJXM6XG4iLAorCQkgICAgICAoZG9fY2hhbmdlPyJbIitpbXBsb2RlKChzdHJpbmcgKilzYXZlcXVlc3RbMl0sIiwiKSsiXSI6CisJCSAgICAgICAiIikpICk7CisgICAgICBpbnB1dF90byAoICJSZWFkTmV3UXVlc3QiICk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFMTE9XOgorICAgICAgaWYoKCFzdHJ8fCFzaXplb2Yoc3RyKSkgJiYgZG9fY2hhbmdlKQorCWFsbG93ZWQgPSAoc3RyaW5nICopIHNhdmVxdWVzdFtRX0FMTE9XRURdOworICAgICAgZWxzZQorCWFsbG93ZWQgPSBvbGRfZXhwbG9kZShpbXBsb2RlKG9sZF9leHBsb2RlKHN0ciwiLmMiKSwiIiksIiwiKTsKKyAgICAgIGNvdW50ZXIrKzsKKyAgICAgIHdyaXRlICggc3ByaW50ZigiSW5mbyAlczpcbiIsIChkb19jaGFuZ2U/CisJCQkJICAgICAiWyIrYnJlYWtfc3RyaW5nKCJcYlxiXGJcYlxiXGIiKyhzdHJpbmcpCisJCQkJCQkgICAgICBzYXZlcXVlc3RbM10rIl0iLDc4LDYpCisJCQkJICAgICA6IiIpKSApOyAKKyAgICAgIGlucHV0X3RvICggIlJlYWROZXdRdWVzdCIgKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSU5GTzoKKyAgICAgIGlmKCghc3RyfHwhc2l6ZW9mKHN0cikpICYmIGRvX2NoYW5nZSkKKwlpbmZvID0gKHN0cmluZykgc2F2ZXF1ZXN0W1FfSElOVF07CisgICAgICBlbHNlCisJaW5mbyA9IHN0cjsKKyAgICAgIGNvdW50ZXIrKzsKKyAgICAgIHdyaXRlICggc3ByaW50ZigiU3R1ZmUgKC0xIDw9bGV2PD0xMCkgKC0xIGlzdCBlaW5lIFNlaGVycXVlc3QpIFslZF06XG4iLAorCQkgICAgICAoZG9fY2hhbmdlPyhpbnQpc2F2ZXF1ZXN0WzRdOjApKSApOworICAgICAgaW5wdXRfdG8gKCAiUmVhZE5ld1F1ZXN0IiApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBMRVZFTDoKKyAgICAgIGlmKCghc3RyfHwhc2l6ZW9mKHN0cikpKQorCWlmKGRvX2NoYW5nZSkKKwkgIGxldmVsID0gKGludCkgc2F2ZXF1ZXN0W1FfRElGRl07CisJZWxzZQorCSAgbGV2ZWwgPSAwOworCXNzY2FuZiAoIHN0ciwgIiVkIiwgbGV2ZWwgKTsKKyAgICAgIGNvdW50ZXIrKzsKKyAgICAgIHdyaXRlICggc3ByaW50ZigiS2xhc3NlIChbMDEyMzQ1XSkgWyVkXTpcbiIsCisJCSAgICAgIChkb19jaGFuZ2U/KGludClzYXZlcXVlc3RbNV06MCkpICk7IAorICAgICAgaW5wdXRfdG8gKCAiUmVhZE5ld1F1ZXN0IiApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBDTEFTUzoKKyAgICAgIGlmKCghc3RyfHwhc2l6ZW9mKHN0cikpKQorCWlmKGRvX2NoYW5nZSkKKwkgIG5lZWQgPSAoaW50KSBzYXZlcXVlc3RbUV9DTEFTU107CisJZWxzZQorCSAgbmVlZCA9IDA7CisgICAgICBlbHNlCisJc3NjYW5mICggc3RyLCAiJWQiLCBuZWVkICk7CisgICAgICBjb3VudGVyKys7CisgICAgICB3cml0ZSAoIHNwcmludGYoIkF0dHJpYnV0IFswMTIzNF1cbigxPWZsZWlzc2lnLDI9aGVyb2lzY2gsMz1lcGlzY2gsND1sZWdlbmRhZXIpICVzOlxuIiwKKwkJICAgICAgKGRvX2NoYW5nZT8iWyIrKHN0cmluZylzYXZlcXVlc3RbOV0rIl0iOiIiKSkgKTsKKyAgICAgIGlucHV0X3RvICggIlJlYWROZXdRdWVzdCIgKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQVRUUjoKKyAgICAgIGlmICgoIXN0cnx8IXNpemVvZihzdHIpKSkKKwlpZiAoZG9fY2hhbmdlKQorCSAgZ3JvdXAgPSAoaW50KSBzYXZlcXVlc3RbUV9BVFRSXTsKKwllbHNlCisJICBncm91cCA9IDA7CisgICAgICBlbHNlCisJc3NjYW5mIChzdHIsICIlZCIsIGdyb3VwKTsKKyAgICAgIGNvdW50ZXIrKzsKKyAgICAgIHdyaXRlICggc3ByaW50ZigiTWFnaWVyICVzOlxuIiwKKwkJICAgICAgKGRvX2NoYW5nZT8iWyIrKHN0cmluZylzYXZlcXVlc3RbN10rIl0iOiIiKSkgKTsKKyAgICAgIGlucHV0X3RvICggIlJlYWROZXdRdWVzdCIgKTsKKyAgICBicmVhazsJCisgICAgY2FzZSBXSVo6CisgICAgICBpZigoIXN0cnx8IXNpemVvZihzdHIpKSAmJiBkb19jaGFuZ2UpCisJd2l6YXJkID0gKHN0cmluZykgc2F2ZXF1ZXN0W1FfV0laXTsKKyAgICAgIGVsc2UKKwl3aXphcmQgPSBzdHI7CisgICAgICB3aXphcmQgPSBsb3dlcl9jYXNlKHdpemFyZCk7CisgICAgICBjb3VudGVyKys7CisgICAgICB3cml0ZSAoIHNwcmludGYoIldhcnRlbmRlciBNYWdpZXIgJXM6XG4iLAorCQkgICAgICAoZG9fY2hhbmdlPyJbIisoc3RyaW5nKXNhdmVxdWVzdFs4XSsiXSI6IiIpKSApOworICAgICAgaW5wdXRfdG8gKCAiUmVhZE5ld1F1ZXN0IiApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTQ05EV0laOgorICAgICAgaWYgKCghc3RyfHwhc2l6ZW9mKHN0cikpICYmIGRvX2NoYW5nZSkKKwlzY25kd2l6YXJkID0gKHN0cmluZykgc2F2ZXF1ZXN0W1FfU0NORFdJWl07CisgICAgICBlbHNlCisJc2NuZHdpemFyZCA9IHN0cjsKKyAgICAgIHNjbmR3aXphcmQgPSBsb3dlcl9jYXNlKHNjbmR3aXphcmQpOworICAgICAgY291bnRlcisrOworICAgICAgd3JpdGUgKCAiRWludHJhZ2VuIChqL24pP1xuIiApOworICAgICAgaW5wdXRfdG8gKCAiUmVhZE5ld1F1ZXN0IiApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBFTkQ6CisgICAgICBjb3VudGVyPVFOQU1FOworCisgICAgICBpZiAoIHN0ciAhPSAiaiIgJiYgc3RyICE9ICJqYSIgJiYgc3RyICE9ICJ5IiAmJiBzdHIgIT0gInllcyIgKQorCXJldHVybjsKKworICAgICAgYWN0aXZlID0gMDsKKyAgICAgIGlmICggZG9fY2hhbmdlICYmIGNoYW5nZWtleSAmJiBzaXplb2YoY2hhbmdla2V5KSApCisgICAgICB7CisJb2xkcXVlc3QgPSAobWl4ZWQgKikgUU0tPlF1ZXJ5UXVlc3QgKCBjaGFuZ2VrZXkgKTsKKworCWlmICggIXBvaW50ZXJwICggb2xkcXVlc3QgKSB8fCAhc2l6ZW9mICggb2xkcXVlc3QgKSApCisJeworCSAgd3JpdGUgKCAiQWx0ZW4gRWludHJhZyBuaWNodCBnZWZ1bmRlbi5cbiIgKTsKKwkgIHJldHVybjsKKwl9CisKKwllcnJzdGF0ID0gKGludCkgUU0tPlJlbW92ZVF1ZXN0KCBjaGFuZ2VrZXkgKTsKKworCWRvX2NoYW5nZSA9IDA7CisJY2hhbmdla2V5ID0gIiI7CisKKwlzd2l0Y2ggKCBlcnJzdGF0ICkKKwl7CisJICBjYXNlCTA6IHdyaXRlICggIlp1Z3JpZmYgYXVmIGFsdGVuIEVpbnRyYWcgdmVyd2VpZ2VydC5cbiIgKTsgcmV0dXJuOworCSAgY2FzZSAtMTogd3JpdGUgKCAiUGFyYW1ldGVyZmVobGVyIGJlaW0gTG9lc2NoZW4uXG4iICk7IHJldHVybjsKKwkgIGNhc2UgLTI6IHdyaXRlICggIkFsdGVuIEVpbnRyYWcgbmljaHQgZ2VmdW5kZW4uXG4iICk7IHJldHVybjsKKwkgIGRlZmF1bHQ6IHdyaXRlICggIkFsdGVyIEVpbnRyYWcgZ2Vsb2VzY2h0LlxuIiApOworCX0KKwlhY3RpdmUgPSBvbGRxdWVzdFs2XTsKKwlzYXZlcXVlc3QgPSBvbGRxdWVzdDsKKwlzYXZla2V5ICAgPSBjaGFuZ2VrZXk7CisgICAgICB9CisKKyAgICAgIC8vIGFkZCBuZXcgUXVlc3QgZGVhY3RpdmF0ZWQgYnkgZGVmYXVsdCBhbmQga2VlcCBvbGQgYWN0aXZlIGZsYWcKKyAgICAgIC8vIGlmIGNoYW5naW5nIGFuIGV4aXN0aW5nIGVudHJ5CisgICAgICBlcnJzdGF0PSAoaW50KVFNLT5BZGRRdWVzdChuYW1lLHFwLHhwLGFsbG93ZWQsaW5mbyxsZXZlbCxuZWVkLGFjdGl2ZSwKKwkJCQkgd2l6YXJkLCBzY25kd2l6YXJkLCBncm91cCk7CisKKyAgICAgIHN3aXRjaCAoIGVycnN0YXQgKQorICAgICAgeworCWNhc2UgIDA6IHdyaXRlICggIlp1Z3JpZmYgdmVyd2VpZ2VydC5cbiIgKTsgYnJlYWs7CisJY2FzZSAtMTogd3JpdGUgKCAiS2V5IHVuZ3VlbHRpZyBvZGVyIHNpemVvZihrZXkpIDwgNS5cbiIgKTsgYnJlYWs7CisJY2FzZSAtMjogd3JpdGUgKCAiUVAgdW5ndWVsdGlnIG9kZXIgPCAxLlxuIiApOyBicmVhazsKKwljYXNlIC0zOiB3cml0ZSAoICJYUCB1bmd1ZWx0aWcuXG4iICk7IGJyZWFrOworCWNhc2UgLTQ6IHdyaXRlICggIkZpbGVuYW1lKG4pIHVuZ3VlbHRpZy5cbiIgKTsgYnJlYWs7CisJY2FzZSAtNTogd3JpdGUgKCAiSW5mbyB1bmd1ZWx0aWcuXG4iICk7IGJyZWFrOworCWNhc2UgLTY6IHdyaXRlICggIlN0dWZlIHVuZ3VlbHRpZyBvZGVyIDwgMCBvZGVyID4gMjAuXG4iICk7IGJyZWFrOworCWNhc2UgLTc6IHdyaXRlICggIkFrdGl2LUZsYWcgPCAwIG9kZXIgPiAxLlxuIiApOyBicmVhazsKKwljYXNlIC04OiB3cml0ZSAoICJNYWdpZXJuYW1lIHVuZ3VlbHRpZy5cbiIgKTsgYnJlYWs7CisJY2FzZSAtOTogd3JpdGUgKCAiTWFnaWVybmFtZSBkZXMgd2FydGVuZGVuIE1hZ2llcnMgdW5ndWVsdGlnLlxuIik7IGJyZWFrOworCWNhc2UgLTEwOiB3cml0ZSAoIkZhbHNjaGUgR3J1cHBlbmVpbm9yZG51bmcuXG4iKTsgYnJlYWs7CisJZGVmYXVsdDogd3JpdGUgKCAiRWludHJhZyBlaW5nZWZ1ZWd0LlxuIiApOworICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm47CisgIH0KK30KKworaW50IFJlbW92ZV9RdWVzdCAoIHN0cmluZyBzdHIgKQoreworICBtaXhlZCAqb2xkcXVlc3Q7CisgIHN0cmluZyBuZXdzdHI7CisgIGludCBlcnJzdGF0OworCisgIGlmICggIShzdHI9VUEpICkKKyAgeworICAgIHdyaXRlICggIlN5bnRheDogUmVtb3ZlUSA8bmFtZT5cbiIgKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIExvYWRfTnVtS2V5KCk7CisKKyAgaWYgKCAhKG5ld3N0ciA9IG51bV9rZXlbc3RyKyIiXSkgKQorICAgIG5ld3N0ciA9IHN0cjsKKworICBvbGRxdWVzdCA9IChtaXhlZCAqKSBRTS0+UXVlcnlRdWVzdCAoIG5ld3N0ciApOworCisgIGlmICggIXBvaW50ZXJwICggb2xkcXVlc3QgKSB8fCAhc2l6ZW9mICggb2xkcXVlc3QgKSApCisgIHsKKyAgICB3cml0ZSAoICJLZWluZSBRdWVzdCBkaWVzZXMgTmFtZW5zIGdlZnVuZGVuLlxuIiApOworICAgIHJldHVybiAxOworICB9CisKKyAgZXJyc3RhdCA9IChpbnQpIFFNLT5SZW1vdmVRdWVzdCggbmV3c3RyICk7CisKKyAgc3dpdGNoICggZXJyc3RhdCApCisgIHsKKyAgICBjYXNlICAwOiB3cml0ZSAoICJadWdyaWZmIHZlcndlaWdlcnQuXG4iICk7IGJyZWFrOworICAgIGNhc2UgLTE6IHdyaXRlICggIlBhcmFtZXRlcmZlaGxlci5cbiIgKTsgYnJlYWs7CisgICAgY2FzZSAtMjogd3JpdGUgKCAiUXVlc3QgbmljaHQgZ2VmdW5kZW4uXG4iICk7IGJyZWFrOworICAgIGRlZmF1bHQ6IHdyaXRlICggIlF1ZXN0IGVudGZlcm50LlxuIiApOworICB9CisKKyAgc2F2ZXF1ZXN0ID0gb2xkcXVlc3Q7CisgIHNhdmVrZXkgICA9IG5ld3N0cjsKKworICByZXR1cm4gMTsKK30KKworaW50IENoYW5nZV9RdWVzdCAoIHN0cmluZyBzdHIgKQoreworICBtaXhlZCAqb2xkcXVlc3Q7CisgIHN0cmluZyBuZXdzdHI7CisKKyAgaWYgKCAhKHN0cj1VQSkgKQorICB7CisgICAgd3JpdGUgKCAiU3ludGF4OiBDaGFuZ2VRIDxxdWVzdD5cbiIgKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIExvYWRfTnVtS2V5KCk7CisKKyAgaWYgKCAhKG5ld3N0ciA9IG51bV9rZXlbc3RyKyIiXSkgKQorICAgIG5ld3N0ciA9IHN0cjsKKworICBvbGRxdWVzdCA9IChtaXhlZCAqKSBRTS0+UXVlcnlRdWVzdCAoIG5ld3N0ciApOworCisgIGlmICggIXBvaW50ZXJwKCBvbGRxdWVzdCApIHx8ICFzaXplb2YgKCBvbGRxdWVzdCApICkKKyAgeworICAgIHdyaXRlICggIktlaW5lIFF1ZXN0IGRpZXNlcyBOYW1lbnMgZ2VmdW5kZW4uXG4iICk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBkb19jaGFuZ2UgPSAxOworICBjaGFuZ2VrZXkgPSBuZXdzdHI7CisgIHNhdmVrZXkgPSBuZXdzdHI7CisgIHNhdmVxdWVzdCA9IG9sZHF1ZXN0OworCisgIHdyaXRlICggIkFrdHVlbGxlciBFaW50cmFnOlxuIik7CisgIHdyaXRlICggIktleSAgICAgICAgICAgICAgOiAiK25ld3N0cisiXG4iICk7CisgIHdyaXRlICggIlB1bmt0ZSAgICAgICAgICAgOiAiK29sZHF1ZXN0W1FfUVBdKyJcbiIgKTsKKyAgd3JpdGUgKCAiRXJmYWhydW5nICAgICAgICA6ICIrb2xkcXVlc3RbUV9YUF0rIlxuIiApOworICB3cml0ZSAoICJGaWxlbmFtZW4gICAgICAgIDogIitpbXBsb2RlKG9sZHF1ZXN0W1FfQUxMT1dFRF0sIiwiKSsiXG4iICk7CisgIHdyaXRlICggIkluZm8gICAgICAgICAgICAgOiAiK29sZHF1ZXN0W1FfSElOVF0rIlxuIiApOworICB3cml0ZSAoICJTdHVmZSAgICAgICAgICAgIDogIitvbGRxdWVzdFtRX0RJRkZdKyJcbiIgKTsKKyAgd3JpdGUgKCAiS2xhc3NlICAgICAgICAgICA6ICIrUUNMQVNTX1NUQVJTKG9sZHF1ZXN0W1FfQ0xBU1NdKSsiXG4iICk7CisgIHdyaXRlICggIkF0dHJpYnV0ICAgICAgICAgOiAiK1FBVFRSX1NUUklOR1Nbb2xkcXVlc3RbUV9BVFRSXV0rIlxuIiApOworICB3cml0ZSAoICJNYWdpZXIgICAgICAgICAgIDogIitjYXBpdGFsaXplKG9sZHF1ZXN0W1FfV0laXSkrIlxuIiApOworICB3cml0ZSAoICJXYXJ0ZW5kZXIgTWFnaWVyIDogIitjYXBpdGFsaXplKG9sZHF1ZXN0W1FfU0NORFdJWl0pKyJcbiIgKTsKKworCisgIHdyaXRlICggIlxuTmV1ZSBRdWVzdDogICAgIChtaXQgJy4nIG9kZXIgJ35xJyBrYW5uIGFiZ2Vicm9jaGVuIHdlcmRlbilcbiIgKTsKKyAgd3JpdGUgKCBzcHJpbnRmKCJLZXkgWyVzXTpcbiIsIHNhdmVrZXkpICk7CisgIGlucHV0X3RvICggIlJlYWROZXdRdWVzdCIgKTsKKworICByZXR1cm4gMTsKK30KKworaW50IFJlc3RvcmVfUXVlc3QgKCBzdHJpbmcgc3RyICkKK3sKKyAgaW50IGVycnN0YXQ7CisKKyAgaWYgKCAhc2F2ZWtleSB8fCAhc2l6ZW9mKHNhdmVrZXkpICkKKyAgeworICAgIHdyaXRlICggIlxuVHV0IG1pciBsZWlkIVxuIiApOworICAgIHdyaXRlICggIk5pY2h0cyB6dW0gUmVzdGF1cmllcmVuIGdlZnVuZGVuIC4uLlxuIiApOworICAgIHJldHVybiAxOworICB9CisKKyAgZXJyc3RhdCA9IAorCShpbnQpUU0tPkFkZFF1ZXN0KCBzYXZla2V5LCAoaW50KSBzYXZlcXVlc3RbMF0sIChpbnQpIHNhdmVxdWVzdFsxXSwKKwkJCSAgKHN0cmluZyAqKSBzYXZlcXVlc3RbMl0sIChzdHJpbmcpIHNhdmVxdWVzdFszXSwKKwkJCSAgKGludCkgc2F2ZXF1ZXN0WzRdLCAoaW50KSBzYXZlcXVlc3RbNV0sCisJCQkgIChzdHJpbmcpIHNhdmVxdWVzdFs2XSwgKGludCkgc2F2ZXF1ZXN0WzddLAorCQkJICAoc3RyaW5nKSBzYXZlcXVlc3RbOF0gKTsKKworICBzd2l0Y2ggKCBlcnJzdGF0ICkKKyAgeworICAgIGNhc2UgIDA6IHdyaXRlICggIlp1Z3JpZmYgdmVyd2VpZ2VydC5cbiIgKTsgYnJlYWs7CisgICAgY2FzZSAtMTogd3JpdGUgKCAiS2V5IHVuZ3VlbHRpZyBvZGVyIHNpemVvZihrZXkpIDwgNS5cbiIgKTsgYnJlYWs7CisgICAgY2FzZSAtMjogd3JpdGUgKCAiUVAgdW5ndWVsdGlnIG9kZXIgPCAxLlxuIiApOyBicmVhazsKKyAgICBjYXNlIC0zOiB3cml0ZSAoICJYUCB1bmd1ZWx0aWcuXG4iICk7IGJyZWFrOworICAgIGNhc2UgLTQ6IHdyaXRlICggIkZpbGVuYW1lKG4pIHVuZ3VlbHRpZy5cbiIgKTsgYnJlYWs7CisgICAgY2FzZSAtNTogd3JpdGUgKCAiSW5mbyB1bmd1ZWx0aWcuXG4iICk7IGJyZWFrOworICAgIGNhc2UgLTY6IHdyaXRlICggIlN0dWZlIHVuZ3VlbHRpZyBvZGVyIDwgMCBvZGVyID4gMjAuXG4iICk7IGJyZWFrOworICAgIGNhc2UgLTc6IHdyaXRlICggIkFrdGl2LUZsYWcgPCAwIG9kZXIgPiAxLlxuIiApOyBicmVhazsKKyAgICBjYXNlIC04OiB3cml0ZSAoICJNYWdpZXJuYW1lIHVuZ3VlbHRpZy5cbiIgKTsgYnJlYWs7CisgICAgY2FzZSAtOTogd3JpdGUgKCAiTWFnaWVybmFtZSB1bmd1ZWx0aWcuXG4iKTsgYnJlYWs7CisgICAgY2FzZSAtMTA6IHdyaXRlICgiVW5ndWVsdGlnZSBHcnVwcGVubnVtbWVyLlxuIik7IGJyZWFrOworICAgIGRlZmF1bHQ6IHdyaXRlICggIiciK3NhdmVrZXkrIicgcmVzdGF1cmllcnQuXG4iICk7CisgIH0KKyAgc2F2ZWtleSA9ICIiOworICByZXR1cm4gMTsKK30KKworaW50IFNldF9RdWVzdCAoIHN0cmluZyBzdHIgKQoreworICBzdHJpbmcgcXVlc3QsIHBsYXllciwgbmV3cXVlc3Q7CisgIGludCBjcmVhdGVkOworICBvYmplY3Qgb2I7CisKKyAgaWYgKCAhKHN0cj1VQSkgfHwgc3NjYW5mKCBzdHIsICIlcyAlcyIsIHBsYXllciwgcXVlc3QgKSAhPSAyICkKKyAgeworICAgIHdyaXRlICggIlN5bnRheDogU2V0USA8cGxheWVyPiA8cXVlc3Q+XG4iICk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBjcmVhdGVkPTA7CisgIExvYWRfTnVtS2V5KCk7CisKKyAgaWYgKCAhKG5ld3F1ZXN0ID0gbnVtX2tleVtxdWVzdCsiIl0pICkKKyAgICBuZXdxdWVzdCA9IHF1ZXN0OworCisgIG9iPWZpbmRfcGxheWVyKHBsYXllcik7CisgIGlmKCFvYikKKyAgeworICAgIG9iPWZpbmRfbmV0ZGVhZChwbGF5ZXIpOworICAgIGlmKCFvYikKKyAgICB7CisgICAgICBjcmVhdGVkPTE7CisgICAgICBvYj1fX2NyZWF0ZV9wbGF5ZXJfZHVtbXkocGxheWVyKTsKKyAgICB9CisgIH0KKyAgaWYoIW9iKQorICB7CisgICAgd3JpdGUoIktlaW4gc29sY2hlciBTcGllbGVyIGdlZnVuZGVuLlxuISIpOworICAgIHJldHVybiAxOworICB9CisgIAorICB3cml0ZShFUlJOT18yX1NUUklORygiR1EiLChpbnQpb2ItPkdpdmVRdWVzdChuZXdxdWVzdCwiX19zaWxlbnRfXyIpKSsiXG4iKTsKKyAgaWYoY3JlYXRlZCkKKyAgeworICAgIG9iLT5zYXZlX21lKDApOworICAgIGlmKCEob2ItPnJlbW92ZSgpKSkKKyAgICB7CisgICAgCWRlc3RydWN0KG9iKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBEZWxfUXVlc3QgKCBzdHJpbmcgc3RyICkKK3sKKyAgc3RyaW5nIHF1ZXN0LCBwbGF5ZXIsIG5ld3F1ZXN0OworICBpbnQgY3JlYXRlZDsKKyAgb2JqZWN0IG9iOworCisgIGlmICggIShzdHI9VUEpIHx8IHNzY2FuZiggc3RyLCAiJXMgJXMiLCBwbGF5ZXIsIHF1ZXN0ICkgIT0gMiApCisgIHsKKyAgICB3cml0ZSAoICJTeW50YXg6IERlbFEgPHBsYXllcj4gPHF1ZXN0PlxuIiApOworICAgIHJldHVybiAxOworICB9CisKKyAgTG9hZF9OdW1LZXkoKTsKKworICBpZiAoICEobmV3cXVlc3QgPSBudW1fa2V5W3F1ZXN0KyIiXSkgKQorICAgIG5ld3F1ZXN0ID0gcXVlc3Q7CisKKyAgY3JlYXRlZD0wOworICBvYj1maW5kX3BsYXllcihwbGF5ZXIpOworICBpZighb2IpCisgIHsKKyAgICBvYj1maW5kX25ldGRlYWQocGxheWVyKTsKKyAgICBpZighb2IpCisgICAgeworICAgICAgY3JlYXRlZD0xOworICAgICAgb2I9X19jcmVhdGVfcGxheWVyX2R1bW15KHBsYXllcik7CisgICAgfQorICB9CisgIGlmKCFvYikKKyAgeworICAgIHdyaXRlKCJLZWluIHNvbGNoZXIgU3BpZWxlciBnZWZ1bmRlbi5cbiEiKTsKKyAgICByZXR1cm4gMTsKKyAgfQorICAKKyAgd3JpdGUoRVJSTk9fMl9TVFJJTkcoIkRRIiwoaW50KSBvYi0+RGVsZXRlUXVlc3QgKCBuZXdxdWVzdCApKSsiXG4iKTsKKyAgaWYoY3JlYXRlZCkKKyAgeworICAgIG9iLT5zYXZlX21lKDApOworICAgIGlmKCEob2ItPnJlbW92ZSgpKSkKKyAgICB7CisgICAgCWRlc3RydWN0KG9iKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBRdWVyeV9RdWVzdCAoIHN0cmluZyBzdHIgKQoreworICBtaXhlZCAqcXVlc3Q7CisgIHN0cmluZyBuZXdzdHI7CisgIGludCBpOworCisgIGlmICggIShzdHI9VUEpICkKKyAgeworICAgIHdyaXRlICggIlN5bnRheDogUXVlcnlRIDxxdWVzdD5cbiIgKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIExvYWRfTnVtS2V5KCk7CisKKyAgaWYgKCAhKG5ld3N0ciA9IG51bV9rZXlbc3RyKyIiXSkgKQorCW5ld3N0ciA9IHN0cjsKKworICBxdWVzdCA9IChtaXhlZCAqKSBRTS0+UXVlcnlRdWVzdCggbmV3c3RyICk7CisKKyAgaWYgKCAhcG9pbnRlcnAoIHF1ZXN0ICkgfHwgIXNpemVvZiAoIHF1ZXN0ICkgKQorICB7CisgICAgd3JpdGUgKCAiS2VpbmUgUXVlc3QgZGllc2VzIE5hbWVucyBnZWZ1bmRlbi5cbiIgKTsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHdyaXRlICggIkFrdHVlbGxlciBFaW50cmFnOlxuIik7CisgIHdyaXRlICggIktleSAgICAgICAgICAgICAgOiAiK25ld3N0ciApOworICBpZihxdWVzdFtRX0FDVElWRV0pCisgICAgd3JpdGUgKCIgKGFrdGl2aWVydClcbiIpOworICBlbHNlCisgICAgd3JpdGUgKCIgKGRlYWt0aXZpZXJ0KVxuIik7CisgIHdyaXRlICggIlB1bmt0ZSAgICAgICAgICAgOiAiK3F1ZXN0W1FfUVBdKyJcbiIgKTsKKyAgd3JpdGUgKCAiRXJmYWhydW5nICAgICAgICA6ICIrcXVlc3RbUV9YUF0rIlxuIiApOworICB3cml0ZSAoIGJyZWFrX3N0cmluZyAoIGltcGxvZGUoIHF1ZXN0W1FfQUxMT1dFRF0sICIgIiApLCA2NSwgIkZpbGVuYW1lbgkgOiAiICkgKTsKKyAgd3JpdGUgKCBicmVha19zdHJpbmcgKCBxdWVzdFtRX0hJTlRdLCA2NSwgIkluZm8gICAgICAgICAgICAgOiAiICkgKTsKKyAgd3JpdGUgKCAiU3R1ZmUgICAgICAgICAgICA6ICIrcXVlc3RbUV9ESUZGXSsiXG4iICk7CisgIHByaW50ZigiU3R1ZmUgKGF2ZykgICAgICA6ICUuMmYgKCVkKVxuIiwgcXVlc3RbUV9BVkVSQUdFXVswXSwgCisgICAgICAgIHF1ZXN0W1FfQVZFUkFHRV1bMV0pOworICB3cml0ZSAoICJLbGFzc2UgICAgICAgICAgIDogIisgUUNMQVNTX1NUQVJTKHF1ZXN0W1FfQ0xBU1NdKSsiXG4iKTsKKyAgd3JpdGUgKCAiQXR0cmlidXRlICAgICAgICA6ICIrIFFBVFRSX1NUUklOR1NbcXVlc3RbUV9BVFRSXV0rIlxuIik7CisgIHdyaXRlICggIk1hZ2llciAgICAgICAgICAgOiAiK2NhcGl0YWxpemUocXVlc3RbUV9XSVpdKSsiXG4iICk7CisgIHdyaXRlICggIldhcnRlbmRlciBNYWdpZXIgOiAiK2NhcGl0YWxpemUocXVlc3RbUV9TQ05EV0laXSkrIlxuIik7CisgIHJldHVybiAxOworfQorCitpbnQgUXVlcnlfS2V5cyAoIHN0cmluZyBzdHIgKQoreworICBzdHJpbmcgKmtleXMsIGFjdGl2ZTsKKyAgbWl4ZWQgKnF1ZXN0OworICBpbnQgaTsKKworICBpZiAoICEoa2V5cyA9IChzdHJpbmcgKikgUU0tPlF1ZXJ5QWxsS2V5cygpKSApCisgICAgcmV0dXJuIDE7CisKKyAgd3JpdGUgKCAiXG4iICk7CisgIGtleXM9c29ydF9hcnJheShrZXlzLCMnPik7Ly8nKQorICBmb3IgKCBpID0gMDsgaSA8IHNpemVvZihrZXlzKTsgaSsrICkKKyAgeworICAgIHF1ZXN0ID0gKG1peGVkICopIFFNLT5RdWVyeVF1ZXN0KGtleXNbaV0pOworICAgIGlmKHF1ZXN0WzZdKQorICAgICAgYWN0aXZlPSIqIjsKKyAgICBlbHNlCisgICAgICBhY3RpdmU9IiAiOworICAgIHdyaXRlKHNwcmludGYoIiUyZCVzICUtMzNzJXMiLGkrMSxxdWVzdFs2XT8iKiI6IiAiLGtleXNbaV0sCisJCSAgICAgICEoaSUyKT8iICI6IlxuIikpOworICB9CisgIGlmKGklMikKKyAgICB3cml0ZSgiXG4iKTsKKworICByZXR1cm4gMTsKK30KKworaW50IFF1ZXJ5X1F1ZXN0cyAoIHN0cmluZyBzdHIgKQoreworICBtaXhlZCAqcXVlc3Q7CisgIHN0cmluZyAqa2V5cywgcnN0cjsKKyAgaW50IGk7CisKKyAgaWYgKCAhKGtleXMgPSAobWl4ZWQgKikgUU0tPlF1ZXJ5QWxsS2V5cygpKSApCisgICAgcmV0dXJuIDE7CisKKyAga2V5cz1zb3J0X2FycmF5KGtleXMsIyc+KTsvLycpCisgIGZvciAoIGkgPSAwLCByc3RyID0gIiI7IGkgPCBzaXplb2Yoa2V5cyk7IGkrKyApCisgIHsKKyAgICBxdWVzdCA9IChtaXhlZCAqKSBRTS0+UXVlcnlRdWVzdChrZXlzW2ldKTsKKyAgICAgIHdyaXRlICggIlxuS2V5ICAgICAgICAgICAgICA6ICIra2V5c1tpXSApOworICBpZihxdWVzdFtRX0FDVElWRV0pCisgICAgd3JpdGUgKCIgKGFrdGl2aWVydClcbiIpOworICBlbHNlCisgICAgd3JpdGUgKCIgKGRlYWt0aXZpZXJ0KVxuIik7CisgIHdyaXRlICggIlB1bmt0ZSAgICAgICAgICAgOiAiK3F1ZXN0W1FfUVBdKyJcbiIgKTsKKyAgd3JpdGUgKCAiRXJmYWhydW5nICAgICAgICA6ICIrcXVlc3RbUV9YUF0rIlxuIiApOworICB3cml0ZSAoIGJyZWFrX3N0cmluZyAoIGltcGxvZGUoIHF1ZXN0W1FfQUxMT1dFRF0sICIgIiApLCA3OCwgIkZpbGVuYW1lbgkgOiAiICkgKTsKKyAgd3JpdGUgKCBicmVha19zdHJpbmcgKCBxdWVzdFtRX0hJTlRdLCA3OCwgIkluZm8JCSA6ICIgKSApOworICB3cml0ZSAoICJTdHVmZSAgICAgICAgICAgIDogIitxdWVzdFtRX0RJRkZdKyJcbiIgKTsKKyAgd3JpdGUgKCAiS2xhc3NlICAgICAgICAgICA6ICIrIFFDTEFTU19TVEFSUyhxdWVzdFtRX0NMQVNTXSkrIlxuIik7CisgIHdyaXRlICggIkF0dHJpYnV0ZSAgICAgICAgOiAiKyBRQVRUUl9TVFJJTkdTW3F1ZXN0W1FfQVRUUl1dKyJcbiIpOworICB3cml0ZSAoICJNYWdpZXIgICAgICAgICAgIDogIitjYXBpdGFsaXplKHF1ZXN0WzddKSsiXG4iICk7CisgIHdyaXRlICggIldhcnRlbmRlciBNYWdpZXIgOiAiK2NhcGl0YWxpemUocXVlc3RbOF0pKyJcbiIpOworICB9CisgIE1vcmUoIHJzdHIsIDAgKTsKKyAgcmV0dXJuIDE7Cit9CisKK2ludCBBY3RpdmF0ZVF1ZXN0KCBzdHJpbmcgc3RyICkKK3sKKyAgbWl4ZWQgKnF1ZXN0OworICBzdHJpbmcgbmV3c3RyOworICBpbnQgZXJyc3RhdDsKKworICBpZiAoICEoc3RyPVVBKSApCisgIHsKKyAgICB3cml0ZSAoICJTeW50YXg6IEFjdGlWYXRlUSA8cXVlc3Q+XG4iICk7CisgICAgcmV0dXJuIDE7CisgIH0KKworICBMb2FkX051bUtleSgpOworCisgIGlmICggIShuZXdzdHIgPSBudW1fa2V5W3N0cisiIl0pICkKKwluZXdzdHIgPSBzdHI7CisKKyAgc3dpdGNoKCBRTS0+U2V0QWN0aXZlKCBuZXdzdHIsIDEgKSApCisgIHsKKyAgICBjYXNlIC0zOiB3cml0ZSAoICJVbmd1ZWx0aWdlciBGbGFnLlxuIiApOyBicmVhazsKKyAgICBjYXNlIC0yOiB3cml0ZSAoICJRdWVzdCB3YXIgYmVyZWl0cyBha3RpdmllcnQuXG4iICk7IGJyZWFrOworICAgIGNhc2UgLTE6IHdyaXRlICggIktlaW5lIFF1ZXN0IGRpZXNlcyBOYW1lbnMgZ2VmdW5kZW4uXG4iICk7IGJyZWFrOworICAgIGNhc2UgIDA6IHdyaXRlICggIlp1Z3JpZmYgdmVyd2VpZ2VydFxuIiApOyBicmVhazsKKyAgICBjYXNlICAxOiB3cml0ZSAoICJRdWVzdCAnIituZXdzdHIrIicgYWt0aXZpZXJ0LlxuIiApOyBicmVhazsKKyAgICBkZWZhdWx0OiB3cml0ZSAoICJ1bmJla2FubnRlciBGZWhsZXJzdGF0dXMuXG4iICk7CisgIH0KKyAgcmV0dXJuIDE7Cit9CisKK2ludCBEZWFjdGl2YXRlUXVlc3QoIHN0cmluZyBzdHIgKQoreworICBtaXhlZCAqcXVlc3Q7CisgIHN0cmluZyBuZXdzdHI7CisgIGludCBlcnJzdGF0OworCisgIGlmICggIShzdHI9VUEpICkKKyAgeworICAgIHdyaXRlICggIlN5bnRheDogRGVhY3RpVmF0ZVEgPHF1ZXN0PlxuIiApOworICAgIHJldHVybiAxOworICB9CisKKyAgTG9hZF9OdW1LZXkoKTsKKworICBpZiAoICEobmV3c3RyID0gbnVtX2tleVtzdHIrIiJdKSApCisJbmV3c3RyID0gc3RyOworCisgIHN3aXRjaCggUU0tPlNldEFjdGl2ZSggbmV3c3RyLCAwICkgKQorICB7CisgICAgY2FzZSAtMzogd3JpdGUgKCAiVW5ndWVsdGlnZXIgRmxhZy5cbiIgKTsgYnJlYWs7CisgICAgY2FzZSAtMjogd3JpdGUgKCAiUXVlc3Qgd2FyIGJlcmVpdHMgZGVha3RpdmllcnQuXG4iICk7IGJyZWFrOworICAgIGNhc2UgLTE6IHdyaXRlICggIktlaW5lIFF1ZXN0IGRpZXNlcyBOYW1lbnMgZ2VmdW5kZW4uXG4iICk7IGJyZWFrOworICAgIGNhc2UgIDA6IHdyaXRlICggIlp1Z3JpZmYgdmVyd2VpZ2VydFxuIiApOyBicmVhazsKKyAgICBjYXNlICAxOiB3cml0ZSAoICJRdWVzdCAnIituZXdzdHIrIicgZGVha3RpdmllcnQuXG4iICk7IGJyZWFrOworICAgIGRlZmF1bHQ6IHdyaXRlICggInVuYmVrYW5udGVyIEZlaGxlcnN0YXR1cy5cbiIgKTsKKyAgfQorICByZXR1cm4gMTsKK30KKworCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2FkbS9tayBiL29iai90b29scy90ZWxsZXIvYWRtL21rCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjU3OTgyNjQKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2FkbS9tawpAQCAtMCwwICsxLDI1IEBACisjIS91c3IvbG9jYWwvYmluL3BlcmwKKworJG1vZGUgPSAwOworJFQxPSJtaXhlZHxmbG9hdHxpbnR8c3RyaW5nfG9iamVjdHx2b2lkfHF1b3RlZF9hcnJheXxzeW1ib2x8Y2xvc3VyZXxtYXBwaW5nIjsKKyRUMj0ibWl4ZWQgXCp8ZmxvYXQgXCp8aW50IFwqfHN0cmluZyBcKnxvYmplY3QgXCp8dm9pZCBcKnxxdW90ZWRfYXJyYXkgXCp8c3ltYm9sIFwqfGNsb3N1cmUgXCp8bWl4ZWQgXCYiOworJFRZUEVTPSJcKCRUMXwkVDJcKSI7CisKK3doaWxlKCA8PiApIHsKKwljaG9wICRfOworCWlmKCAkbW9kZSA9PSAwICYmICRfIGVxICIlZWZ1bnMiICkgeworCQkkbW9kZSA9IDE7CisJfSBlbHNpZiggJG1vZGUgPT0gMSAmJiAkXyBlcSAiJXhjb2RlcyIgKSB7CisJCSRtb2RlID0gMjsKKwl9IGVsc2lmKCAkXyA9fiAiI2VuZGlmIiAmJiAkbW9kZSA9PSAzICkgeworCQkkbW9kZSA9IDE7CisJfSBlbHNpZiggJG1vZGUgPT0gMSApIHsKKwkJaWYoICRfID1+IG0iI2lmbmRlZiBOQVRJVkUiIHx8ICRfID1+IG0iI2lmZGVmIE1BTExPQ19tYWxsb2MiICkgeworCQkJJG1vZGUgPSAzOworCQl9IGVsc2lmKCAkXyBuZSAiIiAmJiAkXyAhfiBtIl4uXCoiICYmICRfICF+ICJeIyIgKSB7CisJCQlzL2RlZmF1bHQ6IFx3Ki8vOworCQkJcy8kVFlQRVMvbWl4ZWQvZzsKKwkJCXByaW50ICIkX1xuIjsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvYXJyYXkgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2FycmF5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyNTMwMDAKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2FycmF5CkBAIC0wLDAgKzEsMTkgQEAKK0JFRkVITDoKKwlhcnJheSwgYXJyCisKK0FSR1VNRU5URToKKwlBbGxlIFN0YWNrZWxlbWVudGUgYmlzIHp1bSBsZXR6dGVuIExvY2suCisKK0ZVTktUSU9OOgorCUFsbGUgRWxlbWVudGUgd2VyZGVuIHp1IGVpbmVtIEFycmF5IHp1c2FtbWVuZ2VmdWVndC4gRGVyIExvY2sKKwl3aXJkIGVudGZlcm50IHVuZCBkYXMgQXJyYXkgd2llZGVyIGF1ZiBkZW4gU3RhY2sgZ2VsZWd0LgorCitCRUlTUElFTEU6CisJLG1lICJ6YXBfbXNnIiwgIkR1IGtvY2hzdCBAQHdlbkBALlxuIiAiQEBpY2hAQCBrb2NodCBAQHdlbkBALlxuIgorCSJAQGljaEBAIGtvY2h0IERpY2guXG4iIGFycmF5ICFTZXRQcm9wCisJCVdhbmRlbHQgZGllIGRyZWkgU3RyaW5ncyBpbiBlaW4gQXJyYXkgdW0uIERhbmFjaCB3aXJkIGltCisJCVNwaWVsZXIgZGllIFphcHAtTWVsZHVuZyBuZXUgZ2VzZXR6dC4gRGFzIG9iaWdlIG11c3MKKwkJbmF0dWVybGljaCBpbiBlaW5lciBaZWlsZSBlaW5nZWdlYmVuIHdlcmRlbi4KKworU1BJRUhFIEFVQ0g6CisJInNwbGl0IiwgImxvY2siCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2NhbGwgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2NhbGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU5NzI5OQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvY2FsbApAQCAtMCwwICsxLDI2IEBACitCRUZFSEw6CisJJ2Z1bmt0aW9uLCAnJ2Z1bmt0aW9uIG9kZXIKKwktPmZ1bmt0aW9uLCAtLT5mdW5rdGlvbgorCitBUkdVTUVOVEU6CisJQWxsZSBTdGFja2VsZW1lbnRlIGJpcyB6dW0gbGV0enRlbiBMb2NrLgorCWZ1bmt0aW9uIC0tIE5hbWUgZWluZXIgbGZ1bi4KKworRlVOS1RJT046CisJUnVmZSBpbiBkZW0gT2JqZWt0IG9iZXJoYWxiIGRlcyBsZXR6dGVuIExvY2tzLCBkaWUgYW5nZWdlYmVuZQorCUZ1bmt0aW9uIGF1ZiB1bmQgdWViZXJnaWIgZGllIGZvbGdlbmRlbiBFbGVtZW50ZSBkZXMgU3RhY2tzCisJKGJpcyBoaW5hdWYgenVtIFRPUykgYWxzIEFyZ3VtZW50ZS4gRW50ZmVybmUgZGVuIExvY2suCisJV2VubiBtaXQgZGllIEZ1bmt0aW9uIG1pdCB6d2VpIEFwb3N0cm9waGVuIG9kZXIgendlaSBNaW51c3plaWNoZW4KKwlnZXJ1ZmVuIHd1cmRlLCBsZWdlIGRhcyBFcmdlYm5pcyBhdWYgZGVuIFN0YWNrLiAoQmVpIGVpbmZhY2hlbQorCUFwb3N0cm9waCBiencuIE1pbnVzemVpY2hlbiBhbHNvIG5pY2h0LikKKworQkVJU1BJRUw6CisJLG1lICJkYXMgR3JhdWVuIGFtIE1vcmdlbiIgJ3NldF90aXRsZQorCUVuc3ByaWNodDoKKwljYWxsX290aGVyKCB0aGlzX3BsYXllcigpLCAic2V0X3RpdGxlIiwgImRhcyBHcmF1ZW4gYW0gTW9yZ2VuIiApOworCitXQVJOVU5HOgorCU1hbiBzb2xsdGUgdm9yaGVyIG5hY2hzY2hhdWVuLCBvYiBuaWNodCBub2NoIGV0d2FzIGF1ZiBkZW0gU3RhY2sKKwlsaWVndCwgZGVubiB3ZW5uIGtlaW4gTG9jayBkYSBpc3QsIHd1ZXJkZSBkaWUgRnVua3Rpb24gZGFyaW4KKwlhdWZnZXJ1ZmVuIHdlcmRlbiAobWl0IG1lIHVuZCAiZGFzIEdyYXVlbiBhbSBNb3JnZW4iIGFscyBBcmd1bWVudGUpLAorCURlc2hhbGIgYmVzc2VyIHNvOiAsLG1lICJkYXMgR3JhdWVuIGFtIE1vcmdlbiIgJydzZXRfdGl0bGUKZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvY2FsbGVmdW4gYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2NhbGxlZnVuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxZmRlMmEKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2NhbGxlZnVuCkBAIC0wLDAgKzEsMjUgQEAKK0JFRkVITDoKKwlgZnVua3Rpb24sIGBgZnVua3Rpb24gb2RlcgorCS0qZnVua3Rpb24sIC0tKmZ1bmt0aW9uCisKK0FSR1VNRU5URToKKwlBbGxlIFN0YWNrZWxlbWVudGUgYmlzIHp1bSBsZXR6dGVuIExvY2suCisJZnVua3Rpb24gLS0gTmFtZSBlaW5lciBlZnVuLgorCitGVU5LVElPTjoKKwlSdWZlIGRpZSBhbmdlZ2ViZW5lIGVmdW4gYXVmLCB1bmQgdWViZXJnZWJlIGFsbGUgU3RhY2tlbGVtZW50ZQorCWJpcyB6dW0gbGV0enRlbiBMb2NrIGFscyBBcmd1bWVudGUuIEVudGZlcm5lIGRlbiBMb2NrLgorCVdlbm4gZGllIGVmdW4gbWl0IGRvcHBlbHRlbiBCYWNrcXVvdGVzIG9kZXIgTWludXN6ZWljaGVuICgnYGAnIG9kZXIKKwknLS0qJykgYXVmZ2VydWZlbiB3dXJkZSwgbGVnZSBkYXMgRXJnZWJuaXMgYXVmIGRlbiBTdGFjay4gKEJlaQorCWVpbmZhY2hlbSAnYCcgYWxzbyBuaWNodC4pCisKK0JFSVNQSUVMOgorCSxtZSBgZW52aXJvbm1lbnQKKwlFbnNwcmljaHQ6CisJZW52aXJvbm1lbnQoIHRoaXNfcGxheWVyKCkgKTsKKworV0FSTlVORzoKKwlNYW4gc29sbHRlIHZvcmhlciBuYWNoc2NoYXVlbiwgb2IgbmljaHQgbm9jaCBldHdhcyBhdWYgZGVtIFN0YWNrCisJbGllZ3QsIGRlbm4gd2VubiBrZWluIExvY2sgZGEgaXN0LCB3ZXJkZW4genVhZXR6bGljaCBub2NoCisJdW5nZXd1bnNjaHRlIEFyZ3VtZW50ZSBtaXR1ZWJlcmdlYmVuLgorCURlc2hhbGIgYmVzc2VyIHNvOiAsLG1lIGBgZW52aXJvbm1lbnQKZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvY2FsbG91dHMgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2NhbGxvdXRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MzA0MmMKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2NhbGxvdXRzCkBAIC0wLDAgKzEsMjQgQEAKK0JFRkVITDoKKwljYWxsb3V0cworCWNhbGxvdXRzIQorCitBUkdVTUVOVEU6CisJY2FsbG91dHM6IFRPUyBTdHJpbmcsIG5hY2ggZGVtIGdlc3VjaHQgd2lyZC4KKwljYWxsb3V0cyE6IGtlaW5lCisKK0ZVTktUSU9OOgorCUdpYiBlaW5lIExpc3RlIGFsbGVyIGltIFNwaWVsIGxhdWZlbmRlbiBjYWxsX291dHMgYXVzLiBFaW4gY2FsbF9vdXQKKwl3aXJkIGluIGZvbGdlbmRlbSBGb3JtYXQgYXVzZ2VnZWJlbjoKKwkxLikgWmVpdCwgYmlzIHp1bSBBdWZydWYgZGVyIEZ1bmt0aW9uLgorCTIuKSBPYmpla3QsIGluIGRlbSBkaWUgRnVua3Rpb24gYXVmZ2VydWZlbiB3aXJkLgorCTMuKSBOYW1lIGRlciBGdW5rdGlvbi4KKwk0LikgQXJndW1lbnQsIGRhcyBkZW0gY2FsbF9vdXQgdWViZXJnZWJlbiB3aXJkLgorCisJV2lyZCBkZXIgQmVmZWhsIG9obmUgUnVmemVpaGVuIGVpbmdlZ2ViZW4sIHNvIHdlcmRlbiBudXIgZGllCisJTWVsZHVuZ2VuIGF1c2dlZ2ViZW4sIGRpZSBpbiBkZW4gZXJzdGVuIGRyZWkgKCEpIEFyZ3VtZW50ZW4KKwlkZW4gYW5nZWdlYmVuZW4gU3RyaW5nIGVudGhhbHRlbi4KKworQkVJU1BJRUw6CisJLCJnbyIgY2FsbG91dHMKKwlHaWJ0IGFsbGUgTW9uc3RlciBhdXMsIGRpZSBtaXR0ZWxzIGRlciBGdW5rdGlvbiAiZ28iIHVtaGVybGF1ZmVuLgorCShFcyBnaWJ0IGFiZXIgYXVjaCB3ZWxjaGUsIGRpZSBtaXR0ZWxzICJXYWxrIiBsYXVmZW4uIDotKQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9jbGVhbm9mIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9jbGVhbm9mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1NTdjZjEKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2NsZWFub2YKQEAgLTAsMCArMSwxNiBAQAorQkVGRUhMOgorCWNsZWFub2YsIGNsbm9mCisKK0FSR1VNRU5URToKKwlEaWUgendlaSBvYmVyc3RlbiBTdGFja2VsZW1lbnRlLgorCitGVU5LVElPTjoKKwlaZXJzdG9lcmUgYWxsZSBPYmpla3RlIGluIGRlbSB6d2VpdGVuIE9iamVrdCBhdWYgZGVtIFN0YWNrLAorCWRpZSBzaWNoIHVudGVyIGRlbSBOYW1lbiwgZGVyIGluIFRPUyBzdGVodCwgYW5nZXNwcm9jaGVuIGZ1ZWhsZW4uCisJRGllIE9iamVrdGUgd2VyZGVuIGFiZXIgbnVyIHJlbW92ZWQsIGRhcyBkYXMgZGVyIGVtcGZvaGxlbmUgV2VnCisJaXN0LCBPYmpla3RlIHp1IHplcnN0b2VyZW4uIFNvbGxlbiBkaWUgT2JqZWt0ZSB3aXJrbGljaCBoYXJ0IHplcnN0b2VydAorCXdlcmRlbiwgc28ga2FubiBtYW4gZWluIFJ1ZnplaWNoZW4gYW4gZGVuIEJlZmVobCBhbmhhZW5nZW4uCisJKEFsc28gJ2NsZWFub2YhJy4pCisKK1NJRUhFIEFVQ0g6CisJInJlbW92ZSIsICJkZXN0cnVjdCIKZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvY2xlYXIgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2NsZWFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhY2I1ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2NsZWFyCkBAIC0wLDAgKzEsOSBAQAorQkVGRUhMOgorCWNsZWFyLCBjbHIKKworQVJHVU1FTlRFOgorCVNUQUNLCisKK0ZVTktUSU9OOgorCUxvZXNjaGUgZGVuIGdhbnplbiBTdGFjay4gRGllIE9iamVrdGUgYXVmIGRlbSBTdGFjayB3ZXJkZW4gYWJlcgorCW5pY2h0IGRlc3RydWN0ZWQuCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2Nsb25lIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9jbG9uZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzU2MjBiCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9jbG9uZQpAQCAtMCwwICsxLDcgQEAKK0JFRkVITDoKKworQVJHVU1FTlRFOgorCitGVU5LVElPTjoKKworQkVJU1BJRUxFOgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9kZXN0cnVjdCBiL29iai90b29scy90ZWxsZXIvaGlsZmUvZGVzdHJ1Y3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRlZDIzNAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvZGVzdHJ1Y3QKQEAgLTAsMCArMSwxNCBAQAorQkVGRUhMOgorCWRlc3RydWN0LCBkZXN0LCBkZXMKKworQVJHVU1FTlRFOgorCVRPUworCitGVU5LVElPTjoKKwlaZXJzdG9lcmUgZGFzIE9iamVrdCBhdWYgZGVtIFRPUy4gSW4gd2lya2xpY2hrZWl0IHdpcmQgYWJlciBudXIgcmVtb3ZlCisJYXVmZ2VydWZlbiwgZGFzIGRhcyBkaWUgZW1wZm9obGVuZSBBcnQgZGVyWmVyc3RvZXJ1bmcgdm9uIE9iamVrdGVuCisJaXN0LiBXaWxsIG1hbiBqZWRvY2ggZWluIE9iamVrdCB3aXJrbGljaCBoYXJ0IGRlc3RydWN0ZW4sIHNvCisJaGFlbmdlIG1hbiBlaW4gUnVmemVpY2hlbiAoJyEnKSBhbiBkYXMgS29tbWFuZG8gKGFsc28gJ2Rlc3RydWN0IScpLgorCitTSUVIRSBBVUNIOgorCSJyZW1vdmUiCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2R1bXAgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2R1bXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDdiZTQ2YgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvZHVtcApAQCAtMCwwICsxLDE2IEBACitCRUZFSEw6CisJZHVtcAorCQorQVJHVU1FTlRFOgorCWtlaW5zIG9kZXIKKwlUT1MgLS0gZmlsZW5hbWUKKwkKK0ZVTktUSU9OOgorCVNwZWljaGVyZSBhbGxlIHNlbGJzdGRlZmluaWVydGVuIEZ1bmt0aW9uZW4gaW4gZGVyIGFuZ2VnZWJlbmVuCisJRGF0ZWkgYWIuIElzdCBkZXIgVE9TIGtlaW4gU3RyaW5nLCBzbyB3aXJkIGluIGRlciBEYXRlaQorCX4vLm1lbW9yeS5vIGdlc3BlaWNoZXJ0LgorCisJRXMga29lbm5lbiBudXIgRnVua3Rpb25lbiBhYmdlc3BlaWNoZXJ0IG9kZXIgZ2VsYWRlbiB3ZXJkZW4hCisKK1NJRUhFIEFVQ0g6CisJImZ1bmt0aW9uZW4iLCAicmVzdG9yZSIsICJtZW1vcnkiCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2R1cCBiL29iai90b29scy90ZWxsZXIvaGlsZmUvZHVwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MDJiNzUKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2R1cApAQCAtMCwwICsxLDkgQEAKK0JFRkVITDoKKwlkdXAKKworQVJHVU1FTlRFOgorCVRPUworCitGVU5LVElPTjoKKwlMZWdlIGRhcyBPYmpla3QsIGRhcyBvYmVuIGF1ZiBkZW0gU3RhY2sgbGllZ3QsIG5vY2hlaW5tYWwgYXVmCisJZGVuIFN0YWNrLCB1bSBlcyBldmVudHVlbGwgc3BhZXRlciBub2NoIGVpbm1hbCB3aWVkZXIgenUgdmVyd2VuZGVuLgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9laW5sZWl0dW5nIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9laW5sZWl0dW5nCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMTlkMDMKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2VpbmxlaXR1bmcKQEAgLTAsMCArMSwxMjEgQEAKK1dJQ0hUSUc6CisJKioqKioqKioqKioqKioqKioqKioqKgorCURhcyBlcnN0ZSBaZWljaGVuIG11c3MgYWIgamV0enQgZWluIEtvbW1hICgsKSBzZWluLiBCaXNoZXIgd2FyCisJZXMgZWluIFNlbWlrb2xvbiwgYWJlciBkYXMgd2VjaHNlbHdpcmt0IGphIG1pdCBkZW0gZW1vdGUuCisJKioqKioqKioqKioqKioqKioqKioqKgorCitERVIgVEVMTEVSU1RBUEVMOgorCisJRGVyIFRlbGxlcnN0YXBlbCBpc3QgZWluIHN0YWNrb3JpZW50aWVydGVzIE1hZ2llcnRvb2wuCisJRGFzIGhlaXNzdCwgbWFuIGxlZ3QgZGllIE9iamVrdGUsIFN0cmluZ3Mgb2RlciB3YXMgYXVjaCBpbW1lciBhdWYKKwlkZW4gU3RhY2sgdW5kIHJ1ZnQgYWxzIGxldHp0ZXMgZGllIEZ1bmt0aW9uIGF1ZiwgZGllIGRhbm4gbWl0CisJZGVtIFN0YWNraWhuaGFsdCBpcmdlbmRldHdhcyBtYWNodC4gRGFzIEVyZ2VibmlzIHdpcmQgbWVpc3RlbnMKKwlkYW5uIHdpZWRlciBhdWYgZGVtIFN0YWNrIGFiZ2VsZWd0LgorCUltIGdyb3NzZW4gdW5kIGdhbnplbiBkaWVzZXMgVG9vbCB2b24gTWFjYmV0aHMgTHVwZSBpbnNwaXJpZXJ0LgorCisJSW0gZm9sZ2VuZGVuIHdpcmQgbWl0IFRPUyAoVG9wT2ZTdGFjaykgZGFzIERpbmcgYmV6ZWljaG5ldCwgZGFzCisJYWxzIGxldHp0ZXMgYXVmIGRlbSBTdGFjayBhYmdlbGVndCB3dXJkZS4KKworS09NTUFORE9TOgorCisJSmVkZXMgS29tbWFuZG8sIGRhcyBtaXQgZGVuIFRlbGxlcm4gYXVzZ2VmdWVocnQgd2VyZGVuIHNvbGwsCisJd2lyZCBtaXQgJywnIGVpbmdlbGVpdGV0LiBBbGxlcmRpbmdzIGhhdCBkYXMgU2VtaWtvbG9uIG5vY2gKKwllaW5lIHdlaXRlcmUgRnVua3Rpb24sIGFiZXIgZGF6dSBzcGFldGVyLgorCitESU5HRSBBVUYgREVOIFNUQUNLIExFR0VOOgorCisJSGludGVyIGRlbSBTZW1pa29sb24gd2VyZGVuIChiZWxpZWJpZyB2aWVsZSkgU3RhY2tvcGVyYXRpb25lbgorCWFuZ2VnZWJlbi4gRGllIG1laXNzdGVuIGRpZXNlciBPcGVyYXRpb25lbiBsZWdlbiBpcmdlbmRldHdhcyBhdWYKKwlkZW0gU3RhY2sgYWIuIFdpbGwgbWFuIE9iamVrdGUgYXVmIGRlbSBTdGFjayBhYmxlZ2VuLCBzbyBnaWJ0CisJbWFuIGVpbmZhY2ggZGVyZW4gRmlsZW5hbWVuIGFuLiBaYWhsZW4gZ2lidCBtYW4gZHVyY2ggZWluIHZvcmFuCisJZ2VzdGVsbHRlcyBEb3BwZWxrcmV1eiAoJyMnKSBhbi4gKFBvc2l0aXZlIFphaGxlbiBnZWhlbiBhdWNoIG9obmUuKQorCXVuZCBTdHJpbmdzIHdlcmRlbiBpbiBBbmZ1ZWhydW5nc3plaWNoZW4gZWluZ2VmYXNzdCwgZGFtaXQgc2llIHZvbgorCWRlbiBPYmpla3RlbiB1bnRlcnNjaGllZGVuIHdlcmRlbiBrb2VubmVuLiAoVWVicmlnZW5zIGlzdCBkYXMgWmVpY2hlbgorCSdcbicgdW5kIGRhcyBFU0MtWmVpY2hlbiAoJ1xlJykgaW4gU3RyaW5ncyBlcmxhdWJ0LikKKworU1RBQ0tPUEVSQVRJT05FTjoKKworCVN0YWNrb3BlcmF0aW9uZW4sIGRpZSBkZW4gU3RhY2sgbmljaHQgYmVlaW5mbHVzc2VuLgorCisJCXNheSAgICAgLSBNZWxkdW5nZW4gYW4gTWl0c3BpZWxlciBlaW4tIHVuZCBhdXNzY2hhbHRlbi4KKwkJCSAgVW1zdGVoZW5kZSBzZWhlbiBub3JtYWxlcndlaXNlLCB3ZW5uIG1hbiBtaXQgZGVuCisJCQkgIFRlbGxlcm4gYXJiZWl0ZXQsIGVpbmUgTWVsZHVuZyBkZXIgQXJ0OgorCQkJICAiU293aWVzbyBqb25naWxlcnQgbWl0IHNlaW5lbiBUZWxsZXJuLiIgYnp3CisJCQkgICJTb3dpZXNvIGZhZWxsdCBiZWltIEpvbmdsaWVyZW4gZWluIFRlbGxlciBoZXJ1bnRlci4iCisJCW5hbWVzICAgLSBPYmpla3RlIG1pdCBvZGVyIG9obmUgTmFtZW4gYmVpIEF1Zmxpc3R1bmdlbgorCQkJICBhdXNnZWJlbi4KKwkJc3RhY2sgICAtIEdlYmUgU3RhY2tpbmhhbHQgYXVzICgwIGlzdCBkZXIgVE9TKS4KKwkJbWVtb3J5ICAtIEdlYmUgSW5oYWx0IGRlciBWYXJpYWJsZW4gYXVzLgorCQl0b3AgICAgIC0gR2ViZSBkZW4gVE9TIGF1cy4KKwkJaW52ICAgICAtIEdlYmUgZWluZSBMaXN0ZSBkZXIgT2JqZWt0ZSBhdXMsCisJCQkgIGRpZSBzaWNoIGltIFRPUy1PYmpla3QgYmVmaW5kZW4uCisJCXNjYW4gICAgLSBHZWJlIHJlbGV2YW50ZSBEYXRlbiB6dSBkZW0gU3BpZWxlciBhdWYgZGVtIFRPUyBhdXMuCisKKwlTdGFja29wZXJhdGlvbmVuLCBkaWUgbWl0IHNlbGJzdGRlZmluaWVydGVuIEZ1bmt0aW9uZW4genUgdHVlbgorCWhhYmVuOgorCisJCSEJLSBEZWZpbmllcmUgZWluZSBuZXVlIEZ1bmt0aW9uLgorCQkJICAoSGlsZmUgdW50ZXIgImZ1bmt0aW9uZW4iLikKKwkJZHVtcAorCQlyZXN0b3JlIC0gU3BlaWNoZXJuIHVuZCBMYWRlbiBkZXIgYmVudXR6ZXJkZWZpbmllcnRlbgorCQkJICBGdW5rdGlvbmVuCisKKwlTdGFja29wZXJhdGlvbmVuLCBkaWUgZXR3YXMgYXVmIGRlbSBTdGFjayBhYmxlZ2VuOgorCisJCW1lICAgICAgLSBMZWdlIGRpY2ggc2VsYnN0IGF1ZiBkZW4gU3RhY2suCisJCWhlcmUgICAgLSBMZWdlIGRlbiBSYXVtLCBpbiBkZW0gRHUgYmlzdCwgYXVmIGRlbiBTdGFjay4KKworCVN0YWNrb3BlcmF0aW9uZW4genUgZGVzc2VuIFZlcndhbHR1bmc6CisKKwkJZHVwICAgICAtIExlZ2UgZGVuIFRPUyBub2NoIGVpbm1hbCBhdWYgZGVuIFN0YWNrLgorCQlwb3AgICAgIC0gTG9lc2NoZSBkZW4gVE9TIHZvbSBTdGFjay4KKwkJc3dhcCAgICAtIFZlcnN0YXVjaGUgZGVuIFRPUyBtaXQgZGVtIERpbmcgZGFydW50ZXIuCisJCWNsZWFyICAgLSBMb2VzY2hlIGRlbiBnYW56ZW4gU3RhY2suCisKKwlEaWUgZm9sZ2VuZGVuIEZ1bmt0aW9uZW4gcG9wcGVuIGlocmUgUGFyYW1ldGVyIHZvbSBTdGFjayBoZXJ1bnRlci4KKworCUZ1bmt0aW9uZW4gbWl0IGVpbmVtIFBhcmFtZXRlcjoKKworCQljbG9uZSAgIC0gQ2xvbmUgZWluIE9iamVrdCBtaXQgZGVuIGFuZ2VnZWJlbmVuIEZpbGVuYW1lbi4KKwkJICAgICAgICAgIExlZ2UgZGFzIGdlY2xvbnRlIE9iamVrdCBhdWYgZGVuIFN0YWNrLgorCQl1cGRhdGUgIC0gWmVyc3RvZXJlIGRpZSBCbHVlcHJpbnQgZGVzIE9iamVrdGVzLgorCQlyZW1vdmUgIC0gWmVyc3RvZXJlIGRhcyBPYmpla3QuCisKKwlGdW5rdGlvbmVuIG1pdCBtZWhyZXJlbiBQYXJhbWV0ZXJuOgorCisJCW1vdmUJLSBCZXdlZ2UgZGFzIHp3ZWl0b2JlcnN0ZSBFbGVtZW50IGluIGRhcyBPYmVyc3RlLgorCQlpZiAgICAgIC0gc3VjaGUgYWJoYWVuZ2lnIHZvbSBvYmVyc3RlbiBFbGVtZW50IGVpbmVzIGRlcgorCQkJICBkYXJ1bnRlciBsaWVnZW5kZW4gYXVzLgorCisJRnVua3Rpb25lbiBtaXQgYmVsaWViaWcgdmllbGVuIFBhcmFtZXRlcm46CisKKwkJVW0genUgd2lzc2VuLCB3aWV2aWVsZSBkZXIgU3RhY2tlbGVtZW50ZSB6dSBkZW0gRnVua3Rpb25zLQorCQlhdWZydWYgZ2Vob2VyZW4sIG11c3MgZWluZSBJbmZvcm1hdGlvbiBhdWYgZGVtIFN0YWNrCisJCWFiZ2VsZWd0IHdlcmRlbi4gRGllc2VzIHdpcmQgbWl0IGVpbmVtIExvY2sgKCc7JykgZ2VtYWNodC4KKwkJVW50ZXIgZGVtIFN0aWNocHVua3QgImxvY2siIHNpbmQgYXVjaCBCZWlzcGllbGUuCisKKwkJYXJyYXkJLSBGdWVnZSBhbGxlIEVsZW1lbnRlIHp1IGVpbmVtIEFycmF5IHp1c2FtbWVuLgorCQlzcGxpdAktIFplcmxlZ2UgZGFzIEFycmF5IGF1ZiBkZW0gU3RhY2sgaW4gRWluemVsdGVpbGUuCisKKwkJLT4JLSBSdWZlIGluIGRlbSB1bnRlcnN0ZW4gT2JqZWt0IGRpZSBoaW50ZXIgZGVtCisJCQkgIFBmZWlsIHN0ZWhlbmRlIEZ1bmt0aW9uIGF1Zi4gVWViZXJnZWJlIGFsbGUKKwkJCSAgZGVtIE9iamVrdCBmb2xnZW5kZW4gRWxlbWVudGUgYWxzIFBhcmFtZXRlci4KKwkJLS0+CS0gRGl0by4gTGVnZSBhYmVyIGRhcyBFcmdlYm5pcyB3aWVkZXIgYXVmCisJCQkgIGF1ZiBkZW0gU3RhY2sgYWIuCisJCQkgIChIaWxmZSBpc3QgdW50ZXIgZGVtIEJlZ3JpZmYgImNhbGwiIHp1IGZpbmRlbi4pCisKKwkJLSoJLSBSdWZlIGRpZSBoaW50ZXIgZGVtIC0qIHN0ZWhlbmRlIGVmdW4gYXVmLgorCQkJICB1ZWJlcmdpYiBhbGxlIFN0YWNrZWxlbWVudGUgYWxzIFBhcmFtZXRlci4KKwkJLS0qCS0gRGl0byBtaXQgRXJnZWJuaXNydWVja2dhYmUuCisJCQkgIChIaWxmZSB1bnRlciBkZW0gQmVncmlmZiAiY2FsbGVmdW4iLikKKworCQlACS0gRnVlaHJlIGRlbiBMUEMtQ29kZSBoaW50ZXIgZGVtIEtsYW1tZXJhZmZlbiBhdXMuCisJCUBACS0gRGl0byBtaXQgUmV0dXJud2VydC4KKwkJCSAgKEhpbGZlIHVudGVyICJldmFsdWF0ZSIuKQorCisJV2llIGRpZSBCZWZlaGxlIGltIGVpbnplbG5lbiBmdW5rdGlvbmllcmVuLCBrYW5uIG1hbiBkdXJjaAorCSI7aGlsZmUgPEJlZmVobD4iIGVyZmFocmVuLiBUaGVtYSBpc3QgaW0gQWxsZ2VtZW5laW5lbiBkZXIKKwlCZWZlaGxzbmFtZS4gQmVpIEF1c25haG1lbiBiaXR0ZSBvYmVuIG5hY2hsZXNlbi4gOy0pCisKKwlWaWVsIFNwYXNzIGRhbWl0CisJCVJ1bWF0YSwgZGllIEdvZXR0aW4gZGVyIE1vcmdlbnJvZXRlLgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9ldmFsdWF0ZSBiL29iai90b29scy90ZWxsZXIvaGlsZmUvZXZhbHVhdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTFmNmUwYQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvZXZhbHVhdGUKQEAgLTAsMCArMSwyMiBAQAorQkVGRUhMOgorCWV2YWx1YXRlLCBldmFsCisJCitBUkdVTUVOVEU6CisJVE9TIC0gTmFtZSBlaW5lciBGdW5rdGlvbiBhbHMgU3RyaW5nLgorCQorRlVOS1RJT046CisJRGVyIE5hbWUgd2lyZCB2b24gU3RhY2sgZ2Vub21tZW4uCisJRGVyIHVudGVyIE5hbWVuIGdlc3BlaWNoZXJ0ZSBXZXJ0IHdpcmQgYXVzZ2V3ZXJ0ZXQuIEZ1ZXIgbm9ybWFsZQorCVdlcnRlIGJlZGV1dGV0IGRhcywgZGFzcyBzaWUgYXVmIGRlbiBTdGFjayBnZWxlZ3Qgd2VyZGVuLiBGdW5rdGlvbmVuCisJd2VyZGVuIGF1c2dld2VydGV0LgorCQorQkVJU1BJRUw6CisJLCFRICExIHBsICEwIC0+UXVlcnlQcm9wCisJLHJ1bWF0YSB0aXRsZSBRCisJCWxpZWZlcnQgZGlyZWt0IGRlbiBUaXRlbC4KKwkscnVtYXRhIHRpdGxlICJRIiBldmFsCisJCXR1dCBkYXMgc2VsYmUsIG51ciBkYXMgIlEiIGFscyBTdHJpbmcKKwkJendpc2NoZW5kdXJjaCBhdWYgZGVtIFN0YWNrIGxpZWd0LgorCitTSUVIRSBBVUNIOgorCSJmdW5rdGlvbmVuIgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9mdW5rdGlvbmVuIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9mdW5rdGlvbmVuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlZTdkNzUKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2Z1bmt0aW9uZW4KQEAgLTAsMCArMSwyNSBAQAorQkVGRUhMOgorCSFmdW5rdGlvbnNuYW1lIHRleHQKKwkKK0FSR1VNRU5URToKKwl0ZXh0IC0tIGRlciAqZ2FuemUqIFJlc3QgZGVyIFplaWxlCisJCitGVU5LVElPTjoKKwlFcnpldWdlIGF1cyB0ZXh0IGVpbmUgbmV1ZSBGdW5rdGlvbiBtaXQgZGVtIGFuZ2VnZWJlbmVuIE5hbWVuLiBEaWVzZXIKKwlOYW1lIGlzdCBhbHMgbmV1ZXIgQmVmZWhsIGlubmVyaGFsYiBkZXIgVGVsbGVyIGJlbnV0emJhciB3aWUgZGllCisJZWluZ2ViYXV0ZW4gQmVmZWhsZS4KKwlXaXJkIGVpbiBCZWZlaGwgYXVzZ2VmdWVocnQsIGJla29tbXQgZXIgYXVmIGVpbmVtIG5ldWVuIFN0YWNrIHNlaW5lCisJUGFyYW1ldGVyIHVlYmVyZ2ViZW4uIFdhcyBhbSBFbmRlIGRlcyBGdW5rdGlvbnNhdWZydWZlcyBhdWYgZGVtCisJU3RhY2sgbGVndCwgd2lyZCBkYW5uIGF1ZiBkZW4gdXJzcHJ1ZW5nbGljaGVuIGFiZ2VsZWd0LgorCitCRUlTUElFTDoKKwksIVF1ZXJ5ICExIHBsICEwIC0tPlF1ZXJ5UHJvcAorCURlZmluaWVyZSBkaWUgRnVua3Rpb24gIlF1ZXJ5Iiwgc2llIGhhdCB6d2VpIFBhcmFtZXRlciAoITAgdW5kICExKSwKKwl3b2JlaSAhMCBkZXIgVE9TIGlzdC4KKwkscnVtYXRhIHRpdGxlIFF1ZXJ5CisJCUxpZWZlcnQgZGFubiBkZW4gVGl0ZWwgdm9uIFJ1bWF0YSBhdWYgZGVtIFN0YWNrIHp1cnVlY2ssIGRhCisJCWFtIEVuZGUgZGVyIEF1c3dlcnR1bmcgZGllc2VyIGF1ZiBkZW0gU3RhY2sgbGllZ2VuIHd1ZXJkZS4KKwksIURlbW8gITEgc3RrCisJLDEgMiAzIDQgRGVtbworCQlaZWlndCBlaW5lbiBTdGFjayBhdWYgZGVtIGRhcyB6d2VpdG9iZXJzdGUgRWxlbWVudCB2b24gZGVtCisJCXVyc3BydW5nc3N0YWNrIGxpZWd0OyBpbiBkaWVzZW0gRmFsbCBhbHNvIDMuCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2dlbmVyYWwgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2dlbmVyYWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI2ZDc0MwotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvZ2VuZXJhbApAQCAtMCwwICsxLDE3IEBACitEYXMgc2luZCBkaWUgQmVmZWhsZSwgZGllIGRpZSBtYWdpc2NoZW4gVGVsbGVyIHp1ciBaZWl0IGJlaGVycnNjaGVuOgorKExldHp0ZSBBZW5kZXJ1bmcgYW0gMjAuMDEuMTk5NSBhbiBkZW4gbWl0ICUgbWFya2llcnRlbiBGdW5rdGlvbmVuLAorZGllIG1pdCAqIHNpbmQgbmV1ISBBQiBKRVRaVCBHSUJUIEVTIEFVQ0ggRlVOS1RJT05FTiEgKQorCithcnJheSAgICAgICBkZXN0cnVjdCAgICBoZXJlICAgICAgICBtZW1vcnklICAgICByZWtpbnYgICAgICBzcGxpdAorY2FsbCAgICAgICAgZHVtcCogICAgICAgaWYqICAgICAgICAgbWVzc2FnZSAgICAgcmVtb3ZlICAgICAgc3RhY2sKK2NhbGxlZnVuICAgIGR1cCAgICAgICAgIGludiAgICAgICAgIG1vdmUgICAgICAgIHJlc3RvcmUqICAgIHN3YXAKK2NhbGxvdXRzICAgIGVpbmxlaXR1bmcgIGxpdmluZyAgICAgIG5hbWVzICAgICAgIHJ1cGRhdGUgICAgIHRvZG8KK2NsZWFub2YgICAgIGV2YWx1YXRlKiAgIGxvY2sgICAgICAgIG9iamVjdCAgICAgIHNheSAgICAgICAgIHRvcAorY2xlYXIgICAgICAgRlVOS1RJT05FTiogbHBjICAgICAgICAgcGxheWVyICAgICAgc2NhbiAgICAgICAgdXBkYXRlCitjbG9uZSAgICAgICBnZW5lcmFsICAgICBtZSAgICAgICAgICBwb3AgICAgICAgICBzbm9vcCAgICAgICB2YXJzCisKK01pdCAiLGhpbGZlIDxCZWZlaGw+IiBrYW5uc3QgRHUgSW5mb3JtYXRpb25lbiB6dSBkZW4gQmVmZWhsZW4gYWJmcmFnZW4uCitXZW5uIER1IGdhcm5peCB2ZXJzdGVoc3QsIGRhbm4gdmVyc3VjaGUgbWFsICIsaGlsZmUgZWlubGVpdHVuZyIuIDotKQorCitXSUNIVElHOiBEYXMgU2VtaWtvbG9uIHdpcmQgbmljaHQgbWVociB1bnRlcnN0dWV0enQsIHN0YXR0ZGVzc2VuCisJa2FubiBudXIgbm9jaCBkYXMgS29tbWEgYmVudXR6dCB3ZXJkZW4uCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2hlcmUgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2hlcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBlYmRmNgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvaGVyZQpAQCAtMCwwICsxLDggQEAKK0JFRkVITDoKKwloZXJlCisKK0FSR1VNRU5URToKKwlLZWlucworCitGVU5LVElPTjoKKwlMZWdlIGRlbiBSYXVtLCBpbiBtYW4gc2ljaCBiZWZpbmRldCBvYmVuIGF1ZiBkZW4gU3RhY2suCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2lmIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9pZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTk0NzE3Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9pZgpAQCAtMCwwICsxLDIyIEBACitCRUZFSEw6CisJaWYKKwkKK0FSR1VNRU5URToKKwl3ZW5uIHNvbnN0IGJlZGluZ3VuZyhUT1MpCisJCitGVU5LVElPTjoKKwlXZW5uIGRlciBUT1MgTnVsbCBpc3QsIGxpZWZlcmUgZGFzIGRyaXR0b2JlcnN0ZSBFbGVtZW50IHZvbSBTdGFjaywKKwlzb25zdCBkYXMgendlaXRvYmVyc3RlLiBEaWVzZXIgQmVmZWhsIGlzdCBpbnNiZXNvbmRlcmUgaW0gWnVzYW1tZW4tCisJaGFuZyBtaXQgImV2YWx1YXRlIiBpbnRlcmVzc2FudC4KKwkKK0JFSVNQSUVMOgorCSwiYmxhIiAiYmx1YmIiIDAgaWYKKwkJTGllZmVydCAiYmx1YmIiCisJLCJibGEiICJibHVpYmIiIDEgaWYKKwkJTGllZmVydCAiYmxhIgorCSwiUSIgIlIiIHRlc3QgaWYgZXZhbHVhdGUKKwkJV2VydGUgUSBhdXMsIHdlbm4gZGVyIFdlcnQgInRlc3QiIG5pY2h0IG51bGwgaXN0LgorCQlBbmRlcmVuZmFsbHMgd2VydGUgUiBhdXMuCisKK1NJRUhFIEFVQ0g6CisJImV2YWx1YXRlIiwgImZ1bmt0aW9uZW4iCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2ludiBiL29iai90b29scy90ZWxsZXIvaGlsZmUvaW52Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5NDM4MDAKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2ludgpAQCAtMCwwICsxLDE3IEBACitCRUZFSEw6CisJaW52CisKK0FSR1VNRU5URToKKwlUT1MKKworRlVOS1RJT046CisJR2ViZSBhbGxlIE9iamVrdGUgYW4sIGRpZSBzaWNoIGluIGRlbSBPYmpla3QgVE9TIGJlZmluZGVuLgorCUdpYiBlaW5lbiBGZWhsZXIgYXVzLCB3ZW5uIFRPUyBrZWluIE9iamVrdCBpc3QuCisJVE9TIGJsZWlidCBhdWYgZGVtIFN0YWNrLCBkYSBkaWVzZXIgQmVmZWhsIG1laXN0ZW5zIGRhenUgYmVudXR6dAorCXdpcmQsIGVpbiBPYmpla3QgYXVmIGRlbiBTdGFjayB6dSBsZWdlbiB1bmQgZGFubiBiZXN0aW1tdGUKKwlPYmpla3RlIGluIGlobSB6dSBzdWNoZW4sIHVuZCBkYW5uIGRpZXNlIHp1IGhvbGVuLgorCitCRUlTUElFTEU6CisJLG1lIGludgorCURhbm4gc2llaHQgbWFuIC4uLi4gIi4yIC9ibGEvYmxhL2JsYS9vYmpla3QiIHVuZCBtYW4ga2FubiBkYW5uCisJbWl0dGVscyAsLjIgZGllc2VzIE9iamVrdCBob2xlbi4KZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvbGl2aW5nIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9saXZpbmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA2MDZhNwotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvbGl2aW5nCkBAIC0wLDAgKzEsMTcgQEAKK0JFRkVITDoKKwlsaXZpbmcsIGx2CisKK0FSR1VNRU5URToKKwlUT1MgLS0gTmFtZSBlaW5lcyBNb25zdGVycworCitGVU5LVElPTjoKKwlIb2xlIGVpbmVuIE5hbWVuIHZvbSBTdGFjayB1bmQgbGVnZSBzdGF0dGRlc3NlbiBkYXMgZW50c3ByZWNoZW5kZQorCU1vbnN0ZXJvYmpla3QgYXVmIGRlbiBTdGFjay4gR2ViZSBlaW5lIEZlaGxlcm1lbGR1bmcgYXVzLCB3ZW5uIGtlaW4KKwlkZXJhcnRpZ2VzIE1vbnN0ZXIgdm9yaGFuZGVuIGlzdC4KKworQkVJU1BJRUxFOgorCSwib3JrIiBsaXZpbmcKKwlTdWNodCBkZW4gZXJzdGJlc3RlbiBPcmsuCisKK1NJRUhFIEFVQ0g6CisJIm9iamVjdCIsICJwbGF5ZXIiCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2xvY2sgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL2xvY2sKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ3MGRiMwotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvbG9jawpAQCAtMCwwICsxLDI2IEBACitCRUZFSEw6CisJLAorCitBUkdVTUVOVEU6CisJS2VpbmUKKworRlVOS1RJT046CisJTGVnZSBlaW5lbiAnTG9jaycgYXVmIGRlbSBTdGFjayBhYi4gQW5oYW5kIGVpbmVzIExvY2tzIGVya2VubmVuCisJRnVua3Rpb25lbiwgZGllIGVpbmUgdmFyaWJhbGUgQW56YWhsIHZvbiBBcmd1bWVudGVuIHZvbSBTdGFjaworCW5laG1lbiBrb2VubmVuLCB3aWV2aWVsZSBkZXIgQXJndW1lbnRlIGZ1ZXIgc2llIGJlc3RpbW10IHNpbmQuCisKKwlXaWNodGlnOiBEYXMgS29tbWEgYW0gQW5mYWcgamVkZXIgRWluZ2FiZXplaWxlIGlzdCBLRUlOIExvY2suCisKK0JFSVNQSUVMRToKKwksbWUsIDEgMiAzIGFycmF5CisJCUVzIHdlcmRlbiBudXIgZGllIFphaGxlbiAxIDIgdW5kIDMgaW4gZGFzIEFycmF5IGF1Zmdlbm9tbWVuLAorCQluaWNodCBkZXIgU3BpZWxlciBzZWxic3QuIEF1ZiBkZW0gU3RhY2sgbGllZ2VuIG5hY2hlciBkZXIKKwkJU3BpZWxlciB1bmQgZGFzIEFycmF5LgorCSxoZXJlLCBtZSAicnVtYXRhIiAtPmlkCisJCSJpZCIgd2lyZCBpbSBTcGllbGVyIG1pdCBlaW5lbSBBcmd1bWVudCAoInJ1bWF0YSIpIGF1ZmdlcnVmZW4uCisJLGhlcmUgbWUgInJ1bWF0YSIgLT5pZAkKKwkJSGllciB3aXJkIGRpZSBGdW5rdGlvbiBpbSBSYXVtIG1pdCB6d2VpIEFyZ3VtZW50ZW4gYXVmZ2VydWZlbiwKKwkJd2FzIGhpZXIgbmF0dWVybGljaCBrZWluZW4gU2lubiBtYWNodC4KKworU0lFSEUgQVVDSDoKKwkiYXJyYXkiLCAic3BsaXQiLCAiY2FsbCIsICJjYWxsZWZ1biIsICJldmFsdWF0ZSIKZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvbHBjIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9scGMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZhMGUwMQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvbHBjCkBAIC0wLDAgKzEsMjEgQEAKK0JFRkVITDoKKwlAIHRleHQKKwlAQCB0ZXh0CisJCitBUkdVTUVOVEU6CisJdGV4dCAtLSBkZXIgZ2FuemUoISkgUmVzdCBkZXIgRWluZ2FiZXplaWxlLgorCURlciBTdGFjayBiaXMgenVtIGxldHp0ZW4gTG9jay4KKwkKK0ZVTktUSU9OOgorCUZ1ZWhyZSBkZW4gTFBDLUNvZGUgPHRleHQ+IGRpcmVrdCBhdXMuIERhYmVpIGtvZW5uZW4gZGllIEFyZ3VtZW50ZQorCXZvbSBTdGFjayBtaXQgQDxudW1tZXI+QCBlaW5nZXNldHp0IHdlcmRlbi4gV2ljaHRpZywgd2VubiBtYW4gZWluCisJRXJnZWJuaXMgd2VpdGVyYmVyZWNobmVuIHdpbGwsIG11c3MgbWFuIGF1Y2ggZWluICdyZXR1cm4nIHVtCisJTFBDLUNvZGUgYmVudXR6dCBoYWJlbi4KKworCUJlaSBkZXIgQXVzZnVlaHJ1bmcgd2VyZGVuIG5pY2h0IGFsbGUgSW5jbHVkZS1EYXRlaWVuIGVpbmdlbGFkZW4uCisJCitCRUlTUElFTDoKKwksbWUgQCB3cml0ZSggQDBALT5uYW1lKFdFUikrIlxuIiApCisJR2lidCBEZWluZW4gTmFtZW4gYXVzLgorCSxtZSBAQCByZXR1cm4gQDBALT5uYW1lKFdFUikKKwlHaWJ0IGRlbiBOYW1lbiB6dXJ1ZWNrIHVuZCBsZWd0IGlobiBhdWYgZGVuIFN0YWNrLgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9tZSBiL29iai90b29scy90ZWxsZXIvaGlsZmUvbWUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODg2MWY0NQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvbWUKQEAgLTAsMCArMSw4IEBACitCRUZFSEw6CisJbWUKKworQVJHVU1FTlRFOgorCUtlaW5lCisKK0ZVTktUSU9OOgorCUxlZ2UgZGVuIEVpZ2VudHVlbWVyIChEaWNoISkgb2JlbiBhdWYgZGVuIFN0YWNrLgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9tZW1vcnkgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL21lbW9yeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDEyNDUxCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9tZW1vcnkKQEAgLTAsMCArMSwxNSBAQAorQkVGRUhMOgorCW1lbW9yeSwgbWVtCisKK0FSR1VNRU5URToKKwlLZWluZQorCitGVU5LVElPTjoKKwlaZWlnZSBkZW4gSW5oYWx0IGFsbGVyIFZhcmlhYmxlbiBhbiwgZGllIG1hbiBhbmdlbGVndCBoYXQuCisJTm9ybWFsZXJ3ZWlzZSB3aXJkIGRlciBJbmhhbHQgaW4gZGVyIEZvcm0gTmFtZSA9IEluaGFsdCBhbmdlemVpZ3QuCisJSXN0IHVudGVyIGRlbSBOYW1lbiBlaW5lIEZ1bmt0aW9uIGdlc3BlaWNoZXJ0LCB3aXJkCisJCU5hbWUgPiBJbmhhbHQKKwlhbmdlemVpZ3QsIHVtIEZ1bmt0aW9uZW4gdm9uIFN0cmluZ3MgdW50ZXJzY2hlaWRlbiB6dSBrb2VubmVuLgorCitTSUVIRSBBVUNIOgorCSJ2YXJzIiwgImZ1bmt0aW9uZW4iCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL21lc3NhZ2UgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL21lc3NhZ2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU2ZDk0YQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvbWVzc2FnZQpAQCAtMCwwICsxLDEzIEBACitLT01NQU5ETzoKKwltZXNzYWdlIFt0byA8c3BpZWxlcj5dCisJbXNnIFt0byA8c3BpZWxlcj5dCisKK0ZVTktUSU9OOgorCVdlbm4gbWFuIGdhbnplIFRleHRibG9lY2tlIHNhZ2VuIG1vZWNodGUsIGthbm4gbWFuIGRhcyBtaXQgZGllc2VtCisJQmVmZWhsIHR1bi4gTmFjaCBFaW5nYWJlIHZvbiAnbWVzc2FnZScgd2lyZCBqZWRlIEVpbmdhYmUgZGlyZWt0IGZ1ZXIKKwlhbGxlIGltIFJhdW0gc2ljaHRiYXIgb2RlciBmdWVyIGRlbiBhbmdlZ2ViZW5lbiBTcGllbGVyIGF1c2dlZ2ViZW4uCisJTWl0ICcqKicga2FubiBtYW4gd2llZGVyIGF1ZiBub3JtYWxlIEVpbmdhYmUgenVydWVja3NjaGFsdGVuLgorCitBQ0hUVU5HOgorCURpZXNlciBCZWZlaGwgZ2Vob2VydCBuaWNodCB6dSBkZW5lbiwgZGllIG1pdHRlbHMgJywnIGVpbmdlbGVpdGV0CisJd2VyZGVuLgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9tb3ZlIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9tb3ZlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxODFjMzQKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL21vdmUKQEAgLTAsMCArMSwxNCBAQAorQkVGRUhMOgorCW1vdmUsIG12CisKK0FSR1VNRU5URToKKwlvYmogLS0gT2JqZWt0LCBkYXMgYmV3ZWd0IHdlcmRlbiBzb2xsLgorCXppZWwoVE9TKSAtLSBSYXVtLCBpbiBkZW4gZGFzIE9iamVrdCBzb2xsCisKK0ZVTktUSU9OOgorCUJld2VnZSBkYXMgT2JqZWt0IGluIGRlbiBhbmdlZ2ViZW5lbiBSYXVtLiBEaWUgbWVpc3RlbiBTaWNoZXJ1bmdlbgorCXdlcmRlbiBiZWkgZGllc2VtIFZlcnNjaGl1ZWJlbiB1bWdhbmdlbiwgYWxzbyB2b3JzaWNodCEKKworQkVJU1BJRUxFOgorCSxtZSAifi93b3Jrcm9vbSIgb2IgbXYKKwkJTWFuIGdlaHQgaW4gZGVuIGVpZ2VuZW4gV29ya3Jvb20uCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL25hbWVzIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9uYW1lcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWViYzNiCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9uYW1lcwpAQCAtMCwwICsxLDE3IEBACitCRUZFSEw6CisJbmFtZXMsIG5hbQorCitBUkdVTUVOVEU6CisJa2VpbmUKKworRlVOS1RJT046CisJTm9ybWFsZXJ3ZWlzZSB3ZXJkZW4gZGVyIEZpbGVuYW1lIHVuZCBkZXIgTmFtZSAoUXVlcnlQcm9wKFBfTkFNRSkpCisJYW5nZXplaWd0LCB3ZW5uIG1hbiBkZW4gU3RhY2sgb2RlciBhZWhubGljaGVzIGJldHJhY2h0ZXQuCisJTWl0IGRpZXNlbSBCZWZlaGwgc2NoYWx0ZXQgbWFuIGRlbiBOYW1lbiBhdXMgb2RlciBhbi4KKworCUR1cmNoIEFuc2NoYXVlbiBkZXIgVGVsbGVyIGthbm4gbWFuIGZlc3RzdGVsbGVuLCBvYiBkaWUgTmFtZW4gb2RlcgorCW51ciBkaWUgRmlsZW5hbWVuIGFuZ2V6ZWlndCB3ZXJkZW4uCisKK1NJRUhFIEFVQ0g6CisJImludiIsICJzdGFjayIsICJtb3ZlIiwgInRvcCIsIC4uLgorCUFuZGVyZSBTY2hhbHRlcjogInNheSIsICJpbmZvcm0iCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL29iamVjdCBiL29iai90b29scy90ZWxsZXIvaGlsZmUvb2JqZWN0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NWIzMGEKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL29iamVjdApAQCAtMCwwICsxLDIyIEBACitCRUZFSEw6CisJb2JqZWN0LCBvYgorCitBUkdVTUVOVEU6CisJVE9TIC0tIE5hbWUgZWluZXMgT2JqZWt0ZXMKKworRlVOS1RJT046CisJSG9sZSBlaW5lbiBOYW1lbiB2b20gU3RhY2sgdW5kIGxlZ2Ugc3RhdHRkZXNzZW4gZGFzIGVudHNwcmVjaGVuZGUKKwlPYmpla3QgYXVmIGRlbiBTdGFjay4gRmFsbHMgZXMga2VpbiBnZWxhZGVuZXMgT2JqZWt0IGRpZXNlcyBOYW1lbnMsCisJd29obCBhYmVyIGVpbmUgKG5pY2h0IGdlbGFkZW5lKSBCbHVlcHJpbnQsIHNvIHdpcmQgZGllc2UgZ2VsYWRlbgorCitCRUlTUElFTEU6CisJLCJwbGF5ZXJzL3J1bWF0YS93b3Jrcm9vbSIgb2IKKwlNYWNodCBkYXMgc2VsYmUgd2llICcsL3BsYXllcnMvcnVtYXRhL3dvcmtyb29tJywgZGEgZGllIFRlbGxlcgorCUZpbGVuYW1lbiBhdXRvbWF0aXNjaCB6dSBlcmtlbm5lbiB2ZXJzdWNoZW4uCisJLCJ+cnVtYXRhL3dvcmtyb29tIiBvYgorCWdlaHQgYXVjaC4KKwksIn4vd29ya3Jvb20iIG9iCisJbGllZmVydCBkZW4gZWlnZW5lbiBXb3Jrcm9vbS4KKworU0lFSEUgQVVDSDoKKwkibGl2aW5nIiwgInBsYXllciIKZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvcGxheWVyIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9wbGF5ZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTJjYWExNgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvcGxheWVyCkBAIC0wLDAgKzEsMjEgQEAKK0JFRkVITDoKKwlwbGF5ZXIsIHBsCisKK0FSR1VNRU5URToKKwlUT1MgLS0gTmFtZSBlaW5lcyBTcGllbGVycworCitGVU5LVElPTjoKKwlIb2xlIGVpbmVuIE5hbWVuIHZvbSBTdGFjayB1bmQgbGVnZSBzdGF0dGRlc3NlbiBkYXMgZW50c3ByZWNoZW5kZQorCVNwaWVsZXJvYmpla3QgYXVmIGRlbiBTdGFjay4KKworCUFtIEVuZGUgZGVzIFNwaWVsZXJuYW1lbnMgaXN0IGVpbiBTdGVybiAoJyonKSBhbHMgV2lsZGNhcmQgZXJsYXVidC4KKwlEaWUgTmFtZW4gbmljaHQgZWluZ2Vsb2dndGVyIFNwaWVsZXIgbXVlc3NlbiBpbiBqZWRlbSBGYWxsIGF1c2dlLQorCXNjaHJpZWJlbiB3ZXJkZW4uCisKKworQkVJU1BJRUxFOgorCSwicnVtYXRhIiBwbAorCUxlZ3QgUnVtYXRhIGF1ZiBkZW4gU3RhY2suCisKK1NJRUhFIEFVQ0g6CisJImxpdmluZyIsICJvYmplY3QiCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3BvcCBiL29iai90b29scy90ZWxsZXIvaGlsZmUvcG9wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMGRjMDgKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3BvcApAQCAtMCwwICsxLDggQEAKK0JFRkVITDoKKwlwb3AKKworQVJHVU1FTlRFOgorCVRPUworCitGVU5LVElPTjoKKwlOaW1tIGRhcyBvYmVyc3RlIEVsZW1lbnQgdm9tIFN0YWNrLgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9yZWtpbnYgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3Jla2ludgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjUxYmQyCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9yZWtpbnYKQEAgLTAsMCArMSwxMiBAQAorQkVGRUhMOgorCXJla2ludgorCitBUkdVTUVOVEU6CisJVE9TCisKK0ZVTktUSU9OOgorCURpZXNlciBCZWZlaGwgbWFjaCBkYXMgc2VsYmUgd2llICJpbnYiLCB6ZWlndCBhYmVyIHJla3Vyc2l2CisJYXVjaCBkZW4gSW5oYWx0IGRlciBlbnRoYWx0ZW5lbiBPYmpla3RlIGFuLgorCitTSUVIRSBBVUNIOgorCSJpbnYiCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3JlbW92ZSBiL29iai90b29scy90ZWxsZXIvaGlsZmUvcmVtb3ZlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmZjI0MzcKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3JlbW92ZQpAQCAtMCwwICsxLDE2IEBACitCRUZFSEw6CisJcmVtb3ZlLCByZW0KKworQVJHVU1FTlRFOgorCVRPUworCitGVU5LVElPTjoKKwlaZXJzdG9lcmUgZGFzIE9iamVrdCBhdWYgZGVtIFRPUy4gR2liIGRlbSBPYmpla3QgZGllIEdlbGVnZW5oZWl0LAorCUF1ZnJhZXVtYXJiZWl0ZW4gZHVyY2h6dWZ1ZWhyZW4uCisKK0JFSVNQSUVMRToKKwksbWUgcmVtb3ZlCisJTWFuIGxvZ2d0IHNpY2ggc2VsYmVyIGF1cy4KKworU0lFSEUgQVVDSDoKKwkiZGVzdHJ1Y3QiCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3Jlc3RvcmUgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3Jlc3RvcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQyMGEzNQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvcmVzdG9yZQpAQCAtMCwwICsxLDE1IEBACitCRUZFSEw6CisJcmVzdG9yZQorCQorQVJHVU1FTlRFOgorCWtlaW5zIG9kZXIKKwlUT1MgLS0gZmlsZW5hbWUKKwkKK0ZVTktUSU9OOgorCUxhZGUgZGllIGluIGRlciBEYXRlaSBnZXNwZWljaGVydGVuIEZ1bmt0aW9uZW4uIFdpcmQga2VpbiBGaWxlbmFtZQorCWFuZ2VnZWJlbiwgc28gd2lyZCBkaWUgRGF0ZWkgfi8ubWVtb3J5Lm8gYXVzZ2VsZXNlbi4KKworCUVzIGtvZW5uZW4gbnVyIEZ1bmt0aW9uZW4gYWJnZXNwZWljaGVydCBvZGVyIGdlbGFkZW4gd2VyZGVuIQorCitTSUVIRSBBVUNIOgorCSJmdW5rdGlvbmVuIiwgImR1bXAiLCAibWVtb3J5IgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9ydXBkYXRlIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9ydXBkYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZjAzM2UKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3J1cGRhdGUKQEAgLTAsMCArMSwyNSBAQAorQkVGRUhMOgorCXJvb211cGRhdGUsIHJ1cGRhdGUsIHJ1cGQsIHJ1cAorCitBUkdVTUVOVEU6CisJVE9TCisKK0ZVTktUSU9OOgorCVplcnN0b2VyZSBkZW4gUmF1bSB1bmQgbGFkZSBpaG4gbmV1LCBkYW1pdCBBZW5kZXJ1bmdlbiBkZXIgRmlsZXMKKwlha3RpdiB3ZXJkZW4ga29lbm5lbi4gU29yZ2UgZGFmdWVyLCBkYXNzIGRpZSBPYmpla3RlIGluIGRlbSBhbHRlbiBSYXVtCisJaW4gZGVuIG5ldWVuIGhpbnVlYmVyZ2VyZXR0ZXQgd2VyZGVuLiAoRGllc2UgRWlnZW5zY2hhZnQga2FubiBtaXR0ZWxzCisJZGVzIFN0ZXJuY2hlbnMgKCcqJykgYWJnZXNjaGFsdGV0IHdlcmRlbi4pCisJCisJR2ViZSBkZW0gUmF1bSBqZWRvY2ggR2VsZWdlbmhlaXQsIEF1ZnJhZXVtYXJiZWl0ZW4genUgdGFldGlnZW4uIFNvbGwKKwlkZXIgUmF1bSB3aXJrbGljaCBoYXJ0IHplcnN0b2VydCB3ZXJkZW4sIHNvIGlzdCBlaW4gUnVmemVpY2hlbiBhbiBkZW4KKwlCZWZlaGwgYW56dWhhZW5nZW4uIChhbHNvIGBydXBkYXRlIScsIGVpbiBTdGVybiBtdXNzIHZvciBkZW0gUnVmemVpY2hlbgorCXN0ZWhlbiwgYWxzbyBgcnVwZGF0ZSohJyB1bmQgbmljaHQgYHJ1cGRhdGUhKicuKQorCVdpY2h0aWc6IFJhZXVtZSwgZGllIGtlaW5lIEJsdWVwcmludCBzaW5kLCBrb2VubmVuIG5pY2h0IG1pdCBkaWVzZW0KKwlCZWZlaGwgYWt0dWFsaXNpZXJ0IHdlcmRlbi4KKworQkVJU1BJRUxFOgorCSxoZXJlIHJ1cGRhdGUKKwlBa3R1YWxpc2llcnQgZGVuIFJhdW0sIGluIGRlbSBkZXIgTWFnaWVyIHNpY2ggYmVmaW5kZXQuCisKK1NJRUhFIEFVQ0g6CisJInVwZGF0ZSIKZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvc2F5IGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9zYXkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2YyMzM1NwotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvc2F5CkBAIC0wLDAgKzEsMTcgQEAKK0JFRkVITDoKKwlzYXkKKworQVJHVU1FTlRFOgorCWtlaW5lCisKK0ZVTktUSU9OOgorCVNjaGFsdGUgZGllIE1lbGR1bmcsIGRpZSBhbmRlcmUgU3BpZWxlciBiZWtvbW1lbiwgd2VubiBtYW4KKwltaXQgZGVuIFRlbGxlcm4gYXJiZWl0ZXQsIGF1cyBvZGVyIGFuLgorCisJSXN0IG1hbiB1bnNpY2h0YmFyLCBnaWJ0IGVzIGluIGtlaW5lbSBGYWxsIGVpbmUgTWVsZHVuZy4KKworCUR1cmNoIEFuc2NoYXVlbiBkZXIgVGVsbGVyIGthbm4gbWFuIGZlc3RzdGVsbGVuLCBvYiBNaXNwaWVsZXIKKwlkaWUgTWVsZHVuZ2VuIGJla29tbWVuLgorCitTSUVIRSBBVUNIOgorCSJuYW1lcyIsICJpbmZvcm0iCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3NjYW4gYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3NjYW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyNTFmZAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvc2NhbgpAQCAtMCwwICsxLDE3IEBACitCRUZFSEw6CisJc2NhbgorCitBUkdVTUVOVEU6CisJVE9TCisKK0ZVTktUSU9OOgorCVdlbm4gZGVyIFRPUyBlaW4gU3BpZWxlciBvZGVyIGVpbiBNb25zdGVyIGlzdCwgc28gZ2liIGRpZQorCXNwaWVscmVsZXZhbnRlbiBJbmZvcm1hdGlvbmVuIHp1IGlobSBhdXMuIFdlbm4gZGVyIFRPUyBlaW4KKwlTdHJpbmcgaXN0LCBzbyB3aXJkIGRlciBTcGllbGVyIG1pdCBkaWVzZW0gTmFtZW4gZ2VzdWNodC4KKworQkVJU1BJRUxFOgorCSxtZSBzY2FuCisJLCJqb2YiIHBsIHNjYW4gKG9kZXIga3VlcnplcjogOyJqb2YiIHNjYW4pCisKK1NJRUhFIEFVQ0g6CisJInBsYXllciIKZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvaGlsZmUvc25vb3AgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3Nub29wCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZTEzMDAKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3Nub29wCkBAIC0wLDAgKzEsMTEgQEAKK0JFRkVITEU6CisJc25vb3AKKworQVJHVU1FTlRFOgorCWtlaW5lCisKK0ZVTktUSU9OOgorCVplaWdlIGxhdWZlbmRlIFNub29wdm9yZ2FlbmdlIGFuLgorCisJV2VubiBkZXIgU25vb3BlciBlaW5lbiBob2VoZXJlbiBNYWdpZXJsZXZlbCBhbHMgbWFuIHNlbGJzdCBoYXQsCisJd2lyZCBkZXIgU25vb3AgbmljaHQgYW5nZXplaWd0LgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9zcGxpdCBiL29iai90b29scy90ZWxsZXIvaGlsZmUvc3BsaXQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE5MDI1YQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvc3BsaXQKQEAgLTAsMCArMSwxNCBAQAorQkVGRUhMOgorCXNwbGl0LCBzcGwKKworQVJHVU1FTlRFOgorCVRPUworCitGVU5LVElPTjoKKwlaZXJsZWdlIGRlbiBBcnJheSwgZGVyIGF1ZiBkZW0gU3RhY2sgbGllZ3QgdW5kIGxlZ2UgZGllCisJZWluemVsbmVuIEVsZW1lbnRlIChkYXMgRWxlbWVudCBtaXQgSW5kZXggMCB6dXVudGVyc3QpCisJYXVmIGRlbSBTdGFjayBhYi4gV2VubiBkZXIgU3RhY2sgdm9yaGVyIG5pY2h0IGxlZXIgd2FyLAorCWxlZ2Ugdm9yaGVyIGVpbiBMb2NrIGF1ZiBkZW4gU3RhY2suCisKK1NJRUhFIEFVQ0g6CisJImFycmF5IiwgImxvY2siCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3N0YWNrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9zdGFjawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGYxODJlCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS9zdGFjawpAQCAtMCwwICsxLDE4IEBACitCRUZFSEw6CisJc3RhY2ssIHN0aworCQorQVJHVU1FTlRFOgorCVNUQUNLCisJCitGVU5LVElPTjoKKwlaZWlnZSBhbGxlIERpbmdlIGFuLCBkaWUgYXVmIGRlbSBTdGFjayBsaWVnZW4uCisJCitCRUlTUElFTDoKKwksbWUgaGVyZTsgMSAyIGFycmF5IHN0aworCUVyZ2lidCAoenVtIEJlaXNwaWVsKToKKwkwOiAoeworCSAgICAgMQorCSAgICAgMgorCSAgIH0pCisJMTogL3Jvb20vZ2lsZGUgKGVpbiBSYXVtKQorCTI6IC9zdGQvc2hlbGxzL21hZ2llciM3NjkxIChBdGFtdXIpCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3N3YXAgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3N3YXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVmYWZlMwotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvaGlsZmUvc3dhcApAQCAtMCwwICsxLDggQEAKK0JFRkVITDoKKwlzd2FwCisKK0FSR1VNRU5URToKKwlEaWUgb2JlcnN0ZW4gMiBTdGFja2VsZW1lbnRlLgorCitGVU5LVElPTjoKKwlWZXJ0YXVzY2hlIGRpZSBiZWlkZW4gb2JlcnN0ZW4gRWxlbWVudGUgdm9tIFN0YWNrLgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS90b2RvIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS90b2RvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MmNlZmIKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3RvZG8KQEAgLTAsMCArMSwxNCBAQAorV2FzIG5vY2gga29tbWVuIHNvbGw6CisKKwlEb2t1IHZlcmJlc3Nlcm4sIGRhIGVpbmUgU3RhY2ttYWNoaW5lIG5pY2h0IGplZGVybWFubnMgU2FjaGUgaXN0LgorCShzY2hvbiAiLGhpbGZlIGVpbmxlaXR1bmciIGdlbWFjaHQ/KQorCisJQWxsZXMsIHdhcyBuaWNodCBwbGF5ZXIgaXN0LCBhdXMgZGVtIFJhdW0gaGVyYXVzcmFldW1lbi4KKwk8Y2xlYW51cD4gPworCitXYXMgTklDSFQga29tbWVuIHNvbGw6CisKKwlBbGFybSwgd2VubiBtYW4gYW5nZXNjaGF1dCB3aXJkLiAoV296dSBhdWNoPyA6LSkKKworV2VpdGVyZSBJZGVlbiB3ZXJkZW4gdm9uIFJ1bWF0YSBnZXJuZSBlbnRnZWdlbmdlbm9tbWVuLgorQWJlciBiaXR0ZSBuaWNodCBkYXVlcm5kIGFubGFiZXJuLCBzb25kZXJuIGFscyBtYWlsIDotKQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS90b3AgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3RvcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjA3ZmE5Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS90b3AKQEAgLTAsMCArMSwyMyBAQAorQkVGRUhMOgorCXRvcAorCitBUkdVTUVOVEU6CisJVE9TCisKK0ZVTktUSU9OOgorCVplaWd0IGRhcyBPYmpla3QgYW4sIGRhcyBhdWYgZGVtIFN0YWNrIHp1b2JlcnN0IGxpZWd0ICg9VE9TKS4KKworQkVJU1BJRUxFOgorCTttZSB0b3AKKwlaZWlnZSBkYXMgT2JqZWt0LCBkYXMgbWFuIHNlbGJzdCBpc3QsIGFuLgorCisJO2hlcmUgdG9wCisJWmVpZ2UgZGVuIFJhdW0sIGluIGRlbSBtYW4gc2ljaCBiZWZpbmRldC4KKworCTs7IDEgMiAzIGFycmF5IHRvcCAoRGFzIHp3ZWl0ZSAnOycgaXN0IHdpY2h0aWcpCisJRXJnaWJ0OgorCVRPUz0gKHsKKwkgICAgICAgMQorCSAgICAgICAyCisJICAgICAgIDMKKwkgICAgIH0pCmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3VwZGF0ZSBiL29iai90b29scy90ZWxsZXIvaGlsZmUvdXBkYXRlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMzVhYWQKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3VwZGF0ZQpAQCAtMCwwICsxLDIyIEBACitCRUZFSEw6CisJdXBkYXRlLCB1cGQKKworQVJHVU1FTlRFOgorCVRPUworCitGVU5LVElPTjoKKwlaZXJzdG9lcmUgZGllIEJsdWVwcmludCBkZXMgT2JqZWt0ZXMsIGRhcyBhdWYgZGVtIFN0YWNrIGxpZWd0LCBkYW1pdAorCUFlbmRlcnVuZ2VuIGRlciBGaWxlcyBha3RpdiB3ZXJkZW4ga29lbm5lbi4gR2ViZSBkZXIgQmx1ZXByaW50CisJamVkb2NoIEdlbGVnZW5oZWl0LCBBdWZyYWV1bWFyYmVpdGVuIHp1IHRhZXRpZ2VuLiBTb2xsIGRpZSBCbHVlcHJpbnQKKwl3aXJrbGljaCBoYXJ0IHplcnN0b2VydCB3ZXJkZW4sIHNvIGlzdCBlaW4gUnVmemVpY2hlbiBhbiBkZW4gQmVmZWhsCisJYW56dWhhZW5nZW4uIChhbHNvIGB1cGRhdGUhJykKKwlXaWNodGlnOiBEYXMgZ2VjbG9udGUgT2JqZWt0LCB1ZWJlciBkYXMgZGllIEJsdWVwcmludCB6ZXJzdG9lcnQgd2lyZCwKKwlibGVpYnQgZXJoYWx0ZW4sIGViZW5zbyB3aWUgYWxsZSBhbmRlcmVuIGdlY2xvbnRlbiBPYmpla3RlLgorCitCRUlTUElFTEU6CisJLG1lIC50ZWRkeSB1cGRhdGUKKwlaZXJzdG9lcnQgZGllIEJsdWVwcmludCB2b20gVGVkZHksIGRlbiBtYW4gaGF0LiAoRGFzIGlzdCBuYXR1ZXJsaWNoIG51cgorCWZ1ZXIgTWFnaWVyIHNpbm52b2xsLCBkaWUgZGFzIEZpbGUgZWRpdGllcmVuIGtvbm50ZW4uKQorCitTSUVIRSBBVUNIOgorCSJyb29tdXBkYXRlIgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS92YXJzIGIvb2JqL3Rvb2xzL3RlbGxlci9oaWxmZS92YXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjNmRlYWIKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL2hpbGZlL3ZhcnMKQEAgLTAsMCArMSwyMyBAQAorQkVGRUhMRToKKwk8dmFybmFtZSwgPnZhcm5hbWUKKworQVJHVU1FTlRFOgorCVRPUyAKKwl2YXJuYW1lIC0tIFN0cmluZworCitGVU5LVElPTjoKKwk+dmFybmFtZQorCQlTcGVpY2hlcmUgZGFzIG9iZXJzdGUgRWxlbWVudCBkZXMgU3RhY2tzIGluIGRlciBWYXJpYWJsZQorCQkidmFybmFtZSIgYWIuCisJPHZhcm5hbWUKKwkJS29waWVyZSBkZW4gSW5oYWx0IGRlciBWYXJpYWJsZSAidmFybmFtZSIgYXVmIGRlbiBTdGFjay4KKwkJV2VubiBkZXIgSW5oYWx0IGRlciBWYXJpYWJsZSBlaW5lIEZ1bmt0aW9uIGlzdCwgd28gd2lyZAorCQlkaWVzZSBpbiBTdHJpbmdmb3JtIGF1ZiBkZW4gU3RhY2sgZ2VsZWd0IHVuZCBuaWNodCBhdXMtCisJCWdld2VydGV0LgorCisJRXMga29lbm5lbiBhdXNzZXIgT2JqZWt0ZW4gYXVjaCBBcnJheXMsIFN0cmluZ3MgdW5kIEludGVnZXJzCisJaW4gVmFyaWFibGVuIGdlc3BlaWNoZXJ0IHdlcmRlbi4gV2lyZCBlaW5lIDAgaW4gZWluZXIgVmFyaWFibGUKKwlnZXNwZWljaGVydCwgc28gd2lyZCBkaWUgVmFyaWFibGUgd2llZGVyIGdlbG9lc2NodC4KKworU0lFSEUgQVVDSDoKKwkibWVtb3J5IgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci90X2Jhc2UuYyBiL29iai90b29scy90ZWxsZXIvdF9iYXNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMzNmQzYgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvdF9iYXNlLmMKQEAgLTAsMCArMSwzNjEgQEAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERpZSBCYXNpcy0gdW5kIEhpbGZzZnVua3Rpb25lbiBkZXIgVGVsbGVyLgorLy8gU3RhY2sgdW5kIE1lbW9yeQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2luY2x1ZGUgInRlbGxlci5oIgorCisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8dGVybWluYWwuaD4KKworc3RhdGljIG1peGVkICpzdGFjazsKK3N0YXRpYyBtYXBwaW5nIG1lbW9yeTsKK3N0YXRpYyBvYmplY3QgKm9sZGludjsKK3N0YXRpYyBib29sIG1pdF9uYW1lbjsKK3N0YXRpYyBib29sIGZlaGxlcl9wYXNzaWVydDsKK3N0YXRpYyBib29sIG1pdF9zYXk7CitzdGF0aWMgYm9vbCBzZWN1cmVpbnY7CitzdGF0aWMgYm9vbCBkb2xvZ2FjY2VzczsKK3N0YXRpYyBib29sIHByZXR0eTsKK3N0YXRpYyBib29sIGRvX3Byb2ZpbGU7CisKK3N0YXRpYyBtaXhlZCB0b3AoKTsKK3N0YXRpYyBtaXhlZCBwb3AoKTsKK3N0YXRpYyB2b2lkIHB1c2goIG1peGVkIG9iICk7CisKK3N0YXRpYyB2b2lkIGR1bXBfb2JqKCBtaXhlZCBvYiwgaW50IGluZGVudCApOworCit2b2lkIGNyZWF0ZSgpCit7CisJc3RhY2sgPSAoe30pOworCW1lbW9yeSA9IChbXSk7CisJbWl0X25hbWVuID0gVFJVRTsKKwlmZWhsZXJfcGFzc2llcnQgPSBGQUxTRTsKKwltaXRfc2F5ID0gVFJVRTsKKwlzZWN1cmVpbnYgPSBGQUxTRTsKKwlkb2xvZ2FjY2VzcyA9IEZBTFNFOworCXByZXR0eSA9IFRSVUU7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEhpbGZzZnVua3Rpb25lbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgaW50IGVycm9yKCBzdHJpbmcgbXNnICkKK3sKKwl3cml0ZSggIkZlaGxlciBpbiAiK21zZysiLlxuIiApOworCWZlaGxlcl9wYXNzaWVydCA9IFRSVUU7CisJcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW50IG1lbW8oIHN0cmluZyBtc2cgKQoreworCXdyaXRlKCAiTUVNTzogIittc2crIi5cbiIgKTsKKwlyZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBpbnQgY2FsY2ludiggc3RyaW5nIHN0ciApCit7CisJb2JqZWN0KiBvYnM7CisJb2JqZWN0IG9iOworCWludCB2YWw7CisKKwlpZiggc3NjYW5mKCBzdHIsICIlZCIsIHZhbCApID09IDEgKQorCXsKKwkJb2JzID0gYWxsX2ludmVudG9yeSh0b3AoKSk7CisJCWlmKCB2YWw8MCB8fCB2YWw+PXNpemVvZihvYnMpICkKKwkJCXJldHVybiBlcnJvciggIicuJzogS2VpbiBPYmpla3QgbWl0IGRpZXNlciBOdW1tZXIiICk7CisJCXBvcCgpOworCQlwdXNoKG9ic1t2YWxdKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJaWYoICEob2I9cHJlc2VudChzdHIsdG9wKCkpKSApCisJCXJldHVybiBlcnJvciggIicuJzogS2VpbiBPYmpla3QgbmFtZW5zIFwiIitzdHIrIlwiIGdlZnVuZGVuIiApOworCXBvcCgpOworCXB1c2gob2IpOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgbWl4ZWQgcHVzaF9zdHIoIHN0cmluZyBzdHIgKQoreworCXJldHVybgorCQlwdXNoKCBpbXBsb2RlKG9sZF9leHBsb2RlKCBpbXBsb2RlKG9sZF9leHBsb2RlKCBpbXBsb2RlKG9sZF9leHBsb2RlKAorCQkJCQkiICIrc3RyKyIgIiwKKwkJCQkiXFxuIiksIlxuIiksICJcXGUiKSxFU0MpLCAiXFxiIiksIlxiIikKKwkJWzEuLjwyXSApOworfQorCitzdGF0aWMgdm9pZCBkb19tb3ZlKCBvYmplY3Qgb2IsIG1peGVkIGRlc3QgKQoreworCWludCB3ZWlnaHQ7CisKKwl3ZWlnaHQgPSBvYi0+UXVlcnlXZWlnaHQoKTsKKwlpZiggZW52aXJvbm1lbnQob2IpICkKKwkJZW52aXJvbm1lbnQob2IpLT5BZGRXZWlnaHQoLXdlaWdodCk7CisJb2ItPm1vdmUoZGVzdCxNX05PQ0hFQ0spOworCWRlc3QtPkFkZFdlaWdodCh3ZWlnaHQpOworfQorCit2b2lkIGhlYXJ0X2JlYXQoKQoreworCW9iamVjdCAqbmV3aW52OworCW9iamVjdCBvd25lcjsKKwlpbnQgaSxqOworCisJaWYoIG93bmVyPWZpbmRfcGxheWVyKGdldHVpZCgpKSApCisJeworCQluZXdpbnYgPSBzb3J0X2FycmF5KCBhbGxfaW52ZW50b3J5KG93bmVyKSwgbGFtYmRhKCAoeydhLCdifSksCisJCQkoeyAjJzwsCisJCQkJKHsgIydvYmplY3RfbmFtZSwgJ2EgfSksCisJCQkJKHsgIydvYmplY3RfbmFtZSwgJ2IgfSkKKwkJCX0pCisJCSkgKTsKKwkJaWYoIHBvaW50ZXJwKG9sZGludikgKQorCQl7CisJCQlmb3IoIGk9MCxqPTA7IGk8c2l6ZW9mKG5ld2ludikgJiYgajxzaXplb2Yob2xkaW52KSA7ICkKKwkJCXsKKwkJCQlpZiggbmV3aW52W2ldID09IG9sZGludltqXSApCisJCQkJeyBpKys7IGorKzsgfQorCQkJCWVsc2UgaWYoIG9iamVjdF9uYW1lKG5ld2ludltpXSkgPiBvYmplY3RfbmFtZShvbGRpbnZbal0pICkKKwkJCQl7CisJCQkJCXRlbGxfb2JqZWN0KG93bmVyLAorCQkJCQkJIk1FTU86IFwiIitvYmplY3RfbmFtZShuZXdpbnZbaV0pKyJcIiBlbnRlcmVkIGludmVudG9yeS5cbiIgKTsKKwkJCQkJaSsrOworCQkJCX0KKwkJCQllbHNlCisJCQkJCWorKzsKKwkJCX0KKwkJCWZvciggOyBpPHNpemVvZihuZXdpbnYpIDsgaSsrICkKKwkJCQl0ZWxsX29iamVjdCggb3duZXIsCisJCQkJCSJNRU1POiBcIiIrb2JqZWN0X25hbWUobmV3aW52W2ldKSsiXCIgZW50ZXJlZCBpbnZlbnRvcnkuXG4iICk7CisJCX0KKwl9CisJb2xkaW52ID0gbmV3aW52OworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEdW1wZnVua3Rpb25lbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBkdW1wX2FycmF5KCBtaXhlZCogb2IsIGludCBpbmRlbnQgKQoreworCWludCBpOworCWZvciggaT0wOyBpPHNpemVvZihvYik7IGkrKyApCisJeworCQlwcmludGYoICIlKnMiLCBpbmRlbnQsICIiICk7CisJCWR1bXBfb2JqKCBvYltpXSwgaW5kZW50ICk7CisJfQorfQorCitzdGF0aWMgdm9pZCBkdW1wX21hcHBpbmcoIG1hcHBpbmcgb2IsIGludCBpbmRlbnQgKQoreworCW1peGVkICppbmRleDsKKwltaXhlZCBrZXk7CisJaW50IGksaix2YWx1ZXM7CisKKwlpbmRleCA9IG1faW5kaWNlcyggb2IgKTsKKwl2YWx1ZXMgPSBnZXRfdHlwZV9pbmZvKG9iKVsxXTsKKwlmb3IoIGk9MDsgaTxzaXplb2YoaW5kZXgpOyBpKysgKQorCXsKKwkJa2V5ID0gaW5kZXhbaV07CisJCXByaW50ZiggIiUqcyIsIGluZGVudCwgIiIgKTsKKwkJZHVtcF9vYmooIGtleSwgaW5kZW50ICk7CisJCWZvciggaj0wOyBqPHZhbHVlczsgaisrICkKKwkJeworCQkJcHJpbnRmKCAiJSpzOiAiLCBpbmRlbnQrMSwgIiIgKTsKKwkJCWR1bXBfb2JqKCBvYltrZXksal0sIGluZGVudCszICk7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfb2JqKCBtaXhlZCBvYiwgaW50IGluZGVudCApCit7CisJaWYoICFwcmV0dHkgKQorCXsKKwkJcHJpbnRmKCAiJU9cbiIsIG9iICk7CisJCXJldHVybjsKKwl9CisJaWYoIGludHAob2IpICkKKwkJd3JpdGUoIG9iICsgIlxuIiApOworCWVsc2UgaWYoIGZsb2F0cChvYikgKQorCQlwcmludGYoICIlMS41ZlxuIiwgb2IgKTsKKwllbHNlIGlmKCBzdHJpbmdwKG9iKSApCisJeworCQlpZiAoIG9iPT0iOyIgKQorCQkJd3JpdGUoICI7XG4iICk7CisJCWVsc2UKKwkJeworCQkJd3JpdGUoICJcIiIgKyBpbXBsb2RlKG9sZF9leHBsb2RlKCBpbXBsb2RlKG9sZF9leHBsb2RlKCBpbXBsb2RlKG9sZF9leHBsb2RlKAorCQkJCQkJCSIgIitvYisiICIsCisJCQkJCQkgIlxuIiksIlxcbiIpLCBFU0MpLCAiXFxlIiksICJcYiIpLCJcXGIiKQorCQkJCQkJIFsxLi48Ml0gKyAiXCJcbiIKKwkJCSk7CisJCX0KKwl9CisJZWxzZSBpZiggb2JqZWN0cChvYikgKQorCXsKKwkJaWYoIG1pdF9uYW1lbiApCisJCQl3cml0ZSggb2JqZWN0X25hbWUob2IpKyIgKCIrb2ItPm5hbWUoV0VSLDApKyIpXG4iICk7CisJCWVsc2UKKwkJCXdyaXRlKCBvYmplY3RfbmFtZShvYikrIlxuIiApOworCX0KKwllbHNlIGlmKCBtYXBwaW5ncChvYikgKQorCXsKKwkJd3JpdGUoICIoW1xuIiApOworCQlkdW1wX21hcHBpbmcoIG9iLCBpbmRlbnQgKyAyICk7CisJCXByaW50ZiggIiUqc1xuIiwgaW5kZW50ICsgMiwgIl0pIiApOworCX0KKwllbHNlIGlmKCBwb2ludGVycChvYikgKQorCXsKKwkJd3JpdGUoICIoe1xuIiApOworCQlkdW1wX2FycmF5KCBvYiwgaW5kZW50KzIgKTsKKwkJcHJpbnRmKCAiJSpzXG4iLCBpbmRlbnQrMiAsICJ9KSIgKTsKKwl9CisJZWxzZQorCQlwcmludGYoICIlT1xuIiwgb2IgKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU3BlaWNoZXJmdW5rdGlvbmVuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkIGRvX3JlY2FsbCggbWl4ZWQgYXJnICkKK3sKKwlpZiggbWVtYmVyKG1lbW9yeSxhcmcpICkKKwkJcHVzaCggbWVtb3J5W2FyZywwXSApOworfQorCitzdGF0aWMgdm9pZCBkb19zdG9yZSggbWl4ZWQgYXJnICkKK3sKKwlpZiAoIHNpemVvZihzdGFjaykgKQorCXsKKwkJaWYoICF0b3AoKSApCisJCQltZW1vcnkgPSBtX2RlbGV0ZShtZW1vcnksYXJnKTsKKwkJZWxzZQorCQkJbWVtb3J5ICs9IChbIGFyZzogdG9wKCk7IDAgXSk7CisJfQorCWVsc2UKKwkJbWVtbyggIkVzIHd1cmRlIGtlaW4gV2VydCBpbiBcIiIrYXJnKyJcIiBnZXNwZWljaGVydCIgKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU3RhY2stRnVua3Rpb25lbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZCBwdXNoKCBtaXhlZCBvYiApCit7CisJc3RhY2sgPSAoeyBvYiB9KSArIHN0YWNrOworfQorCitzdGF0aWMgbWl4ZWQgcG9wKCkKK3sKKwltaXhlZCBhbnN3ZXI7CisKKwlpZiggIXNpemVvZiggc3RhY2sgKSApCisJCXJldHVybiBGQUxTRTsKKwlhbnN3ZXIgPSBzdGFja1swXTsKKwlzdGFjayA9IHN0YWNrWzEuLl07CisJcmV0dXJuIGFuc3dlcjsKK30JCisKK3N0YXRpYyBtaXhlZCB0b3AoKQoreworCWlmKCBzaXplb2Yoc3RhY2spICkKKwkJcmV0dXJuIHN0YWNrWzBdOworfQorCitzdGF0aWMgdmFyYXJncyBpbnQgYmVjb21lc19vYmooIG1peGVkIGFyZ3YpCit7CisJb2JqZWN0IG9iOworCisJaWYoICFwb2ludGVycChhcmd2KSApIC8vIGRlZmF1bHQgaXN0IGRlciBzdGFjayAhCisJCWFyZ3YgPSBzdGFjazsKKwlpZiggIXNpemVvZihhcmd2KSApCisJCXJldHVybiBGQUxTRTsgCisJaWYoIHN0cmluZ3AoYXJndlswXSkgJiYgIWNhdGNoKGNhbGxfb3RoZXIoYXJndlswXSwiPyIpKSApCisJeworCSAgYXJndlswXSA9IGZpbmRfb2JqZWN0KGFyZ3ZbMF0pOworCQlyZXR1cm4gVFJVRTsKKwl9CisJZWxzZQorCQlyZXR1cm4gb2JqZWN0cChhcmd2WzBdKTsKK30KKworc3RhdGljIGlzU3ViU3RyKCBwbCwgc3RyLCBsZW4gKQoreworCXJldHVybiBnZXR1aWQocGwpWzAuLmxlbl0gPT0gc3RyOworfQorCitzdGF0aWMgYmVjb21lc19wbChhcmd2KQoreworCW9iamVjdCBwbDsKKwlvYmplY3QqIHBsbGlzdDsKKwlzdHJpbmcgc3RyOworCWludCBsZW47CisKKwlpZiggIWFyZ3YgKSBhcmd2ID0gc3RhY2s7CisJaWYoICFzaXplb2YoYXJndikgfHwgKCBiZWNvbWVzX29iaigpICYmICFpbnRlcmFjdGl2ZShhcmd2WzBdKSApICkKKwkJcmV0dXJuIEZBTFNFOworCWlmKCBzdHJpbmdwKGFyZ3ZbMF0pICkKKwl7CisJCXN0ciA9IGxvd2VyX2Nhc2UoIGFyZ3ZbMF0gKTsKKwkJcGwgPSAwOworCQlpZiggc3RyWzwxLi48MV0gPT0gIioiICkKKwkJewkKKwkJCXN0ciA9IHN0clswLi48Ml07CisJCQlsZW4gPSBzaXplb2Yoc3RyKSAtIDE7CisJCQlwbGxpc3QgPSBmaWx0ZXIoIHVzZXJzKCksICMnaXNTdWJTdHIsIHN0ciwgbGVuICk7CisJCQlpZiggc2l6ZW9mKHBsbGlzdCkgPT0gMSApCisJCQl7CisJCQkJcGw9cGxsaXN0WzBdOworCQkJCWFyZ3ZbMF0gPSBwbDsKKwkJCX0KKwkJfQorCQlpZiggIXBsICYmIHBsPWZpbmRfcGxheWVyKGFyZ3ZbMF0pICkKKwkJCWFyZ3ZbMF0gPSBwbDsKKwkJcmV0dXJuIHBsOworCX0KKwlyZXR1cm4gYXJndlswXTsKK30KKworc3RhdGljIER1bXBPYmooIG9iICkKK3sKKyAgc3RyaW5nIGFuczsKKyAgaW50IGksajsKKworICBpZiggaW50cChvYikgKQorICAgIHJldHVybiAiIitvYjsKKyAgZWxzZSBpZiggc3RyaW5ncChvYikgKQorICAgIHJldHVybiAiXCIiK2ltcGxvZGUoZXhwbG9kZShvYiwiXG4iKSwiXFxuIikrIlwiIjsKKyAgZWxzZSBpZiggb2JqZWN0cChvYikgKQorICAgIHJldHVybiAiXCIiK29iamVjdF9uYW1lKG9iKSsiXCIiOworICBlbHNlIGlmKCBtYXBwaW5ncChvYikgKQorICB7CisgICAgYW5zPSIoWyI7CisgICAgZm9yKCBpPTA7IGk8c2l6ZW9mKG9iKS0xOyBpKysgKQorICAgICAgYW5zICs9IER1bXBNYXBwKG9iLGkpKyIsIjsKKyAgICAvLyByZWx5IG9uIHJpZ2h0IHZhbHVlIG9mIGkKKyAgICByZXR1cm4gYW5zK0R1bXBNYXBwKG9iLGkpKyJdKSI7CisgIH0KKyAgZWxzZQorICB7CisgICAgYW5zPSIoeyI7CisgICAgZm9yKCBpPTA7IGk8c2l6ZW9mKG9iKS0xOyBpKysgKQorICAgICAgYW5zICs9IER1bXBPYmoob2JbaV0pKyIsIjsKKyAgICAvLyByZWx5IG9uIHJpZ2h0IHZhbHVlIG9mIGkKKyAgICByZXR1cm4gYW5zK0R1bXBPYmoob2JbaV0pKyJ9KSI7CisgIH0KK30KKworc3RhdGljIER1bXBNYXBwKG9iLGkpCit7CisgIGludCBqLHZ6OworICBzdHJpbmcgYW5zOworCisgIHZ6ID0gZ2V0X3R5cGVfaW5mbyhvYilbMV07CisgIGFucyA9IER1bXBPYmoobV9pbmRpY2VzKG9iKVtpXSkrIjoiOworICBmb3IoIGo9MDsgajx2ei0xOyBqKysgKQorICAgIGFucyArPSBEdW1wT2JqKG9iW21faW5kaWNlcyhvYilbaV0sal0pKyI7IjsKKyAgLy8gcmVseSBvbiB2YWx1ZSBvZiBqCisgIHJldHVybiBhbnMgKyBEdW1wT2JqKG9iW21faW5kaWNlcyhvYilbaV0sal0pOworfQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci90X2NtZHMuYyBiL29iai90b29scy90ZWxsZXIvdF9jbWRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhmYTVkMwotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvdF9jbWRzLmMKQEAgLTAsMCArMSwxMDAwIEBACisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCdWlsdGlua29tbWFuZG9zIGRlciBUZWxsZXIuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaW5jbHVkZSAidGVsbGVyLmgiCitpbmhlcml0IFRfQkFTRTsKKworI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPGF0dHJpYnV0ZXMuaD4KKyNpbmNsdWRlIDx0ZXJtaW5hbC5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorCitzdGF0aWMgdm9pZCBkb19yaW52KCBvYmplY3QgZW52LCBpbnQgZGVwdGggKTsKK3N0YXRpYyBzY2FuX29iaiggb2JqZWN0IHBsYXllciwgb2JqZWN0IG9iaiApOworc3RhdGljIHZvaWQgbWtfd2FpdGZvciggbWl4ZWQgd2FpdGZvciApOworc3RhdGljIHZvaWQgbWtfYXV0b2xvYWQoIG1peGVkIGF1dG9sb2FkICk7CitzdGF0aWMgaW50IGRvX3Jvb211cGRhdGUoIGludCBkZXN0ZmxhZywgaW50IG5vaXRlbXMgKTsKK3N0YXRpYyBpbnQgZG9fY2xlYW5vZiggaW50IHN0cm9uZyApOworCisvLyBmcm9tIHRlbGxlci5jCitzdGF0aWMgaW50IGRvX2NtZCggc3RyaW5nIHN0ciApOworCitzdGF0aWMgaW50IGNtZF9jbGVhcigpCit7CisJc3RhY2sgPSAoe30pOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9wb3AoKQoreworCWlmKCAhc2l6ZW9mKHN0YWNrKSApCisJCXJldHVybiBlcnJvciggInBvcDogRGVyIFN0YWNrIGlzdCBsZWVyIiApOworCXBvcCgpOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF90b3AoKQoreworCWlmKCAhc2l6ZW9mKHN0YWNrKSApCisJCXJldHVybiBlcnJvciggInRvcDogRGVyIFN0YWNrIGlzdCBsZWVyIiApOworCXdyaXRlKCAiVE9TPSAiICk7CisJZHVtcF9vYmooIHRvcCgpLCA1ICk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX3N3YXAoKQoreworCW1peGVkIHRtcDsKKworCWlmKCBzaXplb2Yoc3RhY2spPDIgKQorCQlyZXR1cm4gZXJyb3IoICJzd2FwOiBLZWluZSAyIEVsZW1lbnRlIGF1ZiBkZW0gU3RhY2siICk7CisJdG1wID0gc3RhY2tbMF07CisJc3RhY2tbMF0gPSBzdGFja1sxXTsKKwlzdGFja1sxXSA9IHRtcDsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfZHVwKCkKK3sKKwlpZiggIXNpemVvZihzdGFjaykgKQorCQlyZXR1cm4gZXJyb3IoICJkdXA6IERlciBTdGFjayBpc3QgbGVlciIgKTsKKwlwdXNoKHRvcCgpKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfaGVyZSgpCit7CisJcHVzaChlbnZpcm9ubWVudChQTCkpOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9zdGFjaygpCit7CisgIGludCBpOworICBpZiggIXNpemVvZihzdGFjaykgKQorICAgIHJldHVybiBtZW1vKCAiRGVyIFN0YWNrIGlzdCBsZWVyIiApOworCisgIGZvciggaT0wOyBpPHNpemVvZihzdGFjayk7IGkrKyApCisgIHsKKyAgICBwcmludGYoICIlMmQ6ICIsIGkgKTsKKyAgICBkdW1wX29iaiggc3RhY2tbaV0sIDQgKTsKKyAgfQorICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfaW52KCkKK3sKKyAgaW50IGk7CisgIG9iamVjdCBvYjsKKworCWlmKCAhYmVjb21lc19vYmooKSApCisJCXJldHVybiBlcnJvciggImludjogVE9TIGlzdCBrZWluIE9iamVrdCIgKTsKKyAgd3JpdGUoICJJbnZlbnRhciB2b24gIiApOworICBkdW1wX29iaiggdG9wKCksIDEzICk7CisgIGZvciggaT0wLCBvYj1maXJzdF9pbnZlbnRvcnkodG9wKCkpOyBvYjsgb2I9bmV4dF9pbnZlbnRvcnkob2IpLCBpKysgKQorICB7CisgICAgcHJpbnRmKCAiJTJkLiAiLCBpICk7CisgICAgZHVtcF9vYmooIG9iLCA0ICk7CisgIH0KKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX3Jla2ludigpCit7CisJaWYoICFiZWNvbWVzX29iaigpICkKKwkJcmV0dXJuIGVycm9yKCAicmVraW52OiBUT1MgaXN0IGtlaW4gT2JqZWt0IiApOworCXdyaXRlKCAiSW52ZW50YXIgdm9uICIgKTsKKwlkdW1wX29iaiggdG9wKCksIDEzICk7CisKKwlkb19yaW52KCB0b3AoKSwgMiApOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZCBkb19yaW52KCBvYmplY3QgZW52LCBpbnQgZGVwdGggKQoreworCWludCBpOworCW9iamVjdCBvYjsKKworCWZvciggaT0wLCBvYj1maXJzdF9pbnZlbnRvcnkoZW52KTsgb2I7IG9iPW5leHRfaW52ZW50b3J5KG9iKSwgaSsrICkKKwl7CisJCXByaW50ZiggIiUqZC4gIiwgZGVwdGgsIGkgKTsKKwkJZHVtcF9vYmooIG9iLCAyK2RlcHRoICk7CisJCWRvX3JpbnYoIG9iLCBkZXB0aCsyICk7CisJfQorfQorCitzdGF0aWMgaW50IGNtZF9tZSgpCit7CisJcHVzaCggUEwgKTsKKwlyZXR1cm4gVFJVRTsKK30KKworLy8gVWViZXJub21tZW4gYXVzIGRlbSBUZWRkeSAobWl0IGZyZXVuZGxpY2hlciBHZW5laG1pZ3VuZyB2b24gU2lyKS4KK3N0YXRpYyBpbnQgY21kX3NjYW4oKQoreworCW9iamVjdCBvYmo7CisKKwlpZiggIWJlY29tZXNfcGwoKSAmJiAoICFvYmplY3RwKHRvcCgpKSB8fCAhbGl2aW5nKHRvcCgpKSApICkKKwl7CisJCWlmKCBzdHJpbmdwKHRvcCgpKSAmJiBmaWxlX3NpemUoICIvc2F2ZS8iK3RvcCgpWzAuLjBdKyIvIit0b3AoKSsiLm8iKSA+IDAgKQorCQl7CisJCQlvYmogPSBjbG9uZV9vYmplY3QoIFRfUExBWUVSICk7CisJCQlvYmotPkxvYWQoIHRvcCgpICk7CisJCQlvYmotPlNldFByb3AoIFBfTkFNRSwgY2FwaXRhbGl6ZSggcG9wKCkgKSApOworCQkJc2Nhbl9vYmooIFRSVUUsIG9iaiApOworCQkJZGVzdHJ1Y3QoIG9iaiApOworCQkJcmV0dXJuIFRSVUU7CisJCX0KKwkJcmV0dXJuIGVycm9yKCAic2NhbjogVE9TIGlzdCBrZWluIExlYmV3ZXNlbiIgKTsKKwl9CisKKwlzY2FuX29iaiggcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSggdG9wKCkgKSwgcG9wKCkgKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBXaXpMZXZlbCggb2JqZWN0IG9iaiApCit7CisJaWYoIG9iai0+Tm90bG9nZ2VkKCkgKQorCQlyZXR1cm4gcXVlcnlfd2l6X2xldmVsKCBsb3dlcl9jYXNlKG9iai0+cGxheWVybmFtZSgpKSApOworCWVsc2UKKwkJcmV0dXJuIHF1ZXJ5X3dpel9sZXZlbCggb2JqICk7Cit9CisKK3N0YXRpYyBzdHJpbmcgSXBOYW1lKCBvYmplY3Qgb2JqICkKK3sKKwlzdHJpbmcgaXBfbmFtZSwgaXBfbnVtLCBubTsKKworCWlmKCBvYmotPk5vdGxvZ2dlZCgpICkKKwl7CisJCS8vIEF1cyBVbXN0ZWxsdW5nc2dydWVuZGVuIHdlcmRlbiBDQUxMRURfRlJPTV9JUCB1bmQgSVBfTkFNRQorCQkvLyBhYmdlZnJhZ3QuIElQX05BTUUgaXN0IG5ldWVyLgorCisJCW5tID0gbG93ZXJfY2FzZShvYmotPnBsYXllcm5hbWUoKSk7CisJCWlwX25hbWUgPSBvYmotPlF1ZXJ5UHJvcChQX0NBTExFRF9GUk9NX0lQKTsKKwkJaWYoICFpcF9uYW1lICkgaXBfbmFtZSA9IG9iai0+UXVlcnkoUF9JUF9OQU1FKTsKKwkJcmV0dXJuIGlwX25hbWUgKyAiICgiCisJCQkrIGR0aW1lKGdldF9kaXIoIi9zYXZlLyIrbm1bMC4uMF0rIi8iK25tKyIubyIsNClbMF0pICsiKSI7CisJfQorCWVsc2UKKwl7CisJCW5tID0gbG93ZXJfY2FzZSggb2JqLT5uYW1lKFJBVykgKTsKKwkJaXBfbmFtZSA9IHF1ZXJ5X2lwX25hbWUoIG9iaiApOworCQlpZiggaXBfbmFtZSA9PSAiIiB8fCAhaXBfbmFtZSApCisJCXsKKwkJCWlwX25hbWUgPSBvYmotPlF1ZXJ5UHJvcChQX0NBTExFRF9GUk9NX0lQKTsKKwkJCWlmKCAhaXBfbmFtZSApIGlwX25hbWUgPSBvYmotPlF1ZXJ5KFBfSVBfTkFNRSk7CisJCQlyZXR1cm4gaXBfbmFtZSArICIgKCIKKwkJCQkrIGR0aW1lKGdldF9kaXIoIi9zYXZlLyIrbm1bMC4uMF0rIi8iK25tKyIubyIsNClbMF0pICsiKSI7CisJCX0KKwkJcmV0dXJuIGlwX25hbWUgKyAiIFsiICsgcXVlcnlfaXBfbnVtYmVyKG9iaikgKyAiXSI7CisJfQorfQorCitzdHJpbmcgSWRsZVRpbWUoIG9iamVjdCBvYmogKQoreworCWlmKCBvYmotPk5vdGxvZ2dlZCgpICkgcmV0dXJuICItbmljaHQgZGEtIjsKKwlpZiggcXVlcnlfaXBfbnVtYmVyKG9iaikgKSByZXR1cm4gIiIrcXVlcnlfaWRsZShvYmopOworCXJldHVybiAiLW5ldHp0b3QtIjsKK30KKworc3RhdGljIHNjYW5fb2JqKCBvYmplY3QgcGxheWVyLCBvYmplY3Qgb2JqICkKK3sKKwlzdHJpbmcgdGl0bGUsIGxldmVsLCBnZW5kZXIsIHJvb20sIHRlc3RwbCwKKwkJd2VhcG9uLCBhcm1vdXIsIHF1ZXN0LCBzdGF0X3N0ciwgKmFycjsKKwlpbnQgaSxhYzsKKwlvYmplY3Qgd2VhcG9ub2JqLCAqbGlzdCwgKmdlZ25lcjsKKwltaXhlZCAqaGFuZHMsICpxdWVzdHMsICpzdGF0czsKKworCS8vIDEuWmVpbGUgOiBOYW1lIFRpdGVsIC0gUmFzc2UgLSBbIFdpemxldmVsIF0KKwl0aXRsZSA9IG9iai0+UXVlcnlQcm9wKFBfVElUTEUpOworCisgIGlmKCAhcGxheWVyICkKKyAgICBsZXZlbCA9ICJNb25zdGVyIiA7CisgIGVsc2UgaWYoIFdpekxldmVsKCBvYmogKSA8IFdJWkFSRF9MVkwgKQorCXsKKwkJaWYoIHRlc3RwbD1vYmotPlF1ZXJ5UHJvcCggUF9URVNUUExBWUVSICkgKQorCQl7CisJCQlpZiggc3RyaW5ncCh0ZXN0cGwpICkKKwkJCQlsZXZlbCA9ICIoIit0ZXN0cGwrIikiOworCQkJZWxzZQorCQkJCWxldmVsID0gIlRlc3RzcGllbGVyIjsKKwkJfQorCQllbHNlIGlmKCBXaXpMZXZlbCggb2JqICkgPj0gU0VFUl9MVkwgKQorCQkJbGV2ZWwgPSAiU2VoZXIiOworCQllbHNlCisJCQlsZXZlbCA9ICJTcGllbGVyIiA7CisJfQorICBlbHNlIGlmKCBXaXpMZXZlbCggb2JqICkgPj0gR09EX0xWTCApCisgICAgbGV2ZWwgPSAiTXVkR290dCIgOworICBlbHNlIGlmKCBXaXpMZXZlbCggb2JqICkgPj0gQVJDSF9MVkwgKQorICAgIGxldmVsID0gIkVyem1hZ2llciIgOworICBlbHNlIGlmKCBXaXpMZXZlbCggb2JqICkgPj0gTE9SRF9MVkwgKQorICAgIGxldmVsID0gIlJlZ2lvbnNtYWdpZXIiIDsKKyAgZWxzZQorICAgIGxldmVsID0gIk1hZ2llciIgOworCisgIGlmKCAhb2JqLT5zaG9ydCgpICkKKyAgICBsZXZlbCArPSAiLCB1bnNpY2h0YmFyIiA7CisgIGlmKCBvYmogLT4gUXVlcnlQcm9wKCBQX0ZST0cgKSApCisgICAgbGV2ZWwgKz0gIiwgRnJvc2NoIiA7CisgIGlmKCBvYmotPlF1ZXJ5UHJvcCggUF9HSE9TVCApICkKKyAgCWxldmVsICs9ICIsIHRvdCI7CisJaWYoIG9iai0+Tm90bG9nZ2VkKCkgKQorCQlsZXZlbCArPSAiLCBhdXNnZWxvZ2d0IjsKKwlpZihvYmotPlF1ZXJ5UHJvcChQX1NFQ09ORCkgKQorCQlsZXZlbCArPSIsIFp3ZWl0aWUiOworCisJaWYoIGVudmlyb25tZW50KG9iaikgKQorCQlyb29tID0gb2JqZWN0X25hbWUoZW52aXJvbm1lbnQoIG9iaiApKTsKKwllbHNlCisJCXJvb20gPSAiLW5pcmdlbmRzLSI7CisKKyAgcHJpbnRmKCAiJXMgJXMgJXNbICVzIF0uXG5CZWZpbmRldCBzaWNoIGluICVzLlxuIiwKKwkJb2JqLT5uYW1lKFJBVyksIHRpdGxlPyB0aXRsZSA6ICIiLAorCQlzdHJpbmdwKG9iai0+UXVlcnlQcm9wKFBfUkFDRSkpID8gIi0gIitvYmotPlF1ZXJ5UHJvcChQX1JBQ0UpKyIgLSAiIDogIiIsCisJCWxldmVsLCByb29tICkgOworCisJLy8gMSBhYmMgWmVpbGUgOiBIb3N0LEVtYWlsLFNub29wZXIKKwlpZiggcGxheWVyICkKKwl7CisJCXByaW50ZiggIkhvc3QuLi4uLi4uOiAlc1xuIiwgSXBOYW1lKG9iaikgKTsKKwkJcHJpbnRmKCAiRS1NYWlsLi4uLi46ICVzLlxuIiwgb2JqLT5RdWVyeVByb3AoUF9NQUlMQUREUikgKTsKKwkJaWYoICFvYmotPk5vdGxvZ2dlZCgpICYmIHF1ZXJ5X3Nub29wKG9iaikgKQorCQkJcHJpbnRmKCAiU25vb3Blci4uLi46ICVzLlxuIiwgY2FwaXRhbGl6ZShnZXR1aWQocXVlcnlfc25vb3Aob2JqKSkpICk7CisKKwkJcHJpbnRmKCAiVm9yc2ljaHQuLi46ICUxMWQgS3Vyem1vZHVzLjogJTExcyBNYWdpZXJibGljay4uLi46ICUxMXMuXG4iLAorCQkJb2JqLT5RdWVyeVByb3AoUF9XSU1QWSksIG9iai0+UXVlcnlQcm9wKFBfQlJJRUYpID8gIi1hbi0iIDogIi1hdXMtIiwKKwkJCW9iai0+UXVlcnlQcm9wKFBfV0FOVFNfVE9fTEVBUk4pID8gIi1hbi0iIDogIi1hdXMtIiApOworCQlwcmludGYoICJJZGxlemVpdC4uLjogJTExcyBBbHRlci4uLi4uOiAlMTFzIFZlcmhlaXJhdGV0IG1pdDogJS0xMXMuXG4iLAorCQkJSWRsZVRpbWUob2JqKSwgdGltZTJzdHJpbmcoIiU1ZDolMDJoOiUwMm0iLG9iai0+UXVlcnlQcm9wKFBfQUdFKSoyKSwKKwkJCShzdHJpbmdwKG9iai0+UXVlcnlQcm9wKFBfTUFSUklFRCkpID8gb2JqLT5RdWVyeVByb3AoUF9NQVJSSUVEKSA6ICItIiApCisJCSk7CisJfQorCisgIC8vIDIuWmVpbGUgOiBIUCwgU1AgdW5kIFhQCisgIHByaW50ZiggIkxlYmVuc3BrdC4uOiBbJTRkLyU0ZF0gTWFnaWVwa3QuLjogWyU0ZC8lNGRdLlxuIiArCisgICAgIlF1ZXN0cHVua3RlOiBbJTRkLyU0ZF0gRXJmYWhydW5nLjogJTExZC5cbiIsCisgICAgb2JqLT5RdWVyeVByb3AoUF9IUCksIG9iai0+UXVlcnlQcm9wKFBfTUFYX0hQKSwKKwkJb2JqLT5RdWVyeVByb3AoUF9TUCksIG9iai0+UXVlcnlQcm9wKFBfTUFYX1NQKSwKKwkJb2JqLT5RdWVyeVByb3AoUF9RUCksICIvc2VjdXJlL3F1ZXN0bWFzdGVyIi0+UXVlcnlNYXhRUCgpLAorCQlvYmotPlF1ZXJ5UHJvcChQX1hQKSApOworCisgIC8vIDMuWmVpbGUgOiBGT09ELCBEUklOSywgQUxDT0hPTAorICBwcmludGYoICJOYWhydW5nLi4uLjogWyU0ZC8lNGRdIEZsdWVzc2lnay46IFslNGQvJTRkXSAiICsKKyAgICAiQWxrb2hvbC4uLi4uLi4uOiBbJTRkLyU0ZF0uXG4iLAorICAgIG9iai0+UXVlcnlQcm9wKFBfRk9PRCksIG9iai0+UXVlcnlQcm9wKFBfTUFYX0ZPT0QpLAorICAgIG9iai0+UXVlcnlQcm9wKFBfRFJJTkspLCBvYmotPlF1ZXJ5UHJvcChQX01BWF9EUklOSyksCisgICAgb2JqLT5RdWVyeVByb3AoUF9BTENPSE9MKSwgb2JqLT5RdWVyeVByb3AoUF9NQVhfQUxDT0hPTCkgKSA7CisKKyAgLy8gNC5aZWlsZSA6IEdlc2NobGVjaHQsIEFsaWdubWVudCwgTGV2ZWwKKyAgc3dpdGNoKCBvYmotPlF1ZXJ5UHJvcChQX0dFTkRFUikgKQorICB7CisgICAgY2FzZSBGRU1BTEUgOiBnZW5kZXIgPSAid2VpYmxpY2ggICAiIDsgYnJlYWsgOworICAgIGNhc2UgTUFMRSAgIDogZ2VuZGVyID0gIm1hZW5ubGljaCAgIiA7IGJyZWFrIDsKKyAgICBkZWZhdWx0ICAgICA6IGdlbmRlciA9ICJuZXV0cnVtICAgICIgOyBicmVhayA7CisgIH0KKyAgcHJpbnRmKAorCQkiR2VzY2hsZWNodC46ICVzIENoYXJha3Rlci46ICUxMWQgKE1hZ2llcilTdHVmZS4uOiBbJTRzLyU0ZF0uXG4iLCAKKyAgICBnZW5kZXIsIG9iai0+UXVlcnlQcm9wKFBfQUxJR04pLAorCQlwbGF5ZXIgPyBXaXpMZXZlbChvYmopKyIiIDogIi0iLCBvYmotPlF1ZXJ5UHJvcChQX0xFVkVMKSApOworCisJLy8gNS5aZWlsZSA6IEdlbGQsIEdld2ljaHQsIFBsYXllcmtpbGxzCisJcHJpbnRmKCAiR2VsZC4uLi4uLi46ICUxMWQgVHJhZWd0Li4uLjogJTExZCBQbGF5ZXJraWxscy4uLi46ICUxMWQuXG4iLAorCQlvYmotPlF1ZXJ5TW9uZXkoKSwgb2JqLT5xdWVyeV93ZWlnaHRfY29udGVudHMoKSwKKwkJb2JqLT5RdWVyeVByb3AoUF9LSUxMUykgKTsKKworICAvLyA2LlplaWxlIDogc3RhdGkKKyAgc3RhdHMgPSBvYmotPlF1ZXJ5UHJvcChQX0FUVFJJQlVURVMpIDsKKwlhcnIgPSBtX2luZGljZXMoIHN0YXRzICk7CisgIHN0YXRfc3RyID0gIiIgOworICBmb3IoIGkgPSAwOyBpIDwgc2l6ZW9mKCBhcnIgKTsgaSsrICkgeworICAgIHN0YXRfc3RyICs9IGNhcGl0YWxpemUoYXJyWyBpIF0pICsgIlsiICsgc3RhdHNbYXJyWyBpIF1dOworICAgIGlmKCBhYyA9IG9iai0+UXVlcnlBdHRyaWJ1dGVPZmZzZXQoYXJyW2ldKSApIHsKKyAgICAJc3RhdF9zdHIgKz0gIisiICsgYWM7CisgICAgfQorICAgIHN0YXRfc3RyICs9ICJdLCAiOworICB9CisKKyAgaWYoIHN0YXRfc3RyID09ICIiICkKKyAgICBzdGF0X3N0ciA9ICJLZWluZSIgOworICBlbHNlCisgICAgc3RhdF9zdHIgPSBzdGF0X3N0clswLi5zaXplb2YoIHN0YXRfc3RyICkgLSAzXSA7CisgIHByaW50ZiggIkF0dHJpYnV0ZS4uOiAlcy5cbiIsIHN0YXRfc3RyICkgOworCisgIC8vIDcuWmVpbGUgOiBXYWZmZSggRGF0ZWluYW1lIClbIEFDIF0KKyAgLy8gOC5aZWlsZSA6IFJ1ZXN0dW5nKGVuKVsgV0MgXQorCXdlYXBvbm9iaj1vYmotPlF1ZXJ5UHJvcChQX1dFQVBPTik7CisJaWYoIHdlYXBvbm9iaiApCisgICAgd2VhcG9uID0gd2VhcG9ub2JqLT5uYW1lKFJBVykgKyAiICgiICsgCisgICAgICBvYmplY3RfbmFtZSggd2VhcG9ub2JqICkgKyAiKSBbIiArCisgICAgICB3ZWFwb25vYmotPlF1ZXJ5UHJvcChQX1dDKSArICJdIiA7CisJZWxzZQorCXsKKwkJaGFuZHMgPSBvYmotPlF1ZXJ5UHJvcChQX0hBTkRTKTsKKwkJd2VhcG9uID0gc3ByaW50ZiggImthZW1wZnQlcyBbJWRdIiwgaGFuZHNbMF0sIGhhbmRzWzFdICk7CisJfQorCWFjID0gMDsKKwlsaXN0ID0gb2JqLT5RdWVyeVByb3AoUF9BUk1PVVJTKTsKKwlhcm1vdXIgPSAiIjsKKwlmb3IoIGkgPSAwOyBpIDwgc2l6ZW9mKCBsaXN0ICk7IGkrKyApCisJeworICAgICBhcm1vdXIgKz0gKCBsaXN0W2ldLT5uYW1lKFJBVykgKyAiWyIgKworICAgICAgICAgbGlzdFtpXS0+UXVlcnlQcm9wKFBfQUMpICsgIl0iICsgIiwgIikgOworCQkgYWMgKz0gbGlzdFtpXS0+UXVlcnlQcm9wKFBfQUMpOworCX0KKworICBpZiggYXJtb3VyID09ICIiICkKKyAgICBhcm1vdXIgPSAiS2VpbmUgICIgOworCisJYXJyID0gb2xkX2V4cGxvZGUoIGJyZWFrX3N0cmluZyggYXJtb3VyWzAuLjwzXStzcHJpbnRmKCIgPT5bJWRdIiwKKwkJYWMrb2JqLT5RdWVyeVByb3AoUF9CT0RZKSApLCA2NSApLCAiXG4iICkgOworCWFybW91ciA9IGFyclsgMCBdIDsKKwlmb3IoIGkgPSAxOyBpIDwgc2l6ZW9mKCBhcnIgKTsgaSsrICkKKwkJYXJtb3VyICs9ICJcbiAgICAgICAgICAgICAiICsgYXJyWyBpIF0gOworICBwcmludGYoICJXYWZmZS4uLi4uLjogJXMuXG5SdWVzdHVuZy4uLjogJXMuXG4iLCB3ZWFwb24sIGFybW91ciApIDsKKworCWdlZ25lciA9IG9iai0+UXVlcnlFbmVtaWVzKCk7CisJaWYoIHBvaW50ZXJwKGdlZ25lcikgKQorCXsKKwkJZ2VnbmVyID0gZ2VnbmVyWzBdOworCQlmb3IoIGk9MDsgaTxzaXplb2YoZ2VnbmVyKTsgaSsrICkKKwkJeworCQkJaWYoIGk9PTAgKSBwcmludGYoICJHZWduZXIuLi4uLjogIik7IGVsc2UgcHJpbnRmKCAiICAgICAgICAgICAgICIgKTsKKwkJCWlmKCAhb2JqZWN0cChnZWduZXJbaV0pICkKKwkJCQlwcmludGYoICI8JU8+XG4iLCBnZWduZXJbaV0gKTsKKwkJCWVsc2UKKwkJCQlwcmludGYoICIlcyAoJXMpXG4iLCBnZWduZXJbaV0tPm5hbWUoV0VSLDApLCBvYmplY3RfbmFtZShnZWduZXJbaV0pICk7CisJCX0KKwl9CisKKwlta193YWl0Zm9yKCBvYmotPlF1ZXJ5UHJvcChQX1dBSVRGT1IpICk7CisKKwlta19hdXRvbG9hZCggb2JqLT5RdWVyeVByb3AoUF9BVVRPTE9BRCkgKTsKKworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZCBta193YWl0Zm9yKCBtaXhlZCB3YWl0Zm9yICkKK3sKKwlzdHJpbmcgc3RyOworCWludCBpOworCisJaWYoICFwb2ludGVycCh3YWl0Zm9yKSB8fCBzaXplb2Yod2FpdGZvcik9PTAgKQorCQlyZXR1cm47CisJc3RyID0gIldhaXRpbmcgZm9yOiAiOworCWZvciggaT1zaXplb2Yod2FpdGZvciktMTsgaT4wOyBpLS0gKQorCQlzdHIgKz0gd2FpdGZvcltpXSArICIsICI7CisJc3RyICs9IHdhaXRmb3JbMF07CisJd3JpdGUoIHN0cisiXG4iICk7Cit9CisJCitzdGF0aWMgdm9pZCBta19hdXRvbG9hZCggbWl4ZWQgYXV0b2xvYWQgKQoreworCXN0cmluZyBzdHIsICpvYmpsaXN0OworCWludCBpOworCisJaWYoICFtYXBwaW5ncChhdXRvbG9hZCkgKQorCQlyZXR1cm47CisJc3RyID0gIkF1dG9sb2FkLi4uOiAiOworCW9iamxpc3QgPSBtX2luZGljZXMoYXV0b2xvYWQpOworCWZvciggaT1zaXplb2Yob2JqbGlzdCktMTsgaT49MDsgaS0tICkKKwl7CisJCXN0ciArPSAiXCIiICsgb2JqbGlzdFtpXSArICJcIlxuIjsKKwkJaWYoIGk+MCApCisJCQlzdHIgKz0gIiAgICAgICAgICAgICAiOworCX0KKwl3cml0ZSggc3RyICk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X21lbW9yeV9saW5lKCBzdHJpbmcga2V5LCBvYmplY3QgZGF0YSwgaW50IGZsYWcgKQoreworICBwcmludGYoICIgJS0xMHMlcyAiLCBrZXksIChmbGFnID8gIj4iIDogIj0iKSApOworICBkdW1wX29iaiggZGF0YSwgMTMgKTsKK30KKwkKK3N0YXRpYyBpbnQgY21kX21lbW9yeSgpCit7CisgIGludCBpOworICBpZiggIXNpemVvZihtZW1vcnkpICkKKyAgICByZXR1cm4gbWVtbyggIktlaW5lIFZhcmlhYmxlbiBkZWZpbmllcnQiICk7CisKKyAgd2Fsa19tYXBwaW5nKCBtZW1vcnksICMncHJpbnRfbWVtb3J5X2xpbmUgKTsKKyAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX2FycmF5KCkKK3sKKyAgbWl4ZWQgKmFycmF5OworICBtaXhlZCBvYjsKKworCWlmKCAhc2l6ZW9mKHN0YWNrKSApCisJCXJldHVybiBlcnJvciggImFycmF5OiBEZXIgU3RhY2sgaXN0IGxlZXIiICk7CisgIGFycmF5ID0gKHt9KTsKKyAgd2hpbGUoIHNpemVvZihzdGFjaykgJiYgKG9iPXBvcCgpKSAmJiBvYiE9IjsiICkKKyAgICBhcnJheSA9ICh7b2J9KSArIGFycmF5OworICBwdXNoKCBhcnJheSApOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9zcGxpdCgpCit7CisgIG1peGVkICphcnJheTsKKyAgaW50IGk7CisKKwlpZiggIXBvaW50ZXJwKHRvcCgpKSApCisJCXJldHVybiBlcnJvciggInNwbGl0OiBUT1MgaXN0IGtlaW4gQXJyYXkiICk7CisgIGFycmF5PXBvcCgpOworICBpZiggc2l6ZW9mKHN0YWNrKSApCisgICAgcHVzaCggIjsiICk7CisgIGZvciggaT0wOyBpPHNpemVvZihhcnJheSk7IGkrKyApCisgICAgcHVzaChhcnJheVtpXSk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX3BsYXllcigpCit7CisJb2JqZWN0IG9iOworCXN0cmluZyBzdHI7CisKKwlzdHIgPSB0b3AoKTsKKwlpZiggIXN0cmluZ3Aoc3RyKSApCisJCXJldHVybiBlcnJvciggInBsYXllcjogVE9TIGlzdCBrZWluIFN0cmluZyIgKTsKKwlvYiA9IGJlY29tZXNfcGwoKTsKKwlpZiggIW9iICkKKwkJcmV0dXJuIGVycm9yKCAicGxheWVyOiBLZWluZW4gU3BpZWxlciBuYW1lbnMgXCIiK3N0cisiXCIgZ2VmdW5kZW4iICk7CisJLy9wb3AoKTsKKwkvL3B1c2gob2IpOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9vYmplY3QoKQoreworCW9iamVjdCBvYjsKKwlzdHJpbmcgZXJyLGZuYW07CisKKwlpZiggIXN0cmluZ3AodG9wKCkpICkKKwkJcmV0dXJuIGVycm9yKCAib2JqZWN0OiBUT1MgaXN0IGtlaW4gU3RyaW5nIiApOworCW9iID0gZmluZF9vYmplY3QodG9wKCkpOworCWlmKCAhb2IgKQorCXsKKwkJaWYoICEoZm5hbT10aGlzX3BsYXllcigpLT5maW5kX2ZpbGUodG9wKCksIi5jIikpICkKKwkJCXJldHVybiBlcnJvciggIm9iamVjdDogS2VpbiBPYmpla3QgbmFtZW5zIFwiIit0b3AoKSsiXCIgZ2VmdW5kZW4iICk7CisJCWlmKCBlcnI9KGNhdGNoKGNhbGxfb3RoZXIoZm5hbSwiPyIpKSkgKQorCQkJcmV0dXJuIGVycm9yKCAib2JqZWN0OiBGZWhsZXIgYmVpbSBMYWRlbjogIitlcnJbMS4uPDNdICk7CisJCW9iID0gZmluZF9vYmplY3QoZm5hbSk7CisJfQorCXBvcCgpOworCXB1c2gob2IpOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9saXZpbmcoKQoreworCW9iamVjdCBvYjsKKwlpZiggIXN0cmluZ3AodG9wKCkpICkKKwkJcmV0dXJuIGVycm9yKCAib2JqZWN0OiBUT1MgaXN0IGtlaW4gU3RyaW5nIiApOworCW9iID0gZmluZF9saXZpbmcodG9wKCkpOworCWlmKCAhb2IgKQorCQlyZXR1cm4gZXJyb3IoICJvYmplY3Q6IEtlaW4gT2JqZWt0IG5hbWVucyBcIiIrdG9wKCkrIlwiIGdlZnVuZGVuIiApOworCXBvcCgpOworCXB1c2gob2IpOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9zYXkoKQoreworCW1pdF9zYXkgPSAhbWl0X3NheTsKKwlpZiggbWl0X3NheSApCisJCW1lbW8oICJNZWxkdW5nZW4gYW4gTWl0c3BpZWxlciBhbiIgKTsKKwllbHNlCisJCW1lbW8oICJNZWxkdW5nZW4gYW4gTWl0c3BpZWxlciBhdXMiICk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX25hbWVzKCkKK3sKKwltaXRfbmFtZW4gPSAhbWl0X25hbWVuOworCWlmKCBtaXRfbmFtZW4gKQorCQltZW1vKCAiTmFtZW4gd2VyZGVuIGFuZ2V6ZWlndCIgKTsKKwllbHNlCisJCW1lbW8oICJOYW1lbiB3ZXJkZW4gbmljaHQgYW5nZXplaWd0IiApOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9zZWN1cmVpbnYoKQoreworCXNlY3VyZWludiA9ICFzZWN1cmVpbnY7CisJaWYoIHNlY3VyZWludiApCisJCW1lbW8oICJJbnZlbnRvcnkgd2lyZCB1ZWJlcndhY2h0IiApOworCWVsc2UKKwkJbWVtbyggIkludmVudG9yeSB3aXJkIG5pY2h0IHVlYmVyd2FjaHQiICk7CisJc2V0X2hlYXJ0X2JlYXQoc2VjdXJlaW52KTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfbG9nYWNjZXNzKCkKK3sKKwlkb2xvZ2FjY2VzcyA9ICFkb2xvZ2FjY2VzczsKKwlpZiggZG9sb2dhY2Nlc3MgKQorCQltZW1vKCAiWnVncmlmZmUgd2VyZGVuIGdlbWVsZGV0IiApOworCWVsc2UKKwkJbWVtbyggIlp1Z3JpZmZlIHdlcmRlbiBuaWNodCBnZW1lbGRldCIgKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfZGVzdHJ1Y3RfYmFuZygpCit7CisJaWYoICFiZWNvbWVzX29iaigpICkKKwkJcmV0dXJuIGVycm9yKCAiZGVzdHJ1Y3Q6IFRPUyBpc3Qga2VpbiBPYmpla3QiICk7CisJZGVzdHJ1Y3QocG9wKCkpOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9kZXN0cnVjdCgpCit7CisJaWYoICFiZWNvbWVzX29iaigpICkKKwkJcmV0dXJuIGVycm9yKCAicmVtb3ZlOiBUT1MgaXN0IGtlaW4gT2JqZWt0IiApOworCW1lbW8oICJkZXN0cnVjdDogVE9TIHdpcmQgJ3JlbW92ZWQnISIgKTsKKwl0b3AoKS0+cmVtb3ZlKCk7CisJaWYoIHRvcCgpICkKKwkJbWVtbyggImRlc3RydWN0OiBUT1MgbGVidCBub2NoLiIgKTsKKwllbHNlCisJCXBvcCgpOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9yZW1vdmUoKQoreworCWlmKCAhYmVjb21lc19vYmooKSApCisJCXJldHVybiBlcnJvciggInJlbW92ZTogVE9TIGlzdCBrZWluIE9iamVrdCIgKTsKKwl0b3AoKS0+cmVtb3ZlKCk7CisJaWYoIHRvcCgpICkKKwkJbWVtbyggImRlc3RydWN0OiBUT1MgbGVidCBub2NoLiIgKTsKKwllbHNlCisJCXBvcCgpOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF91cGRhdGUoKQoreworCW9iamVjdCBibHVlOworCisJaWYoICFiZWNvbWVzX29iaigpICkKKwkJcmV0dXJuIGVycm9yKCAidXBkYXRlOiBUT1MgaXN0IGtlaW4gT2JqZWt0IiApOworCWJsdWUgPSBmaW5kX29iamVjdChvbGRfZXhwbG9kZShvYmplY3RfbmFtZSh0b3AoKSksIiMiKVswXSk7CisJYmx1ZS0+cmVtb3ZlKCk7CisJaWYoIGJsdWUgKQorCQltZW1vKCAidXBkYXRlOiBUT1MgbGVidCBub2NoIiApOworCWVsc2UKKwkJcG9wKCk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX3VwZGF0ZV9iYW5nKCkKK3sKKwlpZiggIWJlY29tZXNfb2JqKCkgKQorCQlyZXR1cm4gZXJyb3IoICJ1cGRhdGU6IFRPUyBpc3Qga2VpbiBPYmpla3QiICk7CisJZGVzdHJ1Y3QoZmluZF9vYmplY3Qob2xkX2V4cGxvZGUob2JqZWN0X25hbWUocG9wKCkpLCIjIilbMF0pKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfcm9vbXVwZGF0ZSgpCit7CisJcmV0dXJuIGRvX3Jvb211cGRhdGUoIEZBTFNFLCBGQUxTRSApOworfQorCitzdGF0aWMgaW50IGNtZF9yb29tdXBkYXRlX2JhbmcoKQoreworCXJldHVybiBkb19yb29tdXBkYXRlKCBUUlVFLCBGQUxTRSApOworfQorCitzdGF0aWMgaW50IGNtZF9leHRyb29tdXBkYXRlKCkKK3sKKwlyZXR1cm4gZG9fcm9vbXVwZGF0ZSggRkFMU0UsIFRSVUUgKTsKK30KKworc3RhdGljIGludCBjbWRfZXh0cm9vbXVwZGF0ZV9iYW5nKCkKK3sKKwlyZXR1cm4gZG9fcm9vbXVwZGF0ZSggVFJVRSwgVFJVRSApOworfQorCisvLyBIaWxmc2Z1bmt0aW9uZW4genVtIEZpbHRlcm4gdm9uIEl0ZW1zCitzdGF0aWMgb2JqZWN0ICpjb2xsZWN0X2l0ZW1zOworc3RhdGljIHZvaWQgY29sbGVjdCggb2JqZWN0KiBkYXRhICkgeyBjb2xsZWN0X2l0ZW1zICs9ICh7IGRhdGFbMF0gfSk7IH0KKworc3RhdGljIGludCBkb19yb29tdXBkYXRlKCBpbnQgZGVzdGZsYWcsIGludCBub2l0ZW1zICkKK3sKKwlvYmplY3QgdG1wcm9vbSxuZXdyb29tOworCW9iamVjdCAqaW52OworCXN0cmluZyBlcnJtc2c7CisJc3RyaW5nICpmaWxlOworCW9iamVjdCAqaXRlbXM7CisJaW50IGk7CisKKwlpZiggIWJlY29tZXNfb2JqKCkgKQorCQlyZXR1cm4gZXJyb3IoICJyb29tdXBkYXRlOiBUT1MgaXN0IGtlaW4gT2JqZWt0IiApOworCWZpbGUgPSBvbGRfZXhwbG9kZSggb2JqZWN0X25hbWUoIHRvcCgpICksICIjIiApOworCWlmKCBzaXplb2YoZmlsZSkgPiAxICkKKwkJcmV0dXJuIGVycm9yKCAicm9vbXVwZGF0ZTogVE9TIGlzdCBrZWluZSBCbHVlcHJpbnQiICk7CisJaWYoIGZpbGVbMF0gPT0gIi9yb29tL3ZvaWQiICkKKwkJcmV0dXJuIGVycm9yKCAicm9vbXVwZGF0ZTogRGllIGB2b2lkJyBkYXJmIG5pY2h0IGdldXBkYXRldCB3ZXJkZW4iICk7CisKKwkvLyAtLS0tLSBSZXR0dW5nCQorCXRlbGxfcm9vbSggdG9wKCksCisJCSJEZXIgUmF1bSB2ZXJzY2h3aW1tdCB2b3IgRGVpbmVuIEF1Z2VuLCB1bSBzaWNoIHp1IGVybmV1ZXJuLlxuIgorCSk7CisJdG1wcm9vbSA9IGNsb25lX29iamVjdCggIi9yb29tL3ZvaWQiICk7CisKKwlpZiggbm9pdGVtcyApCisJICAvLyBOdXIgU3BpZWxlciBrb21tZW4gcmF1cy4KKwkJaW52ID0gZmlsdGVyKCBhbGxfaW52ZW50b3J5KHRvcCgpKSwgIydxdWVyeV9vbmNlX2ludGVyYWN0aXZlICk7CisJZWxzZQorCXsgLy8gRGluZ2UsIGRpZSBQX0lURU1TIHNpbmQsIGJsZWliZW4gZGEhCisJCWNvbGxlY3RfaXRlbXMgPSAoe30pOworCQltYXAoIHRvcCgpLT5RdWVyeVByb3AoUF9JVEVNUyksICMnY29sbGVjdCApOyAKKwkJaW52ID0gYWxsX2ludmVudG9yeSh0b3AoKSkgLSBjb2xsZWN0X2l0ZW1zOworCX0KKworCWZvciggaT1zaXplb2YoaW52KS0xOyBpPj0wOyBpLS0gKQorCQlpbnZbaV0tPm1vdmUoIHRtcHJvb20sIE1fTk9DSEVDSyB8IE1fU0lMRU5UIHwgTV9OT19TSE9XICk7CisKKwkvLyAtLS0tLSBWZXJuaWNodHVuZworCWlmKCBkZXN0ZmxhZyApCisJCWRlc3RydWN0KCBwb3AoKSApOworCWVsc2UKKwl7CisJCXRvcCgpLT5yZW1vdmUoKTsKKwkJaWYoIHRvcCgpICkKKwkJCW1lbW8oICJyb29tdXBkYXRlIDogVE9TIGlzdCBuaWNodCB2ZXJzY2h3dW5kZW4uIiApOworCQllbHNlCisJCQlwb3AoKTsKKwl9CisKKwkvLyAtLS0tLSBOZXVlcnNjaGFmZnVuZworCWVycm1zZyA9IGNhdGNoKCBjYWxsX290aGVyKCBmaWxlWzBdLCAiPyIgKSApOworCWlmKCBlcnJtc2cgKQorCXsKKwkJdGVsbF9yb29tKCB0bXByb29tLCAiRGVyIFJhdW0gdmVyYmxlaWNodCBpbiBlaW4gTmljaHRzLlxuIiApOworCQlwdXNoKCBmaWxlWzBdICk7CisJCXJldHVybiBlcnJvciggInVwZGF0ZXJvb206ICIgKyBlcnJtc2dbMS4uPDJdICk7CisJfQorCisJLy8gLS0tLS0gUmVzdGF1cmllcnVuZworCW5ld3Jvb20gPSBmaW5kX29iamVjdCggZmlsZVswXSApOworCWZvciggaT1zaXplb2YoaW52KS0xOyBpPj0wOyBpLS0gKQorCQlpZiggb2JqZWN0cChpbnZbaV0pICkgLy8gT2JqZWt0ZSBrb2VubnRlbiBzaWNoIGJlaW0gZXJzdGVuIG1vdmUgemVyc3RvZXJlbi4KKwkJCWludltpXS0+bW92ZSggbmV3cm9vbSwgTV9OT0NIRUNLIHwgTV9TSUxFTlQgfCBNX05PX1NIT1cgKTsKKwl0ZWxsX3Jvb20oIG5ld3Jvb20sICJEaWUgS29udHVyZW4gd2VyZGVuIHdpZWRlciBzY2hhcmYuXG4iICk7CisJZGVzdHJ1Y3QoIHRtcHJvb20gKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfY2xvbmUoKQoreworCWlmKCAhc3RyaW5ncCh0b3AoKSkgKQorCQlyZXR1cm4gZXJyb3IoICJjbG9uZTogVE9TIGlzdCBrZWluIFN0cmluZyIgKTsKKwlpZiggZmlsZV9zaXplKHRvcCgpKyIuYyIpPD0wICkKKwkJcmV0dXJuIGVycm9yKCAiY2xvbmU6IEtlaW4gc29sY2hlcyBGaWxlIiApOworCXB1c2goY2xvbmVfb2JqZWN0KHBvcCgpKSk7CisJLy9kb19tb3ZlKCB0b3AoKSwgZW52aXJvbm1lbnQoUEwpICk7CisJLy90b3AoKS0+bW92ZShQTCxNX0dFVHxNX1NJTEVOVCk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX21vdmUoKQoreworCW9iamVjdCBvYjsKKworCWlmKCAhYmVjb21lc19vYmooKSApCisJCXJldHVybiBlcnJvciggIm1vdmU6IFppZWwgaXN0IGtlaW4gT2JqZWt0IiApOworCW9iID0gcG9wKCk7CisJaWYoICFiZWNvbWVzX29iaigpICkKKwkJcmV0dXJuIGVycm9yKCAibW92ZTogS2VpbiBzb2xjaGVyIEdlZ2Vuc3RhbmQiICk7CisJZG9fbW92ZSggcG9wKCksIG9iICk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX2NsZWFub2ZfYmFuZygpCit7CisJcmV0dXJuIGRvX2NsZWFub2YoIFRSVUUgKTsKK30KKworc3RhdGljIGludCBjbWRfY2xlYW5vZigpCit7CisJcmV0dXJuIGRvX2NsZWFub2YoIEZBTFNFICk7Cit9CisKK3N0YXRpYyBpbnQgZG9fY2xlYW5vZiggaW50IHN0cm9uZyApCit7CisJb2JqZWN0ICppbnY7CisJaW50IGk7CisJc3RyaW5nIGNsZWFuX2lkOworCisJaWYoICFzdHJpbmdwKHRvcCgpKSApCisJCXJldHVybiBlcnJvciggImNsZWFub2Y6IFRPUyBpc3Qga2VpbiBTdHJpbmciICk7CisJY2xlYW5faWQgPSBwb3AoKTsKKwlpZiggIWJlY29tZXNfb2JqKCkgKQorCXsKKwkJcHVzaCggY2xlYW5faWQgKTsKKwkJcmV0dXJuIGVycm9yKCAiY2xlYW5vZjogS2VpbiBPYmpla3QgenVtIExlZXJlbiIgKTsKKwl9CisJZm9yKCBpPTAsIGludj1hbGxfaW52ZW50b3J5KHBvcCgpKTsgaTxzaXplb2YoaW52KTsgaSsrICkKKwkJaWYoIGludltpXS0+aWQoY2xlYW5faWQpICkKKwkJeworCQkJaWYoIHN0cm9uZyApCisJCQkJZGVzdHJ1Y3QoIGludltpXSApOworCQkJZWxzZQorCQkJCWludltpXS0+cmVtb3ZlKCk7CisJCX0KKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfc25vb3BlcnMoKQoreworCW9iamVjdCogdSwgc25vb3BlcjsKKwlpbnQgaSwgZmxhZzsKKworCWZsYWcgPSAwOworCXUgPSB1c2VycygpOworCWZvciggaT0wOyBpPHNpemVvZih1KTsgaSsrICkKKwl7CisJCWlmKCBzbm9vcGVyID0gcXVlcnlfc25vb3AodVtpXSkgKQorCQl7CisJCQlmbGFnID0gMTsKKwkJCXByaW50ZiggIiVzIHdpcmQgZ2Vzbm9vcGVkIHZvbjogJXMuXG4iLAorCQkJCWNhcGl0YWxpemUoZ2V0dWlkKHVbaV0pKSwgY2FwaXRhbGl6ZShnZXR1aWQoc25vb3BlcikpICk7CisJCX0KKwl9CisJaWYoICFmbGFnICkKKwkJbWVtbyggIk1vbWVudGFuIHdpcmQgbmllbWFuZCBnZXNub29wZWQiICk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX3BpbmcoKQoreworCW9iamVjdCBwbDsKKworCWlmKCAhYmVjb21lc19wbCgpICkKKwkJcmV0dXJuIGVycm9yKCAicGluZzogVE9TIGlzdCBrZWluIFNwaWVsZXIiICk7CisKKwlwbD1wb3AoKTsKKwljYWxsX291dCggInBpbmciLCAwLCAoeyBwbCwgNSB9KSApOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgdm9pZCBwaW5nKCBtaXhlZCogYXJndiApCit7CisJaWYoICFhcmd2WzBdIHx8IC0tYXJndlsxXSA8IDAgKSByZXR1cm47CisJdGVsbF9vYmplY3QoIGFyZ3ZbMF0sIEJFRVArUEwtPm5hbWUoV0VSKSsiIHBpbmd0IERpY2ggYW4uXG4iICk7CisJY2FsbF9vdXQoICJwaW5nIiwgMSwgYXJndiApOworfQorCitzdGF0aWMgdm9pZCBkb19jYWxsb3V0aW5mbyggbWl4ZWQqIGNhbGwgKQoreworCWludCBsLGk7CisKKwlpZiggcG9pbnRlcnAoY2FsbCkgKQorCXsKKwkJcHJpbnRmKCAiJTVkOiVPLT4lTygiLCBjYWxsWzJdLCBjYWxsWzBdLCBjYWxsWzFdKTsKKwkJaWYoIChsPXNpemVvZihjYWxsKSk+MyApIHsKKwkJCWZvciggOyBsPj0zICYmICFjYWxsWy0tbF07ICkgOworCQkJZm9yKCBpPTM7IGk8PWw7IGkrKyApIHByaW50ZiggIiVPJXMiLCBjYWxsW2ldLCAoaT09bCk/IiI6IiwiICk7CisJCX0KKwkJd3JpdGUoIilcbiIpOworCX0KK30KKworc3RhdGljIGludCBjbWRfY2FsbG91dHNfYmFuZygpCit7CisJbWl4ZWQgKmNhbGxzOworCW9iamVjdCBvYmo7CisJc3RyaW5nIG5hbWU7CisJaW50IGksajsKKworCWNhbGxzID0gY2FsbF9vdXRfaW5mbygpOworCWlmKCAhcG9pbnRlcnAoY2FsbHMpIHx8ICFzaXplb2YoY2FsbHMpICkKKwl7CisJCW1lbW8oICJLZWluZSBDYWxsb3V0cyB2b3JoYW5kZW4iICk7CisJCXJldHVybiBUUlVFOworCX0KKwltYXAoIGNhbGxzLCAjJ2RvX2NhbGxvdXRpbmZvICk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkIGRvX2NhbGxvdXRpbmZvMiggbWl4ZWQqIGNhbGwsIHN0cmluZyBzdHIgKQoreworCXN0cmluZyBzOworCWludCBpLGw7CisKKwlpZiggcG9pbnRlcnAoY2FsbCkgKQorCXsKKwkJcyA9IHNwcmludGYoICIlNWQ6JU8tPiVPKCIsIGNhbGxbMl0sIGNhbGxbMF0sIGNhbGxbMV0pOworCQlpZiggc2l6ZW9mKGV4cGxvZGUocyxzdHIpKSA+IDEgKQorCQl7CisJCQl3cml0ZSggcyApOworCQkJaWYoIChsPXNpemVvZihjYWxsKSk+MyApIHsKKwkJCQlmb3IoIDsgbD49MyAmJiAhY2FsbFstLWxdOyApIDsKKwkJCQlmb3IoIGk9MzsgaTw9bDsgaSsrICkgcHJpbnRmKCAiJU8lcyIsIGNhbGxbaV0sIChpPT1sKT8iIjoiLCIgKTsKKwkJCX0KKwkJCXdyaXRlKCIpXG4iKTsKKwkJfQorCX0KK30KKworc3RhdGljIGludCBjbWRfY2FsbG91dHMoKQoreworCW1peGVkICpjYWxsczsKKwlvYmplY3Qgb2JqOworCXN0cmluZyBzdHI7CisJaW50IGksajsKKworCWlmKCAhc3RyaW5ncCh0b3AoKSkgKQorCQlyZXR1cm4gZXJyb3IoICJUT1MgaXN0IGtlaW4gU3RyaW5nIiApOworCXN0ciA9IHBvcCgpOworCWNhbGxzID0gY2FsbF9vdXRfaW5mbygpOworCWlmKCAhcG9pbnRlcnAoY2FsbHMpIHx8ICFzaXplb2YoY2FsbHMpICkKKwl7CisJCW1lbW8oICJLZWluZSBDYWxsb3V0cyB2b3JoYW5kZW4iICk7CisJCXJldHVybiBUUlVFOworCX0KKwltYXAoIGNhbGxzLCAjJ2RvX2NhbGxvdXRpbmZvMiwgc3RyICk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX2hlYXJ0YmVhdHMoKQoreworCW1peGVkICpiZWF0czsKKwlpbnQgaTsKKwlvYmplY3QgZW52OworCXN0cmluZyBlbmFtOworCisJYmVhdHMgPSBoZWFydF9iZWF0X2luZm8oKTsKKwlpZiggIXBvaW50ZXJwKGJlYXRzKSB8fCAhc2l6ZW9mKGJlYXRzKSApCisJeworCQltZW1vKCAiS2VpbmUgSGVhcnRiZWF0cyB2b3JoYW5kZW4iICk7CisJCXJldHVybiBUUlVFOworCX0KKwlmb3IoIGk9MDsgaTxzaXplb2YoYmVhdHMpOyBpKysgKQorCXsKKwkJZW52ID0gZW52aXJvbm1lbnQoYmVhdHNbaV0pOworCQllbmFtID0gZW52ID8gb2JqZWN0X25hbWUoZW52KSA6ICItLSBuaXJnZW5kcyAtLSI7CisJCXByaW50ZiggIiUtMzVzICUtMzVzXG4iLCBvYmplY3RfbmFtZShiZWF0c1tpXSksIGVuYW0gKTsKKwl9CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX3dlcigpCit7CisJb2JqZWN0KiBwcGw7CisJc3RyaW5nKiBwbDsKKwlpbnQgaTsKKworCXBwbCA9IHNvcnRfYXJyYXkoIHVzZXJzKCksIGxhbWJkYSggKHsgJ3gsICd5IH0pLAorCQkoeyAjJzwsICh7ICMncXVlcnlfaXBfbnVtYmVyLCAneCB9KSwgKHsgIydxdWVyeV9pcF9udW1iZXIsICd5IH0pIH0pCisJKSk7CisJcGwgPSAoe30pOworCWZvciggaT0wOyBpPHNpemVvZihwcGwpOyBpKysgKQorCXsKKwkJcGwgKz0gKHsgc3ByaW50ZiggIiUnLictMTRzICUtMTVzICUzZCAlcyBcbiIsCisJCQkJY2FwaXRhbGl6ZShnZXRldWlkKHBwbFtpXSkpLAorCQkJCXF1ZXJ5X2lwX251bWJlcihwcGxbaV0pLAorCQkJCXF1ZXJ5X3dpel9sZXZlbChwcGxbaV0pPjAgPyBxdWVyeV93aXpfbGV2ZWwocHBsW2ldKQorCQkJCQk6IHBwbFtpXS0+UXVlcnlQcm9wKFBfTEVWRUwpLAorCQkJCXF1ZXJ5X3dpel9sZXZlbChwcGxbaV0pPjAgPyAiVyIgOiAiUCIKKwkJKSB9KTsKKwl9CisJd3JpdGUoIGltcGxvZGUocGwsIiIpICk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX2RlYnVnaW5mbygpCit7CisJaWYoICFiZWNvbWVzX29iaigpICkKKwkJcmV0dXJuIGVycm9yKCAiZGluZm86IFRPUyBpc3Qga2VpbiBPYmpla3QiICk7CisJZGVidWdfaW5mbyggMCwgcG9wKCkgKTsKKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBjbWRfcHJldHR5KCkKK3sKKwlwcmV0dHkgPSAhcHJldHR5OworCWlmKCBwcmV0dHkgKQorCQltZW1vKCAiU2Nob2VubW9kdXMgYW4iICk7CisJZWxzZQorCQltZW1vKCAiU2Nob2VubW9kdXMgYXVzIiApOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9kb3Byb2ZpbGUoKQoreworCWRvX3Byb2ZpbGU9IWRvX3Byb2ZpbGU7CisJaWYoIGRvX3Byb2ZpbGUgKQorCQltZW1vKCAiUHJvZmlsZSB3aXJkIGdlbGFkZW4iICk7CisJZWxzZQorCQltZW1vKCAiUHJvZmlsZSB3aXJkIG5pY2h0IGdlbGFkZW4iICk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgY21kX2V2YWx1YXRlKCkKK3sKKwlzdHJpbmcgc3RyOworCWlmKCAhc2l6ZW9mKHN0YWNrKSApIHJldHVybiBlcnJvciggImV2YWx1YXRlOiBTdGFjayBpc3QgbGVlciIgKTsKKwlpZiggIXN0cmluZ3AodG9wKCkpICkgcmV0dXJuIGVycm9yKCAiZXZhbHVhdGU6IFRPUyBpc3Qga2VpbiBTdHJpbmciICk7CisJc3RyID0gcG9wKCk7CisJcmV0dXJuIGRvX2NtZCggc3RyICk7Cit9CisKK3N0YXRpYyB2b2lkIHdyaXRlX21lbW9yeSggc3RyaW5nIG5hbSwgc3RyaW5nIHN0ciwgaW50IGZsYWcsIHN0cmluZyBmaWxlICkKK3sKKwlpZiggZmxhZyApIHdyaXRlX2ZpbGUoIGZpbGUsIG5hbSArICIgPSAiICsgc3RyICsgIlxuIiApOworfQorCitzdGF0aWMgaW50IGNtZF9kdW1wKCkKK3sKKwlzdHJpbmcgZmlsZTsKKworCWlmKCAhc2l6ZW9mKHN0YWNrKSB8fCAhc3RyaW5ncCh0b3AoKSkgKQorCQlmaWxlID0gIi9wbGF5ZXJzLyIrZ2V0dWlkKFBMKSsiLy5tZW1vcnkubyI7CisJZWxzZQorCQlmaWxlID0gcG9wKCk7CisJcm0oIGZpbGUgKTsKKwl3cml0ZV9maWxlKCBmaWxlLCAiIyBEdW1wIGRlcyBUZWxsZXJzdGFwZWxzIHZvbSAiICsgZHRpbWUodGltZSgpKSArICJcbiIgKTsKKwl3cml0ZV9maWxlKCBmaWxlLCAiIyBPd25lciA9ICIrY2FwaXRhbGl6ZShnZXR1aWQoUEwpKSsiXG4iICk7CisJd2Fsa19tYXBwaW5nKCBtZW1vcnksICMnd3JpdGVfbWVtb3J5LCBmaWxlICk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgcmVzdG9yZV9saW5lKCBzdHJpbmcgbGluZSApCit7CisJc3RyaW5nIG5hbSxzdHI7CisJaWYoIHNzY2FuZiggbGluZSwgIiVzID0gJXMiLCBuYW0sIHN0ciApICE9IDIgKQorCQlyZXR1cm4gZXJyb3IoICJyZXN0b3JlOiBGZWhsZXIgaW0gZmlsZSIgKTsKKwltZW1vcnkgKz0gKFsgbmFtOiBzdHI7IDEgXSk7CisgIHJldHVybiAxOworfQorCitzdGF0aWMgaW50IGNtZF9yZXN0b3JlKCkKK3sKKwlzdHJpbmcgc3RyLCAqbGluZXM7CisKKwlpZiggIXNpemVvZihzdGFjaykgfHwgIXN0cmluZ3AodG9wKCkpICkKKwkJc3RyID0gIi9wbGF5ZXJzLyIrZ2V0dWlkKFBMKSsiLy5tZW1vcnkubyI7CisJZWxzZQorCQlzdHIgPSBwb3AoKTsKKworCWlmKGZpbGVfc2l6ZShzdHIpPD0wKQorCQlyZXR1cm4gZXJyb3IoICJyZXN0b3JlOiBrYW5uICciK3N0cisiJyBuaWNodCBsYWRlbiIgKTsKKwlsaW5lcyA9IHJlZ2V4cCggb2xkX2V4cGxvZGUoIHJlYWRfZmlsZShzdHIpLCAiXG4iICksICJeW14jXSIgKTsKKwltYXAoIGxpbmVzLCAjJ3Jlc3RvcmVfbGluZSApOworCXJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50IGNtZF9pZigpCit7CisJaWYoIHNpemVvZihzdGFjaykgPCAzICkKKwkJcmV0dXJuIGVycm9yKCAiaWY6IHp1d2VuaWcgQXJndW1lbnRlIiApOworCWlmKCAhcG9wKCkgKQorCQljbWRfc3dhcCgpOworCXBvcCgpOworCXJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci90X2VmdW4uYyBiL29iai90b29scy90ZWxsZXIvdF9lZnVuLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFhMmRlZAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvdF9lZnVuLmMKQEAgLTAsMCArMSw0MTYgQEAKK3N0YXRpYyBlZnVuX3JlZ2V4cCggYXJnMSwgYXJnMiApCit7CisJcmV0dXJuIHJlZ2V4cCggYXJnMSwgYXJnMiApOworfQorCitzdGF0aWMgZWZ1bl9hbGxfaW52ZW50b3J5KCBhcmcgKQoreworCXJldHVybiBhbGxfaW52ZW50b3J5KCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fYnJlYWtfc3RyaW5nKCBhcmcxLCBhcmcyLCBhcmczICkKK3sKKwlyZXR1cm4gYnJlYWtfc3RyaW5nKCBhcmcxLCBhcmcyLCBhcmczICk7Cit9CisKK3N0YXRpYyBlZnVuX2NhcGl0YWxpemUoIGFyZyApCit7CisJcmV0dXJuIGNhcGl0YWxpemUoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9jYXQoIGFyZzEsIGFyZzIsIGFyZzMgKQoreworCXJldHVybiBjYXQoIGFyZzEsIGFyZzIsIGFyZzMgKTsKK30KKworc3RhdGljIGVmdW5fY2xlYXJfYml0KCBhcmcxLCBhcmcyICkKK3sKKwlyZXR1cm4gY2xlYXJfYml0KCBhcmcxLCBhcmcyICk7Cit9CisKK3N0YXRpYyBlZnVuX2NyeXB0KCBhcmcxLCBhcmcyICkKK3sKKwlyZXR1cm4gY3J5cHQoIGFyZzEsIGFyZzIgKTsKK30KKworc3RhdGljIGVmdW5fY3RpbWUoIGFyZyApCit7CisJcmV0dXJuIGN0aW1lKCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fZGVidWdfaW5mbyggYXJnMSwgYXJnMiApCit7CisJcmV0dXJuIGRlYnVnX2luZm8oIGFyZzEsIGFyZzIgKTsKK30KKworc3RhdGljIGVmdW5fZGVlcF9pbnZlbnRvcnkoIGFyZyApCit7CisJcmV0dXJuIGRlZXBfaW52ZW50b3J5KCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fZW52aXJvbm1lbnQoIGFyZyApCit7CisJcmV0dXJuIGVudmlyb25tZW50KCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fZXhwbG9kZSggYXJnMSwgYXJnMiApCit7CisJcmV0dXJuIG9sZF9leHBsb2RlKCBhcmcxLCBhcmcyICk7Cit9CisKK3N0YXRpYyBlZnVuX2ZpbGVfbmFtZSggYXJnICkKK3sKKwlyZXR1cm4gb2JqZWN0X25hbWUoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9maWxlX3NpemUoIGFyZyApCit7CisJcmV0dXJuIGZpbGVfc2l6ZSggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX2ZpbHRlcl9hcnJheSggYXJnMSwgYXJnMiwgYXJnMywgYXJnNCApCit7CisJcmV0dXJuIGZpbHRlciggYXJnMSwgYXJnMiwgYXJnMywgYXJnNCApOworfQorCitzdGF0aWMgZWZ1bl9maW5kX2NhbGxfb3V0KCBhcmcgKQoreworCXJldHVybiBmaW5kX2NhbGxfb3V0KCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fZmluZF9saXZpbmcoIGFyZyApCit7CisJcmV0dXJuIGZpbmRfbGl2aW5nKCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fZmluZF9vYmplY3QoIGFyZyApCit7CisJcmV0dXJuIGZpbmRfb2JqZWN0KCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fZmluZF9wbGF5ZXIoIGFyZyApCit7CisJcmV0dXJuIGZpbmRfcGxheWVyKCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fZnVuY3Rpb25fZXhpc3RzKCBhcmcxLCBhcmcyICkKK3sKKwlyZXR1cm4gZnVuY3Rpb25fZXhpc3RzKCBhcmcxLCBhcmcyICk7Cit9CisKK3N0YXRpYyBlZnVuX2ltcGxvZGUoIGFyZzEsIGFyZzIgKQoreworCXJldHVybiBpbXBsb2RlKCBhcmcxLCBhcmcyICk7Cit9CisKK3N0YXRpYyBlZnVuX2ludGVyYWN0aXZlKCBhcmcgKQoreworCXJldHVybiBpbnRlcmFjdGl2ZSggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX2ludHAoIGFyZyApCit7CisJcmV0dXJuIGludHAoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9sYXN0X3JlYm9vdF90aW1lKCkKK3sKKwlyZXR1cm4gbGFzdF9yZWJvb3RfdGltZSgpOworfQorCitzdGF0aWMgZWZ1bl9saXZpbmcoIGFyZyApCit7CisJcmV0dXJuIGxpdmluZyggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX2xvd2VyX2Nhc2UoIGFyZyApCit7CisJcmV0dXJuIGxvd2VyX2Nhc2UoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9nZXRfZGlyKCBhcmcxLCBhcmcyICkKK3sKKwlyZXR1cm4gZ2V0X2RpciggYXJnMSwgYXJnMiApOworfQorCitzdGF0aWMgZWZ1bl9tYXBfYXJyYXkoIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQgKQoreworCXJldHVybiBtYXAoIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQgKTsKK30KKworc3RhdGljIGVmdW5fbWVtYmVyKCBhcmcxLCBhcmcyICkKK3sKKwlyZXR1cm4gbWVtYmVyKCBhcmcxLCBhcmcyICk7Cit9CisKK3N0YXRpYyBlZnVuX29iamVjdHAoIGFyZyApCit7CisJcmV0dXJuIG9iamVjdHAoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9wb2ludGVycCggYXJnICkKK3sKKwlyZXR1cm4gcG9pbnRlcnAoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9wcmVzZW50KCBhcmcxLCBhcmcyICkKK3sKKwlyZXR1cm4gcHJlc2VudCggYXJnMSwgYXJnMiApOworfQorCitzdGF0aWMgZWZ1bl9wcm9jZXNzX3N0cmluZyggYXJnICkKK3sKKwlyZXR1cm4gcHJvY2Vzc19zdHJpbmcoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9xdWVyeV9hY3Rpb25zKCBhcmcxLCBhcmcyICkKK3sKKwlyZXR1cm4gcXVlcnlfYWN0aW9ucyggYXJnMSwgYXJnMiApOworfQorCitzdGF0aWMgZWZ1bl9xdWVyeV9pZGxlKCBhcmcgKQoreworCXJldHVybiBxdWVyeV9pZGxlKCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fcXVlcnlfaXBfbmFtZSggYXJnICkKK3sKKwlyZXR1cm4gcXVlcnlfaXBfbmFtZSggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX3F1ZXJ5X2lwX251bWJlciggYXJnICkKK3sKKwlyZXR1cm4gcXVlcnlfaXBfbnVtYmVyKCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fcXVlcnlfbG9hZF9hdmVyYWdlKCkKK3sKKwlyZXR1cm4gcXVlcnlfbG9hZF9hdmVyYWdlKCk7Cit9CisKK3N0YXRpYyBlZnVuX3F1ZXJ5X3Nub29wKCBhcmcgKQoreworCXJldHVybiBxdWVyeV9zbm9vcCggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX3JhbmRvbSggYXJnICkKK3sKKwlyZXR1cm4gcmFuZG9tKCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fcmVhZF9ieXRlcyggYXJnMSwgYXJnMiwgYXJnMyApCit7CisJcmV0dXJuIHJlYWRfYnl0ZXMoIGFyZzEsIGFyZzIsIGFyZzMgKTsKK30KKworc3RhdGljIGVmdW5fcmVhZF9maWxlKCBhcmcxLCBhcmcyLCBhcmczICkKK3sKKwlyZXR1cm4gcmVhZF9maWxlKCBhcmcxLCBhcmcyLCBhcmczICk7Cit9CisKK3N0YXRpYyBlZnVuX3JlbW92ZV9jYWxsX291dCggYXJnICkKK3sKKwlyZXR1cm4gcmVtb3ZlX2NhbGxfb3V0KCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fcmVtb3ZlX2ludGVyYWN0aXZlKCBhcmcgKQoreworCXJldHVybiByZW1vdmVfaW50ZXJhY3RpdmUoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9ydXNhZ2UoKQoreworCXJldHVybiBydXNhZ2UoKTsKK30KKworc3RhdGljIGVmdW5fc2F5KCBhcmcxLCBhcmcyICkKK3sKKwlpZiggIWFyZzIgKSByZXR1cm4gc2F5KCBhcmcxICk7CisJcmV0dXJuIHNheSggYXJnMSwgYXJnMiApOworfQorCitzdGF0aWMgZWZ1bl9zZXRfYml0KCBhcmcxLCBhcmcyICkKK3sKKwlyZXR1cm4gc2V0X2JpdCggYXJnMSwgYXJnMiApOworfQorCitzdGF0aWMgZWZ1bl9zZXRfaGVhcnRfYmVhdCggYXJnICkKK3sKKwlyZXR1cm4gc2V0X2hlYXJ0X2JlYXQoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9zZXRfbGl2aW5nX25hbWUoIGFyZyApCit7CisJcmV0dXJuIHNldF9saXZpbmdfbmFtZSggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX3NpemVvZiggYXJnICkKK3sKKwlyZXR1cm4gc2l6ZW9mKCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fc29ydF9hcnJheSggYXJnMSwgYXJnMiwgYXJnMyApCit7CisJcmV0dXJuIHNvcnRfYXJyYXkoIGFyZzEsIGFyZzIsIGFyZzMgKTsKK30KKworc3RhdGljIGVmdW5fc3RyaW5ncCggYXJnICkKK3sKKwlyZXR1cm4gc3RyaW5ncCggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX3N0cmxlbiggYXJnICkKK3sKKwlyZXR1cm4gc2l6ZW9mKCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fdGFpbCggYXJnICkKK3sKKwlyZXR1cm4gdGFpbCggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX3Nob3V0KCBhcmcgKQoreworCXJldHVybiBzaG91dCggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX3RlbGxfb2JqZWN0KCBhcmcxLCBhcmcyICkKK3sKKwlyZXR1cm4gdGVsbF9vYmplY3QoIGFyZzEsIGFyZzIgKTsKK30KKworc3RhdGljIGVmdW5fdGVsbF9yb29tKCBhcmcxLCBhcmcyLCBhcmczICkKK3sKKwlyZXR1cm4gdGVsbF9yb29tKCBhcmcxLCBhcmcyLCBhcmczICk7Cit9CisKK3N0YXRpYyBlZnVuX3Rlc3RfYml0KCBhcmcxLCBhcmcyICkKK3sKKwlyZXR1cm4gdGVzdF9iaXQoIGFyZzEsIGFyZzIgKTsKK30KKworc3RhdGljIGVmdW5fdGltZSgpCit7CisJcmV0dXJuIHRpbWUoKTsKK30KKworc3RhdGljIGVmdW5fdW5pcXVlX2FycmF5KCBhcmcxLCBhcmcyLCBhcmczICkKK3sKKwlyZXR1cm4gdW5pcXVlX2FycmF5KCBhcmcxLCBhcmcyLCBhcmczICk7Cit9CisKK3N0YXRpYyBlZnVuX3VzZXJzKCkKK3sKKwlyZXR1cm4gdXNlcnMoKTsKK30KKworc3RhdGljIGVmdW5fdmVyc2lvbigpCit7CisJcmV0dXJuIHZlcnNpb24oKTsKK30KKworc3RhdGljIGVmdW5fd3JpdGUoIGFyZyApCit7CisJcmV0dXJuIHdyaXRlKCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fd3JpdGVfYnl0ZXMoIGFyZzEsIGFyZzIsIGFyZzMgKQoreworCXJldHVybiB3cml0ZV9ieXRlcyggYXJnMSwgYXJnMiwgYXJnMyApOworfQorCitzdGF0aWMgZWZ1bl93cml0ZV9maWxlKCBhcmcxLCBhcmcyICkKK3sKKwlyZXR1cm4gd3JpdGVfZmlsZSggYXJnMSwgYXJnMiApOworfQorCitzdGF0aWMgZWZ1bl9nZXRldWlkKCBhcmcgKQoreworCXJldHVybiBnZXRldWlkKCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fZ2V0dWlkKCBhcmcgKQoreworCXJldHVybiBnZXR1aWQoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9maXJzdF9pbnZlbnRvcnkoIGFyZyApCit7CisJcmV0dXJuIGZpcnN0X2ludmVudG9yeSggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX25leHRfaW52ZW50b3J5KCBhcmcgKQoreworCXJldHVybiBuZXh0X2ludmVudG9yeSggYXJnICk7Cit9CisKK3N0YXRpYyBlZnVuX2luaGVyaXRfbGlzdCggYXJnICkKK3sKKwlyZXR1cm4gaW5oZXJpdF9saXN0KCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fc3Ryc3RyKCBhcmcxLCBhcmcyLCBhcmczICkKK3sKKwlyZXR1cm4gc3Ryc3RyKCBhcmcxLCBhcmcyLCBhcmczICk7Cit9CisKK3N0YXRpYyBlZnVuX3Byb2dyYW1fdGltZSggYXJnICkKK3sKKwlyZXR1cm4gcHJvZ3JhbV90aW1lKCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fZ2V0X2Vycm9yX2ZpbGUoIGFyZzEsIGFyZzIgKQoreworCXJldHVybiBnZXRfZXJyb3JfZmlsZSggYXJnMSwgYXJnMiApOworfQorCitzdGF0aWMgZWZ1bl9zZXRfcHJvbXB0KCBhcmcxLCBhcmcyICkKK3sKKwlyZXR1cm4gc2V0X3Byb21wdCggYXJnMSwgYXJnMiApOworfQorCitzdGF0aWMgZWZ1bl9maWx0ZXJfb2JqZWN0cyggYXJnMSwgYXJnMiwgYXJnMyApCit7CisJcmV0dXJuIGZpbHRlcl9vYmplY3RzKCBhcmcxLCBhcmcyLCBhcmczICk7Cit9CisKK3N0YXRpYyBlZnVuX21hcF9vYmplY3RzKCBhcmcxLCBhcmcyLCBhcmczICkKK3sKKwlyZXR1cm4gbWFwX29iamVjdHMoIGFyZzEsIGFyZzIsIGFyZzMgKTsKK30KKworc3RhdGljIGVmdW5fdHJhbnNwb3NlX2FycmF5KCBhcmcgKQoreworCXJldHVybiB0cmFuc3Bvc2VfYXJyYXkoIGFyZyApOworfQorCitzdGF0aWMgZWZ1bl9xdWVyeV9vbmNlX2ludGVyYWN0aXZlKCBhcmcgKQoreworCXJldHVybiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKCBhcmcgKTsKK30KKworc3RhdGljIGVmdW5fd2l6bGlzdCggYXJnICkKK3sKKwl3aXpsaXN0KCBhcmcgKTsKKwlyZXR1cm4gMTsKK30KKworc3RhdGljIGVmdW5fbWtkaXIoIHN0ciApCit7CisJcmV0dXJuIG1rZGlyKCBzdHIgKTsKK30KKworc3RhdGljIGVmdW5fcm0oIHN0ciApCit7CisJcmV0dXJuIHJtKCBzdHIgKTsKK30KKworc3RhdGljIGVmdW5fY291bnRyeSggc3RyICkKK3sKKwlyZXR1cm4gY291bnRyeSggc3RyICk7Cit9CisKK3N0YXRpYyBlZnVuX2R0aW1lKCB2YWwgKQoreworCXJldHVybiBkdGltZSggdmFsICk7Cit9CmRpZmYgLS1naXQgYS9vYmovdG9vbHMvdGVsbGVyL3RfcGxheWVyLmMgYi9vYmovdG9vbHMvdGVsbGVyL3RfcGxheWVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjcyYjEwMAotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvdF9wbGF5ZXIuYwpAQCAtMCwwICsxLDYwIEBACisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBad2lzY2hlbm9iamVrdCB6dW0gTGVzZW4gZGVyIFNwaWVsZXJkYXRlbiBhdWNoIHZvbiBuaWNodGVpbmdlbG9nZ3Rlbi4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpbmNsdWRlICJ0ZWxsZXIuaCIKKworaW5oZXJpdCAic3RkL3BsYXllci9iYXNlIjsKKworY3JlYXRlKCkgeworCXVzZWRfYXR0cmlidXRlc19vZmZzZXRzID0gKFtdKTsKK30KKworc3RyaW5nIG5hbWU7CitzdHJpbmcgcmFjZTsKK3N0cmluZyBoYW5kczsKK21hcHBpbmcgYXV0b2xvYWQ7CisKK19xdWVyeV9uYW1lKCkgeyByZXR1cm4gbmFtZTsgfQorcGxheWVybmFtZSgpIHsgcmV0dXJuIG5hbWU7IH0KK19zZXRfbmFtZSggc3RyICkgeyByZXR1cm4gbmFtZT1zdHI7IH0KKworX3F1ZXJ5X3JhY2UoKQoreworCWlmKCByYWNlICkgcmV0dXJuIHJhY2U7CisJCQorCXJldHVybiAiL3NlY3VyZS9tYXN0ZXIiCisJCS0+cXVlcnlfcGxheWVyX29iamVjdChsb3dlcl9jYXNlKG5hbWUpKQorCQktPlF1ZXJ5UHJvcChQX1JBQ0UpOworfQorCitfcXVlcnlfaGFuZHMoKQoreworCWlmKCBoYW5kcyApIHJldHVybiBoYW5kczsKKwlyZXR1cm4gKHsgIiBuaWNodCIsIDAgfSk7Cit9CisKK19xdWVyeV9hdXRvbG9hZCgpCit7CisJcmV0dXJuIGF1dG9sb2FkOworfQorCitMb2FkKCBzdHIgKQoreworCXJlc3RvcmVfb2JqZWN0KCAiL3NhdmUvIitzdHJbMC4uMF0rIi8iK3N0ciApOworfQorCitOb3Rsb2dnZWQoKSB7IHJldHVybiBUUlVFOyB9CisKK1F1ZXJ5TW9uZXkoKQoreworCWlmKCAhbWFwcGluZ3AoYXV0b2xvYWQpICkKKwkJcmV0dXJuIDA7CisJcmV0dXJuIGF1dG9sb2FkWyIvaXRlbXMvbW9uZXkiXTsKK30KKworUXVlcnlFbmVtaWVzKCkKK3sKKyAgICAgICAgcmV0dXJuICh7KHt9KSwoe30pfSk7Cit9CisKK1F1ZXJ5QXR0cmlidXRlT2Zmc2V0KCBhcnIgKSB7IHJldHVybiAiPyI7IH0KZGlmZiAtLWdpdCBhL29iai90b29scy90ZWxsZXIvdGVsbGVyLmMgYi9vYmovdG9vbHMvdGVsbGVyL3RlbGxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMzRmMDYKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVsbGVyL3RlbGxlci5jCkBAIC0wLDAgKzEsNjg2IEBACisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUZWxsZXJzdGFwZWwsIGVpbiBTdGFja29yaWVudGllcnRlcyBtYWdpZXJ0b29sLgorLy8gUnVtYXRhIDE1LjA5LjkzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaW5jbHVkZSAidGVsbGVyLmgiCitpbmhlcml0ICJzdGQvc2VjdXJlX3RoaW5nIjsKK2luaGVyaXQgVF9DTURTOworaW5oZXJpdCBUX0VGVU47Citpbmhlcml0ICJzdGQvbW9yZSI7CisKKyNpbmNsdWRlICIvc2VjdXJlL3dpemxldmVscy5oIgorCitub3NhdmUgbWFwcGluZyB0Y29tbWFuZHM7Citub3NhdmUgc3RyaW5nIG93bmVyX25hbWU7CisKK3ZvaWQgbG9nYWNjZXNzKCBzdHJpbmcgcyApOworc3RhdGljIHZvaWQgZG9fbXNnKCBzdHJpbmcgcywgb2JqZWN0IG8gKTsKK3N0YXRpYyBzdHJpbmd8aW50IHBhcnNlTmV4dCggc3RyaW5nIHN0ciwgbWl4ZWQgYXV4c3RhY2ssIHN0cmluZyBmdW5uYW1lICk7CitzdGF0aWMgbWl4ZWQgbmV4dEFscGhhKCBzdHJpbmcgcyApOworc3RhdGljIHZhcmFyZ3Mgdm9pZCByZXN0b3JlX3N0YWNrKCBzdHJpbmcqIGFyZ3YsIGludCBhcmdzICk7CitzdGF0aWMgaW50IGRvX2NhbGwoIHN0cmluZyBmdW4sIGludCBtaXRfcmV0dXJuICk7CitzdGF0aWMgaW50IGRvX2NhbGxfZWZ1biggc3RyaW5nIGZ1biwgaW50IG1pdF9yZXR1cm4gKTsKK3N0YXRpYyBpbnQgZG9fbHBjKCBzdHJpbmcgc3RyLCBpbnQgbWl0X3JldHVybiApOworc3RhdGljIGludCBkb19jbWQoIHN0cmluZyBzdHIgKTsKK2ludCBlcnJvciggc3RyaW5nIHMgKTsKKworc3RhdGljIHZvaWQgdEFkZENtZCggbWl4ZWQgY21kICkKK3sKKwlpbnQgaTsKKworCS8vaWYgKGZpbmRfcGxheWVyKCJyaWt1cyIpKSB0ZWxsX29iamVjdChmaW5kX3BsYXllcigicmlrdXMiKSxzcHJpbnRmKCIlT1xuIixjbWQpKTsKKwlpZiggIXBvaW50ZXJwKGNtZCkgKQorICAgIG1fYWRkKHRjb21tYW5kcywgY21kLCBjbWQpOworCWVsc2UKKwkJZm9yKCBpPTA7IGk8c2l6ZW9mKGNtZCk7IGkrKyApCisgICAgICBtX2FkZCh0Y29tbWFuZHMsIGNtZFtpXSwgY21kWzBdKTsKK30KKwordm9pZCBjcmVhdGUoKQoreworCWlmKCBJU19CTFVFKE1FKSApIHJldHVybjsKKwlpZiggIWZpbmRfcGxheWVyKGdldHVpZCgpKSApIHJldHVybjsKKwlvd25lcl9uYW1lID0gZmluZF9wbGF5ZXIoZ2V0dWlkKCkpLT5uYW1lKFdFU1NFTiwxKTsKKworCXNlY3VyZV90aGluZzo6Y3JlYXRlKCk7CisJdF9jbWRzOjpjcmVhdGUoKTsKKwlTZXRQcm9wKCBQX05BTUUsICJUZWxsZXJzdGFwZWwiICk7CisJU2V0UHJvcCggUF9HRU5ERVIsIE1BTEUgKTsKKwlBZGRJZCggKHsidGVsbGVyIiwic3RhcGVsIiwidGVsbGVyc3RhcGVsIn0pICk7CisJU2V0UHJvcCggUF9OT0RST1AsICJXb3p1IGRlbm4/XG4iICk7CisJU2V0UHJvcCggUF9ORVZFUkRST1AsIDEgKTsKKwlTZXRQcm9wKCBQX1JFQURfTVNHLCAiRGllIEdyYXZ1ciBiZXNhZ3Q6ICdBdXMgZGVyIFJ1bWF0YS1NYW51ZmFrdHVyJ1xuIiApOworCXRjb21tYW5kcyA9IChbXSk7CisJCisJdEFkZENtZCggInNheSIgKTsKKwl0QWRkQ21kKCAoeyJuYW1lcyIsIm5hbSJ9KSApOworCXRBZGRDbWQoICJzZWN1cmVpbnYiICk7CisJdEFkZENtZCggImxvZ2FjY2VzcyIgKTsKKwl0QWRkQ21kKCAicHJldHR5IiApOworCXRBZGRDbWQoICJkb3Byb2ZpbGUiICk7CisJdEFkZENtZCggKHsiY2xlYXIiLCJjbHIifSkpOworCXRBZGRDbWQoICJwb3AiICk7CisJdEFkZENtZCggImR1cCIgKTsKKwl0QWRkQ21kKCAic3dhcCIgKTsKKwl0QWRkQ21kKCAoeyJldmFsdWF0ZSIsImV2YWwifSkgKTsKKworCXRBZGRDbWQoICJoZXJlIiApOworCXRBZGRDbWQoICJtZSIgKTsKKworCXRBZGRDbWQoICh7Im1lbW9yeSIsIm1lbSJ9KSApOworCXRBZGRDbWQoICJkdW1wIiApOworCXRBZGRDbWQoICJyZXN0b3JlIiApOworCXRBZGRDbWQoICJ0b3AiICk7CisJdEFkZENtZCggIndlciIgKTsKKwl0QWRkQ21kKCAoeyJzdGFjayIsInN0ayJ9KSApOworCXRBZGRDbWQoICh7InNub29wZXJzIiwic25vb3AifSkgKTsKKwl0QWRkQ21kKCAiY2FsbG91dHMiICk7CisJdEFkZENtZCggKHsiY2FsbG91dHNfYmFuZyIsImNhbGxvdXRzISJ9KSApOworCXRBZGRDbWQoICh7ImhlYXJ0YmVhdHMiLCJiZWF0cyJ9KSApOworCXRBZGRDbWQoICJpbnYiICk7CisJdEFkZENtZCggKHsicmVraW52IiwicmludiJ9KSApOworCXRBZGRDbWQoICJzY2FuIiApOworCXRBZGRDbWQoICJpZiIgKTsKKworCXRBZGRDbWQoICh7ImFycmF5IiwiYXJyIn0pICk7CisJdEFkZENtZCggKHsic3BsaXQiLCJzcGwifSkgKTsKKwl0QWRkQ21kKCAoeyJwbGF5ZXIiLCJwbCJ9KSApOworCXRBZGRDbWQoICh7ImxpdmluZyIsImx2In0pICk7CisJdEFkZENtZCggKHsib2JqZWN0Iiwib2IifSkgKTsKKworCXRBZGRDbWQoICh7ImRlYnVnaW5mbyIsImRpbmZvIn0pICk7CisJdEFkZENtZCggKHsiY2xvbmUiLCJjbG4ifSkgKTsKKwl0QWRkQ21kKCAoeyJ1cGRhdGUiLCJ1cGQifSkgKTsKKwl0QWRkQ21kKCAoeyJ1cGRhdGVfYmFuZyIsInVwZGF0ZSEiLCJ1cGQhIn0pICk7CisJdEFkZENtZCggKHsibW92ZSIsIm12In0pICk7CisJdEFkZENtZCggKHsiZGVzdHJ1Y3QiLCJkZXN0IiwiZGVzIn0pICk7CisJdEFkZENtZCggKHsicmVtb3ZlIiwicmVtIn0pICk7CisJdEFkZENtZCggKHsiZGVzdHJ1Y3RfYmFuZyIsImRlc3RydWN0ISIsImRlc3QhIiwiZGVzISIsInJlbW92ZSEiLCJyZW0hIn0pICk7CisJdEFkZENtZCggKHsicm9vbXVwZGF0ZSIsInJ1cGRhdGUiLCJydXBkIiwicnVwIn0pICk7CisJdEFkZENtZCggKHsicm9vbXVwZGF0ZV9iYW5nIiwicm9vbXVwZGF0ZSEiLCJydXBkYXRlISIsInJ1cGQhIiwicnVwISJ9KSApOworCXRBZGRDbWQoICh7ImV4dHJvb211cGRhdGUiLCJydXBkYXRlKiIsInJ1cGQqIiwicnVwKiJ9KSApOworCXRBZGRDbWQoICh7ImV4dHJvb211cGRhdGVfYmFuZyIsInJvb211cGRhdGUqISIsInJ1cGRhdGUqISIsInJ1cGQqISIsInJ1cCohIiwKKwkJInJ1cCEqIiB9KSApOworCXRBZGRDbWQoICh7ImNsZWFub2YiLCJjbG5vZiJ9KSApOworCXRBZGRDbWQoICh7ImNsZWFub2ZfYmFuZyIsImNsZWFub2YhIiwiY2xub2YhIn0pICk7CisKKwl0QWRkQ21kKCAicGluZyIgKTsKK30KKwordm9pZCBpbml0KCkKK3sKKwkvL2xvZ2FjY2VzcyggImluaXQiICk7CisJOjppbml0KCk7CisJaWYgKCAhSVNfV0laQVJEKFBMKSB8fCBlbnZpcm9ubWVudCgpIT1QTCApCisJCXJldHVybjsKKwlhZGRfYWN0aW9uKCAicGFyc2UiLCAiLCIsIDEgKTsKKwlhZGRfYWN0aW9uKCAiam9uZ2xpZXIiLCAiam9uZ2xpZXIiLCAxICk7CisJYWRkX2FjdGlvbiggIm1lc3NhZ2UiLCAibWVzc2FnZSIgKTsKKwlhZGRfYWN0aW9uKCAibWVzc2FnZSIsICJtc2ciICk7Cit9CisKK3Nob3J0KCkKK3sKKwlsb2dhY2Nlc3MoICJzaG9ydCIgKTsKKwlyZXR1cm4gIkVpbiBTdGFwZWwgVGVsbGVyLlxuIjsKK30KKworaWQoIHN0ciApCit7CisJbG9nYWNjZXNzKCAiaWQiICk7CisJcmV0dXJuIDo6aWQoc3RyKTsKK30KKworbmFtZSggY2FzdXMsIGRlbSwgZm9yY2UgKQoreworCWxvZ2FjY2VzcyggIm5hbWUiICk7CisJcmV0dXJuIDo6bmFtZSggY2FzdXMsIGRlbSwgZm9yY2UgKTsKK30KKworbG9uZygpCit7CisJc3RyaW5nIGFuc3dlcjsKKwkKKwlhbnN3ZXIgPQorCQkgIkR1IGJldHJhY2h0ZXN0ICIrb3duZXJfbmFtZSsiIG1hZ2lzY2hlbiBUZWxsZXJzdGFwZWwuIERpZSBlaW56ZWxuZW4gVGVsbGVyIHNpbmRcbiIKKwkJKyJiaXMgYXVmIGVpbmUga2xlaW5lIEluc2NocmlmdCBhdWYgZGVtIEJvZGVuIHdlaXNzLiBXZW5uIER1IGhpZXJtaXRcbiIKKwkJKyJqb25nbGllcnN0LCBrYW5uIEFMTEVTIHBhc3NpZXJlbi5cbiI7CisKKwlpZiggZ2V0dWlkKFBMKSA9PSBnZXR1aWQoKSApCisJeworCQlhbnN3ZXIgKz0KKwkJCSggbWl0X3NheQorCQkJCT8gIkRpZSBUZWxsZXIgc2luZCBiZWltIEpvbmdsaWVyZW4gc2ljaHRiYXIuXG4iCisJCQkJOiAiRGllIFRlbGxlciBzaW5kIGJlaW0gSm9uZ2xpZXJlbiB1bnNpY2h0YmFyLlxuIgorCQkJKSArICggbWl0X25hbWVuCisJCQkJPyAiRGllIFRlbGxlciBuZW5uZW4gZGllIERpbmdlIGJlaW0gTmFtZW4uXG4iCisJCQkJOiAiRGllIFRlbGxlciBuZW5uZW4gZGllIERpbmdlIGJlaW0gRmlsZW5hbWVuLlxuIgorCQkJKSArICggcHJldHR5CisJCQkJPyAiRGllIFRlbGxlciBoYWJlbiBlaW4gdmVyc2Nobm9lcmtlbHRlcyBNdXN0ZXIuXG4iCisJCQkJOiAiRGllIFRlbGxlciBzaW5kIGdlcmFkZXp1IHNjaG11Y2tsb3MuXG4iCisJCQkpICsgKCBkb2xvZ2FjY2VzcworCQkJCT8gIkRpZSBUZWxsZXIgc3B1ZXJlbiBadWdyaWZmZS5cbiIKKwkJCQk6ICIiCisJCQkpICsgKCBzZWN1cmVpbnYKKwkJCQk/ICJEaWUgVGVsbGVyIGJld2FjaGVuIERlaW4gSW52ZW50YXIuXG4iCisJCQkJOiAiIgorCQkJKSArICggZG9fcHJvZmlsZQorCQkJCT8gIkRpZSBUZWxsZXIgd2VyZGVuIGJlaW0gRWlubG9nZ2VuIGFrdGl2LlxuIgorCQkJCTogIiIKKwkJCSk7CisJfSAKKwlyZXR1cm4gYW5zd2VyOyAJCit9CisKK3ZvaWQgX3NldF9hdXRvbG9hZG9iaiggbWl4ZWQgdmFsICkKK3sKKwlpZiggIXBvaW50ZXJwKHZhbCkgKSByZXR1cm47CisJdmFsICs9ICh7IDAsMCwwLDAsMCwwIH0pOworCW1pdF9uYW1lbiA9IHZhbFswXTsKKwltaXRfc2F5ID0gdmFsWzFdOwkKKwlzZXRfaGVhcnRfYmVhdCggc2VjdXJlaW52ID0gdmFsWzJdICk7CisJZG9sb2dhY2Nlc3MgPSB2YWxbM107CisJcHJldHR5ID0gdmFsWzRdOworCWRvX3Byb2ZpbGUgPSB2YWxbNV07CisJaWYoIGRvX3Byb2ZpbGUgKSBjYWxsX291dCggIl9sb2FkX3Byb2ZpbGUiLCAwLCB0aGlzX3BsYXllcigpICk7Cit9CisKK21peGVkIF9xdWVyeV9hdXRvbG9hZG9iaigpCit7CisJcmV0dXJuICh7IG1pdF9uYW1lbiwgbWl0X3NheSwgc2VjdXJlaW52LCBkb2xvZ2FjY2VzcywgcHJldHR5LAorCQlkb19wcm9maWxlIH0pOworfQorCit2b2lkIF9sb2FkX3Byb2ZpbGUoIG9iamVjdCBwbCApCit7CisJc3RyaW5nIHBmLGVycm1zZzsKKworCWlmKCBnZXRldWlkKCkgJiYgcGwgJiYgZ2V0ZXVpZChwbCk9PWdldGV1aWQoKQorCQkmJiBmaWxlX3NpemUocGY9Ii9wbGF5ZXJzLyIrZ2V0ZXVpZCgpKyIvLnByb2ZpbGUuYyIpPjAKKwkJJiYgKGVycm1zZz1jYXRjaChjYWxsX290aGVyKHBmLCJzZXR1cCIscGwpKSkKKwkpCisJCXByaW50ZiggIkVycm9yIGxvYWRpbmcgcHJvZmlsZTogJU9cbiIsIGVycm1zZyApOworfQorCit2b2lkIGxvZ2FjY2Vzcyggc3RyaW5nIHN0ciApCit7CisJaWYoIFJQTCAmJiBkb2xvZ2FjY2VzcyAmJiBnZXR1aWQoKSE9Z2V0dWlkKFJQTCkgJiYgZmluZF9wbGF5ZXIoZ2V0dWlkKCkpCisJCSYmIHByZXZpb3VzX29iamVjdCgpICYmIGdldHVpZChwcmV2aW91c19vYmplY3QoKSkgIT0gUk9PVElECisJCSYmIHF1ZXJ5X3dpel9sZXZlbChnZXR1aWQoKSk+PXF1ZXJ5X3dpel9sZXZlbChnZXR1aWQoUlBMKSkKKwkpCisJCXRlbGxfb2JqZWN0KCBmaW5kX3BsYXllcihnZXR1aWQoKSksICJNRU1POiAiICsgc3RyICsgIigpIHZvbiAiCisJCQkrIFJQTC0+bmFtZShXRU0pICsgIiB2aWEgWyIKKwkJCSsgb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KCkpKyJdLlxuIgorCQkpOworCWlmKCBzZWN1cmVpbnYgJiYgZmluZF9wbGF5ZXIoZ2V0dWlkKCkpICYmICFtZW1iZXIoaGVhcnRfYmVhdF9pbmZvKCksTUUpICkKKwl7CisJCXRlbGxfb2JqZWN0KCBmaW5kX3BsYXllcihnZXR1aWQoKSksICJNRU1POiBoZWFydF9iZWF0IHJlc3RhcnRldCEuXG4iICk7CisJCXNldF9oZWFydF9iZWF0KFRSVUUpOworCX0KK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGlsZmUtRnVua3Rpb25lbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorc3RhdGljIGludCBzZWN1cmUoKQoreworCWludCBpOworCWlmKCBwcm9jZXNzX2NhbGwoKSB8fCBzZWN1cmVfbGV2ZWwoKTxxdWVyeV93aXpfbGV2ZWwoUlBMKSApIHJldHVybiAwOworCWZvciggaT0wOyBwcmV2aW91c19vYmplY3QoaSk9PVJQTDsgaSsrICkKKwkJOworCXJldHVybiAoIXByZXZpb3VzX29iamVjdChpKSB8fCBwcmV2aW91c19vYmplY3QoKT09TUUpCisJCSAmJiBnZXR1aWQoKT09Z2V0dWlkKFJQTCkgJiYgSVNfV0laQVJEKFJQTCk7Cit9CisKK2ludCBqb25nbGllciggc3RyaW5nIHN0ciApCit7CisJc3RyaW5nIGFyZzsKKworCWxvZ2FjY2VzcyggImpvbmdsaWVyZSIgKTsKKwlpZiggIXN0ciB8fCBpZChzdHIpIHx8IHNzY2FuZiggc3RyLCAibWl0ICVzIiwgYXJnICkgPT0gMSApCisJeworCQlpZiggIXNlY3VyZSgpICkKKwkJCXdyaXRlKAorCQkJCSJEaWVzZXIgVGVsbGVyc3RhcGVsIGlzdCBuaWNodHMgZnVlciBEaWNoLiBTdWNoZSBEaXIgZWluZW4gZWlnZW5lbi5cbiIKKwkJCSk7CisJCWVsc2UKKwkJCXdyaXRlKAorCQkJICAiRGVyIEpvbmdsaWVyYmVmZWhsIGxhdXRldCBcIjtcIiBvZGVyIFwiLFwiLlxuIgorCQkJKwkiXCI7aGlsZmUgPGJlZmVobD5cIiBnaWJ0IERpciBIaWxmZXN0ZWxsdW5nLlxuIgorCQkJKTsKKwkJcmV0dXJuIFRSVUU7CisJfQorICByZXR1cm4gMDsKK30KKwkJCQorc3RhdGljIGludCB6ZWlnZV9oaWxmZSggc3RyaW5nIHN0ciApCit7CisJaWYoICFzdHJpbmdwKHN0cikgKSBzdHIgPSAiZ2VuZXJhbCI7CisJc3RyID0gaW1wbG9kZSggb2xkX2V4cGxvZGUoIEhFTFAoc3RyKSwgIi8uLi8iICksICIvIiApOworCWlmKCBmaWxlX3NpemUoc3RyKSA+IDAgKQorCXsKKwkJTW9yZSggc3RyLCAxICk7CisJCXJldHVybiBUUlVFOworCX0KKwl3cml0ZSggIlp1IGRpZXNlbSBUaGVtYSBnaWJ0IGVzIGtlaW5lIEhpbGZlLlxuIiApOworCXJldHVybiBUUlVFOworfQorCitpbnQgbWVzc2FnZSggc3RyaW5nIHN0ciApCit7CisJc3RyaW5nIHBsOworCW9iamVjdCBkZXN0OworCisJaWYoICFzZWN1cmUoKSApIHJldHVybiBGQUxTRTsKKworCWlmKCBzdHIgKQorCXsKKwkJaWYoIHNzY2FuZiggc3RyLCAidG8gJXMiLCBwbCApID09IDEgKQorCQkJc3RyID0gcGw7CisJCWlmKCAhKGRlc3QgPSBmaW5kX3BsYXllcihzdHIpICkgKQorCQl7CisJCQl3cml0ZSggY2FwaXRhbGl6ZShzdHIpICsgIiBpc3QgbmljaHQgZWluZ2Vsb2dndC5cbiIgKTsKKwkJCXJldHVybiBUUlVFOworCQl9CisJfQorCWVsc2UKKwkJZGVzdCA9IDA7CisKKwlkb19tc2coICI8TWl0dGVpbHVuZyB2b24gIitQTC0+bmFtZShXRU0pKyI+IiwgZGVzdCApOworCXdyaXRlKCAiTWl0dGVpbHVuZyIKKwkJKyAoIGRlc3QgPyAiIGFuICIgKyBkZXN0LT5uYW1lKFdFTikgOiAiIiApCisJCSsgIiBrYW5uIG1pdCAnKionIGJlZW5kZXQgd2VyZGVuLlxuIiApOworCisJaW5wdXRfdG8oICJtb3JlX21lc3NhZ2UiLCAwLCBkZXN0ICk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkIGRvX21zZyggc3RyaW5nIHN0ciwgb2JqZWN0IG9iaiApCit7CisJaWYoIG9iaiApCisJCXRlbGxfb2JqZWN0KCBvYmosIHN0ciArICJcbiIgKTsKKwllbHNlCisJCXNheSggc3RyICsgIlxuIiApOworfQorCitzdGF0aWMgaW50IG1vcmVfbWVzc2FnZSggc3RyaW5nIHN0ciwgb2JqZWN0IG9iaiApCit7CisJaWYoIHN0ciAhPSAiKioiICkKKwl7CisJCWRvX21zZyggc3RyLCBvYmogKTsKKwkJaW5wdXRfdG8oICJtb3JlX21lc3NhZ2UiLCAwLCBvYmogKTsKKwl9CisJZWxzZQorCQlkb19tc2coICI8RW5kZSBkZXIgTWl0dGVpbHVuZz4iLCBvYmogKTsKKwlyZXR1cm4gVFJVRTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUGFyc2UtRnVua3Rpb25lbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoraW50IHBhcnNlKCBzdHJpbmcgc3RyICkKK3sKKwlpbnQgaTsKKwlzdHJpbmcgYXJnLCByZXN0OworCisJaWYoICFzZWN1cmUoKSApIHJldHVybiBGQUxTRTsKKworCS8vIERpZSBIaWxmZSBmYWVsbHQgYXVzIGRlciBhbGxnZW1laW5lbiBTeW50YXggaGVyYXVzICEKKwlpZiggcXVlcnlfdmVyYigpWzEuLl0gPT0gImhpbGZlIiB8fCBxdWVyeV92ZXJiKClbMS4uXSA9PSAiaGVscCIgKQorCQlyZXR1cm4gemVpZ2VfaGlsZmUoIHN0ciApOworCisJaWYoIHN0cj10aGlzX3BsYXllcigpLT5fdW5wYXJzZWRfYXJncygpICkKKwkJc3RyID0gcXVlcnlfdmVyYigpWzEuLl0rIiAiK3N0cjsKKwllbHNlCisJCXN0ciA9IHF1ZXJ5X3ZlcmIoKVsxLi5dOworCisJZmVobGVyX3Bhc3NpZXJ0ID0gRkFMU0U7CisJd2hpbGUoICFmZWhsZXJfcGFzc2llcnQgJiYgc3RyICYmIHN0ciE9IiIgKQorCQlzdHIgPSBwYXJzZU5leHQoIHN0ciwgKHt9KSwgIi1ST09ULSIgKTsKKworCWlmKCBtaXRfc2F5ICYmICFQTC0+UXVlcnlQcm9wKFBfSU5WSVMpICkKKwl7CisJCWlmKCAhZmVobGVyX3Bhc3NpZXJ0ICkKKwkJCXNheSggUEwtPm5hbWUoV0VSKSsiIGpvbmdsaWVydCBtaXQgIgorCQkJCSsgUEwtPlFQUChNQUxFLFdFTSxQTFVSQUwpKyIgVGVsbGVybi5cbiIgKTsKKwkJZWxzZQorCQkJc2F5KCBQTC0+bmFtZShXRU0pKyIgZmFlbGx0IGJlaW0gSm9uZ2xpZXJlbiBlaW4gVGVsbGVyIGhlcnVudGVyLlxuIiApOworCX0KKwlpZiggIWZlaGxlcl9wYXNzaWVydCApCisJCXdyaXRlKCAiT0suXG4iICk7CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBzdHJpbmd8aW50IHBhcnNlTmV4dCggc3RyaW5nIHN0ciwgbWl4ZWQgYXV4c3RhY2ssIHN0cmluZyBmdW5uYW1lICkKK3sKKwltaXhlZCAqcmVzOworCXN0cmluZyBhcmcsIHJlc3Q7CisJYm9vbCBtaXRfcmV0dXJuOworCWludCBudW07CisKKwl3aGlsZSggc3RyIT0iIiAmJiBzdHJbMF09PScgJyApCisJCXN0ciA9IHN0clsxLi5dOworCWlmKCBzdHI9PSIiICkKKwkJcmV0dXJuIEZBTFNFOworCisJc3dpdGNoKCBzdHJbMF0gKQorCXsKKwkJY2FzZSAnOyc6IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gS29tbWFuZG9iZWdpbm4KKwkJY2FzZSAnLCc6CisJCQlwdXNoKCAiOyIgKTsKKwkJCXJldHVybiBzdHJbMS4uXTsKKwkJY2FzZSAnXCInOiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3RyaW5na29uc3RhbnRlCisJCQlpZiggc3NjYW5mKCBzdHIsICJcIiVzXCIlcyIsIGFyZywgcmVzdCApPT0yICkKKwkJCXsKKwkJCQkvKiB0ZXN0IGF1ZiBudW1lcmlzY2ggZmVobHQgaGllciBub2NoICovCisJCQkJcHVzaF9zdHIoIGFyZyApOworCQkJCXJldHVybiByZXN0OworCQkJfQorCQkJaWYoICFzc2NhbmYoIHN0ciwgIlwiJXNcIiIsIGFyZyApICkKKwkJCQlyZXR1cm4gZXJyb3IoICJTdHJpbmcgb2huZSBFbmRlIiApOworCQkJcHVzaF9zdHIoIGFyZyApOworCQkJcmV0dXJuIEZBTFNFOworCQljYXNlICcjJzogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBaYWhsCisJCQlyZXMgPSBuZXh0QWxwaGEoIHN0clsxLi5dICk7CisJCQlpZiggc3NjYW5mKCByZXNbMF0sICIlZCIsIG51bSApID09IDEgKQorCQkJeworCQkJCXB1c2goIG51bSApOworCQkJCXJldHVybiByZXNbMV07CisJCQl9CisJCQlyZXR1cm4gZXJyb3IoICInIyc6IGtlaW5lIGVybGF1YnRlIFphaGwiICk7CisJCWNhc2UgJ14nOiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEhvbGUgZW52CisJCQlpZiggIWJlY29tZXNfb2JqKCkgKQorCQkJCXJldHVybiBlcnJvciggIideJzogVE9TIGlzdCBrZWluIE9iamVrdCIgKTsKKwkJCWlmKCAhZW52aXJvbm1lbnQodG9wKCkpICkKKwkJCQlyZXR1cm4gZXJyb3IoICInXic6IFRPUyBoYXQga2VpbiBFbnZpcm9ubWVudCIgKTsKKwkJCXB1c2goZW52aXJvbm1lbnQocG9wKCkpKTsKKwkJCXJldHVybiBzdHJbMS4uXTsKKwkJY2FzZSAnLic6IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSG9sZSBhdXMgaW52CisJCQlpZiggIWJlY29tZXNfb2JqKCkgKQorCQkJCXJldHVybiBlcnJvciggIicuJzogVE9TIGlzdCBrZWluIE9iamVrdCIgKTsKKwkJCXJlcyA9IG5leHRBbHBoYSggc3RyWzEuLl0gKTsKKwkJCWNhbGNpbnYoIHJlc1swXSApOworCQkJcmV0dXJuIHJlc1sxXTsKKwkJY2FzZSAnPCc6IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gUmVjYWxsCisJCQlpZiggIXNzY2FuZiggc3RyLCAiPCVzIiwgYXJnICkgfHwgYXJnPT0iIiApCisJCQkJcmV0dXJuIGVycm9yKCAiJzwnOiBWYXJpYWJsZW5uYW1lIGZlaGx0IiApOworCQkJcmVzID0gbmV4dEFscGhhKCBzdHJbMS4uXSApOworCQkJZG9fcmVjYWxsKHJlc1swXSk7CisJCQlyZXR1cm4gcmVzWzFdOworCQljYXNlICc+JzogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdG9yZQorCQkJaWYoICFzc2NhbmYoIHN0ciwgIj4lcyIsIGFyZyApIHx8IGFyZz09IiIgKQorCQkJCXJldHVybiBlcnJvciggIic+JzogVmFyaWFibGVubmFtZSBmZWhsdCIgKTsKKwkJCXJlcyA9IG5leHRBbHBoYSggc3RyWzEuLl0gKTsKKwkJCWRvX3N0b3JlKHJlc1swXSk7CisJCQlyZXR1cm4gcmVzWzFdOworCQljYXNlICctJzogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDYWxsIG1pdCAnLScKKwkJCXN0ciA9IHN0clsxLi5dOworCQkJaWYoIG1pdF9yZXR1cm4gPSAoc3RyWzBdID09ICctJykgKQorCQkJCXN0ciA9IHN0clsxLi5dOworCQkJcmVzID0gbmV4dEFscGhhKCBzdHJbMS4uXSApOworCQkJc3dpdGNoKCBzdHJbMF0gKQorCQkJeworCQkJCWNhc2UgJz4nOgorCQkJCQlpZiggZG9fY2FsbCggcmVzWzBdLCBtaXRfcmV0dXJuICkgKQorCQkJCQkJcmV0dXJuIHJlc1sxXTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAnKic6CisJCQkJCWlmKCBkb19jYWxsX2VmdW4oIHJlc1swXSwgbWl0X3JldHVybiApICkKKwkJCQkJCXJldHVybiByZXNbMV07CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiBlcnJvciggIictJzogJz4nIG9kZXIgJyonIGVyd2FydGV0IiApOworCQkJfQorCQkJcmV0dXJuIEZBTFNFOworCQljYXNlICdcJyc6IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDYWxsCisJCQlzdHIgPSBzdHJbMS4uXTsKKwkJCWlmKCBtaXRfcmV0dXJuID0gKHN0clswXSA9PSAnXCcnKSApCisJCQkJc3RyID0gc3RyWzEuLl07CisJCQlyZXMgPSBuZXh0QWxwaGEoIHN0ciApOworCQkJaWYoIGRvX2NhbGwoIHJlc1swXSwgbWl0X3JldHVybiApICkKKwkJCQlyZXR1cm4gcmVzWzFdOworCQkJcmV0dXJuIEZBTFNFOworCQljYXNlICdgJzogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENhbGwgRWZ1bgorCQkJc3RyID0gc3RyWzEuLl07CisJCQlpZiggbWl0X3JldHVybiA9IChzdHJbMF0gPT0gJ2AnKSApCisJCQkJc3RyID0gc3RyWzEuLl07CisJCQlyZXMgPSBuZXh0QWxwaGEoIHN0ciApOworCQkJaWYoIGRvX2NhbGxfZWZ1biggcmVzWzBdLCBtaXRfcmV0dXJuICkgKQorCQkJCXJldHVybiByZXNbMV07CisJCQlyZXR1cm4gRkFMU0U7CisJCWNhc2UgJ0AnOiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRXZhbHVhdGUKKwkJCXN0ciA9IHN0clsxLi5dOworCQkJaWYoIG1pdF9yZXR1cm4gPSAoc3RyWzBdID09ICdAJykgKQorCQkJCXN0ciA9IHN0clsxLi5dOworCQkJaWYoIGRvX2xwYyggc3RyLCBtaXRfcmV0dXJuICkgKQorCQkJCXJldHVybiBGQUxTRTsKKwkJCXJldHVybiBGQUxTRTsKKwkJY2FzZSAnISc6IC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTUVUQQorCQkJaWYoIHNzY2FuZihzdHIsIiElZCVzIixudW0sYXJnKT09MiApCisJCQl7CisJCQkJaWYoIG51bT49c2l6ZW9mKGF1eHN0YWNrKSApCisJCQkJCXJldHVybiBlcnJvciggIiciK2Z1bm5hbWUrIic6IHp1IHdlaW5nIEFyZ3VtZW50ZSIgKTsKKwkJCQlwdXNoKCBhdXhzdGFja1tudW1dICk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmVzID0gbmV4dEFscGhhKCBzdHJbMS4uXSApOworCQkJCW1lbW9yeSArPSAoWyByZXNbMF06IHJlc1sxXTsgMSBdKTsKKwkJCQlyZXR1cm4gRkFMU0U7CisJCQl9CisJCQlyZXR1cm4gYXJnOworCQlkZWZhdWx0OiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkZWZhdWx0CisJCQlyZXMgPSBuZXh0QWxwaGEoIHN0ciApOworCQkJZG9fY21kKHJlc1swXSk7CisJCQlyZXR1cm4gcmVzWzFdOworCX0KKwlyZXR1cm4gbWVtbyggIkV0d2FzIFNlbHRzYW1lcyBpc3QgcGFzc2llcnQiICk7Cit9CisKK3N0YXRpYyBpbnQgZG9fY21kKCBzdHJpbmcgc3RyICkKK3sKKwlzdHJpbmcgZnVuLCBmaWxlbmFtZSwgKnNwbDsKKwltaXhlZCogb2xkc3RhY2s7CisJaW50IGksbWF4LG51bTsKKworCWlmKCBtZW1iZXIobWVtb3J5LHN0cikgKQorCXsKKwkJZnVuID0gbWVtb3J5W3N0ciwwXTsKKwkJaWYoICFtZW1vcnlbc3RyLDFdICkgLy8gbm9ybWFsZSBWYXJpYWJsZW4KKwkJeworCQkJcHVzaCggZnVuICk7CisJCQlyZXR1cm4gVFJVRTsKKwkJfQorCQlvbGRzdGFjayA9IHN0YWNrOworCQlzdGFjayA9ICh7fSk7CisJCXNwbCA9IHJlZ2V4cGxvZGUoIGZ1biwgIiFbMC05XVswLTldKiIgKTsKKwkJbWF4ID0gLTE7CisJCWZvciggaT0xOyBpPHNpemVvZihzcGwpOyBpKz0yICkKKwkJCWlmKCBzc2NhbmYoc3BsW2ldLCIhJWQiLG51bSkgJiYgbWF4PG51bSApIG1heCA9IG51bTsKKworCQl3aGlsZSggIWZlaGxlcl9wYXNzaWVydCAmJiBmdW4gJiYgZnVuIT0iIiApCisJCQlmdW4gPSBwYXJzZU5leHQoIGZ1biwgb2xkc3RhY2ssIHN0ciApOworCQlpZiggZmVobGVyX3Bhc3NpZXJ0ICkKKwkJeworCQkJc3RhY2sgPSBvbGRzdGFjazsKKwkJCXJldHVybiBGQUxTRTsKKwkJfQorCQlzdGFjayA9IHN0YWNrICsgb2xkc3RhY2tbKG1heCsxKS4uXTsKKwkJcmV0dXJuIFRSVUU7CisJfQorICBlbHNlIGlmIChmdW49dGNvbW1hbmRzW3N0cl0pCisJCXJldHVybiBjYWxsX290aGVyKE1FLCJjbWRfIitmdW4pOworCisJaWYoIHNzY2FuZiggc3RyLCAiJWQiLCBpICkgKQorCQlwdXNoKCBpICk7CisJZWxzZQorCXsKKwkJZmlsZW5hbWUgPSBNQVNURVItPl9nZXRfcGF0aChzdHIsZ2V0dWlkKCkpOworCQlpZiggZmlsZW5hbWVbPDFdID09ICcuJyApCisJCQlmaWxlbmFtZSA9IGZpbGVuYW1lWzAuLjwyXTsKKwkJaWYoIGZpbGVfc2l6ZSggZmlsZW5hbWUrIi5jIiApICE9IC0xICkKKwkJCXB1c2goIGZpbGVuYW1lICk7CisJCWVsc2UKKwkJCXB1c2goIHN0ciApOworCX0KKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIG1peGVkIG5leHRBbHBoYSggc3RyaW5nIHN0ciApCit7CisJaW50IHBvczsKKworCWZvciggCisJCXBvcz0wOworCQlwb3M8c2l6ZW9mKHN0cikgJiYgbWVtYmVyKCAiICNcIjssXi4+PCIsIHN0cltwb3NdICkgPT0gLTE7CisJCXBvcysrCisJKQorCQk7CisKKwlpZiggcG9zPT1zaXplb2Yoc3RyKSApCisJCXJldHVybiAoeyBzdHIsIDAgfSk7CisJZWxzZQorCQlyZXR1cm4gKHsgc3RyWzAuLnBvcy0xXSwgc3RyW3Bvcy4uXSB9KTsKK30KKworc3RhdGljIHZhcmFyZ3Mgdm9pZCByZXN0b3JlX3N0YWNrKCBzdHJpbmcqIGFyZ3YsIGludCBhcmdzICkKK3sKKwlpbnQgaTsKKwlpZiggIWFyZ3MgKQorCQlhcmdzID0gc2l6ZW9mKGFyZ3YpOworCWlmKCBzaXplb2Yoc3RhY2spICkgcHVzaCggIjsiICk7CisJZm9yKCBpPTA7IGk8YXJnczsgaSsrICkKKwkJcHVzaChhcmd2W2ldKTsKK30KKworc3RhdGljIGludCBkb19jYWxsKCBzdHJpbmcgZnVuLCBpbnQgbWl0X3JldHVybiApCit7CisJaW50IGFyZ3M7CisJc3RyaW5nIGVycjsKKwltaXhlZCByZXN1bHQ7CisJbWl4ZWQgYXJnLCAqYXJndjsKKworCWFyZ3YgPSAoe30pOworCXdoaWxlKCBzaXplb2Yoc3RhY2spICYmIChhcmc9cG9wKCkpIT0iOyIgKQorCQlhcmd2ID0gKHthcmd9KSArIGFyZ3Y7CisJaWYoICFiZWNvbWVzX29iaihhcmd2KSApCisJeworCQlyZXN0b3JlX3N0YWNrKCBhcmd2ICk7CisJCXJldHVybiBlcnJvciggImNhbGw6IEZ1bmt0aW9uIG5pY2h0IGFuIE9iamVrdCBnZXJpY2h0ZXQiICk7CisJfQorCWlmKCAhZnVuY3Rpb25fZXhpc3RzKGZ1bixhcmd2WzBdKSApCisJeworCQlyZXN0b3JlX3N0YWNrKGFyZ3YpOworCQlyZXR1cm4gZXJyb3IoICJjYWxsOiBGdW5rdGlvbiBuaWNodCBnZWZ1bmRlbiIgKTsKKwl9CisKKwlhcmdzID0gc2l6ZW9mKGFyZ3YpOworCWFyZ3YgKz0gKHsgMCwwLDAsMCwwIH0pOworCWVycj0oY2F0Y2gocmVzdWx0PWNhbGxfb3RoZXIoYXJndlswXSxmdW4sCisJCWFyZ3ZbMV0sYXJndlsyXSxhcmd2WzNdLGFyZ3ZbNF0sYXJndls1XSkpKTsKKwlpZiggZXJyICkKKwl7CisJCXJlc3RvcmVfc3RhY2soIGFyZ3YsIGFyZ3MgKTsKKwkJcmV0dXJuIGVycm9yKCAiY2FsbDogIitlcnJbMS4uPDJdICk7CisJfQorCWVsc2UKKwl7CisJCXdyaXRlKCAiPT4gIiApOworCQlkdW1wX29iaiggcmVzdWx0LCAzICk7CisJCWlmKCBtaXRfcmV0dXJuICkKKwkJCXB1c2goIHJlc3VsdCApOworCX0KKwlyZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludCBkb19jYWxsX2VmdW4oIHN0cmluZyBmdW4sIGludCBtaXRfcmV0dXJuICkKK3sKKwlpbnQgYXJnczsKKwlzdHJpbmcgZXJyOworCW1peGVkIHJlc3VsdDsKKwltaXhlZCBhcmcsICphcmd2OworCisJYXJndiA9ICh7fSk7CisJd2hpbGUoIHNpemVvZihzdGFjaykgJiYgKGFyZz1wb3AoKSkhPSI7IiApCisJCWFyZ3YgPSAoe2FyZ30pICsgYXJndjsKKworCWlmKCAhZnVuY3Rpb25fZXhpc3RzKCAiZWZ1bl8iK2Z1biApICkKKwkJcmV0dXJuIGVycm9yKCAiY2FsbCBlZnVuOiBcIiIrZnVuKyJcIiBuaWNodCBiZW51dHpiYXIiICk7CisJZnVuID0gImVmdW5fIitmdW47CisKKwlhcmdzID0gc2l6ZW9mKGFyZ3YpOworCWFyZ3YgKz0gKHsgMCwwLDAsMCwwIH0pOworCWVycj0oY2F0Y2gocmVzdWx0PWNhbGxfb3RoZXIoTUUsZnVuLAorCQkJYXJndlswXSxhcmd2WzFdLGFyZ3ZbMl0sYXJndlszXSxhcmd2WzRdKSkpOworCWlmKCBlcnIgKQorCXsKKwkJcmVzdG9yZV9zdGFjayggYXJndiwgYXJncyApOworCQlyZXR1cm4gZXJyb3IoICJjYWxsIGVmdW46ICIrZXJyWzEuLjwyXSApOworCX0KKwllbHNlCisJeworCQl3cml0ZSggIj0+ICIgKTsKKwkJZHVtcF9vYmooIHJlc3VsdCwgMyApOworCQlpZiggbWl0X3JldHVybiApCisJCQlwdXNoKCByZXN1bHQgKTsKKwl9CisJcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyBpbnQgZG9fbHBjKCBzdHJpbmcgc3RyLCBpbnQgbWl0X3JldHVybiApCit7CisJaW50IGFyZ3MsIHZhbDsKKwlzdHJpbmcgZXJyOworCXN0cmluZyBmaWxlLCBjbWQsIHByZSwgcG9zdDsKKwltaXhlZCByZXN1bHQ7CisJbWl4ZWQgYXJnLCAqYXJndjsKKworCWFyZ3YgPSAoe30pOworCXdoaWxlKCBzaXplb2Yoc3RhY2spICYmIChhcmc9cG9wKCkpIT0iOyIgKQorCQlhcmd2ID0gYXJndiArICh7YXJnfSk7CisKKwlmaWxlID0gIi9wbGF5ZXJzLyIrZ2V0dWlkKCkrIi8udGVsbGVyIjsKKwljbWQgPSAiI2luY2x1ZGUgPGxhbmd1YWdlLmg+XG4jaW5jbHVkZSA8cHJvcGVydGllcy5oPlxuIgorCQkrICIjaW5jbHVkZSA8bW92aW5nLmg+XG4jaW5jbHVkZSA8ZGVmaW5lcy5oPlxuI2luY2x1ZGUgPHRlcm1pbmFsLmg+XG4iCisJCSsgIiNpbmNsdWRlIDx3aXpsZXZlbHMuaD5cbiNpbmNsdWRlIDxhbnNpLmg+XG5jcmVhdGUoKXt9ZG9pdCgpeyI7CisKKwl3aGlsZSggc3RyIT0iIiAmJiBzc2NhbmYoIHN0ciwgIiVzQCVzIiwgcHJlLCBwb3N0ICkgPT0gMiApCisJeworCQlpZiggc3NjYW5mKCBzdHIsICIlc0AlZEAlcyIsIHByZSwgdmFsLCBwb3N0ICkgPT0gMyApCisJCXsKKwkJCWlmKCBzaXplb2YoYXJndik8PXZhbCB8fCB2YWw8MCApCisJCQl7CisJCQkJcmVzdG9yZV9zdGFjayggYXJndiwgYXJncyApOworCQkJCXJldHVybiBlcnJvciggImxwYzogSWxsZWdhbGVyIEluZGV4IGF1ZiBkZW4gU3RhY2siICk7CisJCQl9CisJCQljbWQgKz0gcHJlICsgRHVtcE9iaihhcmd2W3ZhbF0pOworCQkJc3RyID0gcG9zdDsKKwkJfQorCQllbHNlCisJCQlpZiggc3NjYW5mKCBzdHIsICIlc0AlcyIsIHByZSwgcG9zdCApID09IDIgKQorCQkJeworCQkJCWNtZCArPSBwcmUgKyAiQCI7CisJCQkJc3RyID0gcG9zdDsKKwkJCX0KKwl9CisJY21kICs9IHN0cjsKKwlybSggZmlsZSsiLmMiICk7CisJd3JpdGVfZmlsZSggZmlsZSsiLmMiICwgY21kKyI7fVxuIiApOworCWlmKCBmaW5kX29iamVjdChmaWxlKSApIGRlc3RydWN0KCBmaW5kX29iamVjdChmaWxlKSApOworCWVycj0oY2F0Y2gocmVzdWx0PWNhbGxfb3RoZXIoZmlsZSwiZG9pdCIpKSk7CisJaWYoIGVyciApCisJeworCQkvL3JtKCBmaWxlKyIuYyIgKTsKKwkJcmVzdG9yZV9zdGFjayggYXJndiwgYXJncyApOworCQlyZXR1cm4gZXJyb3IoICJscGM6ICIrZXJyWzEuLjwyXSApOworCX0KKwllbHNlCisJeworCQkvL3JtKCBmaWxlKyIuYyIgKTsKKwkJd3JpdGUoICI9PiAiICk7CisJCWR1bXBfb2JqKCByZXN1bHQsIDMgKTsKKwkJaWYoIG1pdF9yZXR1cm4gKQorCQkJcHVzaCggcmVzdWx0ICk7CisJfQorCXJldHVybiBUUlVFOworfQpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3RlbGxlci90ZWxsZXIuaCBiL29iai90b29scy90ZWxsZXIvdGVsbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQxZDc5NgotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy90ZWxsZXIvdGVsbGVyLmgKQEAgLTAsMCArMSwyMiBAQAorI2lmbmRlZiBfVEVMTEVSX0hfCisjZGVmaW5lIF9URUxMRVJfSF8KKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKworI2RlZmluZSBUUlVFIDEKKyNkZWZpbmUgRkFMU0UgMAorI2RlZmluZSBib29sIGludAorCisjZGVmaW5lIElORk9STUVSICIvc2VjdXJlL21lcmxpbiIKKy8vI2RlZmluZSBNQVNURVIgIi9zZWN1cmUvbWFzdGVyIgorCisjZGVmaW5lIFRfQkFTRSAiL29iai90b29scy90ZWxsZXIvdF9iYXNlIgorI2RlZmluZSBUX0VGVU4gIi9vYmovdG9vbHMvdGVsbGVyL3RfZWZ1biIKKyNkZWZpbmUgVF9DTURTICIvb2JqL3Rvb2xzL3RlbGxlci90X2NtZHMiCisjZGVmaW5lIFRfUExBWUVSICIvb2JqL3Rvb2xzL3RlbGxlci90X3BsYXllciIKKworI2RlZmluZSBIRUxQKHgpICgiL29iai90b29scy90ZWxsZXIvaGlsZmUvIisoeCkpCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb2JqL3Rvb2xzL3Rlc3Rlci90ZXN0LmMgYi9vYmovdG9vbHMvdGVzdGVyL3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDcwZmE4Ci0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3Rlc3Rlci90ZXN0LmMKQEAgLTAsMCArMSwxMTQ2IEBACisvKgorKiogICBPYmpla3QtVGVzdGVyIC0gTWlzY2h1bmcgYXVzIFJpa3VzJyBEZXRhaWx0ZXN0ZXIgdW5kIFJvY2h1cycgVGVzdC1OUEMuCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgICBVcnNwcnVlbmdsaWNoZSBPYmpla3RlOgorKiogICAgfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn4KKyoqICAgIC9wbGF5ZXJzL3Jpa29zL29iai9yZGV0LmMgICAgICAgICAgIFJpa3VzQE1vcmdlbkdyYXVlbiAgICAgICAgIDI1LjA1Ljk2CisqKgorKiogICAgL3BsYXllcnMvcm9jaHVzL21vbi90ZXN0ZXIuYyAgICAgICAgUm9jaHVzQE1vcmdlbkdyYXVlbiAgICAgICAgMTguMTAuOTQKKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICAgIERpZXNlcyBPYmpla3Q6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBWZXJzaW9uIDAuOCBdCisqKiAgICB+fn5+fn5+fn5+fn5+fgorKiogICAgL3BsYXllcnMvcGFyYWNlbHN1cy90b29scy9vdGVzdC5jICAgUGFyYWNlbHN1c0BNb3JnZW5ncmF1ZW4gICAgMjguMDIuOTgKKyoqCisqKiAgICBEaWUgV2VpdGVyZ2FiZSwgVmVyd2VuZHVuZyBvZGVyIFZlcmFlbmRlcnVuZyBpc3QgbnVyIGVybGF1YnQsIHdlbm4KKyoqICAgIGRpZXNlIE1lbGR1bmcgbmljaHQgZ2VhZW5kZXJ0IHdpcmQuCisqKiAgICBEaWUgQmVudXR6dW5nIGVyZm9sZ3QgYXVmIGVpZ2VuZSBHZWZhaHIsIGplZGUgVmVyYW50d29ydHVuZyB3aXJkCisqKiAgICBhYmdlbGVobnQuIEVzIHdpcmQga2VpbmUgR2FyYW50aWUgZ2VnZWJlbiwgZGFzcyBkZXIgT2JqZWt0dGVzdGVyCisqKiAgICBlaW53YW5kZnJlaSwgdm9sbHN0YWVuZGlnIG9kZXIgZ2FyIHp1ZnJpZWRlbnN0ZWxsZW5kIGFyYmVpdGV0LgorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogICAgQ2hhbmdlTG9nOgorKiogICAgfn5+fn5+fn5+fgorKiogICAgViAwLjEgICAgMjguMDIuOTggMTE6MDA6MDAgICBQYXJhY2Vsc3VzCisqKgorKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJpa3VzJyBSYXVtdGVzdGVyIGtvcGllcnQsIG9wdGltaWVydC4KKyoqCisqKiAgICBWIDAuMiAgICAyOC4wMi45OCAxMTozMDowMCAgIFBhcmFjZWxzdXMKKyoqCisqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2VpbmUgZGlyZWt0ZSBBdXNnYWJlIG1laHIgc29uZGVybgorKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR0ZGVzc2VuIGVpbiBNb3JlKCkuCisqKgorKiogICAgViAwLjMgICAgMjguMDIuOTggMTM6MDA6MDAgICBQYXJhY2Vsc3VzCisqKgorKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RlbiBuaWNodCBtZWhyIGF1ZiBSYWV1bWUgYmVzY2hyYWVua3QuCisqKgorKiogICAgViAwLjQgICAgMjguMDIuOTggMTY6MDA6MDAgICBQYXJhY2Vsc3VzCisqKgorKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmt0aW9uZW4gYXVzIFJvY2h1cycgVGVzdGVyIHVlYmVybm9tbWVuCisqKgorKiogICAgViAwLjUgICAgMjguMDIuOTggMTg6MDA6MDAgICBQYXJhY2Vsc3VzCisqKgorKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmt0aW9uYWxpdGFldGVuIHZvbiBSaWt1cyB1bmQgUm9jaHVzCisqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5laW5hbmRlciBhbmdlcGFzc3QuCisqKgorKiogICAgViAwLjYgICAgMjguMDIuOTggMTk6MDA6MDAgICBQYXJhY2Vsc3VzCisqKgorKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlcnVlY2hlIHVuZCBHZXJhZXVzY2hlIGVpbmdlYmF1dCwKKyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnN0ZSBUZXN0cyBlcmZvbGdyZWljaC4KKyoqCisqKiAgICBWIDAuNyAgICAyOC4wMi45OCAxOTozMDowMCAgIFBhcmFjZWxzdXMKKyoqCisqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BhbHRlbnphaGwgZWluc3RlbGxiYXIuCisqKgorKiogICAgViAwLjggICAgMDEuMDMuOTggMTk6MzA6MDAgICBQYXJhY2Vsc3VzCisqKgorKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYW5uZW4gZ2FuemVyIFZlcnplaWNobmlzc2UuIEdlaHQgamV0enQKKyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB6dW1pbmRlc3QgYmVpIFJhZXVtZW4uCisqKgorKiogICAgViAwLjkgICAgMjAuMDkuOTggMjA6NDU6MDAgICBQYXJhY2Vsc3VzCisqKgorKiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVtZ2VzdGVsbHQgdm9uIGhlYXJ0X2JlYXQoKSBhdWYKKyoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsX291dCgpLCBkYW1pdCB0aGlzX3BsYXllcigpCisqKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJoYWx0ZW4gYmxlaWJ0LgorKioJICAgICAgIDEzLjEwLjA4CQkgICBDaGFnYWxsCisqKgorKioJCQkJICAgICBfcXVlcnlfZGV0YWlscygpIHVuZAorKioJCQkJICAgICBfcXVlcnlfc3BlY2lhbF9kZXRhaWxzIGF1ZgorKioJCQkJICAgICBRdWVyeVByb3AoKSB1bWdlc3RlbGx0CisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICAgRXZlbnR1ZWxsIGF1ZnRyZXRlbmRlIFByb2JsZW1lOgorKiogICB+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CisqKiAgIC0gWnUgaG9oZSBldmFsX2Nvc3QsIHdlbm4genUgdmllbGUgRGV0YWlscyB2b3JoYW5kZW4gc2luZC4KKyoqICAgICBHcm9lc3N0ZXIgYmlzaGVyIGdldGVzdGV0ZXIgUmF1bSAob2huZSBGZWhsZXIpIDogNjM5MDcKKyoqICAgICBTY2hlaW50IGFsc28gd29obCBkb2NoIGtlaW4gUHJvYmxlbSB6dSBzZWluLgorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgIElkZWVuL1RvRG86CisqKiAgIH5+fn5+fn5+fn5+CisqKgorKiogICAtIE5QQy1JbmZvcyB0ZXN0ZW4uCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8dGVybWluYWwuaD4KKworI2RlZmluZSBEQVRBRklMRSAgICAgInRlc3QuZGF0IgorI2RlZmluZSBERUZBVUxUX0RBVEEgIi9vYmovdG9vbHMvdGVzdGVyL3Rlc3QuZGF0IgorCisjZGVmaW5lIFBfT1RFU1RfVFlQICJvYi10ZXN0OnR5cCIKKyNkZWZpbmUgUF9PVEVTVF9TUEwgIm9iLXRlc3Q6c3BhbHRlbiIKKworI2RlZmluZSBUX1JPQ0hVUyAxCisjZGVmaW5lIFRfUklLVVMgIDIKKworI2RlZmluZSBUX1BBVVNFICA0CisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisKK2luaGVyaXQgIi9zdGQvdGhpbmciOworCisvLyBBbGxnZW1laW4gYmVub2V0aWd0ZSBnbG9iYWxlIFZhcmlhYmxlbgorCitpbnQgICAgIHNjYW50eXAsc3BhbHRlbjsKK21hcHBpbmcgYWxsX2RldHM7CittaXhlZCAgIG91dHB1dDsKK29iamVjdCAgbWFzdGVyOworCisvLyBHbG9iYWxlIFZhcmlhYmxlbiBmdWVyIGRhcyBzY2FubmVuIGdhbnplciBEaXJlY3RvcmllcworCitpbnQgICAgIHNjYW5ydW4sc2NhbmNvdW50LHNjYW5wYXVzZSwqc2NhbmVycjsKK3N0cmluZyAgc2NhbmRpciwqc2NhbmZpbGVzOworb2JqZWN0ICB0ZXN0b2I7CisKK3N0cmluZyB4X2xvbmcoKQoreyAgIHN0cmluZyByZSxQUkUsRU5EOworCisgICAgc3dpdGNoIChQTC0+UXVlcnlQcm9wKFBfVFRZKSkKKyAgICB7CisgICAgICAgIGNhc2UgImFuc2kiICA6CisgICAgICAgIGNhc2UgInZ0MTAwIiA6IFBSRT1CT0xEOyBFTkQ9Tk9STUFMOyBicmVhazsKKyAgICAgICAgZGVmYXVsdCAgICAgIDogUFJFPSIiOyAgIEVORD0iIjsgICAgIGJyZWFrOworICAgIH0KKworICAgIHJlID0gYnJlYWtfc3RyaW5nKAorICAgICAgICAgIk1pdCBkaWVzZW0gT2JqZWt0cHJ1ZWZlciBrYW5uc3QgRHUgZmVzdHN0ZWxsZW4sIHdlbGNoZSBEZXRhaWxzLCAiKworICAgICAgICAgIkdlcnVlY2hlIG9kZXIgR2VyYWV1c2NoZSBpbiBlaW5lbSBSYXVtIGJ6dyBhbiBlaW5lbSBPYmpla3Qgbm9jaCAiKworICAgICAgICAgIm5pY2h0IGJlc2NocmllYmVuIHNpbmQuIiw3OCkrCisgICAgICAgICAiXG4iKworICAgICAgICAgIlN5bnRheDogJXNvdGVzdCBbZGV0YWlsfHNtZWxsfHNvdW5kXSB7PG9iamVrdD5baW4gbWlyfGltIHJhdW1dfCIrCisgICAgICAgICAgICAgImhpZXJ9XG5cbiIrCisgICAgICAgICAiICAgICAgICBvdHlwZSBbcmlrdXN8cm9jaHVzXVxuXG4iKworICAgICAgICAgIiAgICAgICAgb2NvbG0gWzF8MnwzfDR8NXw2fDd8OHxhdXRvXVxuXG4iKworICAgICAgICAgIiAgICAgICAgb3RkaXIgPHZlcnplaWNobmlzPiA8YXVzZ2FiZWZpbGU+JXNcblxuIisKKyAgICAgICAgIGJyZWFrX3N0cmluZygKKyAgICAgICAgICJNaXQgJXNvdHlwZSVzIGthbm4gbWFuIGZlc3RsZWdlbiwgb2IgbWFuIGltICdSaWt1cyctIG9kZXIgaW0gIisKKyAgICAgICAgICInUm9jaHVzJy1Nb2R1cyBzY2FubmVuIHdpbGwsIG1pdCAlc29jb2xtJXMgZGllIGFuemFobCBkZXIgQXVzZ2FiZSIrCisgICAgICAgICAic3BhbHRlbiB1bmQgbWl0ICVzb3Rlc3QlcyB3aXJkIGRhbm4gZGllIEF1c3dlcnR1bmcgZ2VzdGFydGV0LiAiKworICAgICAgICAgIk1pdCBkZW0gS29tbWFuZG8gJXNvdGRpciVzIGthbm4gbWFuIHNvZ2FyIGdhbnplIFZlcnplaWNobmlzc2UgIisKKyAgICAgICAgICJhdWYgZWlubWFsIHRlc3RlbiBsYXNzZW4uIERhcyBkYXVlcnQgbmF0dWVybGljaCBlaW5lIFdlaWxlLiAiKworICAgICAgICAgIkF1c3NlcmRlbSBtdXNzIGVpbiBWZXJ6ZWljaG5pcyAnL2xvZy88bWFnaWVybmFtZT4vJyBiZXN0ZWhlbi4iLDc4KSsKKyAgICAgICAgICJEZXJ6ZWl0aWdlciBTY2FudHlwOiAgICAlcyciKyhzY2FudHlwPT1UX1JPQ0hVUz8iUk9DSFVTIjoiUklLVVMiKSsKKyAgICAgICAgICInJXNcbiIrCisgICAgICAgICAiRGVyemVpdGlnZSBTcGFsdGVuemFobDogJXMlcyVzXG4lcyI7CisgICAgcmV0dXJuIHNwcmludGYocmUsUFJFLEVORCxQUkUsRU5ELFBSRSxFTkQsUFJFLEVORCxQUkUsRU5ELFBSRSxFTkQsUFJFLAorICAgICAgICAgICAoc3BhbHRlbj4wP3NwcmludGYoIiVkIixzcGFsdGVuKToiJ0FVVE8nIiksRU5ELAorICAgICAgICAgICAoc2NhbnJ1bj9zcHJpbnRmKAorICAgICAgICAgICAgICAgIlxuRGVyemVpdCBEaXJzY2FuIGluOiAgICAgJXMlcyVzXG4iKworICAgICAgICAgICAgICAgIkFuZ2Vub21tZW5lIFJlc3R6ZWl0OiAgICVzKCVzKSBbRmk6JWQvJWR8RXI6JWR8U2s6JWRdJXNcbiIsCisgICAgICAgICAgICAgICBQUkUsc2NhbmRpcixFTkQsUFJFLAorICAgICAgICAgICAgICAgdGltZTJzdHJpbmcoIiVoOiUwMm06JTAycyIsKHNjYW5ydW4tMSkqNCpUX1BBVVNFKSwKKyAgICAgICAgICAgICAgIChzaXplb2Yoc2NhbmZpbGVzKS1zY2FucnVuKzEpLChzaXplb2Yoc2NhbmZpbGVzKSksCisgICAgICAgICAgICAgICBzY2FuZXJyWzBdLHNjYW5lcnJbMV0sRU5EKToiIikpOworfQorCit2b2lkIGNyZWF0ZSgpCit7CisgICAgaWYgKCFjbG9uZXAoTUUpKQorICAgICAgICByZXR1cm47CisKKyAgICA6OmNyZWF0ZSgpOworCisvLyBBbGxnZW1laW5lIGdsb2JhbGUgVmFyaWFibGVuIGluaXRpYWxpc2llcmVuCisKKyAgICBzY2FudHlwICAgPSBUX1JPQ0hVUzsKKyAgICBzcGFsdGVuICAgPSA0OworICAgIGFsbF9kZXRzICA9IChbXSk7CisgICAgb3V0cHV0ICAgID0gMDsKKworLy8gR2xvYmFsZSBWYXJpYWJsZW4gZnVlciBkZW4gRGlyZWN0b3J5c2NhbiBpbml0aWFsaXNpZXJlbgorCisgICAgc2NhbmRpciAgID0gMDsKKyAgICBzY2FucnVuICAgPSAwOworICAgIHNjYW5maWxlcyA9ICh7fSk7CisgICAgc2NhbmNvdW50ID0gMDsKKyAgICBzY2FucGF1c2UgPSAwOworICAgIHNjYW5lcnIgICA9ICh7MCwwfSk7CisKKy8vIFByb3BlcnRpZXMKKworICAgIFNldFByb3AoUF9TSE9SVCwiRWluIE9iamVrdHBydWVmZXIiKSA7CisgICAgU2V0KFBfTE9ORywjJ3hfbG9uZyxGX1FVRVJZX01FVEhPRCk7CisgICAgU2V0UHJvcChQX05BTUUsIk9iamVrdHBydWVmZXIiKTsKKyAgICBTZXRQcm9wKFBfR0VOREVSLE1BTEUpOworICAgIFNldFByb3AoUF9BVVRPTE9BRE9CSiwxKTsKKyAgICBTZXRQcm9wKFBfVkFMVUUsMCk7CisgICAgU2V0UHJvcChQX1dFSUdIVCwwKTsKKyAgICBTZXRQcm9wKFBfTk9EUk9QLDEpOworICAgIFNldFByb3AoUF9ORVZFUkRST1AsMSk7CisKKyAgICBBZGRJZCggKHsicHJ1ZWZlciIsIm9iamVrdHBydWVmZXIifSkgKTsKKworICAgIEFkZENtZCggIm90ZXN0Iiwic2VhcmNoIiApOworICAgIEFkZENtZCggIm90eXBlIiwic2NhbmFydCIgKTsKKyAgICBBZGRDbWQoICJvY29sbSIsInNwYWx0ZW56YWhsIiApOworICAgIEFkZENtZCggIm90ZGlyIiwiZGlydGVzdGVuIiApOworfQorCit2b2lkIGluaXQoKQoreworICAgIDo6aW5pdCgpOworICAgIGlmIChQTC0+UXVlcnlQcm9wKFBfVEVTVFBMQVlFUikgfHwgSVNfTEVBUk5FUihQTCkpCisgICAgeworICAgICAgICBzY2FudHlwPShQTC0+UXVlcnlQcm9wKFBfT1RFU1RfVFlQKXx8VF9ST0NIVVMpOworICAgICAgICBzcGFsdGVuPShQTC0+UXVlcnlQcm9wKFBfT1RFU1RfU1BMKXx8NCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGZpbmRfY2FsbF9vdXQoInJlbW92ZW4iKSA9PSAtMSkKKyAgICAgIGNhbGxfb3V0KCJyZW1vdmVuIiwwKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICBEaWUgSGlsZnNmdW5rdGlvbmVuIGRlcyBPYmpla3R0ZXN0ZXJzLgorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKK3ZvaWQgT3V0cHV0KHN0cmluZyB0ZXh0KQoreworICAgIGlmICghdGV4dCB8fCAhc3RyaW5ncCh0ZXh0KSkKKyAgICAgICAgcmV0dXJuOworICAgIGlmIChvYmplY3RwKG91dHB1dCkpCisgICAgICAgIG91dHB1dC0+TW9yZSh0ZXh0KTsKKyAgICBlbHNlIGlmIChzdHJpbmdwKG91dHB1dCkpCisgICAgICAgIHdyaXRlX2ZpbGUob3V0cHV0LHRleHQpOworICAgIGVsc2UKKyAgICAgICAgd3JpdGUodGV4dCk7Cit9CisKK2ludCByZW1vdmVuKCkKK3sKKyAgICB3cml0ZSgiRGllc2VzIFRvb2wgaXN0IG51ciBmdWVyIFRlc3RpZXMgdW5kIE1hZ2llciFcbiIpOworICAgIHJlbW92ZSgpOworICAgIHJldHVybiAxOworfQorCitzdHJpbmcgKmdyb3NzKHN0cmluZyBzKQoreworICAgIHJldHVybiByZWdleHAocmVnZXhwbG9kZShzLCJbXkEtWmEtejAtOV0iKSwiXFw8W0EtWl0iKTsKK30KKworc3RyaW5nICpkZXRfYXVzd2VydGVuKHN0cmluZyBpbnB1dCkKK3sgICBzdHJpbmcgKndvcmRzLHN0ciwqcmU7CisgICAgaW50ICAgIGFuZixuLGk7CisKKyAgICBpZiAoc2NhbnR5cD09VF9SSUtVUykKKyAgICAgICAgcmV0dXJuIGdyb3NzKGlucHV0KTsKKworICAgIHJlID0gKHt9KTsKKyAgICBpZiAoIWlucHV0IHx8ICFzdHJpbmdwKGlucHV0KSkKKyAgICAgICAgcmV0dXJuIHJlOworCisgICAgd29yZHM9cmVnZXhwbG9kZShpbnB1dCwiW15BLVphLXowLTldIik7CisgICAgICAgIG49c2l6ZW9mKHdvcmRzKTsKKyAgICBpZiAoIW4pCisgICAgICAgIHJldHVybiByZTsKKworICAgIGFuZj0xOworICAgIGZvciAoaT0wO2k8bjtpKyspCisgICAgeworICAgICAgICBzdHI9d29yZHNbaV07CisgICAgICAgIGlmIChzdHI9PSIiIHx8IHN0cj09IiAiKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChzdHI9PSIuIiB8fCBzdHI9PSI6IiB8fCBzdHI9PSI/IiB8fCBzdHI9PSIhIikKKyAgICAgICAgeworICAgICAgICAgICAgYW5mPTE7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZW9mKHJlZ2V4cCgoe3N0cn0pLCJbXkEtWmEtejAtOV0iKSkpCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgaWYgKHNpemVvZihyZWdleHAoKHtzdHJ9KSwiXFw8WzAtOV0qXFw+IikpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChzdHIhPWNhcGl0YWxpemUoc3RyKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoYW5mKQorICAgICAgICB7CisgICAgICAgICAgICBhbmY9MDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHJlICs9ICh7IHN0ciB9KTsKKyAgICB9CisgICAgcmV0dXJuIHJlOworfQorCit2YXJhcmdzIG1peGVkIHRlc3RfZGV0YWlscyhzdHJpbmcgc3RyLCBzdHJpbmcgZGVmKQoreyAgIHN0cmluZyAqc3Rycyxvc3RyLCpzdHJzMixzdWY7CisgICAgaW50ICAgIGk7CisKKyAgICBpZiAoIXN0ciB8fCAhc3RyaW5ncChzdHIpIHx8ICFtYXBwaW5ncChhbGxfZGV0cykpCisgICAgICAgIHJldHVybiAwOworCisgICAgc3RycyA9ICh7c3RyfSk7CisgICAgb3N0ciA9IHN0cjsKKworICAgIGlmICgoc3VmPXN0cls8MS4uPDFdKT09InMiIHx8IHN1Zj09Im4iIHx8IHN1Zj09ImUiKQorICAgIHsKKyAgICAgICAgb3N0ciAgPSBzdHJbMC4uPDJdOworICAgICAgICBzdHJzICs9ICh7IG9zdHIgfSk7CisgICAgICAgIG9zdHIgKz0gKCIoIitzdWYrIikiKTsKKyAgICB9CisgICAgaWYgKChzdWY9c3RyWzwyLi48MV0pPT0iZXMiIHx8IHN1Zj09ImVuIikKKyAgICB7CisgICAgICAgIG9zdHIgID0gc3RyWzAuLjwzXTsKKyAgICAgICAgc3RycyArPSAoeyBvc3RyIH0pOworICAgICAgICBvc3RyICs9ICgiKCIrc3VmKyIpIik7CisgICAgfQorICAgIGZvciAoIHN0cnMyPSh7fSksaT1zaXplb2Yoc3RycyktMSA7IGk+PTAgOyBpLS0pCisgICAgICAgIGlmIChtZW1iZXIoYWxsX2RldHMsc3Ryc1tpXSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzdHJpbmdwKGRlZikgJiYgYWxsX2RldHNbc3Ryc1tpXV09PWRlZiAmJiBzdHIhPVNFTlNFX0RFRkFVTFQpCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBzdHJzMiArPSAoeyBzdHJzW2ldIH0pOworCX0KKyAgICBpZiAoc2l6ZW9mKHN0cnMyKT4wKQorICAgICAgICByZXR1cm4gc3RyczI7CisgICAgcmV0dXJuIG9zdHI7Cit9CisKK3N0cmluZyAqZXZhbF9kZXRhaWxfZW50cnkobWl4ZWQga2V5KQoreyAgIG1peGVkICByZSxoOworICAgIHN0cmluZyAqcmE7CisgICAgaW50ICAgIGk7CisKKyAgICBpZiAoIWtleSB8fCAhc3RyaW5ncChrZXkpIHx8ICFtYXBwaW5ncChhbGxfZGV0cykgfHwgIW1lbWJlcihhbGxfZGV0cyxrZXkpKQorICAgICAgICByZXR1cm4gKHt9KTsKKworICAgIHJlPWFsbF9kZXRzW2tleV07CisgICAgaWYgKGNsb3N1cmVwKHJlKSkKKyAgICAgICAgcmU9ZnVuY2FsbChyZSxrZXkpOworICAgIGlmIChtYXBwaW5ncChyZSkpCisgICAgeworICAgICAgICByYT1maWx0ZXIobV9pbmRpY2VzKHJlKSwjJ3N0cmluZ3ApOworICAgICAgICBmb3IgKCBoPSh7IHJlWzBdIH0pLGk9c2l6ZW9mKHJhKS0xIDsgaT49MCA7IGktLSApCisgICAgICAgICAgICBpZiAoc3RyaW5ncChyZVtyYVtpXV0pKQorICAgICAgICAgICAgICAgIGggKz0gKHsgcmVbcmFbaV1dIH0pOworICAgICAgICAgICAgZWxzZSBpZiAocG9pbnRlcnAocmVbcmFbaV1dKSkKKyAgICAgICAgICAgICAgICBoICs9IHJlW3JhW2ldXTsKKyAgICAgICAgcmU9aDsKKyAgICB9CisgICAgaWYgKHBvaW50ZXJwKHJlKSkKKyAgICAgICAgcmV0dXJuIGZpbHRlcihyZSwjJ3N0cmluZ3ApOworICAgIGlmIChzdHJpbmdwKHJlKSkKKyAgICAgICAgcmV0dXJuICh7IHJlIH0pOworICAgIHJldHVybiAoe30pOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogIERpZSBGdW5rdGlvbiwgZGllIGRpZSAoU3BlY2lhbClEZXRhaWxzIGltIFJhdW0gdW50ZXJzdWNodC4KKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCitpbnQgc2VhcmNoX2Qob2JqZWN0IHIpCit7ICAgaW50ICAgICBpLGoscm9vbTsKKyAgICBtYXBwaW5nIG07CisgICAgc3RyaW5nICAqcyxzMSwqczIsUFJFLEVORCwqc3BlY2lhbCwqenVmaW5kZW4sKmRldGFpbHMscmUsKnVlYmVyZ2VoZW47CisgICAgbWl4ZWQgICBtaTsKKworICAgIGlmICghciB8fCAhb2JqZWN0cChyKSkKKyAgICB7CisgICAgICAgIHdyaXRlKCJPVEVTVC1FUlJPUjogS2VpbiAoZXhpc3RpZXJlbmRlcykgWmllbG9iamVrdCBnZWZ1bmRlbiFcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKy8vIERpZSBBdXNnYWJlbiBlcmZvbGdlbiB6dW5hZWNoc3QgaW4gZWluZW4gU3RyaW5nLgorCisgICAgcmU9IlxuIjsKKworLy8gSGFuZGVsdCBlcyBzaWNoIHVtIGVpbmVuIFJhdW0/CisKKyAgICByb29tID0gKGZ1bmN0aW9uX2V4aXN0cygiaW50X2xvbmciLHIpID8gMSA6IDAgKTsKKworLy8gVGVybWluYWx0eXAgZGVzIE1hZ2llcnMgZmVzdHN0ZWxsZW4uCisKKyAgICBpZiAob2JqZWN0cChvdXRwdXQpKQorICAgICAgICBzd2l0Y2ggKG91dHB1dC0+UXVlcnlQcm9wKFBfVFRZKSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAiYW5zaSIgIDoKKyAgICAgICAgICAgIGNhc2UgInZ0MTAwIiA6IFBSRT1CT0xEOyBFTkQ9Tk9STUFMOyBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQgICAgICA6IFBSRT0iIjsgICBFTkQ9IiI7ICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFBSRT0iIjsKKyAgICAgICAgRU5EPSIiOworICAgIH0KKworLy8gIExpc3RlIGRlciB6dSB1ZWJlcmdlaGVuZGVuIERldGFpbHMgZXJ6ZXVnZW4uIERpZSB2ZXJ3ZW5kZXRlIE1ldGhvZGUgaGF0IGRlbgorLy8gIFZvcnRlaWwsIGRhc3MgbWFuIG5hY2ggZWluZXIgRXJnYWVuenVuZyBkZXIgTGlzdGUgbmljaHQgZGFzIFRvb2wgbmV1IGxhZGVuCisvLyAgdW5kIGNsb25lbiBtdXNzLiBEYXMgVG9vbCBlcndhcnRldCwgZGllIExpc3RlIERBVEFGSUxFIGltIGdsZWljaGVuCisvLyAgVmVyemVpY2huaXMgenUgZmluZGVuLCBpbiBkZW0gYXVjaCBkYXMgVG9vbCBsaWVndC4KKworICAgIHMxPWltcGxvZGUoZXhwbG9kZShvbGRfZXhwbG9kZShvYmplY3RfbmFtZShNRSksIiMiKVswXSwiLyIpWzAuLjwyXSwiLyIpKyIvIgorICAgICAgIERBVEFGSUxFOworICAgIGlmIChmaWxlX3NpemUoczEpPDEpCisgICAgICAgIHMxPURFRkFVTFRfREFUQTsKKworICAgIHVlYmVyZ2VoZW4gPSByZWdleHAocmVnZXhwbG9kZShyZWFkX2ZpbGUoczEpLCJbXkEtWmEtejAtOV0iKSwiXFw8W2Etel0iKTsKKworLy8gU2F0eiBhbiBEZXRhaWxzLCBkaWUgYXVmIGplZGVuIEZhbGwgdm9yaGFuZGVuIHNlaW4gc29sbHRlbiwgamUgbmFjaGRlbQorLy8gb2IgUF9JTkRPT1JTIGdlc2V0enQgaXN0IG9kZXIgbmljaHQuCisKKyAgICBpZiAocm9vbSAmJiByLT5RdWVyeVByb3AoUF9JTkRPT1JTKSkKKyAgICAgICAgenVmaW5kZW4gPSAoeyJCb2RlbiIsIkRlY2tlIiwiV2FuZCIsIldhZW5kZSIsIlJhdW0ifSk7CisgICAgZWxzZSBpZiAocm9vbSkKKyAgICAgICAgenVmaW5kZW4gPSAoeyJCb2RlbiIsIkhpbW1lbCIsIlNvbm5lIiwiV29sa2UiLCJXb2xrZW4ifSk7CisgICAgZWxzZQorICAgICAgICB6dWZpbmRlbiA9ICh7fSk7CisKKy8vIEFsbGUgdm9yaGFuZGVuZW4gRGV0YWlscyBhbnplaWdlbi4KKworLy8gICAgZGV0YWlscyA9IHNvcnRfYXJyYXkobV9pbmRpY2VzKHItPl9xdWVyeV9kZXRhaWxzKCl8fChbXSkpLCMnPCk7CisgICAgZGV0YWlscyA9IHNvcnRfYXJyYXkobV9pbmRpY2VzKHItPlF1ZXJ5UHJvcChQX0RFVEFJTFMpfHwoW10pKSwjJzwpOworCisgICAgaWYgKHNjYW5ydW48MSkKKyAgICB7CisgICAgICAgIGlmICgoaT1zaXplb2YoZGV0YWlscykpPjApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIHMxPSIiLC0taTsgaT49MCA7IGktLSApCisgICAgICAgICAgICAgICAgczEgKz0gKGRldGFpbHNbaV0rKGk/IlxuIjoiIikpOworCisgICAgICAgICAgICByZSArPSBzcHJpbnRmKHNwcmludGYoIiVzTGlzdGUgZGVyIHZvcmhhbmRlbmVuIERldGFpbHM6JXNcblxuIisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzXG5cbiIsUFJFLEVORCwoIiUtIzc4Iisoc3BhbHRlbjwxPyIiOgorICAgICAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCIuJWQiLHNwYWx0ZW4pKSsicyIpKSxzMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgcmUgKz0gc3ByaW50ZigiJXNLZWluZSBEZXRhaWxzIGdlZnVuZGVuLiVzXG5cbiIsUFJFLEVORCk7CisgICAgfQorCisvLyBBbGxlIHZvcmhhbmRlbmVuIFNwZWNpYWxEZXRhaWxzIGFuemVpZ2VuLgorCisvLyAgICBzcGVjaWFsPXNvcnRfYXJyYXkobV9pbmRpY2VzKHItPl9xdWVyeV9zcGVjaWFsX2RldGFpbHMoKXx8KFtdKSksIyc8KTsKKyAgICBzcGVjaWFsPXNvcnRfYXJyYXkobV9pbmRpY2VzKHItPlF1ZXJ5UHJvcChQX1NQRUNJQUxfREVUQUlMUyl8fChbXSkpLCMnPCk7CisKKyAgICBpZiAoc2NhbnJ1bjwxKQorICAgIHsKKyAgICAgICAgaWYgKChpPXNpemVvZihzcGVjaWFsKSk+MCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICggczE9IiIsLS1pIDsgaT49MCA7IGktLSApCisgICAgICAgICAgICAgICAgczEgKz0gKHNwZWNpYWxbaV0rKGk/IlxuIjoiIikpOworCisgICAgICAgICAgICByZSArPSBzcHJpbnRmKHNwcmludGYoCisgICAgICAgICAgICAgICAgICAgICAgICAgICIlc0xpc3RlIGRlciB2b3JoYW5kZW5lbiBTcGVjaWFsRGV0YWlsczolc1xuXG4iKworICAgICAgICAgICAgICAgICAgICAgICAgICAiJXNcblxuIixQUkUsRU5ELCgiJS0jNzgiKyhzcGFsdGVuPDE/IiI6CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIi4lZCIsc3BhbHRlbikpKyJzIikpLHMxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZSArPSBzcHJpbnRmKCIlc0tlaW5lIFNwZWNpYWxEZXRhaWxzIGdlZnVuZGVuLiVzXG5cbiIsUFJFLEVORCk7CisgICAgfQorCisvLyAgRGllIExpc3RlbiBkZXIgdm9yaGFuZGVuZW4gRGV0YWlscyB1bmQgU3BlY2lhbERldGFpbHMgdmVyZWluaWdlbi4KKworICAgIGRldGFpbHMgKz0gc3BlY2lhbDsKKworLy8gIERldGFpbHMgdW5kIFNwZWNpYWxEZXRhaWxzIGF1c3dlcnRlbiAtIGdhciBuaWNodCBzbyBlaW5mYWNoLgorCisgICAgYWxsX2RldHMgPSByLT5RdWVyeShQX0RFVEFJTFMpOworCisgICAgZm9yICggcz0oe30pLGk9c2l6ZW9mKGRldGFpbHMpLTEgOyBpPj0wIDsgaS0tKQorICAgICAgICBzICs9IGV2YWxfZGV0YWlsX2VudHJ5KGRldGFpbHNbaV0pOworCisgICAgZm9yICggczI9KHt9KSxpPXNpemVvZihzKS0xIDsgaT49MCA7IGktLSApCisgICAgICAgIGlmIChzdHJpbmdwKHNbaV0pKQorICAgICAgICAgICAgaWYgKG1lbWJlcihzMixzW2ldKT09LTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgczIgKz0gKHsgc1tpXSB9KTsKKyAgICAgICAgICAgICAgICB6dWZpbmRlbis9ZGV0X2F1c3dlcnRlbihzW2ldKTsKKyAgICAgICAgICAgIH0KKworLy8gIEdyb3NzZ2VzY2hyaWViZW5lIFdvZXJ0ZXIgYXVzIGRlciBMYW5nYmVzY2hyZWlidW5nIGhpbnp1ZnVlZ2VuLgorCisgICAgaWYgKGZ1bmN0aW9uX2V4aXN0cygiaW50X2xvbmciLHIpKQorICAgICAgICB6dWZpbmRlbiArPSBkZXRfYXVzd2VydGVuKAorICAgICAgICAgICAgb2xkX2V4cGxvZGUoci0+aW50X2xvbmcobWFzdGVyLG1hc3RlciksIkVzIGdpYnQgIilbMF0pOworICAgIGVsc2UKKyAgICAgICAgenVmaW5kZW4gKz0gZGV0X2F1c3dlcnRlbihvbGRfZXhwbG9kZShyLT5sb25nKCksImVudGhhZWx0OiIpWzBdKTsKKworLy8gRG9wcGVsdGUgRWludHJhZWdlIGVsaW1pbmllcmVuLgorCisgICAgZm9yICggczI9KHt9KSwgaT1zaXplb2YoenVmaW5kZW4pLTEgOyBpPj0wIDsgaS0tKQorICAgICAgICBpZiAobWVtYmVyKHMyLHp1ZmluZGVuW2ldKT09LTEpCisgICAgICAgICAgICBzMiArPSAoeyB6dWZpbmRlbltpXSB9KTsKKworLy8gQWxsZXMga2xlaW4gbWFjaGVuLgorCisgICAgenVmaW5kZW49bWFwKHMyLCMnbG93ZXJfY2FzZSk7CisKKy8vIEJlaSBOUENzL09iamVrdGVuIGRpZSBJRHMgcmF1c2ZpbHRlcm4uCisKKyAgICBpZiAoIXJvb20pCisgICAgICAgIHp1ZmluZGVuIC09IHItPlF1ZXJ5UHJvcChQX0lEUyk7CisKKy8vIERpZSB6dSB1ZWJlcmdlaGVuZGVuIERldGFpbHMgcmF1c2ZpbHRlcm4uCisKKyAgICB6dWZpbmRlbj1maWx0ZXIoKHp1ZmluZGVuLXVlYmVyZ2VoZW4pLCMnc3RyaW5ncCk7CisKKy8vIFNjaGF1ZW4sIHdlbGNoZSBEZXRhaWxzIGZlaGxlbiB1bmQgZGllc2UgQXVzZ2ViZW4uCisKKyAgICBmb3IgKCBzPSh7fSksczI9KHt9KSxpPXNpemVvZih6dWZpbmRlbiktMTtpPj0wO2ktLSkKKyAgICB7CisgICAgICAgIGlmICghKG1pPXRlc3RfZGV0YWlscyh6dWZpbmRlbltpXSkpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIGlmIChwb2ludGVycChtaSkpCisgICAgICAgIHsKKyAgICAgICAgICAgZm9yIChqPXNpemVvZihtaSktMSA7IGo+PTAgOyBqLS0pCisgICAgICAgICAgICAgICBpZiAobWVtYmVyKHMsbWlbal0pPT0tMSkKKyAgICAgICAgICAgICAgICAgICBzICs9ICh7IG1pW2pdIH0pOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHN0cmluZ3AobWkpICYmIG1lbWJlcihzMixtaSk9PS0xKQorICAgICAgICAgICAgczIgKz0gKHsgbWkgfSk7CisgICAgfQorCisgICAgcyAgPSBzb3J0X2FycmF5KHMsICMnPCk7CisgICAgczIgPSBzb3J0X2FycmF5KHMyLCMnPCk7CisKKyAgICBpZiAoc2NhbnJ1bjwxKQorICAgIHsKKyAgICAgICAgaWYgKChpPXNpemVvZihzKSk+MCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yICggczE9IiIsLS1pIDsgaT49MCA7IGktLSApCisgICAgICAgICAgICAgICAgczEgKz0gKHNbaV0rKGk/IlxuIjoiIikpOworCisgICAgICAgICAgICByZSArPSBzcHJpbnRmKHNwcmludGYoIiVzTGlzdGUgZGVyIGdlZnVuZGVuZW4gRGV0YWlsczolc1xuXG4iKworICAgICAgICAgICAgICAgICAgICAgICAgICAiJXNcblxuIixQUkUsRU5ELCgiJS0jNzgiKyhzcGFsdGVuPDE/IiI6CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNwcmludGYoIi4lZCIsc3BhbHRlbikpKyJzIikpLHMxKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICByZSArPSBzcHJpbnRmKCIlc0VzIGdpYnQga2VpbmUgRGV0YWlscy4lc1xuXG4iLFBSRSxFTkQpOworICAgIH0KKworICAgIGlmICgoaT1zaXplb2YoczIpKT4wKQorICAgIHsKKyAgICAgICAgZm9yICggczE9IiIsLS1pIDsgaT49MCA7IGktLSApCisgICAgICAgICAgIHMxICs9IChzMltpXSsoaT8iXG4iOiIiKSk7CisKKyAgICAgICAgcmUgKz0gc3ByaW50ZihzcHJpbnRmKCIlc0xpc3RlIGRlciBmZWhsZW5kZW4gRGV0YWlsczolc1xuXG4iKworICAgICAgICAgICAgICAgICAgICAgICIlc1xuXG4iLFBSRSxFTkQsKCIlLSM3OCIrKHNwYWx0ZW48MT8iIjoKKyAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCIuJWQiLHNwYWx0ZW4pKSsicyIpKSxzMSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmUgKz0gc3ByaW50ZigiJXNFcyBmZWhsZW4ga2VpbmUgRGV0YWlscy4lc1xuXG4iLFBSRSxFTkQpOworCisgICAgaWYgKHNjYW5ydW48MSkKKyAgICAgICAgcmUgKz0gc3ByaW50ZigiJXNGRVJUSUcuJXNcbiIsUFJFLEVORCk7CisKKy8vIERpZSBlaWdlbnRsaWNoZSBUZXh0YXVzZ2FiZS4KKworICAgIE91dHB1dChyZSk7CisKKyAgICByZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICBIYXVwdGZ1bmt0aW9uIGZ1ZXIgZGFzIFRlc3RlbiB2b24gR2VyYWV1c2NoZW4gdW5kIEdlcnVlY2hlbi4KKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCitpbnQgc2VhcmNoX3NlbnNlKG9iamVjdCByLCBpbnQgc2Vuc2UpCit7ICAgc3RyaW5nIHJlLFBSRSxFTkQsV0FTLCpzZW5zZXMsczEsKnp1ZmluZGVuLCpzMiwqczMsZGVmOworICAgIGludCAgICBpLGo7CisgICAgbWl4ZWQgIG1pOworCisgICAgaWYgKCFyIHx8ICFvYmplY3RwKHIpKQorICAgIHsKKyAgICAgICAgd3JpdGUoIk9URVNULUVSUk9SOiBLZWluIChleGlzdGllcmVuZGVzKSBaaWVsb2JqZWt0IGdlZnVuZGVuIVxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBpZiAoc2Vuc2U9PVNFTlNFX1NNRUxMKQorICAgIHsKKyAgICAgICAgYWxsX2RldHM9ci0+UXVlcnkoUF9TTUVMTFMpfHwoW10pOworICAgICAgICBXQVM9IkdlcnVlY2hlIjsKKyAgICB9CisgICAgZWxzZSBpZiAoc2Vuc2U9PVNFTlNFX1NPVU5EKQorICAgIHsKKyAgICAgICAgYWxsX2RldHM9ci0+UXVlcnkoUF9TT1VORFMpfHwoW10pOworICAgICAgICBXQVM9IkdlcmFldXNjaGUiOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICB3cml0ZSgiT1RFU1QtRVJST1I6IElsbGVnYWxlciBzZW5zZS1XZXJ0IGluIHNlYXJjaF9zZW5zZSgpXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgcmUgPSAiXG4iOworCisgICAgenVmaW5kZW4gPSAoe1NFTlNFX0RFRkFVTFR9KTsKKworICAgIGRlZiA9IGFsbF9kZXRzW1NFTlNFX0RFRkFVTFRdOworCisvLyBUZXJtaW5hbHR5cCBkZXMgTWFnaWVycyBmZXN0c3RlbGxlbi4KKworICAgIGlmIChvYmplY3RwKG91dHB1dCkpCisgICAgICAgIHN3aXRjaCAob3V0cHV0LT5RdWVyeVByb3AoUF9UVFkpKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlICJhbnNpIiAgOgorICAgICAgICAgICAgY2FzZSAidnQxMDAiIDogUFJFPUJPTEQ7IEVORD1OT1JNQUw7IGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdCAgICAgIDogUFJFPSIiOyAgIEVORD0iIjsgICAgIGJyZWFrOworICAgICAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgUFJFPSIiOworICAgICAgICBFTkQ9IiI7CisgICAgfQorCisgICAgc2Vuc2VzID0gc29ydF9hcnJheShtX2luZGljZXMoYWxsX2RldHMpLCMnPCk7CisKKy8vIEFsbGUgdm9yaGFuZGVuZW4gU2Vuc2UtRGV0YWlscyBhbnplaWdlbi4KKworICAgIGlmIChzY2FucnVuPDEpCisgICAgeworICAgICAgICBpZiAoKGk9c2l6ZW9mKHNlbnNlcykpPjApCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoIHMxPSIiLC0taTsgaT49MCA7IGktLSApCisgICAgICAgICAgICAgICAgczEgKz0gKChzZW5zZXNbaV09PVNFTlNFX0RFRkFVTFQ/IkRFRkFVTFQiOgorICAgICAgICAgICAgICAgICAgICAgICAgc2Vuc2VzW2ldKSsoaT8iXG4iOiIiKSk7CisKKyAgICAgICAgICAgIHJlICs9IHNwcmludGYoc3ByaW50ZigiJXNMaXN0ZSBkZXIgdm9yaGFuZGVuZW4gJXM6JXNcblxuIisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzXG5cbiIsUFJFLFdBUyxFTkQsKCIlLSM3OCIrKHNwYWx0ZW48MT8iIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigiLiVkIixzcGFsdGVuKSkrInMiKSksczEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlICs9IHNwcmludGYoIiVzS2VpbmUgJXMgZ2VmdW5kZW4uJXNcblxuIixQUkUsV0FTLEVORCk7CisgICAgfQorCisKKy8vICBTZW5zZS1EZXRhaWxzIGF1c3dlcnRlbiAtIGdlaHQgd2llIGJlaSBEZXRhaWxzLgorCisgICAgZm9yICggczI9KHt9KSxpPXNpemVvZihzZW5zZXMpLTEgOyBpPj0wIDsgaS0tKQorICAgICAgICBzMiArPSBldmFsX2RldGFpbF9lbnRyeShzZW5zZXNbaV0pOworCisgICAgZm9yICggczM9KHt9KSxpPXNpemVvZihzMiktMSA7IGk+PTAgOyBpLS0gKQorICAgICAgICBpZiAoc3RyaW5ncChzMltpXSkpCisgICAgICAgICAgICBpZiAobWVtYmVyKHMzLHMyW2ldKT09LTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgczMgKz0gKHsgczJbaV0gfSk7CisgICAgICAgICAgICAgICAgenVmaW5kZW4rPWRldF9hdXN3ZXJ0ZW4oczJbaV0pOworICAgICAgICAgICAgfQorCisvLyBUZXN0ZW4sIHdlbGNoZSBTZW5zZS1EZXRhaWxzIGZlaGxlbiB1bmQgYW56ZWlnZW4KKworICAgIGZvciAoIHMyPSh7fSksczM9KHt9KSxpPXNpemVvZih6dWZpbmRlbiktMTtpPj0wO2ktLSkKKyAgICB7CisgICAgICAgIGlmICghKG1pPXRlc3RfZGV0YWlscyh6dWZpbmRlbltpXSxkZWYpKSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAocG9pbnRlcnAobWkpKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKGo9c2l6ZW9mKG1pKS0xIDsgaj49MCA7IGotLSkKKyAgICAgICAgICAgICAgICBpZiAobWVtYmVyKHMyLG1pW2pdKT09LTEpCisgICAgICAgICAgICAgICAgICAgIHMyICs9ICh7IG1pW2pdIH0pOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHN0cmluZ3AobWkpICYmIG1lbWJlcihzMyxtaSk9PS0xKQorICAgICAgICAgICAgczMgKz0gKHsgbWkgfSk7CisgICAgfQorICAgIHMyID0gc29ydF9hcnJheShzMiwjJzwpOworICAgIHMzID0gc29ydF9hcnJheShzMywjJzwpOworCisgICAgaWYgKHNjYW5ydW48MSkKKyAgICB7CisgICAgICAgIGlmICgoaT1zaXplb2YoczIpKT4wKQorICAgICAgICB7CisgICAgICAgICAgICBmb3IgKCBzMT0iIiwtLWkgOyBpPj0wIDsgaS0tICkKKyAgICAgICAgICAgICAgICBzMSArPSAoKHMyW2ldPT1TRU5TRV9ERUZBVUxUPyJERUZBVUxUIjpzMltpXSkrKGk/IlxuIjoiIikpOworCisgICAgICAgICAgICByZSArPSBzcHJpbnRmKHNwcmludGYoIiVzTGlzdGUgZGVyIGdlZnVuZGVuZW4gJXM6JXNcblxuIisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzXG5cbiIsUFJFLFdBUyxFTkQsKCIlLSM3OCIrKHNwYWx0ZW48MT8iIjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZigiLiVkIixzcGFsdGVuKSkrInMiKSksczEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJlICs9IHNwcmludGYoIiVzRXMgZ2lidCBrZWluZSAlcy4lc1xuXG4iLFBSRSxXQVMsRU5EKTsKKyAgICB9CisKKyAgICBpZiAoKGk9c2l6ZW9mKHMzKSk+MCkKKyAgICB7CisgICAgICAgIGZvciAoIHMxPSIiLC0taSA7IGk+PTAgOyBpLS0gKQorICAgICAgICAgICBzMSArPSAoKHMzW2ldPT1TRU5TRV9ERUZBVUxUPyJERUZBVUxUIjpzM1tpXSkrKGk/IlxuIjoiIikpOworCisgICAgICAgIHJlICs9IHNwcmludGYoc3ByaW50ZigiJXNMaXN0ZSBkZXIgZmVobGVuZGVuICVzOiVzXG5cbiIrCisgICAgICAgICAgICAgICAgICAgICAgIiVzXG5cbiIsUFJFLFdBUyxFTkQsKCIlLSM3OCIrKHNwYWx0ZW48MT8iIjoKKyAgICAgICAgICAgICAgICAgICAgICBzcHJpbnRmKCIuJWQiLHNwYWx0ZW4pKSsicyIpKSxzMSk7CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgcmUgKz0gc3ByaW50ZigiJXNFcyBmZWhsZW4ga2VpbmUgJXMuJXNcblxuIixQUkUsV0FTLEVORCk7CisKKyAgICBpZiAoc2NhbnJ1bjwxKQorICAgICAgICByZSArPSBzcHJpbnRmKCIlc0ZFUlRJRy4lc1xuIixQUkUsRU5EKTsKKworLy8gRGllIGVpZ2VudGxpY2hlIFRleHRhdXNnYWJlLgorCisgICAgT3V0cHV0KHJlKTsKKworICAgIHJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogIERpZSBGdW5rdGlvbiwgZGllIGRpZSBHZXJhZXVzY2hlIGltIFJhdW0gdW50ZXJzdWNodC4KKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCitpbnQgc2VhcmNoX24ob2JqZWN0IHIpCit7CisgICAgaWYgKCFyIHx8ICFvYmplY3RwKHIpKQorICAgIHsKKyAgICAgICAgd3JpdGUoIk9URVNULUVSUk9SOiBLZWluIChleGlzdGllcmVuZGVzKSBaaWVsb2JqZWt0IGdlZnVuZGVuIVxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiBzZWFyY2hfc2Vuc2UocixTRU5TRV9TT1VORCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgRGllIEZ1bmt0aW9uLCBkaWUgZGllIEdlcnVlY2hlIGltIFJhdW0gdW50ZXJzdWNodC4KKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCitpbnQgc2VhcmNoX20ob2JqZWN0IHIpCit7CisgICAgaWYgKCFyIHx8ICFvYmplY3RwKHIpKQorICAgIHsKKyAgICAgICAgd3JpdGUoIk9URVNULUVSUk9SOiBLZWluIChleGlzdGllcmVuZGVzKSBaaWVsb2JqZWt0IGdlZnVuZGVuIVxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiBzZWFyY2hfc2Vuc2UocixTRU5TRV9TTUVMTCk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgRGllIEZ1bmt0aW9uLCBkaWUgZGFzIGVpbmdlZ2ViZW5lIEtvbW1hbmRvIHplcmxlZ3QgdW5kIGludGVycHJldGllcnQuCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworaW50IHNlYXJjaChzdHJpbmcgYXJnKQoreyAgIHN0cmluZyAqaW4sZHVtOworICAgIG9iamVjdCB0YXJnOworICAgIGludCAgICB3bzsKKworICAgIGlmICghKFBMLT5RdWVyeVByb3AoUF9URVNUUExBWUVSKSkgJiYgIUlTX0xFQVJORVIoUEwpKQorICAgICAgICByZXR1cm4gcmVtb3ZlbigpOworCisgICAgaWYgKHNjYW5ydW4pCisgICAgeworICAgICAgICB3cml0ZSgiRGVyemVpdCB3aXJkIGVpbiBWZXJ6ZWljaG5pcyBnZXNjYW5uZWQuIEJpdHRlIHdhcnRlbi5cbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBub3RpZnlfZmFpbCgiT1RFU1QtU3ludGF4OiBvdGVzdCBbZGV0YWlsfHNtZWxsfHNvdW5kXSAiKworICAgICAgICAgICAgICAgICAiezxvYmpla3Q+W2luIG1pcnxpbSByYXVtXXxoaWVyfVxuIik7CisKKyAgICBpZiAoIWFyZyB8fCAhc3RyaW5ncChhcmcpIHx8IHNpemVvZihpbj1vbGRfZXhwbG9kZShhcmcsIiAiKSk8MSkKKyAgICB7CisgICAgICAgIG91dHB1dD1QTDsKKyAgICAgICAgc2NhbnJ1bj0wOworICAgICAgICBtYXN0ZXI9UEw7CisgICAgICAgIHJldHVybiBzZWFyY2hfZChlbnZpcm9ubWVudChQTCkpOworICAgIH0KKworICAgIGlmIChzaXplb2YoaW4pPjEpCisgICAgeworICAgICAgICBhcmc9aW1wbG9kZShpblsxLi5dLCIgIik7CisgICAgICAgIGlmIChtZW1iZXIoKHsiaGllciIsInJhdW0iLCIifSksYXJnKSE9LTEpCisgICAgICAgICAgICB0YXJnPWVudmlyb25tZW50KFBMKTsKKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoc3NjYW5mKGFyZywiJXMgaW4gbWlyIixkdW0pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdvPTE7CisgICAgICAgICAgICAgICAgYXJnPWR1bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHNzY2FuZihhcmcsIiVzIGltIHJhdW0iLGR1bSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgd289LTE7CisgICAgICAgICAgICAgICAgYXJnPWR1bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2Ugd289MDsKKyAgICAgICAgICAgIGlmICh3byE9LTEpCisgICAgICAgICAgICAgICAgdGFyZz1wcmVzZW50KGFyZyxQTCk7CisgICAgICAgICAgICBpZiAoIW9iamVjdHAodGFyZykgJiYgd28hPTEpCisgICAgICAgICAgICAgICAgdGFyZz1wcmVzZW50KGFyZyxlbnZpcm9ubWVudChQTCkpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICAgICAgdGFyZz1lbnZpcm9ubWVudChQTCk7CisgICAgaWYgKCFvYmplY3RwKHRhcmcpKQorICAgIHsKKyAgICAgICAgd3JpdGUoIk9URVNULUVSUk9SOiBHZXd1ZW5zY2h0ZXMgWmllbCBuaWNodCBnZWZ1bmRlbi5cbiIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBvdXRwdXQ9UEw7CisgICAgc2NhbnJ1bj0wOworICAgIG1hc3Rlcj1QTDsKKworICAgIHN3aXRjaChpblswXSkKKyAgICB7CisgICAgICAgIGNhc2UgImRlIiA6CisgICAgICAgIGNhc2UgImRldGFpbCIgOgorICAgICAgICBjYXNlICJkZXRhaWxzIiA6CisgICAgICAgICAgICByZXR1cm4gc2VhcmNoX2QodGFyZyk7CisgICAgICAgIGNhc2UgInNtIiA6CisgICAgICAgIGNhc2UgInNtZWxsIiA6CisgICAgICAgIGNhc2UgInNtZWxscyIgOgorICAgICAgICAgICAgcmV0dXJuIHNlYXJjaF9tKHRhcmcpOworICAgICAgICBjYXNlICJzbyIgOgorICAgICAgICBjYXNlICJzb3VuZCIgOgorICAgICAgICBjYXNlICJzb3VuZHMiIDoKKyAgICAgICAgICAgIHJldHVybiBzZWFyY2hfbih0YXJnKTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyoqCisqKiAgSGllciBrYW5uIG1hbiBkZW4gJ1NjYW50eXAnIGVpbnN0ZWxsZW4uCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworaW50IHNjYW5hcnQoc3RyaW5nIGFyZykKK3sgICBpbnQgaDsKKworICAgIGlmICghKFBMLT5RdWVyeVByb3AoUF9URVNUUExBWUVSKSkgJiYgIUlTX0xFQVJORVIoUEwpKQorICAgICAgICByZXR1cm4gcmVtb3ZlbigpOworCisgICAgaWYgKHNjYW5ydW4pCisgICAgeworICAgICAgICB3cml0ZSgiRGVyemVpdCB3aXJkIGVpbiBWZXJ6ZWljaG5pcyBnZXNjYW5uZWQuIEJpdHRlIHdhcnRlbi5cbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBub3RpZnlfZmFpbCgiT1RFU1QtU3ludGF4OiBvdHlwZSBbcmlrdXN8cm9jaHVzXVxuIik7CisgICAgaWYgKCFhcmcgfHwgIXN0cmluZ3AoYXJnKSkKKyAgICB7CisgICAgICAgIGlmIChoPVBMLT5RdWVyeVByb3AoUF9PVEVTVF9UWVApKQorICAgICAgICAgICAgc2NhbnR5cD1oOworICAgICAgICBpZiAoIWgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBMLT5TZXRQcm9wKFBfT1RFU1RfVFlQLHNjYW50eXApOworICAgICAgICAgICAgUEwtPlNldChQX09URVNUX1RZUCxTQVZFLEZfTU9ERV9BUyk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJPVEVTVDogRWluZ2VzdGVsbHRlciBTY2FudHlwIGlzdCAnJXMnXG4iLAorICAgICAgICAgICAgKHNjYW50eXA9PVRfUk9DSFVTPyJST0NIVVMiOiJSSUtVUyIpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChtZW1iZXIoKHsicmlrdXMiLCJyb2NodXMifSksYXJnKT09LTEpCisgICAgICAgIHJldHVybiAwOworICAgIGlmIChhcmc9PSJyb2NodXMiKQorICAgIHsKKyAgICAgICAgc2NhbnR5cD1UX1JPQ0hVUzsKKyAgICAgICAgUEwtPlNldFByb3AoUF9PVEVTVF9UWVAsc2NhbnR5cCk7CisgICAgICAgIFBMLT5TZXQoUF9PVEVTVF9UWVAsU0FWRSxGX01PREVfQVMpOworICAgICAgICB3cml0ZSgiT1RFU1Q6IEVpbmdlc3RlbGx0ZXIgU2NhbnR5cCBpc3QgJ1JPQ0hVUydcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgc2NhbnR5cD1UX1JJS1VTOworICAgIFBMLT5TZXRQcm9wKFBfT1RFU1RfVFlQLHNjYW50eXApOworICAgIFBMLT5TZXQoUF9PVEVTVF9UWVAsU0FWRSxGX01PREVfQVMpOworICAgIHdyaXRlKCJPVEVTVDogRWluZ2VzdGVsbHRlciBTY2FudHlwIGlzdCAnUklLVVMnXG4iKTsKKyAgICByZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICBIaWVyIGthbm4gbWFuIGRpZSBTcGFsdGVuemFobCBlaW5zdGVsbGVuLgorKioKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyovCisKK2ludCBzcGFsdGVuemFobChzdHJpbmcgYXJnKQoreyAgIGludCBoOworCisgICAgaWYgKCEoUEwtPlF1ZXJ5UHJvcChQX1RFU1RQTEFZRVIpKSAmJiAhSVNfTEVBUk5FUihQTCkpCisgICAgICAgIHJldHVybiByZW1vdmVuKCk7CisKKyAgICBpZiAoc2NhbnJ1bikKKyAgICB7CisgICAgICAgIHdyaXRlKCJEZXJ6ZWl0IHdpcmQgZWluIFZlcnplaWNobmlzIGdlc2Nhbm5lZC4gQml0dGUgd2FydGVuLlxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIG5vdGlmeV9mYWlsKCJPVEVTVC1TeW50YXg6IG9jb2xtIFsxfDJ8M3w0fDV8Nnw3fDh8YXV0b11cbiIpOworCisgICAgaWYgKCFhcmcgfHwgIXN0cmluZ3AoYXJnKSkKKyAgICB7CisgICAgICAgIGlmIChoPVBMLT5RdWVyeVByb3AoUF9PVEVTVF9TUEwpKQorICAgICAgICAgICAgc3BhbHRlbj1oOworICAgICAgICBpZiAoIWgpCisgICAgICAgIHsKKyAgICAgICAgICAgIFBMLT5TZXRQcm9wKFBfT1RFU1RfU1BMLHNwYWx0ZW4pOworICAgICAgICAgICAgUEwtPlNldChQX09URVNUX1NQTCxTQVZFLEZfTU9ERV9BUyk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRmKCJPVEVTVDogRWluZ2VzdGVsbHRlIFNwYWx0ZW56YWhsIGlzdCAnJXMnXG4iLAorICAgICAgICAgICAgKHNwYWx0ZW4+MD9zcHJpbnRmKCIlZCIsc3BhbHRlbik6IidBVVRPJyIpKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmIChhcmc9PSJhdXRvIikKKyAgICB7CisgICAgICAgIHNwYWx0ZW49LTE7CisgICAgICAgIFBMLT5TZXRQcm9wKFBfT1RFU1RfU1BMLHNwYWx0ZW4pOworICAgICAgICBQTC0+U2V0KFBfT1RFU1RfU1BMLFNBVkUsRl9NT0RFX0FTKTsKKyAgICAgICAgd3JpdGUoIk9URVNUOiBFaW5nZXN0ZWxsdGUgU3BhbHRlbnphaGwgaXN0ICdBVVRPJ1xuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBoID0gdG9faW50KGFyZyk7CisgICAgaWYgKGg8MSB8fCBoPjgpCisgICAgICAgIHJldHVybiAwOworICAgIHNwYWx0ZW49aDsKKyAgICBQTC0+U2V0UHJvcChQX09URVNUX1NQTCxzcGFsdGVuKTsKKyAgICBQTC0+U2V0KFBfT1RFU1RfU1BMLFNBVkUsRl9NT0RFX0FTKTsKKyAgICBwcmludGYoIk9URVNUOiBFaW5nZXN0ZWxsdGUgU3BhbHRlbnphaGwgaXN0ICVkXG4iLHNwYWx0ZW4pOworICAgIHJldHVybiAxOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqKgorKiogIEhpZXIga2FubiBtYW4gZ2FuemUgVmVyemVpY2huaXNzZSBkdXJjaHNjYW5uZW4gbGFzc2VuCisqKgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKi8KKworaW50IGRpcnRlc3RlbihzdHJpbmcgYXJnKQoreyAgIHN0cmluZyB2eixhZix1LCpkaXI7CisgICAgaW50ICAgIGksc2k7CisKKyAgICBpZiAoIShQTC0+UXVlcnlQcm9wKFBfVEVTVFBMQVlFUikpICYmICFJU19MRUFSTkVSKFBMKSkKKyAgICAgICAgcmV0dXJuIHJlbW92ZW4oKTsKKworICAgIGlmIChzY2FucnVuKQorICAgIHsKKyAgICAgICAgd3JpdGUoIkRlcnplaXQgd2lyZCBlaW4gVmVyemVpY2huaXMgZ2VzY2FubmVkLiBCaXR0ZSB3YXJ0ZW4uXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgaWYgKG9iamVjdF9uYW1lKE1FKVswLi4yXT09Ii9wLyIpCisgICAgeworICAgICAgICB3cml0ZShicmVha19zdHJpbmcoIkVpbiBEaXJzY2FuIGthbm4gbnVyIGR1cmNoZ2VmdWVocnQgd2VyZGVuLCAiKworICAgICAgICAgICAgICAid2VubiBtYW4gZGVuIFBydWVmZXIgaW4gc2VpbiAvcGxheWVycy8tVmVyemVpY2huaXMga29waWVydCAiKworICAgICAgICAgICAgICAiaGF0IG9kZXIgdm9uIGVpbmVtIGRvcnQgbGllZ2VuZGVuIE9iamVrdCBpbmhlcml0ZWQuIiw3OCwKKyAgICAgICAgICAgICAgIk9URVNUOiAiKSk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIG5vdGlmeV9mYWlsKCJPVEVTVC1TeW50YXg6IG90ZGlyIDx2ZXJ6ZWljaG5pcz4gPGF1c2dhYmVmaWxlPlxuIik7CisgICAgaWYgKCFhcmcgfHwgIXN0cmluZ3AoYXJnKSB8fCBzc2NhbmYoYXJnLCIlcyAlcyIsdnosYWYpIT0yKQorICAgICAgICByZXR1cm4gMDsKKworLy8gWmllbGZpbGVuYW1lIHRlc3Rlbi9mZXN0bGVnZW4uCisKKyAgICB1PWdldHVpZChQTCk7CisgICAgaWYgKGZpbGVfc2l6ZSgiL2xvZy8iK3UrIi8iKSE9LTIpCisgICAgeworICAgICAgICBwcmludGYoIk9URVNUOiBFcyBleGlzdGllcnQga2VpbiBWZXJ6ZWljaG5pcyAnL2xvZy8lcy8nXG4iLHUpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgZm9yIChpPXNpemVvZihhZiktMTtpPj0wO2ktLSkKKyAgICAgICAgaWYgKCgoc2k9YWZbaV0pPDQ4ICYmIHNpIT00NikgfHwgKHNpPjU3ICYmIHNpPDY1KSB8fCBzaT4xMjIgfHwKKyAgICAgICAgICAgIChzaT45MCAmJiBzaTw5NykpCisgICAgICAgIHsKKyAgICAgICAgICAgIHdyaXRlKCJPVEVTVDogSWxsZWdhbGVyIEZpbGVuYW1lIGZ1ZXIgQXVzZ2FiZWZpbGUuXG4iKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgdT1zcHJpbnRmKCIvbG9nLyVzLyVzIix1LGFmKTsKKworLy8gWnUgdW50ZXJzdWNoZW5kZXMgVmVyemVpY2huaXMgcHJ1ZWZlbi9laW5sZXNlbi4KKworICAgIGlmICghdnogfHwgIXN0cmluZ3AodnopIHx8IHNpemVvZih2eik8MyB8fCB2elswXSE9Jy8nIHx8IHZ6WzwxXSE9Jy8nKQorICAgIHsKKyAgICAgICAgd3JpdGUoIk9URVNUOiBWZXJ6ZWljaG5pc25hbWUgbXVzcyBtaXQgJy8nIGJlZ2lubmVuIHVuZCBhdWZob2VyZW4uXG4iKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGZvciAoaT1zaXplb2YoYWYpLTE7aT49MDtpLS0pCisgICAgICAgIGlmICgoKHNpPWFmW2ldKTw0NikgfHwgKHNpPjU3ICYmIHNpPDY1KSB8fCBzaT4xMjIgfHwgKHNpPjkwICYmIHNpPDk3KSkKKyAgICAgICAgeworICAgICAgICAgICAgd3JpdGUoIk9URVNUOiBJbGxlZ2FsZXIgRmlsZW5hbWUgZnVlciBWZXJ6ZWljaG5pcy5cbiIpOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICBkaXIgPSBnZXRfZGlyKHZ6KyIqLmMiKTsKKyAgICBpZiAoKHNpPXNpemVvZihkaXIpKTwxKQorICAgIHsKKyAgICAgICAgd3JpdGUoIk9URVNUOiBEYXMgZ2V3dWVuc2NodGUgVmVyemVpY2huaXMgZXhpc3RpZXJ0IG5pY2h0IG9kZXIgaXN0ICIrCisgICAgICAgICAgICAgICJsZWVyLlxuIik7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIG91dHB1dCAgICA9IHU7CisKKyAgICBpZiAoc3RyaW5ncChjYXRjaAorICAgICAgICAgIChpPXdyaXRlX2ZpbGUob3V0cHV0LCBzcHJpbnRmKCJUZXN0c3RhcnQ6ICVzXG5cbiIsZHRpbWUodGltZSgpKSkpKSkKKyAgICAgICAgJiYgaSE9MSkKKyAgICB7CisgICAgICAgIHdyaXRlKGJyZWFrX3N0cmluZygKKyAgICAgICAgICAgIHNwcmludGYoIkZlaGxlciBiZWltIFNjaHJlaWJlbiBpbiBkYXMgRmlsZSAlczpcbiVzQWJvcnRpbmcuIiwKKyAgICAgICAgICAgICAgICBvdXRwdXQsdSksNzgsIk9URVNUOiAiLDEpKTsKKyAgICAgICAgb3V0cHV0ID0gMDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgc2NhbnJ1biAgID0gc2krMTsKKyAgICBzY2FuZmlsZXMgPSBkaXI7CisgICAgc2NhbmRpciAgID0gdno7CisgICAgc2NhbmNvdW50ID0gMDsKKyAgICBtYXN0ZXIgICAgPSBQTDsKKyAgICBzY2FuZXJyICAgPSAoezAsMH0pOworCisgICAgY2FsbF9vdXQoInhfaGVhcnRfYmVhdCIsVF9QQVVTRSk7CisKKyAgICBwcmludGYoIk9URVNUOiBTY2FubmUgJWQgRmlsZXM6XG4iKworICAgICAgICAgICAiICAgICAgICVzID0+ICVzXG4iKworICAgICAgICAgICAiWmVpdDogIGV0d2EgJXNcbiIsc2ksdnosb3V0cHV0LAorICAgICAgICAgICAgICAgdGltZTJzdHJpbmcoIiVoOiUwMm06JTAycyIsc2kqNCpUX1BBVVNFKSk7CisKKyAgICByZXR1cm4gMTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorKioKKyoqICBEYXMgU2Nhbm5lbiB2b24gVmVyemVpY2huaXNzZW4gd2lyZCB1ZWJlciB4X2hlYXJ0X2JlYXQoKSBlcmxlZGlndC4KKyoqCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisqLworCit2b2lkIHhfaGVhcnRfYmVhdCgpCit7ICAgaW50ICAgIG5yOworICAgIHN0cmluZyBmbixlcjsKKworICAgIGNhbGxfb3V0KCJ4X2hlYXJ0X2JlYXQiLFRfUEFVU0UpOworCisgICAgaWYgKCgrK3NjYW5jb3VudCk+NCkKKyAgICB7CisgICAgICAgIHNjYW5jb3VudCA9IDE7CisgICAgICAgIHRlc3RvYiAgICA9IDA7CisgICAgICAgIHNjYW5ydW4tLTsKKyAgICB9CisKKyAgICBucj1zY2FucnVuLTI7CisgICAgaWYgKG5yPDApCisgICAgeworICAgICAgICBpZiAoZW52aXJvbm1lbnQoKSAmJiBpbnRlcmFjdGl2ZShlbnZpcm9ubWVudCgpKSkKKyAgICAgICAgICAgIGVudmlyb25tZW50KCktPk1lc3NhZ2UoYnJlYWtfc3RyaW5nKCInb3RkaXInIGJlZW5kZXQuXG4iKworICAgICAgICAgICAgICAgIHNwcmludGYoIkZpbGVzOiAlZCAtIEZlaGxlcjogJWQgLSBTa2lwczogJWQiLAorICAgICAgICAgICAgICAgIHNpemVvZihzY2FuZmlsZXMpLHNjYW5lcnJbMF0sc2NhbmVyclsxXSksCisgICAgICAgICAgICAgICAgNzgsIk9URVNUOiAiLDEpLE1TR0ZMQUdfVEVMTCk7CisKKyAgICAgICAgc2NhbnJ1biAgID0gMDsKKyAgICAgICAgc2NhbmNvdW50ID0gMDsKKyAgICAgICAgb3V0cHV0ICAgID0gMDsKKyAgICAgICAgc2NhbmZpbGVzID0gKHt9KTsKKyAgICAgICAgc2NhbmRpciAgID0gMDsKKyAgICAgICAgdGVzdG9iICAgID0gMDsKKyAgICAgICAgc2NhbmVyciAgID0gKHswLDB9KTsKKworICAgICAgICB3aGlsZShyZW1vdmVfY2FsbF9vdXQoInhfaGVhcnRfYmVhdCIpIT0tMSk7CisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmbj1zY2FuZGlyK3NjYW5maWxlc1tucl07CisgICAgaWYgKGZuWzwyLi5dPT0iLmMiKQorICAgICAgICBmbj1mblswLi48M107CisKKyAgICBpZiAoc2NhbmNvdW50PT0xKSAvLyBUZXN0ZW4sIG9iIEZpbGUgbGFkYmFyCisgICAgeworICAgICAgICBPdXRwdXQoc3ByaW50ZigiRmlsZTogJXNcblxuIixmbikpOworICAgICAgICBlcj1jYXRjaChjYWxsX290aGVyKGZuLCI/Pz8iKSk7CisgICAgICAgIGlmIChlciAmJiBzdHJpbmdwKGVyKSkKKyAgICAgICAgeworICAgICAgICAgICAgT3V0cHV0KHNwcmludGYoIkVycm9yOiAlcy0+QWJvcnRATG9hZFxuXG4iLGVyKSk7CisgICAgICAgICAgICBzY2FucnVuLS07CisgICAgICAgICAgICBzY2FuY291bnQgID0gMDsKKyAgICAgICAgICAgIHRlc3RvYiAgICAgPSAwOworICAgICAgICAgICAgc2NhbmVyclswXSA9IHNjYW5lcnJbMF0rMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICB0ZXN0b2IgPSBmaW5kX29iamVjdChmbik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKCFvYmplY3RwKHRlc3RvYikpCisgICAgeworICAgICAgICBPdXRwdXQoIk9iamVrdCBuaWNodCBnZWZ1bmRlblxuLT4gQWJvcnRAT2JqZWN0LlxuXG4iKTsKKyAgICAgICAgc2NhbnJ1bi0tOworICAgICAgICBzY2FuY291bnQgID0gMDsKKyAgICAgICAgc2NhbmVyclswXSA9IHNjYW5lcnJbMF0rMTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIWZ1bmN0aW9uX2V4aXN0cygiaW50X2xvbmciLHRlc3RvYikpCisgICAgeworICAgICAgICBPdXRwdXQoIk9iamVrdCBpc3Qga2VpbiBSYXVtIC0+IFNLSVBQSU5HLlxuXG4iKTsKKyAgICAgICAgc2NhbnJ1bi0tOworICAgICAgICBzY2FuY291bnQgID0gMDsKKyAgICAgICAgdGVzdG9iICAgICA9IDA7CisgICAgICAgIHNjYW5lcnJbMV0gPSBzY2FuZXJyWzFdKzE7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3dpdGNoKHNjYW5jb3VudCkKKyAgICB7CisgICAgICAgIGNhc2UgMiA6CisgICAgICAgICAgICBpZiAoKGVyPWNhdGNoKHNlYXJjaF9kKHRlc3RvYikpKSAmJiBzdHJpbmdwKGVyKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBPdXRwdXQoc3ByaW50ZigiRXJyb3I6ICVzLT4gQWJvcnRARGV0YWlsLlxuXG4iLGVyKSk7CisgICAgICAgICAgICAgICAgc2NhbnJ1bi0tOworICAgICAgICAgICAgICAgIHNjYW5jb3VudCAgPSAwOworICAgICAgICAgICAgICAgIHRlc3RvYiAgICAgPSAwOworICAgICAgICAgICAgICAgIHNjYW5lcnJbMF0gPSBzY2FuZXJyWzBdKzE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGNhc2UgMyA6CisgICAgICAgICAgICBpZiAoKGVyPWNhdGNoKHNlYXJjaF9zZW5zZSh0ZXN0b2IsU0VOU0VfU01FTEwpKSkgJiYgc3RyaW5ncChlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgT3V0cHV0KHNwcmludGYoIkVycm9yOiAlcy0+IEFib3J0QFNtZWxsLlxuXG4iLGVyKSk7CisgICAgICAgICAgICAgICAgc2NhbnJ1bi0tOworICAgICAgICAgICAgICAgIHNjYW5jb3VudCAgPSAwOworICAgICAgICAgICAgICAgIHRlc3RvYiAgICAgPSAwOworICAgICAgICAgICAgICAgIHNjYW5lcnJbMF0gPSBzY2FuZXJyWzBdKzE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIGNhc2UgNCA6CisgICAgICAgICAgICBpZiAoKGVyPWNhdGNoKHNlYXJjaF9zZW5zZSh0ZXN0b2IsU0VOU0VfU09VTkQpKSkgJiYgc3RyaW5ncChlcikpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgT3V0cHV0KHNwcmludGYoIkVycm9yOiAlcy0+IEFib3J0QFNvdW5kLlxuXG4iLGVyKSk7CisgICAgICAgICAgICAgICAgc2NhbnJ1bi0tOworICAgICAgICAgICAgICAgIHNjYW5jb3VudCAgPSAwOworICAgICAgICAgICAgICAgIHRlc3RvYiAgICAgPSAwOworICAgICAgICAgICAgICAgIHNjYW5lcnJbMF0gPSBzY2FuZXJyWzBdKzE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgfQorICAgIHJldHVybjsKK30KZGlmZiAtLWdpdCBhL29iai90b29scy90ZXN0ZXIvdGVzdC5kYXQgYi9vYmovdG9vbHMvdGVzdGVyL3Rlc3QuZGF0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3MjBjNzYKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9vbHMvdGVzdGVyL3Rlc3QuZGF0CkBAIC0wLDAgKzEsNSBAQAorZGVyIGRpZSBkYXMgaWNoIGR1IGVyIHNpZSBlcyB3aXIgaWhyIHNpZSBtZWluIGRlaW4gc2VpbiBkZWluZXIgZXVlciBhbiBhdXMKK2VpbiBhdWNoIGRhZnVlciBkb2NoIGltIG5hamEgd2llIGRlaW5lbiBtZWluZW4gZGVpbmVtIG1laW5lbSBzaWVodCBkaWNoIGRpZXMKK3N1ZWRlbiBub3JkZW4gd2VzdGVuIG9zdGVuIHN1ZWRvc3RlbiBzdWVkd2VzdGVuIG5vcmRvc3RlbiBub3Jkd2VzdGVuIGRpZXNlCitkaXIgZG9ydCBobSBqYSBuZWluIGFscyBhdWYgaW4gbWFuIG5hY2ggdW0gZGllc2VyIG5pY2h0IGRlaW5lIHZvbiB3ZW5uIGFtCitrZWluZSBtdWQgaGllciBzbwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL29iai90b29scy94dG9vbC5jIGIvb2JqL3Rvb2xzL3h0b29sLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAwYzQ4YQotLS0gL2Rldi9udWxsCisrKyBiL29iai90b29scy94dG9vbC5jCkBAIC0wLDAgKzEsNyBAQAordm9pZCBjcmVhdGUoKQoreworICBpZihtZW1iZXIob2JqZWN0X25hbWUodGhpc19vYmplY3QoKSksJyMnKT09LTEpCisgICAgcmV0dXJuOworICBjbG9uZV9vYmplY3QoIi9vYmovdG9vbHMvTUd0b29sIiktPm1vdmUodGhpc19vYmplY3QoKSk7CisgIGNhbGxfb3V0KGxhbWJkYSgoe30pLCh7IydkZXN0cnVjdCwoeyMndGhpc19vYmplY3R9KX0pKSwwKTsKK30KZGlmZiAtLWdpdCBhL29iai90b29scy94eHRvb2wuYyBiL29iai90b29scy94eHRvb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTNmYjZjCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3Rvb2xzL3h4dG9vbC5jCkBAIC0wLDAgKzEsNDEgQEAKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+DQorI2luY2x1ZGUgPGxhbmd1YWdlLmg+DQorDQoraW5oZXJpdCAib2JqL3Rvb2xzL01HdG9vbCI7DQoraW5oZXJpdCAic3RkL3RoaW5nIjsNCisNCit2b2lkIGNyZWF0ZSgpDQorew0KKyAgaWYoIWNsb25lcCh0aGlzX29iamVjdCgpKSkNCisgICAgcmV0dXJuOw0KKyAgdGhpbmc6OmNyZWF0ZSgpOw0KKyAgOjpjcmVhdGUoKTsNCisgIFNldFByb3AoUF9OQU1FLCJBbmtoIik7DQorICBTZXRQcm9wKFBfR0VOREVSLE5FVVRFUik7DQorICBTZXRQcm9wKFBfSURTLCh7ImFua2giLCJ4eHRvb2wifSkpOw0KK30NCisNCitzdHJpbmcgX3F1ZXJ5X3Nob3J0KCkNCit7DQorICA6Ol9xdWVyeV9zaG9ydCgpOw0KKyAgcmV0dXJuICJFaW4gQW5raCBhbSBIYWxzYmFuZC5cbiI7DQorfQ0KKw0KK3N0cmluZyBfcXVlcnlfbG9uZygpDQorew0KKyAgOjpfcXVlcnlfbG9uZygpOw0KKyAgcmV0dXJuDQorICAgICJFaW4gSGFsc2JhbmQsIGFuIGRlbSBlaW4gQW5raCBoYWVuZ3QuXG4iDQorICAgICsJIkVpbiBBbmtoIHNpZWh0IHVuZ2VmYWVociBzbyBhdXMgd2llIGVpbiBLcmV1eiBhYmVyIGViZW4gbmljaHQgZ2Fuei5cbiI7DQorfQ0KKw0KK3N0cmluZyBuYW1lKCBpbnQgZDEsIGludCBkMiApDQorew0KKyAgcmV0dXJuIHRoaW5nOjpuYW1lKGQxLGQyKTsNCit9DQorDQoraW50IGlkKCBzdHJpbmcgc3RyICkNCit7DQorICA6OmlkKHN0cik7DQorICByZXR1cm4gbWVtYmVyKCAoeyJhbmtoIiwieHh0b29sIn0pLHN0ciApICE9IC0xOw0KK30NCmRpZmYgLS1naXQgYS9vYmovdG9wbGlzdGUuYyBiL29iai90b3BsaXN0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzMGM1NDYKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdG9wbGlzdGUuYwpAQCAtMCwwICsxLDExNiBAQAoraW5oZXJpdCAiL3N0ZC90aGluZyI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKworLy8gKHtGdW5rdGlvbnNuYW1lLCAoe2FyZ3VtZW50ZX0pLCB0dHRlbCB9KQorbm9zYXZlIDxzdHJpbmd8bWl4ZWQqPiogd2F0ZGVubjsKKworc3RyaW5nIF9saWVzbGlzdGUoKTsKKworcHJvdGVjdGVkIHZvaWQgY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX1NIT1JULCJEaWUgVG9wLUxpc3RlLCBUb3AtU3BpZWxlcmxpc3RlLCBUb3AtU2VoZXJsaXN0ZSB1bmQgIgorICAgICAgIlRvcC1IYXJkY29yZWxpc3RlIik7CisgIFNldFByb3AoUF9XRUlHSFQsMCk7CisgIFNldFByb3AoUF9HRU5ERVIsRkVNQUxFKTsKKyAgU2V0UHJvcChQX1dFSUdIVCwyMCk7CisgIEFkZElkKCh7Imxpc3RlIiwidG9wbGlzdGUiLCJ0b3AtbGlzdGUiLAorICAgICAgICAgICJ0b3BzcGllbGVybGlzdGUiLCJ0b3Atc3BpZWxlcmxpc3RlIiwidG9wc3BpZWxlciIsInNwaWVsZXJsaXN0ZSIsCisgICAgICAgICAgInRvcHNlaGVybGlzdGUiLCJ0b3Atc2VoZXJsaXN0ZSIsInRvcHNlaGVyIiwic2VoZXJsaXN0ZSIsCisgICAgICAgICAgInRvcGhhcmRjb3JlbGlzdGUiLCJ0b3AtaGFyZGNvcmVsaXN0ZSIsInRvcGhhcmRjb3JlIiwiaGFyZGNvcmVsaXN0ZSJ9KSk7CisgIFNldFByb3AoUF9OQU1FLCJMaXN0ZSIpOworICBTZXRQcm9wKFBfTk9HRVQsIkRpZSBpc3QgYW4gZGVyIFdhbmQgZmVzdGdlbmFnZWx0LlxuIik7CisgIEFkZFJlYWREZXRhaWwoU0VOU0VfREVGQVVMVCwgIydfbGllc2xpc3RlKTsKK30KKworI2RlZmluZSBOQU1FICAgICAwCisjZGVmaW5lIExFUCAgICAgIDEKKyNkZWZpbmUgUVAgICAgICAgMgorI2RlZmluZSBYUCAgICAgICAzCisjZGVmaW5lIExFVkVMICAgIDQKKyNkZWZpbmUgQUdFICAgICAgNQorI2RlZmluZSBSQUNFICAgICA2CisjZGVmaW5lIEdVSUxEICAgIDcKKyNkZWZpbmUgV0laTEVWRUwgOAorI2RlZmluZSBIQVJEQ09SRSA5CitwdWJsaWMgc3RyaW5nIGZvcm1hdF9saXN0KDwgPHN0cmluZ3xpbnQ+KiA+KiBsaXN0KQoreworICBpbnQgaWR4OworICAvL3N0cmluZyByZXM9IiAgICAgIE5hbWUgICAgICAgICBMZXZlbCAgQVAgIEVyZmFocnVuZyAgICBBbHRlciAgICAgR2lsZGVcbiI7CisgIHN0cmluZyByZXMgPSBzcHJpbnRmKAorICAgICAgIiVjJTo0cyAgJToxMS1zICAlOjV8cyAlOjV8cyAlOjR8cyAlOjEyfHMgJToxMnxzICAlOjE0LXNcbiIsCisgICAgICAnICcsICIiLCAiTmFtZSIsICIiLCAiTGV2ZWwiLCAiQVAiLCAiRXJmYWhydW5nIiwiQWx0ZXIiLCJHaWxkZSIpOworCisgIGZvcmVhY2goPHN0cmluZ3xpbnQ+KiBlbnRyeTogbGlzdCkKKyAgeworICAgICsraWR4OworICAgIGVudHJ5W0FHRV0gKj0gMjsKKyAgICBpbnQgdGFnZSA9IGVudHJ5W0FHRV0vODY0MDA7CisgICAgaW50IHN0dW5kZW4gPSAoZW50cnlbQUdFXSAlIDg2NDAwKSAvIDM2MDA7CisgICAgaW50IG1pbnV0ZW4gPSAoZW50cnlbQUdFXSAlIDM2MDApIC8gNjA7CisgICAgcmVzICs9CisgICAgc3ByaW50ZigiJWMlOjRkLiAlOjExLXMgICU6NS1zICU6NWQgJTo0ZCAlOjEyZCAlOjRkZCwgJToyJzAnZDolOjInMCdkICAlOjE0LXNcbiIsCisgICAgICAgICAgICAoZW50cnlbV0laTEVWRUxdPjAgPyAnKicgOiAnICcpLAorICAgICAgICAgICAgaWR4LCBjYXBpdGFsaXplKGVudHJ5W05BTUVdKSwKKyAgICAgICAgICAgIChlbnRyeVtIQVJEQ09SRV0+MSA/ICIoUklQKSIgOiAiIiksCisgICAgICAgICAgICBlbnRyeVtMRVZFTF0sCisgICAgICAgICAgICBlbnRyeVtRUF0sIGVudHJ5W1hQXSwKKyAgICAgICAgICAgIHRhZ2UsIHN0dW5kZW4sIG1pbnV0ZW4sCisgICAgICAgICAgICBjYXBpdGFsaXplKGVudHJ5W0dVSUxEXSkpOworICB9CisgIHJldHVybiByZXM7Cit9CisKK3ByaXZhdGUgc3RyaW5nIGdldF9saXN0KDxzdHJpbmd8bWl4ZWQqPiogd2FzKQoreworICBpZiAod2FzID09IDApCisgICAgd2FzPSh7Ikxpc3RlIiwgKHt9KSwgIiAiKjI4ICsgIkxpc3RlIGRlciBUb3BzcGllbGVyICFcblxuIiB9KTsKKworICA8IDxzdHJpbmd8aW50PiogPiogbGlzdCA9ICIvc2VjdXJlL3RvcGxpc3RlIi0+KHdhc1swXSkod2FzWzFdLi4uKTsKKyAgCisgIHJldHVybiB3YXNbMl0gKyBmb3JtYXRfbGlzdChsaXN0KTsKK30KKwordmFyYXJncyBpbnQgaWQoc3RyaW5nIHN0cixpbnQgbHZsKQoreworICBpZiAoITo6aWQoc3RyLGx2bCkpCisgICAgcmV0dXJuIDA7CisKKyAgaWYgKHN0cnN0cihzdHIsInNlaGVyIik+PTApCisgICAgd2F0ZGVubj0oeyJTZWhlckxpc3RlIiwgKHsgfSksICIgIioyOSArICJMaXN0ZSBkZXIgVG9wc2VoZXIgIVxuXG4iIH0pOworICBlbHNlIGlmIChzdHJzdHIoc3RyLCJzcGllbGVyIik+PTApCisgICAgd2F0ZGVubj0oeyJTcGllbGVyTGlzdGUiLCAoeyB9KSwKKyAgICAgICAgICAgICAgICIgIioyMSArICJMaXN0ZSBkZXIgVG9wc3BpZWxlciAoS2VpbmUgU2VoZXIpICFcblxuIiB9KTsKKyAgZWxzZSBpZiAoc3Ryc3RyKHN0ciwiaGFyZGNvcmUiKT49MCkKKyAgICB3YXRkZW5uPSh7IkhhcmRjb3JlTGlzdGUiLCAoeyB9KSwKKyAgICAgICAgICAgICAgICIgIioyMiArICJMaXN0ZSBkZXIgbXV0aWdzdGVuIGFsbGVyIEhlbGRlbiAhXG5cbiIgfSk7CisgIGVsc2UKKyAgICB3YXRkZW5uPSh7Ikxpc3RlIiwgKHsgfSksICIgIioyOCArICJMaXN0ZSBkZXIgVG9wc3BpZWxlciAhXG5cbiIgfSk7CisgIAorICByZXR1cm4gMTsKK30KKworc3RyaW5nIF9xdWVyeV9sb25nKCkKK3sKKyAgaWYgKHRoaXNfcGxheWVyKCkpIHRoaXNfcGxheWVyKCktPk1vcmUoZ2V0X2xpc3Qod2F0ZGVubikpOworICB3YXRkZW5uPTA7CisgIHJldHVybiAiIjsKK30KKwordmFyYXJncyBzdHJpbmcgbG9uZyhpbnQgbW9kZSkKK3sKKyAgaWYgKHRoaXNfcGxheWVyKCkpIHRoaXNfcGxheWVyKCktPk1vcmUoZ2V0X2xpc3Qod2F0ZGVubikpOworICB3YXRkZW5uPTA7CisgIHJldHVybiAiIjsKK30KKworc3RyaW5nIF9saWVzbGlzdGUoKQoreworICBpZiAodGhpc19wbGF5ZXIoKSkgdGhpc19wbGF5ZXIoKS0+TW9yZShnZXRfbGlzdCh3YXRkZW5uKSk7CisgIHdhdGRlbm49MDsKKyAgcmV0dXJuICIiOworfQorCmRpZmYgLS1naXQgYS9vYmovdWhyLmMgYi9vYmovdWhyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk0YjZlYQotLS0gL2Rldi9udWxsCisrKyBiL29iai91aHIuYwpAQCAtMCwwICsxLDg2IEBACisjcHJhZ21hIG5vX2Nsb25lCisjcHJhZ21hIG5vX2luaGVyaXQKKyNwcmFnbWEgbm9fc2hhZG93CisjcHJhZ21hIHN0cm9uZ190eXBlcworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGV2ZW50cy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworcHJpdmF0ZSBzdHJpbmcgdWxvZyA9ICIiOworCit2b2lkIFdhaXRGb3JRdWFydGVySG91cigpIHsKKyAgd2hpbGUocmVtb3ZlX2NhbGxfb3V0KCJRdWFydGVyUmVhY2hlZCIpIT0tMSk7CisgIGNhbGxfb3V0KCJRdWFydGVyUmVhY2hlZCIsOTAwLSh0aW1lKCkgJSA5MDApKTsKK30KKwordm9pZCBjcmVhdGUoKSB7CisgIFdhaXRGb3JRdWFydGVySG91cigpOworfQorCisvKiBVZWJlcnBydWVmdCBkaWUgYWxzIFBhcmFtZXRlciAic3RyIiB1ZWJlcmdlYmVuZSBVaHJtZWxkdW5nLgorICAgUnVlY2tnYWJld2VydGU6IDAgZnVlciBmZWhsZXJoYWZ0ZSBQYXJhbWV0ZXIsCisgICAgICAgICAgICAgICAgICAgMSBmdWVyIGtvcnJla3RlbiBBdWZiYXUuICovCitpbnQgQ2hlY2tDbG9ja01zZyhzdHJpbmcgc3RyKQoreworICBpbnQgaSA9IHN0cnN0cihzdHIsICIlIiwgMCk7CisgIC8qIE1laHIgYWxzIDF4ICVkIGVudGhhbHRlbiwgbWVociBhbHMgMXggJSBlbnRoYWx0ZW4sIG9kZXIgYXVmIGRhcyBlaW56aWdlCisgICAgIGVudGhhbHRlbmUgJSBmb2xndCBrZWluICJkIi4gKi8KKyAgaWYgKCBzaXplb2YoZXhwbG9kZShzdHIsIiVkIikpID4gMiB8fAorICAgICAgIHNpemVvZihleHBsb2RlKHN0ciwiJSIpKSA+IDIgfHwKKyAgICAgICAoaT4tMSAmJiAoIGk9PXNpemVvZihzdHIpLTEgfHwgc3RyW2krMV0gIT0gJ2QnKSkpCisgICAgcmV0dXJuIDA7CisgIGVsc2UKKyAgICByZXR1cm4gMTsKK30KKwordm9pZCBRdWFydGVyUmVhY2hlZCgpIHsKKyAgaW50IHN0ZCwgbWludXRlbjsKKyAgc3RyaW5nIHN0ciwgZm9ybWF0OworICBpbnQgb2ZmOworCisgIGludCAqbHQ9bG9jYWx0aW1lKHRpbWUoKSk7CisgIG1pbnV0ZW49bHRbVE1fTUlOXTsKKyAgc3RkPWx0W1RNX0hPVVJdOworICBtYXBwaW5nIGVkYXRhID0gbWttYXBwaW5nKAorICAgICAgICAoe1RNX1NFQywgVE1fTUlOLCBUTV9IT1VSLCBUTV9NREFZLCBUTV9NT04sIFRNX1lFQVIsIFRNX1dEQVksIFRNX1lEQVksCisgICAgICAgICAgICBUTV9JU0RTVH0pLAorICAgICAgICBsdCk7CisKKyAgLy8gQ2xvY2stRXZlbnQgdHJpZ2dlcm4KKyAgRVZFTlRELT5UcmlnZ2VyRXZlbnQoRVZUX0xJQl9DTE9DSywgZWRhdGEpOyAKKworICAvLyBiZWkgRGF0dW1zd2VjaHNlbCBEQVRFQ0hBTkdFLUV2ZW50IGF1c2xvZXNlbi4KKyAgaWYgKHN0ZD09MCAmJiBtaW51dGVuIDwgMTUpIHsgICAgICAKKyAgICAgIEVWRU5URC0+VHJpZ2dlckV2ZW50KEVWVF9MSUJfREFURUNIQU5HRSwgZWRhdGEpOworICB9CisKKyAgaWYgKG1pbnV0ZW4gPD0gMikgeworICAgIGZvcmVhY2gob2JqZWN0IHUgOiB1c2VycygpKSB7CisgICAgICBpZigob2ZmPXRvX2ludCh1LT5RdWVyeVByb3AoUF9USU1FWk9ORSkpKTwwKW9mZis9MjQ7CisgICAgICBvZmY9KHN0ZCtvZmYpJTI0OworICAgICAgZm9ybWF0PXUtPlF1ZXJ5UHJvcChQX0NMT0NLTVNHKXx8IkR1IGhvZXJzdCBkaWUgVWhyIHNjaGxhZ2VuOiAiCisJICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFcyBpc3QgamV0enQgJWQgVWhyLlxuIjsKKyAgICAgIGlmICggIUNoZWNrQ2xvY2tNc2coZm9ybWF0KSApCisgICAgICB7CisJdGVsbF9vYmplY3QodSwgYnJlYWtfc3RyaW5nKAorCSAgIlNvIGthbm4gaWNoIG5pY2h0IGFyYmVpdGVuISBEZWluZSBVaHJtZWxkdW5nIGZ1bmt0aW9uaWVydCBzbyAiCisJICAibmljaHQuIEJpdHRlIGtvcnJpZ2llcmUgZGFzLiIsIDc4LCAiRGllIFVociB0ZWlsdCBEaXIgbWl0OiAiKSk7CisJY29udGludWU7CisgICAgICB9CisgICAgICBpZiAoc3Ryc3RyKGZvcm1hdCwiJWQiLDApPT0tMSkKKyAgICAgICAgc3RyPWZvcm1hdDsKKyAgICAgIGVsc2UKKyAgICAgICAgc3RyPXNwcmludGYoZm9ybWF0LG9mZik7CisgICAgICBpZiAoc3RyIT0iIikgdGVsbF9vYmplY3QodSxzdHIpOworICAgIH0KKyAgfQorICBzdHIgPSAiIjsKKyAgaWYgKG1pbnV0ZW4gPCAxMCkgeworICAgIGxvZ19maWxlKCJVU0VSX1NUQVRJU1RJSyIsIHVsb2cpOworICAgIHVsb2cgPSBzcHJpbnRmKCJcbiVzJTAyZDogIiwoIXN0ZD8oIiMgIitsdFtUTV9XREFZXSsiOlxuIik6IiIpLHN0ZCk7CisgIH0KKyAgdWxvZyArPSBzcHJpbnRmKCIlNGQiLHNpemVvZih1c2VycygpKSk7CisgIFdhaXRGb3JRdWFydGVySG91cigpOworfQorCmRpZmYgLS1naXQgYS9vYmovdmVydHJhZy5jIGIvb2JqL3ZlcnRyYWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzA5OTBlCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3ZlcnRyYWcuYwpAQCAtMCwwICsxLDExNSBAQAorI3ByYWdtYSBzdHJpY3RfdHlwZXMKKyNwcmFnbWEgY29tYmluZV9zdHJpbmdzCisjcHJhZ21hIG5vX3NoYWRvdworI3ByYWdtYSBub19pbmhlcml0CisKK2luaGVyaXQgInN0ZC90aGluZyI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKworcHJpdmF0ZSBpbnQgZ2VsZXNlbjsKK3ByaXZhdGUgc3RyaW5nIHVudGVyc2NocmllYmVuOworCitzdGF0aWMgc3RyaW5nIHRleHQoKTsKKworcHVibGljIHZvaWQgY3JlYXRlKCkKK3sKKyAgIGlmICggIWdldGV1aWQodGhpc19vYmplY3QoKSkgKQorICAgICAgY2FsbF9vdXQoICJyZW1vdmUiLCAwICk7CisgICAKKyAgIGlmICggIUlTX1dJWkFSRChnZXRldWlkKHRoaXNfb2JqZWN0KCkpKSApCisgICAgICBjYWxsX291dCggInJlbW92ZSIsIDAgKTsKKyAgIAorICAgaWYgKCAhY2xvbmVwKHRoaXNfb2JqZWN0KCkpICkKKyAgICAgIHJldHVybjsKKyAgIAorICAgdGhpbmc6OmNyZWF0ZSgpOworICAgU2V0UHJvcCggUF9TSE9SVCwgIkVpbiBWZXJ0cmFnIiApOworICAgU2V0UHJvcCggUF9MT05HLCAiQEB1bnRlcnNjaHJpZWJlbkBAIiApOworICAgU2V0UHJvcCggUF9OQU1FLCAiVmVydHJhZyIgKTsKKyAgIFNldChQX1JFQURfTVNHLCAjJ3RleHQsIEZfUVVFUllfTUVUSE9EKTsgCisgICBTZXRQcm9wKCBQX0dFTkRFUiwgTUFMRSApOworICAgU2V0UHJvcCggUF9BUlRJQ0xFLCAxICk7CisgICBBZGRJZCgidmVydHJhZyIpOworICAgU2V0UHJvcChQX05FVkVSRFJPUCwgMSk7CisgICBBZGRDbWQoKHsidW50ZXJzY2hyZWliZSIsInVudGVyc2NocmVpYiIsInVudGVyemVpY2huZSJ9KSwidW50ZXJzY2hyZWliZSIpOworICAgQWRkQ21kKCh7InplcnJlaXNzZSIsICJ6ZXJyZWlzcyJ9KSwiemVycmVpc3NlIik7CisgICAKKyAgIGdlbGVzZW4gPSAwOworICAgdW50ZXJzY2hyaWViZW4gPSAiIjsKK30KKworc3RhdGljIHN0cmluZyBfcXVlcnlfbm9kcm9wKCkKK3sKKyAgIGlmICh0aGlzX3BsYXllcigpICYmIElTX1dJWkFSRCh0aGlzX3BsYXllcigpKSkgcmV0dXJuIDA7CisgICByZXR1cm4gIk5laW4gTmVpbiEgRGllcyBpc3QgZGVpbiBWZXJ0cmFnIVxuIjsKK30KKworc3RhdGljIHN0cmluZyB1bnRlcnNjaHJpZWJlbigpCit7CisgICBzdHJpbmcgczsKKyAgIAorICAgcyA9ICJEaWVzIGlzdCBEZWluIE1hZ2llci1WZXJ0cmFnLiBEdSBzb2xsdGVzdCBpaG4gdmllbGxlaWNodCAiOworICAgaWYgKCBnZWxlc2VuICkKKyAgICAgIHMgKz0gIm5vY2giOworICAgcyArPSAibWFsIGxlc2VuLlxuRXIgd3VyZGUgRGlyIHZvbiAiICsgY2FwaXRhbGl6ZShnZXRldWlkKHRoaXNfb2JqZWN0KCkpKQorICAgICAgKyIgdWViZXJyZWljaHQuXG5XZW5uIER1IGlobiB1bnRlcnNjaHJlaWJzdCwgd2lyc3QgRHUgdm9uICIKKyAgICAgICsgY2FwaXRhbGl6ZShnZXRldWlkKHRoaXNfb2JqZWN0KCkpKSArICIgZ2VzcG9uc29ydC5cbiI7CisgICAKKyAgIGlmICh0aGlzX3BsYXllcigpICYmICh1bnRlcnNjaHJpZWJlbiA9PSBnZXR1aWQodGhpc19wbGF5ZXIoKSkpICkKKyAgICAgIHMgKz0gIkR1IGhhc3QgaWhuIHVudGVyc2NocmllYmVuLlxuIjsKKyAgIAorICAgcmV0dXJuIHM7Cit9CisKKworc3RhdGljIHN0cmluZyB0ZXh0KCkKK3sKKyAgIGdlbGVzZW4gPSAxOworICAgdGhpc19wbGF5ZXIoKS0+TW9yZSgiL2V0Yy9XSVpSVUxFUyIsMSk7CisgICByZXR1cm4gIiI7Cit9CisKKworc3RhdGljIGludCB1bnRlcnNjaHJlaWJlKCBzdHJpbmcgc3RyICkKK3sKKyAgIG5vdGlmeV9mYWlsKCJXYXMgd2lsbHN0IER1IGRlbm4gdW50ZXJzY2hyZWliZW4/XG4iKTsKKyAgIGlmICggIWlkKHN0cikgKQorICAgICAgcmV0dXJuIDA7CisgICAKKyAgIGlmICggIXRoaXNfcGxheWVyKCkgfHwgdGhpc19wbGF5ZXIoKSAhPSB0aGlzX2ludGVyYWN0aXZlKCkKKyAgICAgICAgfHwgdGhpc19wbGF5ZXIoKSAhPSBlbnZpcm9ubWVudCgpICkKKyAgICAgIHJldHVybiAwOworICAgCisgICBpZiAoICFnZWxlc2VuICl7CisgICAgICB3cml0ZSggIkR1IGhhc3QgaWhuIG5vY2ggbmljaHQgZ2VsZXNlbi4gRVJTVCBsZXNlbiwgREFOTiBzY2hyZWliZW4hXG4iKTsKKyAgICAgIHJldHVybiAxOworICAgfQorICAgCisgICB3cml0ZSggIkR1IHVudGVyc2NocmVpYnN0IGRlbiBWZXJ0cmFnLiBXZW5uIGRhcyBlaW4gVmVyc2VoZW4gd2FyLCAiCisgICAgICAgICAgKyAiemVycmVpc3MgaWhuIHNvZm9ydC5cbiIgKTsKKyAgIHVudGVyc2NocmllYmVuID0gZ2V0dWlkKCB0aGlzX2ludGVyYWN0aXZlKCkgKTsKKyAgIFNldFByb3AoIFBfTk9EUk9QLCAiTmVpbiwgZGVyIGlzdCB1bnRlcnNjaHJpZWJlbi4gRHUga2FubnN0IGlobiBob2VjaHN0ZW5zIgorICAgICAgICAgICAgKyAiIHplcnJlaXNzZW4uXG4iICk7CisgICBTZXRQcm9wKCBQX05FVkVSRFJPUCwgMSApOworICAgcmV0dXJuIDE7Cit9CisKKworc3RhdGljIGludCB6ZXJyZWlzc2UoIHN0cmluZyBzdHIgKQoreworICAgbm90aWZ5X2ZhaWwoIldhcyB3aWxsc3QgRHUgZGVubiB6ZXJyZWlzc2VuP1xuIik7CisgICBpZiAoICFpZChzdHIpICkgcmV0dXJuIDA7CisgICB3cml0ZSggIkR1IHplcnJlaXNzdCBkZW4gVmVydHJhZy5cbiIgKTsKKyAgIHJldHVybiByZW1vdmUoKTsKK30KKworCitwdWJsaWMgaW50IGlzX3VudGVyc2NocmllYmVuKCkKK3sKKyAgIHJldHVybiBlbnZpcm9ubWVudCgpICYmIHF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoZW52aXJvbm1lbnQoKSkKKyAgICAgICYmIGdldHVpZChlbnZpcm9ubWVudCgpKSA9PSB1bnRlcnNjaHJpZWJlbjsKK30KKwpkaWZmIC0tZ2l0IGEvb2JqL3ZpcnR1YWwvdl9yb29tLmMgYi9vYmovdmlydHVhbC92X3Jvb20uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWMyOGZkCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3ZpcnR1YWwvdl9yb29tLmMKQEAgLTAsMCArMSwxMiBAQAoraW5oZXJpdCAiL3N0ZC9yb29tIjsKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisKK2NyZWF0ZSgpCit7CisgICAgICAgIGlmKElTX0JMVUUodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgICAgICAgOjpjcmVhdGUoKTsKKyAgICAgICAgcHJldmlvdXNfb2JqZWN0KCktPkN1c3RvbWl6ZU9iamVjdCgpOworICAgICAgICBjYWxsX291dChzeW1ib2xfZnVuY3Rpb24oIlF1ZXJ5T2JqZWN0IiwgZmluZF9vYmplY3QoT0JKRUNURCkpLCAyKTsKK30KZGlmZiAtLWdpdCBhL29iai92aXJ0dWFsL3ZyX2NvbXBpbGVyLmMgYi9vYmovdmlydHVhbC92cl9jb21waWxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwZTRiZDAKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovdmlydHVhbC92cl9jb21waWxlci5jCkBAIC0wLDAgKzEsODEgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyBWUl9DT01QSUxFUi5DIC0tIHZpcnR1YWwgcm9vbSBjb21waWxlcgorLy8KKy8vICREYXRlOiAyMDAyLzA4LzI4IDA5OjU3OjE4ICQKKy8vICRSZXZpc2lvbjogNjYwNSAkCisvKiAkTG9nOiB2cl9jb21waWxlci5jLHYgJAorICogUmV2aXNpb24gMS4zICAyMDAyLzA4LzI4IDA5OjU3OjE4ICBSaWt1cworICogYXVmIHN0cm9uZ190eXBlcyB1bWdlc3RlbGx0CisgKgorICogUmV2aXNpb24gMS4yICAxOTk0LzA3LzI3IDE0OjQ4OjE4ICBKb2YKKyAqIHN1aWQKKyAqCisgKiBSZXZpc2lvbiAxLjEgIDE5OTQvMDIvMDEgIDE5OjQ3OjU3ICBIYXRlCisgKiBJbml0aWFsIHJldmlzaW9uCisgKgorKi8KKworLy8gcHJpbmNpcGxlOgorLy8gCS0gaW5oZXJpdCB0aGlzIG9iamVjdCBpbnRvIHlvdXIgb3duICd2aXJ0dWFsX2NvbXBpbGVyLmMnCisvLyAgLSBjdXN0b21pemUgVmFsaWRhdGUoKSBhbmQgQ3VzdG9taXplT2JqZWN0KCkgZm9yIHlvdSBvd24gc2FrZQorLy8gIAorLy8gICogVmFsaWRhdGUoKSBjaGVja3MgaWYgYSByb29tIGZpbGVuYW1lIGdpdmVuIGFzIGFyZ3VtZW50ICh3aXRob3V0IHBhdGgpCisvLyAgICBpcyB2YWxpZCBhbmQgcmV0dXJucyB0aGlzIGZpbGVuYW1lIHdpdGggc3RyaXBwZWQgJy5jJyEhCisvLyAgKiBDdXN0b21pemVPYmplY3QoKSB1c2VzIHRoZSBwcmV2aW91c19vYmplY3QoKS0+RnVuY3Rpb24oKSBzdHJhdGVneSB0bworLy8gICAgY3VzdG9taXplIHRoZSBzdGFuZGFyZCBvYmplY3QgKGZvciBleGFtcGxlIHRvIHNldCBhIGRlc2NyaXB0aW9uKQorLy8KKy8vIFByb3BlcnRpZXM6IFBfVkFMSURfTkFNRSwgUF9NSU5fWCwgUF9NQVhfWCwgUF9NSU5fWSwgUF9NQVhfWQorCisjcHJhZ21hIHN0cm9uZ190eXBlcworCitpbmhlcml0ICIvc3RkL3ZpcnR1YWwvdl9jb21waWxlciI7CisKKyNkZWZpbmUgTkVFRF9QUk9UT1RZUEVTCisKKyNpbmNsdWRlIDx0aGluZy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPHZfY29tcGlsZXIuaD4KKyNpbmNsdWRlICIvb2JqL3ZpcnR1YWwvdnJfY29tcGlsZXIuaCIKKyNpbmNsdWRlIDxzeXNfZGVidWcuaD4KKwordm9pZCBjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworCVNldFByb3AoUF9WQUxJRF9OQU1FLCAicmF1bSIpOworCXNldGV1aWQoZ2V0dWlkKCkpOworfQorCitzdHJpbmcgVmFsaWRhdGUoc3RyaW5nIGZpbGUpCit7CisJaW50IHgseTsKKwlzdHJpbmcgcGF0aCwgbmFtZTsKKworICBmaWxlID0gOjpWYWxpZGF0ZShmaWxlKTsKKwlpZigoc3NjYW5mKGZpbGUsICIlc1slZCwlZF0iLCBuYW1lLCB4LCB5KSA9PSAzKSAmJgorCQkJbmFtZSA9PSBRdWVyeVByb3AoUF9WQUxJRF9OQU1FKSAmJgorCQkgICh4ID49IFF1ZXJ5UHJvcChQX01JTl9YKSAmJiB4IDw9IFF1ZXJ5UHJvcChQX01BWF9YKSkgJiYKKwkJICAoeSA+PSBRdWVyeVByb3AoUF9NSU5fWSkgJiYgeSA8PSBRdWVyeVByb3AoUF9NQVhfWSkpCisJCSkKKwkJcmV0dXJuIGZpbGU7Cit9CisKK21peGVkIEN1c3RvbWl6ZU9iamVjdCgpCit7CisJc3RyaW5nIHBhdGgsIGZpbGUsIG5hbWU7CisJaW50IHgseTsKKworCWlmKCEoZmlsZSA9IDo6Q3VzdG9taXplT2JqZWN0KCkpKSByZXR1cm4gMDsKKworCXBhdGggPSBRdWVyeVByb3AoUF9DT01QSUxFUl9QQVRIKTsKKwlzc2NhbmYoZmlsZSwgIiVzWyVkLCVkXSIsIG5hbWUsIHgsIHkpOworCW5hbWUgPSBRdWVyeVByb3AoUF9WQUxJRF9OQU1FKTsKKwlpZih5IDwgUXVlcnlQcm9wKFBfTUFYX1kpKQorCQlwcmV2aW91c19vYmplY3QoKS0+QWRkRXhpdCgibm9yZGVuIiwgcGF0aCsiLyIrbmFtZSsiWyIrKHggICkrIiwiKyh5KzEpKyJdIik7CisJaWYoeSA+IFF1ZXJ5UHJvcChQX01JTl9ZKSkKKwkJcHJldmlvdXNfb2JqZWN0KCktPkFkZEV4aXQoInN1ZWRlbiIsIHBhdGgrIi8iK25hbWUrIlsiKyh4ICApKyIsIisoeS0xKSsiXSIpOworCWlmKHggPCBRdWVyeVByb3AoUF9NQVhfWCkpCisJCXByZXZpb3VzX29iamVjdCgpLT5BZGRFeGl0KCJvc3RlbiIgLCBwYXRoKyIvIituYW1lKyJbIisoeCsxKSsiLCIrKHkgICkrIl0iKTsKKwlpZih4ID4gUXVlcnlQcm9wKFBfTUlOX1gpKQorCQlwcmV2aW91c19vYmplY3QoKS0+QWRkRXhpdCgid2VzdGVuIiwgcGF0aCsiLyIrbmFtZSsiWyIrKHgtMSkrIiwiKyh5ICApKyJdIik7Cit9CmRpZmYgLS1naXQgYS9vYmovdmlydHVhbC92cl9jb21waWxlci5oIGIvb2JqL3ZpcnR1YWwvdnJfY29tcGlsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjdhOTQwCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3ZpcnR1YWwvdnJfY29tcGlsZXIuaApAQCAtMCwwICsxLDMzIEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gVl9DT01QSUxFUi5IIC0tIGEgZ2VuZXJhbCB2aXJ0dWFsIGNvbXBpbGVyIG9iamVjdAorLy8KKy8vICREYXRlOiAxOTk0LzAyLzAxIDE5OjQ3OjU3ICQKKy8vICRSZXZpc2lvbjogNjA4MSAkCisvKiAkTG9nOiB2cl9jb21waWxlci5oLHYgJAorICogUmV2aXNpb24gMS4xICAxOTk0LzAyLzAxICAxOTo0Nzo1NyAgSGF0ZQorICogSW5pdGlhbCByZXZpc2lvbgorICoKKyovCisKKyNpbmNsdWRlIDx2X2NvbXBpbGVyLmg+CisKKyNpZm5kZWYgX19WUl9DT01QSUxFUl9IX18KKyNkZWZpbmUgX19WUl9DT01QSUxFUl9IX18KKworI2RlZmluZSBQX1ZBTElEX05BTUUJInZhbGlkX25hbWUiCisjZGVmaW5lIFBfTUlOX1gJCQkJIm1pbl94IgorI2RlZmluZSBQX01BWF9YCQkJCSJtYXhfeCIKKyNkZWZpbmUgUF9NSU5fWQkJCQkibWluX3kiCisjZGVmaW5lIFBfTUFYX1kJCQkJIm1heF95IgorCisjZW5kaWYgLy8gX19WX0NPTVBJTEVSX0hfXworCisjaWZkZWYgTkVFRF9QUk9UT1RZUEVTCisKKyNpZm5kZWYgX19WUl9DT01QSUxFUl9IX1BST1RPX18KKyNkZWZpbmUgX19WUl9DT01QSUxFUl9IX1BST1RPX18KKworI2VuZGlmIC8vIF9fVlJfQ09NUElMRVJfSF9QUk9UT19fCisKKyNlbmRpZiAvL05FRURfUFJPVE9UWVBFUwpkaWZmIC0tZ2l0IGEvb2JqL3dhbmRlcmVyLmMgYi9vYmovd2FuZGVyZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTIwMDkyCi0tLSAvZGV2L251bGwKKysrIGIvb2JqL3dhbmRlcmVyLmMKQEAgLTAsMCArMSwxMTMgQEAKKyNwcmFnbWEgc3Ryb25nX3R5cGVzLCBzYXZlX3R5cGVzLCBydHRfY2hlY2tzCisjcHJhZ21hIG5vX2Nsb25lLCBub19pbmhlcml0LCBub19zaGFkb3cKKworaW5oZXJpdCAic3RkL25wYyI7CisKKyNkZWZpbmUgREVMQVkgNjAKKyNkZWZpbmUgTUFYV0FZIDMwCisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlICIvc2VjdXJlL3F1ZXN0bWFzdGVyLmgiCisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9OQU1FLCJXYW5kZXJlciIpOworICBzZXRfbGl2aW5nX25hbWUoIm9yYWtlbCIpOworICBTZXRQcm9wKFBfR0VOREVSLCBNQUxFKTsKKyAgU2V0UHJvcChQX1NIT1JULCJFaW4gYWx0ZXIgV2FuZGVyZXIiKTsKKyAgU2V0UHJvcChQX0xPTkcsCisgICJFaW4gdXJhbHRlciBXYW5kZXJlciBtaXQgZWluZW0gbGFuZ2VuIEhpcnRlbm1hbnRlbCB1bmQgZWluZW0gSGlydGVuc3RhYi5cbiIpOworICBBZGRJZCgoeyJ3YW5kZXJlciIsImhpcnRlIiwib3Jha2VsIn0pKTsKKwljcmVhdGVfZGVmYXVsdF9ucGMoIDE5ICk7CisgIFNldFByb3AoUF9NQVhfSFAsIDUwMDApOworICBTZXRQcm9wKFBfSFAsIDUwMDApOworICBTZXRQcm9wKFBfR0VOREVSLE1BTEUpOworICBTZXRQcm9wKFBfQUxJR04sIDEwMDApOworICBTZXRQcm9wKFBfWFAsIDEwMDApOworICBTZXRQcm9wKFBfSEFORFMsICh7IiBtaXQgc2VpbmVtIEhpcnRlbnN0YWIiLCA1MCwgKHtEVF9CTFVER0VPTn0pfSkgKTsKKyAgU2V0UHJvcChQX05PX0FUVEFDSywgMSk7CisgIFNldFByb3AoUF9SRUpFQ1QsICh7IFJFSkVDVF9HSVZFLCBOYW1lKFdFUikgKyAiIHNhZ3Q6IERhbmtlLCBhYmVyIGRhcyAiCisJCQkgICJicmF1Y2hlIGljaCBuaWNodC5cbiIgfSkgKTsKKyAgY2FsbF9vdXQoImxhdWYiLCBERUxBWSk7CisgIC8vIFNvbGx0ZSBlaWdlbnRsaWNoIHVlYmVyIGRhcyBgaW5mbyctU3lzdGVtIGxhdWZlbiA7KAorICBBZGRDbWQoICh7ImZyYWciLCJmcmFnZSJ9KSwgImZyYWciICk7Cit9CisKK3N0YXRpYyBpbnQgZnJhZyhtaXhlZCBzdHIpCit7CisgIGludCBpLGosZ2VyZWRldDsKKyAgbWl4ZWQgKnF1ZXN0czsKKyAgbWl4ZWQgdG1wOworICAKKyAgaWYgKCFzdHIpIHJldHVybiAwOworICBzdHIgPSB0aGlzX3BsYXllcigpLT5fdW5wYXJzZWRfYXJncygxKTsKKyAgc3RyID0gb2xkX2V4cGxvZGUoc3RyLCIgIik7CisgIGlmICggIXNpemVvZihzdHIpICkgcmV0dXJuIDA7CisgIGlmICggIWlkKHN0clswXSkgKSByZXR1cm4gMDsKKyAgaWYgKHNpemVvZihzdHIpPDMgfHwgKHN0clsxXSE9Im5hY2giICYmIHN0clsxXSE9InVlYmVyIikpCisgIHsKKyAgICB0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLCJEZXIgV2FuZGVyZXIgc2FndDogSWNoIHZlcnN0ZWggZGljaCBuaWNodC5cbiIpOworICAgIHJldHVybiAxOworICB9CisgIGdlcmVkZXQ9MDsKKyAgc3RyPWltcGxvZGUoc3RyWzIuLl0sIiAiKTsKKyAgcXVlc3RzPVFNLT5RdWVyeVF1ZXN0cygpOworICBpZiAoc3RyPT0iYXVmZ2FiZSIgfHwgc3RyPT0iYXVmZ2FiZW4iIHx8IHN0cj09ImFiZW50ZXVlciIgfHwgc3RyPT0icXVlc3RzIgorICAgICAgfHwgc3RyID09ICJxdWVzdCIpCisgIHsKKyAgICB0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLCJEZXIgV2FuZGVyZXIgc2FndDogRm9sZ2VuZGUgQXVmZ2FiZW4gZ2lidCAiCisgICAgICAgICJlcyBoaWVyOlxuIik7CisgICAgcXVlc3RzWzBdID0gc29ydF9hcnJheShxdWVzdHNbMF0sICMnPik7CisgICAgZm9yIChpPTA7aTxzaXplb2YocXVlc3RzWzBdKTtpKyspCisgICAgeworICAgICAgdGVsbF9vYmplY3QodGhpc19wbGF5ZXIoKSxxdWVzdHNbMF1baV0pOworICAgICAgaWYgKHRoaXNfaW50ZXJhY3RpdmUoKS0+UXVlcnlRdWVzdChxdWVzdHNbMF1baV0pKQorICAgICAgICB0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLCIgW2hhc3QgRHUgc2Nob24gZ2Vsb2VzdF0iKTsKKyAgICAgIHRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksIlxuIik7CisgICAgfQorICAgIHJldHVybiAxOworICB9CisgIGZvciAoaT0wO2k8c2l6ZW9mKHF1ZXN0c1swXSk7aSsrKQorICB7CisgICAgaWYgKG1lbWJlcihvbGRfZXhwbG9kZShsb3dlcl9jYXNlKHF1ZXN0c1swXVtpXSksIiAiKSxzdHIpPj0wCisJICAgICAgfHwgc3Ryc3RyKGxvd2VyX2Nhc2UocXVlc3RzWzBdW2ldKSwgc3RyKT49MCkKKyAgICB7CisgICAgICB0bXA9cXVlc3RzWzBdW2ldKyI/IERhenUga2FubiBpY2ggRGlyIGZvbGdlbmRlcyBzYWdlbjogIjsKKyAgICAgIHRtcCs9cXVlc3RzWzFdW2ldWzNdOworICAgICAgdG1wPW9sZF9leHBsb2RlKGJyZWFrX3N0cmluZyh0bXAsNjApLCJcbiIpOworICAgICAgZ2VyZWRldD0xOworICAgICAgZm9yIChqPTA7ajxzaXplb2YodG1wKTtqKyspCisgICAgICAgIHRlbGxfb2JqZWN0KHRoaXNfcGxheWVyKCksIkRlciBXYW5kZXJlciBzYWd0OiAiK3RtcFtqXSsiXG4iKTsKKyAgICB9CisgIH0KKyAgaWYgKCFnZXJlZGV0KSAKKyAgICB0ZWxsX29iamVjdCh0aGlzX3BsYXllcigpLCJEZXIgV2FuZGVyZXIgc2FndDogIitjYXBpdGFsaXplKHN0cikrCisgICAgICAiPyBJbnRlcmVzc2llcnQgbWljaCBuaWNodCFcbiIpOworICByZXR1cm4gMTsKK30KKwordm9pZCBsYXVmKCkKK3sKKyAgaW50IGksIG9rOworIAorICAvLyB3ZW5uIGtlaW5lIEVudmlyb25tZW50LCBkYW5uIGxhZXVmdCBkYXMgRGluZyBlaW5mYWNoIG5pY2h0LgorICBpZiAoICFvYmplY3RwKGVudmlyb25tZW50KCkpICkKKyAgICByZXR1cm47CisKKyAgbWFwcGluZyBsaXN0ZSA9IGVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX0VYSVRTKTsKKyAgc3RyaW5nICpkaXJzID0gbV9pbmRpY2VzKGxpc3RlKTsKKyAgc3RyaW5nICpkaXJzMiA9ICh7IH0pOworICBmb3IgKGk9MDtpPHNpemVvZihsaXN0ZSk7aSsrKQorICAgIGlmICghY2F0Y2gob2s9bGlzdGVbZGlyc1tpXV0tPlF1ZXJ5UHJvcChQX09SQUtFTCkpICYmIG9rKSAKKyAgICAgIGRpcnMyICs9ICh7IGRpcnNbaV0gfSk7CisgIAorICBpZiAoc2l6ZW9mKGRpcnMyKSkKKyAgeworICAgIGk9cmFuZG9tKHNpemVvZihkaXJzMikpOworICAgIGNvbW1hbmRfbWUoZGlyczJbaV0pOworICB9CisgIGNhbGxfb3V0KCJsYXVmIixERUxBWSk7Cit9CmRpZmYgLS1naXQgYS9vYmovd2VybGlzdGUuYyBiL29iai93ZXJsaXN0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyNTA0M2QKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovd2VybGlzdGUuYwpAQCAtMCwwICsxLDM1MSBAQAorI3ByYWdtYSBzdHJvbmdfdHlwZXMKKworaW5oZXJpdCAiL3N0ZC91c2VyX2ZpbHRlciI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8YW5zaS5oPgorI2luY2x1ZGUgPHdlcmxpc3RlLmg+CisKK21peGVkICplcndhcnRlOworCisjZGVmaW5lIE1JTihhLGIpICAgICgoKGEpID4gKGIpKSA/IChiKSA6IChhKSkKKyNkZWZpbmUgQUJTKGEpICAgICAgKCgoYSkgPCAwKSA/IC0oYSkgOiAoYSkpCisKKworLy8gYWxzIEZ1bmt0aW9uIHN0YXR0IGFscyBkZWZpbmUsIGRhIGFscyBsZnVuLUNsb3N1cmUgZ2VudXR6dAorcHJpdmF0ZSBpbnQgaXNfYWxwaF9ncmVhdGVyKCBvYmplY3QgYSwgb2JqZWN0IGIgKQoreworICAgIHJldHVybiBnZXRldWlkKGEpID4gZ2V0ZXVpZChiKTsKK30KKworCisvLyBrZWluZSBBaG51bmcsIHdlciBzaWNoIF9kaWVfIEJlcmVjaG51bmdzZ3J1bmRsYWdlIGF1c2dlZGFjaHQgaGF0LgorLy8gQWJlciBkYSBzaWUgc2Nob24gdXJhbHQgaXN0LCBibGVpYnQgc2llIGF1Y2ggZHJpbiA7LSkKK3ByaXZhdGUgaW50IGlzX2dyZWF0ZXIoIG9iamVjdCBhLCBvYmplY3QgYiApCit7CisgICAgaW50IGExLCBiMTsKKyAgICAKKyAgICBhMSA9IDI2MDAwICogcXVlcnlfd2l6X2xldmVsKGEpICsKKyAgICAgICAgMjYgKiBNSU4oIDIxMjEsIEFCUyhhLT5RdWVyeVByb3AoUF9MRVZFTCkpICkgKyBnZXR1aWQoYSlbMF0tJ2EnOworICAgIAorICAgIGIxID0gMjYwMDAgKiBxdWVyeV93aXpfbGV2ZWwoYikgKworICAgICAgICAyNiAqIE1JTiggMjEyMSwgQUJTKGItPlF1ZXJ5UHJvcChQX0xFVkVMKSkgKSArIGdldHVpZChiKVswXS0nYSc7CisgICAgCisgICAgcmV0dXJuIGExID4gYjE7Cit9CisKKworcHJpdmF0ZSBzdHJpbmcgc3RhdCggb2JqZWN0IG9iLCBpbnQgaXN0X21hZ2llciApCit7CisgICAgaW50IGw7CisgIAorICAgIGwgPSBxdWVyeV93aXpfbGV2ZWwob2IpOworICAgIAorICAgIGlmICggb2ItPlF1ZXJ5KFBfVEVTVFBMQVlFUikgKXsKKyAgICAgICAgaWYgKCBsIDwgU0VFUl9MVkwgKQorICAgICAgICAgICAgcmV0dXJuICJ0IjsKKyAgICAgICAgZWxzZSBpZiAoIGwgPCBMRUFSTkVSX0xWTCApCisgICAgICAgICAgICByZXR1cm4gIlQiOworICAgIH0KKyAgICAKKyAgICBpZiAoIG9iLT5RdWVyeShQX1NFQ09ORCkpIHsKKyAgICAgIGlmIChvYi0+UXVlcnkoUF9TRUNPTkRfTUFSSykgPiAtMSApeworICAgICAgICBpZiAoIGwgPCBTRUVSX0xWTCApCisgICAgICAgICAgICByZXR1cm4gInoiOworICAgICAgICBlbHNlIGlmICggbCA8IExFQVJORVJfTFZMICkKKyAgICAgICAgICAgIHJldHVybiAiWiI7CisgICAgICB9IGVsc2UKKyAgICAgIGlmIChpc3RfbWFnaWVyKSB7CisgICAgICAgIGlmICggbCA8IFNFRVJfTFZMICkKKyAgICAgICAgICAgIHJldHVybiAibiI7CisgICAgICAgIGVsc2UgaWYgKCBsIDwgTEVBUk5FUl9MVkwgKQorICAgICAgICAgICAgcmV0dXJuICJOIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBzd2l0Y2gobCl7CisgICAgY2FzZSBHT0RfTFZMIC4uIDY2NjoKKyAgICAgICAgcmV0dXJuICJHIjsKKyAgICBjYXNlIEFSQ0hfTFZMIC4uIEdPRF9MVkwtMToKKyAgICAgICAgcmV0dXJuICJFIjsKKyAgICBjYXNlIEVMREVSX0xWTCAuLiBBUkNIX0xWTC0xOgorICAgICAgICByZXR1cm4gIlciOworICAgIGNhc2UgTE9SRF9MVkwgLi4gRUxERVJfTFZMLTE6CisgICAgICAgIHJldHVybiAiUiI7CisgICAgY2FzZSBTUEVDSUFMX0xWTCAuLiBMT1JEX0xWTC0xOgorICAgICAgICByZXR1cm4gIkgiOworICAgIGNhc2UgRE9NQUlOTUVNQkVSX0xWTCAuLiBTUEVDSUFMX0xWTC0xOgorICAgICAgICByZXR1cm4gIk0iOworICAgIGNhc2UgV0laQVJEX0xWTCsxIC4uIERPTUFJTk1FTUJFUl9MVkwtMToKKyAgICAgICAgcmV0dXJuICJtIjsKKyAgICBjYXNlIExFQVJORVJfTFZMIC4uIFdJWkFSRF9MVkw6CisgICAgICAgIHJldHVybiAiTCI7CisgICAgY2FzZSBTRUVSX0xWTCAuLiBMRUFSTkVSX0xWTC0xOgorICAgICAgICByZXR1cm4gIlMiOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAicyI7CisgICAgfQorICAgIHJldHVybiAicyI7Cit9CisKKworcHJpdmF0ZSBzdHJpbmcgaWRsZXN0YXQoIG9iamVjdCBvYiApCit7CisgICAgc3dpdGNoKCBxdWVyeV9pZGxlKG9iKSApeworICAgIGNhc2UgMTgwMCAuLiA3MTk5OgorICAgICAgICByZXR1cm4gImoiOworICAgIGNhc2UgNjAwIC4uIDE3OTk6CisgICAgICAgIHJldHVybiAiSSI7CisgICAgY2FzZSAxMjAgLi4gNTk5OgorICAgICAgICByZXR1cm4gImkiOworICAgIGNhc2UgMCAuLiAxMTk6CisgICAgICAgIHJldHVybiAiLiI7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuICJKIjsKKyAgICB9CisgICAgcmV0dXJuICIuIjsKK30KKworCitwcml2YXRlIHN0cmluZyB3ZWdzdGF0KCBvYmplY3Qgb2IgKQoreworICAgIGlmICggb2ItPlF1ZXJ5UHJvcChQX0FXQVkpICkKKyAgICAgICAgcmV0dXJuICJ3IjsKKyAgICAKKyAgICByZXR1cm4gIi4iOworfQorCisKK3ByaXZhdGUgc3RyaW5nIGhjc3RhdCggb2JqZWN0IG9iICkKK3sKKyAgICBpbnQgaGNzdGF0OworICAgIAorICAgIGhjc3RhdD1vYi0+cXVlcnlfaGNfcGxheSgpOworICAgIAorICAgIGlmKCFoY3N0YXQpCisgICAgeworICAgICAgcmV0dXJuICIuIjsKKyAgICB9CisgICAgCisgICAgaWYoaGNzdGF0PjEpCisgICAgICAgIHJldHVybiAiKyI7CisgICAgCisgICAgcmV0dXJuICJjIjsKKworfQorCisKK3ByaXZhdGUgc3RyaW5nIGdldF9sb2NhdGlvbiggb2JqZWN0IG9iICkKK3sKKyAgICBzdHJpbmcgcmVzOworCisgICAgaWYgKCBzdHJpbmdwKHJlcyA9IG9iLT5RdWVyeShQX0xPQ0FUSU9OKSkgKQorICAgICAgICByZXMgPSBjYXBpdGFsaXplKHJlcykgKyAiICh1ZWJlciAiICsgY291bnRyeShvYikgKyAiKSI7CisgICAgZWxzZQorICAgICAgICByZXMgPSBjb3VudHJ5KG9iKTsKKworICAgIHJldHVybiByZXM7Cit9CisKKwordmFyYXJncyBwcml2YXRlIG1peGVkCitRdWVyeVZpZXcoIG9iamVjdCBvYiwgaW50IGlzdF9tYWdpZXIsIGludCBzaCwKKyAgICAgICAgICAgaW50IG9icywgc3RyaW5nIHR0eSwgc3RyaW5nIG9wdCApCit7CisgICAgc3RyaW5nIHJhY2UsIHJldCwgdG1wLCBwcmVmaXgsIGFfcHJlZml4LCBub3JtYWw7CisKKyAgICBpZiAoICFpc3RfbWFnaWVyICYmIG9iLT5RdWVyeVByb3AoUF9JTlZJUykgKQorICAgICAgICByZXR1cm4gIiI7CisgICAgCisgICAgcHJlZml4ID0gIiI7CisgICAgYV9wcmVmaXggPSAiIjsKKyAgICAgICAgCisgICAgcmV0ID0gY2FwaXRhbGl6ZShnZXR1aWQob2IpKTsKKyAgICAKKyAgICBzd2l0Y2godHR5KXsKKyAgICBjYXNlICJhbnNpIjoKKyAgICAgICAgaWYgKCBJU19MRUFSTkVSKG9iKSApCisgICAgICAgICAgICBhX3ByZWZpeCA9IEFOU0lfVU5ERVJMOworICAgICAgICAKKyAgICAgICAgaWYgKCBvYi0+UXVlcnlQcm9wKFBfRlJPRykgKQorICAgICAgICAgICAgYV9wcmVmaXggKz0gQU5TSV9HUkVFTjsKKworICAgICAgICBpZiAoIHBvaW50ZXJwKGVyd2FydGUpICYmIG1lbWJlciggZXJ3YXJ0ZSwgcmV0ICkgIT0gLTEgKQorICAgICAgICAgICAgYV9wcmVmaXggKz0gQU5TSV9SRUQ7CisgICAgICAgIAorICAgICAgICBub3JtYWwgPSBBTlNJX05PUk1BTDsKKyAgICAgICAgYnJlYWs7CisgICAgICAgIAorICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICggcG9pbnRlcnAoZXJ3YXJ0ZSkgJiYgbWVtYmVyKCBlcndhcnRlLCByZXQgKSAhPSAtMSApCisgICAgICAgICAgICBwcmVmaXggPSAiKiI7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHByZWZpeCA9ICIiOworCisgICAgICAgIG5vcm1hbCA9ICIiOworICAgIH0KKworICAgIGlmICggcmV0ID09IFJPT1RJRCApCisgICAgICAgIHJldCA9ICJMb2dvbiI7CisKKyAgICBpZiAoIHNoICl7IC8vIGt3ZXIKKyAgICAgICAgaWYgKCBvYi0+UXVlcnlQcm9wKFBfSU5WSVMpICkKKyAgICAgICAgICAgIHJldCA9IHNwcmludGYoICIlcyglLTExJy4ncykuJXMlcyIsIGFfcHJlZml4LCBwcmVmaXggKyByZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaGNzdGF0KG9iKSArIGlkbGVzdGF0KG9iKSArIHdlZ3N0YXQob2IpICsgc3RhdChvYixpc3RfbWFnaWVyKSwgbm9ybWFsICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldCA9IHNwcmludGYoICIlcyUtMTMnLidzLiVzJXMiLCBhX3ByZWZpeCwgcHJlZml4ICsgcmV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGhjc3RhdChvYikgKyBpZGxlc3RhdChvYikgKyB3ZWdzdGF0KG9iKSArIHN0YXQob2IsaXN0X21hZ2llciksIG5vcm1hbCApOworICAgIH0gCisgICAgZWxzZSBpZiAoIG9wdCA9PSAiayIgKXsgLy8gd2VyIC1rCisgICAgICAgIHJldCA9IHNwcmludGYoICJbJXNdICUtMTNzICUxNXMgLyAlLTIwcyAlMjJzIiwgc3RhdChvYixpc3RfbWFnaWVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgb2ItPlF1ZXJ5UHJvcChQX0lOVklTKSA/ICIoIiArIHJldCArICIpIiA6IHJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5ncChyYWNlID0gb2ItPlF1ZXJ5UHJvcChQX1JBQ0UpKSA/CisgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUocmFjZSlbMC4uMTRdIDogIjxrZWluZSBSYXNzZT4iLAorICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdwKHJhY2UgPSBvYi0+UXVlcnlQcm9wKFBfR1VJTEQpKSA/CisgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUocmFjZSlbMC4uMTldIDogIjxrZWluZSBHaWxkZT4iLAorICAgICAgICAgICAgICAgICAgICAgICAiWyIgKyBjb3VudHJ5KG9iKVswLi4xOV0gKyAiXSIgKTsKKyAgICB9IAorICAgIGVsc2UgeyAvLyB3ZXIsIHdlciAtbywgd2VyIC1zCisgICAgICAgIGlmICggdG1wID0gb2ItPnNob3J0KCkgKXsKKyAgICAgICAgICAgIHJldCA9IHRtcFswLi48M107CisKKyAgICAgICAgICAgIGlmICggb2ItPlF1ZXJ5UHJvcChQX1RFQU0pICkKKyAgICAgICAgICAgICAgICByZXQgPSBvYi0+VGVhbVByZWZpeCgpICsgcmV0OworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHJldCA9ICIoIiArIHJldCArICIpIjsKKworICAgICAgICBpZiAoICFJU19MRUFSTkVSKG9iKSAmJiBvYi0+UXVlcnkoUF9URVNUUExBWUVSKSApCisgICAgICAgICAgICB0bXAgPSAiIDxUZXN0U3BpZWxlcj4iOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0bXAgPSAiIjsKKworICAgICAgICBpZiAoICFJU19MRUFSTkVSKG9iKSAmJiBvYi0+UXVlcnlQcm9wKFBfU0VDT05EKSAmJgorICAgICAgICAgICAgIG9iLT5RdWVyeVByb3AoUF9TRUNPTkRfTUFSSykgPiAtMSApCisgICAgICAgICAgICB0bXAgKz0gIiA8WndlaXRpZT4iOworICAgICAgICAKKyAgICAgICAgcmV0ID0gc3ByaW50ZiggIiVzJXMgLSAlcyVzJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAob3B0ID09ICJvIikgPyAiIiA6ICJbIiArIHN0YXQob2IsaXN0X21hZ2llcikgKyAiXSAiLCByZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3AocmFjZSA9IG9iLT5RdWVyeVByb3AoUF9SQUNFKSkgPworICAgICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplKHJhY2UpIDogIjxrZWluZSBSYXNzZT4iLAorICAgICAgICAgICAgICAgICAgICAgICAob3B0ID09ICJzIikgPyAiIC0gWyIgKyBnZXRfbG9jYXRpb24ob2IpICsgIl0iIDoKKyAgICAgICAgICAgICAgICAgICAgICAgKHN0cmluZ3AocmFjZSA9IG9iLT5RdWVyeVByb3AoUF9HVUlMRCkpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICIvIiArIGNhcGl0YWxpemUocmFjZSkgOiAiLzxrZWluZSBHaWxkZT4iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgKG9wdCA9PSAibyIpID8gdG1wIDogIiIgKTsKKyAgICB9CisgICAgICAgICAgICAKKyAgICBpZiAoIG9icyApCisgICAgICAgIHJldHVybiAoeyBvYiwgcmV0IH0pOworICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHJldDsKK30KKworCitwcml2YXRlIG9iamVjdCAqbWFrZV91bmlxdWUoIG9iamVjdCogYXJyICkKK3sKKyAgICBpbnQgaTsKKworICAgIC8vIG11c3MgdWViZXIgZWluZSBTY2hsZWlmZSBnZW1hY2h0IHdlcmRlbiwgdW0gZGllIFJlaWhlbmZvbGdlIHp1IGVyaGFsdGVuIQorICAgIGZvciAoIGkgPSBzaXplb2YoYXJyKTsgaS0tID4gMTsgKQorICAgICAgICBpZiggYXJyW2ldID09IGFycltpLTFdICkKKyAgICAgICAgICAgIGFycltpXSA9IDA7CisKKyAgICByZXR1cm4gYXJyIC0gKHsgMCB9KTsKK30KKworCisjZGVmaW5lIE9GRlNFVChzcCkgICgobWF4aS80KSAqIHNwICsgKChzcCA8PSBtYXhpJTQpID8gc3AgOiBtYXhpJTQpKQorCisvLyBkaWVzZSBGdW5rdGlvbiB3aXJkIHZvbiBhdXNzZW4gYXVmZ2VydWZlbiBmdWVyIGRpZSBCZWZlaGxlICJ3ZXIiICYgQ28KK3B1YmxpYyB2YXJhcmdzIHN0cmluZworKlF1ZXJ5V2hvTGlzdGUoIGludCBpc3RfbWFnaWVyLCBpbnQgc2hvcnQsIGludCBvYnMsIHN0cmluZyBhcmcsIGludCBvbGQgKQoreworICAgIG9iamVjdCAqcGw7CisgICAgc3RyaW5nICpwbHMsICpzLCBvcHQ7CisgICAgaW50IGksIGosIGssIGwsICp0LCBtYXhpOworCisgICAgZXJ3YXJ0ZSA9IDA7CisgICAgCisgICAgaWYgKCBzaG9ydCAmIFdIT19TSE9SVCApeworICAgICAgICBpZiAoIHByZXZpb3VzX29iamVjdCgpICkKKyAgICAgICAgICAgIGVyd2FydGUgPSBwcmV2aW91c19vYmplY3QoKS0+UXVlcnlQcm9wKFBfV0FJVEZPUik7CisgICAgICAgIAorICAgICAgICBpZiAoICFwb2ludGVycChlcndhcnRlKSApCisgICAgICAgICAgICBlcndhcnRlID0gKHt9KTsKKyAgICB9CisKKyAgICAvLyBXZXIgU3BpZWxlcnNpY2h0IG1vZWNodGUsIHNvbGwgU3BpZWxlcnNpY2h0IGJla29tbWVuCisgICAgaWYgKCBzaG9ydCAmIFdIT19QTEFZRVJfVklFVyApCisgICAgewkgICAgCisJICAgIGlzdF9tYWdpZXIgPSAwOworICAgIH0KKworICAgIAorICAgIGlmICggb2xkICl7CisgICAgICAgIG9wdCA9ICJvIjsKKyAgICAgICAgYXJnID0gMDsKKyAgICB9CisgICAgZWxzZSBpZiAoIGFyZyA9PSAiayIgfHwgYXJnID09ICJzIiApeworICAgICAgICBvcHQgPSBhcmc7CisgICAgICAgIGFyZyA9IDA7CisgICAgfQorICAgIGVsc2UgaWYgKCBzaXplb2YoYXJnKSA9PSAxICkgLy8gKG5vY2gpIHVuYmVrYW5udGUgT3B0aW9uCisgICAgICAgIGFyZyA9IDA7CisgIAorICAgIHBsID0gZmlsdGVyX3VzZXJzKGFyZyk7CisgICAgCisgICAgaWYgKCBzaG9ydCAmIFdIT19BTFBIQSApCisgICAgICAgIHBsID0gc29ydF9hcnJheSggcGwsICMnaXNfYWxwaF9ncmVhdGVyLyonKi8gKTsKKyAgICBlbHNlCisgICAgICAgIHBsID0gc29ydF9hcnJheSggcGwsICMnaXNfZ3JlYXRlci8qJyovICk7CisgICAgCisgICAgcGwgPSBtYWtlX3VuaXF1ZSggcGwgKTsKKyAgICAKKyAgICBwbHMgPSBtYXAoIHBsLCAjJ1F1ZXJ5Vmlldy8qJyovLCBpc3RfbWFnaWVyLCBzaG9ydCwgb2JzLAorICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXNfb2JqZWN0KCktPlF1ZXJ5UHJvcChQX1RUWSksIG9wdCApIC0gKHsiIn0pOworICAgIAorICAgIGlmICggIShzaG9ydCAmIFdIT19TSE9SVCkgKQorICAgICAgICByZXR1cm4gcGxzOworICAgIAorICAgIG1heGkgPSBzaXplb2YocGxzKTsKKyAgICBzID0gYWxsb2NhdGUoIG1heGkgLyA0ICsgKG1heGkgJSA0ID8gMSA6IDApICk7CisgICAgCisgICAgaWYgKCBzaG9ydCAmIFdIT19WRVJUSUNBTCApIHsgLy8gc2Vua3JlY2h0IHNvcnRpZXJlbiAhCisgICAgICAgIC8vIHdpcmQgc28gbnVyIGVpbm1hbCBiZXJlY2huZXQKKyAgICAgICAgdCA9ICh7IDAsIE9GRlNFVCgxKSwgT0ZGU0VUKDIpLCBPRkZTRVQoMyksIG1heGkgfSk7CisgICAgICAgIAorICAgICAgICBmb3IgKCBpID0gMCwgbCA9IHNpemVvZihzKTsgaSA8IGw7IGkrKyApIHsKKyAgICAgICAgICAgIHNbaV0gPSAiIjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgZm9yICggaiA9IDA7IGogPCA0OyBqKysgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAoayA9IGkrdFtqXSkgPCB0W2orMV0gJiYgcGxzW2tdICE9ICIiICkKKyAgICAgICAgICAgICAgICAgICAgc1tpXSArPSBwbHNba107CisgICAgICAgICAgICAgICAgCisgICAgICAgICAgICAgICAgaWYoIGogPCAzICkKKyAgICAgICAgICAgICAgICAgICAgc1tpXSArPSAiICI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgbWF4aTsgaSsrICkgeworICAgICAgICAgICAgaWYgKCAhc1tpLzRdICkKKyAgICAgICAgICAgICAgICBzW2kvNF0gPSAiIjsKKyAgICAgICAgICAgIAorICAgICAgICAgICAgaWYgKCBwbHNbaV0gIT0gIiIgKQorICAgICAgICAgICAgICAgIHNbaS80XSArPSBwbHNbaV07CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICggKGklNCAhPSAzKSAmJiBpIDwgbWF4aS0xICkKKyAgICAgICAgICAgICAgICBzW2kvNF0gKz0gIiAiOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuICh7IHNwcmludGYoICIlfDc4cyIsICJMaXN0ZSBkZXIgTWl0c3BpZWxlciB2b20gIiArIGR0aW1lKHRpbWUoKSkgKworICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggIiAoJWQgVGVpbG5laG1lcikiLCBtYXhpICkpLCAiIiB9KSArIHM7Cit9CisKKworcHVibGljIHZhcmFyZ3MgaW50IHF1ZXJ5X3ByZXZlbnRfc2hhZG93KCBvYmplY3Qgb2IgKQoreworICAgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvb2JqL3plaXR1bmdzYXV0b21hdC5jIGIvb2JqL3plaXR1bmdzYXV0b21hdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNzFkMWQKLS0tIC9kZXYvbnVsbAorKysgYi9vYmovemVpdHVuZ3NhdXRvbWF0LmMKQEAgLTAsMCArMSw2OSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8gCisvLyB6ZWl0dW5nc2F1dG9tYXQuYyAtLSBaZWl0dW5nc2F1dG9tYXQgaW4gZGVyIEFiZW50ZXVyZXJnaWxkZQorLy8gCisvLyAkSWQ6CXplaXR1bmdzYXV0b21hdC5jIDY0MzcgMjAwNy0wOC0xOCAyMjo1ODo1OFogWmVzc3RyYSAkCisvLyAKKworaW5oZXJpdCAiL3N0ZC90aGluZyI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8d3d3Lmg+CisKKyNkZWZpbmUgWkVJVFVORyAiL29iai9tcGEiCisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgaWYgKCFjbG9uZXAodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX1NIT1JULCJFaW5lIFplaXR1bmciKTsKKyAgU2V0UHJvcChQX0xPTkcsIAorICAgICJIaWVyIHN0ZWhlbiBpbW1lciBkaWUgbmV1ZXN0ZW4gTmFjaHJpY2h0ZW4gdW5kIEdlcnVlY2h0ZSBkcmluLlxuIik7CisgIFNldFByb3AoUF9OQU1FLCJaZWl0dW5nIik7CisgIEFkZElkKCh7InplaXR1bmciLCJtcGEiLCJzZXJ2aWNlcGFrZXQifSkpOworICBTZXRQcm9wKFBfR0VOREVSLEZFTUFMRSk7CisgIFNldFByb3AoUF9OT0dFVCwxKTsKKyAgU2V0UHJvcChQX1BJQ0tfTVNHLCBOT19QTkdfTVNHKTsKKyAgU2V0UHJvcChQX0FSVElDTEUsMSk7CisgIFNldFByb3AoUF9XV1dJTkZPLCAiTWFuIGthbm4gZGllIE1QQSBhdWNoIDxBIEhSRUY9XCJodHRwOi8vIgorICAgICAgK1NFUlZFUitNVURXV1cgKyAiPyIgK1JFUSArICI9IiArIFJfTkVXUyArICJcIj5sZXNlbjwvQT4iKTsKK30KKworaW50IGdldChvYmplY3QgdGFyZykgeworICBpbnQgcmVzOworCisgIGlmICghb2JqZWN0cCh0YXJnKSB8fCAhaW50ZXJhY3RpdmUodGFyZykpCisgICAgcmV0dXJuIE1FX0NBTlRfQkVfVEFLRU47CisgIAorICBpZiAocHJlc2VudF9jbG9uZShaRUlUVU5HLCB0YXJnKSkgeworICAgIHRlbGxfb2JqZWN0KHRhcmcsICJEdSBoYXN0IGRvY2ggYmVyZWl0cyBlaW5lIFplaXR1bmcuXG4iKTsKKyAgICByZXR1cm4gTUVfQ0FOVF9CRV9UQUtFTjsKKyAgfQorICAKKyAgb2JqZWN0IHplaXR1bmc9Y2xvbmVfb2JqZWN0KCIvb2JqL21wYSIpOworICBpZiAoKHJlcz16ZWl0dW5nLT5tb3ZlKHRhcmcsTV9HRVQpKSA9PSBNT1ZFX09LKSB7CisgICAgdGVsbF9vYmplY3QodGFyZywgIkR1IG5pbW1zdCBkaWUgWmVpdHVuZy4gU29mb3J0IGVyc2NoZWludCBhdWYgIgorCSJ1bmVya2xhZXJsaWNoZSBXZWlzZSBlaW5lIG5ldWUuXG4iKTsKKyAgICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQodGFyZyksIGJyZWFrX3N0cmluZygKKwl0YXJnLT5uYW1lKFdFUikgKyAiIG5pbW10IGRpZSBaZWl0dW5nLiBTb2ZvcnQgZXJzY2hlaW50IGF1ZiAiCisJInVuZXJrbGFlcmxpY2hlIFdlaXNlIGVpbmUgbmV1ZS5cbiIsNzgpLCh7dGFyZ30pKTsKKyAgfQorICBlbHNlIHsKKyAgICB0ZWxsX29iamVjdCh0YXJnLCAiRHUga2FubnN0IGRpZSBaZWl0dW5nIGxlaWRlciBuaWNodCBtZWhyIHRyYWdlbi5cbiIpOworICAgIHplaXR1bmctPnJlbW92ZSgxKTsKKyAgfQorICAKKyAgcmV0dXJuIHJlczsKK30KKwordmFyYXJncyBpbnQgbW92ZShvYmplY3QgdGFyZ2V0LCBtaXhlZCBtZXRob2QpCit7CisgIGlmIChtZXRob2QmTV9HRVQgJiYgbGl2aW5nKHRhcmdldCkpCisgICAgcmV0dXJuIGdldCh0YXJnZXQpOworICAKKyAgcmV0dXJuIDo6bW92ZSh0YXJnZXQsbWV0aG9kKTsKK30KKwo=