ZGlmZiAtLWdpdCBhL3Jvb20vY2h1cmNoLmMgYi9yb29tL2NodXJjaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MzliMjMKLS0tIC9kZXYvbnVsbAorKysgYi9yb29tL2NodXJjaC5jCkBAIC0wLDAgKzEsNDEgQEAKK2luaGVyaXQgIi9zdGQvcm9vbSI7CisKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisKK2NyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9MSUdIVCwxKTsKKyAgU2V0UHJvcChQX0lOVF9TSE9SVCwiVmlsbGFnZSBjaHVyY2giKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorICAgIllvdSBhcmUgaW4gdGhlIGxvY2FsIHZpbGxhZ2UgY2h1cmNoLlxuVGhlcmUgaXMgYSBodWdlIHBpdCBpbiB0aGUgY2VudGVyLFxuIiArCisJICJhbmQgYSBkb29yIGluIHRoZSB3ZXN0IHdhbGwuIFRoZXJlIGlzIGEgYnV0dG9uIGJlc2lkZSB0aGUgZG9vci5cbiIrCisgICAiVGhpcyBjaHVyY2ggaGFzIHRoZSBzZXJ2aWNlIG9mIHJldml2aW5nIGdob3N0cy4gRGVhZCBwZW9wbGUgY29tZVxuIisKKyAgICJ0byB0aGUgY2h1cmNoIGFuZCBwcmF5LlxuIisKKyAgICJUaGVyZSBpcyBhIGNsb2NrIG9uIHRoZSB3YWxsLlxuIisKKyAgICJUaGVyZSBpcyBhbiBleGl0IHRvIHNvdXRoLlxuIik7CisgIEFkZERldGFpbCgicGl0IiwiSW4gdGhlIG1pZGRsZSBvZiB0aGUgY2h1cmNoIGlzIGEgZGVlcCBwaXQuXG4iKworICAgICAgICAiSXQgd2FzIHVzZWQgZm9yIHNhY3JpZmljZSBpbiB0aGUgb2xkIHRpbWVzLCBidXQgbm93YWRheXNcbiIgKworICAgICAgICAiaXQgaXMgb25seSBsZWZ0IGZvciB0b3VyaXN0cyB0byBsb29rIGF0LlxuIik7CisgIEFkZERldGFpbCgoeyJlbGV2YXRvciIsImRvb3IiLCJidXR0b24ifSksCisgICAgICAgICAgICAiVGhlIGVsZXZhdG9yIGRvZXNuJ3Qgd29yayBhbnkgbW9yZS4gSXQgbXVzdCBiZSBhIHJlbGljdCBmcm9tIGFub3RoZXIgdGltZSxcbiIrCisgICAgICAgICAgICAiYSBsb25nLWdvbmUgdGltZSwgYXMgdGhpcyB3aG9sZSBidWlsZGluZy5cbiIpOworICBBZGREZXRhaWwoImNsb2NrIiwiVGhlIGNsb2NrIHNob3dzIHRoaXMgZ2FtZSBoYXNuJ3QgYmVlbiByZWJvb3RlZCBmb3IgY2VudHVyaWVzLiBUaW1lIGlzXG4iKworICAgICAgICAgICAgICAgICAgICAic3RhbmRpbmcgc3RpbGwgaW4gdGhpcyBzdHJhbmdlIHJvb20uXG4iKTsKKyAgQWRkQ21kKCJwcmF5IiwicHJheSIpOworICBBZGRDbWQoIm9wZW4iLCJvcGVuIik7CisgIEFkZENtZCgicHVzaCIsIm9wZW4iKTsKK30KKworb3BlbigpCit7CisgIG5vdGlmeV9mYWlsKCJUaGUgZWxldmF0b3IgZG9lc24ndCB3b3JrIGFueW1vcmUsIHNvcnJ5LlxuIik7CisgIHJldHVybiAwOworfQorCitwcmF5KCkKK3sKKyAgd3JpdGUoIlRoZSBnb2RzIHRoaXMgY2h1cmNoIHdhcyBidWlsdCBmb3IgaGF2ZSBkaWVkIGFuIGV4dHJlbWx5IGxvbmcgdGltZSBhZ28uXG4iKTsKKyAgcmV0dXJuIDE7Cit9CisKZGlmZiAtLWdpdCBhL3Jvb20vZGVhdGgvZGVhdGhfbWFyay5jIGIvcm9vbS9kZWF0aC9kZWF0aF9tYXJrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIxOTAxNgotLS0gL2Rldi9udWxsCisrKyBiL3Jvb20vZGVhdGgvZGVhdGhfbWFyay5jCkBAIC0wLDAgKzEsNjcgQEAKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisKKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKworaW5oZXJpdCAic3RkL3RoaW5nIjsKKwordm9pZCBjcmVhdGUoKQoreworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKCBQX05BTUUsICJTdGVtcGVsIGRlcyBUb2RlcyIgKTsKKyAgU2V0UHJvcCggUF9HRU5ERVIsIE1BTEUgKTsKKyAgU2V0UHJvcCggUF9TSE9SVCwgMCApOworICBTZXRQcm9wKCBQX0lOVklTLCAxICk7CisgIFNldFByb3AoIFBfTkVWRVJEUk9QLCAxICk7CisgIFNldFByb3AoIFBfV0VJR0hULCAwKTsKKyAgQWRkSWQoKHsiZGVhdGhfbWFyayIsIlxuZGVhdGhfbWFyayJ9KSk7Cit9CisKK3ZvaWQgcmVzZXQoKQoreworICA6OnJlc2V0KCk7CisgIGlmIChlbnZpcm9ubWVudCgpICYmICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKGVudmlyb25tZW50KCkpKQorICAgIHJlbW92ZSgpOworfQorCisKKy8qCisgKiBGdW5jdGlvbiBuYW1lOiBzdGFydF9kZWF0aAorICogRGVzY3JpcHRpb246ICAgU3RhcnQgdGhlIGRlYXRoIHNlcXVlbmNlLgorICovCit2b2lkIHN0YXJ0X2RlYXRoKCkKK3sKKyAgaWYgKCAhZW52aXJvbm1lbnQoKSB8fCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZShlbnZpcm9ubWVudCgpKQorICAgICAgIHx8ICFlbnZpcm9ubWVudCgpLT5RdWVyeVByb3AoUF9HSE9TVCkgKQorICB7CisgICAgICBkZXN0cnVjdCh0aGlzX29iamVjdCgpKTsKKyAgICAgIHJldHVybjsKKyAgfQorCisgIHNheSgiRHUgc2llaHN0IGVpbmUgZHVua2xlIEdlc3RhbHQsIGRpZSBldHdhcyBEdW5zdCBlaW5zYW1tZWx0IC4uLiBvZGVyIHZpZWxsZWljaHRcbiIrCisgICAgICAiYmlsZGVzdCBkdSBEaXIgZGFzIGF1Y2ggbnVyIGVpbiAuLi5cbiIpOworIGVudmlyb25tZW50KCktPm1vdmUoIi9yb29tL2RlYXRoL3ZpcnR1YWwvZGVhdGhfcm9vbV8iK2dldHVpZChlbnZpcm9ubWVudCgpKSwKKwkJICAgICBNX0dPfE1fU0lMRU5UfE1fTk9fU0hPV3xNX05PQ0hFQ0spOworIC8vIGRpcmVrdCBpbiB2aXJ0dWVsbGVuIFRvZGVzcmF1bSBtb3ZlbgorfQorCitwcm90ZWN0ZWQgaW50IFByZXZlbnRNb3ZlKG9iamVjdCBkZXN0LCBvYmplY3Qgb2xkZW52LCBpbnQgbWV0aG9kKSB7CisgIC8vIHdlbm4gZGllIG1hcmtlIHNjaG9uIGVpbiBFbnYgaGF0IG9kZXIgZGVyIG1vdmUgbmljaHQgaW4gZWluZW4gU3BpZWxlcgorICAvLyBnZWh0LCBnZWh0cyBudXIgbWl0IE1fTk9DSEVDSy4KKyAgaWYgKCAoZW52aXJvbm1lbnQodGhpc19vYmplY3QoKSkgfHwgIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoZGVzdCkpIAorICAgICAgJiYgIShtZXRob2QgJiBNX05PQ0hFQ0spKSB7CisgICAgcmV0dXJuIE1FX0NBTlRfQkVfRFJPUFBFRDsKKyAgfQorCisgIHJldHVybiA6OlByZXZlbnRNb3ZlKGRlc3QsIG9sZGVudiwgbWV0aG9kKTsKK30KKworaW50IF9xdWVyeV9hdXRvbG9hZG9iaigpIHsgcmV0dXJuIDE7IH0KKwordm9pZCBpbml0KCkKK3sKKyAgOjppbml0KCk7CisgIGlmICh0aGlzX3BsYXllcigpID09IGVudmlyb25tZW50KCkpCisgICAgc3RhcnRfZGVhdGgoKTsKK30KZGlmZiAtLWdpdCBhL3Jvb20vZGVhdGgvZGVhdGhfbWFya19ob29rZWQuYyBiL3Jvb20vZGVhdGgvZGVhdGhfbWFya19ob29rZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTA5ZThmCi0tLSAvZGV2L251bGwKKysrIGIvcm9vbS9kZWF0aC9kZWF0aF9tYXJrX2hvb2tlZC5jCkBAIC0wLDAgKzEsNjYgQEAKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisKKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KKyNpbmNsdWRlIDxuZXdfc2tpbGxzLmg+CisKK2luaGVyaXQgInN0ZC90aGluZyI7CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcCggUF9OQU1FLCAiU3RlbXBlbCBkZXMgVG9kZXMiICk7CisgIFNldFByb3AoIFBfR0VOREVSLCBNQUxFICk7CisgIFNldFByb3AoIFBfU0hPUlQsIDAgKTsKKyAgU2V0UHJvcCggUF9JTlZJUywgMSApOworICBTZXRQcm9wKCBQX05FVkVSRFJPUCwgMSApOworICBBZGRJZCgoeyJkZWF0aF9tYXJrIiwiXG5kZWF0aF9tYXJrIn0pKTsKK30KKwordm9pZCByZXNldCgpCit7CisgIDo6cmVzZXQoKTsKKyAgaWYgKGVudmlyb25tZW50KCkgJiYgIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoZW52aXJvbm1lbnQoKSkpCisgICAgcmVtb3ZlKCk7Cit9CisKKworLyoKKyAqIEZ1bmN0aW9uIG5hbWU6IHN0YXJ0X2RlYXRoCisgKiBEZXNjcmlwdGlvbjogICBTdGFydCB0aGUgZGVhdGggc2VxdWVuY2UuCisgKi8KK3ZvaWQgc3RhcnRfZGVhdGgoKQoreworICBpZiAoICFlbnZpcm9ubWVudCgpIHx8ICFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKGVudmlyb25tZW50KCkpCisgICAgICAgfHwgIWVudmlyb25tZW50KCktPlF1ZXJ5UHJvcChQX0dIT1NUKSApCisgIHsKKyAgICAgIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworICAgICAgcmV0dXJuOworICB9CisKKyAgc2F5KCJEdSBzaWVoc3QgZWluZSBkdW5rbGUgR2VzdGFsdCwgZGllIGV0d2FzIER1bnN0IGVpbnNhbW1lbHQgLi4uIG9kZXIgdmllbGxlaWNodFxuIisKKyAgICAgICJiaWxkZXN0IGR1IERpciBkYXMgYXVjaCBudXIgZWluIC4uLlxuIik7CisgIGVudmlyb25tZW50KCktPm1vdmUoIi9yb29tL2RlYXRoL3ZpcnR1YWwvZGVhdGhfcm9vbV8iK2dldHVpZChlbnZpcm9ubWVudCgpKSwKKwkJICAgICBNX0dPfE1fU0lMRU5UfE1fTk9fU0hPV3xNX05PQ0hFQ0spOworICAvLyBEZXIgZm9sZ2VuZGUgQ29kZSB2ZXJoaW5kZXJ0LCBkYXNzIGVpbiB1bmJlZGFjaHRlciBNYWdpZXIgaW0gaW5pdAorICAvLyBvZGVyIGV4aXQgZWluZW4gU3BpZWxlciB09nRldCwgdW5kIGlobiBkaXJrZXQgZGFuYWNoIG1vdmV0LgorICBlbnZpcm9ubWVudCgpLT5TZXRQcm9wKFBfVE1QX01PVkVfSE9PSywoe3RpbWUoKSsxMCx0aGlzX29iamVjdCgpLCJjYXRjaF9kaWVfbW92ZSJ9KSk7ICAKK30KKwordmFyYXJncyBpbnQgbW92ZShtaXhlZCBkZXN0LG1peGVkIG1ldGhvZCkKK3sJCisgIGlmICghbWV0aG9kICYgTV9OT0NIRUNLKSByZXR1cm4gTUVfQ0FOVF9CRV9EUk9QUEVEOworICByZXR1cm4gOjptb3ZlKGRlc3QsbWV0aG9kKTsKK30KKworaW50IF9xdWVyeV9hdXRvbG9hZG9iaigpIHsgcmV0dXJuIDE7IH0KKworaW50IGNhdGNoX2RpZV9tb3ZlKCkgeyByZXR1cm4gLTE7IH0KKwordm9pZCBpbml0KCkKK3sKKyAgOjppbml0KCk7CisgIGlmICh0aGlzX3BsYXllcigpID09IGVudmlyb25tZW50KCkpCisgICAgc3RhcnRfZGVhdGgoKTsKK30KZGlmZiAtLWdpdCBhL3Jvb20vZGVhdGgvZGVhdGhfcm9vbS5jIGIvcm9vbS9kZWF0aC9kZWF0aF9yb29tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU1OWYyMAotLS0gL2Rldi9udWxsCisrKyBiL3Jvb20vZGVhdGgvZGVhdGhfcm9vbS5jCkBAIC0wLDAgKzEsNjY5IEBACisvLyBNb3JnZW5HcmF1ZW4gTVVEbGliCisvLworLy8gZGVhdGhfcm9vbS5jIC0tIERlciBUb2Rlc3JhdW0KKy8vCisvLyAkSWQ6IGRlYXRoX3Jvb20uYyA5MTM4IDIwMTUtMDItMDMgMjE6NDY6NTZaIFplc3N0cmEgJAorCisKKyNwcmFnbWEgc3RyaWN0X3R5cGVzCisKKyNpbmNsdWRlIDxkZWZpbmVzLmg+CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPGxhbmd1YWdlLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8ZGFlbW9uLmg+CisjaW5jbHVkZSA8bmV3X3NraWxscy5oPgorCitpbmhlcml0ICIvc3RkL3Jvb20iOworCittaXhlZCAqcGxheWVyczsKK21hcHBpbmcgbXNnQ2FjaGU7CisKKworcHJpdmF0ZSB2b2lkIGZsdXNoKCBpbnQgdW51c2VkT25seSApOworcHJpdmF0ZSBzdHJpbmcgZXhwYW5kKCBzdHJpbmcgdGFibGUsIGludCB2YWx1ZSApOworcHJpdmF0ZSBzdHJpbmcgcGFyc2VUZXh0KCBzdHJpbmcgbXNnLCBvYmplY3QgcGwgKTsKK3ByaXZhdGUgdm9pZCBkb19yZW1vdmUoKTsKK3ByaXZhdGUgdmFyYXJncyBtaXhlZCBnZXRfc2VxdWVuY2UoIHN0cmluZyBzdHIgKTsKK3ZvaWQgYWRkX3BsYXllciggb2JqZWN0IHBsICk7CitzdGF0aWMgaW50IGZpbHRlcl9sZGZpZWQoIHN0cmluZyBzdHIgKTsKK3B1YmxpYyBpbnQgU21hcnRMb2coIHN0cmluZyBjcmVhdCwgc3RyaW5nIG15bmFtZSwgc3RyaW5nIHN0ciwgc3RyaW5nIGRhdGUgKTsKK3B1YmxpYyBtaXhlZCBoaWVyX2dlYmxpZWJlbiggbWl4ZWQgZGVzdCwgaW50IG1ldGhvZHMsIHN0cmluZyBkaXJlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyB0ZXh0b3V0LCBzdHJpbmcgdGV4dGluICk7CitwdWJsaWMgdm9pZCBpbml0KCkKK3sKKyAgdGhpc19wbGF5ZXIoKS0+bW92ZSgiL3Jvb20vZGVhdGgvdmlydHVhbC9kZWF0aF9yb29tXyIrZ2V0dWlkKHRoaXNfcGxheWVyKCkpLAorCSAgICAgTV9OT0NIRUNLfE1fU0lMRU5UfE1fTk9fU0hPVyk7CisgIHJldHVybjsKK30KKworcHVibGljIHZvaWQgY3JlYXRlKCkKK3sKKyAgaWYgKElTX0NMT05FKHRoaXNfb2JqZWN0KCkpKSByZXR1cm47CisgICAgOjpjcmVhdGUoKTsKKyAgICAKKyAgICBwbGF5ZXJzID0gKHt9KTsKKyAgICBmbHVzaCgwKTsKKworICAgIFNldFByb3AoIFBfTkFNRSwgIkxhcnMiICk7CisgICAgU2V0UHJvcCggUF9HRU5ERVIsIE1BTEUgKTsKKyAgICBTZXRQcm9wKCBQX0FSVElDTEUsIDAgKTsKKyAgICBTZXRQcm9wKCBQX0xJR0hULDEgKTsKKyAgICBTZXRQcm9wKCBQX05PX1RQT1JULCBOT19UUE9SVF9PVVQgKTsKKyAgICBTZXRQcm9wKCBQX0xPR19GSUxFLCAiVE9EL1RvZGVzcmF1bSIgKTsKKyAgICBTZXRQcm9wKCBQX0lOVF9TSE9SVCwgIkFyYmVpdHN6aW1tZXIgZGVzIFRvZGVzIiApOworICAgIFNldFByb3AoIFBfSU5UX0xPTkcsIGJyZWFrX3N0cmluZygKKyAgICAgICAgICAgICAiRWluIGR1bmtsZXIgUmF1bSwgZXJsZXVjaHRldCB2b24gZHVua2xlbSBMaWNodCwgZGFzIHNpY2ggZGVyICIKKyAgICAgICAgICAgICAiRHVua2VsaGVpdCBuaWNodCBzbyBzZWhyIHp1IHdpZGVyc2V0emVuIHNjaGVpbnQsIGluZGVtIGVzICIKKyAgICAgICAgICAgICAibGV1Y2h0ZXQsIGFscyBkYXNzIGVzIGRlciBkdW5rZWxzdGUgUHVua3QgaW4gZWluZXIgd2VuaWdlciAiCisgICAgICAgICAgICAgImR1bmtsZW4gVW1nZWJ1bmcgaXN0LiBJbSBzZWx0c2FtZW4gTGljaHQgZXJrZW5uc3QgRHUgZWluZW4gIisKKyAgICAgICAgICAgICAiemVudHJhbCBhdWZnZXN0ZWxsdGVuIFNjaHJlaWJ0aXNjaCwgZGVyIG1pdCBEaWFncmFtbWVuIHVuZCAiCisgICAgICAgICAgICAgIkJ1ZWNoZXJuIGJlZGVja3QgaXN0LiBEaWUgV2FlbmRlIHZlcnNjaHdpbmRlbiBoaW50ZXIgUmVnYWxlbiwgIgorICAgICAgICAgICAgICJkaWUgZ2VmdWVsbHQgc2luZCBtaXQgaW4gTGVkZXIgZ2VidW5kZW5lbiwgZHVua2xlbiBXYWVsemVybiwgIgorICAgICAgICAgICAgICJ2b24gZGVuZW4gZ2VoZWltbmlzdm9sbGUgUnVuZW4gbGV1Y2h0ZW4uXG5Ub2QuIiwgNzgsIDAsIDEgKSApOworfQorCisKK3B1YmxpYyB2b2lkIHJlc2V0KCkKK3sKKyAgICA6OnJlc2V0KCk7CisgICAgZmx1c2goMSk7Cit9CisKK3ByaXZhdGUgdm9pZCBmbHVzaCggaW50IHVudXNlZE9ubHkgKQoreworICAgIHN0cmluZyAqbWk7CisgICAgaW50IGk7CisKKyAgICBpZiAoIHVudXNlZE9ubHkgKXsKKyAgICAgICAgaWYgKCBpID0gc2l6ZW9mKG1pID0gbV9pbmRpY2VzKG1zZ0NhY2hlKSkgKXsKKyAgICAgICAgICAgIGZvciAoIDsgaS0tOyApCisgICAgICAgICAgICAgICAgaWYgKCBtc2dDYWNoZVttaVtpXSwgMV0gKQorICAgICAgICAgICAgICAgICAgICBtc2dDYWNoZVttaVtpXSwgMV0gPSAwOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgbXNnQ2FjaGUgPSBtX2NvcHlfZGVsZXRlKCBtc2dDYWNoZSwgbWlbaV0gKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgICAgIG1zZ0NhY2hlID0gKFtdKTsKK30KKworCitwcml2YXRlIHN0cmluZyBleHBhbmQoIHN0cmluZyB0YWJsZSwgaW50IHZhbHVlICkKK3sKKyAgICBpbnQgc3osIHdlcnQsIGk7CisgICAgc3RyaW5nICp0ZXh0ZTsKKworICAgIHN6ID0gc2l6ZW9mKCB0ZXh0ZSA9IGV4cGxvZGUoIHRhYmxlLCAiIyMiICkgLSAoeyIifSkgKTsKKyAgICAKKyAgICBmb3IgKCBpID0gMDsgaSA8IHN6OyBpKysgKQorICAgICAgICBpZiAoIGklMiApeworICAgICAgICAgICAgc3NjYW5mKCB0ZXh0ZVtpXSwgIiVkIiwgd2VydCApOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIHZhbHVlIDwgd2VydCApCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICAgICAgdGFibGUgPSB0ZXh0ZVtpXTsKKworICAgIHJldHVybiB0YWJsZTsKK30KKworCisjZGVmaW5lIFRPUyhzKSBzWzwxXQorI2RlZmluZSBTVE9TKHMpIHNbPDJdCisjZGVmaW5lIFBVU0goeCxzKSAocys9ICh7IHggfSkpCisjZGVmaW5lIFBPUChzKQkocz1zWzAuLjwyXSkKKworLy8gemllbWxpY2ggdm9tIGh0bWxkIGFiZ2VrdXBmZXJ0IDspCitwcml2YXRlIHN0cmluZworcGFyc2VUZXh0KCBzdHJpbmcgbXNnLCBvYmplY3QgcGwgKSAKK3sKKyAgc3RyaW5nICp3b3JkcywgKnRleHRlLCAqdG9kbywgKmRvbmU7CisgIGludCBlbmRGbGFnOworCisgIGludCBzeiA9IHNpemVvZiggd29yZHMgPSByZWdleHBsb2RlKG1zZywgIls8XVtePl0qWz5dIikgKTsKKyAgdG9kbyA9ICh7IH0pOworICBkb25lID0gKHsiIn0pOworCisgIGZvciAoIGludCBpPTE7IGk8c3o7IGkrPTIgKXsKKyAgICAgIHN0cmluZyBjbWQgPSB3b3Jkc1tpXVsxLi48Ml07CisgICAgICBUT1MoZG9uZSkgKz0gd29yZHNbaS0xXTsKKworICAgICAgaWYgKCBjbWRbMF0gPT0gJy8nICl7CisgICAgICAgICAgZW5kRmxhZyA9IDE7CisgICAgICAgICAgY21kID0gY21kWzEuLl07CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgICAgZW5kRmxhZyA9IDA7CisgICAgICAKKyAgICAgIHN3aXRjaCggY21kWzBdICl7CisgICAgICBjYXNlICdBJzogLyoqKiBBbGlnbm1lbnQgZXJzZXR6ZW4gKioqLworICAgICAgICAgIGlmICghZW5kRmxhZyl7CisgICAgICAgICAgICAgIFBVU0goIGNtZCwgdG9kbyApOworICAgICAgICAgICAgICBQVVNIKCAiIiwgZG9uZSApOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGlmICggdG9kb1s8MV0gPT0gIkEiICl7CisgICAgICAgICAgICAgICAgICBTVE9TKGRvbmUpICs9IGV4cGFuZChUT1MoZG9uZSksIChpbnQpIHBsLT5RdWVyeVByb3AoUF9BTElHTikpOworICAgICAgICAgICAgICAgICAgZG9uZSA9IGRvbmVbMC4uPDJdOworICAgICAgICAgICAgICAgICAgdG9kbyA9IHRvZG9bMC4uPDJdOworICAgICAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgCisgICAgICBjYXNlICdEJzogLyoqKiBUb2RlIGVyc2V0emVuICoqKi8KKyAgICAgICAgICBpZiAoICFlbmRGbGFnICl7CisgICAgICAgICAgICAgIFBVU0goIGNtZCwgdG9kbyApOworICAgICAgICAgICAgICBQVVNIKCAiIiwgZG9uZSApOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIGlmICggdG9kb1s8MV0gPT0gIkQiICl7CisgICAgICAgICAgICAgICAgICBTVE9TKGRvbmUpICs9IGV4cGFuZChUT1MoZG9uZSksIChpbnQpIHBsLT5RdWVyeVByb3AoUF9ERUFEUykpOworICAgICAgICAgICAgICAgICAgUE9QKGRvbmUpOworICAgICAgICAgICAgICAgICAgUE9QKHRvZG8pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgCisgICAgICBjYXNlICdMJzogLyoqKiBMZXZlbCBlcnNldHplbiAqKiovCisgICAgICAgICAgaWYgKCAhZW5kRmxhZyApeworICAgICAgICAgICAgICBQVVNIKCBjbWQsIHRvZG8gKTsKKyAgICAgICAgICAgICAgUFVTSCggIiIsIGRvbmUgKTsKKyAgICAgICAgICB9CisgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICBpZiAoIHRvZG9bPDFdID09ICJMIiApeworICAgICAgICAgICAgICAgICAgU1RPUyhkb25lKSArPSBleHBhbmQoVE9TKGRvbmUpLCAoaW50KSBwbC0+UXVlcnlQcm9wKFBfTEVWRUwpKTsKKyAgICAgICAgICAgICAgICAgIFBPUChkb25lKTsKKyAgICAgICAgICAgICAgICAgIFBPUCh0b2RvKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICAgIAorICAgICAgY2FzZSAnWic6IC8qKiogWnVmYWxsIGVyc2V0emVuICoqKi8KKyAgICAgICAgICBpZiAoICFlbmRGbGFnICl7CisgICAgICAgICAgICAgIFBVU0goIGNtZCwgdG9kbyApOworICAgICAgICAgICAgICBQVVNIKCAiIiwgZG9uZSApOworICAgICAgICAgIH0KKyAgICAgICAgICBlbHNleworICAgICAgICAgICAgICBpZiAoIHRvZG9bPDFdWzBdID09ICdaJyl7CisgICAgICAgICAgICAgICAgICBpbnQgY250LCBybmQsIHdlcnQsIHN6MjsKKyAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgaWYgKCAhc3NjYW5mKHRvZG9bPDFdLCAiWj0lZCIsIHJuZCkgKQorICAgICAgICAgICAgICAgICAgICAgIFNUT1MoZG9uZSkgKz0gIlxuIyMjXG4jIyMgU3ludGF4IEVycm9yIGluIDxaPiFcbiMjI1xuXG4iOworICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgcm5kID0gcmFuZG9tKHJuZCk7CisgICAgICAgICAgICAgICAgICAgICAgc3oyID0gc2l6ZW9mKCB0ZXh0ZSA9IGV4cGxvZGUoVE9TKGRvbmUpLCAiIyMiKSApOworICAgICAgICAgICAgICAgICAgICAgIHdlcnQ9MDsKKyAgICAgICAgICAgICAgICAgICAgICBjbnQ9MDsKKyAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICBmb3IgKCBpbnQgayA9IDE7IGsgPCBzejI7IGsgKz0gMiApeworICAgICAgICAgICAgICAgICAgICAgICAgICBzc2NhbmYoIHRleHRlW2tdLCAiJWQiLCB3ZXJ0ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNudCArPSB3ZXJ0OworICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHJuZCA8IGNudCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNUT1MoZG9uZSkgKz0gdGV4dGVbaysxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgUE9QKGRvbmUpOworICAgICAgICAgICAgICAgICAgUE9QKHRvZG8pOworICAgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICdHJzogLyoqKiBHZW5kZXIgZXJzZXR6ZW4gKioqLworICAgICAgICAgIGlmICggIWVuZEZsYWcgKXsKKyAgICAgICAgICAgICAgUFVTSCggY21kLCB0b2RvICk7CisgICAgICAgICAgICAgIFBVU0goICIiLCBkb25lICk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgIGlmKCBzaXplb2YoIHRleHRlID0gcmVnZXhwbG9kZShUT1MoZG9uZSksICI6IikgKSA9PSAzICkKKyAgICAgICAgICAgICAgICAgIFNUT1MoZG9uZSkgKz0gdGV4dGVbMiooKGludCkgcGwtPlF1ZXJ5UHJvcChQX0dFTkRFUikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gRkVNQUxFKV07CisgICAgICAgICAgICAgIFBPUChkb25lKTsKKyAgICAgICAgICAgICAgUE9QKHRvZG8pOworICAgICAgICAgIH0KKyAgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSAnUic6IC8qKiogUmFzc2UgZXJzZXR6ZW4gKioqLworICAgICAgICAgIGlmICggIWVuZEZsYWcgKXsKKyAgICAgICAgICAgICAgUFVTSCggY21kLCB0b2RvICk7CisgICAgICAgICAgICAgIFBVU0goICIiLCBkb25lICk7CisgICAgICAgICAgfQorICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgIGludCByYWNlOworCisgICAgICAgICAgICAgIHRleHRlID0gcmVnZXhwbG9kZSggVE9TKGRvbmUpLCAiXFx8IiApOworICAgICAgICAgICAgICByYWNlID0gMiAqIChtZW1iZXIoICh7ICJNZW5zY2giLCAiRWxmIiwgIlp3ZXJnIiwgIkhvYmJpdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJGZWxpbmUiLCAiRHVua2VsZWxmIiB9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RyaW5nKSBwbC0+UXVlcnlQcm9wKFBfUkFDRSkgKSArIDEpOworICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgaWYgKCByYWNlID49IHNpemVvZih0ZXh0ZSkgKQorICAgICAgICAgICAgICAgICAgcmFjZSA9IDA7CisKKyAgICAgICAgICAgICAgU1RPUyhkb25lKSArPSB0ZXh0ZVtyYWNlXTsKKyAgICAgICAgICAgICAgUE9QKGRvbmUpOworICAgICAgICAgICAgICBQT1AodG9kbyk7CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlICduJzogLyoqKiBOYW1lLCBub3JtYWwgZ2VzY2hyaWViZW4gKioqLworICAgICAgICAgIFRPUyhkb25lKSArPSAoc3RyaW5nKSAocGwtPm5hbWUoUkFXKSk7CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgJ04nOiAvKioqIE5hbWUsIGluIEdyb3NzYnVjaHN0YWJlbiAqKiovCisgICAgICAgICAgVE9TKGRvbmUpICs9IHVwcGVyc3RyaW5nKHBsLT5uYW1lKFJBVykpOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICB9CisgIFBVU0goIHdvcmRzWzwxXSwgZG9uZSApOworICByZXR1cm4gaW1wbG9kZSggZG9uZSwgIiIgKTsKK30KKworCitwdWJsaWMgdm9pZCBoZWFydF9iZWF0KCkKK3sKKyAgICBmb3IgKCBpbnQgaiA9IHNpemVvZihwbGF5ZXJzKTsgai0tOyApCisgICAgICAgIGlmICggIW9iamVjdHAocGxheWVyc1tqXVswXSkgfHwKKyAgICAgICAgICAgICBlbnZpcm9ubWVudChwbGF5ZXJzW2pdWzBdKSAhPSAKKwkgICAgIGZpbmRfb2JqZWN0KCIvcm9vbS9kZWF0aC92aXJ0dWFsL2RlYXRoX3Jvb21fIitnZXR1aWQocGxheWVyc1tqXVswXSkpICkKKyAgICAgICAgICAgIHBsYXllcnNbal0gPSAwOworCisgICAgcGxheWVycyAtPSAoezB9KTsKKworICAgIGlmICggIXNpemVvZihwbGF5ZXJzKSApIHsKKyAgICAgICAgc2V0X2hlYXJ0X2JlYXQoMCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgZm9yICggaW50IGogPSBzaXplb2YocGxheWVycyk7IGotLTsgKSB7CisgICAgICBpbnQgbnI7CisgICAgICBzdHJpbmcgbXNnOworCisgICAgICBuciA9ICsrcGxheWVyc1tqXVsxXTsKKworICAgICAgaWYgKCBtYXBwaW5ncChwbGF5ZXJzW2pdWzJdKSApCisgICAgICAgICAgbXNnID0gcGxheWVyc1tqXVsyXVtucl07CisgICAgICBlbHNlCisgICAgICAgICAgbXNnID0gMDsKKyAgICAgIAorICAgICAgaWYgKCAhbXNnICkKKyAgICAgICAgICBtc2cgPSBwbGF5ZXJzW2pdWzNdWzFdW25yXTsKKyAgICAgIAorICAgICAgaWYgKCBtc2cgKQorICAgICAgICAgIHRlbGxfb2JqZWN0KCBwbGF5ZXJzW2pdWzBdLCBwYXJzZVRleHQoIG1zZywgcGxheWVyc1tqXVswXSApICk7CisgIH0KKyAgCisgIGRvX3JlbW92ZSgpOworfQorCitwcml2YXRlIHZvaWQKK2RvX3JlbW92ZSgpCit7CisgICAgaW50IHJlczsKKyAgICBzdHJpbmcgcHJheXJvb207CisgICAgb2JqZWN0IHBsb2JqLCBwbDsKKyAgICAKKyAgICBmb3IgKCBpbnQgaiA9IHNpemVvZihwbGF5ZXJzKTsgai0tOyApeworICAgICAgICBpZiAoIHBsYXllcnNbal1bMV0gPj0gcGxheWVyc1tqXVszXVswXSl7CisgICAgICAgICAgICBwbCA9IHBsYXllcnNbal1bMF07CisgICAgICAgICAgICB3aGlsZSAoIHBsb2JqID0gcHJlc2VudCgiXG5kZWF0aF9tYXJrIiwgcGwpICkKKyAgICAgICAgICAgICAgICBwbG9iai0+cmVtb3ZlKCk7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIGlmICggIShwcmF5cm9vbSA9IChzdHJpbmcpIHBsLT5RdWVyeVByYXlSb29tKCkpICkKKyAgICAgICAgICAgICAgICBwcmF5cm9vbT0iL3Jvb20vcHJheV9yb29tIjsKKworICAgICAgICAgICAgcGwtPlNldCggUF9UTVBfTU9WRV9IT09LLCAwICk7CisgICAgICAgICAgICBwbC0+U2V0KCBQX05PX0FUVEFDSywgMCwgRl9RVUVSWV9NRVRIT0QgKTsKKyAgICAgICAgICAgIHBsLT5TZXQoIFBfTEFTVF9LSUxMRVIsIDAgKTsKKyAgICAgICAgICAgIHBsLT5TZXQoIFBfS0lMTEVSLCAwICk7CisgICAgICAgICAgICBwbC0+U2V0KCBQX0VORU1ZX0RFQVRIX1NFUVVFTkNFLCAwICk7CisgICAgICAgICAgICBwbC0+U2V0KCBQX05FWFRfREVBVEhfU0VRVUVOQ0UsIDAgKTsKKyAgICAgICAgICAgIHBsLT5TZXQoIFBfUE9JU09OLCAwLCBGX1FVRVJZX01FVEhPRCApOworICAgICAgICAgICAgCisgICAgICAgICAgICBpZiAoIGNhdGNoKCByZXMgPSAoaW50KSBwbC0+bW92ZShwcmF5cm9vbSwgTV9HT3xNX1NJTEVOVHxNX05PQ0hFQ0spICkKKyAgICAgICAgICAgICAgICAgfHwgcmVzIDwgMSApCisgICAgICAgICAgICAgICAgcGwtPm1vdmUoICIvcm9vbS9wcmF5X3Jvb20iLCBNX0dPfE1fTk9DSEVDSyApOworCisgICAgICAgICAgICBwbGF5ZXJzW2pdID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBsYXllcnMgLT0gKHswfSk7CisKKyAgICBpZiAoICFzaXplb2YocGxheWVycykgKQorICAgICAgICBzZXRfaGVhcnRfYmVhdCgwKTsKK30KKworcHJpdmF0ZSB2YXJhcmdzIG1peGVkCitnZXRfc2VxdWVuY2UoIHN0cmluZyBzdHIgKQoreworICAgIHN0cmluZyAqc2VxdWVuY2VzOworICAgIGludCBpLCBsZW4sIGNhY2hlYWJsZTsKKyAgICAKKyAgICBpZiAoICFzdHJpbmdwKHN0cikgfHwgY2F0Y2goIGxlbiA9IGZpbGVfc2l6ZShzdHIpICkgfHwgbGVuIDw9IDAgKXsKKyAgICAgICAgc2VxdWVuY2VzID0gZ2V0X2RpciggIi9yb29tL2RlYXRoL3NlcXVlbmNlcy8qIiApIC0gKHsgIi4iLCAiLi4iLCAiLnN2biIgfSk7CisgICAgICAgIHN0ciA9ICIvcm9vbS9kZWF0aC9zZXF1ZW5jZXMvIiArIHNlcXVlbmNlc1tyYW5kb20oIHNpemVvZihzZXF1ZW5jZXMpICldOworICAgIH0KKworICAgIGlmICggY2FjaGVhYmxlID0gKChzaXplb2Yoc3RyKSA+IDIxKSAmJgorICAgICAgICAgICAgICAgICAgICAgIChzdHJbMC4uMjFdID09ICIvcm9vbS9kZWF0aC9zZXF1ZW5jZXMvIikpICl7CisgICAgICAgIGlmICggbWVtYmVyKG1zZ0NhY2hlLCBzdHIpICl7CisgICAgICAgICAgICBtc2dDYWNoZVtzdHIsIDFdID0gMTsgIC8vIFRvdWNoIGl0IQorICAgICAgICAgICAgcmV0dXJuICh7IG1zZ0NhY2hlW3N0cl0sIHN0ciB9KTsKKyAgICAgICAgfQorICAgIH0KKyAgICAKKyAgICBzZXF1ZW5jZXMgPSBleHBsb2RlKCByZWFkX2ZpbGUoc3RyKSwgIlxuIiApOworICAgIHNzY2FuZiggc2VxdWVuY2VzWzBdLCAiJWQiLCBsZW4gKTsKKyAgICBzdHJpbmcgc2VxID0gaW1wbG9kZSggc2VxdWVuY2VzWzEuLl0sICJcbiIgKTsKKyAgICBzZXF1ZW5jZXMgPSByZWdleHBsb2RlKCBzZXEsICJbMC05XVswLTldKjoiICk7CisgICAgbWFwcGluZyBtID0gKFtdKTsKKyAgICAKKyAgICBmb3IgKCBpID0gMTsgaSA8IHNpemVvZihzZXF1ZW5jZXMpLTE7IGkgKz0gMiApCisgICAgICAgIG1bKGludCkgc2VxdWVuY2VzW2ldXSA9IHNlcXVlbmNlc1tpKzFdOworCisgICAgaWYgKCBjYWNoZWFibGUgKQorICAgICAgICBtc2dDYWNoZSArPSAoWyBzdHI6ICh7IGxlbiwgbSB9KTsgMSBdKTsKKworICAgIHJldHVybiAoeyAoeyBsZW4sIG0gfSksIHN0ciB9KTsKK30KKworLy8gRGVzY3JpcHRpb246ICAgQWRkcyBhIHBsYXllciB0byB0aGUgbGlzdAordm9pZCBhZGRfcGxheWVyKCBvYmplY3QgcGwgKQoreworICAgIGludCBrYXJ0LCBrZ2VuOworICAgIGludCBlc2NhcGVkOworICAgIG9iamVjdCBraWxsX2xpdiwga2lsbF9vYjsKKyAgICBtaXhlZCBkc2VxLCBhY3Rfc2VxLCBraWxsZXJfbmFtZSwga2lsbGVyX21zZzsKKyAKKyAgICBzZXRfaGVhcnRfYmVhdCgxKTsKKyAgICBrZ2VuID0gTUFMRTsKKworICAgIGZvcmVhY2gob2JqZWN0IHByZXYgOiBjYWxsZXJfc3RhY2soMSkpIHsgCisgICAgICAgIGlmICggIW9iamVjdHAocHJldikgfHwgcHJldiA9PSBwbCApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBzdHJpbmcgZm4gPSBvYmplY3RfbmFtZShwcmV2KTsKKworICAgICAgICBpZiAoIGZuWzAuLjEyXSA9PSAiL3NlY3VyZS9sb2dpbiIgJiYgIWtpbGxfbGl2ICl7CisgICAgICAgICAgICBlc2NhcGVkID0gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBmblswLi43XSA9PSAiL3NlY3VyZS8iICYmIGZuWzAuLjEzXSAhPSAiL3NlY3VyZS9tZXJsaW4iICkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIGlmICggZm5bMC4uMjFdID09ICIvcm9vbS9kZWF0aC9kZWF0aF9tYXJrIiApCisgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBpZiAoIGxpdmluZyhwcmV2KSApeworICAgICAgICAgICAga2lsbF9saXYgPSBwcmV2OyAvLyBLaWxsZXIKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAga2lsbF9vYiA9IHByZXY7IC8vIGtpbGxlbmRlcyBPYmpla3QKKyAgICB9CisKKyAgICBvYmplY3QgcHJlID0gKG9iamVjdCkgcGwtPlF1ZXJ5UHJvcChQX0tJTExFUik7CisgICAgaWYgKCBvYmplY3RwKHByZSkgKSB7CisgICAgICAgIGRzZXEgPSAobWl4ZWQpIHByZS0+UXVlcnlQcm9wKFBfRU5FTVlfREVBVEhfU0VRVUVOQ0UpOworCisgICAgICAgIGlmKCAhKGtpbGxlcl9uYW1lID0gKG1peGVkKSBwcmUtPlF1ZXJ5UHJvcChQX0tJTExfTkFNRSkpICl7CisgICAgICAgICAgICBraWxsZXJfbmFtZSA9IChtaXhlZCkgcHJlLT5RdWVyeVByb3AoUF9OQU1FKTsKKyAgICAgICAgICAgIGthcnQgPSAoaW50KSBwcmUtPlF1ZXJ5UHJvcChQX0FSVElDTEUpOworICAgICAgICAgICAga2dlbiA9IChpbnQpIHByZS0+UXVlcnlQcm9wKFBfR0VOREVSKTsKKyAgICAgICAgfQorCisgICAgICAgIGtpbGxlcl9tc2cgPSAobWl4ZWQpcHJlLT5RdWVyeVByb3AoUF9LSUxMX01TRyk7ICAKKyAgICB9CisKKyAgICBpZiAoICFraWxsZXJfbmFtZSAmJiBraWxsX2xpdiAmJiBmdW5jdGlvbl9leGlzdHMoICJRdWVyeVByb3AiLCBraWxsX2xpdiApICl7CisgICAgICAgIGRzZXEgPSAobWl4ZWQpIGtpbGxfbGl2LT5RdWVyeVByb3AoUF9FTkVNWV9ERUFUSF9TRVFVRU5DRSk7CisKKyAgICAgICAgaWYoICEoa2lsbGVyX25hbWUgPSAobWl4ZWQpIGtpbGxfbGl2LT5RdWVyeVByb3AoUF9LSUxMX05BTUUpKSApeworICAgICAgICAgICAga2lsbGVyX25hbWUgPSAobWl4ZWQpIGtpbGxfbGl2LT5RdWVyeVByb3AoUF9OQU1FKTsKKyAgICAgICAgICAgIGthcnQgPSAoaW50KSBraWxsX2xpdi0+UXVlcnlQcm9wKFBfQVJUSUNMRSk7CisgICAgICAgICAgICBrZ2VuID0gKGludCkga2lsbF9saXYtPlF1ZXJ5UHJvcChQX0dFTkRFUik7CisgICAgICAgIH0KKworICAgICAgICBraWxsZXJfbXNnID0gKG1peGVkKSBraWxsX2xpdi0+UXVlcnlQcm9wKFBfS0lMTF9NU0cpOworICAgICAgICBwcmUgPSBraWxsX2xpdjsKKyAgICB9CisKKyAgICBpZiAoICFraWxsZXJfbmFtZSAmJiBraWxsX29iICYmIGZ1bmN0aW9uX2V4aXN0cyggIlF1ZXJ5UHJvcCIsIGtpbGxfb2IgKSApeworICAgICAgICBkc2VxID0gKG1peGVkKSBraWxsX29iLT5RdWVyeVByb3AoUF9FTkVNWV9ERUFUSF9TRVFVRU5DRSk7CisKKyAgICAgICAgaWYoICEoa2lsbGVyX25hbWUgPSAobWl4ZWQpIGtpbGxfb2ItPlF1ZXJ5UHJvcChQX0tJTExfTkFNRSkpICl7CisgICAgICAgICAgICBraWxsZXJfbmFtZSA9IChtaXhlZCkga2lsbF9vYi0+UXVlcnlQcm9wKFBfTkFNRSk7CisgICAgICAgICAgICBrYXJ0ID0gKGludCkga2lsbF9vYi0+UXVlcnlQcm9wKFBfQVJUSUNMRSk7CisgICAgICAgICAgICBrZ2VuID0gKGludCkga2lsbF9vYi0+UXVlcnlQcm9wKFBfR0VOREVSKTsKKyAgICAgICAgfQorCisgICAgICAgIGtpbGxlcl9tc2cgPSAobWl4ZWQpIGtpbGxfb2ItPlF1ZXJ5UHJvcChQX0tJTExfTVNHKTsKKyAgICAgICAgcHJlID0ga2lsbF9vYjsKKyAgICB9CisgICAgCisgICAgLy8gZmFsbHMga2VpbmUgU2VxdWVueiBnZXNldHp0LCBldmVudHVlbGxlIGVpZ2VuZSBUb2Rlc3NlcXVlbnogbmVobWVuCisgICAgaWYgKCFkc2VxKQorICAgICAgZHNlcSA9IChtaXhlZClwbC0+UXVlcnlQcm9wKFBfTkVYVF9ERUFUSF9TRVFVRU5DRSk7CisKKyAgICBhY3Rfc2VxID0gMDsKKworICAgIGlmICggbWFwcGluZ3AoZHNlcSkgKQorICAgICAgICBhY3Rfc2VxID0gZ2V0X3NlcXVlbmNlKCAiL3Jvb20vZGVhdGgvc2VxdWVuY2VzL2xhcnMiICk7CisgICAgZWxzZSBpZiAoIHBvaW50ZXJwKGRzZXEpICkgIC8vIGdhbnplIFRvZGVzc2VxdWVuei4uLgorICAgICAgICBhY3Rfc2VxID0gKHsgZHNlcSwgMCB9KTsKKyAgICBlbHNlIGlmICggc3RyaW5ncChkc2VxKSApCisgICAgICAgIGFjdF9zZXEgPSBnZXRfc2VxdWVuY2UoZHNlcSk7CisKKyAgICBpZihwbC0+cXVlcnlfaGNfcGxheSgpPjEpCisgICAgeworICAgICAgICBhY3Rfc2VxPSh7KHsyMiwoWzE6IkR1IGZhZWxsc3QgdW5kIGZhZWxsc3QuLi5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICA1OiJ1bmQgZmFlbGxzdC4uLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwOiJ1bmQgZmFlbGxzdC4uLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEyOiJkaXJla3QgaW4gZGllIEFybWUgdm9uIFRPRC5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAxNDoiVHJpdW1waGllcmVuZCBsYWVjaGVsdCBlciBEaWNoIGFuLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDE2OiJOVU4gR0VIT0VSU1QgRFUgRlVFUiBJTU1FUiBNSVIhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgMTg6IkhBSEhIQUhBSEFBQUFBQUFBQUFIQUFBQUFBQUFBIVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDIwOiJUT0Qgc2NobGFlZ3QgRGlyIG1pdCBzZWluZXIgU2Vuc2UgZGVuIEtvcGYgYWIuXG4iXSl9KSwwfSk7CisgICAgfQorICAgIGlmICggIWFjdF9zZXEgKQorICAgICAgICBhY3Rfc2VxID0gZ2V0X3NlcXVlbmNlKCk7CisKKyAgICBpZiAoICFtYXBwaW5ncChkc2VxKSApCisgICAgICAgIGRzZXEgPSAwOworCisgICAgaW50IGk7CisgICAgZm9yICggaSA9IHNpemVvZihwbGF5ZXJzKTsgaS0tOyApCisgICAgICAgIGlmICggcGxheWVyc1tpXVswXSA9PSBwbCApCisgICAgICAgICAgICBicmVhazsKKworICAgIGlmICggaSA9PSAtMSApCisgICAgICAgIHBsYXllcnMgKz0gKHsgKHsgcGwsIDAsIGRzZXEsIGFjdF9zZXFbMF0sIGFjdF9zZXFbMV0sIHByZSB9KSB9KTsKKyAgICBlbHNlCisgICAgICAgIHBsYXllcnNbaV1bNV0gPSBwcmU7CisKKworICAgICAgICBpZiAoIGVzY2FwZWQgKXsKKyAgICAgICAgICAgIGtpbGxlcl9uYW1lID0gIiI7CisgICAgICAgICAgICBraWxsZXJfbXNnID0gdXBwZXJzdHJpbmcoZ2V0dWlkKHBsKSkgKyAiIFZFUlNVQ0hURSwgTUlSIFpVICIKKyAgICAgICAgICAgICAgICAiRU5US09NTUVOIC0gSkVUWlQgSEFCRSBJQ0ggV0lFREVSIEVYVFJBLUFSQkVJVCBNSVQgIisKKyAgICAgICAgICAgICAgICAoKGludCkgcGwtPlF1ZXJ5UHJvcChQX0dFTkRFUikgIT0gMiA/ICJJSE0iIDogIklIUiIpICsKKyAgICAgICAgICAgICAgICAiIC4uLiI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoICFraWxsZXJfbmFtZSApIHsKKyAgICAgICAgICAgICAgICBpZiAoIChzdHJpbmcpIHBsLT5RdWVyeVByb3AoUF9LSUxMRVIpID09ICJnaWZ0IiApeworICAgICAgICAgICAgICAgICAgICBraWxsZXJfbmFtZSA9ICJWZXJnaWZ0dW5nIjsKKyAgICAgICAgICAgICAgICAgICAga2dlbiA9IEZFTUFMRTsKKyAgICAgICAgICAgICAgICAgICAga2FydCA9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgICAgIGtpbGxlcl9uYW1lID0gIkV0d2FzIEdlaGVpbW5pc3ZvbGxlcyB1bmQgVW5iZWthbm50ZXMiOworICAgICAgICAgICAgICAgICAgICBrZ2VuID0gTkVVVEVSOworICAgICAgICAgICAgICAgICAgICBrYXJ0ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoICFwb2ludGVycChraWxsZXJfbXNnKSApCisgICAgICAgICAgICBraWxsZXJfbXNnID0gKHsga2lsbGVyX21zZywgMCwgMCB9KTsKKyAgICAgICAgZWxzZSBpZiAoIHNpemVvZihraWxsZXJfbXNnKSA8IDMgKQorICAgICAgICAgICAga2lsbGVyX21zZyArPSAoeyAwLCAwLCAwIH0pOworCisgICAgICAgIGlmICggc3RyaW5ncChraWxsZXJfbXNnWzBdKSApCisgICAgICAgICAgICBraWxsZXJfbXNnWzBdID0gc3ByaW50Zigga2lsbGVyX21zZ1swXSwgY2FwaXRhbGl6ZShnZXR1aWQocGwpKSApOworCisgICAgICAgIFNldFByb3AoIFBfTkFNRSwga2lsbGVyX25hbWUgKTsKKyAgICAgICAgU2V0UHJvcCggUF9BUlRJQ0xFLCBrYXJ0ICk7CisgICAgICAgIFNldFByb3AoIFBfR0VOREVSLCBrZ2VuICk7CisgICAgICAgIHN0cmluZyBraWxsbmFtZSA9IE5hbWUoV0VSKTsKKyAgICAgICAgU2V0UHJvcCggUF9OQU1FLCAiTGFycyIgKTsKKyAgICAgICAgU2V0UHJvcCggUF9BUlRJQ0xFLCAwICk7CisgICAgICAgIFNldFByb3AoIFBfR0VOREVSLE1BTEUgKTsKKworICAgICAgICBpbnQgbWFnaWVydGVzdGllOworICAgICAgICBzdHJpbmcgdGVzdHBsYXllciA9IChzdHJpbmcpIHBsLT5RdWVyeVByb3AoUF9URVNUUExBWUVSKTsKKyAgICAgICAgaWYgKHNpemVvZih0ZXN0cGxheWVyKSkKKyAgICAgICAgeworICAgICAgICAgIGlmICh0ZXN0cGxheWVyWzw1Li48MV0hPSJHaWxkZSIpCisgICAgICAgICAgICBtYWdpZXJ0ZXN0aWUgPSAxOworICAgICAgICB9CisgICAgICAgICAgCisgICAgICAgIHN0cmluZyBrYW5hbDsKKyAgICAgICAgaWYgIChtYWdpZXJ0ZXN0aWUgfHwgSVNfTEVBUk5JTkcocGwpKQorICAgICAgICAgICAga2FuYWwgPSAiVGRUIjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAga2FuYWwgPSAiVG9kIjsKKworICAgICAgICBDSE1BU1RFUi0+am9pbigga2FuYWwsIHRoaXNfb2JqZWN0KCkgKTsKKworICAgICAgICBpZiAoICghc3RyaW5ncChraWxsZXJfbmFtZSkgfHwga2lsbGVyX25hbWUgIT0gIiIpICYmCisgICAgICAgICAgICAgKHNpemVvZihraWxsZXJfbXNnKSA8IDQgfHwgIWtpbGxlcl9tc2dbM10pICl7CisgICAgICAgICAgICBpZiAoIGtpbGxlcl9tc2dbMl0gPT0gUExVUkFMICkKKyAgICAgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCgga2FuYWwsIHRoaXNfb2JqZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbGxuYW1lICsgIiBoYWJlbiBnZXJhZGUgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHBsKSkgKyAiIHVtZ2VicmFjaHQuIiApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIENITUFTVEVSLT5zZW5kKCBrYW5hbCwgdGhpc19vYmplY3QoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2lsbG5hbWUgKyAiIGhhdCBnZXJhZGUgIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemUoZ2V0dWlkKHBsKSkgKyAiIHVtZ2VicmFjaHQuIiApOworICAgICAgICB9CisKKyAgICAgICAgaSA9IChpbnQpIHBsLT5RdWVyeVByb3AoUF9ERUFEUyk7CisgICAgICAgIGlmICggaSAmJiAoZ2V0dWlkKHBsKSA9PSAia2V5IiB8fCBpJTEwMCA9PSAwIHx8IGklMjUwID09IDApICl7CisgICAgICAgICAgICBTZXRQcm9wKCBQX05BTUUsICJUb2QiICk7CisgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCgga2FuYWwsIHRoaXNfb2JqZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ByaW50ZiggIkRBUyBXQVIgU0NIT04gREFTICVkVEUgTUFMISIsIGkgKSApOworICAgICAgICAgICAgU2V0UHJvcCggUF9OQU1FLCAiTGFycyIgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmKCBraWxsZXJfbXNnWzBdICl7CisgICAgICAgICAgICBpZiAoIHN0cmluZ3Aoa2lsbGVyX25hbWUpICYmIGtpbGxlcl9uYW1lID09ICIiICl7CisgICAgICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoIGthbmFsLCB0aGlzX29iamVjdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVha19zdHJpbmcoIGZ1bmNhbGwoa2lsbGVyX21zZ1swXSksIDc4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJbIitrYW5hbCsiOl0gIiApWzAuLjwyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVNHX0VNUFRZICk7CisgICAgICAgICAgICAgICAgcmV0dXJuOyAKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGlmICggKGtpbGxlcl9tc2dbMV0gPCBNU0dfU0FZKSB8fCAoa2lsbGVyX21zZ1sxXSA+IE1TR19HRU1PVEUpICkKKyAgICAgICAgICAgICAgICAgICAga2lsbGVyX21zZ1sxXSA9IE1TR19TQVk7CisKKyAgICAgICAgICAgICAgICBTZXRQcm9wKCBQX05BTUUsIGtpbGxlcl9uYW1lICk7CisgICAgICAgICAgICAgICAgU2V0UHJvcCggUF9BUlRJQ0xFLCBrYXJ0ICk7CisgICAgICAgICAgICAgICAgU2V0UHJvcCggUF9HRU5ERVIsIGtnZW4gKTsKKyAgICAgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCgga2FuYWwsIHRoaXNfb2JqZWN0KCksIGZ1bmNhbGwoa2lsbGVyX21zZ1swXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtpbGxlcl9tc2dbMV0gKTsKKyAgICAgICAgICAgICAgICBTZXRQcm9wKCBQX05BTUUsICJMYXJzIiApOworICAgICAgICAgICAgICAgIFNldFByb3AoIFBfQVJUSUNMRSwgMCApOworICAgICAgICAgICAgICAgIFNldFByb3AoIFBfR0VOREVSLCBNQUxFICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoIHBvaW50ZXJwKGtpbGxlcl9tc2cgPSAobWl4ZWQpIHBsLT5RdWVyeVByb3AoUF9ERUFUSF9NU0cpKSAmJgorICAgICAgICAgICAgIHNpemVvZihraWxsZXJfbXNnKSA9PSAyICYmIHN0cmluZ3Aoa2lsbGVyX21zZ1swXSkgJiYKKyAgICAgICAgICAgICBpbnRwKGtpbGxlcl9tc2dbMV0pICl7CisgICAgICAgICAgICBTZXRQcm9wKCBQX05BTUUsIGNhcGl0YWxpemUoZ2V0dWlkKHBsKSkgKTsKKyAgICAgICAgICAgIFNldFByb3AoIFBfQVJUSUNMRSwgMCApOworICAgICAgICAgICAgU2V0UHJvcCggUF9HRU5ERVIsIHBsLT5RdWVyeVByb3AoUF9HRU5ERVIpICk7CisgICAgICAgICAgICBDSE1BU1RFUi0+c2VuZCgga2FuYWwsIHRoaXNfb2JqZWN0KCksIGtpbGxlcl9tc2dbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga2lsbGVyX21zZ1sxXSApOworICAgICAgICAgICAgU2V0UHJvcCggUF9OQU1FLCAiTGFycyIgKTsKKyAgICAgICAgICAgIFNldFByb3AoIFBfQVJUSUNMRSwgMCApOworICAgICAgICAgICAgU2V0UHJvcCggUF9HRU5ERVIsIE1BTEUgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChwbC0+cXVlcnlfaGNfcGxheSgpPjEpeworICAgICAgICAgICAgU2V0UHJvcCggUF9OQU1FLCAiVG9kIiApOworICAgICAgICAgICAgQ0hNQVNURVItPnNlbmQoIGthbmFsLCB0aGlzX29iamVjdCgpLCJOVU4gR0VIT0VSU1QgRFUgRlVFUiBFV0lHIE1JUiEiICk7CisgICAgICAgICAgICBTZXRQcm9wKCBQX05BTUUsICJMYXJzIiApOworICAgICAgICB9Cit9CisKK3B1YmxpYyBpbnQKK1NtYXJ0TG9nKCBzdHJpbmcgY3JlYXQsIHN0cmluZyBteW5hbWUsIHN0cmluZyBzdHIsIHN0cmluZyBkYXRlICkKK3sKKyAgICBpbnQgaTsKKyAgICBzdHJpbmcgZm47CisgICAgCisgICAgZm9yICggaSA9IHNpemVvZihwbGF5ZXJzKTsgaS0tOyApCisgICAgICAgIGlmICggcGxheWVyc1tpXVswXSA9PSB0aGlzX3BsYXllcigpICkKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgLy8gU3BpZWxlciAoTWFnaWVyPykgaXN0IGluIGtlaW5lciBUb2Rlc3NlcXVlbnogLT4gbm9ybWFsZXMgUmVwZmlsZQorICAgIGlmICggaSA9PSAtMSApCisgICAgICAgIHJldHVybiAwOworCisgICAgaWYgKCAhKGZuID0gcGxheWVyc1tpXVs0XSkgKXsKKyAgICAgICAgLy8gU3BpZWxlciBoYXQgZWluZSB1bmJla2FubnRlIFRvZGVzc2VxdWVueiAoa2VpbiBGaWxlbmFtZSwgU2VxdWVuegorICAgICAgICAvLyB3dXJkZSBrb21wbGV0dCBpbiBQX0VORU1ZX0RFQVRIX1NFUVVFTkNFIGFiZ2VsZWd0KQorICAgICAgICBjcmVhdCA9ICJUT0QvdW5iZWthbm50LnJlcCI7CisgICAgICAgIGZuID0gInVuYmVrYW5udGUgVG9kZXNzZXF1ZW56IjsKKyAgICB9CisgICAgZWxzZQorICAgICAgICAvLyBKZWRlIFNlcXVlbnogbWl0IG5lbSBlaWdlbmVuIFJlcGZpbGUKKyAgICAgICAgY3JlYXQgPSAiVE9ELyIgKyBleHBsb2RlKCBmbiwgIi8iIClbPDFdICsgIi5yZXAiOworCisgICAgbG9nX2ZpbGUoIGNyZWF0LCBteW5hbWUgKyAiIHZvbiAiICsgZ2V0dWlkKHRoaXNfaW50ZXJhY3RpdmUoKSkKKyAgICAgICAgICAgICAgKyAiIFsiK2ZuKyJdICgiICsgZGF0ZSArICIpOlxuIiArIHN0ciArICJcbiIgKTsKKworICAgIHJldHVybiAxOworfQorCitwdWJsaWMgbWl4ZWQgaGllcl9nZWJsaWViZW4oIG1peGVkIGRlc3QsIGludCBtZXRob2RzLCBzdHJpbmcgZGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgdGV4dG91dCwgc3RyaW5nIHRleHRpbiApIAoreworICAgIC8vIE1hZ2llciBkdWVyZmVuIFNwaWVsZXIgaGVyYXVzdHJhbnNlbgorICAgIGlmICggdGhpc19pbnRlcmFjdGl2ZSgpICYmIElTX0xFQVJORVIodGhpc19pbnRlcmFjdGl2ZSgpKSAmJgorICAgICAgICAgKHRoaXNfaW50ZXJhY3RpdmUoKSAhPSBwcmV2aW91c19vYmplY3QoKSB8fAorICAgICAgICAgIElTX0RFUFVUWSh0aGlzX2ludGVyYWN0aXZlKCkpKSApeworICAgICAgICBwcmV2aW91c19vYmplY3QoKS0+U2V0KCBQX1RNUF9NT1ZFX0hPT0ssIDAgKTsKKyAgICAgICAgcmV0dXJuICh7IGRlc3QsIG1ldGhvZHMsIGRpcmVjdGlvbiwgdGV4dG91dCwgdGV4dGluIH0pOworICAgIH0KKworICAgIC8vIFNwaWVsZXIgaGFlbmd0IG5vY2ggaW4gZGVyIFRvZGVzc2VxdWVuegorICAgIGZvciAoIGludCBpID0gc2l6ZW9mKHBsYXllcnMpOyBpLS07ICkKKyAgICAgICAgaWYgKCBvYmplY3RwKHBsYXllcnNbaV1bMF0pICYmIHByZXZpb3VzX29iamVjdCgpID09IHBsYXllcnNbaV1bMF0gJiYKKyAgICAgICAgICAgICBlbnZpcm9ubWVudChwcmV2aW91c19vYmplY3QoKSkgPT0gZmluZF9vYmplY3QoCisJICAiL3Jvb20vZGVhdGgvdmlydHVhbC9yb29tX2RlYXRoXyIgKyBnZXR1aWQocHJldmlvdXNfb2JqZWN0KCkpKSYmCisgICAgICAgICAgICAgaW50ZXJhY3RpdmUocHJldmlvdXNfb2JqZWN0KCkpICkgeworCSAgICAvLyBNb3ZlIG51ciBlcmxhdWJ0LCB3ZW5uIGRhcyBaaWVsIHdpZWRlciBkZXIgVG9kZXNyYXVtIGlzdC4KKwkgICAgLy8gd2VubiBtYWwgZnVlciBuZW4gYmVzdGltbXRlbiBad2Vja3MgQmV3ZWd1bmdlbiByYXVzIGF1cyBkZW0KKwkgICAgLy8gVG9kZXNyYXVtIGVyZm9yZGVybGljaCBzaW5kLCBzb2xsdGVuIGhpZXIgZW50c3ByZWNoZW5kZQorCSAgICAvLyBBdXNuYWhtZW4gZWluZ2ViYXV0IHdlcmRlbi4KKwkgICAgaWYgKCAoc3RyaW5ncChkZXN0KSAmJiAKKwkJICBkZXN0ID09IG9iamVjdF9uYW1lKGVudmlyb25tZW50KHByZXZpb3VzX29iamVjdCgpKSkpIHx8CisJCSAob2JqZWN0cChkZXN0KSAmJgorCQkgIGRlc3QgPT0gZW52aXJvbm1lbnQocHJldmlvdXNfb2JqZWN0KCkpKSApIHsKKwkJcHJldmlvdXNfb2JqZWN0KCktPlNldCggUF9UTVBfTU9WRV9IT09LLCAwICk7CisJCXJldHVybiAoeyBkZXN0LCBtZXRob2RzLCBkaXJlY3Rpb24sIHRleHRvdXQsIHRleHRpbiB9KTsKKwkgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgLy8gU3BpZWxlciBpc3QgbmljaHQgbWVociBpbSBSYXVtIG9kZXIgZWluZ2VzY2hsYWZlbgorICAgIGlmICggcHJldmlvdXNfb2JqZWN0KCkgKQorICAgICAgICBwcmV2aW91c19vYmplY3QoKS0+U2V0KCBQX1RNUF9NT1ZFX0hPT0ssIDAgKTsKKyAgICAKKyAgICByZXR1cm4gKHsgZGVzdCwgbWV0aG9kcywgZGlyZWN0aW9uLCB0ZXh0b3V0LCB0ZXh0aW4gfSk7Cit9CmRpZmYgLS1naXQgYS9yb29tL2RlYXRoL2RlYXRoX3Jvb21fdmMuYyBiL3Jvb20vZGVhdGgvZGVhdGhfcm9vbV92Yy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxMDM4ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9yb29tL2RlYXRoL2RlYXRoX3Jvb21fdmMuYwpAQCAtMCwwICsxLDE2OCBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIGRlYXRoX3Jvb21fdmMuYyAtLSBEYXMgU3RhbmRhcmRvYmpla3QgZnVlciBkZW4gVkMtVG9kZXNyYXVtCisvLworLy8gJElkOiBkZWF0aF9yb29tX3ZjLmMgODk4OCAyMDE0LTEyLTMxIDEzOjEwOjE5WiBaZXNzdHJhICQKKworCisjcHJhZ21hIHN0cmljdF90eXBlcworCisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKyNpbmNsdWRlIDxsYW5ndWFnZS5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorI2luY2x1ZGUgPGRhZW1vbi5oPgorI2luY2x1ZGUgPG5ld19za2lsbHMuaD4KKworaW5oZXJpdCAiL3N0ZC9yb29tIjsKKworcHVibGljIGludCBub19hdHRhY2soKTsKK3B1YmxpYyBpbnQgbm9fcG9pc29uKGludCB2YWwpOworCitwdWJsaWMgdm9pZCBjcmVhdGUoKQoreworICBpZiAoSVNfQkxVRSh0aGlzX29iamVjdCgpKSkgcmV0dXJuOworICAgIDo6Y3JlYXRlKCk7CisgICAgCisgICAgU2V0UHJvcCggUF9HRU5ERVIsIE1BTEUgKTsKKyAgICBTZXRQcm9wKCBQX0FSVElDTEUsIDAgKTsKKyAgICBTZXRQcm9wKCBQX0xJR0hULDEgKTsKKyAgICBTZXRQcm9wKCBQX05PX1RQT1JULCBOT19UUE9SVF9PVVQgKTsKKyAgICBTZXRQcm9wKCBQX0xPR19GSUxFLCAiVE9EL1RvZGVzcmF1bSIgKTsKKyAgICBTZXRQcm9wKCBQX0lOVF9TSE9SVCwgIkFyYmVpdHN6aW1tZXIgZGVzIFRvZGVzIiApOworICAgIFNldFByb3AoIFBfSU5UX0xPTkcsIGJyZWFrX3N0cmluZygKKyAgICAgICAgICAgICAiRWluIGR1bmtsZXIgUmF1bSwgZXJsZXVjaHRldCB2b24gZHVua2xlbSBMaWNodCwgZGFzIHNpY2ggZGVyICIKKyAgICAgICAgICAgICAiRHVua2VsaGVpdCBuaWNodCBzbyBzZWhyIHp1IHdpZGVyc2V0emVuIHNjaGVpbnQsIGluZGVtIGVzICIKKyAgICAgICAgICAgICAibGV1Y2h0ZXQsIGFscyBkYXNzIGVzIGRlciBkdW5rZWxzdGUgUHVua3QgaW4gZWluZXIgd2VuaWdlciAiCisgICAgICAgICAgICAgImR1bmtsZW4gVW1nZWJ1bmcgaXN0LiBJbSBzZWx0c2FtZW4gTGljaHQgZXJrZW5uc3QgRHUgZWluZW4gIisKKyAgICAgICAgICAgICAiemVudHJhbCBhdWZnZXN0ZWxsdGVuIFNjaHJlaWJ0aXNjaCwgZGVyIG1pdCBEaWFncmFtbWVuIHVuZCAiCisgICAgICAgICAgICAgIkJ1ZWNoZXJuIGJlZGVja3QgaXN0LiBEaWUgV2FlbmRlIHZlcnNjaHdpbmRlbiBoaW50ZXIgUmVnYWxlbiwgIgorICAgICAgICAgICAgICJkaWUgZ2VmdWVsbHQgc2luZCBtaXQgaW4gTGVkZXIgZ2VidW5kZW5lbiwgZHVua2xlbiBXYWVsemVybiwgIgorICAgICAgICAgICAgICJ2b24gZGVuZW4gZ2VoZWltbmlzdm9sbGUgUnVuZW4gbGV1Y2h0ZW4uXG5Ub2QuIiwgNzgsIDAsIDEgKSApOworICAgIHByZXZpb3VzX29iamVjdCgpLT5DdXN0b21pemVPYmplY3QoKTsKKyAgICBjYWxsX290aGVyKCIvcm9vbS9kZWF0aC9kZWF0aF9yb29tIiwiPz8/Iik7Cit9CisKK3ZvaWQgdGVzdF9yZW1vdmUoKQoreworICBpZiAoIXNpemVvZihhbGxfaW52ZW50b3J5KHRoaXNfb2JqZWN0KCkpJnVzZXJzKCkpKQorICAgIGlmICghdGhpc19vYmplY3QoKS0+cmVtb3ZlKCkpIGRlc3RydWN0KHRoaXNfb2JqZWN0KCkpOworfQorCitwdWJsaWMgdm9pZCByZXNldCgpCit7CisgIDo6cmVzZXQoKTsKKyAgdGVzdF9yZW1vdmUoKTsKKyAgcmV0dXJuOworfQorCitwdWJsaWMgdm9pZCBleGl0KG9iamVjdCBsaXYpCit7CisgIGNhbGxfb3V0KCJ0ZXN0X3JlbW92ZSIsMik7CisgIHJldHVybjsKK30KKworCitzdGF0aWMgdm9pZCBkZWVwX2Rlc3RydWN0KCBvYmplY3Qgb2IgKQoreworICAgIGlmICggb2JqZWN0cChvYikgJiYgZW52aXJvbm1lbnQob2IpID09IHRoaXNfb2JqZWN0KCkgKQorICAgICAgICBmaWx0ZXIoIGRlZXBfaW52ZW50b3J5KG9iKSArICh7IG9iIH0pLAorICAgICAgICAgICAgICAgICAgICAgIGxhbWJkYSggKHsneC8qJyovfSksICh7IydkZXN0cnVjdCwgJ3h9KSApICk7Cit9CisKK3B1YmxpYyB2b2lkIGluaXQoKQoreyAgCisgIHN0cmluZyBwcmF5cm9vbTsKKyAgaW50IHJlczsKKworICA6OmluaXQoKTsKKyAgaWYgKCAhcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSh0aGlzX3BsYXllcigpKSApeworICAgICAgY2FsbF9vdXQoICJkZWVwX2Rlc3RydWN0IiwgMCwgdGhpc19wbGF5ZXIoKSApOworICAgICAgcmV0dXJuOworICB9CisKKyAgaWYgKCAhKHByYXlyb29tID0gKHN0cmluZykgdGhpc19wbGF5ZXIoKS0+UXVlcnlQcmF5Um9vbSgpKSApCisgICAgICBwcmF5cm9vbSA9ICIvcm9vbS9wcmF5X3Jvb20iOworICAKKyAgaWYgKCAhdGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfR0hPU1QpICkKKyAgICB7CisgICAgICBpZiAoIElTX1dJWkFSRCh0aGlzX3BsYXllcigpKSAmJgorICAgICAgICAgICB0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoUF9XQU5UU19UT19MRUFSTikgKQorCXsKKyAgICAgICAgICBpZiAoICF0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoUF9JTlZJUykgKQorICAgICAgICAgICAgICB0ZWxsX3Jvb20oIHRoaXNfb2JqZWN0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIkRlciBUb2Qgc2FndDogV0FTIFdJTExTVCBEVSBISUVSLCAiKworICAgICAgICAgICAgICAgICAgICAgICAgIHVwcGVyc3RyaW5nKChzdHJpbmcpIHRoaXNfcGxheWVyKCktPm5hbWUoKSkrIj9cbiIrCisgICAgICAgICAgICAgICAgICAgICAgICAgIkRlciBUb2Qgc2FndDogRFUgQklTVCBVTlNURVJCTElDSCwgRFUgSEFTVCBISUVSICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiTklDSFRTIFpVIFNVQ0hFTiFcblxuIiApOworCX0KKyAgICAgIGVsc2UgCisJeworICAgICAgICAgIHdyaXRlKCJEZXIgVG9kIHNhZ3Q6IFdBUyBUVVNUIERVIEhJRVI/IERFSU5FIFpFSVQgSVNUIE5PQ0ggIgorICAgICAgICAgICAgICAgICJOSUNIVCBSRUlGIVxuXG4iKTsKKyAgICAgICAgICAKKwkgIGlmICggY2F0Y2gocmVzID0gKGludCkgdGhpc19wbGF5ZXIoKS0+bW92ZSggcHJheXJvb20sTV9HT3xNX1NJTEVOVHxNX05PQ0hFQ0sgKSkKKyAgICAgICAgICAgICAgIHx8IHJlcyA8IDEgJiYgZW52aXJvbm1lbnQodGhpc19wbGF5ZXIoKSkgPT0gdGhpc19vYmplY3QoKSApCisgICAgICAgICAgICAgIHRoaXNfcGxheWVyKCktPm1vdmUoICIvcm9vbS9wcmF5X3Jvb20iLCBNX0dPfE1fU0lMRU5UfE1fTk9DSEVDSyApOworCX0KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgaWYgKCAhSVNfREVQVVRZKHRoaXNfcGxheWVyKCkpICl7CisgICAgYWRkX2FjdGlvbiggImZpbHRlcl9sZGZpZWQiLCAiIiwgMSApOworICAgIHRoaXNfcGxheWVyKCktPlNldCggUF9UTVBfTU9WRV9IT09LLAorICAgICAgICAgICAgICAgICAgICAgICAgKHsgdGltZSgpKzMxNTM2MDAwLCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRfb2JqZWN0KCIvcm9vbS9kZWF0aC9kZWF0aF9yb29tIiksIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImhpZXJfZ2VibGllYmVuIiB9KSApOworICB9CisKKyAgdGhpc19wbGF5ZXIoKS0+U2V0KCBQX05PX0FUVEFDSywgIydub19hdHRhY2ssIEZfUVVFUllfTUVUSE9EICk7CisgIHRoaXNfcGxheWVyKCktPlNldCggUF9QT0lTT04sICMnbm9fcG9pc29uLCBGX1NFVF9NRVRIT0QgKTsKKyAgCisgICIvcm9vbS9kZWF0aC9kZWF0aF9yb29tIi0+YWRkX3BsYXllcih0aGlzX3BsYXllcigpKTsKK30KKworLy8gcHVibGljLCBkYSBjb21tYW5kX21lKCkgc29uc3QgYnVnZ3QgKFd1cnplbHMgU3BlZWR5IG8uYWUuKQorcHVibGljIGludCBmaWx0ZXJfbGRmaWVkKCBzdHJpbmcgc3RyICkKK3sKKyAgICAvLyBEZXNjcmlwdGlvbjogICBGaWx0ZXIgb3V0IHJlbGV2YW50IGNvbW1hbmRzLgorICAgIHN0cmluZyB2ZXJiOworICAgIAorICAgIHZlcmI9cXVlcnlfdmVyYigpOworICAgIAorICAgIGlmICggKHZlcmIgPT0gInNjaGxhZmUiIHx8IHZlcmIgPT0gInNjaGxhZiIpICYmIHN0ciA9PSAiZWluIiApeworICAgICAgICB3cml0ZSgiRFUgS0FOTlNUIERFTSBUT0QgTklDSFQgRU5UUklOTkVOIVxuIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAKKyAgICBpZiAoIHZlcmIgPT0gInR5cG8iIHx8IHZlcmIgPT0gImZlaGxlciIgfHwgdmVyYiA9PSAiYnVnIiB8fCB2ZXJiID09ICJpZGVlIiApCisgICAgICAgIHJldHVybiAwOworCisgICAgd3JpdGUoICJEZWluIEtvZXJwZXIgZ2Vob3JjaHQgRGlyIG5pY2h0ICFcbiIgKTsKKyAgICByZXR1cm4gMTsKK30KKworcHVibGljIGludCBub19hdHRhY2soKQoreworICBpbnQgaTsKKworICAvLyBTcGllbGVyIGhhZW5ndCBub2NoIGluIGRlciBUb2Rlc3NlcXVlbnoKKyAgaWYoIHByZXNlbnQocHJldmlvdXNfb2JqZWN0KCkpICkKKyAgICByZXR1cm4gMTsKKyAgZWxzZQorICAgIHByZXZpb3VzX29iamVjdCgpLT5TZXQoIFBfTk9fQVRUQUNLLCAwLCBGX1FVRVJZX01FVEhPRCApOworCisgIHJldHVybiAwOworfQorCitwdWJsaWMgaW50IG5vX3BvaXNvbihpbnQgdmFsKQoreworICBpZiAoIHZhbCAhPSAwICkKKyAgeworICAgIGNhdGNoKCByYWlzZV9lcnJvcigiUG9pc29uaW5nIGRlYWQgcGxheWVycyBpcyBpbGxlZ2FsLiBDYWxsaW5nIG9iamVjdCAiCisgICAgICAid2FzICIrb2JqZWN0X25hbWUocHJldmlvdXNfb2JqZWN0KDEpKSsiXG4iKTtwdWJsaXNoICk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3Jvb20vZGVhdGgvdmlydHVhbC92aXJ0dWFsX2NvbXBpbGVyLmMgYi9yb29tL2RlYXRoL3ZpcnR1YWwvdmlydHVhbF9jb21waWxlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZDg4NmUKLS0tIC9kZXYvbnVsbAorKysgYi9yb29tL2RlYXRoL3ZpcnR1YWwvdmlydHVhbF9jb21waWxlci5jCkBAIC0wLDAgKzEsNDQgQEAKKy8vIE1vcmdlbkdyYXVlbiBNVURsaWIKKy8vCisvLyB2aXJ0dWFsX2NvbXBpbGVyLmMgLS0gVmlydHVlbGxlciBDb21waWxlciBmdWVyIGRpZSBUb2Rlc3JhZXVtZQorLy8KKy8vICRJZC4kCisKKworI3ByYWdtYSBzdHJvbmdfdHlwZXMKKworaW5oZXJpdCAiL3N0ZC92aXJ0dWFsL3ZfY29tcGlsZXIiOworCisjaW5jbHVkZSA8ZGVmaW5lcy5oPgorI2luY2x1ZGUgPHZfY29tcGlsZXIuaD4KKworaW50IE5vUGFyYU9iamVjdHMoKSB7cmV0dXJuIDE7fQorCit2b2lkIGNyZWF0ZSgpIAoreworICBpZiAoSVNfQ0xPTkUodGhpc19vYmplY3QoKSkpIHJldHVybjsKKyA6OmNyZWF0ZSgpOworIFNldFByb3AoUF9TVERfT0JKRUNULCAiL3Jvb20vZGVhdGgvZGVhdGhfcm9vbV92YyIpOworIHNldGV1aWQoZ2V0dWlkKCkpOworIHJldHVybjsKK30KKworc3RyaW5nIFZhbGlkYXRlKHN0cmluZyBmaWxlKSB7CisgIHN0cmluZyBiYXNlLCByb29tLCB3aG87CisKKyBmaWxlID0gOjpWYWxpZGF0ZShmaWxlKTsKKyBpZihzc2NhbmYoZmlsZSwgImRlYXRoX3Jvb21fJXMiLHdobykhPTEgfHwKKyAgICAoKHdob1swLi4zXSE9Imdhc3QiKSAmJgorICAgICghIi9zZWN1cmUvbWFzdGVyIi0+Z2V0X3VzZXJpbmZvKHdobykpKSkgcmV0dXJuIDA7CisgcmV0dXJuIGZpbGU7Cit9CisKK21peGVkIEN1c3RvbWl6ZU9iamVjdCgpCit7Cisgc3RyaW5nIGJhc2Uscm9vbSx3aG8sZmlsZSxmdW47CisKKyBpZighKGZpbGUgPSA6OkN1c3RvbWl6ZU9iamVjdCgpKSB8fAorICAgICFWYWxpZGF0ZShmaWxlKSkgcmV0dXJuIDA7CisgcmV0dXJuIGZpbGU7Cit9CisKZGlmZiAtLWdpdCBhL3Jvb20vamFpbC5jIGIvcm9vbS9qYWlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTMzMTIyMwotLS0gL2Rldi9udWxsCisrKyBiL3Jvb20vamFpbC5jCkBAIC0wLDAgKzEsMTkxIEBACisjcHJhZ21hIHN0cm9uZ190eXBlcyxydHRfY2hlY2tzCisKK2luaGVyaXQgIi9zdGQvcm9vbSI7Citpbmhlcml0ICIvc3RkL2hvb2tfY29uc3VtZXIiOworCisjZGVmaW5lIE9GRklDRSAiL2Qvd3Vlc3RlL2NhdHdlYXpsZS9yb29tL29mZmljZSIKKworI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxob29rLmg+CisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9MSUdIVCwgMSApOworICBTZXRQcm9wKFBfSU5UX1NIT1JULCJFaW5lIEdlZmFlbmduaXN6ZWxsZSIpOworICBTZXRQcm9wKFBfSU5UX0xPTkcsIGJyZWFrX3N0cmluZygKKyAgICAgICJEaWUgWmVsbGUgaXN0IGFic29sdXQgZWludG9lbmlnIHVuZCBoYXQga2VpbmUgRmVuc3Rlci4gTGFuZ2UgaGllciBkcmluIgorICAgICAgInp1IHNpdHplbiBpc3QgYmVzdGltbXQgbmljaHQgYW5nZW5laG0uIFdlbm4gZHUgaGllciBoZXJhdXMgd2lsbHN0LCAiCisgICAgICAia2FubnN0IER1IHdvaGwgbnVyIGRlbiBTaGVyaWZmLCBzZWluZW4gU3RlbGx2ZXJ0cmV0ZXIgb2RlciBlaW5lbiAiCisgICAgICAiRXJ6bWFnaWVyIGRhcnVtIGJpdHRlbi4iLDc4KSk7CisgIFNldFByb3AoUF9JTkRPT1JTLDEpOworfQorCit2b2lkIGluaXQoKQoreworICA6OmluaXQoKTsKKyAgaWYgKCFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKHRoaXNfcGxheWVyKCkpKQorICAgIHJldHVybjsKKyAgaWYgKCBJU19ERVBVVFkodGhpc19wbGF5ZXIoKSkgKSAvLyBFTSsgc2luZCBzb3dpZXNvIERlcHV0aWVzCisgICAgcmV0dXJuOworICBhZGRfYWN0aW9uKCJibGEiLCIiLDEpOworICBpbnB1dF90bygibXVya3MiLDApOworCisgIC8vIE1vdmUtSG9vayBhbmhhZW5nZW4KKyAgaW50IHJldCA9IHRoaXNfcGxheWVyKCktPkhSZWdpc3RlclRvSG9vayhIX0hPT0tfTU9WRSwgdGhpc19vYmplY3QoKSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIX0hPT0tfTElCUFJJTygxKSxIX0hPT0tfU1VSVkVZT1IsCisJCQkJIC0xKTsKKyAgaWYgKCByZXQgPD0wICkKKyAgICAgIHJhaXNlX2Vycm9yKCJGZWhsZXI6IE1vdmUtSG9vayBrb25udGUgbmljaHQgcmVnaXN0cmllcnQgd2VyZGVuLiAiCisgICAgICAgICAgICAgICAgICAiSFJlZ2lzdGVyVG9Ib29rLUVyZ2VibmlzOiAiICsgcmV0ICsgIlxuIik7Cit9CisKKy8vIE1vdmUtSG9vayBhdXN0cmFnZW4uCit2b2lkIGV4aXQob2JqZWN0IGxpdikgeworICBpZiAob2JqZWN0cChsaXYpICYmICFJU19ERVBVVFkobGl2KSkKKyAgICBsaXYtPkhVbnJlZ2lzdGVyRnJvbUhvb2soSF9IT09LX01PVkUsdGhpc19vYmplY3QoKSk7Cit9CisKK2ludCBibGEoKQoreworICBzdHJpbmcgdjsKKworICB2PXF1ZXJ5X3ZlcmIoKTsKKyAgaW5wdXRfdG8oIm11cmtzIiwwKTsKKyAgLy8gc2FnZW4gdW5kIHNjaGxhZmVuIGVybGF1YnQuCisgIGlmIChzdHJpbmdwKHYpICYmICh2PT0ic2FnInx8dj09InNhZ2UifHx2WzBdPT0nXCcnCisgICAgICAgIHx8dj09InNjaGxhZmUifHx2PT0ic2NobGFmIikpCisgICAgICByZXR1cm4gMDsKKyAgd3JpdGUoIk5peCBkYS5cbiIpOworICByZXR1cm4gMTsKK30KKworaW50IG11cmtzKHN0cmluZyBzdHIpCit7CisgIGlmICghdGhpc19wbGF5ZXIoKSB8fCBlbnZpcm9ubWVudCh0aGlzX3BsYXllcigpKSE9dGhpc19vYmplY3QoKSkgCisgICAgICByZXR1cm4gMDsKKworICBpbnB1dF90bygibXVya3MiLDApOworCisgIGlmICghc3RyfHxzdHI9PSIiKSByZXR1cm4gMTsKKyAgLy8gRWluc2NobGFmZW4gZXJsYXVidC4KKyAgaWYgKHN0ciA9PSAic2NobGFmZSBlaW4iKSB7CisgICAgICB0aGlzX3BsYXllcigpLT5jb21tYW5kKCJzY2hsYWZlIGVpbiIpOworICAgICAgcmV0dXJuIDE7CisgIH0KKyAgaWYgKHN0clswXT09J1wnJykgc3RyPSJzYWcgIitzdHJbMS4uXTsKKyAgaWYoc3RyWzAuLjNdPT0ic2FnICJ8fHN0clswLi40XT09InNhZ2UgIikKKyAgeworICAgICAgIHN0cj1pbXBsb2RlKG9sZF9leHBsb2RlKHN0ciwiICIpWzEuLl0sIiAiKTsKKyAgICAgd3JpdGUoYnJlYWtfc3RyaW5nKHN0ciwgNzgsICJEdSBzYWdzdDogIikpOworICAgICB0ZWxsX3Jvb20odGhpc19vYmplY3QoKSxicmVha19zdHJpbmcoc3RyLDc4LAorICAgICAgICAgY2FwaXRhbGl6ZSh0aGlzX3BsYXllcigpLT5uYW1lKCkpKyIgc2FndDogIiksKHt0aGlzX3BsYXllcigpfSkpOworICAgICByZXR1cm4gMTsKKyAgfQorICB3cml0ZSgiTml4IGRhLlxuIik7CisgIHJldHVybiAxOworfQorCitwdWJsaWMgdmFyYXJncyBpbnQgcmVtb3ZlKGludCBzaWxlbnQpIHsKKyAgLy8ga2VpbmUgWmVyc3RvZXJ1bmcsIHdlbm4gU3BpZWxlciBkcmluIHNpbmQuCisgIGlmIChzaXplb2YoZmlsdGVyKGFsbF9pbnZlbnRvcnkoKSwjJ3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUpKSkKKyAgICByZXR1cm4gMDsKKworICByZXR1cm4gOjpyZW1vdmUoMSk7Cit9CisKK3B1YmxpYyBzdHJpbmcgTm90aWZ5RGVzdHJ1Y3Qob2JqZWN0IGNhbGxlcikgeworCisgIGlmIChwcmV2aW91c19vYmplY3QoKSAhPSBtYXN0ZXIoKQorICAgICAgfHwgY2FsbGVyID09IHRoaXNfb2JqZWN0KCkpCisgICAgcmV0dXJuIDA7CisKKyAgLy8gd2VubiBrZWluZXIgaGllciBpc3QsIGlzdHMgZWdhbC4KKyAgaWYgKCFzaXplb2YoZmlsdGVyKGFsbF9pbnZlbnRvcnkoKSwjJ3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUpKSkKKyAgICByZXR1cm4gMDsKKworICAvLyBEaXJla3RlciBEZXN0cnVjdCBtaXQgQW53ZXNlbmRlbiBudXIgZnVlciBFTSsKKyAgaWYgKCFwcm9jZXNzX2NhbGwoKSAmJiB0aGlzX2ludGVyYWN0aXZlKCkKKyAgICAgICYmIElTX0FSQ0godGhpc19pbnRlcmFjdGl2ZSgpKSkKKyAgICByZXR1cm4gMDsKKyAgICAgIAorICByZXR1cm4gIkRpcmVrdGUgWmVyc3RvZXJ1bmcgZGVzIEphaWxzIG51ciBmdWVyIEVNKyBlcmxhdWJ0LlxuIjsKK30KKworCisvLyBrZWluZSBhbmRlcmVuIE1vdmUtSG9va3MgZXJsYXVidCBhdXNzZXIgZGllc2VtLi4uCitzdGF0dXMgSG9va1JlZ2lzdHJhdGlvbkNhbGxiYWNrKG9iamVjdCByZWdpc3RyaW5nT2JqZWN0LCBpbnQgaG9va2lkLCBvYmplY3QKKyAgICBob29rU291cmNlLCBpbnQgcmVnaXN0cmluZ09iamVjdHNQcmlvcml0eSwgaW50IHJlZ2lzdHJpbmdPYmplY3RzVHlwZSkKK3sKKyAgICBpZiAoaG9va2lkPT1IX0hPT0tfTU9WRSkKKyAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIDE7Cit9CitzdGF0dXMgSG9va0NhbmNlbEFsbG93YW5jZUNhbGxiYWNrKG9iamVjdCBjYW5jZWxsaW5nT2JqZWN0LCBpbnQgaG9va2lkLCBvYmplY3QKKyAgICBob29rU291cmNlLCBpbnQgY2FuY2VsbGluZ09iamVjdHNQcmlvcml0eSwgbWl4ZWQgaG9va0RhdGEpCit7CisgICAgaWYgKGhvb2tpZD09SF9IT09LX01PVkUgJiYgY2FuY2VsbGluZ09iamVjdCAhPSB0aGlzX29iamVjdCgpCisgICAgICAgICYmIHByZXNlbnQoaG9va1NvdXJjZSx0aGlzX29iamVjdCgpKSkKKyAgICAgIHJldHVybiAwOworCisgICAgcmV0dXJuIDE7Cit9CisKK3N0YXR1cyBIb29rTW9kaWZpY2F0aW9uQWxsb3dhbmNlQ2FsbGJhY2sob2JqZWN0IG1vZGlmeWluZ09iamVjdCwgaW50IGhvb2tpZCwKKyAgICBvYmplY3QgaG9va1NvdXJjZSwgaW50IG1vZGlmeWluZ09iamVjdHNQcmlvcml0eSwgbWl4ZWQgaG9va0RhdGEpCit7CisgICAgaWYgKGhvb2tpZD09SF9IT09LX01PVkUgJiYgbW9kaWZ5aW5nT2JqZWN0ICE9IHRoaXNfb2JqZWN0KCkKKyAgICAgICAgJiYgcHJlc2VudChob29rU291cmNlLHRoaXNfb2JqZWN0KCkpKQorICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gMTsKK30KKworbWl4ZWQgSG9va0NhbGxiYWNrKG9iamVjdCBob29rU291cmNlLCBpbnQgaG9va2lkLCBtaXhlZCBob29rRGF0YSkKK3sKKyAgLy8gbnVyIG1vdmUgaG9va3Mgc2luZCBpbnRlcmVzc2FudCBoaWVyLgorICBpZiAoaG9va2lkICE9IEhfSE9PS19NT1ZFKQorICAgIHJldHVybiAoe0hfTk9fTU9ELCBob29rRGF0YX0pOworCisgIC8vIGRhcyBkdWVyZnRlIGVpZ2VudGxpY2ggbmljaHQgdm9ya29tbWVuLCBkYSBkZXIgSG9vayBpbSBleGl0KCkgZ2Vsb2VzY2h0CisgIC8vIHdpcmQuLi4KKyAgaWYgKGVudmlyb25tZW50KGhvb2tTb3VyY2UpICE9IHRoaXNfb2JqZWN0KCkpIHsKKyAgICBob29rU291cmNlLT5IVW5yZWdpc3RlckZyb21Ib29rKEhfSE9PS19NT1ZFLHRoaXNfb2JqZWN0KCkpOworICAgIHJldHVybiAoe0hfTk9fTU9ELCBob29rRGF0YX0pOworICB9CisKKyAgLy8gQmV3ZWd1bmdlbiBpbiBkZW4gTmV0enRvdGVucmF1bSBzaW5kIG9rLgorICBpZiAoIWludGVyYWN0aXZlKGhvb2tTb3VyY2UpCisgICAgICAmJiBwb2ludGVycChob29rRGF0YSkgJiYgc2l6ZW9mKGhvb2tEYXRhKSA+PSAxKQorICB7CisgICAgaWYgKChvYmplY3RwKGhvb2tEYXRhWzBdKQorICAgICAgICAgICYmIG9iamVjdF9uYW1lKGhvb2tEYXRhWzBdKSA9PSAiL3Jvb20vbmV0enRvdCIpCisgICAgICAgIHx8IChzdHJpbmdwKGhvb2tEYXRhWzBdKSAmJiBob29rRGF0YVswXT09Ii9yb29tL25ldHp0b3QiKQorICAgICAgICApCisgICAgeworICAgICAgcmV0dXJuICh7SF9OT19NT0QsIGhvb2tEYXRhfSk7CisgICAgfQorICB9CisKKyAgLy8gRGVwdXR5IChvZGVyIGhvZWhlciksIGtlaW4gcHJvY2Vzc19jYWxsKCkuIFNvbnN0IHdpcmQgZGllIEJld2VndW5nCisgIC8vIGFiZ2Vicm9jaGVuLgorICBpZiAoIXRoaXNfaW50ZXJhY3RpdmUoKSB8fCAhSVNfREVQVVRZKHRoaXNfaW50ZXJhY3RpdmUoKSkpCisgIHsKKyAgICAgIHJldHVybiAoe0hfQ0FOQ0VMTEVELCBob29rRGF0YX0pOworICB9CisKKyAgcmV0dXJuICh7SF9OT19NT0QsIGhvb2tEYXRhfSk7Cit9CisKKy8vIHdlbm4gaGllciBqZW1hbmQgZHVyY2ggWmVyc3RvZXJ1bmcgZGVzIE9iamVrdGVzIHJhdXNrb21tZW4gd2lsbCwgZ2VodCBkYXMKKy8vIHNjaGllZi4KK3ZhcmFyZ3Mgdm9pZCBOb3RpZnlSZW1vdmUob2JqZWN0IG9iKSB7CisgIGlmIChvYmplY3RwKG9iKSAmJiBxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSAmJiAhSVNfREVQVVRZKG9iKSkKKyAgeworICAgIG9iLT5TZXRQcm9wKFBfU1RBUlRfSE9NRSwiL3Jvb20vamFpbCIpOworICAgIG9iLT5zYXZlX21lKDApOworICB9Cit9CisKZGlmZiAtLWdpdCBhL3Jvb20vbXVlbGxyYXVtLmMgYi9yb29tL211ZWxscmF1bS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYzRkMjIKLS0tIC9kZXYvbnVsbAorKysgYi9yb29tL211ZWxscmF1bS5jCkBAIC0wLDAgKzEsNjcgQEAKK2luaGVyaXQgInN0ZC9yb29tIjsKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX0xJR0hULCAxICk7CisgIFNldFByb3AoUF9JTlRfU0hPUlQsICJEZXIgTXVlbGxyYXVtIiApOworICBTZXRQcm9wKFBfSU5ET09SUywgMSk7CisgIFNldFByb3AoUF9ORVZFUl9DTEVBTiwgMSk7CisgIFNldFByb3AoUF9JTlRfTE9ORyxicmVha19zdHJpbmcoCisgICAgIkRpZXNlciBSYXVtIGlzdCB2b2xsa29tbWVuIGxlZXIgdW5kIGFuc2NoZWluZW5kIHJpaWlpaWllc2lnIGdyb3NzLiAiCisgICAgIkR1IGthbm5zdCBzZWluZSBBdXNzbWFzc2UgbmljaHRtYWxzIGFic2NoYWV0emVuLiBOYWphLiBNdXNzIHdvaGwgYXVjaCAiCisgICAgInNvIHNlaW4sIGRlbm4gaGllciBrb21tZW4gYWxsZSBDbG9uZXMgcmVpbiwgZGllIGVpbmlnZSBTZWt1bmRlbiAiCisgICAgIm5hY2ggaWhyZXIgRXJzdGVsbHVuZyBub2NoIGtlaW4gWnVoYXVzZSAoRW52aXJvbm1lbnQpIGdlZnVuZGVuIGhhYmVuLiAiCisgICAgIldlbm4gRHUgZGFzIG1hZ2lzY2hlIEtvbW1hbmRvICd3ZWx0JyBnaWJzdCwgd2lyc3QgRHUgd2llZGVyIGluIERlaW5lIFdlbHRcbiIKKyAgICAienVydWVja3ZlcnNldHp0IHdlcmRlbi4iKSk7CisgIEFkZEV4aXQoIndlbHQiLCAiL2dpbGRlbi9hYmVudGV1cmVyIik7Cit9CisKKy8vIHJla3Vyc2l2IHplcnN0b2VyZW4KK3ByaXZhdGUgdm9pZCByZWNfcmVtb3ZlKG9iamVjdCBvYikgeworICBvYmplY3QgKmludj1hbGxfaW52ZW50b3J5KG9iKTsKKyAgaWYgKHNpemVvZihpbnYpKSB7CisgICAgZmlsdGVyKGludiwgIydyZWNfcmVtb3ZlKTsKKyAgfQorICBvYi0+cmVtb3ZlKDEpOworICBpZiAob2JqZWN0cChvYikpIGRlc3RydWN0KG9iKTsKK30KKworaW50IGNsZWFuX21lKCkgeworICBvYmplY3QgKmludj1hbGxfaW52ZW50b3J5KHRoaXNfb2JqZWN0KCkpOworICBpbnQgaXNpemU9c2l6ZW9mKGludik7CisgIGlmIChpc2l6ZT4xMDApIHsKKyAgICAvL2FlbHRlc3RlcyBPYmpla3QsIHdhcyBrZWluIFNwaWVsZXIgaXN0LCB6ZXJzdG9lcmVuLiBQcnVlZnVuZyBhdWYgU3BpZWxlcgorICAgIC8vaXN0IFBhcmFub2lhLCBlaWdlbnRsaWNoIHNvbGx0ZSBoaWVyIG5pZSBlaW5lciBoaW5rb21tZW4ga29lbm5lbiwgYXVzc2VyCisgICAgLy9tYWdpZXIsIHVuZCB1bSBkaWUgd2FlcnMgZGFubiBuaWNodCBzY2hhZGUuICpnKgorICAgIGZvciAoaXNpemUtLTsgaXNpemUtLTsgKSB7CisgICAgICBpZiAoIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUoaW52W2lzaXplXSkpIHsKKwlyZWNfcmVtb3ZlKGludltpc2l6ZV0pOworCXJldHVybigxKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK3ZhcmFyZ3MgaW50IFByZXZlbnRJbnNlcnQob2JqZWN0IHBsKSB7CisKKyAgaWYgKCFvYmplY3RwKHBsKSkKKyAgICByZXR1cm4gMTsKKyAgY2xlYW5fbWUoKTsKKyAgcmV0dXJuIDA7Cit9CisKK3ZhcmFyZ3MgaW50IFByZXZlbnRJbnNlcnRMaXZpbmcob2JqZWN0IHBsKSB7CisKKyAgLy8ga2VpbmUgU3BpZWxlci4gOy0pCisgIGlmICghb2JqZWN0cChwbCkgfHwgCisgICAgICAocXVlcnlfb25jZV9pbnRlcmFjdGl2ZShwbCkgJiYgIUlTX0xFQVJORVIocGwpKSkKKyAgICByZXR1cm4gMTsKKworICBjbGVhbl9tZSgpOworICByZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvcm9vbS9uZXR6dG90LmMgYi9yb29tL25ldHp0b3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDFjNDZiCi0tLSAvZGV2L251bGwKKysrIGIvcm9vbS9uZXR6dG90LmMKQEAgLTAsMCArMSw5MiBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vICRJZDogbmV0enRvdC5jIDg3NDcgMjAxNC0wNC0yNiAxMzowODo0N1ogWmVzc3RyYSAkCisKKyNpbmNsdWRlIDx3aXpsZXZlbHMuaD4KKyNpbmNsdWRlIDxtb3ZpbmcuaD4KKworY3JlYXRlKCkKK3sKKyAgY2FsbF9vdXQoImludmNoZWNrIiwxMjApOworICAiL29iai9zcGVycmVyIi0+Tml4R2lidHMoKTsKK30KKword2VnKG9iKQoreworICBpZiAoIW9iamVjdHAob2IpKQorICAgIHJldHVybjsKKyAgb2ItPnJlbW92ZSgpOworICBpZiAob2IpCisgICAgZGVzdHJ1Y3Qob2IpOworfQorCit3ZWdyYWV1bWVuKG9iKQoreworICBvYmplY3QgKng7CisgIAorICBpZiAoIW9iamVjdHAob2IpKQorICAgIHJldHVybjsKKyAgZm9yICh4PWRlZXBfaW52ZW50b3J5KG9iKTtzaXplb2YoeCk7eD14WzEuLl0pCisgICAgd2VnKHhbMF0pOworICBvYi0+bW92ZSgiL3Jvb20vdm9pZCIsTV9OT0NIRUNLfE1fU0lMRU5UKTsKKyAgd2VnKG9iKTsKK30KKworaW52Y2hlY2soKQoreyAKKyAgd2hpbGUocmVtb3ZlX2NhbGxfb3V0KCJpbnZjaGVjayIpIT0tMSk7CisgIGZvcmVhY2gob2JqZWN0IG9iOiBhbGxfaW52ZW50b3J5KHRoaXNfb2JqZWN0KCkpKQorICB7CisgICAgaWYgKGludGVyYWN0aXZlKG9iKSkKKyAgICB7CisgICAgICBjYXRjaCh0aGlzX3BsYXllcigpLT5tb3ZlKCIvcm9vbS92b2lkIixNX0dPKSk7CisgICAgICBzZXRfb2JqZWN0X2hlYXJ0X2JlYXQob2IsMSk7CisgICAgfQorICAgIGVsc2UgaWYgKCFxdWVyeV9vbmNlX2ludGVyYWN0aXZlKG9iKSAmJiBvYmplY3RfbmFtZShvYikhPSIvb2JqL3NwZXJyZXIiKQorICAgICAgY2FsbF9vdXQoIndlZ3JhZXVtZW4iLDEsb2IpOworICB9CisgIGNhbGxfb3V0KCJpbnZjaGVjayIsMTIwKTsKKyAgIi9vYmovc3BlcnJlciItPnVwZCgpOworfQorCitpbml0KCkKK3sKKyAgaWYgKCF0aGlzX3BsYXllcigpKQorICAgIHJldHVybjsKKyAgY2F0Y2godGhpc19wbGF5ZXIoKS0+U3RvcEh1bnRpbmdNb2RlKCkpOworICBpZiAoaW50ZXJhY3RpdmUodGhpc19wbGF5ZXIoKSkpCisgICAgY2F0Y2godGhpc19wbGF5ZXIoKS0+bW92ZSgiL3Jvb20vdm9pZCIsTV9HTykpOworICBpZiAoIXF1ZXJ5X29uY2VfaW50ZXJhY3RpdmUodGhpc19wbGF5ZXIoKSkpCisgIHsKKyAgICB0aGlzX3BsYXllcigpLT5yZW1vdmUoKTsKKyAgICBpZih0aGlzX3BsYXllcigpKQorICAgICAgZGVzdHJ1Y3QodGhpc19wbGF5ZXIoKSk7CisgIH0KKyAgc2V0X29iamVjdF9oZWFydF9iZWF0KHRoaXNfcGxheWVyKCksMCk7Cit9CisKK2ludF9sb25nKCkKK3sKKyAgcmV0dXJuICJEaWVzIGlzdCBkZXIgTmV0enRvdGVucmF1bS4gRXMgaXN0IGR1bmtlbC4gRHUgc2llaHN0IG5pY2h0cy5cbiI7Cit9CisKK2ludF9zaG9ydCgpCit7CisgIHJldHVybiAiTmljaHRzIHp1IHNlaGVuLlxuIjsKK30KKworUXVlcnlQcm9wKHN0cmluZyBzdHIpCit7CisgIHN3aXRjaCAoc3RyKSB7CisgICAgY2FzZSAiaW50X2xvbmciOiByZXR1cm4gaW50X2xvbmcoKTsKKyAgICBjYXNlICJpbnRfc2hvcnQiOiByZXR1cm4gaW50X3Nob3J0KCk7CisgIH0KK30KKworLy8gTmljaHQgamVkZXIgTWFnaWVyIGRhcmYgZGVuIE5ldHp0b3RlbnJhdW0gZW50c29yZ2VuLgorc3RyaW5nIE5vdGlmeURlc3RydWN0KG9iamVjdCBjYWxsZXIpIHsKKyAgICBpZiggKGNhbGxlciE9dGhpc19vYmplY3QoKSAmJiAhQVJDSF9TRUNVUklUWSkgfHwgcHJvY2Vzc19jYWxsKCkgKSB7CisgICAgICByZXR1cm4gIkR1IGRhcmZzdCBkZW4gTmV0enRvdGVucmF1bSBuaWNodCB6ZXJzdG9lcmVuIVxuIjsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Jvb20vbmlydmFuYS5jIGIvcm9vbS9uaXJ2YW5hLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE2NjA3NAotLS0gL2Rldi9udWxsCisrKyBiL3Jvb20vbmlydmFuYS5jCkBAIC0wLDAgKzEsMTMyIEBACisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorCitpbmhlcml0ICJzdGQvcm9vbSI7CisKK2NyZWF0ZSgpIHsKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX0lORE9PUlMsIDEpOworICBTZXRQcm9wKFBfTElHSFQsMSk7CisgIFNldFByb3AoUF9JTlRfTE9ORywKKyJEdSBiZWZpbmRlc3QgRGljaCBpbSBOaXJ2YW5hIVxuIisKKyJFcyBzaWVodCBhbmRlcnMgYXVzIGFscyBEdSBlcyBEaXIgdm9yZ2VzdGVsbHQgaGFzdC4gRWluZSByaWVzaWdlIEhhbGxlIFxuIisKKyJtaXQgV2FlbmRlbiBhdXMgTmViZWwsIGVpbmVtIEJvZGVuIGF1cyBXYXNzZXIgdW5kIGVpbmVyIERlY2tlIGF1cyBGZXVlclxuIisKKyJiaWxkZXQgZGFzIEhlaW0gZGVyIGV3aWcgVmVyc3RvcmJlbmVuLlxuIisKKyJTdGlsbGUgaGVycnNjaHQgaGllci4gR3Jvc3NlIFN0aWxsZS4gU1RJTExFIHNvenVzYWdlbi5cbiIrCisiUmF1Y2ggZHVyY2h6aWVodCBkaWUgTHVmdC4gRXIgZW50c3ByaW5ndCBlaW5lciBSYWV1Y2hlcnNjaGFsZSwgd2VsY2hlIGF1ZlxuIisKKyJlaW5lbSByaWVzaWdlbiBBbHRhciBtaXR0ZW4gaW0gTmlydmFuYSBzdGVodC5cbiIrCisiRHUgYmlzdCBudW4gd29obCB3aXJrbGljaCB0b3QuXG4iKTsKKyAgU2V0UHJvcChQX0lOVF9TSE9SVCwiSW0gTmlydmFuYSIpOworICBTZXRQcm9wKFBfTk9fVFBPUlQsTk9fVFBPUlQpOworICBTZXRQcm9wKFBfTk9fUEFSQV9UUkFOUyk7CisgIAorICBBZGREZXRhaWwoImFsdGFyIiwKKyJEZXIgQWx0YXIgZGVyIHZlcnp3ZWlmZWx0ZW4gVG90ZW4uIEVyIGJlc3RlaHQgdm9sbHN0YWVuZGlnIGF1cyBncmluc2VuZGVuICIrCisiVG90ZW5zY2hhZWRlbG4gdW5kIGJpZXRldCBrZWluZXJsZWkgSG9mZm51bmcuXG5FaW5lIFJhZXVjaGVyc2NoYWxlIHN0ZWh0IGF1ZiBkZW0gQWx0YXIuXG4iKTsKKworICBBZGREZXRhaWwoKHsidG90ZSIsInRvdGVuIiwidmVyc3RvcmJlbmUifSksCisiRGllcyBoaWVyIGlzdCBkYXMgSGVpbSBkZXIgVG90ZW4uXG5EdSB3b2huc3QgaGllci5cbiIpOworCisgIEFkZERldGFpbCgoeyJob2ZmbnVuZyJ9KSwKKyJIQUhBLCBLRUlORSBIT0ZGTlVORyFcbiIpOworCisgIEFkZERldGFpbCgoeyJzY2hhZWRlbCIsInRvdGVuc2NoYWVkZWwifSksCisiU2llIGdyaW5zZW4gRGljaCBoYWVtaXNjaCBhbiBhbHMgd29sbHRlbiBzaWUgZGljaCB2ZXJzcG90dGVuLlxuIisKKyJBdWYgZWluZW0gU2NoYWRlbCBlcmtlbm5zdCBEdSBlaW5lIEluc2NocmlmdC5cbiIpOworCisgIEFkZERldGFpbCgoeyJpbnNjaHJpZnQifSksCisiRHUga2FubnN0IHNpZSBsZXNlbi5cbiIpOworCisgIEFkZFJlYWREZXRhaWwoKHsiaW5zY2hyaWZ0In0pLAorIkRJRVMgSVNUIEtFSU4gQVBSSUxTQ0hFUlouXG4iKTsKKworICBBZGREZXRhaWwoKHsic2NoYWxlIiwicmFldWNoZXJzY2hhbGUifSksCisiQXVzIGRlciBTY2hhbGUgZW50c3RlaWd0IGR1bmtsZXIgUmF1Y2gsIGRlciBkaWUgTHVmdCB1bmhlaWx2b2xsIHNjaHdhZW5nZXJ0LlxuIik7CisKKworICBBZGREZXRhaWwoKHsibHVmdCJ9KSwKKyJMdWZ0IHdhciBlaW5tYWwgbGViZW5zbm90d2VuZGlnLiBEdSBicmF1Y2hzdCBzaWUgbmljaHQgbWVoci5cbiIpOworCisgIEFkZERldGFpbCgoeyJyYXVjaCJ9KSwKKyJEZXIgUmF1Y2ggdmVyZHVua2VsdCBkaWUgTHVmdC4gRXIgd3VlcmRlIGplZGVuIExlYmVuZGVuIGVyc3RpY2tlbiwgYWJlciBkYXMgc2NocmVja3QgRGljaCBuaWNodCBtZWhyLlxuIik7CisKKyAgQWRkRGV0YWlsKCh7InN0aWxsZSJ9KSwKKyJTaWUgaG9lcnQgc2ljaCBpcmdlbmR3aWUgdG90IHVuZCBlbmRndWVsdGlnIGFuLlxuIik7CisKKyAgQWRkRGV0YWlsKCh7Im5pcnZhbmEiLCJyYXVtIn0pLAorIlNjaGF1IERpY2ggbnVyIHVtLlxuIik7CisKKyAgQWRkRGV0YWlsKCh7ImxlYmVuZGUifSksCisiWnUgZGVuZW4gZ2Vob2Vyc3QgRHUgbmljaHQgbWVoci5cbiIpOworCisgIEFkZERldGFpbCgoeyJuZWJlbCJ9KSwKKyJEZXIgTmViZWwgYmVncmVuenQgZGFzIE5pcnZhbmEgc2VpdGxpY2guIEVyIGZvcm10IGRpZSBXYWVuZGUuXG4iKTsKKworICBBZGREZXRhaWwoKHsid2Fzc2VyIn0pLAorIkRlciBCb2RlbiBkZXMgTmlydmFuYXMgc2NoZWludCBhdXMgV2Fzc2VyIHp1IGJlc3RlaGVuLiBEdSBiaXN0IHRvdCB1bmQgZ2Voc3QgZGFoZXIgbmljaHQgdW50ZXIuXG4iKTsKKworICBBZGREZXRhaWwoKHsiZmV1ZXIifSksCisiRGllIERlY2tlIGRlcyBOaXJ2YW5hcyBsb2RlcnQgRGlyIGZldXJpZyBlbnRnZWdlbi4gV2FlcmVzdCBEdSBhbSBMZWJlbiwgd3VlcmRlIERpY2ggZGFzIGJldW5ydWhpZ2VuLlxuIik7CisKKyAgQWRkRGV0YWlsKCh7ImhhbGxlIn0pLAorIkRpZSBIYWxsZSBkZXIgVG90ZW4uIERhcyBOaXJ2YW5hLlxuIik7CisKKyAgQWRkRGV0YWlsKCh7ImhlaW0ifSksCisiRGFzIEhlaW0gZGVyIFRvdGVuIGlzdCBkYXMgTmlydmFuYS4gRGVpbiBIZWltLlxuIik7CisKKworICBBZGREZXRhaWwoKHsiYm9kZW4ifSksCisiRGVyIEJvZGVuIHdhYmVydCB1bnRlciBEaXIuIE1hbmNobWFsIG1laW5zdCBEdSBkYXMgR2VzaWNodCBKb2ZzIHp1IGVya2VubmVuLlxuIik7CisKKyAgQWRkRGV0YWlsKCh7Imdlc2ljaHQifSksCisiR2VzaWNodGVyIHNpbmQgZnVlciBEaWNoIG5pY2h0IG1laHIgd2ljaHRpZy5cbiIpOworCisgIEFkZERldGFpbCgoeyJqb2YifSksCisiRXIgc2NobGFlZnQuXG4iKTsKKworCisgIEFkZERldGFpbCgoeyJkZWNrZSJ9KSwKKyJEaWUgRGVja2UgbG9kZXJ0IERpciBlbnRnZWdlbi4gQWJ1bmR6dSBtZWluc3QgRHUgUnVtYXRhIHp1IGVya2VubmVuLlxuIik7CisKKyAgQWRkRGV0YWlsKCh7InJ1bWF0YSJ9KSwKKyJFciBpc3Qgd29obCBkb2NoIG5pY2h0IGRhLiBOaWVtYW5kIHdpcmQgRGlyIGhlbGZlbi4gRXMgaXN0IGF1cy5cbiIpOworCisgIEFkZERldGFpbCgoeyJ3YW5kIiwid2FlbmRlIn0pLAorIkRlciBOZWJlbCB3YWJlcnQgYXVmIHVuZCBhYi4gTWFuY2htYWwgc2NoZWludCBlcyBzbywgYWxzIHdhbmRlcmUgWm9vayBkdXJjaCBkZW4gTmViZWwuXG4iKTsKKworCisgIEFkZERldGFpbCgoeyJ6b29rIn0pLAorIkVyIGdyaW5zdCBEaWNoIGFuLiBEYXMgaXN0IHdvaGwgZGFzIEVuZGUgZGVyIEhvZmZudW5nLlxuV2VpdCBoaW50ZXIgWm9vayBlcmtlbm5zdCBEdSBlaW5lIHdlaXRlcmUgR2VzdGFsdC5cbiIpOworCisgIEFkZERldGFpbCgoeyJnZXN0YWx0In0pLAorIkVzIHNjaGVpbnQgc2ljaCB1bSBCb2luZyB6dSBoYW5kZWxuLlxuIik7CisKKyAgQWRkRGV0YWlsKCh7ImJvaW5nIn0pLAorIkJvaW5nIHNjaGF1dCBEaWNoIHRyYXVyaWcgYW4uXG4iKTsKKworCisgIEFkZERldGFpbCgoeyJlbmRlIn0pLAorIkR1IGhhc3QgRGVpbiBFbmRlIGVycmVpY2h0LiBEdSBiaXN0IHRvdC5cbiIpOworCisgIEFkZERldGFpbCgoeyJsZWJlbiJ9KSwKKyJEZWluIExlYmVuIGlzdCB6dSBFbmRlLiBEdSBiaXN0IHRvdC5cbiIpOworCisgIEFkZENtZCgiYmV0ZSIsImJldGUiKTsKKyAgQWRkSXRlbSgiL29iai96ZWl0dW5nc2F1dG9tYXQiLCBSRUZSRVNIX1JFTU9WRSk7Cit9CisKK2JldGUoKSB7CisgIHdyaXRlKCJEdSBoYWVsdHN0IGVpbmUga3VyemUgQW5kYWNodC5cbiIpOworICBpZiAodGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfR0hPU1QpICYmIHRoaXNfcGxheWVyKCktPnF1ZXJ5X2hjX3BsYXkoKT4xKSB7CisJd3JpdGUoIkVpbmUgc2VociBzdGFya2UgS3JhZnQgc2F1Z3QgRGljaCBhdWYgdW5kIHNwdWNrdCBEaWNoIHdpZWRlciBhdXMuXG5FcyBzY2hlaW50IHNpY2ggYWJlciBuaWNodHMgdmVyYWVuZGVydCB6dSBoYWJlbi5cbiIpOworCXNheSh0aGlzX3BsYXllcigpLT5uYW1lKCkrIiBlcnNjaGVpbnQgbmljaHQgaW4ga29lcnBlcmxpY2hlciBGb3JtLlxuIik7CisJdGhpc19wbGF5ZXIoKS0+U2V0UHJvcChQX0dIT1NULDApOworICB9CisgIGVsc2UKKyAgeworICAgICAgICB3cml0ZSgiRnVlciBEaWNoIGlzdCBkaWVzZXIgQWx0YXIgbmljaHQgZ2VkYWNodCFcbiIpOworICB9CisgIHJldHVybiAxOworfQorCisKZGlmZiAtLWdpdCBhL3Jvb20vbm9zY3JpcHQuYyBiL3Jvb20vbm9zY3JpcHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2ZmMjhlCi0tLSAvZGV2L251bGwKKysrIGIvcm9vbS9ub3NjcmlwdC5jCkBAIC0wLDAgKzEsNDIgQEAKK2luaGVyaXQgIi9zdGQvcm9vbSI7CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorCitzdGF0aWMgc3RyaW5nIHg7CitzdGF0aWMgc3RyaW5nICp4eDsKKwordm9pZCBjcmVhdGUoKSB7CisgIDo6Y3JlYXRlKCk7CisgIHg9Ii0tLS0tLS0tLS0iOworICB4eD0oeworICAgICIvZC9lYmVuZS9yb29tL2FrX3N0cjciLAorICAgICIvZC9lYmVuZS9yb29tL2RyYV9zdHIzIiwKKyAgICAiL2QvZWJlbmUvcm9vbS9ocF9zdHIyYyIsCisgICAgIi9kL2ViZW5lL3Jvb20vb193YTFkIiwKKyAgICAiL2QvZWJlbmUvcm9vbS93YWxkd2VnOCIKKyAgfSk7CisgIFNldFByb3AoUF9MSUdIVCwxKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLAorIkRpZXNlciBSYXVtIGlzdCBmdWVyIExldXRlLCBkaWUgVEYgc3BpZWxlbiBsYXNzZW4uXG5cCitFcyBnaWJ0IG51ciBlaW5lbiBXZWcgaGVyYXVzLi4uXG4iKTsKKyAgQWRkQ21kKCIiLCJyYXVzIiwxKTsKK30KKwordm9pZCBpbml0KCkgeworICBpbnQgaTsKKyAgCisgIDo6aW5pdCgpOworICBmb3IgKGk9MDtpPDEwO2krKykKKyAgICB4W2ldPSdhJytyYW5kb20oMjYpOworfQorCit2YXJhcmdzIHN0cmluZyBHZXRFeGl0cyhvYmplY3Qgdmlld2VyKSB7CisgIHJldHVybiBzcHJpbnRmKCJFcyBnaWJ0IGVpbmVuIHNpY2h0YmFyZW4gQXVzZ2FuZzogJXMuXG4iLHgpOworfQorCit2YXJhcmdzIGludCByYXVzKHN0cmluZyBzKSB7CisgIGlmIChxdWVyeV92ZXJiKCkhPXgpCisgICAgcmV0dXJuIDA7CisgIG5vdGlmeV9mYWlsKCJFdHdhcyBoYXQgbmljaHQgZnVua3Rpb25pZXJ0LiBCaXR0ZSB2ZXJzdGFlbmRpZ2UgZWluZW4gTWFnaWVyLlxuIik7CisgIHJldHVybiAoKHRoaXNfcGxheWVyKCktPm1vdmUoeHhbcmFuZG9tKHNpemVvZih4eCkpXSxNX0dPKSk+MCk7Cit9CmRpZmYgLS1naXQgYS9yb29tL25vd2hlcmUuYyBiL3Jvb20vbm93aGVyZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNTVmMmIKLS0tIC9kZXYvbnVsbAorKysgYi9yb29tL25vd2hlcmUuYwpAQCAtMCwwICsxLDI4IEBACitpbmhlcml0ICJzdGQvcm9vbSI7CisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPHdpemxldmVscy5oPgorCit2b2lkIGNyZWF0ZSgpCit7CisgIDo6Y3JlYXRlKCk7CisgIFNldFByb3AoUF9MSUdIVCwgMSApOworICBTZXRQcm9wKFBfSU5UX1NIT1JULCAiQmVpIGRlbiBpbmFrdGl2ZW4gU3BpZWxlcm4gOikiICk7CisgIFNldFByb3AoUF9JTlRfTE9ORywKKyAgICAiSGllciBpc3QgYWJzb2x1dCBuaWNodHMgenUgc2VoZW4sIGRpZSwgZGllIHNpY2ggaGllciBub3JtYWxlcndlaXNlXG4iCisgICArImF1ZmhhbHRlbiwgc2luZCBlaCBub25pbnRlcmFjdGl2ZS4uLlxuIik7CisgIEFkZENtZCggIiIsICJvbmx5d2VsdCIsIDEgKTsKK30KKworaW50IG9ubHl3ZWx0KCBzdHJpbmcgcyApIHsKKyAgaWYoIHF1ZXJ5X3ZlcmIoKT09IndlbHQiICkgeworICAgIHRoaXNfcGxheWVyKCktPm1vdmUoIi9naWxkZW4vYWJlbnRldXJlciIsIE1fVFBPUlQpOworICAgIHJldHVybiAxOworICB9CisgIGlmKCBJU19MRUFSTkVSKHRoaXNfcGxheWVyKCkpICkgcmV0dXJuIDA7CisgIHdyaXRlKAorICAgIldlbm4gRHUgZGFzIG1hZ2lzY2hlIEtvbW1hbmRvICd3ZWx0JyBnaWJzdCwgd2lyc3QgRHUgd2llZGVyIGluIERlaW5lIFdlbHRcbiIKKyAgICsienVydWVja3ZlcnNldHp0IHdlcmRlbi5cbiIKKyAgKTsKKyAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9yb29tL29yYWtlbC5jIGIvcm9vbS9vcmFrZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZGExNTA4Ci0tLSAvZGV2L251bGwKKysrIGIvcm9vbS9vcmFrZWwuYwpAQCAtMCwwICsxLDIzMSBAQAorLy8gTW9yZ2VuR3JhdWVuIE1VRGxpYgorLy8KKy8vIG9yYWtlbC5jIC0tIERlciBSYXVtLCBpbiBkZW0gbWFuIHNpY2ggbmV1ZSBaVC1TcHJ1ZWNoZSBob2xlbiBrYW5uCisvLworLy8gJElkOiBvcmFrZWwuYyA5MzcxIDIwMTUtMTAtMjIgMTk6MDE6NDhaIFplc3N0cmEgJAorCisjZGVmaW5lIFRJUFMoeCkgIi9zZWN1cmUvQVJDSC9aVC8iK3gKKworI2RlZmluZSBQT1RJT05NQVNURVIgIi9zZWN1cmUvcG90aW9ubWFzdGVyIgorCitpbmhlcml0ICIvc3RkL3Jvb20iOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCisvLyBXQU5OV0lFVklFTCB6ZWlndCBhbiwgbWl0IHdpZXZpZWwgU3R1ZmVucHVua3RlbiBtYW4gd2lldmllbGUgWmF1YmVydHJhZW5rZQorLy8gaGFiZW4ga2Fubiwgc28gaXN0IHp1bSBCZWlzcGllbCBhbiBmdWVuZnRlciBTdGVsbGUgZGllIFphaGwgMjUgZWluZ2UtCisvLyB0cmFnZW4sIGFsc28ga2FubiBtYW4gbWl0IDI1IFN0dWZlbnB1bmt0ZW4gNSBaYXViZXJ0cmFlbmtlIGJla29tbWVuLgorI2RlZmluZSBXQU5OV0lFVklFTCAoeyAwLCAwLCAwLCAwLFwKKyAgIDI1LCA1MCwgNzUsIDEwMCwgMTI1LCAxNTAsIDE3NSwgMjAwLCAyMjUsIDI1MCwgMjc1LCAzMDAsIDMyNSwgMzUwLCAzNzUsXAorICAgNDAwLCA0MjUsIDQ1MCwgNDc1LCA1MDAsIDUyNSwgNTUwLCA1NzUsIDYwMCwgNjI1LCA2NTAsIDY3NSwgNzAwLCA3MjUsXAorICAgNzUwLFwKKyAgIDc5MCwgODMwLCA4NzAsIDkxMCwgOTUwLCA5OTAsIDEwMzAsIDEwNzAsIDExMTAsIDExNTAsIDExOTAsIDEyMzAsIDEyNzAsXAorICAgMTMxMCwgMTM1MCwgMTM5MCwgMTQzMCwgMTQ3MCwgMTUxMCwgMTU1MCwgMTU5MCwgMTYzMCwgMTY3MCwgMTcxMCwgMTc1MCxcCisgICAxNzkwLFwKKyAgIDE4NjAsIDE5MzAsIDIwMDAsIDIwNzAsIDIxNDAsIDIyMTAsIDIyODAsIDIzNTAsIDI0MjAsIDI0OTAsXAorICAgMjU5MCwgMjY5MCwgMjc5MCwgMjg5MCwgMjk5MCwgMzA5MCwgMzE5MCwgMzI5MCwgMzM5MCwgMzQ5MCB9KQorI2RlZmluZSBLRUlOVElQVEVYVCAiRGVyIE5lYmVsIHVlYmVyIGRlciBLdWdlbCBydWVocnQgc2ljaCBuaWNodC5cbiIKKworCisKK3Byb3RlY3RlZCB2b2lkIGNyZWF0ZSgpCit7CisgICA6OmNyZWF0ZSgpOworICAgU2V0UHJvcChQX0lORE9PUlMsIDEpOworICAgU2V0UHJvcChQX0xJR0hULCAxKTsKKyAgIFNldFByb3AoUF9JTlRfU0hPUlQsICJEYXMgaGVpbGlnZSBPcmFrZWwgdm9uIFRpbmdhbiIpOworICAgU2V0UHJvcChQX0lOVF9MT05HLAorICAgIkR1IGJlZmluZGVzdCBEaWNoIGluIGVpbmVyIG1pdHRlbGdyb3NzZW4gSG9laGxlLCBkaWUgc2ljaCBoYWxia3VnZWwtXG4iKworICAgImZvZXJtaWcgdWViZXIgRGVpbmVtIEtvcGYgZXJoZWJ0LiBEaWUgSG9laGxlIHdpcmQgZmFzdCBrb21wbGV0dCB2b21cbiIrCisgICAiZ3J1ZW5saWNoIHNjaGltbWVybmRlbiBRdWVsbHNlZSBkZXMgT3N0ZXJiYWNocyBhdXNnZWZ1ZWxsdC4gVWViZXIgZGVtXG4iKworICAgIlNlZSBzY2h3ZWJ0IGVpbmdlaHVlbGx0IGluIGxhbmdzYW0gemllaGVuZGUgTmViZWxzY2h3YWRlbiBlaW5lIG1hZ2lzY2hcbiIrCisgICAibGV1Y2h0ZW5kZSBLdWdlbCwgZGFzIGhlaWxpZ2UgT3Jha2VsIHZvbiBUaW5nYW4uIEltIE9zdGVuIGZsaWVzc3QgZGFzXG4iKworICAgIldhc3NlciBkZXMgU2VlcyBkdXJjaCBlaW5lbiBzY2htYWxlbiBHYW5nIGFiLCBkZW0gRHUgZm9sZ2VuIGtvZW5udGVzdC5cbiIpOworICAgQWRkRGV0YWlsKCJib2RlbiIsICJEZXIgQm9kZW4gaXN0IGdyb2Vzc3RlbnRlaWxzIG1pdCBXYXNzZXIgYmVkZWNrdC5cbiIpOworICAgQWRkRGV0YWlsKCJkZWNrZSIsICJEaWUgRGVja2UgaXN0IGF1cyBtYXNzaXZlbSBGZWxzZ2VzdGVpbiwgRHUgd2lsbHN0IGdhciBuaWNodCB3aXNzZW4sXG53aWV2aWVsZSBUb25uZW4gZGF2b24gdWViZXIgRGVpbmVtIEtvcGYgbGFzdGVuLlxuIik7CisgICBBZGREZXRhaWwoKHsiZmVscyIsICJnZXN0ZWluIiwgImZlbHNnZXN0ZWluIn0pLCAiU293YXMgaXN0IGltIEdlYmlyZ2UgcmVjaHQgaGFldWZpZy5cbiIpOworICAgQWRkRGV0YWlsKCh7IndhbmQiLCAid2FlbmRlIn0pLCAiRGllIFdhZW5kZSBzaW5kIGZldWNodC5cbiIpOworICAgQWRkRGV0YWlsKCh7InF1ZWxsc2VlIiwgInNlZSJ9KSwgIkVyIGlzdCBkaWUgUXVlbGxlIGRlcyBPc3RlcmJhY2hzLlxuIik7CisgICBBZGREZXRhaWwoInF1ZWxsZSIsICJEYXMgaGVpc3N0LCBkZXIgQmFjaCBlbnRzcHJpbmd0IGhpZXIuXG4iKTsKKyAgIEFkZERldGFpbCgoeyJiYWNoIiwgIm9zdGVyYmFjaCJ9KSwgIkVyIGZsaWVzc3QgbmFjaCBPc3RlbiBhYi5cbiIpOworICAgQWRkRGV0YWlsKCJ3YXNzZXIiLCAiRXMgaXN0IGtsYXIgdW5kIGZyaXNjaC5cbiIpOworICAgQWRkRGV0YWlsKCJnYW5nIiwgIkVyIGZ1ZWhydCBuYWNoIE9zdGVuLlxuIik7CisgICBBZGREZXRhaWwoIm9yYWtlbCIsICJEdSBmdWVobHN0IGdyb3NzZXMgV2lzc2VuIGluIERlaW5lciBVbWdlYnVuZy5cbiIpOworICAgQWRkRGV0YWlsKCJ1bWdlYnVuZyIsICJEaWUgVW1nZWJ1bmcgaXN0IGRhcywgd2FzIERpY2ggdW1naWJ0LlxuIik7CisgICBBZGREZXRhaWwoIndpc3NlbiIsICJWaWVsbGVpY2h0IG51ZXR6dCBlcyBEaXIgamEgd2FzLlxuIik7CisgICBBZGREZXRhaWwoKHsibmViZWwiLCAic2Nod2FkZW4iLCAibmViZWxzY2h3YWRlbiJ9KSwgIlNpZSB6aWVoZW4gbGFuZ3NhbSB1ZWJlciBkZW4gU2VlLlxuIik7CisgICBBZGREZXRhaWwoImt1Z2VsIiwgIkRpZSBLdWdlbCBsZXVjaHRldCBpbiBtYWdpc2NoZW0gTGljaHQgdW5kIGxhZWR0IERpY2ggZmFzdCB6dW0gTWVkaXRpZXJlbiBlaW4uXG4iKTsKKyAgIEFkZERldGFpbCgibGljaHQiLCAiTWFnaXNjaGVzIExpY2h0IGVyaGVsbHQgZGVuIFJhdW0uXG4iKTsKKyAgIEFkZERldGFpbCgicmF1bSIsICJTY2hhdSBEaWNoIGVpbmZhY2ggbWFsIHVtLlxuIik7CisgICBBZGREZXRhaWwoImhvZWhsZSIsICJEdSBiZWZpbmRlc3QgRGljaCB0YXRzYWVjaGxpY2ggaW4gZWluZXIgSG9laGxlLlxuIik7CisgICBBZGREZXRhaWwoImtvcGYiLCAiRGFzIGFuenVzY2hhdWVuIGR1ZXJmdGUgRGlyIHNjaHdlciBmYWxsZW4uXG4iKTsKKyAgIEFkZENtZCgoeyJ0cmluayIsICJ0cmlua2UifSksICJ0cmlua2VuIik7CisgICBBZGRDbWQoIm1lZGl0aWVyZSIsICJtZWRpdGllcmVuIik7CisgICBBZGRDbWQoKHsid2lyZiIsICJ3ZXJmZSJ9KSwgIndlcmZlbiIpOworICAgQWRkRXhpdCgib3N0ZW4iLCAiL3BsYXllcnMvYm9pbmcvb3Jha2VsL29yZ2FuZzIiKTsKK30KKworLy8gRXMgd2lyZCBiZXJlY2huZXQgb2IgZGVyIFNwaWVsZXIgZWluZW4gbmV1ZW4gVGlwIGJla29tbWVuIGthbm4uCitpbnQgTmV1ZXJUaXAoKQoreworICAgbWFwcGluZyBwbGF0dDsgICAvLyBBdHRyaWJ1dG1hcHBpbmcgZGVzIFNwaWVsZXJzCisgICBpbnQJICAgc3VtbWU7ICAgLy8gU3VtbWUgZGVyIEF0dHJpYnV0ZSBkZXMgU3BpZWxlcnMgKyBkZXIgbm9jaCB6dSBmaW5kZW5lbgorCQkgICAgLy8gYWJlciBiZWthbm50ZW4gWmF1YmVydHJhbmtzdGVsbGVuCisgICBpbnQJICAgc3BzOyAgICAgLy8gU3R1ZmVucHVua3RlIGRlcyBTcGllbGVycworCisgICBwbGF0dCAgPSB0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoUF9BVFRSSUJVVEVTKTsKKyAgIHN1bW1lICA9IChpbnQpcGxhdHRbImludCJdICsgKGludClwbGF0dFsiY29uIl0gKyAKKwkgICAgKGludClwbGF0dFsiZGV4Il0gKyAoaW50KXBsYXR0WyJzdHIiXSAtIDQ7IAorICAgc3VtbWUgICs9IHNpemVvZih0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoUF9LTk9XTl9QT1RJT05ST09NUykpOworICAgc3BzCSAgPSB0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoUF9MRVApOworCisvLyBXZW5uIGdlbnVnIFN0dWZlbnB1bmt0ZSBkYSBzaW5kLCBkYW5uIHdpcmQgMSB6dXJ1ZWNrZ2VnZWJlbiwgc29uc3QgMAorICBpZiAoc3VtbWU+NzkpCisgICAgcmV0dXJuIDA7CisgIGlmIChzcHMgPiBXQU5OV0lFVklFTFtzdW1tZV0pCisgICAgcmV0dXJuIDE7CisgICByZXR1cm4gMDsKK30KKworLy8gR2lidCBkaWUgTnVtbWVyIGRlcyBhdXNnZXdhZWhsdGVuIFphdWJlcnRyYW5rcyB6dXJ1ZWNrIG9kZXIgMCwgd2VubiBrZWluZXIKKy8vIG1laHIgdWVicmlnIGlzdC4KK2ludCBaVEF1c3dhaGwoKQoreworICAgaW50KiBwbGxpc3Q7CisgICBpbnQJcGxsc2l6ZTsKKyAgIGludCBpOworICAgbWl4ZWQgc29ydGVkX2xpc3Q7IC8vICh7ICh7bGlzdGUxfSksICh7bGlzdGUyfSksIC4uLiwgKHtsaXN0ZTh9KSB9KQorCisvLyBJbml0aWFsaXNpZXJ1bmcKKyAgIHNvcnRlZF9saXN0ID0gKHsgKHsgfSksICh7IH0pLCAoeyB9KSwgKHsgfSksICh7IH0pLCAoeyB9KSwgKHsgfSksICh7IH0pIH0pOworICAgcGxsaXN0ICAgICAgPSB0aGlzX3BsYXllcigpLT5RdWVyeVByb3AoUF9QT1RJT05ST09NUyk7CisgICBwbGxzaXplICAgICA9IHNpemVvZihwbGxpc3QpOworCisvLyBaYXViZXJ0cmFlbmtlIHdlcmRlbiBnZW1hZXNzIGlocmVyIExpc3RlIGluIGRlbiBuZXVlbiBBcnJheSBlaW5nZXRyYWdlbi4KKyAgIGZvciAoaT0wOyBpPHBsbHNpemU7IGkrKykKKyAgICAgIHNvcnRlZF9saXN0W1BPVElPTk1BU1RFUi0+R2V0TGlzdEJ5TnVtYmVyKHBsbGlzdFtpXSldICs9ICh7IHBsbGlzdFtpXSB9KTsKKworLy8gQWxsZSBVbnRlcmFycmF5cyB3ZXJkZW4gYW5laW5hbmRlcmdlaGFlbmd0LgorICAgcGxsaXN0ID0gKHsgfSk7CisgICBmb3IgKGk9MDsgaTw4OyBpKyspCisgICAgICBwbGxpc3QgKz0gc29ydGVkX2xpc3RbaV07CisgICBwbGxpc3QgLT0gdGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfS05PV05fUE9USU9OUk9PTVMpOworCisvLyBKZXR6dCBzaW5kIGFsbGUgWmF1YmVydHJhZW5rZSB3aWVkZXIgaW4gZGVyIExpc3RlLCBzb3J0aWVydCBuYWNoIGRlbQorLy8gU2Nod2llcmlna2VpdHNncmFkLCBiaXMgYXVmIGRpZSBaYXViZXJ0cmFlbmtlLCBkaWUgZGVyIFNwaWVsZXIgYmVyZWl0cworLy8ga2VubnQgKGQuaC4gd28gZXIgc2Nob24gZGVuIFRpcCBiZWtvbW1lbiBoYXQsIHNpZSBhYmVyIG5vY2ggbmljaHQKKy8vIGdlZnVuZGVuIGhhdCkuCisKKworLy8gRWluZXIgZGVyIGxlaWNodGVzdGVuIFphdWJlcnRyYWVua2Ugd2lyZCBhdXNnZXdhZWhsdCB1bmQgenVydWVja2dlZ2ViZW4uCisgICBwbGxzaXplID0gc2l6ZW9mKHBsbGlzdCk7CisgICBpZiAoIXBsbHNpemUpCisgICAgICByZXR1cm4gLTE7CisgICBpZiAocGxsc2l6ZT4xMCkKKyAgICAgIHJldHVybiBwbGxpc3RbcmFuZG9tKDEwKV07CisgICBlbHNlCisgICAgICByZXR1cm4gcGxsaXN0W3JhbmRvbShwbGxzaXplKV07Cit9CisKKworc3RyaW5nIFZpc2lvbigpCit7CisgIGludAkgIG5yOworICBzdHJpbmcqIHRleHQ7CisgIGludCoJICBsaXN0ZTsKKworICBpZiAoIU5ldWVyVGlwKCkpCisgICAgcmV0dXJuIEtFSU5USVBURVhUICsgIkR1IGhhc3Qgd2FocnNjaGVpbmxpY2ggenUgd2VuaWcgU3R1ZmVucHVua3RlLlxuIjsKKworICBuciA9IFpUQXVzd2FobCgpOworICBpZiAobnIgPT0gLTEpCisgICAgcmV0dXJuIEtFSU5USVBURVhUICsgIkR1IGhhc3Qgc2Nob24gYWxsZSBaYXViZXJ0cmFlbmtlIGdlZnVuZGVuLlxuIjsKKworICB0ZXh0ID0gUE9USU9OTUFTVEVSLT5UaXBMZXNlbihucik7CisvLyBEYXMgRm9sZ2VuZGUga2FubiBwYXNzaWVyZW4sIHdlbm4gZW50d2VkZXIgZGllIERhdGVpIHp1IGVpbmVtIFpUIG5pY2h0CisvLyBleGlzdGllcnQgb2RlciBkYXMgRWlubGVzZW4gc29uc3R3aWUgZmVobHNjaGxhZWd0LiBadXIgQmVoZWJ1bmcgZGVzCisvLyBGZWhsZXJzIHNvbGx0ZSBtYW4gc2ljaCBhbHMgZXJzdGVzIGRpZSBEYXRlaSA8bnI+Lnp0IGFuc2NoYXVlbi4KKyAgaWYgKGludHAodGV4dCkgfHwgIXNpemVvZih0ZXh0KSkgCisgICAgcmV0dXJuIAorICAiUGxvZXR6bGljaCB3aXJkIGVzIHRvdGVuc3RpbGwgaW0gUmF1bSwgZGllIE5lYmVsc2Nod2FkZW4gYmVnaW5uZW4gc2ljaFxuIisKKyAgInVtIGRpZSBLdWdlbCB6dSBkcmVoZW4uIEltbWVyIHNjaG5lbGxlciB3aXJkIGRlciB3aXJiZWxuZGUgVGFueiwgYmlzXG4iKworICAic2ljaCBkYXMgR2FuemUgdW5tZXJrbGljaCB6dSBlaW5lciBTY2hyaWZ0IGZvcm10OlxuIisKKyAgIiAgIEZlaGxlciBpbSBSYXVtLVplaXQtR2VmdWVnZSwgYml0dGUgd2VuZGUgRGljaCBhbiBSaWt1c1xuIisKKyAgIiAgIHVuZCBtZWxkZSBpaG0gZGllIFphaGwgJyIrbnIrIichXG4iKworICAiRGFubiB6ZXJmbGllc3N0IGRlciBOZWJlbCB1bmQgYWxsZXMgaXN0IGJlaW0gQWx0ZW4uXG4iOworCisgIGxpc3RlID0gdGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfS05PV05fUE9USU9OUk9PTVMpOworICB0aGlzX3BsYXllcigpLT5BZGRLbm93blBvdGlvbihucik7CisKKy8vYmlzIG5hY2ggUmVib290IG5vZXRpZyEhISBSaWt1cworLy8gICIvcGxheWVycy9ib2luZy9vcmFrZWwvb3Jha2VsIi0+QWRkS25vd25Qb3Rpb24obnIpOworCisgIHJldHVybiAiRGVyIE5lYmVsIHVlYmVyIGRlciBLdWdlbCBiZWdpbm50IHNpY2ggenUgYmV3ZWdlbiwgZGFubiBob2Vyc3QgRHUgZWluZVxudGllZmUgU3RpbW1lIGluIERlaW5lbSBLb3BmIGVya2xpbmdlbjpcblxuIit0ZXh0W3JhbmRvbShzaXplb2YodGV4dCkpXTsKK30KKworc3RyaW5nIFRpcExpc3RlKCkKK3sKKyAgaW50KgkgIHBsbDsKKyAgc3RyaW5nKiB0aXA7CisgIHN0cmluZyAgcmV0OworICBpbnQJICBwbHNpemUsIGk7CisKKyAgcmV0CSA9ICIiOworICBwbGwJID0gdGhpc19pbnRlcmFjdGl2ZSgpLT5RdWVyeVByb3AoUF9LTk9XTl9QT1RJT05ST09NUyk7CisgIHBsc2l6ZSA9IHNpemVvZihwbGwpOworCisgIGZvciAoaT0wOyBpPHBsc2l6ZTsgaSsrKQorICB7CisgICAgdGlwID0gUE9USU9OTUFTVEVSLT5UaXBMZXNlbihwbGxbaV0pOworICAgIGlmIChzaXplb2YodGlwKSkKKyAgICB7CisgICAgICByZXQgKz0gdGlwW3JhbmRvbShzaXplb2YodGlwKSldOworICAgICAgcmV0ICs9ICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKKyAgICB9CisgIH0KKworICBpZiAocmV0PT0iIikKKyAgICByZXR1cm4gIkR1IGtlbm5zdCBtb21lbnRhbiBrZWluZSBUaXBzIHp1IFphdWJlcnRyYWVua2VuLlxuIjsKKyAgZWxzZQorICAgIHJldHVybiAiLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIrcmV0OworfQorCitpbnQgdHJpbmtlbihzdHJpbmcgc3RyKQoreworICBub3RpZnlfZmFpbCgiV2FzIG1vZWNodGVzdCBEdSB0cmlua2VuP1xuIik7CisgIGlmICghc3RyIHx8IHN0cj09IiIpIHJldHVybiAwOworICBub3RpZnlfZmFpbCgiRGFzIGthbm5zdCBEdSBoaWVyIG5pY2h0IHRyaW5rZW4hXG4iKTsKKyAgaWYgKHN0ciE9Indhc3NlciIpCisgICAgcmV0dXJuIDA7CisgIHdyaXRlKCJEdSB0cmlua3N0IGVpbmVuIFNjaGx1Y2sgUXVlbGx3YXNzZXIgdW5kIGZ1ZWhsc3QgRGljaCBrb2VzdGxpY2ggZXJmcmlzY2h0LlxuIik7CisgIHJldHVybiAxOworfQorCittZWRpdGllcmVuKCkKK3sKKyAgd3JpdGUoCisgICJEdSBzYW1tZWxzdCBEZWluZSBnZWlzdGlnZW4gS3JhZWZ0ZSB1bmQgdmVyZmFlbGxzdCBzY2hvbiBzY2huZWxsIGluIGVpbmVuXG4iKworICAidHJhbmNlYXJ0aWdlbiBadXN0YW5kLiBFaW5lIFZpc2lvbiBlaW5lcyBIZWxkZW4sIGRlciBlaW5lIE11ZW56ZSBpbiBkZW5cbiIrCisgICJTZWUgd2lyZnQgZXJzY2hlaW50IHZvciBEZWluZW4gQXVnZW4sIHZlcnNjaHdpbmRldCBhYmVyIHNjaG9uIHNjaG5lbGxcbiIrCisgICJ3aWVkZXIuIEFscyBEdSB3aWVkZXIgYXVmd2FjaHN0LCBpc3QgYWxsZXMgd2llIHZvcmhlci5cbiIpOworICByZXR1cm4gMTsKK30KKworaW50IHdlcmZlbihzdHJpbmcgc3RyKQoreworICBpZiAoc3RyPT0ibXVlbnplIGluIHNlZSIgfHwgc3RyPT0ibXVlbnplIGluIHdhc3NlciIgfHwKKyAgICAgIHN0cj09Im11ZW56ZSBpbiBxdWVsbHNlZSIpCisgIHsKKyAgICBpZiAodGhpc19wbGF5ZXIoKS0+UXVlcnlNb25leSgpPDEpCisgICAgeworICAgICAgd3JpdGUoIkR1IGhhc3Qga2VpbmUgTXVlbnplLlxuIik7CisgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgdGhpc19wbGF5ZXIoKS0+QWRkTW9uZXkoLTEpOworICAgIHdyaXRlKCJEdSB3aXJmc3QgZWluZSBNdWVuemUgaW5zIFdhc3Nlci5cbiIpOworICAgIHNheShjYXBpdGFsaXplKHRoaXNfcGxheWVyKCktPm5hbWUoKSkrIiB3aXJmdCBlaW5lIE11ZW56ZSBpbnMgV2Fzc2VyLlxuIik7CisgICAgd3JpdGUoVmlzaW9uKCkpOworICAgIHJldHVybiAxOworICB9CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcm9vbS9wb3N0LmMgYi9yb29tL3Bvc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDExN2RlCi0tLSAvZGV2L251bGwKKysrIGIvcm9vbS9wb3N0LmMKQEAgLTAsMCArMSwxMiBAQAoraW5oZXJpdCAiL3N0ZC9wb3N0IjsKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisKK2NyZWF0ZSgpCit7CisJOjpjcmVhdGUoKTsKKyAgICAgICAgQWRkRXhpdCgib3N0ZW4iLCIvZ2lsZGVuL2FiZW50ZXVyZXIiKTsKKwlTZXRQcm9wKFBfSU5UX0xPTkcsIkRpZXMgaXN0IGRhcyBIYXVwdHBvc3RhbXQgdm9uIE1vcmdlbkdyYXVlbi5cbiIrCisgICAgICAgICAgICAgICAiVm9uIGhpZXIgYXVzIGthbm5zdCBEdSBCcmllZmUgYW4gRGVpbmUgTWl0c3BpZWxlciBzY2hpY2tlbiB1bmQgQnJpZWZlIHZvblxuIisKKyAgICAgICAgICAgICAgICJpaG5lbiBsZXNlbi4gV2VubiBEdSBkYXMgd2lsbHN0LCB0aXBwZSBcInBvc3RcIi5cbiIrCisgICAgICAgICAgICAgICAiRGVyIGVpbnppZ2Ugc2ljaHRiYXJlIEF1c2dhbmcgZnVlaHJ0IG5hY2ggT3N0ZW4gaW4gZGllIEdpbGRlLlxuIik7Cit9ICAgICAgICAgICAgIApkaWZmIC0tZ2l0IGEvcm9vbS9wcmF5X3Jvb20uYyBiL3Jvb20vcHJheV9yb29tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA1NmQyMgotLS0gL2Rldi9udWxsCisrKyBiL3Jvb20vcHJheV9yb29tLmMKQEAgLTAsMCArMSwzNyBAQAoraW5oZXJpdCAic3RkL3Jvb20iOworCisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorCit2b2lkIGNyZWF0ZSgpCit7CisJOjpjcmVhdGUoKTsKKwlTZXRQcm9wKFBfTElHSFQsMSk7CisJU2V0UHJvcChQX0lOVF9MT05HLAorICAgIkR1IGJlZmluZGVzdCBEaWNoIGluIGVpbmVyIGtsZWluZW4gS2FwZWxsZSwgaW4gZGVyIER1IGJldGVuIGthbm5zdCwgdW1cbiIrCisgICAid2llZGVyIERlaW5lIG5hdHVlcmxpY2hlIEdlc3RhbHQgenUgZXJoYWx0ZW4uIEFtIHN1ZWRsaWNoZW4gRW5kZSBzdGVodFxuIisKKyAgICJlaW4gQWx0YXIsIGF1ZiBkZW0gc2ljaCBlaW4gZ3Jvc3NlcyBLcmV1eiBiZWZpbmRldC4gSW4gZGVuIFdhZW5kZW4gc2llaHN0XG4iKworICAgIkR1IGhlcnJsaWNoZSBGZW5zdGVyLCBkdXJjaCBkaWUgdGFnc3VlYmVyIGRhcyBMaWNodCBidW50IGhlcmVpbnNjaGVpbnQuXG4iKworICAgIkltIE5vcmRlbiBiZWZpbmRldCBzaWNoIGVpbmUgVHVlciwgZGllIHp1ciBHaWxkZSBmdWVocnQuXG4iKTsKKyAgU2V0UHJvcChQX0lOVF9TSE9SVCwiS2FwZWxsZSIpOworICBBZGREZXRhaWwoImFsdGFyIiwgIkVyIGlzdCBhdXMgU3RlaW4gdW5kIG5pY2h0IGJlc29uZGVycyBzY2hvZW4uXG4iKTsKKyAgQWRkRGV0YWlsKCJrcmV1eiIsICJFaW4gc2NobGljaHRlcyBIb2x6a3JldXouXG4iKTsKKyAgQWRkRGV0YWlsKCJmZW5zdGVyIiwgIkRpZSBGZW5zdGVyIHNpbmQgd3VuZGVyc2Nob2VuLlxuIik7CisgIEFkZERldGFpbCgoeyJ3YW5kIiwgIndhZW5kZSJ9KSwgIkFuIGRlbiBXYWVuZGVuIHNpZWhzdCBEdSBuaWNodHMgYmVzb25kZXJlcy5cbiIpOworICBBZGRDbWQoImJldGUiLCJiZXRlIik7CisgIEFkZEV4aXQoIm5vcmRlbiIsIi9naWxkZW4vYWJlbnRldXJlciIpOworfQorCitzdGF0aWMgaW50IGJldGUoKSB7CisgICBpZiAodGhpc19wbGF5ZXIoKS0+UXVlcnlQcm9wKFBfR0hPU1QpKQorICAgeworICAgICAgICB3cml0ZSgiRHUgaGFlbHRzdCBlaW5lIGt1cnplIEFuZGFjaHQuXG4iKTsKKwl3cml0ZSgiRWluZSBzZWhyIHN0YXJrZSBLcmFmdCBzYXVndCBEaWNoIGF1ZiB1bmQgc3B1Y2t0IERpY2ggd2llZGVyIGF1cy5cbiIpOworCXNheSh0aGlzX3BsYXllcigpLT5uYW1lKCkrIiBlcnNjaGVpbnQgaW4ga29lcnBlcmxpY2hlciBGb3JtLlxuIik7CisJdGhpc19wbGF5ZXIoKS0+U2V0UHJvcChQX0dIT1NULDApOworCXJldHVybiAxOworICAgfQorICAgbm90aWZ5X2ZhaWwoIkR1IGhhZWx0c3QgZWluZSBrdXJ6ZSBBbmRhY2h0LlxuIik7CisgICByZXR1cm4gMDsKK30KKworCmRpZmYgLS1naXQgYS9yb29tL3B1YjIuYyBiL3Jvb20vcHViMi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNTExNDQKLS0tIC9kZXYvbnVsbAorKysgYi9yb29tL3B1YjIuYwpAQCAtMCwwICsxLDQ0IEBACitpbmhlcml0ICIvc3RkL3B1YiI7CisjaW5jbHVkZSA8cm9vbXMuaD4KKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisKK2NyZWF0ZSgpeworICAgcmVwbGFjZV9wcm9ncmFtKCJzdGQvcHViLmMiKTsKKyAgIDo6Y3JlYXRlKCk7CisKKyAgIEFkZERyaW5rKCJCaWVyIG5hY2ggZGVtIFJlaW5oZWl0c2dlYm90IiwiYmllciIsMTIsMCwyLDEsCisgICAgICAgICAgICAoeyJEZXIgS2VsbG5lciBicmluZ3QgRGVpbiBCaWVyLiBEdSBmdWVobHN0IERpY2ggZ3V0LiIsCisgICAgICAgICAgICAgICImJiB0cmlua3QgZWluIGVpc2thbHRlcyBCaWVyLiJ9KSk7CisKKyAgIEFkZERyaW5rKCJGcmFua3MgU3BlemlhbC1TY2huYXBzIiwKKyAgICAgICAgICAgICh7InNjaG5hcHMiLCJzcGV6aWFsIiwic3BlemlhbC1zY2huYXBzIn0pLAorICAgICAgICAgICAgNTAsMTAsOCwwLAorICAgICAgICAgICAgKHsiRGVyIEtlbGxuZXIgYnJpbmd0IERlaW5lbiBTY2huYXBzLlxuIisKKyAgICAgICAgICAgICAgIkR1IGZ1ZWhsc3QgZWluIEtyaWJiZWxuIGltIGdhbnplbiBLb2VycGVyLiIsCisgICAgICAgICAgICAgICImJiBzY2h1ZXR0ZXQgZWluZW4gU3BlemlhbC1TY2huYXBzIGhlcnVudGVyLiJ9KSk7CisKKyAgIEFkZERyaW5rKCJFaW4gYmVydWVobXRlciBSYWNoZW5wdXR6ZXIiLCh7InB1dHplciIsInJhY2hlbnB1dHplciJ9KSwKKyAgICAgICAgICAgIDE1MCwyNSwxMiwwLAorICAgICAgICAgICAgKHsiRHUgYmVrb21tc3QgRGVpbmVuIHdlbHRiZXJ1ZWhtdGVuIFJhY2hlbnB1dHplci5cbiIrCisgICAgICAgICAgICAgICJFaW5lIFNjaG9ja3dlbGxlIHJhc3QgbWl0IGRlciBHZXdhbHQgZWluZXMgQmFzZWJhbGwtU2NobGFlZ2VycyBkdXJjaFxuIisKKyAgICAgICAgICAgICAgIkRlaW5lbiBLb2VycGVyIHVuZCB0cmlmZnQgbWl0IHZvbGxlciBXdWNodCBEZWluIEdlaGlybi4iLAorICAgICAgICAgICAgICAiJiYgdG9ya2VsdCwgYWxzICYhIGVpbmVuIFJhY2hlbnB1dHplciBzYWV1ZnQuIn0pKTsKKworICAgQWRkRHJpbmsoIkVpbmUgVGFzc2UgS2FmZmVlIiwoeyJrYWZmZWUiLCJ0YXNzZSIsInRhc3NlIGthZmZlZSJ9KSwKKyAgICAgICAgICAgIDIwLDAsLTIsMywKKyAgICAgICAgICAgICh7IkJhZWghIFNjaG1lY2t0IGphIHdpZGVybGljaCEiLAorICAgICAgICAgICAgICAiJiYgdmVyemllaHQgYW5nZXdpZGVydCBkYXMgR2VzaWNodCwgYWxzICYhIGVpbmVuIEthZmZlZSBzY2hsdWNrdC4ifSkpOworCisgICBBZGRFeGl0KCJ3ZXN0ZW4iLCJyb29tL2dpbGRlIik7CisKKyAgIFNldFByb3AoUF9JTlRfU0hPUlQsIkZyYW5rcyBBYmVudGV1cmVyLUtuZWlwZSIpOworICAgU2V0UHJvcChQX0lOVF9MT05HLCJEdSBiaXN0IGluIEZyYW5rcyBBYmVudGV1cmVyLUtuZWlwZS5cbiIrCisgICAgICAgICAgICAgICAiV2llIGltbWVyIGlzdCBoaWVyIG1hbCB3aWVkZXIgZGllIEhvZWxsZSBsb3MuIEZsYXNjaGVuIHVuZCBHbGFlc2VyXG4iKworICAgICAgICAgICAgICAgImZsaWVnZW4gZHVyY2ggZGVuIFJhdW0sIHVuZCBkdSBtdXNzdCBhdWZwYXNzZW4sIGRhc3MgRHUgbmljaHQgaW5cbiIrCisgICAgICAgICAgICAgICAiZGllIFNjaGxhZWdlcmVpIHp3aXNjaGVuIGVpbmVtIEtlcmwsIGRlciBhdXNzaWVodCB3aWUgU3lsdmVzdGVyXG4iKworICAgICAgICAgICAgICAgIlN0YWxsb25lIHVuZCBlaW5lbSBhdWNoIG5pY2h0IGdlcmFkZSBoYXJtbG9zZW4gWmF1YmVyZXIgaGluZWluLVxuIisKKyAgICAgICAgICAgICAgICJnZXpvZ2VuIHdpcnN0LlxuXG4iKworICAgICAgICAgICAgICAgIldlbm4gRHUgd2lzc2VuIHdpbGxzdCwgd2FzIER1IGhpZXIgdHJpbmtlbiBrYW5uc3QsIHRpcHBlOiAnbWVudWUnLlxuIik7CQorICAgU2V0UHJvcChQX0xJR0hULDEpOworfQorCmRpZmYgLS1naXQgYS9yb29tL3RyZWZmLmMgYi9yb29tL3RyZWZmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTdkMGJlOAotLS0gL2Rldi9udWxsCisrKyBiL3Jvb20vdHJlZmYuYwpAQCAtMCwwICsxLDQwIEBACisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHJvb21zLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisjaW5jbHVkZSA8bGFuZ3VhZ2UuaD4KK2luaGVyaXQgIi9zdGQvcm9vbSI7CitjcmVhdGUoKXsKKyAgIDo6Y3JlYXRlKCk7CisgICBTZXRQcm9wKFBfSU5UX1NIT1JULCJEYXMganVlbmdzdGUgR2VydWVjaHQiKTsKKyAgIFNldFByb3AoUF9JTlRfTE9ORywKKwkgICAiRGllcyBpc3QgZWluIFJhdW0sIGRlbiBkaWUgU3BpZWxlciBnZXJuZSB1bmQgb2Z0IGFscyBcbiIKKwkgICArIidkYXMganVlbmdzdGUgR2VydWVjaHQnIGJlemVpY2huZW4uIEhpZXIgd2VyZGVuIG5hZW0tXG4iCisJICAgKyJsaWNoIHdpY2h0aWdlIEVudHNjaGVpZHVuZ2VuIGltIE1vcmdlbmdyYXVlbiBkaXNrdS1cbiIKKwkgICArInRpZXJ0IHVuZCBiZXNjaGxvc3Nlbi4gRGVtenVmb2xnZSBpc3QgZGllcyBlaW4gcmVpbmVyXG4iCisJICAgKyJNYWdpZXJyYXVtLiBNYW4ga2FubiBzaWNoIGhpZXIgdHJlZmZlbiwgcmVkZW4gb2RlclxuIgorCSAgICsiZWluZmFjaCBoZXJ1bWlkbGVuLlxuIik7CisgICBBZGRFeGl0KCJ1bnRlbiIsICIvZ2lsZGVuL2FiZW50ZXVyZXIiKTsKKyAgIFNldFByb3AoUF9MSUdIVCwxMDApOworICAgU2V0UHJvcChQX0lORE9PUlMsMSk7Cit9CisKK2V4aXQoKSAvLyBXYXIgc2Nob24gb2VmdGVyIHNvLCBkYXMgTWFnaWVyIGhpZXIgd2Fsa2luZyBtb25zdGVycyBlcnpldWd0CisgICAgICAgLy8gaGFiZW4sIGRpZSBkYW5uIGluIGRpZSBHaWxkZSBnZWhvcHN0IHNpbmQgLi4uIGRpZSBleGl0cworCQkJIC8vIHp1IHNwZXJyZW4gaGF0IGF1Y2gga2VpbmVuIFNpbm4gLSBTaXJzIE1OUEMgbW92ZWQgc2ljaCBkYW5uCisJCQkgLy8gZG9jaCBhbiBzZWluZW4gU3RhcnRwdW5rdC4gTmFqYSwgbWFjaGVuIHdpciBlcyBlYmVuIFNPIC0gTW9uc3RlcgorCQkJIC8vIGhhYmVuIGhpZXIgZWggbml4IHZlcmxvcmVuLgoreworCW9iamVjdCB0cDsKKworCXRwPXByZXZpb3VzX29iamVjdCgpOworCWlmICghcXVlcnlfb25jZV9pbnRlcmFjdGl2ZSh0cCkpCisJCWNhbGxfb3V0KCJkb19kZXN0cnVjdCIsMSx0cCk7Cit9CisKK2RvX2Rlc3RydWN0KG9iKQoreworCWlmIChvYikKKwkgIG9iLT5yZW1vdmUoKTsKKwlpZiAob2IpCisJCWRlc3RydWN0KG9iKTsKK30KZGlmZiAtLWdpdCBhL3Jvb20vdm9pZC5jIGIvcm9vbS92b2lkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYxZTYyYQotLS0gL2Rldi9udWxsCisrKyBiL3Jvb20vdm9pZC5jCkBAIC0wLDAgKzEsNTEgQEAKK2luaGVyaXQgInN0ZC9yb29tIjsKKyNpbmNsdWRlIDxwcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bW92aW5nLmg+CisjaW5jbHVkZSA8d2l6bGV2ZWxzLmg+CisKK3ZvaWQgY3JlYXRlKCkKK3sKKyAgOjpjcmVhdGUoKTsKKyAgU2V0UHJvcChQX0xJR0hULCAxICk7CisgIFNldFByb3AoUF9JTlRfU0hPUlQsICJEYXMgTmljaHRzIiApOworICBTZXRQcm9wKFBfSU5ET09SUywgMSk7CisgIFNldFByb3AoUF9JTlRfTE9ORywKKyAgICAiRHUgc2Nod2Vic3QgaW0gYWJzb2x1dGVuLCBld2lnZW4gdW5kIGxlZXJlbiBOaWNodHMgdW1oZXIuIEhpZXIga29tbWVuXG4iCisgICArImFsbCBkaWUgaGluLCBkZXJlbiBXZWx0LCBpbiBkZXIgc2llIHNpY2ggYmVmYW5kZW4sIHplcnN0b2VydCB3b3JkZW4gaXN0LlxuIgorICAgKyJXZW5uIER1IGRhcyBtYWdpc2NoZSBLb21tYW5kbyAnd2VsdCcgZ2lic3QsIHdpcnN0IER1IHdpZWRlciBpbiBEZWluZSBXZWx0XG4iCisgICArInp1cnVlY2t2ZXJzZXR6dCB3ZXJkZW4uXG4iCisgICk7CisgIEFkZENtZCggIiIsICJvbmx5d2VsdCIsIDEgKTsKK30KKworaW50IG9ubHl3ZWx0KCBzdHJpbmcgcyApIHsKKyAgaWYoIHF1ZXJ5X3ZlcmIoKT09IndlbHQiICkgeworICAgIHRoaXNfcGxheWVyKCktPm1vdmUoIi9naWxkZW4vYWJlbnRldXJlciIsIE1fVFBPUlQpOworICAgIHJldHVybiAxOworICB9CisgIGlmKCBJU19MRUFSTkVSKHRoaXNfcGxheWVyKCkpICkgcmV0dXJuIDA7CisgIHdyaXRlKAorICAgICJEdSBzY2h3ZWJzdCBpbSBhYnNvbHV0ZW4sIGV3aWdlbiB1bmQgbGVlcmVtIE5pY2h0cyB1bWhlci4gSGllciBrb21tZW5cbiIKKyAgICsiYWxsIGRpZSBoaW4sIGRlcmVuIFdlbHQsIGluIGRlciBzaWUgc2ljaCBiZWZhbmRlbiwgemVyc3RvZXJ0IHdvcmRlbiBpc3QuXG4iCisgICArIldlbm4gRHUgZGFzIG1hZ2lzY2hlIEtvbW1hbmRvICd3ZWx0JyBnaWJzdCwgd2lyc3QgRHUgd2llZGVyIGluIERlaW5lIFdlbHRcbiIKKyAgICsienVydWVja3ZlcnNldHp0IHdlcmRlbi5cbiIKKyAgKTsKKyAgcmV0dXJuIDE7Cit9CisKKworLy8gU29uc3QgemVyc3RvZXJ0IHNpY2ggZGFzIFZvaWQgYnJhdiBzZWxic3QgLSBhbiBOb3RpZnlEZXN0cnVjdCB2b3JiZWkuIAorcHVibGljIHZhcmFyZ3MgaW50IHJlbW92ZSgpCit7CisgIGlmICghQVJDSF9TRUNVUklUWSB8fCBwcm9jZXNzX2NhbGwoKSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIDo6cmVtb3ZlKCk7Cit9CisKKy8vIE5pY2h0IGplZGVyIE1hZ2llciBtdXNzIGRhcyBWb2lkIGVudHNvcmdlbiBrb2VubmVuLgorc3RyaW5nIE5vdGlmeURlc3RydWN0KG9iamVjdCBjYWxsZXIpIHsKKyAgICBpZiggKGNhbGxlciE9dGhpc19vYmplY3QoKSAmJiAhQVJDSF9TRUNVUklUWSkgfHwgcHJvY2Vzc19jYWxsKCkgKSB7CisgICAgICByZXR1cm4gIkR1IGRhcmZzdCBkYXMgVm9pZCBuaWNodCB6ZXJzdG9lcmVuIVxuIjsKKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3Jvb20vd2VsY29tZS9zdGQuYyBiL3Jvb20vd2VsY29tZS9zdGQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWUzY2VlCi0tLSAvZGV2L251bGwKKysrIGIvcm9vbS93ZWxjb21lL3N0ZC5jCkBAIC0wLDAgKzEsMTUxIEBACisjaW5jbHVkZSA8cHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1vdmluZy5oPgorI2luY2x1ZGUgPGRlZmluZXMuaD4KKworaW5oZXJpdCAgIi9zdGQvcm9vbSI7CisKKyNwcmFnbWEgc3Ryb25nX3R5cGVzCisjcHJhZ21hIHJ0dF9jaGVja3MKKyNwcmFnbWEgbm9fc2hhZG93CisjcHJhZ21hIG5vX2luaGVyaXQKKyNwcmFnbWEgcGVkYW50aWMKKyNwcmFnbWEgcmFuZ2VfY2hlY2sKKworI2RlZmluZSBCUyh4KSBicmVha19zdHJpbmcoeCwgNzgsIDAsIEJTX0xFQVZFX01ZX0xGU3xCU19TSU5HTEVfU1BBQ0UpCisjZGVmaW5lIFRVVFNUQVJUICIvZC9hbmZhZW5nZXIvYXJhdGhvcm4vbWluaXR1dC9yb29tL2h1ZXR0ZV8iCisKK3ZvaWQgY3JlYXRlKCkgeworICA6OmNyZWF0ZSgpOworCisgIFNldFByb3AoUF9MSUdIVCwxKTsKKyAgU2V0UHJvcChQX0xJR0hUX1RZUEUsIExUX1NUQVJTfExUX01PT04pOworICBTZXRQcm9wKFBfTUFQX1JFU1RSSUNUSU9OUywgTVJfTk9VSUR8TVJfTk9JTkZPKTsKKyAgU2V0UHJvcChQX0lORE9PUlMsMCk7CisgIFNldFByb3AoUF9OT19UUE9SVCwgTk9fVFBPUlQpOworCisgIFNldFByb3AoUF9JTlRfU0hPUlQsICJJcmdlbmR3byBpbSBOaXJnZW5kd28iKTsKKyAgU2V0UHJvcChQX0lOVF9MT05HLCBCUygKKyAgICAiRHUgc2Nod2Vic3QgaW0gTmlyZ2VuZHdvLiBTdGVybmUgdW1nZWJlbiBEaWNoLCB1bmQgRHUgZ2xhdWJzdCAiCisgICAgInp1IGZhbGxlbiwgb2J3b2hsIER1IERpY2ggdm9sbGtvbW1lbiBzY2h3ZXJlbG9zIGZ1ZWhsc3QuIEVpbiBoYXVjaCIKKyAgICAiZHVlbm5lciBTY2hsZWllciBhdXMgU3RhdWIgdW1mYWVuZ3QgRGljaCwgYWxzIER1IGxhbmdzYW0gYWJlciBzaWNoZXIgIgorICAgICJEZWluZXMgS29lcnBlcnMgZ2V3YWhyIHdpcnN0LiIpKTsKKyAgQWRkU3BlY2lhbEV4aXQoIndlbHQiLCBmdW5jdGlvbiBpbnQgKCkgeworICAgIGlmICggUEwtPlF1ZXJ5R3Vlc3QoKSApIAorICAgICAgcmV0dXJuIFBMLT5tb3ZlKCIvZ2lsZGVuL2FiZW50ZXVyZXIiLCBNX0dPKTsKKyAgICBlbHNlIHJldHVybiAwOyAKKyAgfSk7CisgIFNldChQX0hJREVfRVhJVFMsIGZ1bmN0aW9uIG1peGVkICgpIHsKKyAgICByZXR1cm4gIShQTCAmJiBQTC0+UXVlcnlHdWVzdCgpKTsKKyAgfSwgRl9RVUVSWV9NRVRIT0QpOworfQorCit2b2lkIGluaXQoKSB7CisgIHNldF9uZXh0X3Jlc2V0KDMwMCk7CisgIGlmICggb2JqZWN0cChQTCkgKQorICAgIGNhbGxfb3V0KCJTZXF1ZW56IiwgMCwgMCk7CisgIHJldHVybiA6OmluaXQoKTsKK30KKworLy8gTml4IHJlc2V0dGVuLCBhYmVyIFJhdW0gZW50c29yZ2VuLCB3ZW5uIGtlaW4gU3BpZWxlciBkcmluLgorLy8gTm90ZmFsbHMgZ2lidCBlcyBhdWNoIG5vY2ggbmVuIGNsZWFudXAoKSBhdXMgZGVtIFN0YW5kYXJkcmF1bS4uLgorcHJvdGVjdGVkIHZvaWQgcmVzZXQoKSB7CisgIGlmICghc2l6ZW9mKGZpbHRlcihhbGxfaW52ZW50b3J5KHRoaXNfb2JqZWN0KCkpLCAjJ3F1ZXJ5X29uY2VfaW50ZXJhY3RpdmUpKQorICAgICAgKQorICAgIHJlbW92ZSgxKTsKK30KKworLy9UT0RPOiBEZWxheXMgYW5wYXNzZW4gYnp3LiBhdXNrbGFtbWVybiwgd2VubiBpbW1lciA9NSBhdXNzZXIgYW0gRW5kZS4KK3ZvaWQgU2VxdWVueihpbnQgY291bnQpIHsKKyAgaW50IGRlbGF5OworCisgIGlmICggIW9iamVjdHAoUEwpIHx8IGVudmlyb25tZW50KFBMKSAhPSBNRSApCisgICAgcmV0dXJuOworCisgIHN3aXRjaChjb3VudCkgeworICAgIGNhc2UgMDoKKyAgICAgIHRlbGxfb2JqZWN0KFBMLCBCUyhRdWVyeVByb3AoUF9JTlRfTE9ORykpKTsKKyAgICAgIGRlbGF5ID0gNDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgIHRlbGxfb2JqZWN0KFBMLCBCUygKKyAgICAgICAgIlxuRHUgc2NoYXVzdCBEaWNoIGVyc3RhdW50IHVtLiBEdSBiZWZpbmRlc3QgRGljaCBhbnNjaGVpbmVuZCBpbSAiCisgICAgICAgICJXZWx0YWxsLCBhYmVyIHdpZSBiaXN0IER1IGhpZXJoZXJnZWtvbW1lbj8gSXN0IGRhcyBzY2hvbiBkYXMgIgorICAgICAgICAiTW9yZ2VuR3JhdWVuLCBvZGVyIGJpc3QgRHUgd29obCBlcnN0IG5vY2ggYXVmIGRlbSBXZWcgZG9ydGhpbj8iKSk7CisgICAgICBkZWxheSA9IDg7CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICB0ZWxsX29iamVjdChQTCwgQlMoCisgICAgICAgICJcbk1pdCBlaW5lbSBCbGljayBhdWYgRGVpbmUgVW1nZWJ1bmcgYmVtZXJrc3QgRHUsIGRhc3MgZGVyIFN0YXViLCAiCisgICAgICAgICJkZXIgRGljaCB1bWdpYnQsIHNpY2ggbGFuZ3NhbSBhdWYgRGljaCB6dXp1YmV3ZWdlbiBzY2hlaW50LiAiCisgICAgICAgICJEdSB3aWxsc3QgbmV1Z2llcmlnIGRhbmFjaCBncmVpZmVuLCBhYmVyIGVzIHdpbGwgRGlyIG5pY2h0ICIKKyAgICAgICAgImdlbGluZ2VuLiBWZXJ3dW5kZXJ0IHN0ZWxsc3QgRHUgZmVzdCwgZGFzcyBEdSBrZWluZSBIYWVuZGUgIgorICAgICAgICAiYmVzaXR6dCwgdW5kIGJlaSBuYWVoZXJlciBCZXRyYWNodHVuZyB3aXJkIERpciBrbGFyLCBkYXNzIER1ICIKKyAgICAgICAgImF1Y2ggc29uc3Qgbm9jaCB6aWVtbGljaCBrb2VycGVybG9zIGJpc3QhICIpKTsKKyAgICAgIGRlbGF5ID0gMTI7CisgICAgICBicmVhazsKKyAgICBjYXNlIDM6CisgICAgICB0ZWxsX29iamVjdChQTCwgQlMoCisgICAgICAgICJcbkRhcyBhZW5kZXJ0IHNpY2ggYWJlciBiYWxkLCBhbHMgZGVyIGdsaXR6ZXJuZGUgU3RhdWIgYWxsbWFlaGxpY2ggIgorICAgICAgICAidW0gRGljaCBoZXJ1bSBlaW5lIGR1cmNoc2NoZWluZW5kZSBHZXN0YWx0IHp1IGJpbGRlbiBiZWdpbm50LCAiCisgICAgICAgICJkaWUgc2ljaCB6dWVnaWcgdmVyZGljaHRldC4iKSk7CisgICAgICBkZWxheSA9IDg7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICBpbnQgZyA9IFBMLT5RdWVyeVByb3AoUF9HRU5ERVIpOworICAgICAgc3RyaW5nIGRlc2MgPSBQTC0+UXVlcnlQcm9wKFBfUkFDRVNUUklORylbMF07CisgICAgICBzdHJpbmcgbXNnID0gKGc9PU1BTEU/ImVpbiByaWNodGlnZXIgIjoiZWluZSByaWNodGlnZSAiKStkZXNjOworICAgICAgdGVsbF9vYmplY3QoUEwsIEJTKAorICAgICAgICAiXG5TY2hvbiBrdXJ6IGRhcmF1ZiBoYXQgc2ljaCBlaW4gZWxlZ2FudGVyIEtvZXJwZXIgZ2Vmb3JtdCwgZGVyICIKKyAgICAgICAgIm51biB2b2xsa29tbWVuIERpciBnZWhvZXJ0LiBEYXNzIER1IG5vY2ggbmFja3QgYmlzdCwgc3RvZXJ0IERpY2ggIgorICAgICAgICAibmljaHQgaW0gZ2VyaW5nc3RlbiwgZGVubiBlbmRsaWNoLCBlbmRsaWNoIGZ1ZWhsc3QgRHUgRGljaCAiCisgICAgICAgICJ3aWUgIittc2crIiEiKSk7CisgICAgICBkZWxheSA9IDEwOworICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgdGVsbF9vYmplY3QoUEwsIEJTKAorICAgICAgICAiXG5EZWluZSBCZWdlaXN0ZXJ1bmcgdWViZXIgRGVpbmVuIG1ha2VsbG9zZW4gS29lcnBlciB3aXJkIGphZWggIgorICAgICAgICAidW50ZXJicm9jaGVuLCBhbHMgcGxvZXR6bGljaCBkaWUgU3Rlcm5lIHZlcmJsYXNzZW4gdW5kIHNpY2ggbWl0ICIKKyAgICAgICAgInVuZmFzc2JhcmVtIFRlbXBvIHZvbiBEaXIgenUgZW50ZmVybmVuIHNjaGVpbmVuLiBEYW5uIHdpcmQgZXMgIgorICAgICAgICAia3VyeiBzY2h3YXJ6IHVtIERpY2ggaGVydW0gdW5kIGt1cnogZGFyYXVmIHdpZWRlciBoZWxsLiIpKTsKKyAgICAgIGRlbGF5ID0gODsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNjoKKyAgICAgIHRlbGxfb2JqZWN0KFBMLCAiXG4iK2JyZWFrX3N0cmluZygKKyAgICAgICAgIkhlcnpsaWNoIFdpbGxrb21tZW4hIFVlYnJpZ2Vucywgd2VubiBEdSBhdWYgZGVyICIKKyAgICAgICAgIkViZW5lIEFuZmFlbmdlciBtaXQgYW5kZXJlbiByZWRlbiB3aWxsc3QsIGZvbGdlbmRlciBUaXA6IFByb2JpZXJlICIKKyAgICAgICAgIm1hbCAnLWFuZiBIYWxsbyBNb3JnZW5ncmF1ZW4nIChuYXR1ZXJsaWNoIG9obmUgZGllICcgbWl0ICIKKyAgICAgICAgImVpbnp1Z2ViZW4pIGF1cy4iLCA3OCwgIk1lcmxpbiB0ZWlsdCBEaXIgbWl0OiAiKSk7CisgICAgICBkZWxheSA9IDY7CisgICAgICBicmVhazsKKyAgICBjYXNlIDc6CisgICAgICBpZiAoUEwtPlF1ZXJ5R3Vlc3QoKSApIHsKKyAgICAgICAgUEwtPm1vdmUoIi9naWxkZW4vYWJlbnRldXJlciIsIE1fR08pOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBlbHNlCisgICAgICAgIHRlbGxfb2JqZWN0KFBMLCAiXG4iK2JyZWFrX3N0cmluZygKKyAgICAgICAgICAiSWNoIHdlcmRlIERpY2ggamV0enQgaW4gZGFzIFR1dG9yaWFsIGZ1ZXIgQW5mYWVuZ2VyIGJld2VnZW4sIHdvICIKKyAgICAgICAgICAiRHUgRGVpbmUgZXJzdGVuIFNjaHJpdHRlIG1hY2hlbiBrYW5uc3QuLi4iLAorICAgICAgICAgIDc4LCAiTWVybGluIHRlaWx0IERpciBtaXQ6ICIpKyJcbiIpOworICAgICAgZGVsYXkgPSA0OworICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgUEwtPm1vdmUoVFVUU1RBUlQrZ2V0dWlkKFBMKSwgTV9HTyk7CisgICAgICByZXR1cm47IC8vIGNhbGxfb3V0IG5pY2h0IHdpZWRlciBhbndlcmZlbi4KKyAgIH0KKyAgICsrY291bnQ7CisgICBjYWxsX291dCgiU2VxdWVueiIsIGRlbGF5LCBjb3VudCk7Cit9CisKKy8vIEJlaSBEaXNjb25uZWN0IFNlcXVlbnogYWJicmVjaGVuLCBiZWkgUmUtTG9naW4gd2llZGVyIHN0YXJ0ZW4gbWl0CisvLyBjb3VudCA9PSA1IGQuaC4gU3BpZWxlciBmbGllZ3QgYWxzbyBxdWFzaSAiaW0gU2NobGFmIiB3ZWl0ZXIuLi4KK3ZvaWQgQmVjb21lc05ldERlYWQob2JqZWN0IHBsKSB7CisgIHdoaWxlKHJlbW92ZV9jYWxsX291dCgiU2VxdWVueiIpIT0tMSkKKyAgIDsKK30KKwordm9pZCBCZWNvbWVzTmV0QWxpdmUob2JqZWN0IHBsKSB7CisgIGlmIChpbnRlcmFjdGl2ZShwbCkpCisgICAgY2FsbF9vdXQoIlNlcXVlbnoiLCA2LCA1KTsKK30KKwpkaWZmIC0tZ2l0IGEvcm9vbS93ZWxjb21lL3ZpcnR1YWxfY29tcGlsZXIuYyBiL3Jvb20vd2VsY29tZS92aXJ0dWFsX2NvbXBpbGVyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNlZWEyYwotLS0gL2Rldi9udWxsCisrKyBiL3Jvb20vd2VsY29tZS92aXJ0dWFsX2NvbXBpbGVyLmMKQEAgLTAsMCArMSwyNyBAQAorI2luY2x1ZGUgPGRlZmluZXMuaD4KKyNpbmNsdWRlIDx2X2NvbXBpbGVyLmg+Citpbmhlcml0ICIvc3RkL3ZpcnR1YWwvdl9jb21waWxlciI7CisKK3ZvaWQgY3JlYXRlKCkgeworICA6OmNyZWF0ZSgpOworICBTZXRQcm9wKFBfU1REX09CSkVDVCwgIi9yb29tL3dlbGNvbWUvc3RkIik7Cit9CisKK3N0cmluZyBWYWxpZGF0ZShzdHJpbmcgZmlsZSkgeworCisgIGZpbGU9OjpWYWxpZGF0ZShmaWxlKTsKKworICAvLyBrZWluZSBVbnRlcnZlcnplaWNobmlzc2UsIGd1ZWx0aWdlIENoYXJuYW1lbgorICBpZiAoc3Ryc3RyKGZpbGUsIi8iKSA9PSAtMQorICAgICAgJiYgc2l6ZW9mKGZpbGUpIDw9IDExIC8vIGNoYXJuYW1lbiA8PTExIHplaWNoZW4KKyAgICAgICYmIChyZWdtYXRjaChmaWxlLCJbYS16QS1aXSsiKSA9PSBmaWxlIC8vIG51ciBBLVosYS16CisgICAgICAgICAgfHwgc3Ryc3RyKGZpbGUsImdhc3QiKSA9PSAwIC8vIG9kZXIgR2Flc3RlCisgICAgICAgICAgKQorICAgICApCisgIHsKKyAgICAvLyBFaWdlbnRsaWNoIFBfQ09NUElMRVJfUEFUSCwgYWJlciBoaWVyIGdlaHQgamV0enQgYXVjaCBfX0RJUl9fCisgICAgcmV0dXJuIF9fRElSX18gKyBmaWxlOworICB9CisgIHJldHVybiAwOworfQorCg==